From 0527f90adf2aea086af681fb8f3dbf49c0a5ed31 Mon Sep 17 00:00:00 2001
From: shiyunteng <shiyunteng@example.com>
Date: 星期三, 27 五月 2026 17:21:27 +0800
Subject: [PATCH] feat:新增非主营业务水电代缴/房屋租赁合同

---
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java |  284 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 210 insertions(+), 74 deletions(-)

diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
index fd7e0b9..029813d 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
@@ -55,6 +55,8 @@
 	private final PaymentConfirmMapper paymentConfirmMapper;
 	private final CurrentOverdueMapper currentOverdueMapper;
 	private final BusinessCustomerMapper businessCustomerMapper;
+	private final MeterReadRecordMapper meterReadRecordMapper;
+	private final ContractExecDateMapper contractExecDateMapper;
 	private final RemoteFlowProcessService remoteFlowProcessService;
 	private final ContractTemplateMapper contractTemplateMapper;
 	private final RemoteDeptService remoteDeptService;
@@ -88,7 +90,20 @@
 				subjectMatter.setDeliveryStatus(0);
 				subjectMatter.setTotalAmount(contractSubjectMatterAddDTO.getQuantity().multiply(contractSubjectMatterAddDTO.getUnitPrice()));
 				contractSubjectMatterMapper.insert(subjectMatter);
+				//姘寸數绫诲繀椤绘湁鍒濇琛ㄥ彿
+				if (StrUtil.isNotEmpty(contractSubjectMatterAddDTO.getMeterReadCode()) &&
+						ObjUtil.isNotNull(contractSubjectMatterAddDTO.getMeterReadNum())) {
+					MeterReadRecord record = BeanUtil.copyProperties(contractSubjectMatterAddDTO, MeterReadRecord.class,"id");
+					record.setContractId(contract.getId());
+					record.setMatterId(subjectMatter.getId());
+					record.setContractName(contract.getContractName());
+					record.setBusGuestId(contract.getPartyAId());
+					record.setBusGuestName(contract.getPartyA());
+					record.setMeterReadTime(new Date());
+					meterReadRecordMapper.insert(record);
+				}
 			});
+
 		}
 
 		if (ArrayUtil.isNotEmpty(addDTO.getContractPaymentSchedule())) {
@@ -128,6 +143,9 @@
 
 		}
 
+		if (StrUtil.isNotEmpty(addDTO.getContractCategory()) && StrUtil.equals(addDTO.getContractCategory(), "water_house")) {
+
+		}
 
 		return R.ok();
 	}
@@ -228,20 +246,78 @@
 		Contract contract = baseMapper.selectById(id);
 		contract.setContractStatus(2);
 		baseMapper.updateById(contract);
