Commit 728eb76bc3321eef632c43d8a2d31ff60dcc15cd

Authored by YunaiV
1 parent 746345aa

✨ feat(mes): 添加生产任务编码字段,优化任务创建和更新逻辑

新增生产任务编码字段,更新任务创建和更新方法以校验关联数据的存在性,确保数据一致性和完整性。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/task/vo/MesProTaskSaveReqVO.java
1 package cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo; 1 package cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import jakarta.validation.constraints.NotEmpty; 4 +import jakarta.validation.constraints.DecimalMin;
  5 +import jakarta.validation.constraints.Min;
5 import jakarta.validation.constraints.NotNull; 6 import jakarta.validation.constraints.NotNull;
6 import lombok.Data; 7 import lombok.Data;
7 8
@@ -15,14 +16,6 @@ public class MesProTaskSaveReqVO { @@ -15,14 +16,6 @@ public class MesProTaskSaveReqVO {
15 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
16 private Long id; 17 private Long id;
17 18
18 - @Schema(description = "任务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PT202503150001")  
19 - @NotEmpty(message = "任务编码不能为空")  
20 - private String code;  
21 -  
22 - @Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "注塑任务")  
23 - @NotEmpty(message = "任务名称不能为空")  
24 - private String name;  
25 -  
26 @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 19 @Schema(description = "生产工单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
27 @NotNull(message = "生产工单不能为空") 20 @NotNull(message = "生产工单不能为空")
28 private Long workOrderId; 21 private Long workOrderId;
@@ -45,27 +38,14 @@ public class MesProTaskSaveReqVO { @@ -45,27 +38,14 @@ public class MesProTaskSaveReqVO {
45 38
46 @Schema(description = "排产数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") 39 @Schema(description = "排产数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
47 @NotNull(message = "排产数量不能为空") 40 @NotNull(message = "排产数量不能为空")
  41 + @DecimalMin(value = "0", inclusive = false, message = "排产数量必须大于 0")
48 private BigDecimal quantity; 42 private BigDecimal quantity;
49 43
50 - @Schema(description = "已生产数量", example = "0")  
51 - private BigDecimal producedQuantity;  
52 -  
53 - @Schema(description = "合格品数量", example = "0")  
54 - private BigDecimal qualifyQuantity;  
55 -  
56 - @Schema(description = "不良品数量", example = "0")  
57 - private BigDecimal unqualifyQuantity;  
58 -  
59 - @Schema(description = "调整数量", example = "0")  
60 - private BigDecimal changedQuantity;  
61 -  
62 - @Schema(description = "客户编号", example = "300")  
63 - private Long clientId;  
64 -  
65 @Schema(description = "开始生产时间") 44 @Schema(description = "开始生产时间")
66 private LocalDateTime startTime; 45 private LocalDateTime startTime;
67 46
68 @Schema(description = "生产时长(工作日)", example = "3") 47 @Schema(description = "生产时长(工作日)", example = "3")
  48 + @Min(value = 1, message = "生产时长必须大于 0")
69 private Integer duration; 49 private Integer duration;
70 50
71 @Schema(description = "结束生产时间") 51 @Schema(description = "结束生产时间")
@@ -77,4 +57,4 @@ public class MesProTaskSaveReqVO { @@ -77,4 +57,4 @@ public class MesProTaskSaveReqVO {
77 @Schema(description = "备注", example = "备注") 57 @Schema(description = "备注", example = "备注")
78 private String remark; 58 private String remark;
79 59
80 - } 60 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/md/autocode/MesMdAutoCodeRuleCodeEnum.java
@@ -14,7 +14,8 @@ public enum MesMdAutoCodeRuleCodeEnum { @@ -14,7 +14,8 @@ public enum MesMdAutoCodeRuleCodeEnum {
14 14
15 SN_CODE("SN_CODE", "SN 码"), 15 SN_CODE("SN_CODE", "SN 码"),
16 PACKAGE_CODE("PACKAGE_CODE", "装箱单编码"), 16 PACKAGE_CODE("PACKAGE_CODE", "装箱单编码"),
17 - BATCH_CODE("BATCH_CODE", "批次编码"); 17 + BATCH_CODE("BATCH_CODE", "批次编码"),
  18 + TASK_CODE("TASK_CODE", "生产任务编码");
18 19
19 /** 20 /**
20 * 规则代码 21 * 规则代码
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteService.java
@@ -65,6 +65,14 @@ public interface MesProRouteService { @@ -65,6 +65,14 @@ public interface MesProRouteService {
65 void validateRouteNotEnable(Long routeId); 65 void validateRouteNotEnable(Long routeId);
66 66
67 /** 67 /**
  68 + * 校验工艺路线存在
  69 + *
  70 + * @param id 工艺路线编号
  71 + * @return 工艺路线
  72 + */
  73 + MesProRouteDO validateRouteExists(Long id);
  74 +
  75 + /**
68 * 获得工艺路线列表 76 * 获得工艺路线列表
69 * 77 *
70 * @param ids 编号数组 78 * @param ids 编号数组
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java
@@ -99,7 +99,8 @@ public class MesProRouteServiceImpl implements MesProRouteService { @@ -99,7 +99,8 @@ public class MesProRouteServiceImpl implements MesProRouteService {
99 routeMapper.deleteById(id); 99 routeMapper.deleteById(id);
100 } 100 }
101 101
102 - private MesProRouteDO validateRouteExists(Long id) { 102 + @Override
  103 + public MesProRouteDO validateRouteExists(Long id) {
103 MesProRouteDO route = routeMapper.selectById(id); 104 MesProRouteDO route = routeMapper.selectById(id);
104 if (route == null) { 105 if (route == null) {
105 throw exception(PRO_ROUTE_NOT_EXISTS); 106 throw exception(PRO_ROUTE_NOT_EXISTS);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/task/MesProTaskServiceImpl.java
@@ -5,10 +5,19 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -5,10 +5,19 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO; 6 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskPageReqVO;
7 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskSaveReqVO; 7 import cn.iocoder.yudao.module.mes.controller.admin.pro.task.vo.MesProTaskSaveReqVO;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
8 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
9 import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper; 10 import cn.iocoder.yudao.module.mes.dal.mysql.pro.task.MesProTaskMapper;
  11 +import cn.iocoder.yudao.module.mes.enums.md.autocode.MesMdAutoCodeRuleCodeEnum;
10 import cn.iocoder.yudao.module.mes.enums.pro.MesProTaskStatusEnum; 12 import cn.iocoder.yudao.module.mes.enums.pro.MesProTaskStatusEnum;
  13 +import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
  14 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  15 +import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService;
  16 +import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
  17 +import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteService;
  18 +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
11 import jakarta.annotation.Resource; 19 import jakarta.annotation.Resource;
  20 +import org.springframework.context.annotation.Lazy;
12 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
13 import org.springframework.validation.annotation.Validated; 22 import org.springframework.validation.annotation.Validated;
14 23
@@ -32,23 +41,61 @@ public class MesProTaskServiceImpl implements MesProTaskService { @@ -32,23 +41,61 @@ public class MesProTaskServiceImpl implements MesProTaskService {
32 @Resource 41 @Resource
33 private MesProTaskMapper taskMapper; 42 private MesProTaskMapper taskMapper;
34 43
  44 + @Resource
  45 + @Lazy
  46 + private MesProWorkOrderService workOrderService;
  47 + @Resource
  48 + private MesMdWorkstationService workstationService;
  49 + @Resource
  50 + private MesProProcessService processService;
  51 + @Resource
  52 + private MesMdItemService itemService;
  53 + @Resource
  54 + private MesProRouteService routeService;
  55 + @Resource
  56 + private MesMdAutoCodeRecordService autoCodeRecordService;
  57 +
35 @Override 58 @Override
36 public Long createTask(MesProTaskSaveReqVO createReqVO) { 59 public Long createTask(MesProTaskSaveReqVO createReqVO) {
37 - MesProTaskDO task = BeanUtils.toBean(createReqVO, MesProTaskDO.class); 60 + // 1. 校验关联数据存在
  61 + workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId());
  62 + workstationService.validateWorkstationExists(createReqVO.getWorkstationId());
  63 + routeService.validateRouteExists(createReqVO.getRouteId());
  64 + processService.validateProcessExists(createReqVO.getProcessId());
  65 + MesMdItemDO item = itemService.validateItemExists(createReqVO.getItemId());
  66 +
  67 + // 2.1 构建任务 DO
  68 + MesProTaskDO task = BeanUtils.toBean(createReqVO, MesProTaskDO.class)
  69 + .setName(item.getName() + "【" + createReqVO.getQuantity() + "】")
  70 + .setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.TASK_CODE.getCode()))
  71 + .setStatus(MesProTaskStatusEnum.PREPARE.getStatus());
  72 + // 2.2 插入
38 taskMapper.insert(task); 73 taskMapper.insert(task);
39 return task.getId(); 74 return task.getId();
40 } 75 }
41 76
42 @Override 77 @Override
43 public void updateTask(MesProTaskSaveReqVO updateReqVO) { 78 public void updateTask(MesProTaskSaveReqVO updateReqVO) {
  79 + // 1.1 校验存在
44 validateTaskExists(updateReqVO.getId()); 80 validateTaskExists(updateReqVO.getId());
45 - MesProTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesProTaskDO.class); 81 + // 1.2 校验关联数据存在
  82 + workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId());
  83 + workstationService.validateWorkstationExists(updateReqVO.getWorkstationId());
  84 + routeService.validateRouteExists(updateReqVO.getRouteId());
  85 + processService.validateProcessExists(updateReqVO.getProcessId());
  86 + MesMdItemDO item = itemService.validateItemExists(updateReqVO.getItemId());
  87 +
  88 + // 2. 更新
  89 + MesProTaskDO updateObj = BeanUtils.toBean(updateReqVO, MesProTaskDO.class)
  90 + .setName(item.getName() + "【" + updateReqVO.getQuantity() + "】");
46 taskMapper.updateById(updateObj); 91 taskMapper.updateById(updateObj);
47 } 92 }
48 93
49 @Override 94 @Override
50 public void deleteTask(Long id) { 95 public void deleteTask(Long id) {
  96 + // 1. 校验存在
51 validateTaskExists(id); 97 validateTaskExists(id);
  98 + // 2. 删除
52 taskMapper.deleteById(id); 99 taskMapper.deleteById(id);
53 } 100 }
54 101