Commit 3320fa804782ee518a072b66260cb089520dc590

Authored by YunaiV
1 parent 2a901c12

✨ feat(workorder): 添加工单状态字段并更新相关逻辑

在 MesProWorkOrderPageReqVO 中新增工单状态字段,并在相关的 Mapper 和 Service 中更新查询逻辑以支持该字段。同时,新增批次编号字段到 MesWmMaterialStockPageReqVO,并更新相关逻辑以确保数据一致性。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/workorder/vo/MesProWorkOrderPageReqVO.java
... ... @@ -35,6 +35,9 @@ public class MesProWorkOrderPageReqVO extends PageParam {
35 35 @Schema(description = "客户编号", example = "300")
36 36 private Long clientId;
37 37  
  38 + @Schema(description = "工单状态", example = "1")
  39 + private Integer status;
  40 +
38 41 @Schema(description = "需求日期")
39 42 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
40 43 private LocalDateTime[] requestDate;
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/materialstock/vo/MesWmMaterialStockPageReqVO.java
... ... @@ -21,6 +21,9 @@ public class MesWmMaterialStockPageReqVO extends PageParam {
21 21 @Schema(description = "批次号", example = "B20260101")
22 22 private String batchCode;
23 23  
  24 + @Schema(description = "批次编号", example = "1")
  25 + private Long batchId;
  26 +
24 27 @Schema(description = "仓库编号", example = "1")
25 28 private Long warehouseId;
26 29  
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/workorder/MesProWorkOrderMapper.java
... ... @@ -26,6 +26,7 @@ public interface MesProWorkOrderMapper extends BaseMapperX<MesProWorkOrderDO> {
26 26 .likeIfPresent(MesProWorkOrderDO::getOrderSourceCode, reqVO.getOrderSourceCode())
27 27 .eqIfPresent(MesProWorkOrderDO::getProductId, reqVO.getProductId())
28 28 .eqIfPresent(MesProWorkOrderDO::getClientId, reqVO.getClientId())
  29 + .eqIfPresent(MesProWorkOrderDO::getStatus, reqVO.getStatus())
29 30 .betweenIfPresent(MesProWorkOrderDO::getRequestDate, reqVO.getRequestDate())
30 31 .orderByDesc(MesProWorkOrderDO::getId));
31 32 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/materialstock/MesWmMaterialStockMapper.java
... ... @@ -26,6 +26,7 @@ public interface MesWmMaterialStockMapper extends BaseMapperX<MesWmMaterialStock
26 26 .inIfPresent(MesWmMaterialStockDO::getItemTypeId, itemTypeIds)
27 27 .inIfPresent(MesWmMaterialStockDO::getItemId, itemIds)
28 28 .likeIfPresent(MesWmMaterialStockDO::getBatchCode, reqVO.getBatchCode())
  29 + .eqIfPresent(MesWmMaterialStockDO::getBatchId, reqVO.getBatchId())
29 30 .eqIfPresent(MesWmMaterialStockDO::getWarehouseId, reqVO.getWarehouseId())
30 31 .eqIfPresent(MesWmMaterialStockDO::getLocationId, reqVO.getLocationId())
31 32 .eqIfPresent(MesWmMaterialStockDO::getAreaId, reqVO.getAreaId())
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
... ... @@ -51,6 +51,8 @@ public interface ErrorCodeConstants {
51 51 ErrorCode WM_BATCH_MOLD_REQUIRED = new ErrorCode(1_040_717_011, "批次配置要求模具不能为空");
52 52 ErrorCode WM_BATCH_LOT_NUMBER_REQUIRED = new ErrorCode(1_040_717_012, "批次配置要求生产批号不能为空");
53 53 ErrorCode WM_BATCH_QUALITY_STATUS_REQUIRED = new ErrorCode(1_040_717_013, "批次配置要求质量状态不能为空");
  54 + ErrorCode WM_BATCH_NOT_EXISTS = new ErrorCode(1_040_717_014, "批次不存在");
  55 + ErrorCode WM_BATCH_ITEM_MISMATCH = new ErrorCode(1_040_717_015, "批次不属于当前物料");
54 56  
55 57 // ========== MES 基础数据-客户(1-040-103-000) ==========
56 58 ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在");
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/andon/MesProAndonRecordServiceImpl.java
... ... @@ -50,7 +50,7 @@ public class MesProAndonRecordServiceImpl implements MesProAndonRecordService {
50 50 MesProAndonConfigDO config = andonConfigService.validateAndonConfigExists(createReqVO.getConfigId());
51 51 workstationService.validateWorkstationExists(createReqVO.getWorkstationId());
52 52 if (createReqVO.getWorkOrderId() != null) {
53   - workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId());
  53 + workOrderService.validateWorkOrderConfirmed(createReqVO.getWorkOrderId());
54 54 }
55 55 if (createReqVO.getProcessId() != null) {
56 56 processService.validateProcessExists(createReqVO.getProcessId());
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java
... ... @@ -69,10 +69,12 @@ public interface MesWmBatchService {
69 69 List<MesWmBatchDO> getBackwardBatchList(String code);
70 70  
71 71 /**
72   - * 获取批次列表
  72 + * 校验批次存在,并校验批次与物料的归属关系
73 73 *
74   - * @return 批次列表
  74 + * @param batchId 批次ID
  75 + * @param itemId 物料ID
  76 + * @return 批次记录
75 77 */
76   - List<MesWmBatchDO> getBatchList();
  78 + MesWmBatchDO validateBatchExists(Long batchId, Long itemId);
77 79  
78 80 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
... ... @@ -237,8 +237,15 @@ public class MesWmBatchServiceImpl implements MesWmBatchService {
237 237 }
238 238  
239 239 @Override
240   - public List<MesWmBatchDO> getBatchList() {
241   - return batchMapper.selectList();
  240 + public MesWmBatchDO validateBatchExists(Long batchId, Long itemId) {
  241 + MesWmBatchDO batch = batchMapper.selectById(batchId);
  242 + if (batch == null) {
  243 + throw exception(WM_BATCH_NOT_EXISTS);
  244 + }
  245 + if (ObjUtil.notEqual(batch.getItemId(), itemId)) {
  246 + throw exception(WM_BATCH_ITEM_MISMATCH);
  247 + }
  248 + return batch;
242 249 }
243 250  
244 251 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java
... ... @@ -6,8 +6,6 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutso
6 6 import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptDetailMapper;
7 7 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
8 8 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
9   -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
10   -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
11 9 import jakarta.annotation.Resource;
12 10 import org.springframework.stereotype.Service;
13 11 import org.springframework.validation.annotation.Validated;
... ... @@ -31,28 +29,12 @@ public class MesWmOutsourceReceiptDetailServiceImpl implements MesWmOutsourceRec
31 29 private MesMdItemService itemService;
32 30  
33 31 @Resource
34   - private MesWmWarehouseService warehouseService;
35   -
36   - @Resource
37   - private MesWmWarehouseLocationService locationService;
38   -
39   - @Resource
40 32 private MesWmWarehouseAreaService areaService;
41 33  
42 34 @Override
43 35 public Long createOutsourceReceiptDetail(MesWmOutsourceReceiptDetailSaveReqVO createReqVO) {
44   - // 校验物料存在
45   - itemService.validateItemExists(createReqVO.getItemId());
46   - // 校验仓库、库区、库位存在
47   - if (createReqVO.getWarehouseId() != null) {
48   - warehouseService.validateWarehouseExists(createReqVO.getWarehouseId());
49   - }
50   - if (createReqVO.getLocationId() != null) {
51   - locationService.validateWarehouseLocationExists(createReqVO.getLocationId());
52   - }
53   - if (createReqVO.getAreaId() != null) {
54   - areaService.validateWarehouseAreaExists(createReqVO.getAreaId());
55   - }
  36 + // 校验数据
  37 + validateDetailSaveData(createReqVO);
56 38  
57 39 // 插入
58 40 MesWmOutsourceReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptDetailDO.class);
... ... @@ -64,18 +46,8 @@ public class MesWmOutsourceReceiptDetailServiceImpl implements MesWmOutsourceRec
64 46 public void updateOutsourceReceiptDetail(MesWmOutsourceReceiptDetailSaveReqVO updateReqVO) {
65 47 // 校验存在
66 48 validateOutsourceReceiptDetailExists(updateReqVO.getId());
67   - // 校验物料存在
68   - itemService.validateItemExists(updateReqVO.getItemId());
69   - // 校验仓库、库区、库位存在
70   - if (updateReqVO.getWarehouseId() != null) {
71   - warehouseService.validateWarehouseExists(updateReqVO.getWarehouseId());
72   - }
73   - if (updateReqVO.getLocationId() != null) {
74   - locationService.validateWarehouseLocationExists(updateReqVO.getLocationId());
75   - }
76   - if (updateReqVO.getAreaId() != null) {
77   - areaService.validateWarehouseAreaExists(updateReqVO.getAreaId());
78   - }
  49 + // 校验数据
  50 + validateDetailSaveData(updateReqVO);
79 51  
80 52 // 更新
81 53 MesWmOutsourceReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptDetailDO.class);
... ... @@ -115,6 +87,16 @@ public class MesWmOutsourceReceiptDetailServiceImpl implements MesWmOutsourceRec
115 87 detailMapper.deleteByLineId(lineId);
116 88 }
117 89  
  90 + /**
  91 + * 校验保存时的关联数据
  92 + */
  93 + private void validateDetailSaveData(MesWmOutsourceReceiptDetailSaveReqVO reqVO) {
  94 + // 校验物料存在
  95 + itemService.validateItemExists(reqVO.getItemId());
  96 + // 校验仓库、库区、库位的层级关系
  97 + areaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId());
  98 + }
  99 +
118 100 private void validateOutsourceReceiptDetailExists(Long id) {
119 101 if (detailMapper.selectById(id) == null) {
120 102 throw exception(WM_OUTSOURCE_RECEIPT_DETAIL_NOT_EXISTS);
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
... ... @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPac
7 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
8 8 import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageLineMapper;
9 9 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  10 +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
10 11 import jakarta.annotation.Resource;
11 12 import org.springframework.context.annotation.Lazy;
12 13 import org.springframework.stereotype.Service;
... ... @@ -33,13 +34,13 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
33 34 private MesWmPackageService packageService;
34 35 @Resource
35 36 private MesMdItemService itemService;
  37 + @Resource
  38 + private MesProWorkOrderService workOrderService;
36 39  
37 40 @Override
38 41 public Long createPackageLine(MesWmPackageLineSaveReqVO createReqVO) {
39   - // 校验装箱单状态为草稿
40   - packageService.validatePackageStatusDraft(createReqVO.getPackageId());
41   - // 校验产品物料存在
42   - itemService.validateItemExists(createReqVO.getItemId());
  42 + // 校验数据
  43 + validateLineSaveData(createReqVO);
43 44  
44 45 // 插入
45 46 MesWmPackageLineDO line = BeanUtils.toBean(createReqVO, MesWmPackageLineDO.class);
... ... @@ -51,10 +52,9 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
51 52 public void updatePackageLine(MesWmPackageLineSaveReqVO updateReqVO) {
52 53 // 校验存在
53 54 MesWmPackageLineDO line = validatePackageLineExists(updateReqVO.getId());
54   - // 校验装箱单状态为草稿
55   - packageService.validatePackageStatusDraft(line.getPackageId());
56   - // 校验产品物料存在
57   - itemService.validateItemExists(updateReqVO.getItemId());
  55 + // 校验数据
  56 + updateReqVO.setPackageId(line.getPackageId());
  57 + validateLineSaveData(updateReqVO);
58 58  
59 59 // 更新
60 60 MesWmPackageLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageLineDO.class);
... ... @@ -93,6 +93,20 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
93 93  
94 94 // ========== 校验方法 ==========
95 95  
  96 + /**
  97 + * 校验保存时的关联数据
  98 + */
  99 + private void validateLineSaveData(MesWmPackageLineSaveReqVO reqVO) {
  100 + // 校验装箱单状态为草稿
  101 + packageService.validatePackageStatusDraft(reqVO.getPackageId());
  102 + // 校验产品物料存在
  103 + itemService.validateItemExists(reqVO.getItemId());
  104 + // 校验工单已确认
  105 + if (reqVO.getWorkOrderId() != null) {
  106 + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
  107 + }
  108 + }
  109 +
96 110 private MesWmPackageLineDO validatePackageLineExists(Long id) {
97 111 MesWmPackageLineDO line = packageLineMapper.selectById(id);
98 112 if (line == null) {
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
... ... @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLine
12 12 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
13 13 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
14 14 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  15 +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
15 16 import jakarta.annotation.Resource;
16 17 import org.springframework.context.annotation.Lazy;
17 18 import org.springframework.stereotype.Service;
... ... @@ -43,6 +44,8 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
43 44 @Resource
44 45 private MesMdItemService itemService;
45 46 @Resource
  47 + private MesWmBatchService batchService;
  48 + @Resource
46 49 @Lazy
47 50 private MesWmReturnSalesDetailService returnSalesDetailService;
48 51  
... ... @@ -153,6 +156,10 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
153 156 if (Boolean.TRUE.equals(item.getBatchFlag()) && batchId == null) {
154 157 throw exception(MD_ITEM_BATCH_REQUIRED);
155 158 }
  159 + // 校验批次存在且属于当前物料
  160 + if (batchId != null) {
  161 + batchService.validateBatchExists(batchId, itemId);
  162 + }
156 163 }
157 164  
158 165 @Override
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
... ... @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesW
7 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
8 8 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper;
9 9 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  10 +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
10 11 import jakarta.annotation.Resource;
11 12 import org.springframework.context.annotation.Lazy;
12 13 import org.springframework.stereotype.Service;
... ... @@ -36,6 +37,8 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe
36 37 private MesWmReturnVendorDetailService returnVendorDetailService;
37 38 @Resource
38 39 private MesMdItemService itemService;
  40 + @Resource
  41 + private MesWmBatchService batchService;
39 42  
40 43 @Override
41 44 public Long createReturnVendorLine(MesWmReturnVendorLineSaveReqVO createReqVO) {
... ... @@ -108,6 +111,10 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe
108 111 returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId());
109 112 // 校验物料存在
110 113 itemService.validateItemExists(reqVO.getItemId());
  114 + // 校验批次存在且属于当前物料
  115 + if (reqVO.getBatchId() != null) {
  116 + batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId());
  117 + }
111 118 }
112 119  
113 120 }
... ...