shiyunteng
2026-08-27 b1b3da5393c75ced1afa1467be69d60af5403878
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
@@ -12,6 +12,7 @@
import com.by4cloud.platformx.business.dto.OutSubjectMatterAddDTO;
import com.by4cloud.platformx.business.entity.*;
import com.by4cloud.platformx.business.mapper.*;
import com.by4cloud.platformx.business.service.ContractPaymentScheduleProcessService;
import com.by4cloud.platformx.business.service.OutBoundService;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.security.util.SecurityUtils;
@@ -46,6 +47,7 @@
   private final ContractOutBoundMapper contractOutBoundMapper;
   private final DeliveryOverdueMapper deliveryOverdueMapper;
   private final StringRedisTemplate redisTemplate;
   private final ContractPaymentScheduleProcessService processService;
   @Value("${dept.smj}")
   private String smj;
@@ -469,6 +471,162 @@
   @Override
   public R addContractOut(OutBoundAddDTO addDTO) {
      //校验参数
      R<Contract> r = vailParam(addDTO);
      if (!r.isOk()){
         return r;
      }
      Contract contract = r.getData();
      //出库
      handleOutBound(contract,addDTO);
      //保存资金明细
      BigDecimal outBoundAmount = savePaymentConfirm(contract,addDTO);
      //更新合同状态及阶段
      contract.setOutBoundAmout(outBoundAmount);
      updateContractSchedule(contract);
      return R.ok();
   }
   private void updateContractSchedule(Contract contract) {
      List<ContractSubjectMatter> unComOutList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
            .eq(ContractSubjectMatter::getContractId, contract.getId())
            .ne(ContractSubjectMatter::getDeliveryStatus, 2));
      if (CollUtil.isEmpty(unComOutList)){
         contract.setNextScheduleName("货到签收");
      }
      contract.setBillingStatus("2");
      contractMapper.updateById(contract);
   }
   private BigDecimal savePaymentConfirm(Contract contract,OutBoundAddDTO addDTO) {
      //查询合同是否有出库阶段
      ContractPaymentSchedule schedule = scheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contract.getId())
            .eq(ContractPaymentSchedule::getStageName, "发货前").gt(ContractPaymentSchedule::getPaymentRatio,0).last("limit 1"));
      if (ObjUtil.isNull(schedule.getEffectiveDate())&&ObjUtil.isNull(schedule.getEffectiveEndDate())){
         schedule.setEffectiveDate(addDTO.getOutBoundTime());
         schedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getOutBoundTime(),schedule.getAgreedDays()));
         scheduleMapper.updateById(schedule);
      }
      BigDecimal outAmount = new BigDecimal("0");
      //计算出库价格
      for (OutSubjectMatterAddDTO outSubjectMatterAddDTO : addDTO.getSubjectMatterList()) {
         ContractSubjectMatter subjectMatter = contractSubjectMatterMapper.selectOne(Wrappers.<ContractSubjectMatter>lambdaQuery()
               .eq(ContractSubjectMatter::getContractId, contract.getId())
               .eq(ContractSubjectMatter::getMaterialCode, outSubjectMatterAddDTO.getSubjectMatterCode())
               .eq(StrUtil.isNotBlank(outSubjectMatterAddDTO.getLineNo()),ContractSubjectMatter::getLineNo, outSubjectMatterAddDTO.getLineNo())
               .last("limit 1"));
         outAmount = outAmount.add(outSubjectMatterAddDTO.getOutBoundNum().multiply(subjectMatter.getUnitPrice()));
      }
      //存在发货前收款阶段
      if (ObjUtil.isNotNull(schedule)) {
         //新增当前阶段应收
         PaymentConfirm currentConfim = new PaymentConfirm();
         currentConfim.setBusinessType(schedule.getStageName() + "应收");
         currentConfim.setBusGuestId(contract.getPartyAId());
         currentConfim.setBusGuestName(contract.getPartyA());
         currentConfim.setContractId(contract.getId());
         currentConfim.setContractName(contract.getContractName());
         currentConfim.setContractNo(contract.getContractNo());
         currentConfim.setScheduleId(schedule.getId());
         currentConfim.setScheduleName(schedule.getStageName());
         currentConfim.setConfirmTime(addDTO.getOutBoundTime());
         //按出库比例计算应收
         currentConfim.setTransationAmount(schedule.getPlannedAmount().multiply(outAmount.divide(contract.getAmount(),2,RoundingMode.HALF_UP)));
         currentConfim.setReceivableAmount(currentConfim.getTransationAmount());
         PaymentConfirm lastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
               .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
         if (ObjUtil.isNotNull(lastConfirm)) {
            currentConfim.setTotalAmount(lastConfirm.getTotalAmount().subtract(currentConfim.getTransationAmount()));
            if (contract.getContractNo().startsWith("ZB-")) {
               paymentConfirmMapper.insert(currentConfim);
            }
            return outAmount;
         }
         currentConfim.setTotalAmount(currentConfim.getTransationAmount().multiply(new BigDecimal("-1")));
         paymentConfirmMapper.insert(currentConfim);
         //历史资金余额
         processService.handleBeforeRemain(currentConfim,contract);
      }
      return outAmount;
   }
   private void handleOutBound(Contract contract, OutBoundAddDTO addDTO) {
      addDTO.getSubjectMatterList().stream().forEach(outSubjectMatterAddDTO -> {
         ContractSubjectMatter subjectMatter = contractSubjectMatterMapper.selectOne(Wrappers.<ContractSubjectMatter>lambdaQuery()
               .eq(ContractSubjectMatter::getContractId, contract.getId())
               .eq(ContractSubjectMatter::getMaterialCode, outSubjectMatterAddDTO.getSubjectMatterCode())
               .ne(ContractSubjectMatter::getDeliveryStatus, 2)
               .eq(StrUtil.isNotEmpty(outSubjectMatterAddDTO.getLineNo()), ContractSubjectMatter::getLineNo, outSubjectMatterAddDTO.getLineNo())
               .last("limit 1"));
         if (ObjUtil.isNull(subjectMatter)) {
            return;
         }
         subjectMatter.setLastDeliveredQuantity(outSubjectMatterAddDTO.getOutBoundNum());
         outSubjectMatterAddDTO.setUnitPrice(subjectMatter.getUnitPrice());
         if (subjectMatter.getDeliveryStatus() == 0) {
            subjectMatter.setDeliveredQuantity(outSubjectMatterAddDTO.getOutBoundNum());
            subjectMatter.setRemainingQuantity(subjectMatter.getQuantity().subtract(outSubjectMatterAddDTO.getOutBoundNum()));
         }
         if (subjectMatter.getDeliveryStatus() == 1) {
            subjectMatter.setDeliveredQuantity(subjectMatter.getDeliveredQuantity().add(outSubjectMatterAddDTO.getOutBoundNum()));
            subjectMatter.setRemainingQuantity(subjectMatter.getRemainingQuantity().subtract(outSubjectMatterAddDTO.getOutBoundNum()));
         }
         subjectMatter.setDeliveryStatus(1);
         if (subjectMatter.getRemainingQuantity().compareTo(new BigDecimal("0")) == 0) {
            subjectMatter.setDeliveryStatus(2);
         }
         subjectMatter.setActualDeliveryDate(addDTO.getOutBoundTime());
         contractSubjectMatterMapper.updateById(subjectMatter);
         //保存erp出库
         String batchNumber = genBatchNumber();
         Long outBoundId = saveErpOutBound(contract,addDTO,outSubjectMatterAddDTO,batchNumber);
         //保存合同出库记录
         saveContractOutBound(contract, addDTO, subjectMatter, outBoundId);
      });
   }
   private String genBatchNumber() {
      if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smj) || StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjsc) ||
            StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjzt)) {
         return generateSMJContractCKNo();
      }
      if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb)) {
         return generateGYBContractCKNo();
      }
      if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", ymj)) {
         return generateYMJContractCKNo();
      }
      if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", tfgs)) {
         return generateTFContractCKNo();
      }
      if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", jxc)) {
         return generateJXCContractCKNo();
      }
      return "";
   }
   private Long saveErpOutBound(Contract contract, OutBoundAddDTO addDTO,OutSubjectMatterAddDTO outSubjectMatterAddDTO,String batchNumber) {
      OutBound outBound = new OutBound();
      outBound.setBatchNumber(batchNumber);
      outBound.setOutBoundNum(outSubjectMatterAddDTO.getOutBoundNum());
      outBound.setOutBoundAttNames(addDTO.getOutBoundAttNames());
      outBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths());
      outBound.setBusGuestName(contract.getPartyA());
      outBound.setBusGuestId(contract.getPartyAId());
      outBound.setOutBoundTime(ObjUtil.isNotNull(addDTO.getOutBoundTime()) ? addDTO.getOutBoundTime() : new Date());
      outBound.setSubjectMatterCode(outSubjectMatterAddDTO.getSubjectMatterCode());
      outBound.setSubjectMatterName(outSubjectMatterAddDTO.getSubjectMatterName());
      outBound.setOutBoundType("1");
      if (StrUtil.isEmpty(addDTO.getOutBoundType())) {
         outBound.setOutBoundType("0");
      }
      baseMapper.insert(outBound);
      return outBound.getId();
   }
   private R<Contract> vailParam(OutBoundAddDTO addDTO) {
      if (CollUtil.isEmpty(addDTO.getSubjectMatterList())) {
         return R.failed("出库标的物不能为空");
      }
@@ -523,232 +681,7 @@
            return R.failed(outSubjectMatterAddDTO.getSubjectMatterCode() + "已出库完成,不能超额出库");
         }
      }
      addDTO.getSubjectMatterList().stream().forEach(outSubjectMatterAddDTO -> {
         ContractSubjectMatter subjectMatter = contractSubjectMatterMapper.selectOne(Wrappers.<ContractSubjectMatter>lambdaQuery()
               .eq(ContractSubjectMatter::getContractId, contract.getId())
               .eq(ContractSubjectMatter::getMaterialCode, outSubjectMatterAddDTO.getSubjectMatterCode())
               .ne(ContractSubjectMatter::getDeliveryStatus, 2)
               .eq(StrUtil.isNotEmpty(outSubjectMatterAddDTO.getLineNo()), ContractSubjectMatter::getLineNo, outSubjectMatterAddDTO.getLineNo())
               .last("limit 1"));
         if (ObjUtil.isNull(subjectMatter)) {
            return;
         }
         subjectMatter.setLastDeliveredQuantity(outSubjectMatterAddDTO.getOutBoundNum());
         outSubjectMatterAddDTO.setUnitPrice(subjectMatter.getUnitPrice());
         if (subjectMatter.getDeliveryStatus() == 0) {
            subjectMatter.setDeliveredQuantity(outSubjectMatterAddDTO.getOutBoundNum());
            subjectMatter.setRemainingQuantity(subjectMatter.getQuantity().subtract(outSubjectMatterAddDTO.getOutBoundNum()));
         }
         if (subjectMatter.getDeliveryStatus() == 1) {
            subjectMatter.setDeliveredQuantity(subjectMatter.getDeliveredQuantity().add(outSubjectMatterAddDTO.getOutBoundNum()));
            subjectMatter.setRemainingQuantity(subjectMatter.getRemainingQuantity().subtract(outSubjectMatterAddDTO.getOutBoundNum()));
         }
         subjectMatter.setDeliveryStatus(1);
         if (subjectMatter.getRemainingQuantity().compareTo(new BigDecimal("0")) == 0) {
            subjectMatter.setDeliveryStatus(2);
         }
         subjectMatter.setActualDeliveryDate(addDTO.getOutBoundTime());
         contractSubjectMatterMapper.updateById(subjectMatter);
         //
         OutBound outBound = new OutBound();
         if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smj) || StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjsc) ||
               StrUtil.equals(SecurityUtils.getUser().getCompId() + "", smjzt)) {
            outBound.setBatchNumber(generateSMJContractCKNo());
         }
         if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", sgb)) {
            outBound.setBatchNumber(generateGYBContractCKNo());
         }
         if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", ymj)) {
            outBound.setBatchNumber(generateYMJContractCKNo());
         }
         if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", tfgs)) {
            outBound.setBatchNumber(generateTFContractCKNo());
         }
         if (StrUtil.equals(SecurityUtils.getUser().getCompId() + "", jxc)) {
            outBound.setBatchNumber(generateJXCContractCKNo());
         }
         outBound.setOutBoundNum(outSubjectMatterAddDTO.getOutBoundNum());
         outBound.setOutBoundAttNames(addDTO.getOutBoundAttNames());
         outBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths());
         outBound.setBusGuestName(contract.getPartyA());
         outBound.setBusGuestId(contract.getPartyAId());
         outBound.setOutBoundTime(ObjUtil.isNotNull(addDTO.getOutBoundTime()) ? addDTO.getOutBoundTime() : new Date());
         outBound.setSubjectMatterCode(outSubjectMatterAddDTO.getSubjectMatterCode());
         outBound.setSubjectMatterName(outSubjectMatterAddDTO.getSubjectMatterName());
         outBound.setOutBoundType("1");
         if (StrUtil.isEmpty(addDTO.getOutBoundType())) {
            outBound.setOutBoundType("0");
         }
         baseMapper.insert(outBound);
         //
         saveContractOutBound(contract, addDTO, subjectMatter, outBound.getId());
      });
      //当前出库合同出库标的物
      List<ContractSubjectMatter> contractSubjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
            .eq(ContractSubjectMatter::getContractId, contract.getId()).ne(ContractSubjectMatter::getDeliveryStatus, 0));
      //查询合同是否有出库阶段
      ContractPaymentSchedule schedule = scheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contract.getId())
            .eq(ContractPaymentSchedule::getStageName, "发货前").gt(ContractPaymentSchedule::getPaymentRatio,0).last("limit 1"));
      //存在出库阶段
      if (ObjUtil.isNotNull(schedule)) {
         //当前出库金额
         BigDecimal outPirce = contractSubjectMatterList.stream()
               .map(item -> (item.getDeliveryStatus() == 1 ? item.getDeliveredQuantity().multiply(item.getUnitPrice()) : item.getQuantity().multiply(item.getUnitPrice())))
               .reduce(BigDecimal.ZERO, BigDecimal::add);
         //出库是否完成
         if (outPirce.compareTo(contract.getBillingAmout()) > 0) {
            contract.setBillingStatus("2");
            contractMapper.updateById(contract);
         }
         if (outPirce.compareTo(contract.getBillingAmout()) == 0) {
            contract.setBillingStatus("1");
            contractMapper.updateById(contract);
         }
         if (outPirce.compareTo(contract.getAmount()) == 0 &&
               outPirce.compareTo(contract.getBillingAmout()) == 0) {
            contract.setBillingStatus("3");
            contractMapper.updateById(contract);
         }
         //导入数据不生成应收
         if (targetContractNo.startsWith("ZB-")) {
            //计算发货前应收更新资金明细
            PaymentConfirm paymentConfirm = new PaymentConfirm();
            paymentConfirm.setBusinessType("发货前应收");
            paymentConfirm.setBusGuestId(contract.getPartyAId());
            paymentConfirm.setBusGuestName(contract.getPartyA());
            paymentConfirm.setContractId(contract.getId());
            paymentConfirm.setContractName(contract.getContractName());
            paymentConfirm.setContractNo(contract.getContractNo());
            paymentConfirm.setScheduleId(schedule.getId());
            paymentConfirm.setScheduleName(schedule.getStageName());
            paymentConfirm.setConfirmTime(addDTO.getOutBoundTime());
            //计算出库金额
            BigDecimal outAmount = addDTO.getSubjectMatterList().stream().map(item -> item.getUnitPrice().multiply(item.getOutBoundNum())).reduce(BigDecimal.ZERO, BigDecimal::add);
            paymentConfirm.setTransationAmount(outAmount.divide(new BigDecimal("100")).multiply(schedule.getPaymentRatio()));
            if (ObjUtil.isNotNull(contract.getOutBoundAmout())) {
               contract.setOutBoundAmout(outAmount.add(contract.getOutBoundAmout()));
            } else {
               contract.setOutBoundAmout(outAmount);
            }
            contractMapper.updateById(contract);
            //最近明细
            PaymentConfirm lastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
                  .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
            if (ObjUtil.isNotNull(lastConfirm)) {
               //不存在发货应收 出库总额
               paymentConfirm.setTotalAmount(lastConfirm.getTotalAmount().subtract(paymentConfirm.getTransationAmount()));
               if (paymentConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) {
                  paymentConfirm.setAdvanceAmount(paymentConfirm.getTotalAmount());
               }
               if (paymentConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) {
                  paymentConfirm.setReceivableAmount(paymentConfirm.getTotalAmount().multiply(new BigDecimal("-1")));
               }
               if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
                  paymentConfirmMapper.insert(paymentConfirm);
               }
//            }
            } else {
               //无之前阶段应收
               paymentConfirm.setTotalAmount(paymentConfirm.getTransationAmount().multiply(new BigDecimal("-1")));
               if (schedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
                  paymentConfirmMapper.insert(paymentConfirm);
                  //客户付款完成合同
                  List<Contract> customerCompleteContractList = contractMapper.selectList(Wrappers.<Contract>lambdaQuery().eq(Contract::getPartyAId, contract.getPartyAId())
                        .eq(Contract::getPartyBId, SecurityUtils.getUser().getCompId()).apply(" amount = paid_amount"));
                  if (CollUtil.isNotEmpty(customerCompleteContractList)) {
                     List<BigDecimal> outAmountList = new ArrayList<>();
                     for (Contract completeContract : customerCompleteContractList
                     ) {
                        PaymentConfirm contractLastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, completeContract.getId())
                              .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
                        //查询客户付款完成合同中最后明细金额 有预收转入当前合同
                        if (contractLastConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) {
                           //新增完成付款合同 资金转出
                           PaymentConfirm outConfirm = BeanUtil.copyProperties(contractLastConfirm, PaymentConfirm.class, "id", "transationAmount",
                                 "advanceAmount", "receivableAmount", "overdueAmount", "totalAmount");
                           outConfirm.setBusinessType("资金转出");
                           outConfirm.setConfirmTime(new Date());
                           outConfirm.setTransationAmount(contractLastConfirm.getTotalAmount());
                           outConfirm.setTotalAmount(new BigDecimal("0"));
                           paymentConfirmMapper.insert(outConfirm);
                           outAmountList.add(outConfirm.getTransationAmount());
                        }
                     }
                     if (CollUtil.isNotEmpty(outAmountList)) {
                        BigDecimal currentInSum = outAmountList.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
                        //新增当前合同 资金转入
                        PaymentConfirm inConfirm = BeanUtil.copyProperties(paymentConfirm, PaymentConfirm.class, "id", "transationAmount",
                              "advanceAmount", "receivableAmount", "overdueAmount", "totalAmount");
                        inConfirm.setBusinessType("资金转入");
                        inConfirm.setConfirmTime(new Date());
                        inConfirm.setTransationAmount(currentInSum);
                        inConfirm.setTotalAmount(paymentConfirm.getTotalAmount().add(currentInSum));
                        //更新当前阶段实际收款 和 收款状态
                        schedule.setActualAmount(inConfirm.getTransationAmount());
                        schedule.setPaymentStatus(2);
                        if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) {
                           inConfirm.setAdvanceAmount(inConfirm.getTotalAmount());
                        } else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) {
                           inConfirm.setReceivableAmount(inConfirm.getTotalAmount().multiply(new BigDecimal("-1")));
                           schedule.setActualAmount(paymentConfirm.getTotalAmount().subtract(currentInSum));
                           schedule.setPaymentStatus(1);
                        }
                        paymentConfirmMapper.insert(inConfirm);
                        //更新当前阶段实际收款 和 收款状态
                        scheduleMapper.updateById(schedule);
                     }
                  }
               }
            }
         }
         //更新发货前收款生效时间
         if (ObjUtil.isNull(schedule.getEffectiveDate())) {
            //更新履约
            ContractPaymentScheduleProcess contractPaymentScheduleProcess = new ContractPaymentScheduleProcess();
            contractPaymentScheduleProcess.setContractId(schedule.getContractId());
            contractPaymentScheduleProcess.setContractName(schedule.getContractName());
            contractPaymentScheduleProcess.setScheduleId(schedule.getId());
            contractPaymentScheduleProcess.setScheduleName(schedule.getStageName());
            contractPaymentScheduleProcess.setProcessDate(addDTO.getOutBoundTime());
            ContractPaymentScheduleProcess lastProcess = scheduleProcessMapper.selectOne(Wrappers.<ContractPaymentScheduleProcess>lambdaQuery().eq(ContractPaymentScheduleProcess::getContractId, schedule.getContractId())
                  .eq(ContractPaymentScheduleProcess::getScheduleId, schedule.getId()).last("limit 1"));
            if (ObjUtil.isNull(lastProcess)) {
               scheduleProcessMapper.insert(contractPaymentScheduleProcess);
            }
         }
         //查询是否有后续阶段
         List<ContractPaymentSchedule> afterSchedule = scheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
               .eq(ContractPaymentSchedule::getContractId, schedule.getContractId())
               .gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder())
               .orderByAsc(ContractPaymentSchedule::getCreateTime));
         if (CollUtil.isNotEmpty(afterSchedule) && contract.getOutBoundAmout().compareTo(contract.getAmount()) == 0) {
            contract.setNextScheduleName(afterSchedule.get(0).getStageName());
            contractMapper.updateById(contract);
         }
         if (CollUtil.isEmpty(afterSchedule)) {
            schedule.setEffectiveEndDate(contract.getExpirationDate());
            scheduleMapper.updateById(schedule);
            //更新合同下个阶段
            contract.setNextScheduleName("无");
            contractMapper.updateById(contract);
            //当前为合同最后阶段
            PaymentConfirm lastNewConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
                  .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
            if (lastNewConfirm.getTotalAmount().compareTo(new BigDecimal("0")) >= 0
                  && contract.getBillingAmout().compareTo(contract.getAmount()) == 0) {
               //有预付且超过应收 关闭合同状态
               contract.setContractStatus(3);
               contractMapper.updateById(contract);
            }
         }
      }
      return R.ok();
      return R.ok(contract);
   }
   /**