Browse Source

创建待采购移到下发生产

yzc 1 year ago
parent
commit
2542b85e93

+ 108 - 4
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java

@@ -6,10 +6,14 @@ import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 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.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
-import com.fjhx.item.service.product.ProductBomDetailService;
+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;
 import com.fjhx.mes.entity.material.po.MaterialPreparation;
 import com.fjhx.mes.entity.production.dto.ProduceOrderSelectDto;
 import com.fjhx.mes.entity.production.dto.ProductionOrderDto;
@@ -27,6 +31,8 @@ import com.fjhx.mes.service.production.ProduceOrderDetailService;
 import com.fjhx.mes.service.production.ProduceOrderService;
 import com.fjhx.mes.service.production.ProductionTaskProgressService;
 import com.fjhx.mes.service.work.WorkOrderService;
+import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
+import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.contract.po.ContractProductBom;
@@ -71,8 +77,6 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
     @Autowired
     private WorkOrderService workOrderService;
     @Autowired
-    private ProductBomDetailService productBomDetailService;
-    @Autowired
     private MaterialPreparationService materialPreparationService;
     @Autowired
     private ProductionProcessesMapper productionProcessesMapper;
@@ -80,6 +84,12 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
     private ProductionTaskProgressService productionTaskProgressService;
     @Autowired
     private ContractProductBomService contractProductBomService;
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    private SubscribeDetailService subscribeDetailService;
+    @Autowired
+    private ProductStockInfoService productStockInfoService;
 
     @Override
     public Page<ProductionOrderVo> getPage(ProduceOrderSelectDto dto) {
@@ -201,6 +211,9 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         Assert.notEmpty(contract, "查询不到合同信息!");
         contractService.update(q -> q.eq(Contract::getId, contractId).set(Contract::getOrderDistributeStatus, 1));
 
+        //创建待采购
+        createMaterialWaitPurchase(contract);
+
         produceOrderDto.setCode(contract.getCode());
         produceOrderDto.setProduceStatus(0);
         this.save(produceOrderDto);
@@ -257,6 +270,98 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
     }
 
     /**
+     * 创建合同产品 物料待采购信息
+     */
+    private void createMaterialWaitPurchase(Contract contract) {
+        //根据归属公司将数据赋值给指定公司
+        Long companyId = contract.getCompanyId();
+        SysDept company = deptService.getById(companyId);
+        if (ObjectUtil.isEmpty(company)) {
+            throw new ServiceException("归属公司不存在");
+        }
+
+        //生成物料待采购数据
+        List<ContractProduct> contractProductList = contractProductService.list(q -> q.eq(ContractProduct::getContractId, contract.getId()));
+
+        //获取物料列表
+        List<Long> cpIds = contractProductList.stream().map(ContractProduct::getId).collect(Collectors.toList());
+        Map<Long, List<ContractProductBom>> cpBMap = contractProductBomService.mapKGroup(ContractProductBom::getContractProductId,
+                q -> q.in(ContractProductBom::getContractProductId, cpIds)
+        );
+
+        //待采购列表
+        List<SubscribeDetail> subscribeDetailList = new ArrayList<>();
+
+        for (ContractProduct contractProduct : contractProductList) {
+            //获取物料列表,以及原材料
+            List<ContractProductBom> contractProductBomList = cpBMap.get(contractProduct.getId());
+
+            if (ObjectUtil.isEmpty(contractProductBomList)) {
+                continue;
+            }
+            List<Long> materialIds = contractProductBomList.stream().map(ContractProductBom::getMaterialId).collect(Collectors.toList());
+            Map<Long, ProductInfo> materialMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
+
+            //获取合同归属归属的物料可用库存
+            Map<Long, BigDecimal> availableQuantityMap = productStockInfoService.mapKV(ProductStockInfo::getId, ProductStockInfo::getAvailableQuantity, q -> q
+                    .in(ProductStockInfo::getProductId, materialIds)
+                    .eq(ProductStockInfo::getCompanyId, companyId)
+            );
+
+
+            //遍历物料列表
+            for (ContractProductBom productBomDetail : contractProductBomList) {
+                Long materialId = productBomDetail.getMaterialId();
+                ProductInfo materialInfo = materialMap.get(materialId);
+
+                BigDecimal multiply = productBomDetail.getQuantity().multiply(contractProduct.getQuantity());
+
+                //获取产品安全库存
+                BigDecimal stockThreshold = materialInfo.getStockThreshold();
+                //获取可用库存
+                BigDecimal availableQuantity = availableQuantityMap.getOrDefault(materialId, BigDecimal.ZERO);
+                //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<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, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, companyId);
+                } else {
+                    //需要采购的数量>=0 可用库存 = 安全库存
+                    InOutBo inOutBo = new InOutBo();
+                    inOutBo.setProductId(materialId);
+                    inOutBo.setQuantity(stockThreshold);
+                    productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, companyId);
+                }
+
+                //需要采购的数量大于0生成待采购数据
+                if (requiredQuantity.compareTo(BigDecimal.ZERO) > 0) {
+                    SubscribeDetail subscribeDetail = new SubscribeDetail();
+                    subscribeDetail.setProductId(materialId);
+                    subscribeDetail.setCount(requiredQuantity);
+                    subscribeDetail.setStatus(15);//待采购
+                    subscribeDetail.setContractId(contract.getId());
+                    subscribeDetail.setContractDetailId(contractProduct.getId());
+                    subscribeDetail.setDataType(1);
+                    subscribeDetail.setCompanyId(companyId);
+
+                    subscribeDetailList.add(subscribeDetail);
+                }
+
+            }
+
+        }
+        //保存待采购明细
+        subscribeDetailService.saveBatch(subscribeDetailList);
+
+    }
+
+    /**
      * 创建生产任务
      */
     private synchronized void createOrderDetails(ProductionOrder produceOrder) {
@@ -346,7 +451,6 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         for (ProductionOrderDetail productionOrderDetail : productionOrderDetailList) {
             productionOrderDetail.setProduceStatus(1);
             //创建备料
-
             List<ContractProductBom> contractProductBomList = cpBMap.get(productionOrderDetail.getContractDetailId());
 
             List<MaterialPreparation> materialPreparationList = new ArrayList<>();

+ 3 - 125
hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java

@@ -7,24 +7,14 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 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.service.file.FtpFileService;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
-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.ProductBomDetailService;
-import com.fjhx.item.service.product.ProductInfoService;
-import com.fjhx.item.service.product.ProductStockInfoService;
-import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
-import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.dto.ContractProductDto;
 import com.fjhx.sale.entity.contract.po.Contract;
@@ -37,18 +27,16 @@ import com.fjhx.sale.service.contract.ContractProjectService;
 import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.annotation.LogicIgnore;
 import com.ruoyi.common.core.domain.BasePo;
-import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.service.ISysDeptService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 外销合同流程
@@ -57,33 +45,19 @@ import java.util.stream.Collectors;
  * @DATE:2023/4/3 17:38
  */
 @Component
-//@DS(SourceConstant.SALE)
 public class ContractFlow extends FlowDelegate {
 
     @Autowired
     private CodingRuleService codingRuleService;
-
     @Autowired
     private ContractService contractService;
-
     @Autowired
     private ContractProductService contractProductService;
-
     @Autowired
     private ContractProjectService contractProjectService;
     @Autowired
     private FtpFileService ftpFileService;
     @Autowired
-    private ProductInfoService productInfoService;
-    @Autowired
-    private SubscribeDetailService subscribeDetailService;
-    @Autowired
-    private ProductBomDetailService productBomDetailService;
-    @Autowired
-    private ISysDeptService deptService;
-    @Autowired
-    private ProductStockInfoService productStockInfoService;
-    @Autowired
     private ContractProductBomService contractProductBomService;
 
     @Override
@@ -132,7 +106,6 @@ public class ContractFlow extends FlowDelegate {
      */
     @Override
     public void end(Long flowId, Long businessId, JSONObject submitData) {
-
         // 通过业务ID查询合同数据
         Contract contract = contractService.getById(businessId);
 
@@ -143,9 +116,6 @@ public class ContractFlow extends FlowDelegate {
         contract.setStatus(FlowStatusEnum1.PASS.getKey());
         contract.setApprovedDate(new Date());
         contractService.updateById(contract);
-
-        //生成物料待采购数据
-        createMaterialWaitPurchase(contract);
     }
 
     public Long start(ContractDto contract) {
@@ -255,97 +225,5 @@ public class ContractFlow extends FlowDelegate {
         );
     }
 
-    /**
-     * 创建合同产品 物料待采购信息
-     */
-    private void createMaterialWaitPurchase(Contract contract) {
-        //根据归属公司将数据赋值给指定公司
-        Long companyId = contract.getCompanyId();
-        SysDept company = deptService.getById(companyId);
-        if (ObjectUtil.isEmpty(company)) {
-            throw new ServiceException("归属公司不存在");
-        }
-
-        //生成物料待采购数据
-        List<ContractProduct> contractProductList = contractProductService.list(q -> q.eq(ContractProduct::getContractId, contract.getId()));
-
-        //获取物料列表
-        List<Long> cpIds = contractProductList.stream().map(ContractProduct::getId).collect(Collectors.toList());
-        Map<Long, List<ContractProductBom>> cpBMap = contractProductBomService.mapKGroup(ContractProductBom::getContractProductId,
-                q -> q.in(ContractProductBom::getContractProductId, cpIds)
-        );
-
-        //待采购列表
-        List<SubscribeDetail> subscribeDetailList = new ArrayList<>();
-
-        for (ContractProduct contractProduct : contractProductList) {
-            //获取物料列表,以及原材料
-            List<ContractProductBom> contractProductBomList = cpBMap.get(contractProduct.getId());
-
-            if (ObjectUtil.isEmpty(contractProductBomList)) {
-                continue;
-            }
-            List<Long> materialIds = contractProductBomList.stream().map(ContractProductBom::getMaterialId).collect(Collectors.toList());
-            Map<Long, ProductInfo> materialMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
-
-            //获取合同归属归属的物料可用库存
-            Map<Long, BigDecimal> availableQuantityMap = productStockInfoService.mapKV(ProductStockInfo::getId, ProductStockInfo::getAvailableQuantity, q -> q
-                    .in(ProductStockInfo::getProductId, materialIds)
-                    .eq(ProductStockInfo::getCompanyId, companyId)
-            );
-
-
-            //遍历物料列表
-            for (ContractProductBom productBomDetail : contractProductBomList) {
-                Long materialId = productBomDetail.getMaterialId();
-                ProductInfo materialInfo = materialMap.get(materialId);
-
-                BigDecimal multiply = productBomDetail.getQuantity().multiply(contractProduct.getQuantity());
-
-                //获取产品安全库存
-                BigDecimal stockThreshold = materialInfo.getStockThreshold();
-                //获取可用库存
-                BigDecimal availableQuantity = availableQuantityMap.getOrDefault(materialId, BigDecimal.ZERO);
-                //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<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, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, companyId);
-                } else {
-                    //需要采购的数量>=0 可用库存 = 安全库存
-                    InOutBo inOutBo = new InOutBo();
-                    inOutBo.setProductId(materialId);
-                    inOutBo.setQuantity(stockThreshold);
-                    productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, companyId);
-                }
-
-                //需要采购的数量大于0生成待采购数据
-                if (requiredQuantity.compareTo(BigDecimal.ZERO) > 0) {
-                    SubscribeDetail subscribeDetail = new SubscribeDetail();
-                    subscribeDetail.setProductId(materialId);
-                    subscribeDetail.setCount(requiredQuantity);
-                    subscribeDetail.setStatus(15);//待采购
-                    subscribeDetail.setContractId(contract.getId());
-                    subscribeDetail.setContractDetailId(contractProduct.getId());
-                    subscribeDetail.setDataType(1);
-                    subscribeDetail.setCompanyId(companyId);
-
-                    subscribeDetailList.add(subscribeDetail);
-                }
-
-            }
-
-        }
-        //保存待采购明细
-        subscribeDetailService.saveBatch(subscribeDetailList);
-
-    }
-
 
 }