From e7e6d39b095b6a763e54ab34631171c3de32ec9e Mon Sep 17 00:00:00 2001
From: 李白 <7387820+wjli_13439841639@user.noreply.gitee.com>
Date: 星期五, 15 五月 2026 08:33:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java |  105 +++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 71 insertions(+), 34 deletions(-)

diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
index ab084f0..98b4924 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
@@ -40,6 +40,7 @@
 	private final PaymentConfirmMapper paymentConfirmMapper;
 	private final ContractMapper contractMapper;
 	private final ContractPaymentScheduleProcessMapper scheduleProcessMapper;
+	private final ContractOutBoundMapper contractOutBoundMapper;
 
 	@Override
 	public R add(OutBoundAddDTO addDTO) {
@@ -49,6 +50,7 @@
 		MPJLambdaWrapper<ContractSubjectMatter> wrapper = new MPJLambdaWrapper<ContractSubjectMatter>()
 				.selectAll(ContractSubjectMatter.class)
 				.ne(ContractSubjectMatter::getDeliveryStatus, 2)
+				.in(ContractSubjectMatter::getMaterialCode,addDTO.getSubjectMatterList().stream().map(item->item.getSubjectMatterCode()).collect(Collectors.toList()))
 				.exists(Contract.class, contractQuery ->
 						contractQuery.select(ContractSubjectMatter::getId)
 								.eq(Contract::getId, ContractSubjectMatter::getContractId)
@@ -80,7 +82,7 @@
 		addDTO.getSubjectMatterList().stream().forEach(outSubjectMatterAddDTO -> {
 			BigDecimal remainNum = outSubjectMatterAddDTO.getOutBoundNum();
 			for (ContractSubjectMatter subjectMatter : subjectMatterList) {
-
+				Contract contract = contractMapper.selectById(subjectMatter.getContractId());
 				if (subjectMatter.getDeliveredQuantity().compareTo(new BigDecimal("0")) > 0) {
 					remainNum = remainNum.subtract(subjectMatter.getRemainingQuantity());
 					//閮ㄥ垎浜や粯鐘舵�佷笅 鍏ㄩ儴鍑哄簱
@@ -93,15 +95,19 @@
 						subjectMatter.setLastDeliveredQuantity(currentOut);
 						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 					} else {
 						BigDecimal currentOut = remainNum.add(subjectMatter.getRemainingQuantity());
 						subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum));
-						subjectMatter.setRemainingQuantity(remainNum.multiply(new BigDecimal("-1")));
+						subjectMatter.setRemainingQuantity(subjectMatter.getRemainingQuantity().subtract(currentOut));
 						subjectMatter.setActualDeliveryDate(DateUtil.today());
 						subjectMatter.setDeliveryStatus(1);
 						subjectMatter.setLastDeliveredQuantity(currentOut);
 						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 						break;
 					}
 
@@ -113,9 +119,11 @@
 						subjectMatter.setRemainingQuantity(new BigDecimal("0"));
 						subjectMatter.setActualDeliveryDate(DateUtil.today());
 						subjectMatter.setDeliveryStatus(2);
-						contractSubjectMatterMapper.updateById(subjectMatter);
 						subjectMatter.setLastDeliveredQuantity(subjectMatter.getQuantity());
+						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 					} else {
 						BigDecimal currentOut = remainNum.add(subjectMatter.getQuantity());
 						subjectMatter.setDeliveredQuantity(subjectMatter.getQuantity().add(remainNum));
@@ -125,6 +133,8 @@
 						subjectMatter.setLastDeliveredQuantity(currentOut);
 						contractSubjectMatterMapper.updateById(subjectMatter);
 						currentOutList.add(subjectMatter);
+						//鏂板鍚堝悓鍑哄簱鍘嗗彶
+						saveContractOutBound(contract,addDTO,subjectMatter);
 						break;
 					}
 				}
@@ -148,7 +158,7 @@
 				//褰撳墠鍑哄簱閲戦
 				BigDecimal outPirce = value.stream()
 						.filter(item -> item.getLastDeliveredQuantity() != null && item.getUnitPrice() != null)
-						.map(item -> item.getLastDeliveredQuantity().multiply(item.getUnitPrice()))
+						.map(item ->(item.getDeliveryStatus()==1?item.getDeliveredQuantity():item.getQuantity()).multiply(item.getUnitPrice()))
 						.reduce(BigDecimal.ZERO, BigDecimal::add);
 				//鍚堝悓閲戦
 				Contract contract = contractMapper.selectById(key);
@@ -162,7 +172,6 @@
 					contractMapper.updateById(contract);
 				}
 				if (ObjUtil.isNotNull(schedule)) {
-
 					//鎸夊嚭搴撹祫閲戞瘮渚� 璁$畻鍙戣揣鍓嶅簲鏀舵洿鏂拌祫閲戞槑缁�
 					PaymentConfirm paymentConfirm = new PaymentConfirm();
 					paymentConfirm.setBusinessType("鍙戣揣鍓嶅簲鏀�");
@@ -215,43 +224,56 @@
 					//鏌ヨ鏄惁鏈夊悗缁樁娈�
 					List<ContractPaymentSchedule> afterSchedule = scheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
 							.eq(ContractPaymentSchedule::getContractId, schedule.getContractId())
-							.gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder()));
+							.gt(ContractPaymentSchedule::getStageOrder, schedule.getStageOrder())
+							.orderByAsc(ContractPaymentSchedule::getCreateTime));
 					if (ArrayUtil.isNotEmpty(afterSchedule.toArray())&&afterSchedule.size()==1){
-
 						//鏈�鍚庨樁娈电敓鏁堟椂闂�
 						ContractPaymentSchedule endSchedule = afterSchedule.get(0);
-						endSchedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(),endSchedule.getAgreedDays()));
-						endSchedule.setEffectiveEndDate(contract.getExpirationDate());
-						scheduleMapper.updateById(endSchedule);
-						//褰撳墠闃舵鐢熸晥鏃堕棿
-						schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(),schedule.getAgreedDays()));
-						schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
-						scheduleMapper.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.getOutBoundTime());
-						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.getOutBoundTime(), endSchedule.getAgreedDays()));
+							endSchedule.setEffectiveEndDate(contract.getExpirationDate());
+							scheduleMapper.updateById(endSchedule);
+							//褰撳墠闃舵鐢熸晥鏃堕棿
+							schedule.setEffectiveDate(DateUtil.offsetDay(addDTO.getOutBoundTime(), schedule.getAgreedDays()));
+							schedule.setEffectiveEndDate(endSchedule.getEffectiveDate());
+							scheduleMapper.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.getOutBoundTime());
+							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);
+						//鏇存柊鍚堝悓涓嬩釜闃舵
+						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());
 						scheduleMapper.updateById(schedule);
