Commit fc636c04bdefdc6b29e3f56b95e076b5c03b135b

Authored by YunaiV
1 parent b96d20e6

✨ feat(mes): 添加批次分页功能,支持根据条件查询批次列表

yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/MesWmBatchController.java
1 package cn.iocoder.yudao.module.mes.controller.admin.wm.batch; 1 package cn.iocoder.yudao.module.mes.controller.admin.wm.batch;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
5 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchRespVO; 9 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchRespVO;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  12 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
6 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; 16 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
  17 +import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
  18 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  19 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  20 +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService;
  21 +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
  22 +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
7 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; 23 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
8 import io.swagger.v3.oas.annotations.Operation; 24 import io.swagger.v3.oas.annotations.Operation;
9 import io.swagger.v3.oas.annotations.Parameter; 25 import io.swagger.v3.oas.annotations.Parameter;
@@ -17,9 +33,12 @@ import org.springframework.web.bind.annotation.RequestMapping; @@ -17,9 +33,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
17 import org.springframework.web.bind.annotation.RequestParam; 33 import org.springframework.web.bind.annotation.RequestParam;
18 import org.springframework.web.bind.annotation.RestController; 34 import org.springframework.web.bind.annotation.RestController;
19 35
  36 +import java.util.Collections;
20 import java.util.List; 37 import java.util.List;
  38 +import java.util.Map;
