From 896347778f81a0a6f7818ea9837f746cba93d601 Mon Sep 17 00:00:00 2001 From: liuxiaoxu <1793812695@qq.com> Date: Mon, 9 Dec 2024 17:41:51 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=20=E9=87=87=E8=B4=AD=E7=AE=A1=E7=90=86=20?= =?UTF-8?q?=E9=94=80=E5=94=AE=E8=AE=A2=E5=8D=95=E6=B7=BB=E5=8A=A0=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=EF=BC=8C=E9=9A=90=E8=97=8F=E5=85=A5=E5=BA=93=E9=83=A8?= =?UTF-8?q?=E9=97=A8=E5=AD=97=E6=AE=B5=20=E9=87=8D=E5=86=99=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E8=AE=A1=E5=88=92=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=8C=89=E7=85=A7?= =?UTF-8?q?=E6=96=B0=E7=89=88prd=E5=85=B3=E8=81=94=E4=BB=93=E5=BA=93?= =?UTF-8?q?=E5=BA=93=E5=AD=98=E6=9F=A5=E8=AF=A2=E6=96=B9=E9=9D=A2=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=8C=E9=87=87=E8=B4=AD=E8=AE=A1=E5=88=92?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B9=9F=E8=A6=81=E5=85=B3=E8=81=94=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E5=BA=93=E5=AD=98=E6=95=B0=E6=8D=AE=EF=BC=9B=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B7=BB=E5=8A=A0=E9=87=87=E8=B4=AD=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=AC=AC=E4=BA=8C=E6=AD=A5=E5=B1=95=E7=A4=BA=E9=80=89?= =?UTF-8?q?=E7=89=A9=E6=96=99=E5=88=97=E8=A1=A8=E6=96=B9=E6=B3=95=EF=BC=9B?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E7=9A=84=E7=89=A9=E6=96=99=E8=A6=81=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E8=AE=A1=E5=88=92=E9=87=87=E8=B4=AD=E6=95=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/PurchaseOrderServiceImpl.java | 159 ++++++------------ .../service/impl/PurchasePlanServiceImpl.java | 31 +--- .../templates/system/salesOrder/add.html | 6 +- 3 files changed, 57 insertions(+), 139 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java index c921f87a..f3927f4d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/purchase/service/impl/PurchaseOrderServiceImpl.java @@ -457,148 +457,85 @@ public class PurchaseOrderServiceImpl implements IPurchaseOrderService for (PurchasePlanSelectMaterialVo purchasePlanSelectMaterialVo : purchasePlanSelectMaterialVoList) { String materialNo = purchasePlanSelectMaterialVo.getMaterialNo(); - // Integer thisPurchaseNum = purchasePlanSelectMaterialVo.getThisPurchaseNum(); - - - //共享库存占用数 - 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(); + Integer sharedInventoryOccupancyNum = purchasePlanSelectMaterialVo.getSharedInventoryOccupancyNum(); - //共享可用库存 - Integer sharedAvailableInventoryNum = purchasePlanSelectMaterialVo.getSharedAvailableInventoryNum(); - - //待采购数 - Integer purchaseNum = purchasePlanSelectMaterialVo.getPurchaseNum(); - - if (purchaseNum < thisPurchaseNum){ - throw new BusinessException("本次采购数量不能大于待采购数量"); + // 检查是否有共享库存占用数,没有的话直接使用thisPurchaseNum + Integer remainingSharedInventoryOccupancyNum = 0; + if (sharedInventoryOccupancyNum == null || sharedInventoryOccupancyNum <= 0) { + remainingSharedInventoryOccupancyNum = 0; + } else { + remainingSharedInventoryOccupancyNum = sharedInventoryOccupancyNum; } - // 获取旧数据中相同物料编号的数据 - List oldChildren = oldDataGroupedByMaterialNo.get(materialNo); - - // 优先使用本次占用共享库存 - Integer remainingSharedInventoryOccupancyNum = Math.min(sharedInventoryOccupancyNum, thisPurchaseNum); - - if (!CollectionUtils.isEmpty(oldChildren)) { - // 按照订单创建时间远离当前时间排序(即由远及近) - oldChildren.sort(Comparator.comparing(oldChild -> oldChild.getCreateTime().getTime())); + // 获取旧数据中相同物料编号的数据,并排序 + List oldChildren = Optional.ofNullable(oldDataGroupedByMaterialNo.get(materialNo)).orElse(Collections.emptyList()); + oldChildren.sort(Comparator.comparing(PurchasePlanChild::getCreateTime)); + // 遍历旧数据,分配剩余的共享库存占用数和本次采购数 for (PurchasePlanChild oldChild : oldChildren) { - - // 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; // 如果本次采购数和共享库存都已分配完毕则退出循环 + if (remainingSharedInventoryOccupancyNum <= 0 && thisPurchaseNum <= 0) { + break; // 如果本次采购数和共享库存都已分配完毕则退出循环 } - - // 更新状态 - updateChildPurchasePlanStatus(oldChild,sharedInventoryOccupancyNum,thisPurchaseNum,purchaseNum); - - if (oldSharedInventoryOccupancyNum == 0){ - oldChild.setSharedInventoryOccupancyNum(sharedInventoryOccupancyNum); - }else { - oldChild.setSharedInventoryOccupancyNum(oldSharedInventoryOccupancyNum + sharedInventoryOccupancyNum); + 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); + + // 更新共享库存占用数和实际采购数 + int useSharedInventory = 0; + if (remainingSharedInventoryOccupancyNum > 0) { + // 先用完剩余的共享库存占用数 + useSharedInventory = Math.min(remainingSharedInventoryOccupancyNum, planPurchaseNum - oldActualPurchaseNum - cancelNum); + remainingSharedInventoryOccupancyNum -= useSharedInventory; + oldChild.setSharedInventoryOccupancyNum(oldSharedInventoryOccupancyNum + useSharedInventory); + oldChild.setActualPurchaseNum(oldActualPurchaseNum + useSharedInventory); } - if (oldActualPurchaseNum == 0){ - oldChild.setActualPurchaseNum(thisPurchaseNum); - }else { - oldChild.setActualPurchaseNum(oldActualPurchaseNum + thisPurchaseNum); + + int useThisPurchase = 0; + if (thisPurchaseNum > 0) { + // 然后用本次采购数补充 + useThisPurchase = Math.min(thisPurchaseNum, planPurchaseNum - oldActualPurchaseNum - cancelNum - useSharedInventory); + thisPurchaseNum -= useThisPurchase; + oldChild.setActualPurchaseNum(oldActualPurchaseNum + useThisPurchase); } - // 更新其他字段 + // 更新其他字段和状态 + updateChildPurchasePlanStatus(oldChild); 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); - // 收集更新后的子表数据 purchasePlanChildren.add(oldChild); - int result = purchasePlanChildMapper.updatePurchasePlanChild(oldChild); - if (result <= 0){ - throw new BusinessException("更新采购计划子表数据失败"); + // 更新数据库 + int result = purchasePlanChildMapper.updatePurchasePlanChild(oldChild); + if (result <= 0) { + throw new BusinessException("更新采购计划子表数据失败"); + } } - } - } } return purchasePlanChildren; } // 定义一个方法来更新采购计划状态 - private void updateChildPurchasePlanStatus(PurchasePlanChild oldChild,Integer sharedInventoryOccupancyNum,Integer thisPurchaseNum,Integer purchaseNum) { - + private void updateChildPurchasePlanStatus(PurchasePlanChild oldChild) { /* + * 待申请:实际采购数=共享库存占用数=作废数=0,作废数<计划采购数; * 部分申请: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 actualPurchaseNum = Optional.ofNullable(oldChild.getActualPurchaseNum()).orElse(0); + Integer oldSharedInventoryOccupancyNum = Optional.ofNullable(oldChild.getSharedInventoryOccupancyNum()).orElse(0); + Integer cancelNum = Optional.ofNullable(oldChild.getCancelNum()).orElse(0); + Integer planPurchaseNum = Optional.ofNullable(oldChild.getPlanPurchaseNum()).orElse(0); + // totalApplied 应该只包含已经分配给当前子项的数量 Integer totalApplied = actualPurchaseNum + oldSharedInventoryOccupancyNum + cancelNum; - - if (totalApplied == 0 && cancelNum < planPurchaseNum) { oldChild.setPurchasePlanStatus("0"); // 待申请 } else if (0 < totalApplied && totalApplied < planPurchaseNum) { 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 9446e4d2..09a5b6dd 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 @@ -250,30 +250,15 @@ public class PurchasePlanServiceImpl implements IPurchasePlanService item.setMaterialRmbSum(quoteHistory.getMaterialRmb()); } return item; + }, + (existingItem, newItem) -> { + + existingItem.setPlanPurchaseNum( + (existingItem.getPlanPurchaseNum() != null ? existingItem.getPlanPurchaseNum() : 0) + + (newItem.getPlanPurchaseNum() != null ? newItem.getPlanPurchaseNum() : 0) + ); + 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; -// } )); // 将合并后的数据转换为列表 diff --git a/ruoyi-admin/src/main/resources/templates/system/salesOrder/add.html b/ruoyi-admin/src/main/resources/templates/system/salesOrder/add.html index c1caec02..9caa3d90 100644 --- a/ruoyi-admin/src/main/resources/templates/system/salesOrder/add.html +++ b/ruoyi-admin/src/main/resources/templates/system/salesOrder/add.html @@ -351,11 +351,7 @@ {title: '型号',field: 'materialModel',align: 'center'}, {title: '品牌',field: 'brand',align: 'center'}, { title: '单位',field: 'unit',align: 'center', formatter: function(value, row, index) {return $.table.selectDictLabel(sysUnitClassDatas, value);}}, - { title: '入库部门',field: 'warehouseDept',align: 'center', - formatter: function(value, row, index) { - - } - }, + { title: '入库部门',field: 'warehouseDept',align: 'center',visible: false}, {title: '加工方式',field: 'processMethod',align: 'center',formatter: function(value, row, index) {return $.table.selectDictLabel(processMethodDatas, value);}}, { title: '对外售价',field: 'materialSole',align: 'center',}, { title: '最新报价(RMB)',field: 'recentQuotationRMB',align: 'center',},