Parcourir la source

销售合同变更

yzc il y a 1 an
Parent
commit
8783150a2b

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

@@ -13,7 +13,8 @@ public enum ProductAvailableRecordType {
     SALE_PASS(4, "销售合同通过"),
     HAND_IN(5, "手动入库"),
     HAND_OUT(6, "手动出库"),
-    SALE_CANCEL(7, "销售合同作废");
+    SALE_CANCEL(7, "销售合同作废"),
+    SALE_UPDATE(8, "销售合同变更");
 
     /**
      * 类型

+ 47 - 0
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -475,6 +475,53 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
                         throw new ServiceException("新采购量小于已入库数据,禁止变更!");
                     }
                 }
+            }
+            //合同变更
+            else if (ProductAvailableRecordType.SALE_UPDATE.equals(businessType)) {
+                BigDecimal newQuantity = inOutBo.getNewQuantity();
+
+                //后>前 可用=可用+(后-前)
+                if (newQuantity.compareTo(inOutBo.getQuantity()) > 0) {
+                    BigDecimal subtract = newQuantity.subtract(inOutBo.getQuantity());
+                    productStockInfoService.update(q -> q
+                            .eq(ProductStockInfo::getId, productStockInfoId)
+                            .setSql("available_quantity = available_quantity + " + subtract)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                }
+                //后<前
+                else if (newQuantity.compareTo(inOutBo.getQuantity()) < 0) {
+
+                    BigDecimal count = BigDecimal.ZERO;
+
+                    //后>已采购 可用=可用-(后-已采)
+                    if (newQuantity.compareTo(inOutBo.getInStockQuantity()) > 0) {
+                        BigDecimal subtract = newQuantity.subtract(inOutBo.getInStockQuantity());
+
+                        //计算可用库存
+                        availableQuantity = availableQuantity.subtract(subtract);
+                    }
+                    //后<已采购 可用=可用-(前-已采)
+                    if (newQuantity.compareTo(inOutBo.getInStockQuantity()) < 0) {
+                        BigDecimal subtract = inOutBo.getQuantity().subtract(inOutBo.getInStockQuantity());
+
+                        //计算可用库存
+                        availableQuantity = availableQuantity.subtract(subtract);
+                    }
+
+                    if (availableQuantity.compareTo(BigDecimal.ZERO) < 0) {
+                        availableQuantity = BigDecimal.ZERO;
+                    }
+
+                    BigDecimal finalAvailableQuantity = availableQuantity;
+                    productStockInfoService.update(q -> q
+                            .eq(ProductStockInfo::getId, productStockInfoId)
+                            .set(ProductStockInfo::getAvailableQuantity, finalAvailableQuantity)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                }
             } else {
                 throw new ServiceException("未知操作类型,请联系管理员!");
             }

+ 178 - 5
hx-sale/src/main/java/com/fjhx/sale/flow/ContractUpdateFlow.java

@@ -3,28 +3,43 @@ package com.fjhx.sale.flow;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.enums.FlowStatusEnum1;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.common.utils.Utils;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
+import com.fjhx.item.enums.ProductAvailableRecordType;
+import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
+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;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
+import com.fjhx.sale.entity.contract.po.ContractProductBom;
 import com.fjhx.sale.entity.contract.po.ContractProject;
+import com.fjhx.sale.entity.contract.vo.ContractProductBomVo;
+import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct;
+import com.fjhx.sale.entity.purchase.vo.EhsdPurchaseProductVo;
+import com.fjhx.sale.mapper.purchase.EhsdPurchaseProductMapper;
+import com.fjhx.sale.service.contract.ContractProductBomService;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.contract.ContractProjectService;
 import com.fjhx.sale.service.contract.ContractService;
+import com.fjhx.sale.service.purchase.EhsdPurchaseProductService;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.Date;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -41,9 +56,18 @@ public class ContractUpdateFlow extends FlowDelegate {
 
     @Autowired
     private ContractProductService contractProductService;
-
+    @Autowired
+    private ContractProductBomService contractProductBomService;
     @Autowired
     private ContractProjectService contractProjectService;
+    @Autowired
+    private ProductInfoService productInfoService;
+    @Autowired
+    private EhsdPurchaseProductService ehsdPurchaseProductService;
+    @Autowired
+    private EhsdPurchaseProductMapper ehsdPurchaseProductMapper;
+    @Autowired
+    private SubscribeDetailService subscribeDetailService;
 
     @Override
     public String getFlowKey() {
@@ -56,8 +80,11 @@ public class ContractUpdateFlow extends FlowDelegate {
     @Override
     public Long start(Long flowId, JSONObject submitData) {
         ContractDto contract = submitData.toJavaObject(ContractDto.class);
-        //清理ID字段防止误传
+        Assert.notEmpty(contract.getId(), "原销售订单id不能为空");
+        //赋值原采购id 并 清空id
+        contract.setOldContractId(contract.getId());
         contract.setId(null);
+
         //赋值流程id
         contract.setFlowId(flowId);
 
@@ -79,8 +106,29 @@ public class ContractUpdateFlow extends FlowDelegate {
         contract.setCode(Utils.getNewCode(oldContract.getCode()));
         contract.setIsShow(1);//隐藏当前数据
 
+        //清理明细id
+        List<ContractProductDto> contractProductList = contract.getContractProductList();
+        List<ContractProject> contractProjectList = contract.getContractProjectList();
+
+        //防止空指针
+        contractProductList = ObjectUtils.isEmpty(contractProductList) ? new ArrayList<>() : contractProductList;
+        contractProjectList = ObjectUtils.isEmpty(contractProjectList) ? new ArrayList<>() : contractProjectList;
+
+        //清空bomId
+        for (ContractProductDto contractProductDto : contractProductList) {
+            List<ContractProductBom> contractProductBomList = contractProductDto.getContractProductBomList();
+            contractProductBomList = ObjectUtils.isEmpty(contractProductBomList) ? new ArrayList<>() : contractProductBomList;
+            contractProductBomList.forEach(item -> item.setId(null));
+        }
+
+        //清空id
+        contractProductList.forEach(item -> item.setId(null));
+        contractProjectList.forEach(item -> item.setId(null));
+
+
         //调用合同发起通用代码
-        return contractFlow.start(contract);
+        Long start = contractFlow.start(contract);
+        return start;
     }
 
     /**
@@ -88,11 +136,31 @@ public class ContractUpdateFlow extends FlowDelegate {
      */
     @Override
     public void end(Long flowId, Long businessId, JSONObject submitData) {
+
         // 通过业务ID查询合同数据
         Contract newContract = contractService.getById(businessId);
         Long oldContractId = newContract.getOldContractId();
+
+
         Contract oldContract = contractService.getById(oldContractId);
 
+        //修改采购状态为审批通过
+        newContract.setStatus(PurchaseStatusEnum.PASS.getKey());
+        newContract.setApprovedDate(new Date());
+        contractService.updateById(newContract);
+
+        //原合同改为 已变更
+        oldContract.setStatus(FlowStatusEnum1.UPDATE.getKey());
+        contractService.updateById(oldContract);
+
+
+        //----------修改可用库存---------
+        if (Objects.equals(1, oldContract.getOrderDistributeStatus())) {
+
+            editAvailableStock(oldContract, oldContractId, businessId);
+        }
+        //-----------------
+
         //替换新数据ID为临时ID
         long temNewId = IdWorker.getId();
         Contract temNewUpContract = new Contract();
@@ -155,6 +223,111 @@ public class ContractUpdateFlow extends FlowDelegate {
             contractProjectService.update(Wrappers.<ContractProject>update().lambda().set(ContractProject::getContractId, businessId).in(ContractProject::getId, oldContractProjectIds));
         }
         ObsFileUtil.exchangeBusinessId(oldContractId, businessId);
+
+        throw new ServiceException("111111111111111111");
+    }
+
+    void editAvailableStock(Contract oldContract, Long oldContractId, Long businessId) {
+        //---------------------------------------------------------------
+        List<ContractProductBomVo> oldProductBomListSum = contractProductBomService.getContractProductBomQuantitySum(oldContractId);
+
+        //获取新合同物料数量Map
+        List<ContractProductBomVo> contractProductBomQuantitySum = contractProductBomService.getContractProductBomQuantitySum(businessId);
+        Map<Long, BigDecimal> newQuantityMap = contractProductBomQuantitySum.stream().collect(Collectors.toMap(ContractProductBom::getMaterialId, ContractProductBom::getQuantity));
+
+
+        List<AvailableStockBo> availableStockBoList = new ArrayList<>();
+
+        //获取原合同已采购数量
+        List<EhsdPurchaseProductVo> purchaseQuantitySumByContractId = ehsdPurchaseProductMapper.getPurchaseQuantitySumByContractId(oldContractId);
+        Map<Long, BigDecimal> collect = purchaseQuantitySumByContractId.stream().collect(Collectors.toMap(EhsdPurchaseProduct::getProductId, EhsdPurchaseProduct::getQuantity));
+
+        //旧数据处理
+        for (ContractProductBomVo oldContractProductBom : oldProductBomListSum) {
+            Long materialId = oldContractProductBom.getMaterialId();
+
+            //新数量
+            BigDecimal newQuantity = newQuantityMap.get(materialId);
+            //已采购数量
+            BigDecimal purchaseQuantity = collect.getOrDefault(materialId, BigDecimal.ZERO);
+
+
+            //生成操作可用库存的实体
+            AvailableStockBo availableStockBo = new AvailableStockBo();
+            availableStockBo.setProductId(materialId);
+            availableStockBo.setQuantity(oldContractProductBom.getQuantity());
+            availableStockBo.setNewQuantity(newQuantity);
+            availableStockBo.setInStockQuantity(purchaseQuantity);
+
+            availableStockBoList.add(availableStockBo);
+
+
+            //操作待采购数据
+            SubscribeDetail subscribeDetail = subscribeDetailService.getOne(q -> q.eq(SubscribeDetail::getContractId, oldContractId)
+                    .eq(SubscribeDetail::getProductId, materialId)
+            );
+            if (ObjectUtils.isEmpty(newQuantity)) {
+                //原数据被删,检查已采购数量
+                if (ObjectUtils.isEmpty(purchaseQuantity)) {
+                    subscribeDetailService.removeById(subscribeDetail);
+                } else {
+                    subscribeDetailService.update(q -> q
+                            .eq(SubscribeDetail::getContractId, oldContractId)
+                            .eq(SubscribeDetail::getProductId, materialId)
+                            .set(SubscribeDetail::getCount, BigDecimal.ZERO)
+                    );
+                }
+            } else {
+                subscribeDetail.setCount(newQuantity);
+
+                //计算状态
+                int status = purchaseQuantity.compareTo(newQuantity) >= 0 ? 20 : 30;
+                if (purchaseQuantity.compareTo(BigDecimal.ZERO) == 0) {
+                    status = 15;
+                }
+                subscribeDetail.setStatus(status);
+                subscribeDetailService.updateById(subscribeDetail);
+            }
+
+        }
+
+        //新添加的数据处理
+        Map<Long, BigDecimal> oldQuantityMap = oldProductBomListSum.stream().collect(Collectors.toMap(ContractProductBom::getMaterialId, ContractProductBom::getQuantity));
+        for (ContractProductBomVo newPurchaseProduct : contractProductBomQuantitySum) {
+            Long materialId = newPurchaseProduct.getMaterialId();
+
+            BigDecimal bigDecimal = oldQuantityMap.get(materialId);
+            //忽略掉变更前有的物料
+            if (ObjectUtils.isNotEmpty(bigDecimal)) {
+                continue;
+            }
+
+            //生成操作可用库存的实体
+            AvailableStockBo availableStockBo = new AvailableStockBo();
+            availableStockBo.setProductId(materialId);
+            availableStockBo.setQuantity(null);
+            availableStockBo.setNewQuantity(newPurchaseProduct.getQuantity());
+            availableStockBo.setInStockQuantity(null);
+            availableStockBoList.add(availableStockBo);
+
+
+            //生成待采购
+            SubscribeDetail subscribeDetail = new SubscribeDetail();
+            subscribeDetail.setProductId(materialId);
+            subscribeDetail.setCount(newPurchaseProduct.getQuantity());
+            subscribeDetail.setStatus(15);//待采购
+            subscribeDetail.setContractId(oldContractId);
+            subscribeDetail.setDataType(1);
+            subscribeDetail.setCompanyId(oldContract.getCompanyId());
+
+            subscribeDetailService.save(subscribeDetail);
+        }
+
+
+        //修改可用库存
+        productInfoService.editAvailableQuantity(availableStockBoList, businessId, ProductAvailableRecordType.SALE_UPDATE, oldContract.getCompanyId());
+
+        //---------------------------------------------------------------
     }
 
 

+ 1 - 0
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java

@@ -206,6 +206,7 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
         //修改可用库存
         productInfoService.editAvailableQuantity(availableStockBoList, businessId, ProductAvailableRecordType.PURCHASE_UPDATE, purchase.getCompanyId());
 
+//----------------------------------------------------------------------------
 
         Long oldPurchaseId = purchase.getOldPurchaseId();
 

+ 7 - 4
hx-sale/src/main/java/com/fjhx/sale/mapper/purchase/EhsdPurchaseProductMapper.java

@@ -5,11 +5,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct;
 import com.fjhx.sale.entity.purchase.vo.EhsdPurchaseProductVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
-import java.math.BigDecimal;
 import java.util.List;
-import java.util.Map;
 
 
 /**
@@ -20,6 +19,7 @@ import java.util.Map;
  * @author
  * @since 2023-05-17
  */
+@Mapper
 public interface EhsdPurchaseProductMapper extends BaseMapper<EhsdPurchaseProduct> {
 
     /**
@@ -43,12 +43,15 @@ public interface EhsdPurchaseProductMapper extends BaseMapper<EhsdPurchaseProduc
 
     /**
      * 根据合同ID查询采购产品列表
+     *
      * @param contractId
      * @return
      */
     List<EhsdPurchaseProductVo> getListByContractId(Long contractId);
 
-    boolean updatePurchaseId(@Param("id")Long id ,@Param("newId")Long newId,@Param("userId")Long userId);
 
-    List<EhsdPurchaseProduct>getPurchaseProductByContractProductIds(List<Long> dataResourceIds);
+    List<EhsdPurchaseProduct> getPurchaseProductByContractProductIds(List<Long> dataResourceIds);
+
+    List<EhsdPurchaseProductVo> getPurchaseQuantitySumByContractId(Long contractId);
+
 }

+ 2 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/ContractProductBomService.java

@@ -19,4 +19,6 @@ import java.util.List;
 public interface ContractProductBomService extends BaseService<ContractProductBom> {
 
     List<ContractProductBomVo> getList(ContractProductBomDto dto);
+
+    List<ContractProductBomVo> getContractProductBomQuantitySum(Long contractId);
 }

+ 6 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractProductBomServiceImpl.java

@@ -42,4 +42,10 @@ public class ContractProductBomServiceImpl extends ServiceImpl<ContractProductBo
         return contractProductBomVoList;
     }
 
