Browse Source

排程创建待出库

yzc 10 months ago
parent
commit
d9de43e577

+ 2 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/po/ProductionOrderDetail.java

@@ -21,6 +21,8 @@ import java.util.Date;
 @TableName("production_order_detail")
 public class ProductionOrderDetail extends BasePo {
 
+    private String code;
+
     /**
      * 生产订单id
      */

+ 72 - 59
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java

@@ -2,6 +2,7 @@ package com.fjhx.mes.service.production.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -31,7 +32,6 @@ import com.fjhx.sale.entity.arrival.vo.ArrivalDetailVo;
 import com.fjhx.sale.entity.contract.dto.ContractSelectDto;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
-import com.fjhx.sale.entity.contract.vo.ContractProductBomVo;
 import com.fjhx.sale.entity.contract.vo.ContractProductVo;
 import com.fjhx.sale.entity.contract.vo.ContractVo;
 import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct;
@@ -348,6 +348,17 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         Contract contract = contractService.getById(contractId);
         Assert.notEmpty(contract, "查询不到合同信息!");
 
+        //获取目前生产订单任务编号最大计数
+        Integer maxTaskCount = 0;
+        ProductionOrderDetail one = produceOrderDetailService.getOne(q -> q.eq(ProductionOrderDetail::getProduceOrderId, produceOrder.getId()));
+        if (ObjectUtil.isNotEmpty(one) && ObjectUtil.isNotEmpty(one.getCode())) {
+            String code = one.getCode();
+            int lastIndex = code.lastIndexOf("-");
+            if (lastIndex >= 0) {
+                maxTaskCount = Integer.valueOf(code.substring(lastIndex + 1));
+            }
+        }
+
         //创建生产订单明细
         List<ProductionOrderDetail> productionOrderDetailList = new ArrayList<>();
         List<ContractProductVo> contractProductList = contractProductService.getList(IWrapper.<ContractProduct>getWrapper()
@@ -374,6 +385,8 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
             if (ObjectUtil.isEmpty(productionOrderDetail)) {
                 productionOrderDetail = new ProductionOrderDetail();
                 productionOrderDetail.setFinishQuantity(BigDecimal.ZERO);
+
+                productionOrderDetail.setCode(StrUtil.format("{}-{}", produceOrder.getCode(), ++maxTaskCount));
             }
             productionOrderDetail.setProduceOrderId(orderDtoId);
             productionOrderDetail.setContractId(contractId);
@@ -579,8 +592,8 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
                     //创建生产任务
                     createOrderDetails(productionOrder1);
 
-                    //生成待出库
-                    createStockWait(productionOrder1);
+//                    //生成待出库
+//                    createStockWait(productionOrder1);
 
                     //创建完工入库
                     createOrEditProdCompletion(productionOrder1);
@@ -636,62 +649,62 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
 
     }
 
-    private void createStockWait(ProductionOrder productionOrder) {
-        //生成待出库
-        StockWait stockWait = stockWaitService.getOne(q -> q
-                .eq(StockWait::getBusinessId, productionOrder.getId())
-                .eq(StockWait::getBusinessType, JournalType.PROD_OUT.getDetailType())
-        );
-
-        if (ObjectUtil.isEmpty(stockWait)) {
-            stockWait = new StockWait();
-            stockWait.setStatus(0);//待出库
-        } else {
-            stockWait.setStatus(1);//部分出库
-        }
-        stockWait.setCompanyId(productionOrder.getCompanyId());
-        stockWait.setBusinessId(productionOrder.getId());
-        stockWait.setType(2);//出库
-
-        stockWait.setBusinessType(JournalType.PROD_OUT.getDetailType());//生产任务出库
-        stockWait.setContractId(productionOrder.getContractId());
-        stockWait.setBusinessCode(productionOrder.getCode());
-        stockWait.setProdOrderId(productionOrder.getId());
-        stockWaitService.saveOrUpdate(stockWait);
-
-        List<ContractProductVo> contractProductList = contractProductService.getList(IWrapper.<ContractProduct>getWrapper()
-                .eq("cp", ContractProduct::getContractId, productionOrder.getContractId())
-                //过滤当前生产公司的产品
-                .eq("pi.company_id", productionOrder.getCompanyId())
-        );
-        List<Long> cpIds = contractProductList.stream().map(ContractProduct::getId).collect(Collectors.toList());
-
-        List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
-        List<ContractProductBomVo> contractProductBomQuantitySum = contractProductBomService.getContractProductBomQuantitySum(IWrapper.getWrapper()
-                .eq("cpb.contract_id", productionOrder.getContractId())
-                .in("cp.id", cpIds)
-                .ne("cpb.type", 3)//过滤掉工序的数据
-        );
-        for (ContractProductBomVo contractProductBomVo : contractProductBomQuantitySum) {
-            //创建待出库明细
-            Long stockWaitId = stockWait.getId();
-            StockWaitDetails stockWaitDetails = stockWaitDetailsService.getOne(q -> q
-                    .eq(StockWaitDetails::getStockWaitId, stockWaitId)
-                    .eq(StockWaitDetails::getProductId, contractProductBomVo.getMaterialId())
-            );
-
-            if (ObjectUtil.isEmpty(stockWaitDetails)) {
-                stockWaitDetails = new StockWaitDetails();
-                stockWaitDetails.setReceiptQuantity(BigDecimal.ZERO);
-            }
-
-            stockWaitDetails.setStockWaitId(stockWaitId);
-            stockWaitDetails.setProductId(contractProductBomVo.getMaterialId());
-            stockWaitDetails.setQuantity(contractProductBomVo.getQuantity());
-            stockWaitDetailsList.add(stockWaitDetails);
-        }
-        stockWaitDetailsService.saveOrUpdateBatch(stockWaitDetailsList);
-    }
+//    private void createStockWait(ProductionOrder productionOrder) {
+//        //生成待出库
+//        StockWait stockWait = stockWaitService.getOne(q -> q
+//                .eq(StockWait::getBusinessId, productionOrder.getId())
+//                .eq(StockWait::getBusinessType, JournalType.PROD_OUT.getDetailType())
+//        );
+//
+//        if (ObjectUtil.isEmpty(stockWait)) {
+//            stockWait = new StockWait();
+//            stockWait.setStatus(0);//待出库
+//        } else {
+//            stockWait.setStatus(1);//部分出库
+//        }
+//        stockWait.setCompanyId(productionOrder.getCompanyId());
+//        stockWait.setBusinessId(productionOrder.getId());
+//        stockWait.setType(2);//出库
+//
+//        stockWait.setBusinessType(JournalType.PROD_OUT.getDetailType());//生产任务出库
+//        stockWait.setContractId(productionOrder.getContractId());
+//        stockWait.setBusinessCode(productionOrder.getCode());
+//        stockWait.setProdOrderId(productionOrder.getId());
+//        stockWaitService.saveOrUpdate(stockWait);
+//
+//        List<ContractProductVo> contractProductList = contractProductService.getList(IWrapper.<ContractProduct>getWrapper()
+//                .eq("cp", ContractProduct::getContractId, productionOrder.getContractId())
+//                //过滤当前生产公司的产品
+//                .eq("pi.company_id", productionOrder.getCompanyId())
+//        );
+//        List<Long> cpIds = contractProductList.stream().map(ContractProduct::getId).collect(Collectors.toList());
+//
+//        List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
+//        List<ContractProductBomVo> contractProductBomQuantitySum = contractProductBomService.getContractProductBomQuantitySum(IWrapper.getWrapper()
+//                .eq("cpb.contract_id", productionOrder.getContractId())
+//                .in("cp.id", cpIds)
+//                .ne("cpb.type", 3)//过滤掉工序的数据
+//        );
+//        for (ContractProductBomVo contractProductBomVo : contractProductBomQuantitySum) {
+//            //创建待出库明细
+//            Long stockWaitId = stockWait.getId();
+//            StockWaitDetails stockWaitDetails = stockWaitDetailsService.getOne(q -> q
+//                    .eq(StockWaitDetails::getStockWaitId, stockWaitId)
+//                    .eq(StockWaitDetails::getProductId, contractProductBomVo.getMaterialId())
+//            );
+//
+//            if (ObjectUtil.isEmpty(stockWaitDetails)) {
+//                stockWaitDetails = new StockWaitDetails();
+//                stockWaitDetails.setReceiptQuantity(BigDecimal.ZERO);
+//            }
+//
+//            stockWaitDetails.setStockWaitId(stockWaitId);
+//            stockWaitDetails.setProductId(contractProductBomVo.getMaterialId());
+//            stockWaitDetails.setQuantity(contractProductBomVo.getQuantity());
+//            stockWaitDetailsList.add(stockWaitDetails);
+//        }
+//        stockWaitDetailsService.saveOrUpdateBatch(stockWaitDetailsList);
+//    }
 
     @Override
     public void editDeliveryPeriod(ProductionOrderDto dto) {

+ 114 - 12
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionSchedulingServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 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.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.production.dto.ProductionSchedulingDto;
 import com.fjhx.mes.entity.production.dto.ProductionSchedulingSelectDto;
@@ -14,18 +15,32 @@ import com.fjhx.mes.entity.production.po.ProductionOrderDetail;
 import com.fjhx.mes.entity.production.po.ProductionScheduling;
 import com.fjhx.mes.entity.production.vo.ProductionOrderDetailVo;
 import com.fjhx.mes.entity.production.vo.ProductionSchedulingVo;
+import com.fjhx.mes.entity.technology.po.Technology;
 import com.fjhx.mes.mapper.production.ProduceOrderDetailMapper;
 import com.fjhx.mes.mapper.production.ProductionSchedulingMapper;
+import com.fjhx.mes.service.production.ProduceOrderDetailService;
 import com.fjhx.mes.service.production.ProductionSchedulingService;
+import com.fjhx.mes.service.technology.TechnologyService;
+import com.fjhx.sale.entity.contract.po.ContractProduct;
+import com.fjhx.sale.entity.contract.vo.ContractProductBomVo;
+import com.fjhx.sale.service.contract.ContractProductBomService;
+import com.fjhx.sale.service.contract.ContractProductService;
+import com.fjhx.wms.entity.stock.emums.JournalType;
+import com.fjhx.wms.entity.stock.po.StockWait;
+import com.fjhx.wms.entity.stock.po.StockWaitDetails;
+import com.fjhx.wms.service.stock.StockWaitDetailsService;
+import com.fjhx.wms.service.stock.StockWaitService;
 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.wrapper.IWrapper;
 import com.ruoyi.system.service.ISysUserService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -41,16 +56,24 @@ import java.util.stream.Collectors;
 @Service
 public class ProductionSchedulingServiceImpl extends ServiceImpl<ProductionSchedulingMapper, ProductionScheduling> implements ProductionSchedulingService {
 
-    private final ProductInfoService productInfoService;
-    private final ProduceOrderDetailMapper produceOrderDetailMapper;
-    private final ISysUserService sysUserService;
-
-    @Autowired
-    public ProductionSchedulingServiceImpl(ProductInfoService productInfoService, ProduceOrderDetailMapper produceOrderDetailMapper, ISysUserService sysUserService) {
-        this.productInfoService = productInfoService;
-        this.produceOrderDetailMapper = produceOrderDetailMapper;
-        this.sysUserService = sysUserService;
-    }
+    @Resource
+    private ProductInfoService productInfoService;
+    @Resource
+    private ProduceOrderDetailService produceOrderDetailService;
+    @Resource
+    private ProduceOrderDetailMapper produceOrderDetailMapper;
+    @Resource
+    private ISysUserService sysUserService;
+    @Resource
+    private StockWaitService stockWaitService;
+    @Resource
+    private StockWaitDetailsService stockWaitDetailsService;
+    @Resource
+    private ContractProductBomService contractProductBomService;
+    @Resource
+    private ContractProductService contractProductService;
+    @Resource
+    private TechnologyService technologyService;
 
     @Override
     public Page<ProductionSchedulingVo> getPage(ProductionSchedulingSelectDto dto) {
@@ -151,6 +174,22 @@ public class ProductionSchedulingServiceImpl extends ServiceImpl<ProductionSched
                 throw new ServiceException(sdf.format(dto.getSchedulingDate()) + "已有排程信息,请前往修改或删除!");
             }
             this.save(dto);
+
+            //获取产品工艺线路
+            ProductionOrderDetail productionOrderDetail = produceOrderDetailService.getById(dto.getTaskId());
+            Assert.notEmpty(productionOrderDetail, "查询不到生产任务信息!");
+            ProductInfo productInfo = productInfoService.getById(productionOrderDetail.getProductId());
+            Assert.notEmpty(productInfo, "查询不到产品信息!");
+            Technology technology = technologyService.getById(productInfo.getTechnologyId());
+            Assert.notEmpty(technology, "查询不到产品工艺信息!");
+            String processRoute = technology.getProcessRoute();
+            Assert.notEmpty(processRoute, "查询不到产品工艺线路为空!");
+            String[] processRouteArr = processRoute.split(",");
+
+            //如果是第一道工序 创建生产领料待出库
+            if (Long.parseLong(processRouteArr[0]) == dto.getProcessesId()) {
+                createStockWait(dto);
+            }
         }
     }
 
@@ -163,7 +202,7 @@ public class ProductionSchedulingServiceImpl extends ServiceImpl<ProductionSched
             throw new ServiceException("排程数量不能小于已完工数量!");
         }
 
