From 2db76f2066701cbe292f206ad49a7f8523b8aa9f Mon Sep 17 00:00:00 2001
From: shiyunteng <shiyunteng@example.com>
Date: 星期五, 14 八月 2026 16:30:25 +0800
Subject: [PATCH] feat:银行流水关联多个合同,新增预收款开票,所有List校验调整为ColUtil

---
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java |  144 ++++++++++++++++++++++++++++-------------------
 1 files changed, 85 insertions(+), 59 deletions(-)

diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java
index 15acf79..0bc4219 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BankStatementServiceImpl.java
@@ -1,5 +1,7 @@
 package com.by4cloud.platformx.business.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.StrUtil;
@@ -7,22 +9,28 @@
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.by4cloud.platformx.admin.api.entity.SysDept;
+import com.by4cloud.platformx.admin.api.feign.RemoteDeptService;
 import com.by4cloud.platformx.business.dto.BankStatementUpdateDTO;
 import com.by4cloud.platformx.business.dto.PaymentConfirmAddDTO;
-import com.by4cloud.platformx.business.entity.BankStatement;
-import com.by4cloud.platformx.business.entity.BusinessCustomer;
-import com.by4cloud.platformx.business.entity.Contract;
+import com.by4cloud.platformx.business.entity.*;
+import com.by4cloud.platformx.business.mapper.BankStatementItemMapper;
 import com.by4cloud.platformx.business.mapper.BankStatementMapper;
 import com.by4cloud.platformx.business.mapper.BusinessCustomerMapper;
 import com.by4cloud.platformx.business.mapper.ContractMapper;
 import com.by4cloud.platformx.business.service.BankStatementService;
 import com.by4cloud.platformx.business.service.PaymentConfirmService;
 import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.security.util.SecurityUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
 /**
  * 閾惰娴佹按
  *
@@ -38,48 +46,82 @@
 	private final ContractMapper contractMapper;
 	private final BusinessCustomerMapper businessCustomerMapper;
 	private final StringRedisTemplate redisTemplate;
+	private final RemoteDeptService remoteDeptService;
+	private final BankStatementItemMapper bankStatementItemMapper;
 
 	@Value("${bip.url}")
 	private String url;
 
+	@Value("${BWInvoice.flag}")
+	private Boolean bwFlag;
+
 	@Override
 	public R edit(BankStatementUpdateDTO updateDTO) {
 		BankStatement statement = baseMapper.selectById(updateDTO.getId());
-		Contract contract = contractMapper.selectById(updateDTO.getContractId());
-		if (ObjUtil.isNull(contract)){
-			return R.failed("鍚堝悓鏌ヨ澶辫触");
+		if (CollUtil.isEmpty(updateDTO.getContractCollectionList())){
+			return R.failed("璇烽�夋嫨鏀舵鍚堝悓鍚庡湪鎻愪氦");
 		}
-		PaymentConfirmAddDTO addDTO = new PaymentConfirmAddDTO();
-		addDTO.setBusGuestId(statement.getBusGuestId()+"");
-		addDTO.setConfirmTime(statement.getTranDate());
-		addDTO.setContractNo(contract.getContractNo());
-		addDTO.setInOrOut("1");
-		addDTO.setTransationAmount(statement.getTranAmount());
-		R r = paymentConfirmService.add(addDTO);
-		if (!r.isOk()){
-			return r;
+		BigDecimal toPaidTotal = updateDTO.getContractCollectionList().stream() .map(StatementContractDTO::getToPaidAmount)
+				.reduce(BigDecimal.ZERO, BigDecimal::add);
+		if (toPaidTotal.compareTo(statement.getTranAmount().subtract(statement.getConfirmAmount()))>0){
+			return R.failed("纭鏀舵鎬婚涓嶈兘瓒呰繃浜ゆ槗娴佹按閲戦");
 		}
-		statement.setContractId(updateDTO.getContractId());
+		statement.setConfirmAmount(statement.getConfirmAmount().add(toPaidTotal));
 		baseMapper.updateById(statement);
 
+		updateDTO.getContractCollectionList().stream().forEach(statementContractDTO -> {
+			BankStatementItem item = new BankStatementItem();
+			item.setStatetId(statement.getId());
+			item.setBankSeqNo(statement.getBankSeqNo());
+			item.setConfirmAmount(statementContractDTO.getToPaidAmount());
+			item.setContractId(statementContractDTO.getId());
+			bankStatementItemMapper.insert(item);
+
+			Contract contract = contractMapper.selectById(statementContractDTO.getId());
+			PaymentConfirmAddDTO addDTO = new PaymentConfirmAddDTO();
+			addDTO.setBusGuestId(statement.getBusGuestId()+"");
+			addDTO.setConfirmTime(statement.getTranDate());
+			addDTO.setContractNo(contract.getContractNo());
+			addDTO.setInOrOut("1");
+			addDTO.setTransationAmount(statementContractDTO.getToPaidAmount());
+			addDTO.setBankSeqNo(statement.getBankSeqNo());
+			paymentConfirmService.add(addDTO);
+		});
+
+
+
 		//bip鎺ㄩ��
-		pushSaveCollection(statement);
+		if (bwFlag) {
+			pushSaveCollection(statement, updateDTO.getContractCollectionList());
+		}
 		return R.ok();
 	}
 
-	private void pushSaveCollection(BankStatement statement) {
+	private void pushSaveCollection(BankStatement statement, List<StatementContractDTO> contractDTOList) {
 		String accessToken = "";
 		if (redisTemplate.hasKey("BIP_TOKEN")) {
 			accessToken = (String) redisTemplate.opsForValue().get("BIP_TOKEN");
 		} else {
-			paymentConfirmService.getAccessToken(accessToken);
+			accessToken = paymentConfirmService.getAccessToken(accessToken);
 		}
 		if (StrUtil.isEmpty(accessToken)) {
 			log.error("bip accessToken 鑾峰彇寮傚父");
 			return;
 		}
 		String finalAccessToken = accessToken;
-		JSONObject params = genRequestParam(statement);
+
+		BusinessCustomer customer = businessCustomerMapper.selectById(statement.getBusGuestId());
+		if (ObjUtil.isNull(customer)||StrUtil.isEmpty(customer.getBipCode())){
+			log.error("鏌ヨ瀹㈡埛淇℃伅寮傚父");
+			return;
+		}
+		R<SysDept> r = remoteDeptService.getById(SecurityUtils.getUser().getCompId());
+		if (!r.isOk()){
+			log.error("鏌ヨ鍗曚綅淇℃伅寮傚父");
+			return;
+		}
+		SysDept dept = r.getData();
+		JSONObject params = genRequestParam(statement,dept,customer,contractDTOList);
 
 		log.info("鏀舵鍗曢泦鎴� Request:{}", params.toJSONString());
 		String result = HttpUtil.post(url + "/yonbip/EFI/receivable/save?access_token=" + finalAccessToken, params.toJSONString());
@@ -87,47 +129,31 @@
 
 	}
 
-	private JSONObject genRequestParam(BankStatement statement) {
-		BusinessCustomer customer = businessCustomerMapper.selectById(statement.getBusGuestId());
-		Contract contract = contractMapper.selectById(statement.getContractId());
-		JSONObject req = new JSONObject();
-
+	private JSONObject genRequestParam(BankStatement statement,SysDept dept,BusinessCustomer customer,List<StatementContractDTO> contractDTOList) {
+		JSONObject jsonObject = new JSONObject();
 		JSONObject data = new JSONObject();
-
-
-		JSONObject freeCh = new JSONObject();
-		freeCh.put("YSYF57","MJHYXGLXT");
-
-		data.put("freeChId",freeCh);
-		data.put("extVouchCode",statement.getBankSeqNo());
-		data.put("billDate",statement.getTranDate());
+		data.put("billDate",DateUtil.format(statement.getTranDate(), DatePattern.NORM_DATETIME_FORMAT));
+		data.put("exchangeRate","1");//姹囩巼
+		data.put("exchangeRateDate",DateUtil.now());//姹囩巼鏃堕棿
 		data.put("objectType","1");
-		data.put("customerCode",customer.getCreditCode());
-		data.put("exchangeRate",1);
-		data.put("exchangeRateDate", DateUtil.now());
-		data.put("contractNo",contract.getContractNo());
-
-		JSONArray bodyItems = new JSONArray();
-
-		JSONObject bodyItem = new JSONObject();
-		bodyItem.put("srcBillType","38");
-		bodyItem.put("srcBillNo",statement.getBankSeqNo());
-
-		JSONObject freeChItem = new JSONObject();
-		freeChItem.put("YSZJX01A","涓氬姟璧勯噾棰勭畻椤圭洰");
-		freeChItem.put("YSZJX05","");
-		freeChItem.put("YSZJX11","2146820445301112836");
-		freeChItem.put("zzbkfl","");
-		bodyItem.put("freeChId",freeChItem);
-
-		bodyItems.add(bodyItem);
-		data.put("bodyItem",bodyItems);
-
+		data.put("customerCode",customer.getBipCode());//瀹㈡埛缂栫爜
+		data.put("financeOrgCode",dept.getBipCode());//寮�绁ㄧ粍缁囩紪鐮�
+		data.put("orgCode",dept.getBipCode());//涓氬姟缁勭粐缂栫爜
+		data.put("bustypeCode","");//浜ゆ槗绫诲瀷缂栫爜 鏆備及榛樿ZGYSFP锛岄攢鍞粯璁JHYXGLXT
+		data.put("oriCurrencyCode","CNY");//甯佺
 		data.put("_status","Insert");
-		data.put("oriTaxIncludedAmount",statement.getTranAmount());
-
-		req.put("data",data);
-		return req;
-
+		JSONArray bodyItem = new JSONArray();
+		for (StatementContractDTO statementContractDTO:contractDTOList) {
+			Contract contract = contractMapper.selectById(statementContractDTO.getId());
+			JSONObject item = new JSONObject();
+			item.put("oriTaxIncludedAmount", statementContractDTO.getToPaidAmount());
+			item.put("contractNo", contract.getContractNo());
+			item.put("quickTypeCode", "1");
+			item.put("_status", "Insert");
+			bodyItem.add(item);
+		}
+		data.put("bodyItem",bodyItem);
+		jsonObject.put("data",data);
+		return  jsonObject;
 	}
 }
\ No newline at end of file

--
Gitblit v1.9.1