Commit eb0819bde7a3d3800524795292498b0bfeeabb0b

Authored by YunaiV
1 parent f677aa7b

✨ feat(mes): 新增批次号和来源单据字段

新增批次号字段和来源单据编号、类型字段,以支持更灵活的杂项处理逻辑
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssuePageReqVO.java
@@ -24,6 +24,12 @@ public class MesWmMiscIssuePageReqVO extends PageParam { @@ -24,6 +24,12 @@ public class MesWmMiscIssuePageReqVO extends PageParam {
24 @Schema(description = "杂项类型", example = "1") 24 @Schema(description = "杂项类型", example = "1")
25 private Integer type; 25 private Integer type;
26 26
  27 + @Schema(description = "来源单据编号", example = "DOC20260302001")
  28 + private String sourceDocCode;
  29 +
  30 + @Schema(description = "来源单据类型", example = "PURCHASE_ORDER")
  31 + private String sourceDocType;
  32 +
27 @Schema(description = "状态", example = "0") 33 @Schema(description = "状态", example = "0")
28 private Integer status; 34 private Integer status;
29 35
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/line/MesWmMiscIssueLineRespVO.java
@@ -43,6 +43,9 @@ public class MesWmMiscIssueLineRespVO { @@ -43,6 +43,9 @@ public class MesWmMiscIssueLineRespVO {
43 @Schema(description = "批次编号", example = "1") 43 @Schema(description = "批次编号", example = "1")
44 private Long batchId; 44 private Long batchId;
45 45
  46 + @Schema(description = "批次号", example = "BATCH20260301")
  47 + private String batchCode;
  48 +
46 @Schema(description = "仓库编号", example = "1") 49 @Schema(description = "仓库编号", example = "1")
47 private Long warehouseId; 50 private Long warehouseId;
48 51
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/line/MesWmMiscIssueLineSaveReqVO.java
@@ -36,6 +36,9 @@ public class MesWmMiscIssueLineSaveReqVO { @@ -36,6 +36,9 @@ public class MesWmMiscIssueLineSaveReqVO {
36 @Schema(description = "批次编号", example = "1") 36 @Schema(description = "批次编号", example = "1")
37 private Long batchId; 37 private Long batchId;
38 38
  39 + @Schema(description = "批次号", example = "BATCH20260301")
  40 + private String batchCode;
  41 +
39 @Schema(description = "仓库编号", example = "1") 42 @Schema(description = "仓库编号", example = "1")
40 private Long warehouseId; 43 private Long warehouseId;
41 44
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueLineDO.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  5 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
5 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; 6 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
6 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; 8 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
@@ -56,9 +57,17 @@ public class MesWmMiscIssueLineDO extends BaseDO { @@ -56,9 +57,17 @@ public class MesWmMiscIssueLineDO extends BaseDO {
56 private BigDecimal quantity; 57 private BigDecimal quantity;
57 /** 58 /**
58 * 批次编号 59 * 批次编号
  60 + *
  61 + * 关联 {@link MesWmBatchDO#getId()}
59 */ 62 */
60 private Long batchId; 63 private Long batchId;
61 /** 64 /**
  65 + * 批次号
  66 + *
  67 + * 挂你兰 {@link MesWmBatchDO#getCode()}
  68 + */
  69 + private String batchCode;
  70 + /**
62 * 仓库编号 71 * 仓库编号
63 * 72 *
64 * 关联 {@link MesWmWarehouseDO#getId()} 73 * 关联 {@link MesWmWarehouseDO#getId()}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueMapper.java
@@ -20,6 +20,8 @@ public interface MesWmMiscIssueMapper extends BaseMapperX<MesWmMiscIssueDO> { @@ -20,6 +20,8 @@ public interface MesWmMiscIssueMapper extends BaseMapperX<MesWmMiscIssueDO> {
20 .likeIfPresent(MesWmMiscIssueDO::getCode, reqVO.getCode()) 20 .likeIfPresent(MesWmMiscIssueDO::getCode, reqVO.getCode())
21 .likeIfPresent(MesWmMiscIssueDO::getName, reqVO.getName()) 21 .likeIfPresent(MesWmMiscIssueDO::getName, reqVO.getName())
22 .eqIfPresent(MesWmMiscIssueDO::getType, reqVO.getType()) 22 .eqIfPresent(MesWmMiscIssueDO::getType, reqVO.getType())
  23 + .likeIfPresent(MesWmMiscIssueDO::getSourceDocCode, reqVO.getSourceDocCode())
  24 + .eqIfPresent(MesWmMiscIssueDO::getSourceDocType, reqVO.getSourceDocType())
23 .eqIfPresent(MesWmMiscIssueDO::getStatus, reqVO.getStatus()) 25 .eqIfPresent(MesWmMiscIssueDO::getStatus, reqVO.getStatus())
24 .betweenIfPresent(MesWmMiscIssueDO::getIssueDate, reqVO.getIssueDate()) 26 .betweenIfPresent(MesWmMiscIssueDO::getIssueDate, reqVO.getIssueDate())
25 .orderByDesc(MesWmMiscIssueDO::getId)); 27 .orderByDesc(MesWmMiscIssueDO::getId));
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java
@@ -46,6 +46,7 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService @@ -46,6 +46,7 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService
46 @Override 46 @Override
47 @Transactional(rollbackFor = Exception.class) 47 @Transactional(rollbackFor = Exception.class)
48 public Long createMiscIssueLine(MesWmMiscIssueLineSaveReqVO createReqVO) { 48 public Long createMiscIssueLine(MesWmMiscIssueLineSaveReqVO createReqVO) {
  49 + // TODO @AI:增加 validateXXXSaveData
49 // 1.1 校验父单据存在且为可编辑状态 50 // 1.1 校验父单据存在且为可编辑状态
50 miscIssueService.validateMiscIssueEditable(createReqVO.getIssueId()); 51 miscIssueService.validateMiscIssueEditable(createReqVO.getIssueId());
51 // 1.2 校验物料存在 52 // 1.2 校验物料存在
@@ -69,6 +70,7 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService @@ -69,6 +70,7 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService
69 public void updateMiscIssueLine(MesWmMiscIssueLineSaveReqVO updateReqVO) { 70 public void updateMiscIssueLine(MesWmMiscIssueLineSaveReqVO updateReqVO) {
70 // 1.1 校验存在 71 // 1.1 校验存在
71 MesWmMiscIssueLineDO line = validateAndGetMiscIssueLine(updateReqVO.getId()); 72 MesWmMiscIssueLineDO line = validateAndGetMiscIssueLine(updateReqVO.getId());
  73 + // TODO @AI:增加 validateXXXSaveData
72 // 1.2 校验父单据存在且为可编辑状态 74 // 1.2 校验父单据存在且为可编辑状态
73 miscIssueService.validateMiscIssueEditable(line.getIssueId()); 75 miscIssueService.validateMiscIssueEditable(line.getIssueId());
74 // 1.3 校验物料存在 76 // 1.3 校验物料存在
@@ -89,7 +91,9 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService @@ -89,7 +91,9 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService
89 @Transactional(rollbackFor = Exception.class) 91 @Transactional(rollbackFor = Exception.class)
90 public void deleteMiscIssueLine(Long id) { 92 public void deleteMiscIssueLine(Long id) {
91 // 校验存在 93 // 校验存在
92 - validateAndGetMiscIssueLine(id); 94 + MesWmMiscIssueLineDO line = validateAndGetMiscIssueLine(id);
  95 + // 校验父单据存在且为可编辑状态
  96 + miscIssueService.validateMiscIssueEditable(line.getIssueId());
93 97
94 // 删除行 98 // 删除行
95 miscIssueLineMapper.deleteById(id); 99 miscIssueLineMapper.deleteById(id);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java
@@ -108,11 +108,16 @@ public class MesWmMiscIssueServiceImpl implements MesWmMiscIssueService { @@ -108,11 +108,16 @@ public class MesWmMiscIssueServiceImpl implements MesWmMiscIssueService {
108 @Override 108 @Override
109 @Transactional(rollbackFor = Exception.class) 109 @Transactional(rollbackFor = Exception.class)
110 public void finishMiscIssue(Long id) { 110 public void finishMiscIssue(Long id) {
111 - // 校验存在 111 + // 1.1 校验存在
112 MesWmMiscIssueDO issue = validateMiscIssueExists(id); 112 MesWmMiscIssueDO issue = validateMiscIssueExists(id);
113 if (ObjUtil.notEqual(MesWmMiscIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) { 113 if (ObjUtil.notEqual(MesWmMiscIssueStatusEnum.APPROVED.getStatus(), issue.getStatus())) {
114 throw exception(WM_MISC_ISSUE_STATUS_INVALID); 114 throw exception(WM_MISC_ISSUE_STATUS_INVALID);
115 } 115 }
  116 + // 1.2 校验至少有一条行
  117 + List<MesWmMiscIssueLineDO> lines = miscIssueLineService.getMiscIssueLineListByIssueId(id);
  118 + if (CollUtil.isEmpty(lines)) {
  119 + throw exception(WM_MISC_ISSUE_NO_LINE);
  120 + }
116 121
117 // 2. 遍历所有行,创建库存事务(扣减库存 + 记录流水) 122 // 2. 遍历所有行,创建库存事务(扣减库存 + 记录流水)
118 createTransactionList(issue); 123 createTransactionList(issue);
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeLineServiceImpl.java
@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO;
10 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO; 10 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeDO;
11 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO; 11 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.salesnotice.MesWmSalesNoticeLineDO;
12 import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeLineMapper; 12 import cn.iocoder.yudao.module.mes.dal.mysql.wm.salesnotice.MesWmSalesNoticeLineMapper;
  13 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
13 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; 14 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
14 import jakarta.annotation.Resource; 15 import jakarta.annotation.Resource;
15 import org.springframework.context.annotation.Lazy; 16 import org.springframework.context.annotation.Lazy;
@@ -39,10 +40,16 @@ public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineServ @@ -39,10 +40,16 @@ public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineServ
39 @Resource 40 @Resource
40 private MesWmBatchService batchService; 41 private MesWmBatchService batchService;
41 42
  43 + @Resource
  44 + private MesMdItemService itemService;
  45 +
42 @Override 46 @Override
43 public Long createSalesNoticeLine(MesWmSalesNoticeLineSaveReqVO createReqVO) { 47 public Long createSalesNoticeLine(MesWmSalesNoticeLineSaveReqVO createReqVO) {
  48 + // TODO @AI:增加 validateXXXSaveData 方法
44 // 校验父单据存在且为草稿状态 49 // 校验父单据存在且为草稿状态
45 validateNoticeStatusDraft(createReqVO.getNoticeId()); 50 validateNoticeStatusDraft(createReqVO.getNoticeId());
  51 + // 校验物料存在
  52 + itemService.validateItemExists(createReqVO.getItemId());
46 53
47 // 插入 54 // 插入
48 MesWmSalesNoticeLineDO line = BeanUtils.toBean(createReqVO, MesWmSalesNoticeLineDO.class); 55 MesWmSalesNoticeLineDO line = BeanUtils.toBean(createReqVO, MesWmSalesNoticeLineDO.class);
@@ -55,8 +62,13 @@ public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineServ @@ -55,8 +62,13 @@ public class MesWmSalesNoticeLineServiceImpl implements MesWmSalesNoticeLineServ
55 public void updateSalesNoticeLine(MesWmSalesNoticeLineSaveReqVO updateReqVO) { 62 public void updateSalesNoticeLine(MesWmSalesNoticeLineSaveReqVO updateReqVO) {
56 // 校验存在 63 // 校验存在
57 MesWmSalesNoticeLineDO line = validateSalesNoticeLineExists(updateReqVO.getId()); 64 MesWmSalesNoticeLineDO line = validateSalesNoticeLineExists(updateReqVO.getId());
  65 + // TODO @AI:增加 validateXXXSaveData 方法
58 // 校验父单据存在且为草稿状态 66 // 校验父单据存在且为草稿状态
59 validateNoticeStatusDraft(line.getNoticeId()); 67 validateNoticeStatusDraft(line.getNoticeId());
  68 + // 校验物料存在
  69 + if (updateReqVO.getItemId() != null) {
  70 + itemService.validateItemExists(updateReqVO.getItemId());
  71 + }
60 72
61 // 更新 73 // 更新
62 MesWmSalesNoticeLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmSalesNoticeLineDO.class); 74 MesWmSalesNoticeLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmSalesNoticeLineDO.class);