From aa3099c76c6833486159f3b7b2f29104a75d115a Mon Sep 17 00:00:00 2001 From: liuxiaoxu <1793812695@qq.com> Date: Fri, 6 Dec 2024 17:37:42 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20=E4=BF=AE=E6=94=B9=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=89=8D=E7=AB=AF=E9=A1=B5=E9=9D=A2=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=20=EF=BC=9A=E5=8A=A8=E6=80=81=E7=9B=91=E5=90=AC=E5=A6=82?= =?UTF-8?q?=E6=9E=9C=E6=9B=B4=E6=94=B9=E4=BA=86=E5=85=B1=E4=BA=AB=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=8D=A0=E7=94=A8=E6=95=B0=E6=8C=89=E7=85=A7=E4=B8=8B?= =?UTF-8?q?=E9=9D=A2=E8=A7=84=E5=88=99=E6=9B=B4=E6=96=B0=E8=BF=99=E4=B8=A4?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E6=8D=AE=20=E8=AE=BE=E7=BD=AE=E6=9C=AC?= =?UTF-8?q?=E6=AC=A1=E9=87=87=E8=B4=AD=E6=95=B0=3D(=E5=BE=85=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E6=95=B0-=E5=85=B1=E4=BA=AB=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E5=8D=A0=E7=94=A8=E6=95=B0)=EF=BC=8C=E4=BD=86=E9=9C=80?= =?UTF-8?q?=E6=BB=A1=E8=B6=B30=20<=3D=20=E6=9C=AC=E6=AC=A1=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E6=95=B0=20<=3D=20=E5=BE=85=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E6=95=B0=20=E5=BE=85=E9=87=87=E8=B4=AD=E6=95=B0=3D(=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E9=87=87=E8=B4=AD=E6=95=B0-=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E6=95=B0-=E5=85=B1=E4=BA=AB=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E5=8D=A0=E7=94=A8=E6=95=B0-=E4=BD=9C=E5=BA=9F?= =?UTF-8?q?=E6=95=B0)=20=E4=BF=AE=E6=94=B9=E6=A0=B9=E6=8D=AE=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E6=9C=AC=E6=AC=A1=E9=87=87=E8=B4=AD=E6=95=B0=E7=9A=84?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=9B=B4=E6=96=B0,=E7=9B=B8=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E4=B8=8D=E5=90=AB=E7=A8=8E=E6=80=BB=E4=BB=B7=E5=92=8C?= =?UTF-8?q?=E5=90=AB=E7=A8=8E=E6=80=BB=E4=BB=B7=E4=B9=9F=E8=A6=81=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=9B=B4=E6=96=B0=20=E4=BF=AE=E6=94=B9=E8=AF=B7?= =?UTF-8?q?=E8=B4=AD=E5=8D=95=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD=E8=AE=A1?= =?UTF-8?q?=E5=88=92,=E4=B8=BB=E8=A1=A8=E5=92=8C=E5=AD=90=E8=A1=A8?= =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=AF=B9=E5=BE=85=E9=87=87=E8=B4=AD=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E8=B5=8B=E5=80=BC=20=E9=87=8D=E5=86=99=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E8=AE=A1=E5=88=92=E7=AC=AC=E4=BA=8C=E6=AD=A5=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=87=87=E8=B4=AD=E8=AE=A2=E5=8D=95=E7=9A=84=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E6=96=B9=E6=B3=95,=E5=8E=BB=E6=8E=89=E5=AF=B9?= =?UTF-8?q?=E7=89=A9=E6=96=99=E6=95=B0=E6=8D=AE=E7=9A=84=E5=90=88=E5=B9=B6?= =?UTF-8?q?,=E6=96=B0=E5=A2=9E=E9=80=9A=E8=BF=87=E7=89=A9=E6=96=99?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E4=BB=93=E5=BA=93=E5=BA=93=E5=AD=98=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=AE=B0=E5=BD=95,=E6=8C=89=E7=85=A7=E4=BB=A5?= =?UTF-8?q?=E4=B8=8B=E8=A7=84=E5=88=99=E8=AE=A1=E7=AE=97:=20=E5=AD=97?= =?UTF-8?q?=E6=AE=B5(=E5=BE=85=E9=87=87=E8=B4=AD=E6=95=B0):=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=89=A9=E4=BD=99=E6=9C=AA=E9=87=87=E8=B4=AD=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E9=87=8F=EF=BC=8C=E5=BE=85=E9=87=87=E8=B4=AD=E6=95=B0?= =?UTF-8?q?=3D(=E8=AE=A1=E5=88=92=E9=87=87=E8=B4=AD=E6=95=B0-=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E9=87=87=E8=B4=AD=E6=95=B0-=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=8D=A0=E7=94=A8=E6=95=B0-=E4=BD=9C?= =?UTF-8?q?=E5=BA=9F=E6=95=B0)=20=20=E5=AD=97=E6=AE=B5(=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E5=BA=93=E5=AD=98=E6=95=B0):=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E5=8F=AF=E8=A2=AB=E5=8D=A0=E7=94=A8=E7=9A=84=E5=BA=93?= =?UTF-8?q?=E5=AD=98=20=20=E5=AD=97=E6=AE=B5(=E6=9C=AC=E6=AC=A1=E5=8D=A0?= =?UTF-8?q?=E7=94=A8=E5=85=B1=E4=BA=AB=E5=BA=93=E5=AD=98=E6=95=B0):?= =?UTF-8?q?=E5=BF=85=E5=A1=AB;=E9=BB=98=E8=AE=A4=E4=B8=BA0=EF=BC=8C?= =?UTF-8?q?=E8=8B=A5=E5=85=B1=E4=BA=AB=E5=8F=AF=E7=94=A8=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=95=B0>0=EF=BC=8C=E5=88=99=E9=BB=98=E8=AE=A4=3D=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E5=8F=AF=E7=94=A8=E5=BA=93=E5=AD=98=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E4=BF=AE=E6=94=B9=EF=BC=8C=E9=9C=800<=E6=9C=AC?= =?UTF-8?q?=E6=AC=A1=E5=8D=A0=E7=94=A8=E5=85=B1=E4=BA=AB=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E6=95=B0=E2=89=A4=E5=85=B1=E4=BA=AB=E5=8F=AF=E7=94=A8=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E6=95=B0;=E8=8B=A5=E5=85=B1=E4=BA=AB=E5=8F=AF?= =?UTF-8?q?=E7=94=A8=E5=BA=93=E5=AD=98=E6=95=B0=3D0=EF=BC=8C=E5=88=99?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E8=BE=93=E5=85=A5=E4=BF=AE=E6=94=B9=20?= =?UTF-8?q?=E5=AD=97=E6=AE=B5(=E6=9C=AC=E6=AC=A1=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E6=95=B0):=E5=BF=85=E5=A1=AB;=E9=BB=98=E8=AE=A4=E4=B8=BA=3D(?= =?UTF-8?q?=E5=BE=85=E9=87=87=E8=B4=AD=E6=95=B0-=E6=9C=AC=E6=AC=A1?= =?UTF-8?q?=E5=8D=A0=E7=94=A8=E5=85=B1=E4=BA=AB=E5=BA=93=E5=AD=98=E6=95=B0?= =?UTF-8?q?);=E5=8F=AF=E4=BF=AE=E6=94=B9=E9=9C=800<=E6=9C=AC=E6=AC=A1?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E6=95=B0<=E5=BE=85=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E6=95=B0;=20=E9=87=8D=E5=86=99=E9=87=87=E8=B4=AD=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92=E4=B8=BB?= =?UTF-8?q?=E8=A1=A8=E5=92=8C=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92=E5=AD=90?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E6=96=B9=E6=B3=95:=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E4=B8=8B=E9=9D=A2=E7=9A=84=E6=95=88=E6=9E=9C:=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD=E5=8D=95=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=9B=A0=E4=B8=BA=E4=BC=A0=E8=BF=87=E6=9D=A5=E7=9A=84?= =?UTF-8?q?=E7=89=A9=E6=96=99=E5=8F=AF=E8=83=BD=E6=98=AF=E5=A4=9A=E4=B8=AA?= =?UTF-8?q?=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92=E5=8D=95=E7=89=A9=E6=96=99?= =?UTF-8?q?=E8=A1=A8=E5=90=88=E5=B9=B6=E7=9A=84=E6=95=B0=E6=8D=AE=EF=BC=8C?= =?UTF-8?q?=E3=80=90=E6=9C=AC=E6=AC=A1=E5=8D=A0=E7=94=A8=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E6=95=B0=E3=80=91=E5=92=8C=E3=80=90=E6=9C=AC?= =?UTF-8?q?=E6=AC=A1=E9=87=87=E8=B4=AD=E6=95=B0=E3=80=91=E6=8C=89=E7=85=A7?= =?UTF-8?q?=E5=B7=B2=E9=80=89=E3=80=90=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E5=8D=95=E3=80=91=E5=88=9B=E5=BB=BA=E6=97=B6=E9=97=B4=E6=AD=A3?= =?UTF-8?q?=E5=BA=8F(=E6=97=B6=E9=97=B4=E8=B6=8A=E6=97=A9=EF=BC=8C?= =?UTF-8?q?=E5=88=99=E4=BC=98=E5=85=88)=E8=BF=9B=E8=A1=8C=E6=A0=B8?= =?UTF-8?q?=E9=94=80=EF=BC=8C=E5=B9=B6=E4=B8=94=E6=8C=89=E7=85=A7=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=85=88=E5=90=8E=E6=9B=B4=E6=96=B0=E5=85=B6=E6=9C=AC?= =?UTF-8?q?=E6=AC=A1=E5=8D=A0=E7=94=A8=E5=BA=93=E5=AD=98=E6=95=B0=E5=92=8C?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E9=87=87=E8=B4=AD=E6=95=B0=EF=BC=8C=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E9=87=87=E8=B4=AD=E6=95=B0=E5=B0=B1=E4=B8=BA=E6=9C=AC?= =?UTF-8?q?=E6=AC=A1=E8=AE=A1=E5=88=92=E9=87=87=E8=B4=AD=E6=95=B0=E3=80=82?= =?UTF-8?q?=20=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=8C=89=E7=85=A7=E4=BB=A5=E4=B8=8B=E8=A7=84=E5=88=99=E6=9B=B4?= =?UTF-8?q?=E6=96=B0:=20=E9=83=A8=E5=88=86=E7=94=B3=E8=AF=B7:0<(=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E9=87=87=E8=B4=AD=E6=95=B0+=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=8D=A0=E7=94=A8=E6=95=B0+=E4=BD=9C?= =?UTF-8?q?=E5=BA=9F=E6=95=B0)<=E8=AE=A1=E5=88=92=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E6=95=B0;=E5=8F=AF=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=20=E5=85=A8=E9=83=A8=E7=94=B3=E8=AF=B7:0<(?= =?UTF-8?q?=E5=AE=9E=E9=99=85=E9=87=87=E8=B4=AD=E6=95=B0+=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E5=BA=93=E5=AD=98=E5=8D=A0=E7=94=A8=E6=95=B0+?= =?UTF-8?q?=E4=BD=9C=E5=BA=9F=E6=95=B0)=3D=E8=AE=A1=E5=88=92=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E6=95=B0=EF=BC=8C=E4=BD=9C=E5=BA=9F=E6=95=B0 oldChildren = oldDataGroupedByMaterialNo.get(materialNo); + //共享库存占用数 + Integer sharedInventoryOccupancyNum = purchasePlanSelectMaterialVo.getSharedInventoryOccupancyNum(); + //库存查询 + WarehouseInventoryInquiry warehouseInventoryInquiry = inventoryInquiryMapper.selectWarehouseInventoryInquiryByMaterialNo(materialNo); + if ( sharedInventoryOccupancyNum != null && sharedInventoryOccupancyNum > 0){ + Integer sharedAvailableStockNum = Optional.ofNullable(warehouseInventoryInquiry.getSharedAvailableStockNum()).orElse(0); + + Integer availableStockNum = Optional.ofNullable(warehouseInventoryInquiry.getAvailableStockNum()).orElse(0); + Integer lockStockNum = Optional.ofNullable(warehouseInventoryInquiry.getLockStockNum()).orElse(0); + warehouseInventoryInquiry.setAvailableStockNum(availableStockNum - sharedInventoryOccupancyNum); + warehouseInventoryInquiry.setSharedAvailableStockNum(sharedAvailableStockNum - sharedInventoryOccupancyNum); + warehouseInventoryInquiry.setLockStockNum(lockStockNum + sharedInventoryOccupancyNum); + warehouseInventoryInquiry.setUpdateTime(new Date()); + warehouseInventoryInquiry.setUpdateBy(ShiroUtils.getLoginName()); + int updateInventoryInquiry = inventoryInquiryMapper.updateWarehouseInventoryInquiry(warehouseInventoryInquiry); + if (updateInventoryInquiry <= 0){ + throw new BusinessException("更新库存查询记录失败"); + } + + } + + //本次采购数 Integer thisPurchaseNum = purchasePlanSelectMaterialVo.getThisPurchaseNum(); - int oldPurchaseNumSum = oldChildren.stream().mapToInt(PurchasePlanChild::getPurchaseNum).sum(); + //共享可用库存 + Integer sharedAvailableInventoryNum = purchasePlanSelectMaterialVo.getSharedAvailableInventoryNum(); - if (oldPurchaseNumSum < thisPurchaseNum){ + //待采购数 + Integer purchaseNum = purchasePlanSelectMaterialVo.getPurchaseNum(); + + if (purchaseNum < thisPurchaseNum){ throw new BusinessException("本次采购数量不能大于待采购数量"); } + // 获取旧数据中相同物料编号的数据 + List oldChildren = oldDataGroupedByMaterialNo.get(materialNo); + + + // 优先使用本次占用共享库存 + Integer remainingSharedInventoryOccupancyNum = Math.min(sharedInventoryOccupancyNum, thisPurchaseNum); if (!CollectionUtils.isEmpty(oldChildren)) { // 按照订单创建时间远离当前时间排序(即由远及近) @@ -472,38 +506,51 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService for (PurchasePlanChild oldChild : oldChildren) { - Integer purchaseNum = oldChild.getPurchaseNum(); - - if (thisPurchaseNum <= 0) break; // 如果本次采购数已分配完毕则退出循环 - - if (purchaseNum >= thisPurchaseNum) { - // 当前记录的待采购数足够覆盖剩余的本次采购数 - oldChild.setActualPurchaseNum(thisPurchaseNum); - oldChild.setPurchaseNum(purchaseNum - thisPurchaseNum); - thisPurchaseNum = 0; // 本次采购数分配完毕 - } else { - // 当前记录的待采购数不足以覆盖剩余的本次采购数 - oldChild.setActualPurchaseNum(purchaseNum); - thisPurchaseNum -= purchaseNum; - oldChild.setPurchaseNum(0); // 该记录的待采购数清零 + // Integer oldPurchaseNum = Optional.ofNullable(oldChild.getPurchaseNum()).orElse(0);//待采购数 + Integer planPurchaseNum = Optional.ofNullable(oldChild.getPlanPurchaseNum()).orElse(0);//计划采购数 + Integer oldActualPurchaseNum = Optional.ofNullable(oldChild.getActualPurchaseNum()).orElse(0);//实际采购数 + Integer cancelNum = Optional.ofNullable(oldChild.getCancelNum()).orElse(0);//作废数 + Integer oldSharedInventoryOccupancyNum = Optional.ofNullable(oldChild.getSharedInventoryOccupancyNum()).orElse(0);//共享库存占用数 + + if (remainingSharedInventoryOccupancyNum <= 0){ + if (purchaseNum <= 0){ + // 更新状态 + updateChildPurchasePlanStatus(oldChild,sharedInventoryOccupancyNum,thisPurchaseNum,purchaseNum); + // 更新其他字段 + oldChild.setUpdateTime(new Date()); + oldChild.setUpdateBy(ShiroUtils.getLoginName()); + //oldChild.setThisPurchaseNum(purchasePlanSelectMaterialVo.getThisPurchaseNum()); + oldChild.setMaterialNoRmbSum(purchasePlanSelectMaterialVo.getMaterialNoRmbSum()); + oldChild.setMaterialRmbSum(purchasePlanSelectMaterialVo.getMaterialRmbSum()); + oldChild.setLatestQuoteRmb(purchasePlanSelectMaterialVo.getLatestQuoteRmb()); + oldChild.setThisPurchaseNum(thisPurchaseNum); + int result = purchasePlanChildMapper.updatePurchasePlanChild(oldChild); + if (result <= 0){ + throw new BusinessException("更新采购计划子表数据失败"); + } + } + break; // 如果本次采购数和共享库存都已分配完毕则退出循环 } - /* - * 部分申请:0<(实际采购数+共享库存占用数+作废数)<计划采购数;可添加采购订单 - * 全部申请:0<(实际采购数+共享库存占用数+作废数)=计划采购数,作废数<计划采购数;不可添加采购订单 - * */ + // 更新状态 - Integer planPurchaseNum = oldChild.getPlanPurchaseNum(); - if (oldChild.getActualPurchaseNum().equals(planPurchaseNum)) { - oldChild.setPurchasePlanStatus("2"); // 全部申请 - } else { - oldChild.setPurchasePlanStatus("1"); // 部分申请 + updateChildPurchasePlanStatus(oldChild,sharedInventoryOccupancyNum,thisPurchaseNum,purchaseNum); + + if (oldSharedInventoryOccupancyNum == 0){ + oldChild.setSharedInventoryOccupancyNum(sharedInventoryOccupancyNum); + }else { + oldChild.setSharedInventoryOccupancyNum(oldSharedInventoryOccupancyNum + sharedInventoryOccupancyNum); + } + if (oldActualPurchaseNum == 0){ + oldChild.setActualPurchaseNum(thisPurchaseNum); + }else { + oldChild.setActualPurchaseNum(oldActualPurchaseNum + thisPurchaseNum); } // 更新其他字段 oldChild.setUpdateTime(new Date()); oldChild.setUpdateBy(ShiroUtils.getLoginName()); - oldChild.setThisPurchaseNum(purchasePlanSelectMaterialVo.getThisPurchaseNum()); + //oldChild.setThisPurchaseNum(purchasePlanSelectMaterialVo.getThisPurchaseNum()); oldChild.setMaterialNoRmbSum(purchasePlanSelectMaterialVo.getMaterialNoRmbSum()); oldChild.setMaterialRmbSum(purchasePlanSelectMaterialVo.getMaterialRmbSum()); oldChild.setLatestQuoteRmb(purchasePlanSelectMaterialVo.getLatestQuoteRmb()); @@ -514,12 +561,58 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService if (result <= 0){ throw new BusinessException("更新采购计划子表数据失败"); } - } + + } } } return purchasePlanChildren; } + // 定义一个方法来更新采购计划状态 + private void updateChildPurchasePlanStatus(PurchasePlanChild oldChild,Integer sharedInventoryOccupancyNum,Integer thisPurchaseNum,Integer purchaseNum) { + + /* + * 部分申请:0<(实际采购数+共享库存占用数+作废数)<计划采购数;可添加采购订单 + * 全部申请:0<(实际采购数+共享库存占用数+作废数)=计划采购数,作废数<计划采购数;不可添加采购订单 + * */ + + Integer oldSharedInventoryOccupancyNum = Optional.ofNullable(oldChild.getSharedInventoryOccupancyNum()).orElse(0);//共享库存占用数 + Integer planPurchaseNum = Optional.ofNullable(oldChild.getPlanPurchaseNum()).orElse(0);//计划采购数 + Integer actualPurchaseNum = Optional.ofNullable(oldChild.getActualPurchaseNum()).orElse(0);//实际采购数 + Integer cancelNum = Optional.ofNullable(oldChild.getCancelNum()).orElse(0);//作废数 + + if (oldSharedInventoryOccupancyNum == 0){ + oldSharedInventoryOccupancyNum = sharedInventoryOccupancyNum; + }else { + oldSharedInventoryOccupancyNum += sharedInventoryOccupancyNum; + } + + + if (purchaseNum <= 0){ + actualPurchaseNum = thisPurchaseNum; + }else { + actualPurchaseNum += thisPurchaseNum; + } + + + Integer totalApplied = actualPurchaseNum + oldSharedInventoryOccupancyNum + cancelNum; + + + + if (totalApplied == 0 && cancelNum < planPurchaseNum) { + oldChild.setPurchasePlanStatus("0"); // 待申请 + } else if (0 < totalApplied && totalApplied < planPurchaseNum) { + oldChild.setPurchasePlanStatus("1"); // 部分申请 + } else if (totalApplied.equals(planPurchaseNum) && cancelNum < planPurchaseNum) { + oldChild.setPurchasePlanStatus("2"); // 全部申请 + } else { + throw new BusinessException("采购计划状态不符合预期"); + } + } + + + + //处理采购计划主表 private void updatePurchasePlanByAddPurchaseOrder(AddPurchaseOrder addPurchaseOrder,List purchasePlanChildList) { @@ -530,7 +623,7 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService List purchasePlanSelectMaterialVoList = addPurchaseOrder.getPurchasePlanSelectMaterialVoList(); - + PurchasePlanTwo purchasePlanTwo = addPurchaseOrder.getPurchasePlanTwo(); PurchasePlanOne purchasePlanOne = addPurchaseOrder.getPurchasePlanOne(); String purchasePlanCodes = purchasePlanOne.getPurchasePlanCodes(); @@ -563,15 +656,28 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService purchasePlan.setActualPurchaseSum(0); } - // 累加 actualPurchaseSum + Integer planPurchaseSum = purchasePlan.getPlanPurchaseSum();//计划采购数 + + // 累加 实际采购数 actualPurchaseSum int actualPurchaseSum = children.stream() .mapToInt(PurchasePlanChild::getActualPurchaseNum) .sum(); purchasePlan.setActualPurchaseSum(purchasePlan.getActualPurchaseSum() + actualPurchaseSum); - // 更新 purchaseSum - int currentPurchaseSum = purchasePlan.getPurchaseSum(); - purchasePlan.setPurchaseSum(currentPurchaseSum - actualPurchaseSum); + + //更新共享库存占用总数 sharedInventoryOccupancySum + Integer sharedInventoryOccupancySum = purchasePlanTwo.getSharedInventoryOccupancySum(); + purchasePlan.setSharedInventoryOccupancySum(sharedInventoryOccupancySum); + + //待采购数=(计划采购数-实际采购数-共享库存占用数-作废数) + // 更新 待采购数 purchaseSum + Integer currentPurchaseSum = purchasePlan.getPurchaseSum(); + currentPurchaseSum = planPurchaseSum - purchasePlan.getActualPurchaseSum() - purchasePlan.getSharedInventoryOccupancySum() - purchasePlan.getCancelSum(); + purchasePlan.setPurchaseSum(currentPurchaseSum); + + + //计算用于改变申请状态的数据 + Integer totalNum = purchasePlan.getActualPurchaseSum() + purchasePlan.getSharedInventoryOccupancySum() + purchasePlan.getCancelSum(); // 计算合计值 double totalNoRmbSum = children.stream().mapToDouble(vo -> vo.getMaterialNoRmbSum().doubleValue()).sum(); @@ -590,9 +696,9 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService purchasePlan.setNoRmbSum(totalBigDecimalNoRmbSum.add(currentNoRmbSum)); // 更新采购计划状态 - if (purchasePlan.getActualPurchaseSum() < purchasePlan.getPlanPurchaseSum()) { + if (totalNum < purchasePlan.getPlanPurchaseSum()) { purchasePlan.setPurchasePlanStatus("1"); - } else if (purchasePlan.getActualPurchaseSum().equals(purchasePlan.getPlanPurchaseSum())) { + } else if (totalNum.equals(purchasePlan.getPlanPurchaseSum())) { purchasePlan.setPurchasePlanStatus("2"); } @@ -713,7 +819,6 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService // 用于存储每个采购计划的总变动量 Map planSumChanges = new HashMap<>(); - // 将采购订单子表中的实际采购数量分配给采购计划子表 // 将采购订单子表中的实际采购数量分配给采购计划子表 for (PurchaseOrderChild orderChild : purchaseOrderChildList) { String materialNo = orderChild.getMaterialNo(); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchasePlanServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchasePlanServiceImpl.java index 413ddcb5..9446e4d2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchasePlanServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchasePlanServiceImpl.java @@ -26,6 +26,8 @@ import com.ruoyi.system.mapper.SysMakeOrderMapper; import com.ruoyi.system.mapper.SysMakeorderBomMapper; import com.ruoyi.system.mapper.SysSalesOrderChildMapper; import com.ruoyi.system.mapper.SysSupplierMapper; +import com.ruoyi.warehouse.domain.WarehouseInventoryInquiry; +import com.ruoyi.warehouse.mapper.WarehouseInventoryInquiryMapper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -79,7 +81,8 @@ public class PurchasePlanServiceImpl implements IPurchasePlanService @Autowired private SysMakeorderBomMapper sysMakeorderBomMapper; - + @Autowired + private WarehouseInventoryInquiryMapper warehouseInventoryInquiryMapper; /** @@ -247,47 +250,90 @@ public class PurchasePlanServiceImpl implements IPurchasePlanService item.setMaterialRmbSum(quoteHistory.getMaterialRmb()); } return item; - }, - (existingItem, newItem) -> { - existingItem.setPurchaseNum( - (existingItem.getPurchaseNum() != null ? existingItem.getPurchaseNum() : 0) + - (newItem.getPurchaseNum() != null ? newItem.getPurchaseNum() : 0) - ); - existingItem.setSharedAvailableInventoryNum( - (existingItem.getSharedAvailableInventoryNum() != null ? existingItem.getSharedAvailableInventoryNum() : 0) + - (newItem.getSharedAvailableInventoryNum() != null ? newItem.getSharedAvailableInventoryNum() : 0) - ); - existingItem.setLatestQuoteRmb( - (existingItem.getLatestQuoteRmb() != null ? existingItem.getLatestQuoteRmb() : BigDecimal.ZERO) - .add(newItem.getLatestQuoteRmb() != null ? newItem.getLatestQuoteRmb() : BigDecimal.ZERO) - ); - existingItem.setMaterialNoRmbSum( - (existingItem.getMaterialNoRmbSum() != null ? existingItem.getMaterialNoRmbSum() : BigDecimal.ZERO) - .add(newItem.getMaterialNoRmbSum() != null ? newItem.getMaterialNoRmbSum() : BigDecimal.ZERO) - ); - existingItem.setMaterialRmbSum( - (existingItem.getMaterialRmbSum() != null ? existingItem.getMaterialRmbSum() : BigDecimal.ZERO) - .add(newItem.getMaterialRmbSum() != null ? newItem.getMaterialRmbSum() : BigDecimal.ZERO) - ); - return existingItem; } +// (existingItem, newItem) -> { +// existingItem.setPurchaseNum( +// (existingItem.getPurchaseNum() != null ? existingItem.getPurchaseNum() : 0) + +// (newItem.getPurchaseNum() != null ? newItem.getPurchaseNum() : 0) +// ); +// existingItem.setSharedAvailableInventoryNum( +// (existingItem.getSharedAvailableInventoryNum() != null ? existingItem.getSharedAvailableInventoryNum() : 0) + +// (newItem.getSharedAvailableInventoryNum() != null ? newItem.getSharedAvailableInventoryNum() : 0) +// ); +// existingItem.setLatestQuoteRmb( +// (existingItem.getLatestQuoteRmb() != null ? existingItem.getLatestQuoteRmb() : BigDecimal.ZERO) +// .add(newItem.getLatestQuoteRmb() != null ? newItem.getLatestQuoteRmb() : BigDecimal.ZERO) +// ); +// existingItem.setMaterialNoRmbSum( +// (existingItem.getMaterialNoRmbSum() != null ? existingItem.getMaterialNoRmbSum() : BigDecimal.ZERO) +// .add(newItem.getMaterialNoRmbSum() != null ? newItem.getMaterialNoRmbSum() : BigDecimal.ZERO) +// ); +// existingItem.setMaterialRmbSum( +// (existingItem.getMaterialRmbSum() != null ? existingItem.getMaterialRmbSum() : BigDecimal.ZERO) +// .add(newItem.getMaterialRmbSum() != null ? newItem.getMaterialRmbSum() : BigDecimal.ZERO) +// ); +// return existingItem; +// } )); // 将合并后的数据转换为列表 List mergedList = new ArrayList<>(mergedMap.values()); +// mergedList.forEach(item->{ +// WarehouseInventoryInquiry warehouseInventoryInquiry = warehouseInventoryInquiryMapper.selectWarehouseInventoryInquiryByMaterialNo(item.getMaterialNo()); +// //字段(共享库存占用数):必填;默认为0,若共享可用库存数>0,则默认=共享可用库存数,可修改;需0<=共享库存占用数<=共享可用库存数 +// //字段(本次采购数):必填;默认为=(待采购数-共享库存占用数);可修改需0<本次采购数<待采购数; +// //字段(待采购数):统计剩余未采购的数量,待采购数=(计划采购数-实际采购数-共享库存占用数-作废数) +// item.setSharedAvailableInventoryNum(warehouseInventoryInquiry.getSharedAvailableStockNum());//共享可用库存数 +// Integer planPurchaseNum = item.getPlanPurchaseNum();//计划采购数 +// Integer actualPurchaseNum = item.getActualPurchaseNum();//实际采购数 +// Integer sharedInventoryOccupancyNum = item.getSharedInventoryOccupancyNum();//共享库存占用数 +// Integer cancelNum = item.getCancelNum();//作废数 +// Integer thisPurchaseNum = item.getThisPurchaseNum();//本次采购数 +// if (item.getSharedAvailableInventoryNum() != null && item.getSharedAvailableInventoryNum() > 0){ +// item.setSharedInventoryOccupancyNum(item.getSharedAvailableInventoryNum()); +// }else { +// item.setSharedInventoryOccupancyNum(0); +// } +// }); + + mergedList.forEach(item -> { + // 获取库存查询信息 + WarehouseInventoryInquiry warehouseInventoryInquiry = warehouseInventoryInquiryMapper.selectWarehouseInventoryInquiryByMaterialNo(item.getMaterialNo()); + + // 设置共享可用库存数,默认为0 + Integer sharedAvailableStockNum = Optional.ofNullable(warehouseInventoryInquiry.getSharedAvailableStockNum()).orElse(0); + item.setSharedAvailableInventoryNum(sharedAvailableStockNum); + + // 计划采购数、实际采购数、作废数 + Integer planPurchaseNum = Optional.ofNullable(item.getPlanPurchaseNum()).orElse(0); + Integer actualPurchaseNum = Optional.ofNullable(item.getActualPurchaseNum()).orElse(0); + Integer cancelNum = Optional.ofNullable(item.getCancelNum()).orElse(0); + + // 设置共享库存占用数,默认为0或共享可用库存数(如果后者大于0) + Integer sharedInventoryOccupancyNum = 0; + if (sharedAvailableStockNum > 0) { + sharedInventoryOccupancyNum = sharedAvailableStockNum; + } else { + sharedInventoryOccupancyNum = 0; + } + item.setSharedInventoryOccupancyNum(sharedInventoryOccupancyNum); + + // 计算待采购数 + Integer purchaseNum = Math.max(0, planPurchaseNum - actualPurchaseNum - sharedInventoryOccupancyNum - cancelNum); + item.setPurchaseNum(purchaseNum); + // 设置本次采购数,默认为=(待采购数-共享库存占用数),但需满足0 <= 本次采购数 <= 待采购数 + Integer thisPurchaseNum = Math.max(0, purchaseNum - sharedInventoryOccupancyNum); + thisPurchaseNum = Math.min(thisPurchaseNum, purchaseNum); // 确保本次采购数不超过待采购数 - mergedList.forEach(item->{ -//字段(本次占用共享库存数):必填;默认为0,若共享可用库存数>0,则默认=共享可用库存数,可修改;需0<=本次占用共享库存数<=共享可用库存数 - if (item.getSharedAvailableInventoryNum() != null && item.getSharedAvailableInventoryNum() > 0){ - item.setSharedInventoryOccupancyNum(item.getSharedAvailableInventoryNum()); - }else { - item.setSharedInventoryOccupancyNum(0); - } +// item.setMaterialRmbSum(item.getMaterialRmbSum().multiply(BigDecimal.valueOf(thisPurchaseNum))); +// item.setMaterialNoRmbSum(item.getMaterialNoRmbSum().multiply(BigDecimal.valueOf(thisPurchaseNum))); + item.setThisPurchaseNum(thisPurchaseNum); }); + //过滤掉待采购数量 <= 0的数据 - mergedList = mergedList.stream().filter(item->item.getPurchaseNum() > 0).collect(Collectors.toList()); + // mergedList = mergedList.stream().filter(item->item.getPurchaseNum() > 0).collect(Collectors.toList()); //过滤掉采购计划状态为全部申请和全部作废的数据 2为全部申请、3为全部作废 mergedList = mergedList.stream().filter(item->!item.getPurchasePlanStatus().equals("2") || !item.getPurchasePlanStatus().equals("3")).collect(Collectors.toList()); @@ -438,10 +484,10 @@ public class PurchasePlanServiceImpl implements IPurchasePlanService orderNum = oldMakeorderBom.getOrderNum(); purchasePlanChild.setPlanPurchaseNum(orderNum * filterUniqueBom.getUseNum()); - purchasePlanChild.setPurchaseNum(orderNum * filterUniqueBom.getUseNum()); + //purchasePlanChild.setPurchaseNum(orderNum * filterUniqueBom.getUseNum()); }else { purchasePlanChild.setPlanPurchaseNum(filterUniqueBom.getOrderNum()); - purchasePlanChild.setPurchaseNum(filterUniqueBom.getOrderNum()); + //purchasePlanChild.setPurchaseNum(filterUniqueBom.getOrderNum()); } purchasePlanChild.setPurchasePlanStatus("0"); purchasePlanChild.setPurchasePlanCode(purchasePlanCode); diff --git a/ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseRequisitioningOrderServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseRequisitioningOrderServiceImpl.java index 44b966b7..d3a1d6bb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseRequisitioningOrderServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/system/service/impl/BaseRequisitioningOrderServiceImpl.java @@ -636,7 +636,7 @@ public class BaseRequisitioningOrderServiceImpl implements IBaseRequisitioningOr purchasePlanChild.setMaterialProcessMethod(requisitioningOrderDetail.getProcessMethod()); purchasePlanChild.setMaterialType(requisitioningOrderDetail.getMaterialType()); purchasePlanChild.setPlanPurchaseNum(requisitioningOrderDetail.getMaterialNum()); - purchasePlanChild.setPurchaseNum(requisitioningOrderDetail.getMaterialNum()); + // purchasePlanChild.setPurchaseNum(requisitioningOrderDetail.getMaterialNum()); purchasePlanChild.setCreateTime(new Date()); purchasePlanChild.setCreateBy(loginName); purchasePlanChildList.add(purchasePlanChild); @@ -652,7 +652,7 @@ public class BaseRequisitioningOrderServiceImpl implements IBaseRequisitioningOr purchasePlan.setPurchasePlanType("2"); purchasePlan.setMaterialSum(materialAmount); purchasePlan.setPlanPurchaseSum(materialNumSum); - purchasePlan.setPurchaseSum(materialNumSum); + //purchasePlan.setPurchaseSum(materialNumSum); purchasePlan.setCreateBy(requisitioningOrder.getCreateBy()); purchasePlan.setApplyUser(requisitioningOrder.getApplyUser()); diff --git a/ruoyi-admin/src/main/resources/templates/purchase/purchasePlan/addPurchaseOrder.html b/ruoyi-admin/src/main/resources/templates/purchase/purchasePlan/addPurchaseOrder.html index 54d937bb..59de2a62 100644 --- a/ruoyi-admin/src/main/resources/templates/purchase/purchasePlan/addPurchaseOrder.html +++ b/ruoyi-admin/src/main/resources/templates/purchase/purchasePlan/addPurchaseOrder.html @@ -561,19 +561,25 @@ animation-fill-mode: none; { title: '待采购数', field: 'purchaseNum', + formatter: function(value, row) { + if (row) { + return calculatePurchaseNum(row); + } + return value || ''; + } }, { - title: '共享库存占用数', - field: 'sharedInventoryOccupancyNum', + title: '共享可用库存数', + field: 'sharedAvailableInventoryNum', }, { title: '本次占用共享库存数', - field: 'sharedAvailableInventoryNum', + field: 'sharedInventoryOccupancyNum', editable: { //动态禁用行内编辑 noEditFormatter: function(value, row, index){ - if (row.sharedInventoryOccupancyNum === 0){ + if (row.sharedAvailableInventoryNum === 0 && row.sharedInventoryOccupancyNum === 0){ return "0"; }else { return false; @@ -602,14 +608,14 @@ animation-fill-mode: none; return ""; } - // 检查 sharedAvailableInventoryNum 是否存在 - if (row.sharedAvailableInventoryNum === undefined || row.sharedAvailableInventoryNum === null) { + // 检查 sharedInventoryOccupancyNum 是否存在 + if (row.sharedInventoryOccupancyNum === undefined || row.sharedInventoryOccupancyNum === null) { return ""; } - // 根据 sharedAvailableInventoryNum 的值决定返回值 - if (row.sharedAvailableInventoryNum) { - return row.sharedAvailableInventoryNum; + // 根据 sharedInventoryOccupancyNum 的值决定返回值 + if (row.sharedInventoryOccupancyNum) { + return row.sharedInventoryOccupancyNum; } else { return value; } @@ -626,8 +632,8 @@ animation-fill-mode: none; if (isNaN(value)) { return '请输入有效的数字'; } - if (value <= 0) { - return '本次采购数不能小于等于0'; + if (value < 0) { + return '本次采购数不能小于0'; } //不能为小数 if (value % 1 !== 0) { @@ -661,16 +667,63 @@ animation-fill-mode: none; { title: '不含税总价', field: 'materialNoRmbSum', + formatter: function(value, row) { + // 如果本次采购数和不含税单价存在,则计算总价 + if (row && row.thisPurchaseNum !== undefined && row.materialNoRmbSum !== undefined) { + return (row.thisPurchaseNum * row.materialNoRmbSum).toFixed(2); + } + return value || ''; + } + + }, { title: '含税总价', field: 'materialRmbSum', + + formatter: function(value, row) { + // 如果本次采购数和含税单价存在,则计算总价 + if (row && row.thisPurchaseNum !== undefined && row.materialRmbSum !== undefined) { + return (row.thisPurchaseNum * row.materialRmbSum).toFixed(2); + } + return value || ''; + } + }, { title: '最新含税报价', field: 'latestQuoteRmb', }, + { + title: '实际采购数', + field: 'actualPurchaseNum', + visible: false, + + }, + { + title: '作废数', + field: 'cancelNum', + visible: false, + + }, ], + + onEditableSave: function(field, row, oldValue, $el) { + if (field === 'sharedInventoryOccupancyNum') { + // 确保共享占用库存数不超过共享可用库存数 + var sharedAvailableInventoryNum = parseFloat(row.sharedAvailableInventoryNum || 0); + var enteredValue = parseFloat(row[field]); + + if (enteredValue > sharedAvailableInventoryNum) { + row[field] = sharedAvailableInventoryNum; // 更新row中的值 + } + + updatePurchaseAndTotalPrices(row); + } else if (field === 'thisPurchaseNum') { + updateTotalPrices(row); + } + }, + onCheck: function(row) { updateFormValues(); }, @@ -685,14 +738,75 @@ animation-fill-mode: none; }, }; $.table.init(options); + + + + // 定义更新总价的方法 + function updateTotalPrices(row) { + var table = $('#' + options.id).bootstrapTable('getOptions'); + var data = $('#' + options.id).bootstrapTable('getData'); + + for (var i = 0; i < data.length; i++) { + if (data[i].purchasePlanChildId === row.purchasePlanChildId) { + var unitPriceWithoutTax = parseFloat(data[i].materialNoRmbSum || 0); + var unitPriceWithTax = parseFloat(data[i].materialRmbSum || 0); + var thisPurchaseNum = parseInt(row.thisPurchaseNum, 10); + + data[i].materialNoRmbSum = (thisPurchaseNum * unitPriceWithoutTax).toFixed(2); + data[i].materialRmbSum = (thisPurchaseNum * unitPriceWithTax).toFixed(2); + + $('#' + options.id).bootstrapTable('updateRow', { + index: i, + row: data[i] + }); + + break; + } + } + } + + // 定义更新本次采购数和总价的方法 + function updatePurchaseAndTotalPrices(row) { + var purchaseNum = calculatePurchaseNum(row); + var sharedAvailableInventoryNum = parseFloat(row.sharedAvailableInventoryNum || 0); + var thisPurchaseNum = Math.max(0, purchaseNum); + + // 确保共享占用库存数不超过共享可用库存数 + row.sharedInventoryOccupancyNum = Math.min(parseFloat(row.sharedInventoryOccupancyNum || 0), sharedAvailableInventoryNum); + row.thisPurchaseNum = thisPurchaseNum; + row.purchaseNum = purchaseNum; + + updateTotalPrices(row); + + $('#' + options.id).bootstrapTable('updateRow', { + index: $('#' + options.id).bootstrapTable('getRowIndex', row), + row: row + }); + } + + + // 计算待采购数的方法 + function calculatePurchaseNum(row) { + if (!row) return 0; + + var planPurchaseNum = parseFloat(row.planPurchaseNum || 0); + var actualPurchaseNum = parseFloat(row.actualPurchaseNum || 0); + var sharedInventoryOccupancyNum = parseFloat(row.sharedInventoryOccupancyNum || 0); + var cancelNum = parseFloat(row.cancelNum || 0); + + return Math.max(0, planPurchaseNum - actualPurchaseNum - sharedInventoryOccupancyNum - cancelNum); + } + + + /*通过选择物料的数据计算form的数据*/ function updateFormValues() { var selectedRows = $('#selectMaterial-bootstrap-table').bootstrapTable('getSelections'); - //遍历选择的行,如果选择的行中sharedAvailableInventoryNum和thisPurchaseNum数据为空就进行提示 + //遍历选择的行,如果选择的行中thisPurchaseNum数据为空就进行提示 for (var i = 0; i < selectedRows.length; i++) { var row = selectedRows[i]; - if (!row.thisPurchaseNum) { + if (row.thisPurchaseNum == null) { $.modal.alertWarning('选择数据前请填写本次采购数进行合计'); return; } @@ -707,8 +821,8 @@ animation-fill-mode: none; selectedRows.forEach(function(row) { thisPurchaseSum += parseInt(row.thisPurchaseNum || 0); sharedInventoryOccupancySum += parseInt(row.sharedInventoryOccupancyNum || 0); - noRmbSum += parseFloat(row.materialNoRmbSum || 0); - rmbSum += parseFloat(row.materialRmbSum || 0); + noRmbSum += parseFloat(row.materialNoRmbSum * row.thisPurchaseNum || 0); + rmbSum += parseFloat(row.materialRmbSum * row.thisPurchaseNum || 0); }); $('#materialSum2').val(parseInt(materialSum));