From f7b06a095267da7562c47c29a7dbbf84a0d85a27 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 20 Feb 2026 08:24:46 +0800 Subject: [PATCH] fix(mes): 完善生产工单模块,优化 BOM 展开、工单状态校验及仓库删除保护 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderBomController.java | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderController.java | 22 ++++++++++++---------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java | 30 ++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderRespVO.java | 4 ---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderSaveReqVO.java | 3 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkorderBomRespVO.java | 3 +++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkorderDO.java | 4 ---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdProductBomMapper.java | 5 +++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 1 + yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomService.java | 9 +++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomServiceImpl.java | 5 +++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java | 36 ++++++++++++++++++++++++++++-------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java | 41 ++++++++++++++++++++++++++++++++--------- 13 files changed, 228 insertions(+), 45 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderBomController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderBomController.java index 6f886c7..29490db 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderBomController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/MesProWorkorderBomController.java @@ -5,13 +5,18 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; 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.module.mes.controller.admin.pro.workorder.vo.MesProWorkOrderItemRespVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.bom.MesProWorkOrderBomPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.bom.MesProWorkOrderBomRespVO; import cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo.bom.MesProWorkOrderBomSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdProductBomDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdProductBomService; import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService; import io.swagger.v3.oas.annotations.Operation; @@ -23,11 +28,10 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Collections; -import java.util.List; -import java.util.Map; - +import java.math.BigDecimal; +import java.util.*; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMultiMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - MES 生产工单 BOM") @@ -45,6 +49,12 @@ public class MesProWorkOrderBomController { @Resource private MesMdUnitMeasureService unitMeasureService; + @Resource + private MesMdItemTypeService itemTypeService; + + @Resource + private MesMdProductBomService productBomService; + @PostMapping("/create") @Operation(summary = "创建工单 BOM") @PreAuthorize("@ss.hasPermission('mes:pro-work-order:update')") @@ -89,6 +99,44 @@ public class MesProWorkOrderBomController { return success(new PageResult<>(buildWorkOrderBomRespVOList(pageResult.getList()), pageResult.getTotal())); } + @GetMapping("/item-list-by-work-order-id") + @Operation(summary = "获得工单物料需求列表") + @Parameter(name = "workOrderId", description = "工单编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-work-order:query')") + public CommonResult> getWorkOrderBomItemListByWorkOrderId( + @RequestParam("workOrderId") Long workOrderId) { + // 1. 获取工单 BOM 行 + List bomList = workOrderBomService.getWorkOrderBomListByWorkOrderId(workOrderId); + if (CollUtil.isEmpty(bomList)) { + return success(Collections.emptyList()); + } + + // 2. 逐层展开,得到叶子物料 itemId → quantity + Map leafItems = buildWorkOrderItems(bomList); + if (leafItems.isEmpty()) { + return success(Collections.emptyList()); + } + + // 3. 拼接 VO 字段 + Map itemMap = itemService.getItemMap(leafItems.keySet()); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + List result = new ArrayList<>(leafItems.size()); + for (Map.Entry entry : leafItems.entrySet()) { + MesMdItemDO item = itemMap.get(entry.getKey()); + if (item == null) { + continue; + } + MesProWorkOrderItemRespVO vo = new MesProWorkOrderItemRespVO() + .setItemId(item.getId()).setQuantity(entry.getValue()) + .setItemCode(item.getCode()).setItemName(item.getName()).setItemSpec(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + result.add(vo); + } + return success(result); + } + // ==================== 拼接 VO ==================== private List buildWorkOrderBomRespVOList(List list) { @@ -100,14 +148,62 @@ public class MesProWorkOrderBomController { convertSet(list, MesProWorkOrderBomDO::getItemId)); Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(list, MesProWorkOrderBomDO::getUnitMeasureId)); + Map itemTypeMap = itemTypeService.getItemTypeMap( + convertSet(itemMap.values(), MesMdItemDO::getItemTypeId)); // 2. 拼接 VO return BeanUtils.toBean(list, MesProWorkOrderBomRespVO.class, vo -> { - MapUtils.findAndThen(itemMap, vo.getItemId(), item -> - vo.setItemName(item.getName()).setItemCode(item.getCode()) - .setItemSpec(item.getSpecification())); + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemName(item.getName()).setItemCode(item.getCode()) + .setItemSpec(item.getSpecification()); + MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(), + itemType -> vo.setItemOrProduct(itemType.getItemOrProduct())); + }); MapUtils.findAndThen(unitMeasureMap, vo.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); } + // ==================== 物料需求逐层展开 ==================== + + /** + * 逐层 IN 查询展开工单 BOM 到叶子物料,合并同物料的需求数量 + * + * @param bomList 工单 BOM 列表 + * @return 叶子物料 Map:itemId → 合并后的需求数量 + */ + private Map buildWorkOrderItems(List bomList) { + // 1. 初始化:收集第一层物料 ID 和对应数量 + Map currentLayer = new LinkedHashMap<>(); + for (MesProWorkOrderBomDO bom : bomList) { + currentLayer.merge(bom.getItemId(), bom.getQuantity(), BigDecimal::add); + } + + // 2. 逐层 IN 查询展开 BOM + Map leafItems = new LinkedHashMap<>(); + for (int i = 0; i < Byte.MAX_VALUE && CollUtil.isNotEmpty(currentLayer); i++) { + // 2.1 批量查询当前层所有物料的子 BOM + List subBomList = productBomService.getProductBomListByItemIds(currentLayer.keySet()); + // 2.2 按 itemId 分组 + Map> subBomMap = convertMultiMap(subBomList, MesMdProductBomDO::getItemId); + // 2.3 区分叶子节点和非叶子节点 + Map nextLayer = new LinkedHashMap<>(); + for (Map.Entry entry : currentLayer.entrySet()) { + Long itemId = entry.getKey(); + BigDecimal quantity = entry.getValue(); + List children = subBomMap.get(itemId); + // 情况一:叶子节点,累加到结果 + if (CollUtil.isEmpty(children)) { + leafItems.merge(itemId, quantity, BigDecimal::add); + continue; + } + // 情况二:非叶子,子物料进入下一层 + for (MesMdProductBomDO child : children) { + nextLayer.merge(child.getBomItemId(), quantity.multiply(child.getQuantity()), BigDecimal::add); + } + } + currentLayer = nextLayer; + } + return leafItems; + } + } 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 37f4ed4..850cf6c 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 @@ -32,14 +32,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +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.convertMap; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - MES 生产工单") @@ -119,6 +115,15 @@ public class MesProWorkOrderController { ExcelUtils.write(response, "生产工单.xls", "数据", MesProWorkOrderRespVO.class, voList); } + @PutMapping("/confirm") + @Operation(summary = "确认工单") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:pro-work-order:update')") + public CommonResult confirmWorkOrder(@RequestParam("id") Long id) { + workOrderService.confirmWorkOrder(id); + return success(true); + } + @PutMapping("/finish") @Operation(summary = "完成工单") @Parameter(name = "id", description = "编号", required = true) @@ -152,11 +157,8 @@ public class MesProWorkOrderController { convertSet(list, MesProWorkOrderDO::getVendorId)); Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(list, MesProWorkOrderDO::getUnitMeasureId)); - // TODO @AI:直接 workOrderService.getWorkOrderMap,内部调用 workOrderService.getWorkOrderList - Set parentIds = convertSet(list, MesProWorkOrderDO::getParentId); - Map parentMap = CollUtil.isEmpty(parentIds) - ? Collections.emptyMap() - : convertMap(workOrderService.getWorkOrderList(parentIds), MesProWorkOrderDO::getId); + Map parentMap = workOrderService.getWorkOrderMap( + convertSet(list, MesProWorkOrderDO::getParentId)); // 2. 拼接 VO return BeanUtils.toBean(list, MesProWorkOrderRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getProductId(), item -> diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java new file mode 100644 index 0000000..efd077f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderItemRespVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.mes.controller.admin.pro.workorder.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 工单物料需求 Response VO") +@Data +public class MesProWorkOrderItemRespVO { + + @Schema(description = "物料编号", example = "100") + private Long itemId; + + @Schema(description = "物料编码", example = "M-001") + private String itemCode; + + @Schema(description = "物料名称", example = "电阻 10K") + private String itemName; + + @Schema(description = "规格型号", example = "0603") + private String itemSpec; + + @Schema(description = "单位名称", example = "个") + private String unitMeasureName; + + @Schema(description = "需求数量", example = "1000.00") + private BigDecimal quantity; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderRespVO.java index faf99cc..275a3d9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderRespVO.java @@ -98,10 +98,6 @@ public class MesProWorkOrderRespVO { @ExcelProperty("供应商名称") private String vendorName; - @Schema(description = "批次号", example = "BATCH-001") - @ExcelProperty("批次号") - private String batchCode; - @Schema(description = "需求日期") @ExcelProperty("需求日期") private LocalDateTime requestDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderSaveReqVO.java index bcc1671..79facb6 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderSaveReqVO.java @@ -61,9 +61,6 @@ public class MesProWorkOrderSaveReqVO { @Schema(description = "供应商编号", example = "400") private Long vendorId; - @Schema(description = "批次号", example = "BATCH-001") - private String batchCode; - @Schema(description = "需求日期", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "需求日期不能为空") private LocalDateTime requestDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkorderBomRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkorderBomRespVO.java index 78feffe..5e7e7d8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkorderBomRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/bom/MesProWorkorderBomRespVO.java @@ -50,6 +50,9 @@ public class MesProWorkOrderBomRespVO { @ExcelProperty("备注") private String remark; + @Schema(description = "物料产品标识", example = "PRODUCT") + private String itemOrProduct; + @Schema(description = "预留字段1") private String attribute1; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkorderDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkorderDO.java index 68ad55f..39af3cb 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkorderDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/workorder/MesProWorkorderDO.java @@ -101,10 +101,6 @@ public class MesProWorkOrderDO extends BaseDO { */ private Long vendorId; /** - * 批次号 - */ - private String batchCode; - /** * 需求日期 */ private LocalDateTime requestDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdProductBomMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdProductBomMapper.java index 1528fb4..daadf60 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdProductBomMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdProductBomMapper.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductB import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdProductBomDO; import org.apache.ibatis.annotations.Mapper; +import java.util.Collection; import java.util.List; /** @@ -28,6 +29,10 @@ public interface MesMdProductBomMapper extends BaseMapperX { return selectList(MesMdProductBomDO::getItemId, itemId); } + default List selectByItemIds(Collection itemIds) { + return selectList(MesMdProductBomDO::getItemId, itemIds); + } + default List selectAll() { return selectList(); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 9f07458..8073e96 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -167,6 +167,7 @@ public interface ErrorCodeConstants { ErrorCode PRO_WORK_ORDER_NOT_EXISTS = new ErrorCode(1_040_502_000, "生产工单不存在"); ErrorCode PRO_WORK_ORDER_CODE_DUPLICATE = new ErrorCode(1_040_502_001, "生产工单编码已存在"); ErrorCode PRO_WORK_ORDER_NOT_PREPARE = new ErrorCode(1_040_502_002, "只能删除草稿状态的工单"); + ErrorCode PRO_WORK_ORDER_NOT_CONFIRMED = new ErrorCode(1_040_502_003, "只有已确认状态的工单才能执行此操作"); ErrorCode PRO_WORK_ORDER_BOM_NOT_EXISTS = new ErrorCode(1_040_502_100, "生产工单BOM不存在"); // ========== MES 生产管理-生产任务(1-040-503-000) ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomService.java index 3de41fd..cb04405 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.bom.MesMdProductB import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdProductBomDO; import jakarta.validation.Valid; +import java.util.Collection; import java.util.List; /** @@ -62,6 +63,14 @@ public interface MesMdProductBomService { List getProductBomListByItemId(Long itemId); /** + * 根据物料产品编号批量获得产品BOM列表 + * + * @param itemIds 物料产品编号数组 + * @return 产品BOM列表 + */ + List getProductBomListByItemIds(Collection itemIds); + + /** * 根据物料产品编号删除产品BOM * * @param itemId 物料产品编号 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomServiceImpl.java index 80ae5c7..e49c651 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdProductBomServiceImpl.java @@ -133,6 +133,11 @@ public class MesMdProductBomServiceImpl implements MesMdProductBomService { } @Override + public List getProductBomListByItemIds(Collection itemIds) { + return productBomMapper.selectByItemIds(itemIds); + } + + @Override public void deleteProductBomByItemId(Long itemId) { productBomMapper.deleteByItemId(itemId); } 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 61ad50f..344f3d1 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 @@ -8,6 +8,9 @@ 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 接口 @@ -63,25 +66,42 @@ public interface MesProWorkOrderService { PageResult getWorkOrderPage(MesProWorkOrderPageReqVO pageReqVO); /** - * 完成工单 + * 获得工单列表 + * + * @param ids 编号数组 + * @return 工单列表 + */ + List getWorkOrderList(Collection ids); + + /** + * 获得工单 Map + * + * @param ids 编号数组 + * @return 工单 Map + */ + default Map getWorkOrderMap(Collection ids) { + return convertMap(getWorkOrderList(ids), MesProWorkOrderDO::getId); + } + + /** + * 确认工单(草稿 → 已确认) * * @param id 编号 */ - void finishWorkOrder(Long id); + void confirmWorkOrder(Long id); /** - * 取消工单 + * 完成工单 * * @param id 编号 */ - void cancelWorkOrder(Long id); + void finishWorkOrder(Long id); /** - * 获得工单列表 + * 取消工单 * - * @param ids 编号数组 - * @return 工单列表 + * @param id 编号 */ - List getWorkOrderList(Collection ids); + void cancelWorkOrder(Long 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 01519c5..ad96705 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 @@ -25,6 +25,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Collection; +import java.util.Collections; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -139,9 +140,33 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { } @Override - public void finishWorkOrder(Long id) { + public List getWorkOrderList(Collection ids) { + if (CollUtil.isEmpty(ids)) { + return Collections.emptyList(); + } + return workOrderMapper.selectByIds(ids); + } + + @Override + public void confirmWorkOrder(Long id) { // 1. 校验存在 - validateWorkOrderExists(id); + MesProWorkOrderDO workOrder = validateWorkOrderExists(id); + // 2. 只有草稿状态才能确认 + if (!ObjUtil.equal(workOrder.getStatus(), MesProWorkOrderStatusEnum.PREPARE.getStatus())) { + throw exception(PRO_WORK_ORDER_NOT_PREPARE); + } + // 3. 更新状态为已确认 + workOrderMapper.updateById(new MesProWorkOrderDO().setId(id) + .setStatus(MesProWorkOrderStatusEnum.CONFIRMED.getStatus())); + } + + @Override + public void finishWorkOrder(Long id) { + // 1. 校验存在 + 只有已确认状态才能完成 + MesProWorkOrderDO workOrder = validateWorkOrderExists(id); + if (!ObjUtil.equal(workOrder.getStatus(), MesProWorkOrderStatusEnum.CONFIRMED.getStatus())) { + throw exception(PRO_WORK_ORDER_NOT_CONFIRMED); + } // 2. 更新状态为已完成 workOrderMapper.updateById(new MesProWorkOrderDO().setId(id) @@ -152,8 +177,11 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { @Override public void cancelWorkOrder(Long id) { - // 1. 校验存在 - validateWorkOrderExists(id); + // 1. 校验存在 + 只有已确认状态才能取消 + MesProWorkOrderDO workOrder = validateWorkOrderExists(id); + if (!ObjUtil.equal(workOrder.getStatus(), MesProWorkOrderStatusEnum.CONFIRMED.getStatus())) { + throw exception(PRO_WORK_ORDER_NOT_CONFIRMED); + } // 2. 更新状态为已取消 workOrderMapper.updateById(new MesProWorkOrderDO().setId(id) @@ -162,11 +190,6 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { // TODO @芋艿:pro_task 未迁移,暂不级联更新任务状态 } - @Override - public List getWorkOrderList(Collection ids) { - return workOrderMapper.selectByIds(ids); - } - // ==================== 校验方法 ==================== private void validateWorkOrderCodeUnique(Long id, String code) { -- libgit2 0.21.4