Commit 571d32632ebf23cf56f162fd341fa38a8ce62203
1 parent
fce023ad
✨ feat(mes): 新增批次生成逻辑及相关字段处理
实现批次的生成或获取逻辑,自动关联外协工单和物料信息。更新了相关数据对象和服务实现,确保在创建和更新外协工单行时能够正确处理批次信息。
Showing
4 changed files
with
120 additions
and
16 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/outsourcereceipt/vo/line/MesWmOutsourceReceiptLineSaveReqVO.java
| @@ -26,12 +26,6 @@ public class MesWmOutsourceReceiptLineSaveReqVO { | @@ -26,12 +26,6 @@ public class MesWmOutsourceReceiptLineSaveReqVO { | ||
| 26 | @NotNull(message = "入库数量不能为空") | 26 | @NotNull(message = "入库数量不能为空") |
| 27 | private BigDecimal quantity; | 27 | private BigDecimal quantity; |
| 28 | 28 | ||
| 29 | - @Schema(description = "批次编号", example = "1") | ||
| 30 | - private Long batchId; | ||
| 31 | - | ||
| 32 | - @Schema(description = "批次编码", example = "BATCH20260301001") | ||
| 33 | - private String batchCode; | ||
| 34 | - | ||
| 35 | @Schema(description = "生产日期") | 29 | @Schema(description = "生产日期") |
| 36 | private LocalDateTime productionDate; | 30 | private LocalDateTime productionDate; |
| 37 | 31 |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/outsourcereceipt/MesWmOutsourceReceiptLineDO.java
| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt; | @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt; | ||
| 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.qc.iqc.MesQcIqcDO; | 5 | import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; |
| 6 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; | ||
| 6 | import com.baomidou.mybatisplus.annotation.KeySequence; | 7 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 7 | import com.baomidou.mybatisplus.annotation.TableId; | 8 | import com.baomidou.mybatisplus.annotation.TableId; |
| 8 | import com.baomidou.mybatisplus.annotation.TableName; | 9 | import com.baomidou.mybatisplus.annotation.TableName; |
| @@ -48,10 +49,16 @@ public class MesWmOutsourceReceiptLineDO extends BaseDO { | @@ -48,10 +49,16 @@ public class MesWmOutsourceReceiptLineDO extends BaseDO { | ||
| 48 | /** | 49 | /** |
| 49 | * 批次编号 | 50 | * 批次编号 |
| 50 | * | 51 | * |
| 51 | - * DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联(AI 未修复原因:标注为后续处理,需人工介入) | 52 | + * 关联 {@link MesWmBatchDO#getId()} |
| 52 | */ | 53 | */ |
| 53 | private Long batchId; | 54 | private Long batchId; |
| 54 | /** | 55 | /** |
| 56 | + * 批次号 | ||
| 57 | + * | ||
| 58 | + * 关联 {@link MesWmBatchDO#getCode()} | ||
| 59 | + */ | ||
| 60 | + private String batchCode; | ||
| 61 | + /** | ||
| 55 | * 生产日期 | 62 | * 生产日期 |
| 56 | */ | 63 | */ |
| 57 | private LocalDateTime productionDate; | 64 | private LocalDateTime productionDate; |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java
| @@ -2,14 +2,22 @@ package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; | @@ -2,14 +2,22 @@ package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | +import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; | ||
| 5 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLinePageReqVO; | 6 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLinePageReqVO; |
| 6 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLineSaveReqVO; | 7 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLineSaveReqVO; |
| 8 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; | ||
| 9 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDO; | ||
| 7 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; | 10 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; |
| 11 | +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; | ||
| 8 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptLineMapper; | 12 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptLineMapper; |
| 9 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; | 13 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; |
| 10 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | 14 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| 15 | +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; | ||
| 16 | +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; | ||
| 11 | import jakarta.annotation.Resource; | 17 | import jakarta.annotation.Resource; |
| 18 | +import org.springframework.context.annotation.Lazy; | ||
| 12 | import org.springframework.stereotype.Service; | 19 | import org.springframework.stereotype.Service; |
| 20 | +import org.springframework.transaction.annotation.Transactional; | ||
| 13 | import org.springframework.validation.annotation.Validated; | 21 | import org.springframework.validation.annotation.Validated; |
| 14 | 22 | ||
| 15 | import java.util.List; | 23 | import java.util.List; |
| @@ -30,6 +38,21 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | @@ -30,6 +38,21 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | ||
| 30 | @Resource | 38 | @Resource |
| 31 | private MesMdItemService itemService; | 39 | private MesMdItemService itemService; |
| 32 | 40 | ||
| 41 | + @Resource | ||
| 42 | + @Lazy | ||
| 43 | + private MesWmOutsourceReceiptDetailService outsourceReceiptDetailService; | ||
| 44 | + | ||
| 45 | + @Resource | ||
| 46 | + @Lazy | ||
| 47 | + private MesWmOutsourceReceiptService outsourceReceiptService; | ||
| 48 | + | ||
| 49 | + @Resource | ||
| 50 | + @Lazy | ||
| 51 | + private MesProWorkOrderService workOrderService; | ||
| 52 | + | ||
| 53 | + @Resource | ||
| 54 | + private MesWmBatchService batchService; | ||
| 55 | + | ||
| 33 | @Override | 56 | @Override |
| 34 | public Long createOutsourceReceiptLine(MesWmOutsourceReceiptLineSaveReqVO createReqVO) { | 57 | public Long createOutsourceReceiptLine(MesWmOutsourceReceiptLineSaveReqVO createReqVO) { |
| 35 | // 校验物料存在 | 58 | // 校验物料存在 |
| @@ -37,8 +60,13 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | @@ -37,8 +60,13 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | ||
| 37 | 60 | ||
| 38 | // 插入 | 61 | // 插入 |
| 39 | MesWmOutsourceReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptLineDO.class); | 62 | MesWmOutsourceReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptLineDO.class); |
| 40 | - // 质量状态自动赋值 | ||
| 41 | - line.setQualityStatus(calculateQualityStatus(line.getIqcCheckFlag())); | 63 | + line.setQualityStatus(calculateQualityStatus(line.getIqcCheckFlag())); // 质量状态自动赋值 |
| 64 | + // 生成或获取批次 | ||
| 65 | + MesWmBatchDO batch = generateOrGetBatch(createReqVO); | ||
| 66 | + if (batch != null) { | ||
| 67 | + line.setBatchId(batch.getId()); | ||
| 68 | + line.setBatchCode(batch.getCode()); | ||
| 69 | + } | ||
| 42 | lineMapper.insert(line); | 70 | lineMapper.insert(line); |
| 43 | return line.getId(); | 71 | return line.getId(); |
| 44 | } | 72 | } |
| @@ -52,15 +80,24 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | @@ -52,15 +80,24 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | ||
| 52 | 80 | ||
| 53 | // 更新 | 81 | // 更新 |
| 54 | MesWmOutsourceReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptLineDO.class); | 82 | MesWmOutsourceReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptLineDO.class); |
| 55 | - // 质量状态自动赋值 | ||
| 56 | - updateObj.setQualityStatus(calculateQualityStatus(updateObj.getIqcCheckFlag())); | 83 | + updateObj.setQualityStatus(calculateQualityStatus(updateObj.getIqcCheckFlag())); // 质量状态自动赋值 |
| 84 | + // 生成或获取批次 | ||
| 85 | + MesWmBatchDO batch = generateOrGetBatch(updateReqVO); | ||
| 86 | + if (batch != null) { | ||
| 87 | + updateObj.setBatchId(batch.getId()); | ||
| 88 | + updateObj.setBatchCode(batch.getCode()); | ||
| 89 | + } | ||
| 57 | lineMapper.updateById(updateObj); | 90 | lineMapper.updateById(updateObj); |
| 58 | } | 91 | } |
| 59 | 92 | ||
| 60 | @Override | 93 | @Override |
| 94 | + @Transactional(rollbackFor = Exception.class) | ||
| 61 | public void deleteOutsourceReceiptLine(Long id) { | 95 | public void deleteOutsourceReceiptLine(Long id) { |
| 62 | // 校验存在 | 96 | // 校验存在 |
| 63 | validateOutsourceReceiptLineExists(id); | 97 | validateOutsourceReceiptLineExists(id); |
| 98 | + | ||
| 99 | + // 级联删除明细 | ||
| 100 | + outsourceReceiptDetailService.deleteOutsourceReceiptDetailByLineId(id); | ||
| 64 | // 删除 | 101 | // 删除 |
| 65 | lineMapper.deleteById(id); | 102 | lineMapper.deleteById(id); |
| 66 | } | 103 | } |
| @@ -114,4 +151,30 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | @@ -114,4 +151,30 @@ public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceRecei | ||
| 114 | return MesWmQualityStatusEnum.PASS.getStatus(); // 不需检验,默认合格 | 151 | return MesWmQualityStatusEnum.PASS.getStatus(); // 不需检验,默认合格 |
| 115 | } | 152 | } |
| 116 | 153 | ||
| 154 | + /** | ||
| 155 | + * 生成或获取批次 | ||
| 156 | + * | ||
| 157 | + * @param reqVO 入库单行请求VO | ||
| 158 | + * @return 批次记录(如果物料未启用批次管理则返回 null) | ||
| 159 | + */ | ||
| 160 | + private MesWmBatchDO generateOrGetBatch(MesWmOutsourceReceiptLineSaveReqVO reqVO) { | ||
| 161 | + MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO(); | ||
| 162 | + batchReqVO.setItemId(reqVO.getItemId()).setProduceDate(reqVO.getProductionDate()) | ||
| 163 | + .setExpireDate(reqVO.getExpireDate()).setLotNumber(reqVO.getLotNumber()); | ||
| 164 | + MesWmOutsourceReceiptDO receipt = outsourceReceiptService.getOutsourceReceipt(reqVO.getReceiptId()); | ||
| 165 | + if (receipt != null) { | ||
| 166 | + batchReqVO.setVendorId(receipt.getVendorId()) | ||
| 167 | + .setWorkOrderId(receipt.getWorkOrderId()) | ||
| 168 | + .setReceiptDate(receipt.getReceiptDate()); | ||
| 169 | + if (receipt.getWorkOrderId() != null) { | ||
| 170 | + MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(receipt.getWorkOrderId()); | ||
| 171 | + if (workOrder != null) { | ||
| 172 | + batchReqVO.setClientId(workOrder.getClientId()); | ||
| 173 | + } | ||
| 174 | + } | ||
| 175 | + } | ||
| 176 | + // 调用批次服务生成或获取批次 | ||
| 177 | + return batchService.getOrGenerateBatchCode(batchReqVO); | ||
| 178 | + } | ||
| 179 | + | ||
| 117 | } | 180 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java
| @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.ObjUtil; | 4 | import cn.hutool.core.util.ObjUtil; |
| 5 | +import cn.hutool.core.util.StrUtil; | ||
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | 7 | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| 7 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| @@ -9,10 +10,10 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | @@ -9,10 +10,10 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||
| 9 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptPageReqVO; | 10 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptPageReqVO; |
| 10 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptSaveReqVO; | 11 | import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptSaveReqVO; |
| 11 | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; | 12 | import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; |
| 13 | +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; | ||
| 12 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDO; | 14 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDO; |
| 13 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO; | 15 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO; |
| 14 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; | 16 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; |
| 15 | - | ||
| 16 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptMapper; | 17 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptMapper; |
| 17 | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; | 18 | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| 18 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceReceiptStatusEnum; | 19 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceReceiptStatusEnum; |
| @@ -20,6 +21,7 @@ import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; | @@ -20,6 +21,7 @@ import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; | ||
| 20 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; | 21 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| 21 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; | 22 | import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; |
| 22 | import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; | 23 | import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; |
| 24 | +import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; | ||
| 23 | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; | 25 | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| 24 | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; | 26 | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| 25 | import jakarta.annotation.Resource; | 27 | import jakarta.annotation.Resource; |
| @@ -55,6 +57,8 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | @@ -55,6 +57,8 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | ||
| 55 | private MesMdVendorService vendorService; | 57 | private MesMdVendorService vendorService; |
| 56 | @Resource | 58 | @Resource |
| 57 | private MesMdItemService itemService; | 59 | private MesMdItemService itemService; |
| 60 | + @Resource | ||
| 61 | + private MesProWorkOrderService workOrderService; | ||
| 58 | 62 | ||
| 59 | @Override | 63 | @Override |
| 60 | public Long createOutsourceReceipt(MesWmOutsourceReceiptSaveReqVO createReqVO) { | 64 | public Long createOutsourceReceipt(MesWmOutsourceReceiptSaveReqVO createReqVO) { |
| @@ -62,6 +66,10 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | @@ -62,6 +66,10 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | ||
| 62 | validateCodeUnique(null, createReqVO.getCode()); | 66 | validateCodeUnique(null, createReqVO.getCode()); |
| 63 | // 校验供应商存在 | 67 | // 校验供应商存在 |
| 64 | vendorService.validateVendorExists(createReqVO.getVendorId()); | 68 | vendorService.validateVendorExists(createReqVO.getVendorId()); |
| 69 | + // 校验外协工单存在 | ||
| 70 | + if (createReqVO.getWorkOrderId() != null) { | ||
| 71 | + workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()); | ||
| 72 | + } | ||
| 65 | 73 | ||
| 66 | // 插入 | 74 | // 插入 |
| 67 | MesWmOutsourceReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptDO.class); | 75 | MesWmOutsourceReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptDO.class); |
| @@ -78,6 +86,10 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | @@ -78,6 +86,10 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | ||
| 78 | validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); | 86 | validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); |
| 79 | // 校验供应商存在 | 87 | // 校验供应商存在 |
| 80 | vendorService.validateVendorExists(updateReqVO.getVendorId()); | 88 | vendorService.validateVendorExists(updateReqVO.getVendorId()); |
| 89 | + // 校验外协工单存在 | ||
| 90 | + if (updateReqVO.getWorkOrderId() != null) { | ||
| 91 | + workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId()); | ||
| 92 | + } | ||
| 81 | 93 | ||
| 82 | // 更新 | 94 | // 更新 |
| 83 | MesWmOutsourceReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptDO.class); | 95 | MesWmOutsourceReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptDO.class); |
| @@ -104,7 +116,15 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | @@ -104,7 +116,15 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | ||
| 104 | 116 | ||
| 105 | @Override | 117 | @Override |
| 106 | public PageResult<MesWmOutsourceReceiptDO> getOutsourceReceiptPage(MesWmOutsourceReceiptPageReqVO pageReqVO) { | 118 | public PageResult<MesWmOutsourceReceiptDO> getOutsourceReceiptPage(MesWmOutsourceReceiptPageReqVO pageReqVO) { |
| 107 | - return outsourceReceiptMapper.selectPage(pageReqVO); | 119 | + List<Long> workOrderIds = null; |
| 120 | + if (StrUtil.isNotBlank(pageReqVO.getWorkOrderCode())) { | ||
| 121 | + MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(pageReqVO.getWorkOrderCode()); | ||
| 122 | + if (workOrder == null) { | ||
| 123 | + return PageResult.empty(); | ||
| 124 | + } | ||
| 125 | + workOrderIds = java.util.Collections.singletonList(workOrder.getId()); | ||
| 126 | + } | ||
| 127 | + return outsourceReceiptMapper.selectPage(pageReqVO, workOrderIds); | ||
| 108 | } | 128 | } |
| 109 | 129 | ||
| 110 | @Override | 130 | @Override |
| @@ -165,16 +185,36 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | @@ -165,16 +185,36 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe | ||
| 165 | @Override | 185 | @Override |
| 166 | @Transactional(rollbackFor = Exception.class) | 186 | @Transactional(rollbackFor = Exception.class) |
| 167 | public void finishOutsourceReceipt(Long id) { | 187 | public void finishOutsourceReceipt(Long id) { |
| 168 | - // 1. 校验存在 | 188 | + // 1.1 校验存在 |
| 169 | MesWmOutsourceReceiptDO receipt = validateOutsourceReceiptExists(id); | 189 | MesWmOutsourceReceiptDO receipt = validateOutsourceReceiptExists(id); |
| 170 | if (ObjUtil.notEqual(MesWmOutsourceReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { | 190 | if (ObjUtil.notEqual(MesWmOutsourceReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { |
| 171 | throw exception(WM_OUTSOURCE_RECEIPT_STATUS_ERROR); | 191 | throw exception(WM_OUTSOURCE_RECEIPT_STATUS_ERROR); |
| 172 | } | 192 | } |
| 193 | + // 1.2 校验至少有一条行 | ||
| 194 | + List<MesWmOutsourceReceiptLineDO> lines = outsourceReceiptLineService.getOutsourceReceiptLineListByReceiptId(id); | ||
| 195 | + if (CollUtil.isEmpty(lines)) { | ||
| 196 | + throw exception(WM_OUTSOURCE_RECEIPT_NO_LINE); | ||
| 197 | + } | ||
| 173 | 198 | ||
| 174 | - // 2. 遍历所有明细,创建库存事务(增加库存 + 记录流水) | 199 | + // 3. 遍历所有明细,创建库存事务(增加库存 + 记录流水) |
| 175 | createTransactionList(receipt); | 200 | createTransactionList(receipt); |
| 176 | 201 | ||
| 177 | - // 3. 更新入库单状态 | 202 | + // 4. 更新外协工单的已生产数量(只统计合格的目标产品) |
| 203 | + if (receipt.getWorkOrderId() != null) { | ||
| 204 | + MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(receipt.getWorkOrderId()); | ||
| 205 | + if (workOrder != null) { | ||
| 206 | + BigDecimal totalQuantity = lines.stream() | ||
| 207 | + .filter(line -> ObjUtil.equal(line.getItemId(), workOrder.getProductId())) // 只统计目标产品 | ||
| 208 | + .filter(line -> ObjUtil.notEqual(line.getQualityStatus(), MesWmQualityStatusEnum.FAIL.getStatus())) // 排除不合格品 | ||
| 209 | + .map(MesWmOutsourceReceiptLineDO::getQuantity) | ||
| 210 | + .reduce(BigDecimal.ZERO, BigDecimal::add); | ||
| 211 | + if (totalQuantity.compareTo(BigDecimal.ZERO) > 0) { | ||
| 212 | + workOrderService.updateProducedQuantity(receipt.getWorkOrderId(), totalQuantity); | ||
| 213 | + } | ||
| 214 | + } | ||
| 215 | + } | ||
| 216 | + | ||
| 217 | + // 5. 更新入库单状态 | ||
| 178 | outsourceReceiptMapper.updateById(new MesWmOutsourceReceiptDO() | 218 | outsourceReceiptMapper.updateById(new MesWmOutsourceReceiptDO() |
| 179 | .setId(id).setStatus(MesWmOutsourceReceiptStatusEnum.FINISHED.getStatus())); | 219 | .setId(id).setStatus(MesWmOutsourceReceiptStatusEnum.FINISHED.getStatus())); |
| 180 | } | 220 | } |