yzc 1 سال پیش
والد
کامیت
32fce1b402

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

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

+ 10 - 3
hx-purchase/src/main/java/com/fjhx/purchase/mapper/subscribe/SubscribeDetailMapper.java

@@ -1,13 +1,13 @@
 package com.fjhx.purchase.mapper.subscribe;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
 import com.fjhx.purchase.entity.subscribe.vo.SubscribeDetailVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-import org.springframework.security.core.parameters.P;
 
 import java.util.List;
 
@@ -20,6 +20,7 @@ import java.util.List;
  * @author
  * @since 2023-04-03
  */
+@Mapper
 public interface SubscribeDetailMapper extends BaseMapper<SubscribeDetail> {
 
     /**
@@ -29,10 +30,16 @@ public interface SubscribeDetailMapper extends BaseMapper<SubscribeDetail> {
 
     /**
      * 根据IDS查询明细
+     *
      * @param ids
      * @return
      */
-    List<SubscribeDetailVo> getDetail(@Param("ids")List<Long> ids);
+    List<SubscribeDetailVo> getDetail(@Param("ids") List<Long> ids);
 
     List<SubscribeDetailVo> subscribeStatistics(@Param("ew") QueryWrapper<Object> query);
+
+    /**
+     * 根据id获取已采购数量
+     */
+    List<SubscribeDetail> getPurchaseCountByIds(List<Long> ids);
 }

+ 16 - 0
hx-purchase/src/main/resources/mapper/subscribe/SubscribeDetailMapper.xml

@@ -63,4 +63,20 @@
                  LEFT JOIN product_info pi ON sd.bussiness_id = pi.id
             ${ew.customSqlSegment}
     </select>
+    <select id="getPurchaseCountByIds" resultType="com.fjhx.purchase.entity.subscribe.po.SubscribeDetail">
+        SELECT
+        pp.subscribe_detail_id AS id,
+        sum( pp.quantity ) AS `Count`
+        FROM
+        ehsd_purchase_product pp
+        JOIN ehsd_purchase p ON pp.purchase_id = p.id
+        <where>
+            p.`status` IN ( 10, 30, 99 )
+            <foreach collection="ids" item="id" open="and pp.subscribe_detail_id IN (" separator="," close=")">
+                #{id}
+            </foreach>
+        </where>
+        GROUP BY
+        pp.subscribe_detail_id
+    </select>
 </mapper>

+ 5 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/contract/po/ContractProductBom.java

