diff --git a/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/SettleContractService.java b/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/SettleContractService.java
new file mode 100644
index 0000000..b9225b4
--- /dev/null
+++ b/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/SettleContractService.java
@@ -0,0 +1,34 @@
+package com.czcb.scfs.api.service.v2.contract;
+
+import com.czcb.scfs.api.core.ApiClient;
+import com.czcb.scfs.api.core.http.HttpHeaders;
+import com.czcb.scfs.api.core.http.HttpResponse;
+import com.czcb.scfs.api.service.v2.contract.model.SettleContractCollectRequest;
+import com.czcb.scfs.api.service.v2.contract.model.SettleContractCollectResponse;
+
+/**
+ *
+ * 清分协议相关 Service
+ *
+ *
+ * @author zhuqunfeng
+ * @since 2025/7/3
+ */
+public class SettleContractService {
+
+ private final ApiClient apiClient;
+
+ public SettleContractService(ApiClient apiClient) {
+ this.apiClient = apiClient;
+ }
+
+ /**
+ * 231511-清分协议归集
+ */
+ public SettleContractCollectResponse settleContractCollect(SettleContractCollectRequest request) {
+ String url = "/settle/contract/collect";
+ HttpResponse httpResponse = apiClient.post(url, HttpHeaders.apiVersionV2(),
+ request.toJsonRequest(), SettleContractCollectResponse.class);
+ return httpResponse.getServiceResponse();
+ }
+}
diff --git a/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/model/SettleContractCollectRequest.java b/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/model/SettleContractCollectRequest.java
new file mode 100644
index 0000000..0768c9d
--- /dev/null
+++ b/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/model/SettleContractCollectRequest.java
@@ -0,0 +1,80 @@
+package com.czcb.scfs.api.service.v2.contract.model;
+
+import com.czcb.scfs.api.core.ApiRequest;
+import com.czcb.scfs.api.core.agrs.TransType;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ * 231511-清分协议归集
+ *
+ *
+ * @author zhuqunfeng
+ * @since 2025/7/3
+ */
+@Data
+@Accessors(chain = true)
+@TransType("231511")
+public class SettleContractCollectRequest implements ApiRequest {
+ /**
+ * 渠道编号
+ */
+ @SerializedName("channel_no")
+ private String channelNo;
+ /**
+ * 应用编号
+ */
+ @SerializedName("app_no")
+ private String appNo;
+ /**
+ * 流水号
+ */
+ @SerializedName("serial_no")
+ private String serialNo;
+ /**
+ * 操作日期yyyy-MM-dd
+ */
+ @SerializedName("trans_date")
+ private String transDate;
+ /**
+ * 操作时间yyyy-MM-dd hh:mm:ss
+ */
+ @SerializedName("trans_tradetime")
+ private String transTradeTime;
+ /**
+ * 协议编号(主协议编号)
+ */
+ @SerializedName("contract_no")
+ private String contractNo;
+ /**
+ * 待清算账号
+ */
+ @SerializedName("account_no_settling")
+ private String accountNoSettling;
+ /**
+ * 待清算户名
+ */
+ @SerializedName("account_name_settling")
+ private String accountNameSettling;
+
+ /**
+ * 待归集协议编号List
+ */
+ @SerializedName("sub_contract_list")
+ private List subContractList;
+
+ @Data
+ public static class SubContract implements Serializable {
+ /**
+ * 待归集协议编号
+ */
+ @SerializedName("contract_no")
+ private String contractNo;
+ }
+
+}
diff --git a/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/model/SettleContractCollectResponse.java b/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/model/SettleContractCollectResponse.java
new file mode 100644
index 0000000..66a5cc0
--- /dev/null
+++ b/scfs-api-service/src/main/java/com/czcb/scfs/api/service/v2/contract/model/SettleContractCollectResponse.java
@@ -0,0 +1,48 @@
+package com.czcb.scfs.api.service.v2.contract.model;
+
+import com.czcb.scfs.api.core.ApiResponse;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ * 231511-清分协议归集
+ *
+ *
+ * @author zhuqunfeng
+ * @since 2025/7/3
+ */
+@Data
+@Accessors(chain = true)
+public class SettleContractCollectResponse implements ApiResponse {
+ /**
+ * 000000:表示成功
+ */
+ @SerializedName("recode")
+ private String recode;
+
+ /**
+ * 结果信息
+ */
+ @SerializedName("recode_info")
+ private String recodeInfo;
+
+ /**
+ * 系统流水号
+ */
+ @SerializedName("sys_serial_no")
+ private String sysSerialNo;
+
+ /**
+ * 系统日期(yyyy-MM-dd)
+ */
+ @SerializedName("sys_date")
+ private String sysDate;
+
+ /**
+ * 系统时间(yyyy-MM-dd HH:mm:ss)
+ */
+ @SerializedName("sys_time")
+ private String sysTime;
+}
\ No newline at end of file
diff --git a/scfs-api-service/src/test/java/com/czcb/scfs/api/service/v2/contract/SettleContractServiceTest.java b/scfs-api-service/src/test/java/com/czcb/scfs/api/service/v2/contract/SettleContractServiceTest.java
new file mode 100644
index 0000000..5d74866
--- /dev/null
+++ b/scfs-api-service/src/test/java/com/czcb/scfs/api/service/v2/contract/SettleContractServiceTest.java
@@ -0,0 +1,104 @@
+package com.czcb.scfs.api.service.v2.contract;
+
+import com.czcb.scfs.api.core.ApiClient;
+import com.czcb.scfs.api.core.http.HttpHeaders;
+import com.czcb.scfs.api.core.http.HttpResponse;
+import com.czcb.scfs.api.core.http.RequestBody;
+import com.czcb.scfs.api.core.util.Json;
+import com.czcb.scfs.api.service.MockHttpResponse;
+import com.czcb.scfs.api.service.v2.contract.model.SettleContractCollectRequest;
+import com.czcb.scfs.api.service.v2.contract.model.SettleContractCollectResponse;
+import org.assertj.core.util.Lists;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+
+@ExtendWith(MockitoExtension.class)
+class SettleContractServiceTest {
+ @InjectMocks
+ private SettleContractService service;
+
+ @Mock
+ private ApiClient apiClient;
+ @Test
+ void settleContractCollectTest() {
+ SettleContractCollectRequest request = new SettleContractCollectRequest();
+ extractedSettleContractCollectRequestParams(request);
+ extractedSettleContractCollectRequestAssertions(request);
+
+ System.out.println(Json.toJson(request));
+ String requestJson = Json.toJson(request);
+ Assertions.assertEquals("{\"channel_no\":\"setChannelNo\",\"app_no\":\"setAppNo\",\"trans_date\":\"setTransDate\",\"trans_tradetime\":\"setTransTradeTime\",\"contract_no\":\"setContractNo\",\"account_no_settling\":\"setAccountNoSettling\",\"account_name_settling\":\"setAccountNameSettling\",\"sub_contract_list\":[{\"contract_no\":\"setContractNo\"}]}", requestJson);
+
+ SettleContractCollectResponse response = new SettleContractCollectResponse();
+ extractedSettleContractCollectResponseParams(response);
+ extractedSettleContractCollectResponseAssertions(response);
+
+ System.out.println(Json.toJson(response));
+ String responseJson = Json.toJson(response);
+ Assertions.assertEquals("{\"recode\":\"setRecode\",\"recode_info\":\"setRecodeInfo\",\"sys_serial_no\":\"setSysSerialNo\",\"sys_date\":\"setSysDate\",\"sys_time\":\"setSysTime\"}", responseJson);
+
+ HttpResponse httpResponse = MockHttpResponse.create("/settle/contract/collect", response, SettleContractCollectResponse.class);
+ Mockito.when(apiClient.post(
+ Mockito.eq("/settle/contract/collect"),
+ Mockito.any(HttpHeaders.class),
+ Mockito.any(RequestBody.class),
+ Mockito.eq(SettleContractCollectResponse.class)))
+ .thenReturn(httpResponse);
+
+ SettleContractCollectResponse result = service.settleContractCollect(request);
+
+ System.out.println(Json.toJson(result));
+ String resultJson = Json.toJson(result);
+ Assertions.assertEquals("{\"recode\":\"setRecode\",\"recode_info\":\"setRecodeInfo\",\"sys_serial_no\":\"setSysSerialNo\",\"sys_date\":\"setSysDate\",\"sys_time\":\"setSysTime\"}", resultJson);
+ }
+ void extractedSettleContractCollectRequestParams(SettleContractCollectRequest request) {
+ request.setAccountNoSettling("setAccountNoSettling");
+ request.setTransTradeTime("setTransTradeTime");
+ SettleContractCollectRequest.SubContract subcontract = new SettleContractCollectRequest.SubContract();
+ extractedSettleContractCollectRequestSubContractNestParams(subcontract);
+ request.setSubContractList(Lists.list(subcontract));
+ request.setAccountNameSettling("setAccountNameSettling");
+ request.setAppNo("setAppNo");
+ request.setTransDate("setTransDate");
+ request.setChannelNo("setChannelNo");
+ request.setContractNo("setContractNo");
+ }
+ void extractedSettleContractCollectRequestSubContractNestParams(SettleContractCollectRequest.SubContract nest) {
+ nest.setContractNo("setContractNo");
+ }
+ void extractedSettleContractCollectRequestSubContractNestAssertions(SettleContractCollectRequest.SubContract nest) {
+ Assertions.assertEquals("setContractNo", nest.getContractNo());
+ }
+ void extractedSettleContractCollectRequestAssertions(SettleContractCollectRequest request) {
+ Assertions.assertEquals("setAccountNoSettling", request.getAccountNoSettling());
+ Assertions.assertEquals("setTransTradeTime", request.getTransTradeTime());
+ for (SettleContractCollectRequest.SubContract subcontract : request.getSubContractList()) {
+ extractedSettleContractCollectRequestSubContractNestAssertions(subcontract);
+ }
+ Assertions.assertEquals("setAccountNameSettling", request.getAccountNameSettling());
+ Assertions.assertEquals("setAppNo", request.getAppNo());
+ Assertions.assertEquals("setTransDate", request.getTransDate());
+ Assertions.assertEquals("setChannelNo", request.getChannelNo());
+ Assertions.assertEquals("setContractNo", request.getContractNo());
+ }
+ void extractedSettleContractCollectResponseParams(SettleContractCollectResponse response) {
+ response.setRecodeInfo("setRecodeInfo");
+ response.setRecode("setRecode");
+ response.setSysDate("setSysDate");
+ response.setSysTime("setSysTime");
+ response.setSysSerialNo("setSysSerialNo");
+ }
+ void extractedSettleContractCollectResponseAssertions(SettleContractCollectResponse response) {
+ Assertions.assertEquals("setRecodeInfo", response.getRecodeInfo());
+ Assertions.assertEquals("setRecode", response.getRecode());
+ Assertions.assertEquals("setSysDate", response.getSysDate());
+ Assertions.assertEquals("setSysTime", response.getSysTime());
+ Assertions.assertEquals("setSysSerialNo", response.getSysSerialNo());
+ }
+}
\ No newline at end of file
diff --git a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java
index e97cf19..da667ff 100644
--- a/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java
+++ b/scfs-api-spring-boot-starter/src/main/java/com/czcb/scfs/spring/boot/starter/ScfsAutoConfiguration.java
@@ -10,6 +10,7 @@ import com.czcb.scfs.api.service.v2.bmd.BmdService;
import com.czcb.scfs.api.service.v2.cat.order.OrderService;
import com.czcb.scfs.api.service.v2.cat.project.ProjectService;
import com.czcb.scfs.api.service.v2.communal.CommunalDataService;
+import com.czcb.scfs.api.service.v2.contract.SettleContractService;
import com.czcb.scfs.api.service.v2.entpay.EntPayService;
import com.czcb.scfs.api.service.v2.loan.CreditPayService;
import com.czcb.scfs.api.service.v2.order.*;
@@ -269,6 +270,16 @@ public class ScfsAutoConfiguration {
return new OrderTradeUnitPayService(apiClient);
}
+ /**
+ * 清分协议相关
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ @ConditionalOnClass(SettleContractService.class)
+ public SettleContractService settleContractService(ApiClient apiClient) {
+ return new SettleContractService(apiClient);
+ }
+
/**
* 订单(国业)管理
*/
diff --git a/scfs-api-test/src/main/resources/application.properties b/scfs-api-test/src/main/resources/application.properties
index 4041371..9b52982 100644
--- a/scfs-api-test/src/main/resources/application.properties
+++ b/scfs-api-test/src/main/resources/application.properties
@@ -1,7 +1,7 @@
scfs.api-gateway.online=false
#scfs.api-gateway.host=http://10.131.98.80:8088/api-gateway
-scfs.api-gateway.host=http://10.129.155.38:8088/api-gateway
-#scfs.api-gateway.host=http://127.0.0.1:8088/api-gateway
+#scfs.api-gateway.host=http://10.129.155.38:8088/api-gateway
+scfs.api-gateway.host=http://127.0.0.1:8088/api-gateway
scfs.api-gateway.channel.channel-no=1021
scfs.api-gateway.channel.app-no=42
scfs.api-gateway.cipher.store-type=resources
diff --git a/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/SettleContractServiceTest.java b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/SettleContractServiceTest.java
new file mode 100644
index 0000000..01c90d2
--- /dev/null
+++ b/scfs-api-test/src/test/java/com/czcb/scfs/api/test/service/SettleContractServiceTest.java
@@ -0,0 +1,51 @@
+package com.czcb.scfs.api.test.service;
+
+import com.czcb.scfs.api.service.v2.contract.SettleContractService;
+import com.czcb.scfs.api.service.v2.contract.model.SettleContractCollectRequest;
+import com.czcb.scfs.api.service.v2.contract.model.SettleContractCollectResponse;
+import com.czcb.scfs.api.test.FmtDate;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ *
+ * 清分协议相关功能 测试类
+ *
+ *
+ * @author zhuqunfeng
+ * @since 2025/7/3
+ */
+@SpringBootTest
+class SettleContractServiceTest {
+
+ @Resource
+ private SettleContractService settleContractService;
+
+ @Test
+ void collect() {
+ SettleContractCollectRequest request = new SettleContractCollectRequest();
+ request.setChannelNo("1021");
+ request.setAppNo("21");
+ request.setSerialNo(UUID.randomUUID().toString().replace("-", ""));
+ request.setTransDate(FmtDate.transDate());
+ request.setTransTradeTime(FmtDate.transTradeTime());
+ request.setContractNo("AGENT-zqh");
+ request.setAccountNoSettling("1021231004000145");
+ request.setAccountNameSettling("孟怡宁");
+ List subContracts = new ArrayList<>();
+ SettleContractCollectRequest.SubContract subContract = new SettleContractCollectRequest.SubContract();
+ subContract.setContractNo("AGENT-123-KK");
+ subContracts.add(subContract);
+ request.setSubContractList(subContracts);
+ SettleContractCollectResponse response = settleContractService.settleContractCollect(request);
+ System.out.println(response);
+ Assertions.assertEquals("000000", response.getRecode());
+ }
+
+}