From aca010b7d39022608af3e7b765bdc0828a484c31 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 21 Feb 2026 11:15:00 +0800 Subject: [PATCH] feedback --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/MesProFeedbackController.java | 73 ++++++++++++++++++++++--------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java | 4 ++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/route/MesProRouteProcessMapper.java | 6 ++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java | 96 +++++++++++++++++++++++++++++++++++++++--------------------------------------------------------- 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 | 10 ++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteService.java | 22 ++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java | 10 ++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java | 9 +++++++++ 10 files changed, 139 insertions(+), 108 deletions(-) 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 b029c36..20befa3 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 @@ -5,7 +5,6 @@ import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackPageReqVO; @@ -41,12 +40,11 @@ import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.*; -import java.util.stream.Collectors; +import java.util.stream.Stream; 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.convertSet; -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen; @Tag(name = "管理后台 - MES 生产报工") @@ -188,49 +186,28 @@ public class MesProFeedbackController { // 1.2 工单 Map workOrderMap = workOrderService.getWorkOrderMap( convertSet(list, MesProFeedbackDO::getWorkOrderId)); - // 1.3 工作站(逐个查询,因为没有批量方法) - // TODO @AI:getWorkstationMap 必须有办法 - Set workstationIds = convertSet(list, MesProFeedbackDO::getWorkstationId); - Map workstationMap = new HashMap<>(); - workstationIds.forEach(wsId -> { - MesMdWorkstationDO ws = workstationService.getWorkstation(wsId); - if (ws != null) { - workstationMap.put(wsId, ws); - } - }); - // 1.4 工艺路线(逐个查询) - // TODO @AI:getRouteMap 必须有办法;里面调用 getRouteList;如果不行,就加个; + // 1.3 工作站 + Map workstationMap = workstationService.getWorkstationMap( + convertSet(list, MesProFeedbackDO::getWorkstationId)); + // 1.4 工艺路线 Set routeIds = convertSet(list, MesProFeedbackDO::getRouteId); - Map routeMap = new HashMap<>(); - routeIds.forEach(rId -> { - MesProRouteDO route = routeService.getRoute(rId); - if (route != null) { - routeMap.put(rId, route); - } - }); + Map routeMap = routeService.getRouteMap(routeIds); // 1.5 工序 - // TODO @AI:getProcessMap 必须有办法;里面调用 getProcessList;如果不行,就加个; - Set processIds = convertSet(list, MesProFeedbackDO::getProcessId); - List processList = processService.getProcessList(new ArrayList<>(processIds)); - Map processMap = processList.stream() - .collect(Collectors.toMap(MesProProcessDO::getId, p -> p, (a, b) -> a)); - // 1.6 工序的 checkFlag(按路线维度缓存) - // TODO @AI:collutils 里面有个 convertMultiMap 的方法; - Map> routeProcessMap = new HashMap<>(); - routeIds.forEach(rId -> routeProcessMap.put(rId, routeProcessService.getRouteProcessListByRouteId(rId))); + Map processMap = processService.getProcessMap( + new ArrayList<>(convertSet(list, MesProFeedbackDO::getProcessId))); + // 1.6 工序的 checkFlag:批量查询后按 routeId 分组,再按 processId 建内层 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())))); // 1.7 报工人/审核人 Map userMap = adminUserApi.getUserMap( - convertSetByFlatMap(list, feedback -> { - // TODO @AI:必须要判空,里面已经处理了; - Set userIds = new HashSet<>(); - if (feedback.getFeedbackUserId() != null) { - userIds.add(feedback.getFeedbackUserId()); - } - if (feedback.getApproveUserId() != null) { - userIds.add(feedback.getApproveUserId()); - } - return userIds.stream(); - })); + convertSetByFlatMap(list, feedback -> + Stream.of(feedback.getFeedbackUserId(), feedback.getApproveUserId()))); // 2. 拼接 VO return BeanUtils.toBean(list, MesProFeedbackRespVO.class, vo -> { @@ -244,14 +221,8 @@ public class MesProFeedbackController { findAndThen(processMap, vo.getProcessId(), process -> vo.setProcessCode(process.getCode()).setProcessName(process.getName())); // checkFlag - // TODO @AI:这个判断有点复杂,是不是上面构建更合适的 map? - List rps = routeProcessMap.get(vo.getRouteId()); - if (rps != null) { - rps.stream() - .filter(rp -> rp.getProcessId().equals(vo.getProcessId())) - .findFirst() - .ifPresent(rp -> vo.setCheckFlag(Boolean.TRUE.equals(rp.getCheckFlag()))); - } + findAndThen(checkFlagMap, vo.getRouteId(), processCheckMap -> + findAndThen(processCheckMap, vo.getProcessId(), vo::setCheckFlag)); // 工单 findAndThen(workOrderMap, vo.getWorkOrderId(), wo -> vo.setWorkOrderCode(wo.getCode()).setWorkOrderName(wo.getName())); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java index 430f888..895ecba 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackSaveReqVO.java @@ -14,6 +14,10 @@ public class MesProFeedbackSaveReqVO { @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") private Long id; + @Schema(description = "报工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "FB202503001") + @NotNull(message = "报工单编号不能为空") + private String code; + @Schema(description = "报工类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "报工类型不能为空") private Integer type; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/route/MesProRouteProcessMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/route/MesProRouteProcessMapper.java index d3e071e..ee24ef3 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/route/MesProRouteProcessMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/route/MesProRouteProcessMapper.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; import java.util.List; /** @@ -48,4 +49,9 @@ public interface MesProRouteProcessMapper extends BaseMapperX selectListByRouteIds(Collection routeIds) { + return selectList(new LambdaQueryWrapperX() + .in(MesProRouteProcessDO::getRouteId, routeIds)); + } + } 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 384a007..e372783 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,17 +1,17 @@ package cn.iocoder.yudao.module.mes.service.pro.feedback; -import cn.hutool.core.util.IdUtil; +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; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.feedback.vo.MesProFeedbackSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.mysql.pro.feedback.MesProFeedbackMapper; import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum; -import cn.iocoder.yudao.module.mes.enums.pro.MesProWorkOrderStatusEnum; import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import jakarta.annotation.Resource; @@ -46,35 +46,21 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { @Override public Long createFeedback(MesProFeedbackSaveReqVO createReqVO) { - // 1.1 校验工单已确认 - // TODO @AI: workOrderService 里抽个校验方法; - MesProWorkOrderDO workOrder = workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); - if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.CONFIRMED.getStatus())) { - throw exception(PRO_FEEDBACK_WORK_ORDER_NOT_CONFIRMED); - } + // 1. 校验工单已确认 + workOrderService.validateWorkOrderConfirmed(createReqVO.getWorkOrderId()); // TODO @芋艿:校验 pro_task 存在且未完成(待 pro_task 服务迁移) - // TODO @AI:2 和 3 融合成 插入; - // 2. 自动生成报工单编号 + // 2. 插入 MesProFeedbackDO feedback = BeanUtils.toBean(createReqVO, MesProFeedbackDO.class); - // TODO @AI:这个 id 前端生成,createReqVO 必须传递; - feedback.setCode("FB" + IdUtil.getSnowflakeNextIdStr()); feedback.setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus()); - - // 3. 插入 feedbackMapper.insert(feedback); return feedback.getId(); } @Override public void updateFeedback(MesProFeedbackSaveReqVO updateReqVO) { - // 1.1 校验存在 - MesProFeedbackDO feedback = validateFeedbackExists(updateReqVO.getId()); - // 1.2 只能修改草稿状态 - // TODO @AI:抽个校验方法,校验状态为草稿; - if (ObjUtil.notEqual(feedback.getStatus(), MesProFeedbackStatusEnum.PREPARE.getStatus())) { - throw exception(PRO_FEEDBACK_NOT_PREPARE); - } + // 1. 校验存在 + 草稿状态 + validateFeedbackStatusPrepare(updateReqVO.getId()); // 2. 更新 MesProFeedbackDO updateObj = BeanUtils.toBean(updateReqVO, MesProFeedbackDO.class); @@ -83,13 +69,8 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { @Override public void deleteFeedback(Long id) { - // 1.1 校验存在 - MesProFeedbackDO feedback = validateFeedbackExists(id); - // 1.2 只能删除草稿状态 - // TODO @AI:抽个校验方法,校验状态为草稿; - if (ObjUtil.notEqual(feedback.getStatus(), MesProFeedbackStatusEnum.PREPARE.getStatus())) { - throw exception(PRO_FEEDBACK_NOT_PREPARE); - } + // 1. 校验存在 + 草稿状态 + validateFeedbackStatusPrepare(id); // 2. 删除 feedbackMapper.deleteById(id); @@ -108,11 +89,7 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { @Override public void submitFeedback(Long id) { // 1. 校验存在 + 草稿状态 - MesProFeedbackDO feedback = validateFeedbackExists(id); - // TODO @AI:抽个校验方法,校验状态为草稿; - if (ObjUtil.notEqual(feedback.getStatus(), MesProFeedbackStatusEnum.PREPARE.getStatus())) { - throw exception(PRO_FEEDBACK_STATUS_ERROR); - } + validateFeedbackStatusPrepare(id); // 2. 更新状态为审批中,记录报工人和报工时间 feedbackMapper.updateById(new MesProFeedbackDO().setId(id) @@ -124,11 +101,7 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { @Override public void rejectFeedback(Long id) { // 1. 校验存在 + 审批中状态 - MesProFeedbackDO feedback = validateFeedbackExists(id); - // TODO @AI:抽个校验方法,校验状态为审批中; - if (ObjUtil.notEqual(feedback.getStatus(), MesProFeedbackStatusEnum.APPROVING.getStatus())) { - throw exception(PRO_FEEDBACK_NOT_APPROVING); - } + validateFeedbackStatusApproving(id); // 2. 更新状态为草稿 feedbackMapper.updateById(new MesProFeedbackDO().setId(id) @@ -139,11 +112,7 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { @Transactional(rollbackFor = Exception.class) public void executeFeedback(Long id) { // 1. 校验存在 + 审批中状态 - MesProFeedbackDO feedback = validateFeedbackExists(id); - // TODO @AI:抽个校验方法,校验状态为审批中; - if (ObjUtil.notEqual(feedback.getStatus(), MesProFeedbackStatusEnum.APPROVING.getStatus())) { - throw exception(PRO_FEEDBACK_NOT_APPROVING); - } + MesProFeedbackDO feedback = validateFeedbackStatusApproving(id); // 2.1 查询工序的 checkFlag,决定目标状态 boolean checkFlag = getCheckFlag(feedback.getRouteId(), feedback.getProcessId()); @@ -155,9 +124,8 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { .setStatus(targetStatus) .setApproveUserId(getLoginUserId())); - // 4. 如果不需要检验(直接完成),执行后续操作 - // TODO @AI:BoolUtil.isFalse(checkFlag) - if (!checkFlag) { + // 3. 如果不需要检验(直接完成),执行后续操作 + if (BooleanUtil.isFalse(checkFlag)) { // TODO @芋艿:WM 物料消耗(WmItemConsumeService)未迁移,此处需补充物料消耗逻辑 // TODO @芋艿:WM 产品产出(WmProductProduceService)未迁移,此处需补充产品产出逻辑 // TODO @芋艿:updateProTaskAndWorkorder 待 pro_task 服务迁移后补充级联更新任务/工单的已生产数量 @@ -168,10 +136,10 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { public void cancelFeedback(Long id) { // 1.1 校验存在 MesProFeedbackDO feedback = validateFeedbackExists(id); - // 1.2 只有草稿或审批中可以取消 - // TODO @AI: ObjUtils.equalsAny,看起来更简洁; - if (ObjUtil.equal(feedback.getStatus(), MesProFeedbackStatusEnum.FINISHED.getStatus()) - || ObjUtil.equal(feedback.getStatus(), MesProFeedbackStatusEnum.CANCELED.getStatus())) { + // 1.2 只有草稿或审批中可以取消(已完成、已取消不可操作) + if (ObjectUtils.equalsAny(feedback.getStatus(), + MesProFeedbackStatusEnum.FINISHED.getStatus(), + MesProFeedbackStatusEnum.CANCELED.getStatus())) { throw exception(PRO_FEEDBACK_STATUS_ERROR); } @@ -190,6 +158,22 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { return feedback; } + private MesProFeedbackDO validateFeedbackStatusPrepare(Long id) { + MesProFeedbackDO feedback = validateFeedbackExists(id); + if (ObjUtil.notEqual(feedback.getStatus(), MesProFeedbackStatusEnum.PREPARE.getStatus())) { + throw exception(PRO_FEEDBACK_NOT_PREPARE); + } + return feedback; + } + + private MesProFeedbackDO validateFeedbackStatusApproving(Long id) { + MesProFeedbackDO feedback = validateFeedbackExists(id); + if (ObjUtil.notEqual(feedback.getStatus(), MesProFeedbackStatusEnum.APPROVING.getStatus())) { + throw exception(PRO_FEEDBACK_NOT_APPROVING); + } + return feedback; + } + /** * 获取指定工艺路线中指定工序的 checkFlag * @@ -198,13 +182,11 @@ public class MesProFeedbackServiceImpl implements MesProFeedbackService { * @return 是否需要检验 */ private boolean getCheckFlag(Long routeId, Long processId) { + // TODO @AI:是不是 routeProcessService 提供一个查询 routeeProcess 的方法更好?目前只能查询 routeProcesses 全列表,效率较低 List routeProcesses = routeProcessService.getRouteProcessListByRouteId(routeId); - // TODO @AI:CollUtil findOne 更简洁; - return routeProcesses.stream() - .filter(rp -> ObjUtil.equal(rp.getProcessId(), processId)) - .findFirst() - .map(rp -> Boolean.TRUE.equals(rp.getCheckFlag())) - .orElse(false); + MesProRouteProcessDO routeProcess = CollUtil.findOne(routeProcesses, + rp -> ObjUtil.equal(rp.getProcessId(), 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 e5b1b01..413bbc6 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 @@ -4,6 +4,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProR import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO; import jakarta.validation.Valid; +import java.util.Collection; import java.util.List; /** @@ -39,6 +40,14 @@ public interface MesProRouteProcessService { List getRouteProcessListByRouteId(Long routeId); /** + * 按多个工艺路线获得工序列表 + * + * @param routeIds 工艺路线编号数组 + * @return 工序列表 + */ + List getRouteProcessListByRouteIds(Collection routeIds); + + /** * 按工艺路线删除工序(级联删除使用) * * @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 23ccdc1..a0cfbd9 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 @@ -12,6 +12,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -169,6 +171,14 @@ public class MesProRouteProcessServiceImpl implements MesProRouteProcessService } @Override + public List getRouteProcessListByRouteIds(Collection routeIds) { + if (CollUtil.isEmpty(routeIds)) { + return Collections.emptyList(); + } + return routeProcessMapper.selectListByRouteIds(routeIds); + } + + @Override public void deleteRouteProcessByRouteId(Long routeId) { routeProcessMapper.deleteByRouteId(routeId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteService.java index 379809e..973c1a5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteService.java @@ -6,7 +6,11 @@ import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.MesProRouteSave import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteDO; import jakarta.validation.Valid; +import java.util.Collection; import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; /** * MES 工艺路线 Service 接口 @@ -60,4 +64,22 @@ public interface MesProRouteService { */ void validateRouteNotEnable(Long routeId); + /** + * 获得工艺路线列表 + * + * @param ids 编号数组 + * @return 工艺路线列表 + */ + List getRouteList(Collection ids); + + /** + * 获得工艺路线 Map + * + * @param ids 编号数组 + * @return 工艺路线 Map + */ + default Map getRouteMap(Collection ids) { + return convertMap(getRouteList(ids), MesProRouteDO::getId); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java index ef77918..e55b1c2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java @@ -19,6 +19,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.util.Collection; +import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -163,4 +165,12 @@ public class MesProRouteServiceImpl implements MesProRouteService { } } + @Override + public List getRouteList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return routeMapper.selectByIds(ids); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java index 344f3d1..aaeb198 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java @@ -84,6 +84,14 @@ public interface MesProWorkOrderService { } /** + * 校验工单已确认 + * + * @param id 编号 + * @return 工单 + */ + MesProWorkOrderDO validateWorkOrderConfirmed(Long id); + + /** * 确认工单(草稿 → 已确认) * * @param id 编号 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java index ad96705..3007978 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java @@ -148,6 +148,15 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { } @Override + public MesProWorkOrderDO validateWorkOrderConfirmed(Long id) { + MesProWorkOrderDO workOrder = validateWorkOrderExists(id); + if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.CONFIRMED.getStatus())) { + throw exception(PRO_WORK_ORDER_NOT_CONFIRMED); + } + return workOrder; + } + + @Override public void confirmWorkOrder(Long id) { // 1. 校验存在 MesProWorkOrderDO workOrder = validateWorkOrderExists(id); -- libgit2 0.21.4