-        this.updateById(dto);
+//        this.updateById(dto);
     }
 
     @Override
@@ -176,6 +215,17 @@ public class ProductionSchedulingServiceImpl extends ServiceImpl<ProductionSched
         }
 
         this.removeById(id);
+
+        //删除生产领料待出库
+        StockWait stockWait = stockWaitService.getOne(q -> q.eq(StockWait::getSchedulingId, id));
+        if (ObjectUtil.isNotEmpty(stockWait)) {
+            long count = stockWaitDetailsService.count(q -> q.eq(StockWaitDetails::getStockWaitId, stockWait.getId()).ne(StockWaitDetails::getReceiptQuantity, 0));
+            if (count > 0) {
+                throw new ServiceException("该排程生产物料,已领料或部分领料,排程禁止删除!");
+            }
+            stockWaitService.removeById(stockWait.getId());
+            stockWaitDetailsService.remove(q -> q.eq(StockWaitDetails::getStockWaitId, stockWait.getId()));
+        }
     }
 
     @Override
@@ -211,4 +261,56 @@ public class ProductionSchedulingServiceImpl extends ServiceImpl<ProductionSched
         return produceOrderDetailMapper.getProcessesSchedulingByDay(dayDate);
     }
 
+    /**
+     * 根据排程创建待出库
+     */
+    @DSTransactional
+    private synchronized void createStockWait(ProductionScheduling dto) {
+        ProductionOrderDetail task = produceOrderDetailService.getById(dto.getTaskId());
+        Assert.notEmpty(task, "查询不到任务信息!");
+
+        //生成待出库
+        StockWait stockWait = new StockWait();
+        stockWait.setStatus(0);//待出库
+        stockWait.setCompanyId(task.getCompanyId());
+        stockWait.setBusinessId(dto.getId());
+        stockWait.setType(2);//出库
+
+        stockWait.setBusinessType(JournalType.PROD_OUT.getDetailType());//生产任务出库
+        stockWait.setBusinessCode(task.getCode());
+
+        stockWait.setContractId(task.getContractId());
+        stockWait.setProdOrderId(task.getProduceOrderId());
+        stockWait.setProdTaskId(task.getId());
+        stockWait.setSchedulingId(dto.getId());
+        stockWaitService.saveOrUpdate(stockWait);
+
+        List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
+        List<ContractProductBomVo> contractProductBomQuantitySum = contractProductBomService.getContractProductBomQuantitySum(IWrapper.getWrapper()
+                .eq("cp.id", task.getContractDetailId())
+                .ne("cpb.type", 3)//过滤掉工序的数据
+        );
+        for (ContractProductBomVo contractProductBomVo : contractProductBomQuantitySum) {
+            //计算排程需要的量
+            ContractProduct cpById = contractProductService.getById(contractProductBomVo.getContractProductId());
+            BigDecimal multiply = contractProductBomVo.getQuantity().divide(cpById.getQuantity()).multiply(BigDecimal.valueOf(dto.getQuantity()));
+
+            //创建待出库明细
+            Long stockWaitId = stockWait.getId();
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(stockWaitId);
+            stockWaitDetails.setReceiptQuantity(BigDecimal.ZERO);
+            stockWaitDetails.setContractDetailId(task.getContractDetailId());
+            stockWaitDetails.setProdOrderId(task.getProduceOrderId());
+            stockWaitDetails.setProdTaskId(task.getId());
+
+            stockWaitDetails.setProductId(contractProductBomVo.getMaterialId());
+            stockWaitDetails.setQuantity(multiply);
+            stockWaitDetails.setSchedulingId(dto.getId());
+
+            stockWaitDetailsList.add(stockWaitDetails);
+        }
+        stockWaitDetailsService.saveOrUpdateBatch(stockWaitDetailsList);
+    }
+
 }

+ 1 - 0
hx-mes/src/main/resources/mapper/production/ProduceOrderDetailMapper.xml

@@ -4,6 +4,7 @@
 
     <sql id="page">
         SELECT pod.id,
+               pod.code,
                pod.produce_order_id,
                pod.contract_id,
                pod.contract_detail_id,

+ 9 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockWait.java

@@ -62,10 +62,19 @@ public class StockWait extends BasePo {
      * 生产订单id
      */
     private Long prodOrderId;
+    /**
+     * 生产任务id
+     */
+    private Long prodTaskId;
 
     /**
      * 到货id
      */
     private Long arrivalId;
 
+    /**
+     * 排程id
+     */
+    private Long schedulingId;
+
 }

+ 5 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockWaitDetails.java

@@ -93,4 +93,9 @@ public class StockWaitDetails extends BasePo {
     @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM")
     private Date accountPeriod;
 
+    /**
+     * 排程id
+     */
+    private Long schedulingId;
+
 }