|
|
@@ -1,19 +1,24 @@
|
|
|
package cn.iocoder.yudao.module.mes.service.wm.returnsales;
|
|
|
|
|
|
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
|
|
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
|
|
import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.detail.MesWmReturnSalesDetailSaveReqVO;
|
|
|
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.MesWmReturnSalesDetailMapper;
|
|
|
-import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
|
|
|
+import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;
|
|
|
+import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
|
|
|
import jakarta.annotation.Resource;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.util.List;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_DETAIL_NOT_EXISTS;
|
|
|
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_RETURN_SALES_DETAIL_QUANTITY_EXCEED;
|
|
|
|
|
|
/**
|
|
|
* MES 销售退货明细 Service 实现类
|
|
|
@@ -32,14 +37,15 @@ public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetail
|
|
|
private MesWmReturnSalesLineService returnSalesLineService;
|
|
|
|
|
|
@Resource
|
|
|
- private MesMdItemService itemService;
|
|
|
+ private MesWmWarehouseAreaService warehouseAreaService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ @Lazy
|
|
|
+ private MesWmMaterialStockService materialStockService;
|
|
|
|
|
|
@Override
|
|
|
public Long createReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO createReqVO) {
|
|
|
- // 校验父数据存在
|
|
|
- returnSalesLineService.validateReturnSalesLineExists(createReqVO.getLineId());
|
|
|
- // 校验物料存在
|
|
|
- itemService.validateItemExists(createReqVO.getItemId());
|
|
|
+ validateReturnSalesDetailSaveData(createReqVO);
|
|
|
|
|
|
// 插入
|
|
|
MesWmReturnSalesDetailDO detail = BeanUtils.toBean(createReqVO, MesWmReturnSalesDetailDO.class);
|
|
|
@@ -51,10 +57,7 @@ public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetail
|
|
|
public void updateReturnSalesDetail(MesWmReturnSalesDetailSaveReqVO updateReqVO) {
|
|
|
// 校验存在
|
|
|
validateReturnSalesDetailExists(updateReqVO.getId());
|
|
|
- // 校验父数据存在
|
|
|
- returnSalesLineService.validateReturnSalesLineExists(updateReqVO.getLineId());
|
|
|
- // 校验物料存在
|
|
|
- itemService.validateItemExists(updateReqVO.getItemId());
|
|
|
+ validateReturnSalesDetailSaveData(updateReqVO);
|
|
|
|
|
|
// 更新
|
|
|
MesWmReturnSalesDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmReturnSalesDetailDO.class);
|
|
|
@@ -95,4 +98,41 @@ public class MesWmReturnSalesDetailServiceImpl implements MesWmReturnSalesDetail
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 校验保存时的关联数据
|
|
|
+ */
|
|
|
+ private void validateReturnSalesDetailSaveData(MesWmReturnSalesDetailSaveReqVO reqVO) {
|
|
|
+ // 校验父数据存在
|
|
|
+ MesWmReturnSalesLineDO line = returnSalesLineService.validateReturnSalesLineExists(reqVO.getLineId());
|
|
|
+ // 校验仓库、库区、库位的关联关系
|
|
|
+ warehouseAreaService.validateWarehouseAreaExists(
|
|
|
+ reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId());
|
|
|
+ // 校验库位物料/批次混放规则
|
|
|
+ materialStockService.checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId());
|
|
|
+ // 校验明细总数量不超过行数量(排除自身)
|
|
|
+ validateDetailQuantityNotExceed(reqVO.getLineId(), reqVO.getQuantity(), reqVO.getId(), line);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验明细总数量不超过行数量
|
|
|
+ *
|
|
|
+ * @param lineId 行 ID
|
|
|
+ * @param newQuantity 本次新增/修改的数量
|
|
|
+ * @param excludeDetailId 排除的明细 ID(更新时排除自身,新增时传 null)
|
|
|
+ * @param line 退货单行
|
|
|
+ */
|
|
|
+ private void validateDetailQuantityNotExceed(Long lineId, BigDecimal newQuantity,
|
|
|
+ Long excludeDetailId, MesWmReturnSalesLineDO line) {
|
|
|
+ // 计算已有明细总数量(排除自身)
|
|
|
+ List<MesWmReturnSalesDetailDO> details = returnSalesDetailMapper.selectListByLineId(lineId);
|
|
|
+ BigDecimal existingTotal = CollectionUtils.getSumValue(details,
|
|
|
+ detail -> excludeDetailId != null && excludeDetailId.equals(detail.getId())
|
|
|
+ ? BigDecimal.ZERO : detail.getQuantity(),
|
|
|
+ BigDecimal::add, BigDecimal.ZERO);
|
|
|
+ // 校验:已有 + 本次 <= 行数量
|
|
|
+ if (existingTotal.add(newQuantity).compareTo(line.getQuantity()) > 0) {
|
|
|
+ throw exception(WM_RETURN_SALES_DETAIL_QUANTITY_EXCEED);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|