Browse Source

调整可用库存 方法封装

yzc 1 năm trước cách đây
mục cha
commit
df90705237

+ 1 - 6
hx-common/src/main/java/com/fjhx/common/enums/InOutType.java

@@ -10,10 +10,5 @@ public enum InOutType {
     /**
      * 出库
      */
-    OUT,
-
-    /**
-     * 等于
-     */
-    EQ,
+    OUT
 }

+ 2 - 1
hx-item/src/main/java/com/fjhx/item/enums/ProductAvailableRecordType.java

@@ -9,7 +9,8 @@ public enum ProductAvailableRecordType {
 
     PURCHASE_PASS(1, "采购通过"),
     PURCHASE_CANCEL(2, "采购作废"),
-    PURCHASE_UPDATE(3, "采购变更"),
+    PURCHASE_UPDATE_IN(3, "采购变更"),
+    PURCHASE_UPDATE_OUT(3, "采购变更"),
     SALE_PASS(4, "销售合同通过"),
     HAND_IN(5, "手动入库"),
     HAND_OUT(6, "手动出库"),

+ 1 - 2
hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java

@@ -2,7 +2,6 @@ package com.fjhx.item.service.product;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.common.entity.InOutBo;
-import com.fjhx.common.enums.InOutType;
 import com.fjhx.item.entity.product.bo.ProductAnalysisBo;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
@@ -53,7 +52,7 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
     void delete(Long id);
 
 
-    void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType, Long companyId);
+    void editAvailableQuantity(List<InOutBo> inOutList, Long businessId, ProductAvailableRecordType businessType, Long companyId);
 
     /**
      * 根据产品IDS获取产品

+ 100 - 42
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -13,7 +13,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.entity.InOutBo;
-import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.service.file.FtpFileService;
 import com.fjhx.common.service.file.impl.FtpFileServiceImpl;
 import com.fjhx.file.entity.FileInfoVo;
@@ -22,7 +21,6 @@ import com.fjhx.item.entity.product.bo.ProductAnalysisBo;
 import com.fjhx.item.entity.product.bo.ProductExcelExportBo;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
-import com.fjhx.item.entity.product.po.ProductAvailableRecord;
 import com.fjhx.item.entity.product.po.ProductClassify;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.entity.product.po.ProductStockInfo;
@@ -342,20 +340,23 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
      * 修改可用库存
      *
      * @param inOutList 产品列表
-     * @param inOutType 1添加 2减少
      */
     @DSTransactional
     @Override