-		ContractPaymentSchedule fitstSchedule = contractPaymentScheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contract.getId())
-				.orderByAsc(ContractPaymentSchedule::getCreateTime).last("limit 1"));
-		if (fitstSchedule.getStageName().equals("鍚堝悓绛捐")) {
-			//鏂板搴旀敹
-			savePaymentConfirm(contract, fitstSchedule);
+		if (StrUtil.isNotEmpty(contract.getContractCategory()) && StrUtil.equals(contract.getContractCategory(), "water_house")) {
+			List<ContractSubjectMatter> subjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
+					.eq(ContractSubjectMatter::getContractId,id));
+			if (ArrayUtil.isNotEmpty(subjectMatterList.toArray())) {
+				subjectMatterList.stream().forEach(contractSubjectMatter -> {
 
-			//鏂板鍚堝悓灞ョ害璁板綍
-			ContractPaymentScheduleProcess process = new ContractPaymentScheduleProcess();
-			process.setContractId(contract.getId());
-			process.setContractName(contract.getContractName());
-			process.setScheduleId(fitstSchedule.getId());
-			process.setScheduleName(fitstSchedule.getStageName());
-			process.setProcessDate(contract.getSignDate());
-			contractPaymentScheduleProcessMapper.insert(process);
+					//寰幆鏃ユ湡
+					Date execDate0 = DateUtil.offsetDay(contract.getSignDate(), contract.getExecDay());
+					for (int i = 0; i < contract.getExecTimes(); i++) {
+						if (StrUtil.equals(contract.getExecFrequency(), "1")) {
+							Date execDatei = DateUtil.offsetWeek(execDate0, i);
+							ContractExecDate execDate = new ContractExecDate();
+							execDate.setContractId(contract.getId());
+							execDate.setMatterId(contractSubjectMatter.getId());
+							execDate.setExecDate(execDatei);
+							execDate.setGenFlag("0");
+							contractExecDateMapper.insert(execDate);
+						}
+						if (StrUtil.equals(contract.getExecFrequency(), "2")) {
+							Date execDatei = DateUtil.offsetMonth(execDate0, i );
+							ContractExecDate execDate = new ContractExecDate();
+							execDate.setContractId(contract.getId());
+							execDate.setMatterId(contractSubjectMatter.getId());
+							execDate.setExecDate(execDatei);
+							execDate.setGenFlag("0");
+							contractExecDateMapper.insert(execDate);
+						}
+						if (StrUtil.equals(contract.getExecFrequency(), "3")) {
+							Date execDatei = DateUtil.offsetMonth(execDate0, i * 3);
+							ContractExecDate execDate = new ContractExecDate();
+							execDate.setContractId(contract.getId());
+							execDate.setMatterId(contractSubjectMatter.getId());
+							execDate.setExecDate(execDatei);
+							execDate.setGenFlag("0");
+							contractExecDateMapper.insert(execDate);
+						}
+						if (StrUtil.equals(contract.getExecFrequency(), "4")) {
+							Date execDatei = DateUtil.offsetMonth(execDate0, i * 6);
+							ContractExecDate execDate = new ContractExecDate();
+							execDate.setContractId(contract.getId());
+							execDate.setMatterId(contractSubjectMatter.getId());
+							execDate.setExecDate(execDatei);
+							execDate.setGenFlag("0");
+							contractExecDateMapper.insert(execDate);
+						}
+						if (StrUtil.equals(contract.getExecFrequency(), "5")) {
+							Date execDatei = DateUtil.offsetYear(execDate0, i);
+							ContractExecDate execDate = new ContractExecDate();
+							execDate.setContractId(contract.getId());
+							execDate.setMatterId(contractSubjectMatter.getId());
+							execDate.setExecDate(execDatei);
+							execDate.setGenFlag("0");
+							contractExecDateMapper.insert(execDate);
+						}
+					}
+				});
+			}
+		} else {
+			ContractPaymentSchedule fitstSchedule = contractPaymentScheduleMapper.selectOne(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contract.getId())
+					.orderByAsc(ContractPaymentSchedule::getCreateTime).last("limit 1"));
+			if (fitstSchedule.getStageName().equals("鍚堝悓绛捐")) {
+				//鏂板搴旀敹
+				savePaymentConfirm(contract, fitstSchedule);
+
+				//鏂板鍚堝悓灞ョ害璁板綍
+				ContractPaymentScheduleProcess process = new ContractPaymentScheduleProcess();
+				process.setContractId(contract.getId());
+				process.setContractName(contract.getContractName());
+				process.setScheduleId(fitstSchedule.getId());
+				process.setScheduleName(fitstSchedule.getStageName());
+				process.setProcessDate(contract.getSignDate());
+				contractPaymentScheduleProcessMapper.insert(process);
 //			//褰撳墠涓哄悎鍚屾渶鍚庨樁娈�
 //			PaymentConfirm newConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId,contract.getId())
 //					.orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
@@ -250,74 +326,75 @@
 //				contract.setContractStatus(3);
 //				baseMapper.updateById(contract);
 //			}
-		} else if (fitstSchedule.getStageName().equals("鍙戣揣鍓�")) {
-			//鏇存柊鍚堝悓涓嬩釜闃舵
-			contract.setNextScheduleName("鏃�");
-			baseMapper.updateById(contract);
-		} else if (fitstSchedule.getStageName().equals("璐у埌绛炬敹")) {
-			//鏇存柊鍚堝悓涓嬩釜闃舵
-			contract.setNextScheduleName("璐у埌绛炬敹");
-			baseMapper.updateById(contract);
-		} else if (fitstSchedule.getStageName().equals("璋冭瘯瀹屾垚鎴栭獙鏀�")) {
-			//鏇存柊鍚堝悓涓嬩釜闃舵
-			contract.setNextScheduleName("璋冭瘯瀹屾垚鎴栭獙鏀�");
-			baseMapper.updateById(contract);
-		} else {
-			//鏂板搴旀敹
-			savePaymentConfirm(contract, fitstSchedule);
-		}
-		//鏌ヨ鏄惁鏈夊悗缁樁娈�
-		List<ContractPaymentSchedule> afterSchedule = contractPaymentScheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
-				.eq(ContractPaymentSchedule::getContractId, fitstSchedule.getContractId())
-				.gt(ContractPaymentSchedule::getStageOrder, fitstSchedule.getStageOrder())
-				.orderByAsc(ContractPaymentSchedule::getCreateTime));
-		if (ArrayUtil.isNotEmpty(afterSchedule.toArray()) && afterSchedule.size() == 1) {
-			//鏈�鍚庨樁娈电敓鏁堟椂闂�
-			ContractPaymentSchedule endSchedule = afterSchedule.get(0);
-			if (StrUtil.equals(endSchedule.getStageName(), "璐ㄤ繚閲�")) {
+			} else if (fitstSchedule.getStageName().equals("鍙戣揣鍓�")) {
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName("鏃�");
+				baseMapper.updateById(contract);
+			} else if (fitstSchedule.getStageName().equals("璐у埌绛炬敹")) {
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName("璐у埌绛炬敹");
+				baseMapper.updateById(contract);
+			} else if (fitstSchedule.getStageName().equals("璋冭瘯瀹屾垚鎴栭獙鏀�")) {
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName("璋冭瘯瀹屾垚鎴栭獙鏀�");
+				baseMapper.updateById(contract);
+			} else {
+				//鏂板搴旀敹
+				savePaymentConfirm(contract, fitstSchedule);
+			}
+			//鏌ヨ鏄惁鏈夊悗缁樁娈�
+			List<ContractPaymentSchedule> afterSchedule = contractPaymentScheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
+					.eq(ContractPaymentSchedule::getContractId, fitstSchedule.getContractId())
+					.gt(ContractPaymentSchedule::getStageOrder, fitstSchedule.getStageOrder())
+					.orderByAsc(ContractPaymentSchedule::getCreateTime));
+			if (ArrayUtil.isNotEmpty(afterSchedule.toArray()) && afterSchedule.size() == 1) {
+				//鏈�鍚庨樁娈电敓鏁堟椂闂�
+				ContractPaymentSchedule endSchedule = afterSchedule.get(0);
+				if (StrUtil.equals(endSchedule.getStageName(), "璐ㄤ繚閲�")) {
 //				endSchedule.setEffectiveEndDate(DateUtil.offsetDay(new Date(),endSchedule.getAgreedDays()));
 //				contractPaymentScheduleMapper.updateById(endSchedule);
-				//鏈�鍚庨樁娈靛簲鏀�
-				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(endSchedule.getStageName());
-				newConfim.setConfirmTime(new Date());
-				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();
+					//鏈�鍚庨樁娈靛簲鏀�
+					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(endSchedule.getStageName());
+					newConfim.setConfirmTime(new Date());
+					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()));
+					if (endSchedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
+						paymentConfirmMapper.insert(newConfim);
+					}
 				}
