Quellcode durchsuchen

✨ feat(mes): 新增生产工单编码及状态管理功能

新增生产工单编码规则和状态管理逻辑,优化工单创建和更新流程。
同时,更新前端表单以支持新的工单状态和来源单据字段,提升用户体验。
YunaiV vor 2 Monaten
Ursprung
Commit
6976335596

+ 1 - 1
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkorderSaveReqVO.java

@@ -70,4 +70,4 @@ public class MesProWorkOrderSaveReqVO {
     @Schema(description = "备注", example = "备注")
     private String remark;
 
-    }
+}

+ 2 - 1
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java

@@ -238,8 +238,9 @@ public interface ErrorCodeConstants {
     // ========== MES 生产管理-生产工单(1-040-502-000) ==========
     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_PREPARE = new ErrorCode(1_040_502_002, "只有草稿状态的工单才能执行此操作");
     ErrorCode PRO_WORK_ORDER_NOT_CONFIRMED = new ErrorCode(1_040_502_003, "只有已确认状态的工单才能执行此操作");
+    ErrorCode PRO_WORK_ORDER_HAS_CHILDREN = new ErrorCode(1_040_502_004, "存在子工单,无法删除");
     ErrorCode PRO_WORK_ORDER_BOM_NOT_EXISTS = new ErrorCode(1_040_502_100, "生产工单BOM不存在");
 
     // ========== MES 生产管理-生产任务(1-040-503-000) ==========

+ 2 - 1
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java

@@ -44,7 +44,8 @@ public enum MesMdAutoCodeRuleCodeEnum {
     DV_REPAIR_CODE("DV_REPAIR_CODE", "维修单编码"),
     WM_SALES_NOTICE_CODE("WM_SALES_NOTICE_CODE", "发货通知单编码"),
     WM_RETURN_SALES_CODE("WM_RETURN_SALES_CODE", "销售退货单编码"),
-    WM_MISC_ISSUE_CODE("WM_MISC_ISSUE_CODE", "杂项出库单编码");
+    WM_MISC_ISSUE_CODE("WM_MISC_ISSUE_CODE", "杂项出库单编码"),
+    PRO_WORK_ORDER_CODE("PRO_WORK_ORDER_CODE", "生产工单编码");
 
     /**
      * 规则代码

+ 15 - 6
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java

@@ -56,6 +56,7 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createWorkOrder(MesProWorkOrderSaveReqVO createReqVO) {
+        // TODO @AI:validateXXXSaveData
         // 1.1 校验编码唯一
         validateWorkOrderCodeUnique(null, createReqVO.getCode());
         // 1.2 校验产品存在
@@ -69,9 +70,7 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
         }
         // 2.2 插入工单
         MesProWorkOrderDO workOrder = BeanUtils.toBean(createReqVO, MesProWorkOrderDO.class);
-        if (workOrder.getStatus() == null) {
-            workOrder.setStatus(MesProWorkOrderStatusEnum.PREPARE.getStatus());
-        }
+        workOrder.setStatus(MesProWorkOrderStatusEnum.PREPARE.getStatus());
         workOrderMapper.insert(workOrder);
 
         // 3. 自动生成 BOM:根据产品 BOM 生成工单 BOM
@@ -88,9 +87,14 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
     public void updateWorkOrder(MesProWorkOrderSaveReqVO updateReqVO) {
         // 1.1 校验存在
         MesProWorkOrderDO oldWorkOrder = validateWorkOrderExists(updateReqVO.getId());
-        // 1.2 校验编码唯一
+        // TODO @AI:validateXXXSaveData
+        // 1.2 只有草稿状态才能编辑
+        if (ObjUtil.notEqual(oldWorkOrder.getStatus(), MesProWorkOrderStatusEnum.PREPARE.getStatus())) {
+            throw exception(PRO_WORK_ORDER_NOT_PREPARE);
+        }
+        // 1.3 校验编码唯一
         validateWorkOrderCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
-        // 1.3 校验批次配置
+        // 1.4 校验批次配置
         validateBatchConfig(updateReqVO.getProductId(), updateReqVO.getClientId());
 
         // 2. 判断产品或数量是否变更,如果变更则重新生成 BOM(updated=true 会先清理旧数据)
@@ -114,6 +118,11 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
         if (ObjUtil.notEqual(workOrder.getStatus(), MesProWorkOrderStatusEnum.PREPARE.getStatus())) {
             throw exception(PRO_WORK_ORDER_NOT_PREPARE);
         }
+        // 1.3 校验是否有子工单
+        Long childCount = workOrderMapper.selectCount(MesProWorkOrderDO::getParentId, id);
+        if (childCount > 0) {
+            throw exception(PRO_WORK_ORDER_HAS_CHILDREN);
+        }
 
         // 2. 删除工单 + BOM
         workOrderMapper.deleteById(id);
@@ -227,7 +236,7 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService {
     }
 
     private void validateBatchConfig(Long productId, Long clientId) {
-        // 如果产品有 clientFlag=true,则 clientId 必填
+        // 如果产品有 clientFlag =true,则 clientId 必填
         MesMdItemBatchConfigDO batchConfig = itemBatchConfigService.getItemBatchConfigByItemId(productId);
         if (batchConfig != null && Boolean.TRUE.equals(batchConfig.getClientFlag()) && clientId == null) {
             // 产品要求批次管理中必须填写客户