-    public synchronized void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType, Long companyId) {
+    public synchronized void editAvailableQuantity(List<InOutBo> inOutList, Long businessId, ProductAvailableRecordType businessType, Long companyId) {
 
-        List<Long> pIds = inOutList.stream().map(InOutBo::getProductId).collect(Collectors.toList());
-        if (ObjectUtil.isEmpty(pIds)) {
-            return;
-        }
+        List<Long> materialIds = inOutList.stream().map(InOutBo::getProductId).collect(Collectors.toList());
+        Map<Long, ProductInfo> materialMap = this.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
 
-        List<ProductAvailableRecord> availableRecordList = new ArrayList<>();
         for (InOutBo inOutBo : inOutList) {
-            //查询可用库存
+            Long materialId = inOutBo.getProductId();
+            BigDecimal quantity = inOutBo.getQuantity();
+
+            //获取产品安全库存
+            ProductInfo materialInfo = materialMap.get(materialId);
+            BigDecimal stockThreshold = materialInfo.getStockThreshold();
+
+            //获取可用库存
             ProductStockInfo productStockInfo = productStockInfoService.getOne(q -> q
                     .eq(ProductStockInfo::getProductId, inOutBo.getProductId())
                     .eq(ProductStockInfo::getCompanyId, companyId)
@@ -367,45 +368,102 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
                 productStockInfo.setProductId(inOutBo.getProductId());
                 productStockInfoService.save(productStockInfo);
             }
-
-            BigDecimal availableQuantityNew;
-            BigDecimal edQuantity = inOutBo.getQuantity();
-
+            Long productStockInfoId = productStockInfo.getId();
             BigDecimal availableQuantity = productStockInfo.getAvailableQuantity();
 
-            if (inOutType.equals(InOutType.IN)) {
-                availableQuantityNew = availableQuantity.add(inOutBo.getQuantity());
-            } else if (inOutType.equals(InOutType.OUT)) {
-                availableQuantityNew = availableQuantity.subtract(inOutBo.getQuantity());
-            } else if (inOutType.equals(InOutType.EQ)) {
-                availableQuantityNew = inOutBo.getQuantity();
 
-                edQuantity = availableQuantityNew.subtract(availableQuantity);
-            } else {
-                throw new ServiceException("未知类型");
+            //下发订单 创建待采购
+            if (ProductAvailableRecordType.SALE_PASS.equals(businessType)) {
+                //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<0,则按0算不采购)
+                BigDecimal subtract = availableQuantity.subtract(quantity);
+                BigDecimal requiredQuantity = stockThreshold.subtract(subtract);
+
+                //返回需采购量
+                inOutBo.setQuantity(requiredQuantity);
+
+                //计算可用库存
+                if (requiredQuantity.compareTo(BigDecimal.ZERO) < 0) {
+                    //需要采购的数量<0 可用库存 = 可用库存 - 合同量
+                    productStockInfoService.update(q -> q
+                            .eq(ProductStockInfo::getId, productStockInfoId)
+                            .setSql("available_quantity = available_quantity - " + quantity)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                } else {
+                    //需要采购的数量>=0 可用库存 = 安全库存
+                    productStockInfoService.update(q -> q
+                            .eq(ProductStockInfo::getId, productStockInfoId)
+                            .setSql("available_quantity = " + stockThreshold)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                }
+            }
+            //销售合同作废          可用库存=可用库存-((待采购量-已采购量)-合同量)
+            //申购的-采购合同作废    可用库存 = 当前可用库存 - 采购明细数量
+            //手动出库             可用库存 = 当前可用库存 - 出库数量
+            else if (ProductAvailableRecordType.SALE_CANCEL.equals(businessType) || ProductAvailableRecordType.PURCHASE_CANCEL.equals(businessType) || ProductAvailableRecordType.HAND_OUT.equals(businessType)) {
+                productStockInfoService.update(q -> q
+                        .eq(ProductStockInfo::getId, productStockInfoId)
+                        .setSql("available_quantity = available_quantity - " + quantity)
+                        .set(BasePo::getUpdateTime, new Date())
+                        .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                );
+            }
+            //申购的-采购合同通过    可用库存 = 当前可用库存 + 采购明细数量
+            //手动入库             可用库存 = 当前可用库存 + 入库数量
+            else if (ProductAvailableRecordType.PURCHASE_PASS.equals(businessType) || ProductAvailableRecordType.HAND_IN.equals(businessType)) {
+                productStockInfoService.update(q -> q
+                        .eq(ProductStockInfo::getId, productStockInfoId)
+                        .setSql("available_quantity = available_quantity + " + quantity)
+                        .set(BasePo::getUpdateTime, new Date())
+                        .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                );
             }
 
-            Long productStockInfoId = productStockInfo.getId();
-            productStockInfoService.update(q -> q
-                    .eq(ProductStockInfo::getId, productStockInfoId)
-                    .set(ProductStockInfo::getAvailableQuantity, availableQuantityNew)
-                    .set(BasePo::getUpdateTime, new Date())
-                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
-            );
+        }
 
-            //保存操作记录
-            ProductAvailableRecord productAvailableRecord = new ProductAvailableRecord();
-            productAvailableRecord.setBeforeQuantity(productStockInfo.getAvailableQuantity());
-            productAvailableRecord.setAfterQuantity(availableQuantityNew);
-            productAvailableRecord.setEditQuantity(edQuantity);
-            productAvailableRecord.setBusinessId(businessId);
-            productAvailableRecord.setBusinessType(businessType.getType());
-            productAvailableRecord.setProductId(inOutBo.getProductId());
-            productAvailableRecord.setCompanyId(companyId);
 
-            availableRecordList.add(productAvailableRecord);
-        }
-        productAvailableRecordService.saveBatch(availableRecordList);
+        //-------------------------------------
+
+//        List<ProductAvailableRecord> availableRecordList = new ArrayList<>();
+
+//            BigDecimal availableQuantityNew;
+//            BigDecimal edQuantity = inOutBo.getQuantity();
+
+
+//            if (inOutType.equals(InOutType.IN)) {
+//                availableQuantityNew = availableQuantity.add(inOutBo.getQuantity());
+//            } else if (inOutType.equals(InOutType.OUT)) {
+//                availableQuantityNew = availableQuantity.subtract(inOutBo.getQuantity());
+//            } else if (inOutType.equals(InOutType.EQ)) {
+//                availableQuantityNew = inOutBo.getQuantity();
+//
+//                edQuantity = availableQuantityNew.subtract(availableQuantity);
+//            } else {
+//                throw new ServiceException("未知类型");
+//            }
+
+//            productStockInfoService.update(q -> q
+//                    .eq(ProductStockInfo::getId, productStockInfoId)
+//                    .set(ProductStockInfo::getAvailableQuantity, availableQuantityNew)
+//                    .set(BasePo::getUpdateTime, new Date())
+//                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+//            );
+
+//            //保存操作记录
+//            ProductAvailableRecord productAvailableRecord = new ProductAvailableRecord();
+//            productAvailableRecord.setBeforeQuantity(productStockInfo.getAvailableQuantity());
+//            productAvailableRecord.setAfterQuantity(availableQuantityNew);
+//            productAvailableRecord.setEditQuantity(edQuantity);
+//            productAvailableRecord.setBusinessId(businessId);
+//            productAvailableRecord.setBusinessType(businessType.getType());
+//            productAvailableRecord.setProductId(inOutBo.getProductId());
+//            productAvailableRecord.setCompanyId(companyId);
+//
+//            availableRecordList.add(productAvailableRecord);
+//        productAvailableRecordService.saveBatch(availableRecordList);
     }
 
     /**

+ 8 - 33
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java

@@ -8,11 +8,9 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.entity.InOutBo;
-import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
-import com.fjhx.item.entity.product.po.ProductStockInfo;
 import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.item.service.product.ProductStockInfoService;
@@ -345,37 +343,14 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
 
         //计算并生成待出库数据
         List<SubscribeDetail> subscribeDetailList = new ArrayList<>();
-        for (InOutBo value : inOutBoMap.values()) {
-            Long materialId = value.getProductId();
-            BigDecimal multiply = value.getQuantity();
-
-            ProductInfo materialInfo = materialMap.get(materialId);
-            //获取产品安全库存
-            BigDecimal stockThreshold = materialInfo.getStockThreshold();
-            //获取可用库存
-            BigDecimal availableQuantity = BigDecimal.ZERO;
-            ProductStockInfo productStockInfo = productStockInfoService.getOne(q -> q.eq(ProductStockInfo::getProductId, materialId).eq(ProductStockInfo::getCompanyId, companyId));
-            if (ObjectUtil.isNotEmpty(productStockInfo)) {
-                availableQuantity = productStockInfo.getAvailableQuantity();
-            }
-            //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<0,则按0算不采购)
-            BigDecimal subtract = availableQuantity.subtract(multiply);
-            BigDecimal requiredQuantity = stockThreshold.subtract(subtract);
-
-            //计算可用库存
-            if (requiredQuantity.compareTo(BigDecimal.ZERO) < 0) {
-                //需要采购的数量<0 可用库存 = 可用库存 - 合同量
-                InOutBo inOutBo = new InOutBo();
-                inOutBo.setProductId(materialId);
-                inOutBo.setQuantity(multiply);
-                productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.OUT, contractId, ProductAvailableRecordType.SALE_PASS, companyId);
-            } else {
-                //需要采购的数量>=0 可用库存 = 安全库存
-                InOutBo inOutBo = new InOutBo();
-                inOutBo.setProductId(materialId);
-                inOutBo.setQuantity(stockThreshold);
-                productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractId, ProductAvailableRecordType.SALE_PASS, companyId);
-            }
+
+        //获取待采购物料列表
+        List<InOutBo> collect = inOutBoMap.values().stream().collect(Collectors.toList());
+        //操作可用库存计数需要采购量
+        productInfoService.editAvailableQuantity(collect, contractId, ProductAvailableRecordType.SALE_PASS, companyId);
+        for (InOutBo inOutBo : collect) {
+            Long materialId = inOutBo.getProductId();
+            BigDecimal requiredQuantity = inOutBo.getQuantity();
 
             //需要采购的数量大于0生成待采购数据
             if (requiredQuantity.compareTo(BigDecimal.ZERO) > 0) {

+ 1 - 2
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java

@@ -10,7 +10,6 @@ import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.enums.FlowStatusEnum1;
-import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.service.coding.CodingRuleService;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.flow.core.FlowDelegate;
@@ -222,7 +221,7 @@ public class EhsdPurchaseFlow extends FlowDelegate {
                 inOutBoList.add(inOutBo);
             }
         }
-        productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_PASS, purchase.getCompanyId());
+        productInfoService.editAvailableQuantity(inOutBoList, businessId, ProductAvailableRecordType.PURCHASE_PASS, purchase.getCompanyId());
 
 
         //采购审批通过 生成待入库数据

+ 2 - 3
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java

@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.enums.FlowStatusEnum1;
-import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.common.utils.Utils;
 import com.fjhx.flow.core.FlowDelegate;
@@ -121,7 +120,7 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
                 oldInOutBoList.add(inOutBo);
             }
         }
-        productInfoService.editAvailableQuantity(oldInOutBoList, InOutType.OUT, purchase.getOldPurchaseId(), ProductAvailableRecordType.PURCHASE_UPDATE, purchase.getCompanyId());
+        productInfoService.editAvailableQuantity(oldInOutBoList, purchase.getOldPurchaseId(), ProductAvailableRecordType.PURCHASE_UPDATE_OUT, purchase.getCompanyId());
 
 
         //将可用库存改为新合同数据
@@ -136,7 +135,7 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
                 inOutBoList.add(inOutBo);
             }
         }
-        productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_UPDATE, purchase.getCompanyId());
+        productInfoService.editAvailableQuantity(inOutBoList, businessId, ProductAvailableRecordType.PURCHASE_UPDATE_IN, purchase.getCompanyId());
 
 
         //调用采购发起流程的结束方法

+ 1 - 3
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -28,7 +28,6 @@ import com.fjhx.common.entity.contract.po.ContractTemplate;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.entity.documentary.bo.DocumentaryData;
 import com.fjhx.common.enums.FlowStatusEnum1;
-import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.common.service.contract.ContractTemplateService;
 import com.fjhx.common.service.corporation.CorporationService;
@@ -1364,10 +1363,9 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         }
 
 
-        //修改可用库存可用库存=可用库存-((待采购量-已采购量)-合同量)
+        //修改可用库存 可用库存=可用库存-((待采购量-已采购量)-合同量)
         productInfoService.editAvailableQuantity(
                 inOutBoList,
-                InOutType.OUT,
                 businessId,
                 ProductAvailableRecordType.SALE_CANCEL, contract.getCompanyId()
         );

+ 2 - 3
hx-sale/src/main/java/com/fjhx/sale/service/purchase/impl/EhsdPurchaseServiceImpl.java

@@ -17,7 +17,6 @@ import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.entity.documentary.bo.DocumentaryData;
 import com.fjhx.common.enums.FlowStatusEnum1;
-import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.service.corporation.CorporationService;
 import com.fjhx.common.service.documentary.GetDocumentaryBusinessTemplate;
 import com.fjhx.common.utils.Assert;
@@ -468,7 +467,7 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
         List<InOutBo> inOutBoList = new ArrayList<>();
         List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, id));
         for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
-            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
+            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 - 采购明细数量)
             if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
                 InOutBo inOutBo = new InOutBo();
                 inOutBo.setProductId(purchaseProduct.getProductId());
@@ -476,7 +475,7 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
                 inOutBoList.add(inOutBo);
             }
         }
-        productInfoService.editAvailableQuantity(inOutBoList, InOutType.OUT, id, ProductAvailableRecordType.PURCHASE_CANCEL, purchase.getCompanyId());
+        productInfoService.editAvailableQuantity(inOutBoList, id, ProductAvailableRecordType.PURCHASE_CANCEL, purchase.getCompanyId());
         //检查待入库是否存在,已入库或者部分入库的数据
         if (stockWaitService.count(q -> q.eq(StockWait::getPurchaseId, purchase.getId()).ne(StockWait::getStatus, 0)) > 0) {
             throw new ServiceException("该采购,已部分入库/已入库 禁止作废!");

+ 1 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -198,7 +198,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
 
         //修改可用库存
         ProductAvailableRecordType productAvailableRecordType = inOutType.equals(InOutType.IN) ? ProductAvailableRecordType.HAND_IN : ProductAvailableRecordType.HAND_OUT;
-        productInfoService.editAvailableQuantity(inOutBoList, inOutType, null, productAvailableRecordType, SecurityUtils.getCompanyId());
+        productInfoService.editAvailableQuantity(inOutBoList, null, productAvailableRecordType, SecurityUtils.getCompanyId());
     }
 
     /**