@@ -76,6 +76,11 @@ public class ContractProductBom extends BasePo {
     private Integer type;
 
     /**
+     * 合同id
+     */
+    private Long contractId;
+
+    /**
      * 合同产品表id
      */
     private Long contractProductId;

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

@@ -7,14 +7,21 @@ 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.enums.ProductAvailableRecordType;
+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.mapper.subscribe.SubscribeDetailMapper;
+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;
@@ -34,9 +41,12 @@ import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 外销合同流程
@@ -56,9 +66,15 @@ public class ContractFlow extends FlowDelegate {
     @Autowired
     private ContractProjectService contractProjectService;
     @Autowired
-    private FtpFileService ftpFileService;
-    @Autowired
     private ContractProductBomService contractProductBomService;
+    @Autowired
+    private SubscribeDetailService subscribeDetailService;
+    @Autowired
+    private SubscribeDetailMapper subscribeDetailMapper;
+    @Autowired
+    private ProductStockInfoService productStockInfoService;
+    @Autowired
+    private ProductInfoService productInfoService;
 
     @Override
     public String getFlowKey() {
@@ -157,6 +173,7 @@ public class ContractFlow extends FlowDelegate {
             //赋值产品BOM信息
             List<ContractProductBom> contractProductBomList = cp.getContractProductBomList();
             for (ContractProductBom contractProductBom : contractProductBomList) {
+                contractProductBom.setContractId(contract.getId());
                 contractProductBom.setContractProductId(cp.getId());
                 contractProductBom.setProductId(cp.getProductId());
             }
@@ -218,13 +235,63 @@ public class ContractFlow extends FlowDelegate {
     @Override
     public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
         super.cancellation(flowId, businessId, flowStatus);
+
+        Contract contract = contractService.getById(businessId);
+
         contractService.update(q -> q
                 .eq(Contract::getId, businessId)
                 .set(Contract::getStatus, FlowStatusEnum1.CANCELLATION.getKey())
                 .set(BasePo::getUpdateTime, new Date())
                 .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
         );
+
     }
 
+    //合同作废修改可用库存
+    private void contractCancelEditAvailableQuantity(Contract contract) {
+        Long businessId = contract.getId();
+        //可用库存=可用库存-((待采购量-已采购量)-合同量)
+        List<SubscribeDetail> subscribeDetailList = subscribeDetailService.list(q -> q.eq(SubscribeDetail::getContractId, businessId));
+
+        //获取物料id
+        List<Long> materialIds = subscribeDetailList.stream().map(SubscribeDetail::getProductId).collect(Collectors.toList());
+
+        List<ContractProductBom> contractProductBomList = contractProductBomService.list(q -> q
+                .eq(ContractProductBom::getContractId, businessId)
+                .in(ContractProductBom::getMaterialId, materialIds)
+        );
+        Map<Long, List<ContractProductBom>> contractProductBomMap = contractProductBomList.stream().collect(Collectors.groupingBy(ContractProductBom::getMaterialId));
+        //获取已采购数量
+        List<Long> sdIds = subscribeDetailList.stream().map(SubscribeDetail::getId).collect(Collectors.toList());
+        List<SubscribeDetail> purchaseCountByIds = subscribeDetailMapper.getPurchaseCountByIds(sdIds);
+        Map<Long, BigDecimal> purchaseCountMap = purchaseCountByIds.stream().collect(Collectors.toMap(SubscribeDetail::getId, SubscribeDetail::getCount));
+
+        List<InOutBo> inOutBoList = new ArrayList<>();
+
+        for (SubscribeDetail subscribeDetail : subscribeDetailList) {
+            Long materialId = subscribeDetail.getProductId();
+            //作废待采购
+            subscribeDetail.setStatus(88);
+            BigDecimal purchaseCount = purchaseCountMap.getOrDefault(subscribeDetail.getId(), BigDecimal.ZERO);
+            //(待采购量-已采购量)
+            BigDecimal subtract = subscribeDetail.getCount().subtract(purchaseCount);
+            //获取合同量
+            List<ContractProductBom> contractProductBomList1 = contractProductBomMap.get(materialId);
+            BigDecimal reduce = contractProductBomList1.stream().map(ContractProductBom::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+            //((待采购量-已采购量)-合同量)
+            InOutBo inOutBo = new InOutBo();
+            inOutBo.setProductId(materialId);
+            inOutBo.setQuantity(subtract.subtract(reduce));
+            inOutBoList.add(inOutBo);
+        }
+
+        //修改可用库存可用库存=可用库存-((待采购量-已采购量)-合同量)
+        productInfoService.editAvailableQuantity(
+                inOutBoList,
+                InOutType.OUT,
+                businessId,
+                ProductAvailableRecordType.SALE_CANCEL, contract.getCompanyId()
+        );
+    }
 
 }

+ 29 - 26
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java

@@ -22,6 +22,7 @@ import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
 import com.fjhx.purchase.entity.subscribe.enums.SubscribeDetailStatusEnum;
 import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
+import com.fjhx.purchase.mapper.subscribe.SubscribeDetailMapper;
 import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.purchase.dto.EhsdPurchaseDto;
@@ -49,10 +50,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -89,6 +87,8 @@ public class EhsdPurchaseFlow extends FlowDelegate {
     private StockWaitService stockWaitService;
     @Autowired
     private StockWaitDetailsService stockWaitDetailsService;
+    @Autowired
+    private SubscribeDetailMapper subscribeDetailMapper;
 
     @Override
     public String getFlowKey() {
@@ -105,6 +105,11 @@ public class EhsdPurchaseFlow extends FlowDelegate {
     @Override
     public Long start(Long flowId, JSONObject submitData) {
         EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
+
+        if (ObjectUtil.isEmpty(purchase.getCurrency())) {
+            purchase.setCurrency("CNY");
+        }
+
         purchase.setId(null);//清空id防止前端误传
         purchase.setFlowId(flowId);//赋值流程id
         purchase.setProcessInstanceId(getFlowKey());//赋值流程key
@@ -146,6 +151,7 @@ public class EhsdPurchaseFlow extends FlowDelegate {
 
         //回传单号给流程引擎
         submitData.put("code", purchase.getCode());
+        submitData.put("currency", purchase.getCurrency());
 
         return purchase.getId();
     }
@@ -225,30 +231,27 @@ public class EhsdPurchaseFlow extends FlowDelegate {
         purchase.setApprovedDate(new Date());
         purchaseService.updateById(purchase);
 
-        if (Objects.equals(purchase.getDataResource(), 0)) {
-            //修改申购明细状态
-            List<EhsdPurchaseProduct> purchaseDetailList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId));
-            List<Long> subscribeDetailIds = purchaseDetailList.stream().map(EhsdPurchaseProduct::getSubscribeDetailId).collect(Collectors.toList());
-
-            List<SubscribeDetail> subscribeDetails = subscribeDetailService.listByIds(subscribeDetailIds);
-            for (SubscribeDetail subscribeDetail : subscribeDetails) {
-                //获取申购明细下的所有采购记录 计算已采购数
-                List<EhsdPurchaseProduct> purchaseDetails = purchaseProductService.list(q -> q
-                        .eq(EhsdPurchaseProduct::getSubscribeDetailId,
-                                subscribeDetail.getId()).eq(EhsdPurchaseProduct::getProductId, subscribeDetail.getProductId()));
-                BigDecimal count = purchaseDetails.stream()
-                        .map(EhsdPurchaseProduct::getQuantity)
-                        .reduce(BigDecimal.ZERO, BigDecimal::add);
-                if (count.compareTo(subscribeDetail.getCount()) >= 0) {
-                    //修改为已采购
-                    subscribeDetail.setStatus(SubscribeDetailStatusEnum.PURCHASED.getKey());
-                } else {
-                    //修改为部分采购
-                    subscribeDetail.setStatus(SubscribeDetailStatusEnum.LITT_PAID_AMOUNT.getKey());
-                }
+        //修改申购明细状态
+        List<Long> subscribeDetailIds = purchaseProductService.listObject(EhsdPurchaseProduct::getSubscribeDetailId, q -> q
+                .eq(EhsdPurchaseProduct::getPurchaseId, businessId)
+        );
+        //获取已采购数量
+        List<SubscribeDetail> purchaseCountByIds = subscribeDetailMapper.getPurchaseCountByIds(subscribeDetailIds);
+        Map<Long, BigDecimal> purchaseCountMap = purchaseCountByIds.stream().collect(Collectors.toMap(SubscribeDetail::getId, SubscribeDetail::getCount));
+        //修改状态
+        List<SubscribeDetail> subscribeDetails = subscribeDetailService.listByIds(subscribeDetailIds);
+        for (SubscribeDetail subscribeDetail : subscribeDetails) {
+            //获取已采购数并计算状态
+            BigDecimal count = purchaseCountMap.getOrDefault(subscribeDetail.getId(), BigDecimal.ZERO);
+            if (count.compareTo(subscribeDetail.getCount()) >= 0) {
+                //修改为已采购
+                subscribeDetail.setStatus(SubscribeDetailStatusEnum.PURCHASED.getKey());
+            } else {
+                //修改为部分采购
+                subscribeDetail.setStatus(SubscribeDetailStatusEnum.LITT_PAID_AMOUNT.getKey());
             }
-            subscribeDetailService.updateBatchById(subscribeDetails);
         }
+        subscribeDetailService.updateBatchById(subscribeDetails);
 
 
         List<InOutBo> inOutBoList = new ArrayList<>();