Browse Source

销售订单自动结清

yzc 11 months ago
parent
commit
3f0a61a440

+ 7 - 0
hx-sale/src/main/java/com/fjhx/sale/service/claim/impl/ClaimServiceImpl.java

@@ -20,6 +20,7 @@ import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.sale.mapper.claim.ClaimMapper;
 import com.fjhx.sale.service.claim.ClaimContractService;
 import com.fjhx.sale.service.claim.ClaimService;
+import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.core.domain.entity.SysDept;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -60,6 +61,8 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
     private ISysDeptService deptService;
     @Autowired
     private ISysUserService userService;
+    @Autowired
+    private ContractService contractService;
 
     @Override
     public Page<ClaimVo> getPage(ClaimSelectDto dto) {
@@ -257,6 +260,10 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
                 .set(BasePo::getUpdateTime, new Date())
         );
         ObsFileUtil.saveFile(dto.getFileList(), dto.getId(), 1);
+
+        //触发自动结清
+        List<Long> cIds = claimContractService.listObject(ClaimContract::getContractId, q -> q.eq(ClaimContract::getClaimId, claimInfo.getId()));
+        contractService.autoSettle(cIds);
     }
 
     @Override

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

@@ -235,6 +235,8 @@ public interface ContractService extends BaseService<Contract> {
      */
     void settle(ContractDto dto);
 
+    void autoSettle(List<Long> cIds);
+
     /**
      * 产品分析
      */

+ 11 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractOutboundInfoServiceImpl.java

@@ -2,6 +2,7 @@ package com.fjhx.sale.service.contract.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+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.file.utils.ObsFileUtil;
@@ -16,12 +17,15 @@ import com.fjhx.sale.entity.contract.vo.ContractOutboundRecordsVo;
 import com.fjhx.sale.mapper.contract.ContractOutboundInfoMapper;
 import com.fjhx.sale.service.contract.ContractOutboundInfoService;
 import com.fjhx.sale.service.contract.ContractOutboundRecordsService;
+import com.fjhx.sale.service.contract.ContractService;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.Collections;
 import java.util.List;
 
 
@@ -40,6 +44,8 @@ public class ContractOutboundInfoServiceImpl extends ServiceImpl<ContractOutboun
     private ContractOutboundRecordsService contractOutboundRecordsService;
     @Autowired
     private ProductInfoService productInfoService;
+    @Resource
+    private ContractService contractService;
 
     @Override
     public Page<ContractOutboundInfoVo> getPage(ContractOutboundInfoSelectDto dto) {
@@ -60,6 +66,7 @@ public class ContractOutboundInfoServiceImpl extends ServiceImpl<ContractOutboun
         return baseMapper.getList(wrapper);
     }
 
+    @DSTransactional
     @Override
     public void loadTruck(ContractOutboundInfoDto dto) {
         this.updateById(dto);
@@ -67,6 +74,10 @@ public class ContractOutboundInfoServiceImpl extends ServiceImpl<ContractOutboun
         contractOutboundRecordsService.updateBatchById(BeanUtil.copyToList(outboundRecordList, ContractOutboundRecords.class));
         ObsFileUtil.saveFile(dto.getFileList(), dto.getId(), 0);
         ObsFileUtil.saveFile(dto.getTruckFileList(), dto.getId(), 1);
+
+        //触发自动结清
+        ContractOutboundInfo byId = this.getById(dto.getId());
+        contractService.autoSettle(Collections.singletonList(byId.getContractId()));
     }
 
     @Override

+ 66 - 0
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -27,6 +27,7 @@ import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.entity.claim.ClaimContract;
+import com.fjhx.common.entity.claim.vo.ClaimContractVo;
 import com.fjhx.common.entity.contract.po.ContractTemplate;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.entity.documentary.bo.DocumentaryData;
@@ -2985,6 +2986,71 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
     }
 
     /**
+     * 自动结清
+     */
+    @Override
+    public void autoSettle(List<Long> cIds) {
+        List<Contract> list = contractService.list(q -> q.in(Contract::getId, cIds));
+
+        List<ContractProduct> cpList = contractProductService.list(q -> q.in(ContractProduct::getContractId, cIds));
+        List<Long> cpIds = cpList.stream().map(ContractProduct::getId).collect(Collectors.toList());
+        Map<Long, List<ContractProduct>> cpMap = cpList.stream().collect(Collectors.groupingBy(ContractProduct::getContractId));
+
+
+        //回款金额Map
+        List<ClaimContractVo> clList = claimContractService.getList(IWrapper.<ClaimContract>getWrapper()
+                .in("c.id", cIds)
+                .eq("cl.confirm_status", 1)
+        );
+        Map<Long, BigDecimal> clMoneyMap = clList.stream()
+                .collect(Collectors.groupingBy(ClaimContract::getContractId,
+                        Collectors.mapping(ClaimContract::getContractMoney, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))
+                );
+
+        //获取已装车数量
+        List<ContractOutboundRecordsVo> outRecordsList = contractOutboundRecordsService.getList(IWrapper.getWrapper()
+                .in("cor.contract_product_id", cpIds)
+        );
+        for (ContractOutboundRecordsVo contractOutboundRecordsVo : outRecordsList) {
+            if (ObjectUtil.isEmpty(contractOutboundRecordsVo.getTruckQuantity())) {
+                contractOutboundRecordsVo.setTruckQuantity(BigDecimal.ZERO);
+            }
+        }
+        Map<Long, BigDecimal> cpTruckMap = outRecordsList.stream()
+                .collect(Collectors.groupingBy(ContractOutboundRecords::getContractProductId,
+                        Collectors.mapping(ContractOutboundRecords::getTruckQuantity, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))
+                );
+
+        //触发自动结清,全部装车,全部回款
+        for (Contract contract : list) {
+            boolean flag = true;
+
+            List<ContractProduct> contractProductList = cpMap.get(contract.getId());
+            for (ContractProduct cp : contractProductList) {
+                //装车数量小于合同产品数量
+                BigDecimal truckQuantity = cpTruckMap.getOrDefault(cp.getId(), BigDecimal.ZERO);
+                if (truckQuantity.compareTo(cp.getQuantity()) < 0) {
+                    flag = false;
+                    break;
+                }
+            }
+
+            //回款金额小于合同金额
+            BigDecimal clMoney = clMoneyMap.getOrDefault(contract.getId(), BigDecimal.ZERO);
+            if (clMoney.compareTo(contract.getAmount()) < 0) {
+                flag = false;
+            }
+
+            //自动结清
+            if (flag) {
+                ContractDto contractDto = new ContractDto();
+                contractDto.setId(contract.getId());
+                contractService.settle(contractDto);
+            }
+        }
+    }
+
+    /**
      * 产品分析
      */
     @Override

+ 2 - 0
hx-sale/src/main/resources/mapper/claim/ClaimContractMapper.xml

@@ -12,6 +12,8 @@
                cc.create_time,
                cc.update_user,
                cc.update_time,
+               cc.money_cny,
+               cc.contract_money,
                c.`code`             AS contractCode,
                c.buy_corporation_id as contractBuyCorporationId,
                cl.business_id