|
@@ -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
|