Commit 60206ea661f78a1bcd32a2141ca10aa3b5342d87

Authored by YunaiV
2 parents 3d78d8df 1acee063

Merge branch 'master-jdk17' of https://github.com/YunaiV/ruoyi-vue-pro into master-jdk17

yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/dal/mysql/purchase/ErpPurchaseInMapper.java
@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in.ErpPurchaseIn @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.erp.controller.admin.purchase.vo.in.ErpPurchaseIn
8 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; 8 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO;
9 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO; 9 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO;
10 import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus; 10 import cn.iocoder.yudao.module.erp.enums.ErpAuditStatus;
  11 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
11 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 12 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
12 import org.apache.ibatis.annotations.Mapper; 13 import org.apache.ibatis.annotations.Mapper;
13 14
@@ -64,7 +65,16 @@ public interface ErpPurchaseInMapper extends BaseMapperX<ErpPurchaseInDO> { @@ -64,7 +65,16 @@ public interface ErpPurchaseInMapper extends BaseMapperX<ErpPurchaseInDO> {
64 } 65 }
65 66
66 default List<ErpPurchaseInDO> selectListByOrderId(Long orderId) { 67 default List<ErpPurchaseInDO> selectListByOrderId(Long orderId) {
67 - return selectList(ErpPurchaseInDO::getOrderId, orderId); 68 + // 入库进度只统计「已审核」的入库单:未审核/已反审核的入库单不计入订单 inCount(反审核后自然回退)
  69 + return selectList(new LambdaQueryWrapper<ErpPurchaseInDO>()
  70 + .eq(ErpPurchaseInDO::getOrderId, orderId)
  71 + .eq(ErpPurchaseInDO::getStatus, ErpAuditStatus.APPROVE.getStatus()));
  72 + }
  73 +
  74 + default List<ErpPurchaseInDO> selectListAllByOrderId(Long orderId) {
  75 + // 超订单数量校验需要统计「全部」入库单(含未审核):未审核入库单同样占用订单可入库额度
  76 + return selectList(new LambdaQueryWrapper<ErpPurchaseInDO>()
  77 + .eq(ErpPurchaseInDO::getOrderId, orderId));
68 } 78 }
69 79
70 } 80 }
71 \ No newline at end of file 81 \ No newline at end of file
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseInServiceImpl.java
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO; @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.erp.dal.dataobject.product.ErpProductDO;
11 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO; 11 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInDO;
12 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO; 12 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseInItemDO;
13 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO; 13 import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderDO;
  14 +import cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpPurchaseOrderItemDO;
14 import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInItemMapper; 15 import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInItemMapper;
15 import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInMapper; 16 import cn.iocoder.yudao.module.erp.dal.mysql.purchase.ErpPurchaseInMapper;
16 import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO; 17 import cn.iocoder.yudao.module.erp.dal.redis.no.ErpNoRedisDAO;
@@ -144,13 +145,25 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { @@ -144,13 +145,25 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
144 } 145 }
145 146
146 private void updatePurchaseOrderInCount(Long orderId) { 147 private void updatePurchaseOrderInCount(Long orderId) {
147 - // 1.1 查询采购订单对应的采购入库单列表  
148 - List<ErpPurchaseInDO> purchaseIns = purchaseInMapper.selectListByOrderId(orderId);  
149 - // 1.2 查询对应的采购订单项的入库数量  
150 - Map<Long, BigDecimal> returnCountMap = purchaseInItemMapper.selectOrderItemCountSumMapByInIds(  
151 - convertList(purchaseIns, ErpPurchaseInDO::getId));  
152 - // 2. 更新采购订单的入库数量  
153 - purchaseOrderService.updatePurchaseOrderInCount(orderId, returnCountMap); 148 + // 1.1 查询「已审核」采购入库单:入库进度(inCount 展示)只统计已审核的入库单,反审核后自然回退
  149 + List<ErpPurchaseInDO> approvedIns = purchaseInMapper.selectListByOrderId(orderId);
  150 + Map<Long, BigDecimal> inCountMap = purchaseInItemMapper.selectOrderItemCountSumMapByInIds(
  151 + convertList(approvedIns, ErpPurchaseInDO::getId));
  152 + // 1.2 查询「全部」采购入库单(含未审核):超订单数量校验需统计全部入库单,未审核入库单同样占用可入库额度
  153 + List<ErpPurchaseInDO> allIns = purchaseInMapper.selectListAllByOrderId(orderId);
  154 + Map<Long, BigDecimal> allCountMap = purchaseInItemMapper.selectOrderItemCountSumMapByInIds(
  155 + convertList(allIns, ErpPurchaseInDO::getId));
  156 + // 2. 超订单数量校验:全部入库单(含未审核)数量之和不得超过采购订单项数量
  157 + List<ErpPurchaseOrderItemDO> orderItems = purchaseOrderService.getPurchaseOrderItemListByOrderId(orderId);
  158 + for (ErpPurchaseOrderItemDO item : orderItems) {
  159 + BigDecimal allCount = allCountMap.getOrDefault(item.getId(), BigDecimal.ZERO);
  160 + if (allCount.compareTo(item.getCount()) > 0) {
  161 + throw exception(PURCHASE_ORDER_ITEM_IN_FAIL_PRODUCT_EXCEED,
  162 + productService.getProduct(item.getProductId()).getName(), item.getCount());
  163 + }
  164 + }
  165 + // 3. 更新采购订单的入库数量(inCount 展示 = 已审核)
  166 + purchaseOrderService.updatePurchaseOrderInCount(orderId, inCountMap);
154 } 167 }
155 168
156 @Override 169 @Override
@@ -185,6 +198,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService { @@ -185,6 +198,9 @@ public class ErpPurchaseInServiceImpl implements ErpPurchaseInService {
185 purchaseInItem.getProductId(), purchaseInItem.getWarehouseId(), count, 198 purchaseInItem.getProductId(), purchaseInItem.getWarehouseId(), count,
186 bizType, purchaseInItem.getInId(), purchaseInItem.getId(), purchaseIn.getNo())); 199 bizType, purchaseInItem.getInId(), purchaseInItem.getId(), purchaseIn.getNo()));
187 }); 200 });
  201 +
  202 + // 4. 状态变更后重算采购订单入库进度(反审核的入库单不再计入,inCount 自然回退)
  203 + updatePurchaseOrderInCount(purchaseIn.getOrderId());
188 } 204 }
189 205
190 @Override 206 @Override