diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java index e3a3f00..3702623 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineService.java @@ -76,4 +76,12 @@ public interface MesWmReturnSalesLineService { */ MesWmReturnSalesLineDO validateReturnSalesLineExists(Long id); + /** + * 批量更新退货单行的质量状态 + * + * @param returnId 退货单ID + * @param qualityStatus 质量状态 + */ + void updateQualityStatusByReturnId(Long returnId, String qualityStatus); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java index 300a929..c3697bb 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java @@ -101,6 +101,16 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ return line; } + @Override + public void updateQualityStatusByReturnId(Long returnId, String qualityStatus) { + List lines = returnSalesLineMapper.selectListByReturnId(returnId); + for (MesWmReturnSalesLineDO line : lines) { + returnSalesLineMapper.updateById(new MesWmReturnSalesLineDO() + .setId(line.getId()) + .setQualityStatus(qualityStatus)); + } + } + /** * 校验物料批次管理 * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java index d84a3e9..4cdc2a6 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java @@ -8,12 +8,15 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.MesWmReturnSalesSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,6 +24,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -43,6 +47,8 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { private MesWmReturnSalesDetailService returnSalesDetailService; @Resource private MesMdClientService clientService; + @Resource + private MesMdItemService itemService; @Override @Transactional(rollbackFor = Exception.class) @@ -108,6 +114,10 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { // 提交(草稿 -> 待执行) returnSalesMapper.updateById(new MesWmReturnSalesDO() .setId(id).setStatus(MesWmReturnSalesStatusEnum.APPROVING.getStatus())); + + // DONE @AI:全部的行设置为待检验状态 + returnSalesLineService.updateQualityStatusByReturnId(id, + String.valueOf(MesWmQualityStatusEnum.PENDING.getStatus())); } @Override @@ -126,13 +136,33 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { @Override @Transactional(rollbackFor = Exception.class) public void stockReturnSales(Long id) { - // 校验存在 + // 1.1 校验存在 + 待上架状态 MesWmReturnSalesDO returnSales = validateReturnSalesExists(id); if (ObjUtil.notEqual(MesWmReturnSalesStatusEnum.APPROVED.getStatus(), returnSales.getStatus())) { throw exception(WM_RETURN_SALES_STATUS_NOT_APPROVED); } + // 1.2 检查每个行的明细数量是否完成上架 + List lines = returnSalesLineService.getReturnSalesLineListByReturnId(id); + if (CollUtil.isNotEmpty(lines)) { + // 批量查询所有明细 + List allDetails = returnSalesDetailService.getReturnSalesDetailListByReturnId(id); + Map> detailMap = CollectionUtils.convertMultiMap( + allDetails, MesWmReturnSalesDetailDO::getLineId); + // 检查每行的明细数量 + for (MesWmReturnSalesLineDO line : lines) { + List details = detailMap.getOrDefault(line.getId(), List.of()); + BigDecimal totalDetailQuantity = CollectionUtils.getSumValue(details, + MesWmReturnSalesDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); + // 对比行数量与明细总数量,不满足直接抛出 + if (line.getQuantity().compareTo(totalDetailQuantity) > 0) { + MesMdItemDO item = itemService.validateItemExists(line.getItemId()); + throw exception(WM_RETURN_SALES_DETAIL_QUANTITY_MISMATCH, + item.getCode() + " " + item.getName() + " 未完成上架"); + } + } + } - // 遍历所有明细,更新库存台账(增加库存) + // 2. 遍历所有明细,更新库存台账(增加库存) // DONE @芋艿:【后续在弄】这里需要库存更新;后面在弄(AI 未修复原因:标注为后续处理,需人工介入) List details = returnSalesDetailService.getReturnSalesDetailListByReturnId(id); for (MesWmReturnSalesDetailDO detail : details) { @@ -141,7 +171,7 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { // detail.getBatchId(), detail.getQuantity(), null, null, null); } - // 更新退货单状态 + // 3. 更新退货单状态 returnSalesMapper.updateById(new MesWmReturnSalesDO() .setId(id).setStatus(MesWmReturnSalesStatusEnum.FINISHED.getStatus())); }