Commit 1acee0630c863a0c836a049a2adfd201fa8f4411
Committed by
GitHub
Merge pull request #1243 from dadiyang/fix/erp-purchase-in-count-audit-status
[BUG] ERP:采购入库单反审批后订单入库进度不回退——inCount 汇总不按审核状态过滤
Showing
2 changed files
with
34 additions
and
8 deletions
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 |