Prechádzať zdrojové kódy

生产相关问题处理

yzc 1 rok pred
rodič
commit
34b31224f6

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/vo/ProductionOrderVo.java

@@ -28,4 +28,9 @@ public class ProductionOrderVo extends ProductionOrder {
      */
     private String prodTag;
 
+    /**
+     * 归属公司名称
+     */
+    private String companyName;
+
 }

+ 29 - 12
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java

@@ -3,10 +3,10 @@ package com.fjhx.mes.service.production.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 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.utils.Assert;
-import com.fjhx.item.entity.product.po.ProductBomDetail;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductBomDetailService;
 import com.fjhx.item.service.product.ProductInfoService;
@@ -29,6 +29,8 @@ import com.fjhx.mes.service.production.ProductionTaskProgressService;
 import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
+import com.fjhx.sale.entity.contract.po.ContractProductBom;
+import com.fjhx.sale.service.contract.ContractProductBomService;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.core.domain.entity.SysDept;
@@ -76,6 +78,8 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
     private ProductionProcessesMapper productionProcessesMapper;
     @Autowired
     private ProductionTaskProgressService productionTaskProgressService;
+    @Autowired
+    private ContractProductBomService contractProductBomService;
 
     @Override
     public Page<ProductionOrderVo> getPage(ProduceOrderSelectDto dto) {
@@ -122,8 +126,21 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         });
 
         Map<Long, List<ProductionOrderDetailVo>> produceOrderDetailMap = produceOrderDetailVos.stream().collect(Collectors.groupingBy(ProductionOrderDetail::getProduceOrderId));
+
+        //获取归属公司信息
+        Map<Long, String> sysDeptMap = new HashMap<>();
+        List<Long> companyIds = records.stream().map(ProductionOrder::getCompanyId).collect(Collectors.toList());
+        if (ObjectUtil.isNotEmpty(companyIds)) {
+            List<SysDept> deptList = sysDeptService.list(Wrappers.<SysDept>query().in("dept_id", companyIds));
+            sysDeptMap = deptList.stream().collect(Collectors.toMap(SysDept::getDeptId, SysDept::getDeptName));
+        }
+
+
         for (ProductionOrderVo record : records) {
             record.setProduceOrderDetailList(produceOrderDetailMap.get(record.getId()));
+
+            //赋值生产公司
+            record.setCompanyName(sysDeptMap.get(record.getCompanyId()));
         }
 
         return page;
@@ -154,9 +171,9 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         //权限过滤:生产排程-子公司看自己,总公司看全部
         Long companyId = SecurityUtils.getCompanyId();
         if (!Objects.equals(companyId, 100L)) {
-            wrapper.eq(ProductInfo::getCompanyId, companyId);
+            wrapper.eq("po", ProductInfo::getCompanyId, companyId);
         } else {
-            wrapper.eq(ProductInfo::getCompanyId, dto.getCompanyId());
+            wrapper.eq("po", ProductInfo::getCompanyId, dto.getCompanyId());
         }
 
         wrapper.groupBy("po.id");
@@ -318,22 +335,22 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         List<ProductionOrderDetail> productionOrderDetailList = produceOrderDetailService.list(q -> q
                 .eq(ProductionOrderDetail::getProduceOrderId, productionOrder.getId())
         );
+        //获取合同产品ids
+        List<Long> cpIds = productionOrderDetailList.stream()
+                .map(ProductionOrderDetail::getContractDetailId).collect(Collectors.toList());
+        Map<Long, List<ContractProductBom>> cpBMap = contractProductBomService.mapKGroup(ContractProductBom::getContractProductId,
+                q -> q.in(ContractProductBom::getContractProductId, cpIds)
+        );
 
         //获取产品id
-        List<Long> productIds = productionOrderDetailList.stream().map(ProductionOrderDetail::getProductId).collect(Collectors.toList());
-        Map<Long, ProductInfo> productInfoMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, productIds));
-        Map<Long, List<ProductBomDetail>> productBomDetailMap = productBomDetailService.mapKGroup(ProductBomDetail::getProductId, q -> q.in(ProductBomDetail::getProductId, productIds));
-
         for (ProductionOrderDetail productionOrderDetail : productionOrderDetailList) {
             productionOrderDetail.setProduceStatus(1);
             //创建备料
-            Long productId = productionOrderDetail.getProductId();
-            ProductInfo productInfo = productInfoMap.get(productId);
-            Assert.notEmpty(productInfo, "查询不到产品信息");
 
-            List<ProductBomDetail> productBomDetailList = productBomDetailMap.get(productId);
+            List<ContractProductBom> contractProductBomList = cpBMap.get(productionOrderDetail.getContractDetailId());
+
             List<MaterialPreparation> materialPreparationList = new ArrayList<>();
-            for (ProductBomDetail bomDetail : productBomDetailList) {
+            for (ContractProductBom bomDetail : contractProductBomList) {
                 BigDecimal multiply = bomDetail.getQuantity().multiply(productionOrderDetail.getQuantity());
 
                 MaterialPreparation materialPreparation = new MaterialPreparation();

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

@@ -17,7 +17,6 @@ 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.ProductBomDetail;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.entity.product.po.ProductStockInfo;
 import com.fjhx.item.enums.ProductAvailableRecordType;
@@ -260,87 +259,88 @@ 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> productIds = contractProductList.stream().map(ContractProduct::getProductId).collect(Collectors.toList());
-        //获取产品列表
-        Map<Long, ProductInfo> productInfoMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, productIds));
-        //获取物料信息
-        Map<Long, List<ProductBomDetail>> productBomMap = productBomDetailService.mapKGroup(ProductBomDetail::getProductId, q -> q.in(ProductBomDetail::getProductId, productIds));
+
+        //获取物料列表
+        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) {
-            Long productId = contractProduct.getProductId();
-            ProductInfo productInfo = productInfoMap.get(productId);
-
             //获取物料列表,以及原材料
-            List<ProductBomDetail> productBomDetails = productBomMap.get(productId);
-
-            if (ObjectUtil.isNotEmpty(productBomDetails)) {
-                List<Long> materialIds = productBomDetails.stream().map(ProductBomDetail::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, contract.getCompanyId())
-                );
-
-
-                //遍历物料列表
-                for (ProductBomDetail productBomDetail : productBomDetails) {
-                    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, contract.getCompanyId());
-                    } else {
-                        //需要采购的数量>=0 可用库存 = 安全库存
-                        InOutBo inOutBo = new InOutBo();
-                        inOutBo.setProductId(materialId);
-                        inOutBo.setQuantity(stockThreshold);
-                        productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS, contract.getCompanyId());
-                    }
-
-                    //需要采购的数量大于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);
-
-                        subscribeDetailList.add(subscribeDetail);
-                    }
+            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);
                 }
+
             }
-        }
 
-        //根据归属公司将数据赋值给指定公司
-        Long companyId = contract.getCompanyId();
-        SysDept company = deptService.getById(companyId);
-        if (ObjectUtil.isEmpty(companyId)) {
-            throw new ServiceException("归属公司不存在");
         }
         //保存待采购明细
         subscribeDetailService.saveBatch(subscribeDetailList);