shiyunteng
昨天 fca21683e1b5b906d2514082ddfbae8eb820c9ea
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractPaymentScheduleProcessServiceImpl.java
@@ -8,14 +8,8 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.by4cloud.platformx.business.dto.ContractPaymentScheduleProcessAddDTO;
import com.by4cloud.platformx.business.entity.Contract;
import com.by4cloud.platformx.business.entity.ContractPaymentSchedule;
import com.by4cloud.platformx.business.entity.ContractPaymentScheduleProcess;
import com.by4cloud.platformx.business.entity.PaymentConfirm;
import com.by4cloud.platformx.business.mapper.ContractMapper;
import com.by4cloud.platformx.business.mapper.ContractPaymentScheduleMapper;
import com.by4cloud.platformx.business.mapper.ContractPaymentScheduleProcessMapper;
import com.by4cloud.platformx.business.mapper.PaymentConfirmMapper;
import com.by4cloud.platformx.business.entity.*;
import com.by4cloud.platformx.business.mapper.*;
import com.by4cloud.platformx.business.service.ContractPaymentScheduleProcessService;
import com.by4cloud.platformx.business.vo.ContractPaymentScheduleVo;
import com.by4cloud.platformx.business.vo.ScheduleProcessVo;
@@ -41,6 +35,7 @@
   private final ContractPaymentScheduleMapper contractPaymentScheduleMapper;
   private final ContractPaymentScheduleProcessMapper processMapper;
   private final ContractMapper contractMapper;
   private final ContractSubjectMatterMapper subjectMatterMapper;
   private final PaymentConfirmMapper paymentConfirmMapper;
   @Override
@@ -51,6 +46,13 @@
      }
      //合同
      Contract contract = contractMapper.selectById(schedule.getContractId());
      List<ContractSubjectMatter> subjectMatterList = subjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery().eq(ContractSubjectMatter::getContractId,contract.getId()));
      if (ArrayUtil.isEmpty(subjectMatterList.toArray())){
         return R.failed("该合同标的物异常,请联系技术人员");
      }
      if (!subjectMatterList.stream().allMatch(item->item.getDeliveryStatus()==2)){
         return R.failed("出库数量小于当前合同标的物数量,无法进行当前操作");
      }
      //新增当前阶段应收
      PaymentConfirm currentConfim = new PaymentConfirm();
      currentConfim.setBusinessType(schedule.getStageName()+"应收");