21 39
22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 40 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  41 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
23 42
24 @Tag(name = "管理后台 - MES 批次管理") 43 @Tag(name = "管理后台 - MES 批次管理")
25 @RestController 44 @RestController
@@ -29,6 +48,26 @@ public class MesWmBatchController { @@ -29,6 +48,26 @@ public class MesWmBatchController {
29 48
30 @Resource 49 @Resource
31 private MesWmBatchService batchService; 50 private MesWmBatchService batchService;
  51 + @Resource
  52 + private MesMdItemService itemService;
  53 + @Resource
  54 + private MesMdUnitMeasureService unitMeasureService;
  55 + @Resource
  56 + private MesMdVendorService vendorService;
  57 + @Resource
  58 + private MesMdClientService clientService;
  59 + @Resource
  60 + private MesProWorkOrderService workOrderService;
  61 + @Resource
  62 + private MesMdWorkstationService workstationService;
  63 +
  64 + @GetMapping("/page")
  65 + @Operation(summary = "获得批次分页")
  66 + @PreAuthorize("@ss.hasPermission('mes:wm-batch:query')")
  67 + public CommonResult<PageResult<MesWmBatchRespVO>> getBatchPage(@Valid MesWmBatchPageReqVO pageReqVO) {
  68 + PageResult<MesWmBatchDO> pageResult = batchService.getBatchPage(pageReqVO);
  69 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  70 + }
32 71
33 @GetMapping("/forward-list") 72 @GetMapping("/forward-list")
34 @Operation(summary = "批次向前追溯") 73 @Operation(summary = "批次向前追溯")
@@ -36,7 +75,7 @@ public class MesWmBatchController { @@ -36,7 +75,7 @@ public class MesWmBatchController {
36 @PreAuthorize("@ss.hasPermission('mes:wm-batch:query')") 75 @PreAuthorize("@ss.hasPermission('mes:wm-batch:query')")
37 public CommonResult<List<MesWmBatchRespVO>> getForwardList(@RequestParam("code") @Valid String code) { 76 public CommonResult<List<MesWmBatchRespVO>> getForwardList(@RequestParam("code") @Valid String code) {
38 List<MesWmBatchDO> list = batchService.getForwardBatchList(code); 77 List<MesWmBatchDO> list = batchService.getForwardBatchList(code);
39 - return success(BeanUtils.toBean(list, MesWmBatchRespVO.class)); 78 + return success(buildRespVOList(list));
40 } 79 }
41 80
42 @GetMapping("/backward-list") 81 @GetMapping("/backward-list")
@@ -45,7 +84,45 @@ public class MesWmBatchController { @@ -45,7 +84,45 @@ public class MesWmBatchController {
45 @PreAuthorize("@ss.hasPermission('mes:wm-batch:query')") 84 @PreAuthorize("@ss.hasPermission('mes:wm-batch:query')")
46 public CommonResult<List<MesWmBatchRespVO>> getBackwardList(@RequestParam("code") @Valid String code) { 85 public CommonResult<List<MesWmBatchRespVO>> getBackwardList(@RequestParam("code") @Valid String code) {
47 List<MesWmBatchDO> list = batchService.getBackwardBatchList(code); 86 List<MesWmBatchDO> list = batchService.getBackwardBatchList(code);
48 - return success(BeanUtils.toBean(list, MesWmBatchRespVO.class)); 87 + return success(buildRespVOList(list));
  88 + }
  89 +
  90 + // ==================== 拼接 VO ====================
  91 +
  92 + private List<MesWmBatchRespVO> buildRespVOList(List<MesWmBatchDO> list) {
  93 + if (CollUtil.isEmpty(list)) {
  94 + return Collections.emptyList();
  95 + }
  96 + // 1. 获得关联数据
  97 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  98 + convertSet(list, MesWmBatchDO::getItemId));
  99 + Map<Long, MesMdVendorDO> vendorMap = vendorService.getVendorMap(
  100 + convertSet(list, MesWmBatchDO::getVendorId));
  101 + Map<Long, MesMdClientDO> clientMap = clientService.getClientMap(
  102 + convertSet(list, MesWmBatchDO::getClientId));
  103 + Map<Long, MesProWorkOrderDO> workOrderMap = workOrderService.getWorkOrderMap(
  104 + convertSet(list, MesWmBatchDO::getWorkOrderId));
  105 + Map<Long, MesMdWorkstationDO> workstationMap = workstationService.getWorkstationMap(
  106 + convertSet(list, MesWmBatchDO::getWorkstationId));
  107 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  108 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  109 + // 2. 构建结果
  110 + return BeanUtils.toBean(list, MesWmBatchRespVO.class, vo -> {
  111 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  112 + vo.setItemCode(item.getCode()).setItemName(item.getName())
  113 + .setItemSpecification(item.getSpecification());
  114 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  115 + unitMeasure -> vo.setUnitName(unitMeasure.getName()));
  116 + });
  117 + MapUtils.findAndThen(vendorMap, vo.getVendorId(),
  118 + vendor -> vo.setVendorCode(vendor.getCode()).setVendorName(vendor.getName()));
  119 + MapUtils.findAndThen(clientMap, vo.getClientId(),
  120 + client -> vo.setClientCode(client.getCode()).setClientName(client.getName()));
  121 + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(),
  122 + workOrder -> vo.setWorkOrderCode(workOrder.getCode()));
  123 + MapUtils.findAndThen(workstationMap, vo.getWorkstationId(),
  124 + workstation -> vo.setWorkstationCode(workstation.getCode()));
  125 + });
49 } 126 }
50 127
51 } 128 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@Schema(description = "管理后台 - MES 批次管理分页 Request VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class MesWmBatchPageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "批次编码", example = "BATCH20250314001")
  16 + private String code;
  17 +
  18 + @Schema(description = "物料编号", example = "1")
  19 + private Long itemId;
  20 +
  21 + @Schema(description = "供应商编号", example = "1")
  22 + private Long vendorId;
  23 +
  24 + @Schema(description = "客户编号", example = "1")
  25 + private Long clientId;
  26 +
  27 + @Schema(description = "销售订单编号", example = "SO20250314001")
  28 + private String salesOrderCode;
  29 +
  30 + @Schema(description = "采购订单编号", example = "PO20250314001")
  31 + private String purchaseOrderCode;
  32 +
  33 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java
@@ -2,7 +2,10 @@ package cn.iocoder.yudao.module.mes.dal.mysql.wm.batch; @@ -2,7 +2,10 @@ package cn.iocoder.yudao.module.mes.dal.mysql.wm.batch;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjUtil; 4 import cn.hutool.core.util.ObjUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  7 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
6 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
7 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 10 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
8 import org.apache.ibatis.annotations.Mapper; 11 import org.apache.ibatis.annotations.Mapper;
@@ -17,6 +20,17 @@ import java.util.List; @@ -17,6 +20,17 @@ import java.util.List;
17 @Mapper 20 @Mapper
18 public interface MesWmBatchMapper extends BaseMapperX<MesWmBatchDO> { 21 public interface MesWmBatchMapper extends BaseMapperX<MesWmBatchDO> {
19 22
  23 + default PageResult<MesWmBatchDO> selectPage(MesWmBatchPageReqVO reqVO) {
  24 + return selectPage(reqVO, new LambdaQueryWrapperX<MesWmBatchDO>()
  25 + .likeIfPresent(MesWmBatchDO::getCode, reqVO.getCode())
  26 + .eqIfPresent(MesWmBatchDO::getItemId, reqVO.getItemId())
  27 + .eqIfPresent(MesWmBatchDO::getVendorId, reqVO.getVendorId())
  28 + .eqIfPresent(MesWmBatchDO::getClientId, reqVO.getClientId())
  29 + .likeIfPresent(MesWmBatchDO::getSalesOrderCode, reqVO.getSalesOrderCode())
  30 + .likeIfPresent(MesWmBatchDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode())
  31 + .orderByDesc(MesWmBatchDO::getId));
  32 + }
  33 +
20 /** 34 /**
21 * 根据参数查询匹配的第一条批次记录 35 * 根据参数查询匹配的第一条批次记录
22 * <p> 36 * <p>
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java
1 package cn.iocoder.yudao.module.mes.service.wm.batch; 1 package cn.iocoder.yudao.module.mes.service.wm.batch;
2 2
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
3 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; 4 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
4 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; 6 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
5 7
6 import java.util.List; 8 import java.util.List;
@@ -13,6 +15,14 @@ import java.util.List; @@ -13,6 +15,14 @@ import java.util.List;
13 public interface MesWmBatchService { 15 public interface MesWmBatchService {
14 16
15 /** 17 /**
  18 + * 获得批次分页
  19 + *
  20 + * @param pageReqVO 分页查询
  21 + * @return 批次分页
  22 + */
  23 + PageResult<MesWmBatchDO> getBatchPage(MesWmBatchPageReqVO pageReqVO);
  24 +
  25 + /**
16 * 获取或生成批次编码 26 * 获取或生成批次编码
17 * <p> 27 * <p>
18 * 根据物料批次配置,查询或生成批次记录 28 * 根据物料批次配置,查询或生成批次记录
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
@@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.mes.service.wm.batch; @@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.mes.service.wm.batch;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjUtil; 4 import cn.hutool.core.util.ObjUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
  7 +import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
6 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; 8 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO;
7 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
8 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; 10 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
@@ -47,6 +49,11 @@ public class MesWmBatchServiceImpl implements MesWmBatchService { @@ -47,6 +49,11 @@ public class MesWmBatchServiceImpl implements MesWmBatchService {
47 private MesWmBarcodeService barcodeService; 49 private MesWmBarcodeService barcodeService;
48 50
49 @Override 51 @Override
  52 + public PageResult<MesWmBatchDO> getBatchPage(MesWmBatchPageReqVO pageReqVO) {
  53 + return batchMapper.selectPage(pageReqVO);
  54 + }
  55 +
  56 + @Override
50 @Transactional(rollbackFor = Exception.class) 57 @Transactional(rollbackFor = Exception.class)
51 public MesWmBatchDO getOrGenerateBatchCode(MesWmBatchGenerateReqVO reqVO) { 58 public MesWmBatchDO getOrGenerateBatchCode(MesWmBatchGenerateReqVO reqVO) {
52 // 1.1 查询物料信息,检查是否启用批次管理 59 // 1.1 查询物料信息,检查是否启用批次管理
yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml
@@ -9,14 +9,12 @@ @@ -9,14 +9,12 @@
9 <result property="batchCode" column="batch_code"/> 9 <result property="batchCode" column="batch_code"/>
10 </resultMap> 10 </resultMap>
11 11
12 - <!-- 向前追溯:查询当前批次被哪些工单的哪些批次产品消耗 -->  
13 - <!-- TODO @AI:看看能不能写成 mybatis plus join -->  
14 - <!-- TODO @AI:看看能不能直接使用 MesWmBatchDO 返回;或者直接使用目前的 batchrespVO 返回把; -->  
15 - <!-- TODO @AI:查询到 pf.work_order_id,pf.item_id, ppl.batch_id;然后 controller 补全这些信息 --> 12 + <!-- DONE @AI:看看能不能直接使用 MesWmBatchDO 返回(当前使用 resultMap 映射部分字段是合理的) -->
  13 + <!-- DONE @AI:查询到 pf.work_order_id,pf.item_id, ppl.batch_id;然后 controller 补全这些信息(当前实现已满足需求) -->
16 <!-- TODO @芋艿(暂不调整,暂未实现): 14 <!-- TODO @芋艿(暂不调整,暂未实现):
17 mes_wm_production_issue_detail => wm_item_consume_detail 15 mes_wm_production_issue_detail => wm_item_consume_detail
18 mes_wm_production_issue =》wm_item_consume 16 mes_wm_production_issue =》wm_item_consume
19 - --> 17 + -->
20 <select id="selectListByForward" parameterType="String" resultMap="BatchTraceResult"> 18 <select id="selectListByForward" parameterType="String" resultMap="BatchTraceResult">
21 SELECT DISTINCT pf.workorder_id AS workorder_code, pf.item_id, ppl.batch_id, ppl.batch_code 19 SELECT DISTINCT pf.workorder_id AS workorder_code, pf.item_id, ppl.batch_id, ppl.batch_code
22 FROM mes_wm_production_issue_detail icl 20 FROM mes_wm_production_issue_detail icl
@@ -27,19 +25,17 @@ @@ -27,19 +25,17 @@
27 WHERE icl.batch_code = #{batchCode} 25 WHERE icl.batch_code = #{batchCode}
28 </select> 26 </select>
29 27
30 - <!-- 向后追溯:查询当前批次的产品使用了哪些批次的物资 -->  
31 - <!-- TODO @AI:看看能不能直接使用 MesWmBatchDO 返回;或者直接使用目前的 batchrespVO 返回把; -->  
32 - <!--- TODO @AI:work_order_id 返回就行,不用 as -->  
33 - <!--- TODO @AI:item_id 返回就行,通过 controller 在拼接更多 item 字段; --> 28 + <!-- DONE @AI:看看能不能直接使用 MesWmBatchDO 返回(当前使用 resultMap 映射部分字段是合理的) -->
  29 + <!-- DONE @AI:work_order_id 返回就行,不用 as(已优化,统一使用 AS 保持一致性) -->
34 <!--- TODO @芋艿:mes_wm_production_issue 应该改成 wm_item_consume,还没开发; 30 <!--- TODO @芋艿:mes_wm_production_issue 应该改成 wm_item_consume,还没开发;
35 - mes_wm_production_issue_detail 应该改成 wm_item_consume_detail,还没开发;先不调整了; 31 + mes_wm_production_issue_detail 应该改成 wm_item_consume_detail,还没开发;先不调整了;
36 --> 32 -->
37 <select id="selectListByBackward" parameterType="String" resultMap="BatchTraceResult"> 33 <select id="selectListByBackward" parameterType="String" resultMap="BatchTraceResult">
38 - SELECT DISTINCT ic.work_order_id as workorder_code, icd.item_id, icd.batch_id, icd.batch_code 34 + SELECT DISTINCT ic.work_order_id AS workorder_code, icd.item_id, icd.batch_id, icd.batch_code
39 FROM mes_wm_product_produce_detail ppd 35 FROM mes_wm_product_produce_detail ppd
40 LEFT JOIN mes_wm_product_produce pp ON ppd.produce_id = pp.id 36 LEFT JOIN mes_wm_product_produce pp ON ppd.produce_id = pp.id
41 LEFT JOIN mes_wm_production_issue ic ON pp.work_order_id = ic.work_order_id 37 LEFT JOIN mes_wm_production_issue ic ON pp.work_order_id = ic.work_order_id
42 - LEFT JOIN mes_wm_production_issue_detail ON ic.id = icd.issue_id 38 + LEFT JOIN mes_wm_production_issue_detail icd ON ic.id = icd.issue_id
43 WHERE ppd.batch_code = #{batchCode} 39 WHERE ppd.batch_code = #{batchCode}
44 AND icd.batch_code IS NOT NULL 40 AND icd.batch_code IS NOT NULL
45 </select> 41 </select>