commit 3b70da2f0b7c4c2d0fc47da22daf0ba34b1a1d92
Author: zhouxiaofeng <2946471396@qq.com>
Date: Tue May 26 10:08:21 2026 +0800
首次提交
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ed8368a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,47 @@
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+*.swp
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..ba835b9
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,123 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.5
+
+
+
+ com.nbport
+ zgwl-end
+ 1.0.0-SNAPSHOT
+ zgwl-end
+ zgwl-end single module demo
+ jar
+
+
+ 17
+ 3.5.11
+ UTF-8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ 2.2.0
+
+
+ com.baomidou
+ mybatis-plus-spring-boot3-starter
+ ${mybatis-plus.version}
+
+
+ com.baomidou
+ mybatis-plus-jsqlparser
+ ${mybatis-plus.version}
+
+
+ com.mysql
+ mysql-connector-j
+ runtime
+
+
+ com.oracle.database.jdbc
+ ojdbc11
+ runtime
+
+
+ cn.hutool
+ hutool-all
+ 5.8.16
+
+
+ com.alibaba
+ easyexcel
+ 3.3.2
+
+
+ org.apache.xmlbeans
+ xmlbeans
+ 3.1.0
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ 2.0.47
+
+
+ net.coobird
+ thumbnailator
+ 0.4.8
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.32
+
+
+
+
+
+
+
diff --git a/src/main/java/com/nbport/zgwl/ZgwlEndApplication.java b/src/main/java/com/nbport/zgwl/ZgwlEndApplication.java
new file mode 100644
index 0000000..d1efab7
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/ZgwlEndApplication.java
@@ -0,0 +1,18 @@
+package com.nbport.zgwl;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@MapperScan({
+ "com.nbport.zgwl.mapper",
+ "com.nbport.zgwl.partner.mapper",
+ "com.nbport.zgwl.manifest.mapper"
+})
+@SpringBootApplication
+public class ZgwlEndApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ZgwlEndApplication.class, args);
+ }
+}
diff --git a/src/main/java/com/nbport/zgwl/common/ErrorCode.java b/src/main/java/com/nbport/zgwl/common/ErrorCode.java
new file mode 100644
index 0000000..25910df
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/common/ErrorCode.java
@@ -0,0 +1,21 @@
+package com.nbport.zgwl.common;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ErrorCode implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private String code;
+
+ private String msg;
+}
diff --git a/src/main/java/com/nbport/zgwl/common/GlobalErrorCodeConstants.java b/src/main/java/com/nbport/zgwl/common/GlobalErrorCodeConstants.java
new file mode 100644
index 0000000..53ecac6
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/common/GlobalErrorCodeConstants.java
@@ -0,0 +1,14 @@
+package com.nbport.zgwl.common;
+
+import com.nbport.zgwl.exception.ServiceErrorCodeRange;
+
+public interface GlobalErrorCodeConstants {
+
+ ErrorCode SUCCESS = new ErrorCode("0000", "成功");
+ ErrorCode ERROR = new ErrorCode("9999", "失败");
+ ErrorCode USER_NOT_FOUND = new ErrorCode(ServiceErrorCodeRange.USER_NOT_FOUND, "用户不存在");
+ ErrorCode USERNAME_OR_PWD_ERROR = new ErrorCode(ServiceErrorCodeRange.USERNAME_OR_PWD_ERROR, "用户名或密码错误");
+ ErrorCode USER_NOT_FOUND_OR_NO_DEFAULT = new ErrorCode(ServiceErrorCodeRange.USER_NOT_FOUND, "用户不存在或多租户未配置");
+ ErrorCode UNKNOWN = new ErrorCode(ServiceErrorCodeRange.DEFAULT, "未知错误");
+ ErrorCode PARAMS_ERROR = new ErrorCode(ServiceErrorCodeRange.DEFAULT, "参数不正确");
+}
diff --git a/src/main/java/com/nbport/zgwl/common/PageResult.java b/src/main/java/com/nbport/zgwl/common/PageResult.java
new file mode 100644
index 0000000..3b5c5d1
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/common/PageResult.java
@@ -0,0 +1,36 @@
+package com.nbport.zgwl.common;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class PageResult implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private Long pageNo;
+
+ private Long pageSize;
+
+ private Long total;
+
+ private Long totalPage;
+
+ private List records = new ArrayList<>();
+
+ public PageResult(IPage page) {
+ this.pageNo = page.getCurrent();
+ this.pageSize = page.getSize();
+ this.total = page.getTotal();
+ this.totalPage = page.getPages();
+ this.records = page.getRecords();
+ }
+}
diff --git a/src/main/java/com/nbport/zgwl/common/R.java b/src/main/java/com/nbport/zgwl/common/R.java
new file mode 100644
index 0000000..618994d
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/common/R.java
@@ -0,0 +1,158 @@
+package com.nbport.zgwl.common;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonView;
+import com.nbport.zgwl.exception.ServiceErrorCodeRange;
+import com.nbport.zgwl.exception.ServiceException;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Objects;
+
+public class R implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @Schema(description = "响应状态码", example = "0000")
+ @JsonView(Views.Public.class)
+ private String code;
+
+ @Schema(description = "响应数据")
+ @JsonView(Views.Public.class)
+ private T result;
+
+ @Schema(description = "响应消息", example = "操作成功")
+ @JsonView(Views.Public.class)
+ private String message;
+
+ public static R error(R> result) {
+ return error(result.getCode(), result.getMessage());
+ }
+
+ public static R error(String code, String message) {
+ if (Objects.equals(GlobalErrorCodeConstants.SUCCESS.getCode(), code)) {
+ throw new ServiceException(ServiceErrorCodeRange.DEFAULT, "code 必须是错误的!");
+ }
+ R result = new R<>();
+ result.code = code;
+ result.message = message;
+ return result;
+ }
+
+ public static R error(ErrorCode errorCode) {
+ return error(errorCode.getCode(), errorCode.getMsg());
+ }
+
+ public static R success(T data) {
+ R result = new R<>();
+ result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
+ result.result = data;
+ result.message = "";
+ return result;
+ }
+
+ public static R success(String message) {
+ R result = new R<>();
+ result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
+ result.result = null;
+ result.message = message;
+ return result;
+ }
+
+ public static R success(String code, String message) {
+ R result = new R<>();
+ result.code = code;
+ result.result = null;
+ result.message = message;
+ return result;
+ }
+
+ public static R error(String message) {
+ R result = new R<>();
+ result.code = GlobalErrorCodeConstants.ERROR.getCode();
+ result.result = null;
+ result.message = message;
+ return result;
+ }
+
+ public static R success() {
+ R result = new R<>();
+ result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
+ result.result = null;
+ result.message = "";
+ return result;
+ }
+
+ public static R data(String message, T data) {
+ R result = new R<>();
+ result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
+ result.result = data;
+ result.message = message;
+ return result;
+ }
+
+ public static R data(T data) {
+ R result = new R<>();
+ result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
+ result.result = data;
+ result.message = null;
+ return result;
+ }
+
+ public static boolean isSuccess(String code) {
+ return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode());
+ }
+
+ @JsonIgnore
+ public boolean isSuccess() {
+ return isSuccess(code);
+ }
+
+ @JsonIgnore
+ public boolean isError() {
+ return !isSuccess();
+ }
+
+ public void checkError() throws ServiceException {
+ if (isSuccess()) {
+ return;
+ }
+ throw new ServiceException(code, message);
+ }
+
+ @JsonIgnore
+ public T getCheckedData() {
+ checkError();
+ return result;
+ }
+
+ public static R error(ServiceException serviceException) {
+ return error(serviceException.getCode(), serviceException.getMessage());
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public T getResult() {
+ return result;
+ }
+
+ public void setResult(T result) {
+ this.result = result;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/main/java/com/nbport/zgwl/common/Views.java b/src/main/java/com/nbport/zgwl/common/Views.java
new file mode 100644
index 0000000..dbabad3
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/common/Views.java
@@ -0,0 +1,10 @@
+package com.nbport.zgwl.common;
+
+public class Views {
+
+ private Views() {
+ }
+
+ public interface Public {
+ }
+}
diff --git a/src/main/java/com/nbport/zgwl/config/MybatisPlusConfig.java b/src/main/java/com/nbport/zgwl/config/MybatisPlusConfig.java
new file mode 100644
index 0000000..372b152
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/config/MybatisPlusConfig.java
@@ -0,0 +1,39 @@
+package com.nbport.zgwl.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusConfig {
+
+ @Value("${spring.datasource.url:}")
+ private String datasourceUrl;
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ PaginationInnerInterceptor paginationInnerInterceptor =
+ new PaginationInnerInterceptor(resolveDbType(datasourceUrl));
+ paginationInnerInterceptor.setMaxLimit(500L);
+ interceptor.addInnerInterceptor(paginationInnerInterceptor);
+ return interceptor;
+ }
+
+ private DbType resolveDbType(String jdbcUrl) {
+ if (jdbcUrl == null) {
+ return DbType.MYSQL;
+ }
+ String url = jdbcUrl.toLowerCase();
+ if (url.startsWith("jdbc:oracle:")) {
+ return DbType.ORACLE;
+ }
+ if (url.startsWith("jdbc:mysql:")) {
+ return DbType.MYSQL;
+ }
+ return DbType.MYSQL;
+ }
+}
diff --git a/src/main/java/com/nbport/zgwl/contractpush/config/ContractPushConfiguration.java b/src/main/java/com/nbport/zgwl/contractpush/config/ContractPushConfiguration.java
new file mode 100644
index 0000000..c19deeb
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/contractpush/config/ContractPushConfiguration.java
@@ -0,0 +1,19 @@
+package com.nbport.zgwl.contractpush.config;
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * 推送模块基础配置
+ */
+@Configuration
+@EnableConfigurationProperties(ContractPushProperties.class)
+public class ContractPushConfiguration {
+
+ @Bean
+ public RestTemplate contractPushRestTemplate() {
+ return new RestTemplate();
+ }
+}
diff --git a/src/main/java/com/nbport/zgwl/contractpush/config/ContractPushProperties.java b/src/main/java/com/nbport/zgwl/contractpush/config/ContractPushProperties.java
new file mode 100644
index 0000000..f1c2ba1
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/contractpush/config/ContractPushProperties.java
@@ -0,0 +1,66 @@
+package com.nbport.zgwl.contractpush.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 合同推送相关配置
+ * 默认从 application.yml 读取测试地址
+ * 生产环境可以通过 application-prod.yml 覆盖
+ */
+@Data
+@ConfigurationProperties(prefix = "contract-push")
+public class ContractPushProperties {
+
+ private Settlement settlement = new Settlement();
+
+ private DataCollection dataCollection = new DataCollection();
+
+ @Data
+ public static class Settlement {
+
+ private String systemKey;
+
+ private String secretKey;
+
+ private String tokenUrl;
+
+ private String pushContractUrl;
+
+ private String approveQueryUrl;
+
+ private String archiveUrl;
+
+ private String approveViewBaseUrl;
+ }
+
+ @Data
+ public static class DataCollection {
+
+ private String systemKey;
+
+ private String secretKey;
+
+ private String sysCode;
+
+ private String tokenUrl;
+
+ private String uploadUrl;
+
+ private String collectOppositesUrl;
+
+ private String collectZtbsUrl;
+
+ private String collectContractUrl;
+
+ private String collectPlanFeedbackUrl;
+
+ private String collectContractCloseUrl;
+
+ private String collectContractArchiveUrl;
+
+ private String queryApproveInfoUrl;
+
+ private String approveViewBaseUrl;
+ }
+}
diff --git a/src/main/java/com/nbport/zgwl/contractpush/controller/DataCollectionPushController.java b/src/main/java/com/nbport/zgwl/contractpush/controller/DataCollectionPushController.java
new file mode 100644
index 0000000..dc12d8e
--- /dev/null
+++ b/src/main/java/com/nbport/zgwl/contractpush/controller/DataCollectionPushController.java
@@ -0,0 +1,84 @@
+package com.nbport.zgwl.contractpush.controller;
+
+import com.nbport.zgwl.common.R;
+import com.nbport.zgwl.contractpush.dto.ApproveQueryRequestDTO;
+import com.nbport.zgwl.contractpush.dto.ApproveViewUrlRequestDTO;
+import com.nbport.zgwl.contractpush.dto.PushPayloadDTO;
+import com.nbport.zgwl.contractpush.dto.PushTokenRequestDTO;
+import com.nbport.zgwl.contractpush.service.DataCollectionPushService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+
+/**
+ * 数据采集推送相关接口
+ * 对应《数据采集接口规范V3.0》
+ */
+@RestController
+@RequestMapping("/contract/push/data-collection")
+public class DataCollectionPushController {
+
+ private final DataCollectionPushService dataCollectionPushService;
+
+ public DataCollectionPushController(DataCollectionPushService dataCollectionPushService) {
+ this.dataCollectionPushService = dataCollectionPushService;
+ }
+
+ @GetMapping("/token")
+ public R