@@ -88,7 +90,7 @@
      ContractPaymentSchedule beforeSchedule = contractPaymentScheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, schedule.getContractId())
            .lt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder()).orderByDesc(ContractPaymentSchedule::getCreateTime).last("limit 1"));
      if (ObjUtil.isNotNull(beforeSchedule)){
         beforeSchedule.setEffectiveEndDate(DateUtil.offsetDay(addDTO.getProcessDate(),beforeSchedule.getAgreedDays()));
         beforeSchedule.setEffectiveEndDate(schedule.getEffectiveDate());
         contractPaymentScheduleMapper.updateById(beforeSchedule);
         //之前阶段是否收款完成
//         if (beforeSchedule.getPaymentStatus()!=2){
@@ -121,37 +123,59 @@
      if (ArrayUtil.isNotEmpty(afterSchedule.toArray())&&afterSchedule.size()==1){
         //最后阶段生效时间
         ContractPaymentSchedule endSchedule = afterSchedule.get(0);
         endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(),endSchedule.getAgreedDays()));
         endSchedule.setEffectiveEndDate(contract.getExpirationDate());
         contractPaymentScheduleMapper.updateById(endSchedule);
         //当前阶段生效时间
         schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(),schedule.getAgreedDays()));
         schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
         contractPaymentScheduleMapper.updateById(schedule);
         //最后阶段应收
         PaymentConfirm newConfim = new PaymentConfirm();
         newConfim.setBusinessType(endSchedule.getStageName()+"应收");
         newConfim.setBusGuestId(contract.getPartyAId());
         newConfim.setBusGuestName(contract.getPartyA());
         newConfim.setContractId(contract.getId());
         newConfim.setContractName(contract.getContractName());
         newConfim.setContractNo(contract.getContractNo());
         newConfim.setScheduleId(endSchedule.getId());
         newConfim.setScheduleName(schedule.getStageName());
         newConfim.setConfirmTime(addDTO.getProcessDate());
         newConfim.setTransationAmount(endSchedule.getPlannedAmount());
         newConfim.setReceivableAmount(endSchedule.getPlannedAmount());
         PaymentConfirm lastNewConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId,contract.getId())
               .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
         BigDecimal lastNewTotal = new BigDecimal("0");
         if(ObjUtil.isNotNull(lastNewConfirm)){
            lastNewTotal = lastNewConfirm.getTotalAmount();
         if (StrUtil.equals(endSchedule.getStageName(),"质保金")) {
            endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(), endSchedule.getAgreedDays()));
            endSchedule.setEffectiveEndDate(contract.getExpirationDate());
            contractPaymentScheduleMapper.updateById(endSchedule);
            //当前阶段生效时间
            schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getProcessDate(), schedule.getAgreedDays()));
            schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
            contractPaymentScheduleMapper.updateById(schedule);
            //最后阶段应收
            PaymentConfirm newConfim = new PaymentConfirm();
            newConfim.setBusinessType(endSchedule.getStageName() + "应收");
            newConfim.setBusGuestId(contract.getPartyAId());
            newConfim.setBusGuestName(contract.getPartyA());
            newConfim.setContractId(contract.getId());
            newConfim.setContractName(contract.getContractName());
            newConfim.setContractNo(contract.getContractNo());
            newConfim.setScheduleId(endSchedule.getId());
            newConfim.setScheduleName(schedule.getStageName());
            newConfim.setConfirmTime(addDTO.getProcessDate());
            newConfim.setTransationAmount(endSchedule.getPlannedAmount());
            newConfim.setReceivableAmount(endSchedule.getPlannedAmount());
            PaymentConfirm lastNewConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
                  .orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
            BigDecimal lastNewTotal = new BigDecimal("0");
            if (ObjUtil.isNotNull(lastNewConfirm)) {
               lastNewTotal = lastNewConfirm.getTotalAmount();
            }
            newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount()));
            paymentConfirmMapper.insert(newConfim);
         }
         newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount()));
         paymentConfirmMapper.insert(newConfim);
      }else {
         //更新合同下个阶段
         contract.setNextScheduleName(endSchedule.getStageName());
         contractMapper.updateById(contract);
      }
      if(ArrayUtil.isNotEmpty(afterSchedule.toArray())&&afterSchedule.size()>1){
         //更新合同下个阶段
         contract.setNextScheduleName(afterSchedule.get(0).getStageName());
         contractMapper.updateById(contract);
      }
      if(ArrayUtil.isEmpty(afterSchedule.toArray())){
         schedule.setEffectiveEndDate(contract.getExpirationDate());
         contractPaymentScheduleMapper.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.setContractStatus(3);
            contractMapper.updateById(contract);
         }
      }
      return R.ok();
   }
@@ -162,20 +186,13 @@
            .select(ContractPaymentSchedule::getId,ContractPaymentSchedule::getStageName,ContractPaymentSchedule::getEffectiveDate,
                  ContractPaymentSchedule::getPlannedAmount,ContractPaymentSchedule::getPlannedAmount,
                  ContractPaymentSchedule::getEffectiveEndDate,ContractPaymentSchedule::getPaymentDate,
                  ContractPaymentSchedule::getPaymentStatus,ContractPaymentSchedule::getActualAmount)
                  ContractPaymentSchedule::getPaymentStatus,ContractPaymentSchedule::getActualAmount,
                  ContractPaymentSchedule::getAgreedDays)
            .select(ContractPaymentScheduleProcess::getProcessDate)
            .leftJoin(ContractPaymentScheduleProcess.class,ContractPaymentScheduleProcess::getScheduleId,ContractPaymentSchedule::getId)
            .eq(ContractPaymentSchedule::getContractId,id)
            .orderByAsc(ContractPaymentSchedule::getCreateTime);
      List<ContractPaymentScheduleVo> scheduleVoList = contractPaymentScheduleMapper.selectJoinList(ContractPaymentScheduleVo.class,wrapper);
      if (ArrayUtil.isEmpty(scheduleVoList.toArray())){
         scheduleVoList.stream().forEach(contractPaymentScheduleVo -> {
            List<ContractPaymentScheduleProcess> paymentScheduleProcessList = processMapper.selectList(Wrappers.<ContractPaymentScheduleProcess>lambdaQuery()
                  .eq(ContractPaymentScheduleProcess::getContractId,contractPaymentScheduleVo.getId())
                  .orderByAsc(ContractPaymentScheduleProcess::getCreateTime));
            if (ArrayUtil.isNotEmpty(paymentScheduleProcessList.toArray())){
               contractPaymentScheduleVo.setProcessVoList(BeanUtil.copyToList(paymentScheduleProcessList, ScheduleProcessVo.class));
            }
         });
      }
      return R.ok(scheduleVoList);
   }
}