From 6c2da289a4727457a07f7e405f4d520eab2220e5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 21 Feb 2026 12:29:49 +0800 Subject: [PATCH] feat(mes): 添加报工相关字段和简化选择组件,优化数据处理逻辑 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java | 12 +++++++----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java | 14 ++------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java | 17 ++++++++--------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackPageReqVO.java | 9 +++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java | 10 ++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java | 8 ++++++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProFeedbackStatusEnum.java | 8 +++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java | 7 +------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessService.java | 9 +++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java | 5 +++++ 10 files changed, 64 insertions(+), 35 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java index b383830..e72588c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardController.java @@ -124,15 +124,17 @@ public class MesProCardController { Map itemMap = itemService.getItemMap( convertSet(list, MesProCardDO::getItemId)); Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( - convertSet(list, MesProCardDO::getUnitMeasureId)); + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); // 2. 拼接 VO return BeanUtils.toBean(list, MesProCardRespVO.class, vo -> { MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), workOrder -> vo.setWorkOrderCode(workOrder.getCode()).setWorkOrderName(workOrder.getName())); - MapUtils.findAndThen(itemMap, vo.getItemId(), item -> - vo.setItemCode(item.getCode()).setItemName(item.getName())); - MapUtils.findAndThen(unitMeasureMap, vo.getUnitMeasureId(), - unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()) + .setSpecification(item.getSpecification()).setUnitMeasureId(item.getUnitMeasureId()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java index eaed207..171e36d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/card/MesProCardProcessController.java @@ -103,18 +103,8 @@ public class MesProCardProcessController { Map processMap = CollectionUtils.convertMap( processService.getProcessList(new ArrayList<>(convertSet(list, MesProCardProcessDO::getProcessId))), MesProProcessDO::getId); - // 工位:逐个获取(MesMdWorkstationService 暂无批量方法,单页数据量小可接受) - // TODO @AI:还是批量,getWorkstationMap - Set workstationIds = convertSet(list, MesProCardProcessDO::getWorkstationId); - Map workstationMap = new HashMap<>(); - workstationIds.forEach(wsId -> { - if (wsId != null) { - MesMdWorkstationDO ws = workstationService.getWorkstation(wsId); - if (ws != null) { - workstationMap.put(wsId, ws); - } - } - }); + Map workstationMap = workstationService.getWorkstationMap( + convertSet(list, MesProCardProcessDO::getWorkstationId)); Map userMap = adminUserApi.getUserMap( convertSet(list, MesProCardProcessDO::getUserId)); // 2. 拼接 VO diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java index 20befa3..4d689f5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java @@ -195,15 +195,14 @@ public class MesProFeedbackController { // 1.5 工序 Map processMap = processService.getProcessMap( new ArrayList<>(convertSet(list, MesProFeedbackDO::getProcessId))); - // 1.6 工序的 checkFlag:批量查询后按 routeId 分组,再按 processId 建内层 Map + // 1.6 工序的 checkFlag:批量查询后直接构建 routeId -> processId -> checkFlag 的双层 Map List allRouteProcesses = routeProcessService.getRouteProcessListByRouteIds(routeIds); - // TODO @AI:直接构建出 checkFlagMap,避免构建 routeProcessMultiMap 的中间结果,减少内存占用;另外,变量名字在想下; - Map> routeProcessMultiMap = convertMultiMap(allRouteProcesses, - MesProRouteProcessDO::getRouteId); - Map> checkFlagMap = new HashMap<>(); - routeProcessMultiMap.forEach((routeId, rpList) -> - checkFlagMap.put(routeId, convertMap(rpList, MesProRouteProcessDO::getProcessId, - rp -> Boolean.TRUE.equals(rp.getCheckFlag())))); + Map> routeProcessCheckFlagMap = new HashMap<>(); + for (MesProRouteProcessDO rp : allRouteProcesses) { + routeProcessCheckFlagMap + .computeIfAbsent(rp.getRouteId(), k -> new HashMap<>()) + .put(rp.getProcessId(), Boolean.TRUE.equals(rp.getCheckFlag())); + } // 1.7 报工人/审核人 Map userMap = adminUserApi.getUserMap( convertSetByFlatMap(list, feedback -> @@ -221,7 +220,7 @@ public class MesProFeedbackController { findAndThen(processMap, vo.getProcessId(), process -> vo.setProcessCode(process.getCode()).setProcessName(process.getName())); // checkFlag - findAndThen(checkFlagMap, vo.getRouteId(), processCheckMap -> + findAndThen(routeProcessCheckFlagMap, vo.getRouteId(), processCheckMap -> findAndThen(processCheckMap, vo.getProcessId(), vo::setCheckFlag)); // 工单 findAndThen(workOrderMap, vo.getWorkOrderId(), wo -> diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackPageReqVO.java index 784893f..8a8470e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackPageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackPageReqVO.java @@ -33,4 +33,13 @@ public class MesProFeedbackPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] feedbackTime; + @Schema(description = "产品物料编号", example = "100") + private Long itemId; + + @Schema(description = "报工人编号", example = "1") + private Long feedbackUserId; + + @Schema(description = "记录人编号(创建人)", example = "1") + private String creator; + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java index 36de962..971eaf9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java @@ -36,6 +36,7 @@ import java.util.*; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - MES 生产工单") @@ -103,6 +104,15 @@ public class MesProWorkOrderController { return success(new PageResult<>(buildWorkOrderRespVOList(pageResult.getList()), pageResult.getTotal())); } + @GetMapping("/simple-list") + @Operation(summary = "获得生产工单精简列表", description = "主要用于前端的下拉选项") + public CommonResult> getWorkOrderSimpleList() { + List list = workOrderService.getWorkOrderSimpleList(); + return success(convertList(list, wo -> new MesProWorkOrderRespVO() + .setId(wo.getId()).setCode(wo.getCode()).setName(wo.getName()) + .setStatus(wo.getStatus()))); + } + @GetMapping("/export-excel") @Operation(summary = "导出生产工单 Excel") @PreAuthorize("@ss.hasPermission('mes:pro-work-order:export')") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java index 9c3330b..77c21dd 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/feedback/MesProFeedbackDO.java @@ -47,9 +47,10 @@ public class MesProFeedbackDO extends BaseDO { * 枚举 {@link MesProFeedbackTypeEnum} */ private Integer type; - // TODO @AI:这里需要字典么? /** * 报工途径 + * + * 字典类型 mes_pro_feedback_channel */ private String channel; /** @@ -137,13 +138,16 @@ public class MesProFeedbackDO extends BaseDO { * 其他废品数量 */ private BigDecimal otherScrapQuantity; - // TODO @AI:feedbackUserId、approveUserId 关联字段 /** * 报工用户编号 + * + * 关联 AdminUserDO#getId() */ private Long feedbackUserId; /** * 审核用户编号 + * + * 关联 AdminUserDO#getId() */ private Long approveUserId; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProFeedbackStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProFeedbackStatusEnum.java index 1f1bb26..4cc821f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProFeedbackStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProFeedbackStatusEnum.java @@ -6,10 +6,16 @@ import lombok.Getter; import java.util.Arrays; -// TODO @AI:注释下,状态的流转,不要太复杂; /** * MES 生产报工状态枚举 * + * 状态流转: + * 1. 创建 → 草稿(PREPARE) + * 2. 草稿 → 提交 → 审批中(APPROVING) + * 3. 审批中 → 驳回 → 草稿(PREPARE) + * 4. 审批中 → 执行 → 待检验(UNCHECK)或已完成(FINISHED),取决于工序 checkFlag + * 5. 草稿/审批中 → 取消 → 已取消(CANCELED) + * * @author 芋道源码 */ @Getter diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java index e372783..53260ba 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.mes.service.pro.feedback; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -20,7 +19,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; -import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; @@ -182,10 +180,7 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { * @return 是否需要检验 */ private boolean getCheckFlag(Long routeId, Long processId) { - // TODO @AI:是不是 routeProcessService 提供一个查询 routeeProcess 的方法更好?目前只能查询 routeProcesses 全列表,效率较低 - List routeProcesses = routeProcessService.getRouteProcessListByRouteId(routeId); - MesProRouteProcessDO routeProcess = CollUtil.findOne(routeProcesses, - rp -> ObjUtil.equal(rp.getProcessId(), processId)); + MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId(routeId, processId); return routeProcess != null && Boolean.TRUE.equals(routeProcess.getCheckFlag()); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessService.java index 413bbc6..3ac4def 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessService.java @@ -48,6 +48,15 @@ public interface MesProRouteProcessService { List getRouteProcessListByRouteIds(Collection routeIds); /** + * 按工艺路线和工序获得工艺路线工序 + * + * @param routeId 工艺路线编号 + * @param processId 工序编号 + * @return 工艺路线工序 + */ + MesProRouteProcessDO getRouteProcessByRouteIdAndProcessId(Long routeId, Long processId); + + /** * 按工艺路线删除工序(级联删除使用) * * @param routeId 工艺路线编号 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java index a0cfbd9..2daa8ab 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java @@ -179,6 +179,11 @@ public class MesProRouteProcessServiceImpl implements MesProRouteProcessService } @Override + public MesProRouteProcessDO getRouteProcessByRouteIdAndProcessId(Long routeId, Long processId) { + return routeProcessMapper.selectByRouteIdAndProcessId(routeId, processId); + } + + @Override public void deleteRouteProcessByRouteId(Long routeId) { routeProcessMapper.deleteByRouteId(routeId); } -- libgit2 0.21.4