-				newConfim.setTotalAmount(lastNewTotal.subtract(newConfim.getReceivableAmount()));
-				if (endSchedule.getPaymentRatio().compareTo(new BigDecimal("0")) > 0) {
-					paymentConfirmMapper.insert(newConfim);
-				}
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName(endSchedule.getStageName());
+				baseMapper.updateById(contract);
 			}
-			//鏇存柊鍚堝悓涓嬩釜闃舵
-			contract.setNextScheduleName(endSchedule.getStageName());
-			baseMapper.updateById(contract);
-		}
-		if (ArrayUtil.isNotEmpty(afterSchedule.toArray()) && afterSchedule.size() > 1) {
-			//绗竴闃舵鐢熸晥鏃堕棿
+			if (ArrayUtil.isNotEmpty(afterSchedule.toArray()) && afterSchedule.size() > 1) {
+				//绗竴闃舵鐢熸晥鏃堕棿
 //			fitstSchedule.setEffectiveEndDate(DateUtil.offsetDay(contract.getSignDate(),fitstSchedule.getAgreedDays()));
 //			contractPaymentScheduleMapper.updateById(fitstSchedule);
-			//鏇存柊鍚堝悓涓嬩釜闃舵
-			contract.setNextScheduleName(afterSchedule.get(0).getStageName());
-			baseMapper.updateById(contract);
-		}
-		//鍙湁褰撳墠鍚堝悓绛惧瓧闃舵
+				//鏇存柊鍚堝悓涓嬩釜闃舵
+				contract.setNextScheduleName(afterSchedule.get(0).getStageName());
+				baseMapper.updateById(contract);
+			}
+			//鍙湁褰撳墠鍚堝悓绛惧瓧闃舵
 //		if(ArrayUtil.isEmpty(afterSchedule.toArray())){
 //			fitstSchedule.setEffectiveEndDate(DateUtil.offsetDay(contract.getSignDate(),fitstSchedule.getAgreedDays()));
 //			contractPaymentScheduleMapper.updateById(fitstSchedule);
 //		}
