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()); + } + +}