Commit 97e55806eaa48b9bf81677729bd27f3d3154141b

Authored by YunaiV
1 parent 173b403a

✨ feat(mes): 添加物料接收单状态枚举及相关功能

新增物料接收单的状态枚举,包含草稿、待质检、已完成和待入库状态。
同时更新相关的请求和响应对象,确保在物料接收流程中能够正确处理状态变更。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialrequest/MesWmMaterialRequestLineController.java
... ... @@ -102,7 +102,7 @@ public class MesWmMaterialRequestLineController {
102 102 // 2. 构建结果
103 103 return BeanUtils.toBean(list, MesWmMaterialRequestLineRespVO.class, vo -> {
104 104 MapUtils.findAndThen(itemMap, vo.getItemId(), item ->
105   - vo.setItemCode(item.getCode()).setSpecification(item.getSpecification()));
  105 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()));
106 106 MapUtils.findAndThen(unitMeasureMap, vo.getUnitMeasureId(), unit ->
107 107 vo.setUnitMeasureName(unit.getName()));
108 108 });
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialrequest/vo/line/MesWmMaterialRequestLineSaveReqVO.java
... ... @@ -22,9 +22,6 @@ public class MesWmMaterialRequestLineSaveReqVO {
22 22 @NotNull(message = "产品物料ID不能为空")
23 23 private Long itemId;
24 24  
25   - @Schema(description = "产品物料名称", example = "PVC 颗粒")
26   - private String itemName;
27   -
28 25 @Schema(description = "计量单位ID", example = "1")
29 26 private Long unitMeasureId;
30 27  
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestDO.java
... ... @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialrequest;
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.workstation.MesMdWorkstationDO;
5 5 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
  6 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmMaterialRequestStatusEnum;
6 7 import com.baomidou.mybatisplus.annotation.KeySequence;
7 8 import com.baomidou.mybatisplus.annotation.TableId;
8 9 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -58,12 +59,10 @@ public class MesWmMaterialRequestDO extends BaseDO {
58 59 * 完成时间
59 60 */
60 61 private LocalDateTime endTime;
61   - // TODO @AI:枚举类;
62   - // TODO @AI:字典;
63 62 /**
64 63 * 状态
65 64 *
66   - * 0=草稿 1=备料中 2=待领料 3=已完成 4=已取消
  65 + * 枚举 {@link MesWmMaterialRequestStatusEnum}
67 66 */
68 67 private Integer status;
69 68 /**
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialrequest/MesWmMaterialRequestLineDO.java
... ... @@ -40,11 +40,6 @@ public class MesWmMaterialRequestLineDO extends BaseDO {
40 40 * 关联 {@link MesMdItemDO#getId()}
41 41 */
42 42 private Long itemId;
43   - // TODO @AI:不用快照,读取就好了。
44   - /**
45   - * 产品物料名称(快照)
46   - */
47   - private String itemName;
48 43 /**
49 44 * 计量单位ID
50 45 *
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMaterialRequestStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * MES 领料申请单状态枚举
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +public enum MesWmMaterialRequestStatusEnum implements ArrayValuable<Integer> {
  17 +
  18 + PREPARE(0, "草稿"),
  19 + PREPARING(1, "备料中"),
  20 + WAITING(2, "待领料"),
  21 + FINISHED(3, "已完成"),
  22 + CANCELED(4, "已取消");
  23 +
  24 + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmMaterialRequestStatusEnum::getStatus).toArray(Integer[]::new);
  25 +
  26 + /**
  27 + * 状态值
  28 + */
  29 + private final Integer status;
  30 + /**
  31 + * 状态名
  32 + */
  33 + private final String name;
  34 +
  35 + @Override
  36 + public Integer[] array() {
  37 + return ARRAYS;
  38 + }
  39 +
  40 +}
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestLineService.java
... ... @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.materialrequest.vo.line.M
6 6 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialrequest.MesWmMaterialRequestLineDO;
7 7 import jakarta.validation.Valid;
8 8  
  9 +import java.util.List;
  10 +
9 11 /**
10 12 * MES 领料申请单行 Service 接口
11 13 */
... ... @@ -49,4 +51,19 @@ public interface MesWmMaterialRequestLineService {
49 51 */
50 52 PageResult<MesWmMaterialRequestLineDO> getMaterialRequestLinePage(MesWmMaterialRequestLinePageReqVO pageReqVO);
51 53  
  54 + /**
  55 + * 获得指定领料申请单的所有行
  56 + *
  57 + * @param materialRequestId 领料申请单编号
  58 + * @return 领料申请单行列表
  59 + */
  60 + List<MesWmMaterialRequestLineDO> getMaterialRequestLineListByMaterialRequestId(Long materialRequestId);
  61 +
  62 + /**
  63 + * 根据领料申请单编号,删除所有行
  64 + *
  65 + * @param materialRequestId 领料申请单编号
  66 + */
  67 + void deleteMaterialRequestLineByMaterialRequestId(Long materialRequestId);
  68 +
52 69 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestLineServiceImpl.java
1 1 package cn.iocoder.yudao.module.mes.service.wm.materialrequest;
2 2  
  3 +import cn.hutool.core.util.ObjUtil;
3 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialrequest.vo.line.MesWmMaterialRequestLinePageReqVO;
6 7 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialrequest.vo.line.MesWmMaterialRequestLineSaveReqVO;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialrequest.MesWmMaterialRequestDO;
7 9 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialrequest.MesWmMaterialRequestLineDO;
8 10 import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialrequest.MesWmMaterialRequestLineMapper;
  11 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmMaterialRequestStatusEnum;
9 12 import jakarta.annotation.Resource;
  13 +import org.springframework.context.annotation.Lazy;
10 14 import org.springframework.stereotype.Service;
11 15 import org.springframework.validation.annotation.Validated;
12 16  
  17 +import java.util.List;
  18 +
13 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
14   -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_MATERIAL_REQUEST_LINE_NOT_EXISTS;
  20 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
15 21  
16 22 /**
17 23 * MES 领料申请单行 Service 实现类
... ... @@ -23,9 +29,14 @@ public class MesWmMaterialRequestLineServiceImpl implements MesWmMaterialRequest
23 29 @Resource
24 30 private MesWmMaterialRequestLineMapper materialRequestLineMapper;
25 31  
  32 + @Resource
  33 + @Lazy
  34 + private MesWmMaterialRequestService materialRequestService;
  35 +
26 36 @Override
27 37 public Long createMaterialRequestLine(MesWmMaterialRequestLineSaveReqVO createReqVO) {
28   - // TODO @AI:校验关联字段
  38 + // 校验父单据存在且为草稿状态
  39 + validateMaterialRequestStatusDraft(createReqVO.getMaterialRequestId());
29 40  
30 41 // 插入
31 42 MesWmMaterialRequestLineDO line = BeanUtils.toBean(createReqVO, MesWmMaterialRequestLineDO.class);
... ... @@ -35,9 +46,10 @@ public class MesWmMaterialRequestLineServiceImpl implements MesWmMaterialRequest
35 46  
36 47 @Override
37 48 public void updateMaterialRequestLine(MesWmMaterialRequestLineSaveReqVO updateReqVO) {
38   - // 验证是否存在
39   - validateMaterialRequestLineExists(updateReqVO.getId());
40   - // TODO @AI:校验关联字段
  49 + // 校验存在
  50 + MesWmMaterialRequestLineDO line = validateMaterialRequestLineExists(updateReqVO.getId());
  51 + // 校验父单据存在且为草稿状态
  52 + validateMaterialRequestStatusDraft(line.getMaterialRequestId());
41 53  
42 54 // 更新
43 55 MesWmMaterialRequestLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMaterialRequestLineDO.class);
... ... @@ -46,7 +58,7 @@ public class MesWmMaterialRequestLineServiceImpl implements MesWmMaterialRequest
46 58  
47 59 @Override
48 60 public void deleteMaterialRequestLine(Long id) {
49   - // 验证是否存在
  61 + // 校验存在
50 62 validateMaterialRequestLineExists(id);
51 63 // 删除
52 64 materialRequestLineMapper.deleteById(id);
... ... @@ -62,6 +74,16 @@ public class MesWmMaterialRequestLineServiceImpl implements MesWmMaterialRequest
62 74 return materialRequestLineMapper.selectPage(pageReqVO);
63 75 }
64 76  
  77 + @Override
  78 + public List<MesWmMaterialRequestLineDO> getMaterialRequestLineListByMaterialRequestId(Long materialRequestId) {
  79 + return materialRequestLineMapper.selectListByMaterialRequestId(materialRequestId);
  80 + }
  81 +
  82 + @Override
  83 + public void deleteMaterialRequestLineByMaterialRequestId(Long materialRequestId) {
  84 + materialRequestLineMapper.deleteByMaterialRequestId(materialRequestId);
  85 + }
  86 +
65 87 private MesWmMaterialRequestLineDO validateMaterialRequestLineExists(Long id) {
66 88 MesWmMaterialRequestLineDO line = materialRequestLineMapper.selectById(id);
67 89 if (line == null) {
... ... @@ -70,4 +92,18 @@ public class MesWmMaterialRequestLineServiceImpl implements MesWmMaterialRequest
70 92 return line;
71 93 }
72 94  
  95 + /**
  96 + * 校验父领料申请单存在且为草稿状态
  97 + */
  98 + private void validateMaterialRequestStatusDraft(Long materialRequestId) {
  99 + // TODO @AI:对方提供下接口,更聚焦一点!
  100 + MesWmMaterialRequestDO materialRequest = materialRequestService.getMaterialRequest(materialRequestId);
  101 + if (materialRequest == null) {
  102 + throw exception(WM_MATERIAL_REQUEST_NOT_EXISTS);
  103 + }
  104 + if (ObjUtil.notEqual(MesWmMaterialRequestStatusEnum.PREPARE.getStatus(), materialRequest.getStatus())) {
  105 + throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
  106 + }
  107 + }
  108 +
73 109 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestService.java
... ... @@ -55,32 +55,29 @@ public interface MesWmMaterialRequestService {
55 55 */
56 56 PageResult<MesWmMaterialRequestDO> getMaterialRequestPage(MesWmMaterialRequestPageReqVO pageReqVO);
57 57  
58   - // TODO @AI:不用 0、1 这种状态,只写中文就行
59 58 /**
60   - * 提交领料申请单(0=草稿 → 1=备料中)
  59 + * 提交领料申请单(草稿 → 备料中)
61 60 *
62 61 * @param id 编号
63 62 */
64 63 void submitMaterialRequest(Long id);
65 64  
66   - // TODO @AI:不用 0、1 这种状态,只写中文就行
67 65 /**
68   - * 审批领料申请单(1=备料中 → 2=待领料)
  66 + * 审批领料申请单(备料中 → 待领料)
69 67 *
70 68 * @param id 编号
71 69 */
72 70 void approveMaterialRequest(Long id);
73 71  
74   - // TODO @AI:不用 0、1 这种状态,只写中文就行
75 72 /**
76   - * 完成领料申请单(2=待领料 → 3=已完成),内部调用
  73 + * 完成领料申请单(待领料 → 已完成),内部调用
77 74 *
78 75 * @param id 编号
79 76 */
80 77 void finishMaterialRequest(Long id);
81 78  
82 79 /**
83   - * 取消领料申请单(非已完成 → 4=已取消)
  80 + * 取消领料申请单(非已完成 → 已取消)
84 81 *
85 82 * @param id 编号
86 83 */
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/materialrequest/MesWmMaterialRequestServiceImpl.java
1 1 package cn.iocoder.yudao.module.mes.service.wm.materialrequest;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjUtil;
4 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 7 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialrequest.vo.MesWmMaterialRequestPageReqVO;
7 8 import cn.iocoder.yudao.module.mes.controller.admin.wm.materialrequest.vo.MesWmMaterialRequestSaveReqVO;
8 9 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialrequest.MesWmMaterialRequestDO;
9   -import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialrequest.MesWmMaterialRequestLineMapper;
10 10 import cn.iocoder.yudao.module.mes.dal.mysql.wm.materialrequest.MesWmMaterialRequestMapper;
  11 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmMaterialRequestStatusEnum;
11 12 import jakarta.annotation.Resource;
12 13 import org.springframework.stereotype.Service;
13 14 import org.springframework.transaction.annotation.Transactional;
... ... @@ -20,7 +21,6 @@ import java.util.List;
20 21 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
21 22 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
22 23  
23   -// TODO @AI:参考 /Users/yunai/Java/yudao-all-in-one/ruoyi-vue-pro/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java 风格,优化代码;
24 24 /**
25 25 * MES 领料申请单 Service 实现类
26 26 */
... ... @@ -32,24 +32,26 @@ public class MesWmMaterialRequestServiceImpl implements MesWmMaterialRequestServ
32 32 private MesWmMaterialRequestMapper materialRequestMapper;
33 33  
34 34 @Resource
35   - private MesWmMaterialRequestLineMapper materialRequestLineMapper;
  35 + private MesWmMaterialRequestLineService materialRequestLineService;
36 36  
37 37 @Override
38 38 public Long createMaterialRequest(MesWmMaterialRequestSaveReqVO createReqVO) {
  39 + // TODO @AI:校验关联数据;
  40 +
  41 + // 2. 插入
39 42 MesWmMaterialRequestDO materialRequest = BeanUtils.toBean(createReqVO, MesWmMaterialRequestDO.class);
40   - materialRequest.setStatus(0); // 草稿
  43 + materialRequest.setStatus(MesWmMaterialRequestStatusEnum.PREPARE.getStatus());
41 44 materialRequestMapper.insert(materialRequest);
42 45 return materialRequest.getId();
43 46 }
44 47  
45 48 @Override
46 49 public void updateMaterialRequest(MesWmMaterialRequestSaveReqVO updateReqVO) {
47   - // 校验存在
48   - MesWmMaterialRequestDO materialRequest = validateMaterialRequestExists(updateReqVO.getId());
49   - // 只有草稿状态才允许修改
50   - if (!materialRequest.getStatus().equals(0)) {
51   - throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
52   - }
  50 + // 1. 校验存在 + 草稿状态
  51 + validateMaterialRequestExistsAndDraft(updateReqVO.getId());
  52 + // TODO @AI:校验关联数据;
  53 +
  54 + // 2. 更新
53 55 MesWmMaterialRequestDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMaterialRequestDO.class);
54 56 materialRequestMapper.updateById(updateObj);
55 57 }
... ... @@ -57,15 +59,12 @@ public class MesWmMaterialRequestServiceImpl implements MesWmMaterialRequestServ
57 59 @Override
58 60 @Transactional(rollbackFor = Exception.class)
59 61 public void deleteMaterialRequest(Long id) {
60   - // 校验存在
61   - MesWmMaterialRequestDO materialRequest = validateMaterialRequestExists(id);
62   - // 只有草稿状态才允许删除
63   - if (!materialRequest.getStatus().equals(0)) {
64   - throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
65   - }
66   - // 级联删除行
67   - materialRequestLineMapper.deleteByMaterialRequestId(id);
68   - // 删除
  62 + // 1. 校验存在 + 草稿状态
  63 + validateMaterialRequestExistsAndDraft(id);
  64 +
  65 + // 2.1 级联删除行
  66 + materialRequestLineService.deleteMaterialRequestLineByMaterialRequestId(id);
  67 + // 2.2 删除
69 68 materialRequestMapper.deleteById(id);
70 69 }
71 70  
... ... @@ -81,42 +80,54 @@ public class MesWmMaterialRequestServiceImpl implements MesWmMaterialRequestServ
81 80  
82 81 @Override
83 82 public void submitMaterialRequest(Long id) {
84   - MesWmMaterialRequestDO materialRequest = validateMaterialRequestExists(id);
85   - // 0=草稿 → 1=备料中
86   - if (!materialRequest.getStatus().equals(0)) {
87   - throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
88   - }
89   - materialRequestMapper.updateById(new MesWmMaterialRequestDO().setId(id).setStatus(1));
  83 + // 1. 校验存在 + 草稿状态
  84 + validateMaterialRequestExistsAndDraft(id);
  85 +
  86 + // 2. 草稿 → 备料中
  87 + materialRequestMapper.updateById(new MesWmMaterialRequestDO()
  88 + .setId(id).setStatus(MesWmMaterialRequestStatusEnum.PREPARING.getStatus()));
90 89 }
91 90  
92 91 @Override
93 92 public void approveMaterialRequest(Long id) {
  93 + // 1.1 校验存在
94 94 MesWmMaterialRequestDO materialRequest = validateMaterialRequestExists(id);
95   - // 1=备料中 → 2=待领料
96   - if (!materialRequest.getStatus().equals(1)) {
  95 + // 1.2 校验状态:只有备料中才允许审批
  96 + if (ObjUtil.notEqual(MesWmMaterialRequestStatusEnum.PREPARING.getStatus(), materialRequest.getStatus())) {
97 97 throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
98 98 }
99   - materialRequestMapper.updateById(new MesWmMaterialRequestDO().setId(id).setStatus(2));
  99 +
  100 + // 2. 备料中 → 待领料
  101 + materialRequestMapper.updateById(new MesWmMaterialRequestDO()
  102 + .setId(id).setStatus(MesWmMaterialRequestStatusEnum.WAITING.getStatus()));
100 103 }
101 104  
102 105 @Override
103 106 public void finishMaterialRequest(Long id) {
  107 + // 1.1 校验存在
104 108 MesWmMaterialRequestDO materialRequest = validateMaterialRequestExists(id);
105   - // 2=待领料 → 3=已完成
106   - if (!materialRequest.getStatus().equals(2)) {
  109 + // 1.2 校验状态:只有待领料才允许完成
  110 + if (ObjUtil.notEqual(MesWmMaterialRequestStatusEnum.WAITING.getStatus(), materialRequest.getStatus())) {
107 111 throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
108 112 }
109   - materialRequestMapper.updateById(new MesWmMaterialRequestDO().setId(id).setStatus(3));
  113 +
  114 + // 2. 待领料 → 已完成
  115 + materialRequestMapper.updateById(new MesWmMaterialRequestDO()
  116 + .setId(id).setStatus(MesWmMaterialRequestStatusEnum.FINISHED.getStatus()));
110 117 }
111 118  
112 119 @Override
113 120 public void cancelMaterialRequest(Long id) {
  121 + // 1.1 校验存在
114 122 MesWmMaterialRequestDO materialRequest = validateMaterialRequestExists(id);
115   - // 已完成不可取消
116   - if (materialRequest.getStatus().equals(3)) {
  123 + // 1.2 已完成不可取消
  124 + if (ObjUtil.equal(MesWmMaterialRequestStatusEnum.FINISHED.getStatus(), materialRequest.getStatus())) {
117 125 throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
118 126 }
119   - materialRequestMapper.updateById(new MesWmMaterialRequestDO().setId(id).setStatus(4));
  127 +
  128 + // 2. 非已完成 → 已取消
  129 + materialRequestMapper.updateById(new MesWmMaterialRequestDO()
  130 + .setId(id).setStatus(MesWmMaterialRequestStatusEnum.CANCELED.getStatus()));
120 131 }
121 132  
122 133 @Override
... ... @@ -135,4 +146,15 @@ public class MesWmMaterialRequestServiceImpl implements MesWmMaterialRequestServ
135 146 return materialRequest;
136 147 }
137 148  
  149 + /**
  150 + * 校验领料申请单存在且为草稿状态
  151 + */
  152 + private MesWmMaterialRequestDO validateMaterialRequestExistsAndDraft(Long id) {
  153 + MesWmMaterialRequestDO materialRequest = validateMaterialRequestExists(id);
  154 + if (ObjUtil.notEqual(MesWmMaterialRequestStatusEnum.PREPARE.getStatus(), materialRequest.getStatus())) {
  155 + throw exception(WM_MATERIAL_REQUEST_STATUS_INVALID);
  156 + }
  157 + return materialRequest;
  158 + }
  159 +
138 160 }
... ...