rsf-admin/.env
@@ -1,3 +1,3 @@ VITE_BASE_IP=192.168.4.50 VITE_BASE_IP=192.168.4.56 # VITE_BASE_IP=47.76.147.249 VITE_BASE_PORT=8080 rsf-admin/src/i18n/zh.js
@@ -482,7 +482,7 @@ dlyQty: "送货数量", disQty: "不合数量", safeQty: "合格数量", anfme: '数量', anfme: '已检数量', picPath: "图片路径", trackCode: "条形码", }, rsf-admin/src/page/orders/qlyInspect/InspectModal.jsx
@@ -80,7 +80,7 @@ const getData = async () => { const res = await request.post(`/qlyIsptItem/page`, { ispectId, isptStatus: '0' }); const res = await request.post(`/qlyIsptItem/ispts/page`, { ispectId }); if (res?.data?.code === 200) { const data = res.data.data.records.map(item => { return { @@ -221,10 +221,10 @@ ), }, { field: 'isptResult', headerName: translate('table.field.qlyIsptItem.isptResult'), width: 150, type: 'singleSelect', editable: true, valueOptions: [{ value: '1', label: '合格' }, { value: '2', label: '不合格' }, { value: '3', label: '待定' }, { value: '4', label: '部分合格' }], }, // { // field: 'isptResult', headerName: translate('table.field.qlyIsptItem.isptResult'), width: 150, type: 'singleSelect', // editable: true, valueOptions: [{ value: '1', label: '合格' }, { value: '2', label: '不合格' }, { value: '3', label: '待定' }, { value: '4', label: '部分合格' }], // }, ]) const processRowUpdate = (newRow, oldRow) => { rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/MobileController.java
@@ -225,7 +225,7 @@ if (Objects.isNull(params) || params.isEmpty()) { return R.error("参数不能为空!!"); } return mobileService.checkUpdate(params); return mobileService.checkUpdate(params, getLoginUserId()); } @ApiOperation("获取上架信息") rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
@@ -49,7 +49,7 @@ R checkObjs(CheckObjParams params); R checkUpdate(List<QlyIsptItem> params); R checkUpdate(List<QlyIsptItem> params, Long loginUserId); R operateToStock(OpStockParams params); rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -2,7 +2,6 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.framework.exception.CoolException; @@ -630,16 +629,17 @@ * 快速质检 * * @param params * @param loginUserId * @return */ @Override public R checkUpdate(List<QlyIsptItem> params) { public R checkUpdate(List<QlyIsptItem> params, Long loginUserId) { if (Objects.isNull(params) || params.isEmpty()) { throw new CoolException("参数不能为空!!"); } IsptItemsParams itemsParams = new IsptItemsParams(); itemsParams.setIsptItem(params).setType("0"); if (qlyIsptItemService.batchUpdate(itemsParams)) { if (qlyIsptItemService.batchUpdate(itemsParams, loginUserId)) { return R.ok(); } else { return R.error("保存失败!!"); rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java
@@ -48,7 +48,8 @@ "sys_user_role", "sys_role_menu", "sys_menu", "man_loc_type_rela" "man_loc_type_rela", "man_qly_inspect_result" ).contains(tableName); } }; rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/QlyIsptItemController.java
@@ -1,6 +1,8 @@ package com.vincent.rsf.server.manager.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.R; @@ -12,8 +14,6 @@ import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.common.utils.FieldsUtils; import com.vincent.rsf.server.manager.controller.params.IsptItemsParams; import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.QlyIsptItem; import com.vincent.rsf.server.manager.service.QlyIsptItemService; import com.vincent.rsf.server.system.controller.BaseController; @@ -38,9 +38,9 @@ public R page(@RequestBody Map<String, Object> map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<QlyIsptItem, BaseParam> pageParam = new PageParam<>(baseParam, QlyIsptItem.class); QueryWrapper<QlyIsptItem> queryWrapper = pageParam.buildWrapper(true); /**拼接扩展字段*/ PageParam<QlyIsptItem, BaseParam> page = qlyIsptItemService.page(pageParam, pageParam.buildWrapper(true)); PageParam<QlyIsptItem, BaseParam> page = qlyIsptItemService.page(pageParam, queryWrapper); List<QlyIsptItem> records = page.getRecords(); for (QlyIsptItem record : records) { if (!Objects.isNull(record.getFieldsIndex())) { @@ -51,6 +51,33 @@ page.setRecords(records); return R.ok(page); } /** * @author Ryan * @date 2025/5/12 * @description: 获取质检信息修改 * @version 1.0 */ @PreAuthorize("hasAuthority('manager:qlyIsptItem:list')") @PostMapping("/qlyIsptItem/ispts/page") public R getQlyList(@RequestBody Map<String, Object> map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<QlyIsptItem, BaseParam> pageParam = new PageParam<>(baseParam, QlyIsptItem.class); QueryWrapper<QlyIsptItem> queryWrapper = pageParam.buildWrapper(true); IPage<QlyIsptItem> page = qlyIsptItemService.pageByWrapper(pageParam, queryWrapper); List<QlyIsptItem> records = page.getRecords(); for (QlyIsptItem record : records) { if (!Objects.isNull(record.getFieldsIndex())) { Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex()); record.setExtendFields(fields); } } page.setRecords(records); return R.ok(page); } @PreAuthorize("hasAuthority('manager:qlyIsptItem:list')") @@ -134,7 +161,7 @@ if (Objects.isNull(params)) { throw new CoolException("参数不能为空!!"); } if (qlyIsptItemService.batchUpdate(params)) { if (qlyIsptItemService.batchUpdate(params, getLoginUserId())) { return R.ok("修改成功!!"); } else { return R.error("修改失败!!"); rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java
@@ -9,14 +9,16 @@ */ public enum OrderWorkType { //订单类型 ORDER_WORK_TYPE_DONE_IN("1", "完工入库单"), ORDER_WORK_TYPE_PROD("2", "生产领料单"), ORDER_WORK_TYPE_PURCHASE("3", "外购收货"), ORDER_WORK_TYPE_SALE("4", "销售订单"), ORDER_WORK_TYPE_RETURN("5", "生产退料单"), ORDER_WORK_TYPE_SUPPLIER("6", "退货供应商出货单"), ORDER_WORK_TYPE_RETURN_ORDER("7", "销售退货入库单") ; ORDER_WORK_TYPE_DONE_IN("1", "采购入库单"), ORDER_WORK_TYPE_PROD("2", "生产入库单"), ORDER_WORK_TYPE_PURCHASE("3", "领料退回入库单"), ORDER_WORK_TYPE_SALE("4", "销售退回入库单"), ORDER_WORK_TYPE_RETURN("5", "其它入库单"), ORDER_WORK_TYPE_SUPPLIER("11", "销售出库单"), ORDER_WORK_TYPE_RETURN_ORDER("12", "领料出库单"), ORDER_WORK_TYPE_PURCHASE_RETURN("13", "采购退回出库单"), ORDER_WORK_TYPE_OTHER("14", "其它出库单"); OrderWorkType(String type, String desc) { this.type = type; @@ -41,6 +43,10 @@ return OrderWorkType.ORDER_WORK_TYPE_SUPPLIER.type; }else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_RETURN_ORDER.desc)) { return OrderWorkType.ORDER_WORK_TYPE_RETURN_ORDER.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_PURCHASE_RETURN.desc)) { return OrderWorkType.ORDER_WORK_TYPE_PURCHASE_RETURN.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER.desc)) { return OrderWorkType.ORDER_WORK_TYPE_OTHER.type; } return null; } @@ -60,6 +66,10 @@ return OrderWorkType.ORDER_WORK_TYPE_SUPPLIER.desc; }else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_RETURN_ORDER.type)) { return OrderWorkType.ORDER_WORK_TYPE_RETURN_ORDER.desc; }else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_PURCHASE_RETURN.type)) { return OrderWorkType.ORDER_WORK_TYPE_PURCHASE_RETURN.desc; } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER.type)) { return OrderWorkType.ORDER_WORK_TYPE_OTHER.desc; } return null; } rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/QlyIsptItemMapper.java
@@ -1,12 +1,19 @@ package com.vincent.rsf.server.manager.mapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.entity.QlyIsptItem; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @Mapper @Repository public interface QlyIsptItemMapper extends BaseMapper<QlyIsptItem> { IPage<QlyIsptItem> pageByWrapper(PageParam<QlyIsptItem, BaseParam> pageParam, @Param(Constants.WRAPPER) QueryWrapper<QlyIsptItem> queryWrapper); } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/QlyIsptItemService.java
@@ -1,12 +1,16 @@ package com.vincent.rsf.server.manager.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.vincent.rsf.framework.common.R; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.controller.params.IsptItemsParams; import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem; import com.vincent.rsf.server.manager.entity.QlyIsptItem; public interface QlyIsptItemService extends IService<QlyIsptItem> { boolean batchUpdate(IsptItemsParams params); boolean batchUpdate(IsptItemsParams params, Long loginUserId); IPage<QlyIsptItem> pageByWrapper(PageParam<QlyIsptItem, BaseParam> pageParam, QueryWrapper<QlyIsptItem> queryWrapper); } rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/QlyIsptItemServiceImpl.java
@@ -1,16 +1,16 @@ package com.vincent.rsf.server.manager.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.R; import com.baomidou.mybatisplus.core.metadata.IPage; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.domain.BaseParam; import com.vincent.rsf.server.common.domain.PageParam; import com.vincent.rsf.server.manager.controller.params.IsptItemsParams; import com.vincent.rsf.server.manager.controller.params.QlyInspectAndItem; import com.vincent.rsf.server.manager.entity.AsnOrderItem; import com.vincent.rsf.server.manager.entity.QlyInspect; import com.vincent.rsf.server.manager.entity.QlyInspectResult; import com.vincent.rsf.server.manager.enums.QlyIsptResult; import com.vincent.rsf.server.manager.enums.QlyIsptStatus; import com.vincent.rsf.server.manager.mapper.QlyIsptItemMapper; import com.vincent.rsf.server.manager.entity.QlyIsptItem; import com.vincent.rsf.server.manager.service.AsnOrderItemService; @@ -23,10 +23,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @Service("qlyIsptItemService") @@ -39,9 +38,12 @@ @Autowired private QlyInspectResultService qlyInspectResultService; @Autowired private QlyIsptItemService qlyIsptItemService; /** * @param * @param loginUserId * @return * @author Ryan * @description 批量修改 @@ -49,7 +51,7 @@ */ @Override @Transactional(rollbackFor = Exception.class) public boolean batchUpdate(IsptItemsParams params) { public boolean batchUpdate(IsptItemsParams params, Long loginUserId) { if (Objects.isNull(params.getIsptItem()) || params.getIsptItem().isEmpty()) { throw new CoolException("ID不能为空!!"); } @@ -61,111 +63,90 @@ throw new CoolException("数据错误:明细不存在!!"); } for (QlyIsptItem item : isptItems) { for (QlyIsptItem item : isptItem) { List<QlyInspectResult> results = qlyInspectResultService.list(new LambdaQueryWrapper<QlyInspectResult>() .eq(QlyInspectResult::getIsptId, item.getIspectId()) .eq(QlyInspectResult::getIsptItemId, item.getId())); if (!results.isEmpty()) { //不为空做更新操作 if (!qlyInspectResultService.remove(new LambdaUpdateWrapper<QlyInspectResult>() .eq(QlyInspectResult::getIsptItemId, item.getId()))) { throw new CoolException("历史质检结果移出失败!!"); } } } else { //为空做新增操作 QlyInspectResult result = new QlyInspectResult(); result.setIsptId(item.getIspectId()) .setAnfme(item.getSafeQty()) .setIsptItemId(item.getId()); if (item.getDisQty().compareTo(0.00) < 1) { continue; } result.setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_DEFECT.val); result.setAnfme(item.getDisQty()); if (!qlyInspectResultService.save(result)) { throw new CoolException("质检结论保存失败!!"); if (!Objects.isNull(item.getDisQty()) && item.getDisQty().compareTo(0.00) > 0) { result.setAnfme(item.getDisQty()) .setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_DEFECT.val); qlyInspectResultService.saveOrUpdate(result); } if (item.getSafeQty().compareTo(0.00) < 1) { continue; result = new QlyInspectResult(); result.setIsptId(item.getIspectId()) .setIsptItemId(item.getId()); if (!Objects.isNull(item.getSafeQty()) && item.getSafeQty().compareTo(0.00) > 0) { result.setAnfme(item.getSafeQty()) .setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_EXCELLENT.val); qlyInspectResultService.saveOrUpdate(result); } result.setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_EXCELLENT.val) .setAnfme(item.getSafeQty()); if (!qlyInspectResultService.save(result)) { throw new CoolException("质检结论保存失败!!"); List<QlyInspectResult> isptRelt = qlyInspectResultService.list(new LambdaQueryWrapper<QlyInspectResult>() .eq(QlyInspectResult::getIsptId, item.getIspectId()) .eq(QlyInspectResult::getIsptItemId, item.getId())); Double isptQty = isptRelt.stream().mapToDouble(QlyInspectResult::getAnfme).sum(); if (!qlyIsptItemService.update(new LambdaUpdateWrapper<QlyIsptItem>() .set(QlyIsptItem::getUpdateBy, loginUserId) .set(QlyIsptItem::getAnfme, isptQty) .eq(QlyIsptItem::getId, item.getId()))) { throw new CoolException("单据明细数量修改失败!!"); } } Set<Long> isptIds = isptItem.stream().map(QlyIsptItem::getIspectId).collect(Collectors.toSet()); List<QlyInspectResult> items = qlyInspectResultService.list(new LambdaQueryWrapper<QlyInspectResult>().in(QlyInspectResult::getIsptId, isptIds)); Double sum = items.stream().mapToDouble(QlyInspectResult::getAnfme).sum(); if (sum.compareTo(0.00) > 0) { qlyInspectService.update(new LambdaUpdateWrapper<QlyInspect>() .set(QlyInspect::getIsptQty, sum) .set(QlyInspect::getUpdateBy, loginUserId) .eq(QlyInspect::getId, isptItem.stream().findFirst().get().getIspectId())); } if (Short.parseShort(params.getType()) == QlyIsptResult.QLY_ISPT_RESULT_EXCELLENT.val || Short.parseShort(params.getType()) == QlyIsptResult.QLY_ISPT_RESULT_DEFECT.val) { //1:合格, 2:不合格, 0: 其它(默认) isptItem.forEach(item -> { if (Short.parseShort(params.getType()) == QlyIsptResult.QLY_ISPT_RESULT_EXCELLENT.val) { //TODO 先捡后收为送货数量,先收后捡为收货数量 // item.setSafeQty(item.getDlyQty()); // item.setDisQty(0.0); } else { // item.setSafeQty(0.0); // item.setDisQty(item.getDlyQty()); } if (!this.update(new LambdaUpdateWrapper<QlyIsptItem>() // .set(QlyIsptItem::getSafeQty, item.getSafeQty()) .set(QlyIsptItem::getIsptResult, Short.parseShort(params.getType())) // .set(QlyIsptItem::getDisQty, item.getDisQty()) .in(QlyIsptItem::getId, item.getId()))) { throw new CoolException("修改失败!!"); } }); } else { if (!this.updateBatchById(isptItem)) { throw new CoolException("明细修改失败"); } } Map<Long, List<QlyIsptItem>> listMap = isptItems.stream().collect(Collectors.groupingBy(QlyIsptItem::getIspectId)); for (Long key : listMap.keySet()) { QlyInspect inspect = qlyInspectService.getById(key); List<QlyIsptItem> items = listMap.get(key); items.forEach(qlyIsptItem -> { AsnOrderItem orderItem = asnOrderItemService.getById(qlyIsptItem.getAsnItemId()); // if (qlyIsptItem.getSafeQty().compareTo(orderItem.getAnfme()) >= 0.00) { // orderItem.setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_EXCELLENT.val) // .setIsptStatus(QlyIsptStatus.QLY_ISPT_STAS_DONE.val); // } else if (qlyIsptItem.getSafeQty().compareTo(0.00) > 0.00 && qlyIsptItem.getSafeQty().compareTo(orderItem.getAnfme()) < 0.00) { // orderItem.setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_SECTION.val); // if (Double.compare(qlyIsptItem.getSafeQty() + qlyIsptItem.getDisQty(), orderItem.getAnfme()) >= 0.00 ) { // orderItem.setIsptStatus(QlyIsptStatus.QLY_ISPT_STAS_DONE.val); // } else { // orderItem.setIsptStatus(QlyIsptStatus.QLY_ISPT_STAS_ING.val); // } // } else { // orderItem.setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_DEFECT.val) // .setIsptStatus(QlyIsptStatus.QLY_ISPT_STAS_DONE.val); // } if (!asnOrderItemService.updateById(orderItem)) { throw new CoolException("收货单明细修改失败!!"); } }); // Double safeQty = items.stream().mapToDouble(QlyIsptItem::getSafeQty).sum(); // Double disQty = items.stream().mapToDouble(QlyIsptItem::getDisQty).sum(); // Double qlyQty = safeQty + disQty; // //安全数量,质检数量 // inspect.setSafeQty(safeQty) // .setIsptQty(qlyQty); // if (Double.compare(disQty, 0) > 0) { // inspect.setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_SECTION.val); // } // if (Double.compare(safeQty, inspect.getDlyQty()) == 0) { //// inspect.setIsptStatus(QlyIsptStatus.QLY_ISPT_STAS_DONE.val); // inspect.setIsptResult(QlyIsptResult.QLY_ISPT_RESULT_EXCELLENT.val); // } if (!qlyInspectService.updateById(inspect)) { throw new CoolException("质检数量修改失败!!"); } } return true; } /** * @author Ryan * @date 2025/5/12 * @description: 获取自定义Page * @version 1.0 */ @Override public IPage<QlyIsptItem> pageByWrapper(PageParam<QlyIsptItem, BaseParam> pageParam, QueryWrapper<QlyIsptItem> queryWrapper) { IPage<QlyIsptItem> page = this.page(pageParam, queryWrapper); if (!page.getRecords().isEmpty()) { List<QlyIsptItem> records = page.getRecords(); for (int i = 0; i < records.size(); i++) { List<QlyInspectResult> results = qlyInspectResultService.list(new QueryWrapper<QlyInspectResult>() .select("id, ispt_result, SUM(anfme) anfme, ispt_item_id, ispt_id") .lambda() .eq(QlyInspectResult::getIsptItemId, records.get(i).getId()).groupBy(QlyInspectResult::getIsptResult)); if (!results.isEmpty()) { for (QlyInspectResult result : results) { if (result.getIsptResult() == QlyIsptResult.QLY_ISPT_RESULT_EXCELLENT.val) { records.get(i).setSafeQty(result.getAnfme()); } else { records.get(i).setDisQty(result.getAnfme()); } } } } page.setRecords(records); } return page; } } rsf-server/src/main/resources/application-dev.yml
@@ -14,7 +14,7 @@ driver-class-name: com.mysql.jdbc.Driver # url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai username: root url: jdbc:mysql://192.168.4.56:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai # username: rsf password: 34821015 type: com.alibaba.druid.pool.DruidDataSource rsf-server/src/main/resources/mapper/manager/QlyIsptItemMapper.xml
@@ -2,4 +2,30 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.vincent.rsf.server.manager.mapper.QlyIsptItemMapper"> <select id="pageByWrapper" resultType="com.vincent.rsf.server.manager.entity.QlyIsptItem"> SELECT * FROM (SELECT qii.id, ispect_id, asn_item_id, matnr_code, maktx, splr_name, splr_batch, qir.anfme, qir.ispt_result, rcpt_qty, dly_qty, track_code, pic_path, `status`, deleted, tenant_id, create_by, create_time, update_by, update_time, memo FROM man_qly_ispt_item qii LEFT JOIN man_qly_inspect_result qir ON qii.id = qir.ispt_item_id) t ${ew.customSqlSegment} </select> </mapper>