+		}
 	}
 
 	private void savePaymentConfirm(Contract contract, ContractPaymentSchedule schedule) {
@@ -378,9 +455,9 @@
 				//鏇存柊褰撳墠闃舵瀹為檯鏀舵 鍜� 鏀舵鐘舵��
 				schedule.setActualAmount(inConfirm.getTransationAmount());
 				schedule.setPaymentStatus(2);
-				if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0){
+				if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) > 0) {
 					inConfirm.setAdvanceAmount(inConfirm.getTotalAmount());
-				}else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) {
+				} else if (inConfirm.getTotalAmount().compareTo(new BigDecimal("0")) < 0) {
 					inConfirm.setReceivableAmount(inConfirm.getTotalAmount().multiply(new BigDecimal("-1")));
 					schedule.setActualAmount(currentInSum);
 					schedule.setPaymentStatus(1);
@@ -391,7 +468,7 @@
 			}
 
 
-		}else {
+		} else {
 			paymentConfirmMapper.insert(paymentConfirm);
 		}
 	}
@@ -592,4 +669,63 @@
 			e.printStackTrace();
 		}
 	}
+
+	@Override
+	public R genCycleReceiced() {
+		List<ContractExecDate> execDateList = contractExecDateMapper.selectList(Wrappers.<ContractExecDate>lambdaQuery()
+				.le(ContractExecDate::getExecDate, DateUtil.today()).eq(ContractExecDate::getGenFlag,"0"));
+		if (ArrayUtil.isNotEmpty(execDateList.toArray())) {
+			execDateList.stream().forEach(contractExecDate -> {
+				Contract contract = baseMapper.selectById(contractExecDate.getContractId());
+				ContractSubjectMatter subjectMatter = contractSubjectMatterMapper.selectOne(Wrappers.<ContractSubjectMatter>lambdaQuery()
+						.eq(ContractSubjectMatter::getContractId, contractExecDate.getContractId())
+						.eq(ContractSubjectMatter::getId, contractExecDate.getMatterId()));
+				//鐢熸垚鎶勮〃鍗�
+				if (StrUtil.isNotEmpty(subjectMatter.getMeterReadCode()) &&
+						ObjUtil.isNotNull(subjectMatter.getMeterReadNum())) {
+					MeterReadRecord record = BeanUtil.copyProperties(subjectMatter, MeterReadRecord.class, "id","meterReadNum");
+					record.setMatterId(subjectMatter.getId());
+					record.setBusGuestId(contract.getPartyAId());
+					record.setBusGuestName(contract.getPartyA());
+					meterReadRecordMapper.insert(record);
+				}else {
+					//鎴垮眿绉熻祦鐢熸垚搴旀敹
+					PaymentConfirm confirm = new PaymentConfirm();
+					confirm.setBusinessType("鎴垮眿绉熻祦搴旀敹");
+					confirm.setBusGuestId(contract.getPartyAId());
+					confirm.setBusGuestName(contract.getPartyA());
+					confirm.setContractId(contract.getId());
+					confirm.setContractName(contract.getContractName());
+					confirm.setContractNo(contract.getContractNo());
+					confirm.setConfirmTime(contractExecDate.getExecDate());
+					confirm.setTransationAmount(subjectMatter.getUnitPrice().multiply(subjectMatter.getQuantity()));
+					confirm.setTotalAmount(confirm.getTransationAmount().multiply(new BigDecimal("-1")));
+					PaymentConfirm lastConfirm = paymentConfirmMapper.selectOne(Wrappers.<PaymentConfirm>lambdaQuery().eq(PaymentConfirm::getContractId, contract.getId())
+							.orderByDesc(PaymentConfirm::getCreateTime).last("limit 1"));
+					if (ObjUtil.isNotNull(lastConfirm)) {
+						BigDecimal total = lastConfirm.getTotalAmount().add(confirm.getTotalAmount());
+						if (total.compareTo(new BigDecimal("0")) > 0) {
+							confirm.setAdvanceAmount(total);
+							confirm.setTotalAmount(total);
+						} else if (total.compareTo(new BigDecimal("0")) == 0) {
+							confirm.setTotalAmount(total);
+						} else {
+							confirm.setReceivableAmount(total.multiply(new BigDecimal("-1")));
+							confirm.setTotalAmount(total);
+						}
+						confirm.setCompId(contract.getCompId());
+						paymentConfirmMapper.insert(confirm);
+					} else {
+						confirm.setReceivableAmount(confirm.getTransationAmount());
+						confirm.setTotalAmount(confirm.getReceivableAmount().multiply(new BigDecimal("-1")));
+						confirm.setCompId(contract.getCompId());
+						paymentConfirmMapper.insert(confirm);
+					}
+				}
+				contractExecDate.setGenFlag("1");
+				contractExecDateMapper.updateById(contractExecDate);
+			});
+		}
+		return R.ok();
+	}
 }

--
Gitblit v1.9.1