+    @Override
+    public List<ContractProductBomVo> getContractProductBomQuantitySum(Long contractId) {
+        List<ContractProductBomVo> contractProductBomQuantitySum = baseMapper.getContractProductBomQuantitySum(contractId);
+        return contractProductBomQuantitySum;
+    }
+
 }

+ 7 - 4
hx-sale/src/main/resources/mapper/contract/ContractProductBomMapper.xml

@@ -1,13 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.sale.mapper.contract.ContractProductBomMapper">
-    <select id="getContractProductBomQuantitySum" resultType="com.fjhx.sale.entity.contract.vo.ContractProductBomVo">
-        SELECT sum(cpb.quantity * cp.quantity) AS quantity,
+    <select id="getContractProductBomQuantitySum"
+            resultType="com.fjhx.sale.entity.contract.vo.ContractProductBomVo">
+        SELECT cpb.contract_id,
+               cpb.material_id,
+               sum(cpb.quantity * cp.quantity) AS quantity,
                cpb.*
         FROM contract_product_bom cpb
                  LEFT JOIN contract_product cp ON cpb.contract_product_id = cp.id
         WHERE cpb.contract_id = #{contractId}
-        GROUP BY contract_id,
-                 material_id
+        GROUP BY cpb.contract_id,
+                 cpb.material_id
     </select>
 </mapper>

