platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/MeterReadRecordServiceImpl.java
@@ -1,5 +1,7 @@
package com.by4cloud.platformx.business.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -12,6 +14,7 @@
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
 * 水电抄表
@@ -27,6 +30,7 @@
   private final ContractSubjectMatterMapper contractSubjectMatterMapper;
   private final ContractPaymentScheduleMapper contractPaymentScheduleMapper;
   private final PaymentConfirmMapper paymentConfirmMapper;
   private final ContractExecDateMapper contractExecDateMapper;
   @Override
   public R edit(MeterReadRecordUpdateDTO updateDTO) {
@@ -34,33 +38,58 @@
      MeterReadRecord lastRecord = baseMapper.selectOne(Wrappers.<MeterReadRecord>lambdaQuery().eq(MeterReadRecord::getContractId,updateDTO.getContractId())
            .eq(MeterReadRecord::getMeterReadCode,updateDTO.getMeterReadCode()).lt(MeterReadRecord::getCreateTime,record.getCreateTime())
            .orderByDesc(MeterReadRecord::getCreateTime).last("limit 1"));
      if(ObjUtil.isNull(lastRecord)){
         return R.failed("无最近抄号记录");
      }
      if (updateDTO.getMeterReadNum().compareTo(lastRecord.getMeterReadNum())<0){
         return R.failed("抄号数字不能比上次少");
      }
      record.setMeterReadTime(updateDTO.getMeterReadTime());
      record.setMeterReadNum(updateDTO.getMeterReadNum());
      record.setMeterReadAttNames(updateDTO.getMeterReadAttNames());
      record.setMeterReadAttPaths(updateDTO.getMeterReadAttPaths());
      baseMapper.updateById(record);
      //房屋租赁生成应收
      Contract contract = contractMapper.selectById(updateDTO.getContractId());
      ContractSubjectMatter subjectMatter = contractSubjectMatterMapper.selectById(updateDTO.getMatterId());
      if(ObjUtil.isNull(lastRecord)){
         R.failed("无合同信息,请联系技术人员");
      }
      if(ObjUtil.isNull(lastRecord)){
         return R.failed("无最近抄表记录");
      }
      if (updateDTO.getMeterReadNum().compareTo(lastRecord.getMeterReadNum())<=0){
         return R.failed("抄表数字不能比上次少");
      }
      record.setMeterReadTime(updateDTO.getMeterReadTime());
      record.setMeterReadNum(updateDTO.getMeterReadNum());
      record.setUsageNum(updateDTO.getMeterReadNum().subtract(lastRecord.getMeterReadNum()));
      record.setMeterReadAttNames(updateDTO.getMeterReadAttNames());
      record.setMeterReadAttPaths(updateDTO.getMeterReadAttPaths());
      record.setUnitPrice(subjectMatter.getUnitPrice());
      if (subjectMatter.getMaterialCode().equals("water_bill")){
         record.setMeterType("2");
      }
      if (subjectMatter.getMaterialCode().equals("electricity_bill")){
         record.setMeterType("3");
      }
      if (subjectMatter.getMaterialCode().equals("house_rental")){
         record.setMeterType("1");
      }
      record.setCostAmount(subjectMatter.getUnitPrice().multiply(updateDTO.getMeterReadNum().subtract(lastRecord.getMeterReadNum())));
      baseMapper.updateById(record);
      //创建收款节点
      //查询上次收款节点
      ContractPaymentSchedule lastSchedule = contractPaymentScheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery()
            .eq(ContractPaymentSchedule::getContractId,contract.getId())
            .orderByDesc(ContractPaymentSchedule::getCreateTime).last("limit 1"));
      ContractPaymentSchedule schedule = new ContractPaymentSchedule();
      schedule.setStageName("水电代缴");
      if (subjectMatter.getMaterialCode().equals("water_bill")){
         schedule.setStageName("水费代缴");
      }
      if (subjectMatter.getMaterialCode().equals("electricity_bill")){
         schedule.setStageName("电费代缴");
      }
      if (subjectMatter.getMaterialCode().equals("house_rental")){
         schedule.setStageName("房屋租赁费");
      }
      schedule.setContractId(contract.getId());
      schedule.setContractName(contract.getContractName());
      schedule.setPlannedAmount(subjectMatter.getUnitPrice().multiply(updateDTO.getMeterReadNum().subtract(lastRecord.getMeterReadNum())));
      schedule.setPlannedAmount(record.getCostAmount());
      schedule.setSubjectMatterCode(subjectMatter.getMaterialCode());
      schedule.setSubjectMatterName(subjectMatter.getMaterialInternalName());
      schedule.setRemark(DateUtil.formatDate(record.getMeterReadTime())+schedule.getStageName());
      schedule.setEffectiveEndDate(updateDTO.getMeterReadTime());
      schedule.setStageOrder(1);
      if (ObjUtil.isNotNull(lastSchedule)){
@@ -68,6 +97,7 @@
      }
      schedule.setPaymentStatus(0);
      schedule.setActualAmount(new BigDecimal("0"));
      schedule.setInvoiceFlag("0");
      contractPaymentScheduleMapper.insert(schedule);
      //房屋租赁生成应收
      PaymentConfirm confirm = new PaymentConfirm();
@@ -101,6 +131,30 @@
         confirm.setCompId(contract.getCompId());
         paymentConfirmMapper.insert(confirm);
      }
      //判断 循环是否完成
      List<ContractExecDate> execDateList = contractExecDateMapper.selectList(Wrappers.<ContractExecDate>lambdaQuery().eq(ContractExecDate::getContractId,contract.getId())
            .eq(ContractExecDate::getGenFlag,"0"));
      List<MeterReadRecord> recordList = baseMapper.selectList(Wrappers.<MeterReadRecord>lambdaQuery()
            .eq(MeterReadRecord::getContractId,contract.getId())
            .isNull(MeterReadRecord::getMeterReadNum));
      if (ArrayUtil.isEmpty(execDateList.toArray())&&ArrayUtil.isEmpty(recordList.toArray())){
         List<PaymentConfirm> confirmList = paymentConfirmMapper.selectList(Wrappers.<PaymentConfirm>lambdaQuery()
               .eq(PaymentConfirm::getContractId, contract.getId())
               .and(wrapper -> wrapper
                     .eq(PaymentConfirm::getBusinessType, "房屋租赁应收")
                     .or()
                     .eq(PaymentConfirm::getBusinessType, "售电应收")
                     .or()
                     .eq(PaymentConfirm::getBusinessType, "不征税自来水应收")
               ));
         if (ArrayUtil.isNotEmpty(confirmList.toArray())){
            BigDecimal total = confirmList.stream().map(PaymentConfirm::getTransationAmount).filter(amount -> amount != null).reduce(BigDecimal.ZERO, BigDecimal::add);
            contract.setAmount(total);
            contractMapper.updateById(contract);
         }
      }
      contract.setBillingStatus("2");
      contractMapper.updateById(contract);
      return R.ok();
   }
}