From e02812df9217d3e50a368a8234c07c60c64c0ff4 Mon Sep 17 00:00:00 2001
From: shiyunteng <shiyunteng@example.com>
Date: 星期三, 05 八月 2026 08:34:26 +0800
Subject: [PATCH] feat:新增石煤机 机械厂模版合同/客户数据主数据同步接口/合同履约进度新增质保结束操作/合同开票状态 修改为待开 可开 已开/出库逻辑完善

---
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/MeterReadRecordServiceImpl.java |  106 +++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 87 insertions(+), 19 deletions(-)

diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/MeterReadRecordServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/MeterReadRecordServiceImpl.java
index ffcb0f5..f219846 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/MeterReadRecordServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/MeterReadRecordServiceImpl.java
@@ -1,23 +1,20 @@
 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;
 import com.by4cloud.platformx.business.dto.MeterReadRecordUpdateDTO;
-import com.by4cloud.platformx.business.entity.Contract;
-import com.by4cloud.platformx.business.entity.ContractSubjectMatter;
-import com.by4cloud.platformx.business.entity.MeterReadRecord;
-import com.by4cloud.platformx.business.entity.PaymentConfirm;
-import com.by4cloud.platformx.business.mapper.ContractMapper;
-import com.by4cloud.platformx.business.mapper.ContractSubjectMatterMapper;
-import com.by4cloud.platformx.business.mapper.MeterReadRecordMapper;
-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.MeterReadRecordService;
 import com.by4cloud.platformx.common.core.util.R;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * 姘寸數鎶勮〃
@@ -31,7 +28,9 @@
 
 	private final ContractMapper contractMapper;
 	private final ContractSubjectMatterMapper contractSubjectMatterMapper;
+	private final ContractPaymentScheduleMapper contractPaymentScheduleMapper;
 	private final PaymentConfirmMapper paymentConfirmMapper;
+	private final ContractExecDateMapper contractExecDateMapper;
 
 	@Override
 	public R edit(MeterReadRecordUpdateDTO updateDTO) {
@@ -39,23 +38,68 @@
 		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();
+
+		if (subjectMatter.getMaterialCode().equals("water_bill")){
+			schedule.setStageName("姘磋垂浠g即");
+		}
+		if (subjectMatter.getMaterialCode().equals("electricity_bill")){
+			schedule.setStageName("鐢佃垂浠g即");
+		}
+		if (subjectMatter.getMaterialCode().equals("house_rental")){
+			schedule.setStageName("鎴垮眿绉熻祦璐�");
+		}
+		schedule.setContractId(contract.getId());
+		schedule.setContractName(contract.getContractName());
+		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)){
+			schedule.setStageOrder(lastSchedule.getStageOrder()+1);
+		}
+		schedule.setPaymentStatus(0);
+		schedule.setActualAmount(new BigDecimal("0"));
+		schedule.setInvoiceFlag("0");
+		contractPaymentScheduleMapper.insert(schedule);
+		//鎴垮眿绉熻祦鐢熸垚搴旀敹
 		PaymentConfirm confirm = new PaymentConfirm();
 		confirm.setBusinessType(subjectMatter.getMaterialInternalName()+"搴旀敹");
 		confirm.setBusGuestId(contract.getPartyAId());
@@ -87,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();
 	}
 }
\ No newline at end of file

--
Gitblit v1.9.1