+ 31 - 22
hx-sale/src/main/resources/mapper/purchase/EhsdPurchaseProductMapper.xml

@@ -1,23 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.sale.mapper.purchase.EhsdPurchaseProductMapper">
-    <update id="updatePurchaseId"></update>
     <select id="getPage" resultType="com.fjhx.sale.entity.purchase.vo.EhsdPurchaseProductVo">
-        select
-            epp.id,
-            epp.purchase_id,
-            epp.product_id,
-            epp.product_name,
-            epp.product_model,
-            epp.quantity,
-            epp.price,
-            epp.amount,
-            epp.remark,
-            epp.json,
-            epp.create_user,
-            epp.create_time,
-            epp.update_user,
-            epp.update_time
+        select epp.id,
+               epp.purchase_id,
+               epp.product_id,
+               epp.product_name,
+               epp.product_model,
+               epp.quantity,
+               epp.price,
+               epp.amount,
+               epp.remark,
+               epp.json,
+               epp.create_user,
+               epp.create_time,
+               epp.update_user,
+               epp.update_time
         from ehsd_purchase_product epp
             ${ew.customSqlSegment}
     </select>
@@ -78,15 +76,26 @@
     </select>
     <select id="getPurchaseProductByContractProductIds" resultType="com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct">
         SELECT