+						//鏇存柊鍚堝悓涓嬩釜闃舵
+						contract.setNextScheduleName("鏃�");
+						contractMapper.updateById(contract);
 					}
 				}
 			});
@@ -259,4 +281,19 @@
 
 		return R.ok();
 	}
+
+	private void saveContractOutBound(Contract contract, OutBoundAddDTO addDTO, ContractSubjectMatter subjectMatter) {
+		ContractOutBound contractOutBound = new ContractOutBound();
+		contractOutBound.setContractId(contract.getId());
+		contractOutBound.setContractName(contract.getContractName());
+		contractOutBound.setBusGuestId(contract.getPartyAId());
+		contractOutBound.setBusGuestName(contract.getPartyA());
+		contractOutBound.setSubjectMatterCode(subjectMatter.getMaterialCode());
+		contractOutBound.setSubjectMatterName(subjectMatter.getMaterialInternalName());
+		contractOutBound.setOutBoundTime(addDTO.getOutBoundTime());
+		contractOutBound.setOutBoundNum(subjectMatter.getLastDeliveredQuantity());
+		contractOutBound.setOutBoundAttNames(addDTO.getOutBoundAttNames());
+		contractOutBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths());
+		contractOutBoundMapper.insert(contractOutBound);
+	}
 }
\ No newline at end of file

--
Gitblit v1.9.1