-            pp.*
+        pp.*
         FROM
-            ehsd_purchase_product pp
-                LEFT JOIN ehsd_purchase p ON pp.purchase_id = p.id
+        ehsd_purchase_product pp
+        LEFT JOIN ehsd_purchase p ON pp.purchase_id = p.id
         WHERE
-            (p.`status` = 30
-           OR p.`status` = 10)
-        <foreach collection="dataResourceIds" item="dataResourceId" open="AND pp.data_resource_id IN (" separator="," close=")">
+        (p.`status` = 30
+        OR p.`status` = 10)
+        <foreach collection="dataResourceIds" item="dataResourceId" open="AND pp.data_resource_id IN (" separator=","
+                 close=")">
             #{dataResourceId}
         </foreach>
     </select>
+    <select id="getPurchaseQuantitySumByContractId"
+            resultType="com.fjhx.sale.entity.purchase.vo.EhsdPurchaseProductVo">
+        SELECT epp.product_id,
+               sum(epp.quantity) AS quantity
+        FROM ehsd_purchase_product epp
+                 LEFT JOIN ehsd_purchase ep ON epp.purchase_id = ep.id
+        WHERE ep.`status` IN (10, 30)
+          AND ep.data_resource_id = #{contractId}
+        GROUP BY epp.product_id
+    </select>
 </mapper>