浏览代码

项目升级修改

master
Searises Hao Wang 4 周前
父节点
当前提交
d3ca6336b3
共有 32 个文件被更改,包括 2228 次插入193 次删除
  1. +19
    -5
      pom.xml
  2. +14
    -2
      src/main/java/com/example/webapi/WebApiApplication.java
  3. +149
    -0
      src/main/java/com/example/webapi/config/DataSourceConfig.java
  4. +15
    -0
      src/main/java/com/example/webapi/config/SimpleJpaConfig.java
  5. +31
    -25
      src/main/java/com/example/webapi/config/SwaggerConfig.java
  6. +20
    -0
      src/main/java/com/example/webapi/config/SwaggerTestConfig.java
  7. +17
    -31
      src/main/java/com/example/webapi/controller/SupplyVarietyController.java
  8. +16
    -30
      src/main/java/com/example/webapi/controller/TransferRecordController.java
  9. +16
    -30
      src/main/java/com/example/webapi/controller/TransportCompanyController.java
  10. +82
    -0
      src/main/java/com/example/webapi/controller/TwiceWeighingController.java
  11. +16
    -30
      src/main/java/com/example/webapi/controller/VehicleInfoController.java
  12. +16
    -30
      src/main/java/com/example/webapi/controller/WeighingRecordController.java
  13. +248
    -0
      src/main/java/com/example/webapi/dto/TwiceWeighingQueryDTO.java
  14. +2
    -1
      src/main/java/com/example/webapi/entity/MaterialInfo.java
  15. +1
    -0
      src/main/java/com/example/webapi/entity/Supplier.java
  16. +2
    -1
      src/main/java/com/example/webapi/entity/SupplyVariety.java
  17. +1
    -0
      src/main/java/com/example/webapi/entity/TransferRecord.java
  18. +2
    -1
      src/main/java/com/example/webapi/entity/TransportCompany.java
  19. +144
    -0
      src/main/java/com/example/webapi/entity/TwiceWeighing.java
  20. +2
    -1
      src/main/java/com/example/webapi/entity/VehicleInfo.java
  21. +2
    -1
      src/main/java/com/example/webapi/entity/WeighingRecord.java
  22. +141
    -0
      src/main/java/com/example/webapi/entity/postgresql/TwiceWeighingPostgreSQL.java
  23. +73
    -0
      src/main/java/com/example/webapi/repository/TwiceWeighingRepository.java
  24. +38
    -0
      src/main/java/com/example/webapi/repository/pg/TwiceWeighingPostgreSQLRepository.java
  25. +352
    -0
      src/main/java/com/example/webapi/service/DataSyncService.java
  26. +60
    -0
      src/main/java/com/example/webapi/service/ScheduledSyncService.java
  27. +259
    -0
      src/main/java/com/example/webapi/service/TwiceWeighingService.java
  28. +163
    -0
      src/main/java/com/example/webapi/util/DataSyncTest.java
  29. +52
    -0
      src/main/java/com/example/webapi/util/DatabaseConnectionTest.java
  30. +150
    -0
      src/main/java/com/example/webapi/util/SQLServerVersionTest.java
  31. +86
    -0
      src/main/java/com/example/webapi/util/SSLTest.java
  32. +39
    -5
      src/main/resources/application.yml

+ 19
- 5
pom.xml 查看文件

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

@@ -43,6 +43,15 @@
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.2.1.jre8</version>
<scope>runtime</scope>
</dependency>

<!-- PostgreSQL JDBC Driver -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.27</version>
<scope>runtime</scope>
</dependency>

@@ -65,11 +74,16 @@
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Swagger3/Springfox 3.x 依赖 -->
<!-- Swagger2/Springfox 2.9.2 依赖 - 与Spring Boot 2.7.x兼容 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>

@@ -89,4 +103,4 @@
</plugin>
</plugins>
</build>
</project>
</project>

+ 14
- 2
src/main/java/com/example/webapi/WebApiApplication.java 查看文件

@@ -2,6 +2,11 @@ package com.example.webapi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
* SpringBoot WebAPI 应用程序主类
@@ -9,14 +14,21 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
* @author Your Name
* @version 1.0.0
*/
@SpringBootApplication
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableScheduling
@EnableSwagger2
@EnableJpaRepositories(
basePackages = {"com.example.webapi.repository.pg"},
entityManagerFactoryRef = "postgresqlEntityManagerFactory",
transactionManagerRef = "postgresqlTransactionManager"
)
public class WebApiApplication {

public static void main(String[] args) {
SpringApplication.run(WebApiApplication.class, args);
System.out.println("=================================");
System.out.println("WebAPI 应用程序启动成功!");
System.out.println("访问地址: http://localhost:8080/api");
System.out.println("访问地址: http://localhost:8806/fuquanapi");
System.out.println("=================================");
}
}

+ 149
- 0
src/main/java/com/example/webapi/config/DataSourceConfig.java 查看文件

@@ -0,0 +1,149 @@
package com.example.webapi.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DataSourceConfig {

@Value("${spring.datasource.sqlserver.url}")
private String sqlServerUrl;

@Value("${spring.datasource.sqlserver.username}")
private String sqlServerUsername;

@Value("${spring.datasource.sqlserver.password}")
private String sqlServerPassword;

@Value("${spring.datasource.sqlserver.driver-class-name}")
private String sqlServerDriverClassName;

@Value("${spring.datasource.postgresql.url}")
private String postgresqlUrl;

@Value("${spring.datasource.postgresql.username}")
private String postgresqlUsername;

@Value("${spring.datasource.postgresql.password}")
private String postgresqlPassword;

@Value("${spring.datasource.postgresql.driver-class-name}")
private String postgresqlDriverClassName;

@Primary
@Bean(name = "sqlServerDataSource")
public DataSource sqlServerDataSource() {
System.out.println("配置SQL Server数据源:");
System.out.println("URL: " + sqlServerUrl);
System.out.println("Username: " + sqlServerUsername);
System.out.println("Driver: " + sqlServerDriverClassName);

return DataSourceBuilder.create()
.url(sqlServerUrl)
.username(sqlServerUsername)
.password(sqlServerPassword)
.driverClassName(sqlServerDriverClassName)
.type(com.zaxxer.hikari.HikariDataSource.class)
.build();
}

@Bean(name = "postgresqlDataSource")
public DataSource postgresqlDataSource() {
System.out.println("配置PostgreSQL数据源:");
System.out.println("URL: " + postgresqlUrl);
System.out.println("Username: " + postgresqlUsername);
System.out.println("Driver: " + postgresqlDriverClassName);

return DataSourceBuilder.create()
.url(postgresqlUrl)
.username(postgresqlUsername)
.password(postgresqlPassword)
.driverClassName(postgresqlDriverClassName)
.type(com.zaxxer.hikari.HikariDataSource.class)
.build();
}

@Primary
@Bean(name = "sqlServerEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean sqlServerEntityManagerFactory() {
System.out.println("创建SQL Server EntityManagerFactory...");

LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(sqlServerDataSource());
em.setPackagesToScan("com.example.webapi.entity");
em.setPersistenceUnitName("sqlServerPersistenceUnit");

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.SQLServer2008Dialect");
vendorAdapter.setShowSql(true);
em.setJpaVendorAdapter(vendorAdapter);

Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", "none");
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.format_sql", "true");
properties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
em.setJpaPropertyMap(properties);

System.out.println("SQL Server EntityManagerFactory创建完成");
return em;
}

@Bean(name = "postgresqlEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean postgresqlEntityManagerFactory() {
System.out.println("创建PostgreSQL EntityManagerFactory...");

LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(postgresqlDataSource());
em.setPackagesToScan("com.example.webapi.entity.postgresql");
em.setPersistenceUnitName("postgresqlPersistenceUnit");

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect");
vendorAdapter.setShowSql(true);
em.setJpaVendorAdapter(vendorAdapter);

Map<String, Object> properties = new HashMap<>();
properties.put("hibernate.hbm2ddl.auto", "none");
properties.put("hibernate.show_sql", "true");
properties.put("hibernate.format_sql", "true");
properties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
em.setJpaPropertyMap(properties);

// System.out.println("PostgreSQL EntityManagerFactory创建完成");
// System.out.println("PostgreSQL EntityManagerFactory数据源: " + em.getDataSource());
// System.out.println("PostgreSQL EntityManagerFactory包扫描: " + em.getPackagesToScan()[0]);
// System.out.println("PostgreSQL EntityManagerFactory方言: " + vendorAdapter.getDatabasePlatform());
return em;
}

@Primary
@Bean(name = "sqlServerTransactionManager")
public PlatformTransactionManager sqlServerTransactionManager() {
System.out.println("创建SQL Server TransactionManager...");
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(sqlServerEntityManagerFactory().getObject());
System.out.println("SQL Server TransactionManager创建完成");
return transactionManager;
}

@Bean(name = "postgresqlTransactionManager")
public PlatformTransactionManager postgresqlTransactionManager() {
System.out.println("创建PostgreSQL TransactionManager...");
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(postgresqlEntityManagerFactory().getObject());
System.out.println("PostgreSQL TransactionManager创建完成");
return transactionManager;
}
}

+ 15
- 0
src/main/java/com/example/webapi/config/SimpleJpaConfig.java 查看文件

@@ -0,0 +1,15 @@
package com.example.webapi.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableJpaRepositories(
basePackages = {"com.example.webapi.repository"},
entityManagerFactoryRef = "sqlServerEntityManagerFactory",
transactionManagerRef = "sqlServerTransactionManager"
)
@EnableTransactionManagement
public class SimpleJpaConfig {
}

+ 31
- 25
src/main/java/com/example/webapi/config/SwaggerConfig.java 查看文件

@@ -3,20 +3,22 @@ package com.example.webapi.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.builders.RequestParameterBuilder;
import springfox.documentation.schema.ScalarType;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.service.ParameterType;
import springfox.documentation.service.RequestParameter;
import springfox.documentation.service.Parameter;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;
import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

/**
* Swagger配置类
* 配置Swagger3文档,支持详细的请求参数和响应参数说明
@@ -25,19 +27,23 @@ import java.util.List;
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.OAS_30)
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.webapi.controller"))
.paths(PathSelectors.any())
.build()
.globalRequestParameters(getGlobalRequestParameters())
.globalOperationParameters(getGlobalParameters())
// 以下设置对展示参数说明和返回值说明很重要
.useDefaultResponseMessages(false) // 不使用默认的响应消息
.forCodeGeneration(true) // 为代码生成优化
.pathMapping("/"); // 设置路径映射
.pathMapping("/") // 设置路径映射
.tags(new springfox.documentation.service.Tag("数据同步接口", "数据同步相关接口"))
.tags(new springfox.documentation.service.Tag("供应商管理", "供应商相关接口"))
.tags(new springfox.documentation.service.Tag("车辆管理", "车辆信息相关接口"))
.tags(new springfox.documentation.service.Tag("称重记录", "称重记录相关接口"));
}
/**
* API信息配置
*/
@@ -49,45 +55,45 @@ public class SwaggerConfig {
.contact(new Contact("开发团队", "http://www.example.com", "dev@example.com"))
.build();
}
/**
* 获取全局请求参数
* 注意:在Swagger UI中这些参数设置为非必需,以便能够正常访问Swagger界面
* 实际API调用时,这些参数仍然需要通过拦截器进行验证
*/
private List<RequestParameter> getGlobalRequestParameters() {
List<RequestParameter> parameters = new ArrayList<>();
private List<Parameter> getGlobalParameters() {
List<Parameter> parameters = new ArrayList<>();
// AK (Access Key) - 在Swagger中设为非必需,便于测试
RequestParameter akParam = new RequestParameterBuilder()
Parameter akParam = new ParameterBuilder()
.name("ak")
.description("访问密钥 (Access Key) - 必填")
.in(ParameterType.HEADER.toString())
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false) // 改为false,让Swagger UI可以正常访问
.query(param -> param.model(model -> model.scalarModel(ScalarType.STRING)))
.build();
parameters.add(akParam);
// Timestamp - 在Swagger中设为非必需,便于测试
RequestParameter timestampParam = new RequestParameterBuilder()
Parameter timestampParam = new ParameterBuilder()
.name("timestamp")
.description("时间戳 (毫秒) - 必填")
.in(ParameterType.HEADER.toString())
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false) // 改为false,让Swagger UI可以正常访问
.query(param -> param.model(model -> model.scalarModel(ScalarType.STRING)))
.build();
parameters.add(timestampParam);
// Signature - 在Swagger中设为非必需,便于测试
RequestParameter signatureParam = new RequestParameterBuilder()
Parameter signatureParam = new ParameterBuilder()
.name("signature")
.description("签名 (MD5(ak + sk + timestamp)) - 必填")
.in(ParameterType.HEADER.toString())
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false) // 改为false,让Swagger UI可以正常访问
.query(param -> param.model(model -> model.scalarModel(ScalarType.STRING)))
.build();
parameters.add(signatureParam);
return parameters;
}
}
}

+ 20
- 0
src/main/java/com/example/webapi/config/SwaggerTestConfig.java 查看文件

@@ -0,0 +1,20 @@
package com.example.webapi.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class SwaggerTestConfig implements CommandLineRunner {

private static final Logger logger = LoggerFactory.getLogger(SwaggerTestConfig.class);

@Override
public void run(String... args) throws Exception {
logger.info("=== Swagger配置测试 ===");
logger.info("Swagger UI地址: http://localhost:8806/fuquanapi/swagger-ui.html");
logger.info("API文档地址: http://localhost:8806/fuquanapi/v2/api-docs");
logger.info("Swagger配置测试完成");
}
}

+ 17
- 31
src/main/java/com/example/webapi/controller/SupplyVarietyController.java 查看文件

@@ -7,10 +7,7 @@ import com.example.webapi.dto.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@@ -18,7 +15,6 @@ import org.springframework.web.bind.annotation.*;
import java.util.Optional;

@Api(tags = "供应标识品种信息管理")
@Tag(name = "供应标识品种信息管理", description = "提供供应标识品种信息的增删改查接口")
@RestController
@RequestMapping("/supply-variety")
public class SupplyVarietyController {
@@ -28,10 +24,8 @@ public class SupplyVarietyController {

@ApiOperation(value = "条件查询供应标识品种信息(分页)", notes = "根据提供的查询条件分页查询供应标识品种信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping("/page/conditions")
public ApiResponse<Page<SupplyVariety>> pageByConditions(
@@ -42,11 +36,9 @@ public class SupplyVarietyController {

@ApiOperation(value = "根据ID查询供应标识品种信息", notes = "根据ID获取单条供应标识品种信息详情")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@GetMapping("/{id}")
public ApiResponse<SupplyVariety> getById(
@@ -58,11 +50,9 @@ public class SupplyVarietyController {

@ApiOperation(value = "新增供应标识品种信息", notes = "创建新的供应标识品种信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "创建成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "创建成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping
public ApiResponse<SupplyVariety> create(
@@ -73,17 +63,15 @@ public class SupplyVarietyController {

@ApiOperation(value = "更新供应标识品种信息", notes = "根据ID更新供应标识品种信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "更新成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "更新成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PutMapping("/{id}")
public ApiResponse<SupplyVariety> update(
@ApiParam(value = "供应标识品种ID", required = true, example = "1")
@PathVariable Integer id,
@PathVariable Integer id,
@ApiParam(value = "更新后的供应标识品种实体", required = true)
@RequestBody SupplyVariety entity) {
entity.setId(id);
@@ -92,11 +80,9 @@ public class SupplyVarietyController {

@ApiOperation(value = "删除供应标识品种信息", notes = "根据ID删除供应标识品种信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "删除成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "删除成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@DeleteMapping("/{id}")
public ApiResponse<Void> delete(


+ 16
- 30
src/main/java/com/example/webapi/controller/TransferRecordController.java 查看文件

@@ -7,10 +7,7 @@ import com.example.webapi.dto.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@@ -18,7 +15,6 @@ import org.springframework.web.bind.annotation.*;
import java.util.Optional;

@Api(tags = "转运记录管理")
@Tag(name = "转运记录管理", description = "提供转运记录的增删改查接口")
@RestController
@RequestMapping("/transfer-record")
public class TransferRecordController {
@@ -28,10 +24,8 @@ public class TransferRecordController {

@ApiOperation(value = "条件查询转运记录(分页)", notes = "根据提供的查询条件分页查询转运记录")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping("/page/conditions")
public ApiResponse<Page<TransferRecord>> pageByConditions(
@@ -43,11 +37,9 @@ public class TransferRecordController {

@ApiOperation(value = "根据ID查询转运记录", notes = "根据ID获取单条转运记录详情")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@GetMapping("/{id}")
public ApiResponse<TransferRecord> getById(
@@ -59,11 +51,9 @@ public class TransferRecordController {

@ApiOperation(value = "新增转运记录", notes = "创建新的转运记录")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "创建成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "创建成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping
public ApiResponse<TransferRecord> create(
@@ -74,12 +64,10 @@ public class TransferRecordController {

@ApiOperation(value = "更新转运记录", notes = "根据ID更新转运记录信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "更新成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "更新成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PutMapping("/{id}")
public ApiResponse<TransferRecord> update(
@@ -93,11 +81,9 @@ public class TransferRecordController {

@ApiOperation(value = "删除转运记录", notes = "根据ID删除转运记录")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "删除成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "删除成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@DeleteMapping("/{id}")
public ApiResponse<Void> delete(


+ 16
- 30
src/main/java/com/example/webapi/controller/TransportCompanyController.java 查看文件

@@ -7,10 +7,7 @@ import com.example.webapi.dto.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@@ -18,7 +15,6 @@ import org.springframework.web.bind.annotation.*;
import java.util.Optional;

@Api(tags = "运输公司管理")
@Tag(name = "运输公司管理", description = "提供运输公司的增删改查接口")
@RestController
@RequestMapping("/transport-company")
public class TransportCompanyController {
@@ -28,10 +24,8 @@ public class TransportCompanyController {

@ApiOperation(value = "条件查询运输公司(分页)", notes = "根据提供的查询条件分页查询运输公司")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping("/page/conditions")
public ApiResponse<Page<TransportCompany>> pageByConditions(
@@ -42,11 +36,9 @@ public class TransportCompanyController {

@ApiOperation(value = "根据ID查询运输公司", notes = "根据ID获取单条运输公司详情")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@GetMapping("/{id}")
public ApiResponse<TransportCompany> getById(
@@ -58,11 +50,9 @@ public class TransportCompanyController {

@ApiOperation(value = "新增运输公司", notes = "创建新的运输公司")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "创建成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "创建成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping
public ApiResponse<TransportCompany> create(
@@ -73,12 +63,10 @@ public class TransportCompanyController {

@ApiOperation(value = "更新运输公司", notes = "根据ID更新运输公司信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "更新成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "更新成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PutMapping("/{id}")
public ApiResponse<TransportCompany> update(
@@ -92,11 +80,9 @@ public class TransportCompanyController {

@ApiOperation(value = "删除运输公司", notes = "根据ID删除运输公司")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "删除成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "删除成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@DeleteMapping("/{id}")
public ApiResponse<Void> delete(


+ 82
- 0
src/main/java/com/example/webapi/controller/TwiceWeighingController.java 查看文件

@@ -0,0 +1,82 @@
package com.example.webapi.controller;

import com.example.webapi.dto.TwiceWeighingQueryDTO;
import com.example.webapi.entity.TwiceWeighing;
import com.example.webapi.service.TwiceWeighingService;
import com.example.webapi.dto.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@Api(tags = "二次称重记录管理")
@RestController
@RequestMapping("/twice-weighing")
public class TwiceWeighingController {

@Autowired
private TwiceWeighingService service;

@ApiOperation(value = "条件查询二次称重记录(分页)", notes = "根据提供的查询条件分页查询二次称重记录")
@PostMapping("/page/conditions")
public ApiResponse<Page<TwiceWeighing>> pageByConditions(@RequestBody TwiceWeighingQueryDTO queryDTO) {
return ApiResponse.success(service.findByConditions(queryDTO));
}

@ApiOperation(value = "根据ID查询二次称重记录", notes = "根据ID获取单条二次称重记录详情")
@GetMapping("/{id}")
public ApiResponse<TwiceWeighing> getById(@PathVariable String id) {
Optional<TwiceWeighing> result = service.findById(id);
return result.map(ApiResponse::success).orElseGet(() -> ApiResponse.error("未找到该二次称重记录"));
}

@ApiOperation(value = "新增二次称重记录", notes = "创建新的二次称重记录")
@PostMapping
public ApiResponse<TwiceWeighing> create(@RequestBody TwiceWeighing entity) {
return ApiResponse.success(service.save(entity));
}

@ApiOperation(value = "更新二次称重记录", notes = "根据ID更新二次称重记录信息")
@PutMapping("/{id}")
public ApiResponse<TwiceWeighing> update(@PathVariable String id, @RequestBody TwiceWeighing entity) {
entity.setId(id);
return ApiResponse.success(service.save(entity));
}

@ApiOperation(value = "删除二次称重记录", notes = "根据ID删除二次称重记录")
@DeleteMapping("/{id}")
public ApiResponse<Void> delete(@PathVariable String id) {
service.deleteById(id);
return ApiResponse.success();
}

@ApiOperation(value = "根据车号查询二次称重记录", notes = "根据车号获取二次称重记录")
@GetMapping("/vehicle/{vehicleId}")
public ApiResponse<TwiceWeighing> getByVehicleId(@PathVariable String vehicleId) {
TwiceWeighing result = service.findByVehicleId(vehicleId);
return result != null ? ApiResponse.success(result) : ApiResponse.error("未找到该车号的记录");
}

@ApiOperation(value = "根据打印编号查询二次称重记录", notes = "根据打印编号获取二次称重记录")
@GetMapping("/print/{printId}")
public ApiResponse<TwiceWeighing> getByPrintId(@PathVariable String printId) {
TwiceWeighing result = service.findByPrintId(printId);
return result != null ? ApiResponse.success(result) : ApiResponse.error("未找到该打印编号的记录");
}

@ApiOperation(value = "获取上传记录数量", notes = "根据上传标识获取记录数量")
@GetMapping("/count/upload/{uploadFlag}")
public ApiResponse<Long> countByUploadFlag(@PathVariable Boolean uploadFlag) {
return ApiResponse.success(service.countByUploadFlag(uploadFlag));
}

@ApiOperation(value = "获取作废记录数量", notes = "根据作废标识获取记录数量")
@GetMapping("/count/useless/{uselessFlag}")
public ApiResponse<Long> countByUselessFlag(@PathVariable Boolean uselessFlag) {
return ApiResponse.success(service.countByUselessFlag(uselessFlag));
}
}

+ 16
- 30
src/main/java/com/example/webapi/controller/VehicleInfoController.java 查看文件

@@ -7,10 +7,7 @@ import com.example.webapi.dto.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@@ -18,7 +15,6 @@ import org.springframework.web.bind.annotation.*;
import java.util.Optional;

@Api(tags = "车辆信息管理")
@Tag(name = "车辆信息管理", description = "提供车辆信息的增删改查接口")
@RestController
@RequestMapping("/vehicle-info")
public class VehicleInfoController {
@@ -28,10 +24,8 @@ public class VehicleInfoController {

@ApiOperation(value = "条件查询车辆信息(分页)", notes = "根据提供的查询条件分页查询车辆信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping("/page/conditions")
public ApiResponse<Page<VehicleInfo>> pageByConditions(
@@ -42,11 +36,9 @@ public class VehicleInfoController {

@ApiOperation(value = "根据ID查询车辆信息", notes = "根据ID获取单条车辆信息详情")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@GetMapping("/{id}")
public ApiResponse<VehicleInfo> getById(
@@ -58,11 +50,9 @@ public class VehicleInfoController {

@ApiOperation(value = "新增车辆信息", notes = "创建新的车辆信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "创建成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "创建成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping
public ApiResponse<VehicleInfo> create(
@@ -73,12 +63,10 @@ public class VehicleInfoController {

@ApiOperation(value = "更新车辆信息", notes = "根据ID更新车辆信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "更新成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "更新成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PutMapping("/{id}")
public ApiResponse<VehicleInfo> update(
@@ -92,11 +80,9 @@ public class VehicleInfoController {

@ApiOperation(value = "删除车辆信息", notes = "根据ID删除车辆信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "删除成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "删除成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@DeleteMapping("/{id}")
public ApiResponse<Void> delete(


+ 16
- 30
src/main/java/com/example/webapi/controller/WeighingRecordController.java 查看文件

@@ -9,10 +9,7 @@ import com.example.webapi.dto.ApiResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
@@ -20,7 +17,6 @@ import org.springframework.web.bind.annotation.*;
import java.util.Optional;

@Api(tags = "称重记录管理")
@Tag(name = "称重记录管理", description = "提供称重记录的增删改查接口")
@RestController
@RequestMapping("/weighing-record")
public class WeighingRecordController {
@@ -33,10 +29,8 @@ public class WeighingRecordController {

@ApiOperation(value = "条件查询称重记录(分页)", notes = "根据提供的查询条件分页查询称重记录")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping("/page/conditions")
public ApiResponse<Page<WeighingRecord>> pageByConditions(
@@ -47,11 +41,9 @@ public class WeighingRecordController {

@ApiOperation(value = "根据ID查询称重记录", notes = "根据ID获取单条称重记录详情")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "查询成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "查询成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@GetMapping("/{id}")
public ApiResponse<WeighingRecord> getById(
@@ -64,11 +56,9 @@ public class WeighingRecordController {

@ApiOperation(value = "新增称重记录", notes = "创建新的称重记录")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "创建成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "创建成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PostMapping
public ApiResponse<WeighingRecord> create(
@@ -90,12 +80,10 @@ public class WeighingRecordController {

@ApiOperation(value = "更新称重记录", notes = "根据ID更新称重记录信息")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "更新成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "请求参数错误"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "更新成功"),
@io.swagger.annotations.ApiResponse(code = 400, message = "请求参数错误"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@PutMapping("/{id}")
public ApiResponse<WeighingRecord> update(
@@ -109,11 +97,9 @@ public class WeighingRecordController {

@ApiOperation(value = "删除称重记录", notes = "根据ID删除称重记录")
@ApiResponses(value = {
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "删除成功",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = com.example.webapi.dto.ApiResponse.class))),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "记录不存在"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "500", description = "服务器内部错误")
@io.swagger.annotations.ApiResponse(code = 200, message = "删除成功"),
@io.swagger.annotations.ApiResponse(code = 404, message = "记录不存在"),
@io.swagger.annotations.ApiResponse(code = 500, message = "服务器内部错误")
})
@DeleteMapping("/{id}")
public ApiResponse<Void> delete(


+ 248
- 0
src/main/java/com/example/webapi/dto/TwiceWeighingQueryDTO.java 查看文件

@@ -0,0 +1,248 @@
package com.example.webapi.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

/**
* 二次称重记录查询条件DTO
*
* @author Your Name
* @version 1.0.0
*/
@ApiModel(description = "二次称重记录查询条件数据传输对象")
public class TwiceWeighingQueryDTO extends BasePageDTO {
// 基础查询条件(支持模糊查询)
@ApiModelProperty(value = "车号", example = "京A12345")
private String vehicleId;
@ApiModelProperty(value = "车型", example = "货车")
private String vehicleType;
@ApiModelProperty(value = "货物", example = "煤炭")
private String goods;
@ApiModelProperty(value = "收货单位", example = "福泉电厂")
private String receiveUnit;
@ApiModelProperty(value = "发货单位", example = "福泉煤矿")
private String sendUnit;
@ApiModelProperty(value = "发货站", example = "福泉站")
private String sendStation;
@ApiModelProperty(value = "到站", example = "电厂站")
private String theStation;
@ApiModelProperty(value = "炉号", example = "F001")
private String furnaceNumber;
@ApiModelProperty(value = "铁号", example = "I001")
private String ironNumber;
@ApiModelProperty(value = "方向", example = "进厂")
private String direction;
@ApiModelProperty(value = "毛重操作员ID", example = "OP001")
private String grossOpId;
@ApiModelProperty(value = "皮重操作员ID", example = "OP002")
private String tareOpId;
@ApiModelProperty(value = "打印编号", example = "PRINT001")
private String printId;
@ApiModelProperty(value = "备注", example = "正常称重")
private String demo;
// 精确匹配查询
@ApiModelProperty(value = "物资ID", example = "1")
private Integer materialsId;
@ApiModelProperty(value = "供应商ID", example = "1")
private Integer supplierId;
@ApiModelProperty(value = "上传标志", example = "false")
private Boolean uploadFlag;
@ApiModelProperty(value = "作废标志", example = "false")
private Boolean uselessFlag;
@ApiModelProperty(value = "皮重模式", example = "手动")
private String tareModel;
@ApiModelProperty(value = "毛重衡器ID", example = "GS001")
private String grossScaleId;
@ApiModelProperty(value = "皮重衡器ID", example = "TS001")
private String tareScaleId;

// Getter and Setter methods
public String getVehicleId() {
return vehicleId;
}

public void setVehicleId(String vehicleId) {
this.vehicleId = vehicleId;
}

public String getVehicleType() {
return vehicleType;
}

public void setVehicleType(String vehicleType) {
this.vehicleType = vehicleType;
}

public String getGoods() {
return goods;
}

public void setGoods(String goods) {
this.goods = goods;
}

public String getReceiveUnit() {
return receiveUnit;
}

public void setReceiveUnit(String receiveUnit) {
this.receiveUnit = receiveUnit;
}

public String getSendUnit() {
return sendUnit;
}

public void setSendUnit(String sendUnit) {
this.sendUnit = sendUnit;
}

public String getSendStation() {
return sendStation;
}

public void setSendStation(String sendStation) {
this.sendStation = sendStation;
}

public String getTheStation() {
return theStation;
}

public void setTheStation(String theStation) {
this.theStation = theStation;
}

public String getFurnaceNumber() {
return furnaceNumber;
}

public void setFurnaceNumber(String furnaceNumber) {
this.furnaceNumber = furnaceNumber;
}

public String getIronNumber() {
return ironNumber;
}

public void setIronNumber(String ironNumber) {
this.ironNumber = ironNumber;
}

public String getDirection() {
return direction;
}

public void setDirection(String direction) {
this.direction = direction;
}

public String getGrossOpId() {
return grossOpId;
}

public void setGrossOpId(String grossOpId) {
this.grossOpId = grossOpId;
}

public String getTareOpId() {
return tareOpId;
}

public void setTareOpId(String tareOpId) {
this.tareOpId = tareOpId;
}

public String getPrintId() {
return printId;
}

public void setPrintId(String printId) {
this.printId = printId;
}

public String getDemo() {
return demo;
}

public void setDemo(String demo) {
this.demo = demo;
}

public Integer getMaterialsId() {
return materialsId;
}

public void setMaterialsId(Integer materialsId) {
this.materialsId = materialsId;
}

public Integer getSupplierId() {
return supplierId;
}

public void setSupplierId(Integer supplierId) {
this.supplierId = supplierId;
}

public Boolean getUploadFlag() {
return uploadFlag;
}

public void setUploadFlag(Boolean uploadFlag) {
this.uploadFlag = uploadFlag;
}

public Boolean getUselessFlag() {
return uselessFlag;
}

public void setUselessFlag(Boolean uselessFlag) {
this.uselessFlag = uselessFlag;
}

public String getTareModel() {
return tareModel;
}

public void setTareModel(String tareModel) {
this.tareModel = tareModel;
}

public String getGrossScaleId() {
return grossScaleId;
}

public void setGrossScaleId(String grossScaleId) {
this.grossScaleId = grossScaleId;
}

public String getTareScaleId() {
return tareScaleId;
}

public void setTareScaleId(String tareScaleId) {
this.tareScaleId = tareScaleId;
}
}

+ 2
- 1
src/main/java/com/example/webapi/entity/MaterialInfo.java 查看文件

@@ -11,6 +11,7 @@ import javax.persistence.*;
@ApiModel(description = "品种信息实体")
public class MaterialInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@ApiModelProperty(value = "品种ID", example = "1", notes = "主键,自动生成")
private Integer id;
@@ -26,4 +27,4 @@ public class MaterialInfo {
@Column(name = "Activate", nullable = false)
@ApiModelProperty(value = "激活状态", example = "true", notes = "true=激活,false=未激活")
private Boolean activate;
}
}

+ 1
- 0
src/main/java/com/example/webapi/entity/Supplier.java 查看文件

@@ -11,6 +11,7 @@ import javax.persistence.*;
@ApiModel(description = "供应商信息实体")
public class Supplier {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@ApiModelProperty(value = "供应商ID", example = "1", notes = "主键,自动生成")
private Integer id;


+ 2
- 1
src/main/java/com/example/webapi/entity/SupplyVariety.java 查看文件

@@ -11,6 +11,7 @@ import javax.persistence.*;
@ApiModel(description = "供应标识品种信息实体")
public class SupplyVariety {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@ApiModelProperty(value = "记录ID", example = "1", notes = "主键,自动生成")
private Integer id;
@@ -26,4 +27,4 @@ public class SupplyVariety {
@Column(name = "Active")
@ApiModelProperty(value = "激活状态", example = "true", notes = "true=激活,false=未激活")
private Boolean active;
}
}

+ 1
- 0
src/main/java/com/example/webapi/entity/TransferRecord.java 查看文件

@@ -13,6 +13,7 @@ import java.util.Date;
@ApiModel(description = "转运记录实体")
public class TransferRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@ApiModelProperty(value = "记录ID", example = "1", notes = "主键,自动生成")
private Integer id;


+ 2
- 1
src/main/java/com/example/webapi/entity/TransportCompany.java 查看文件

@@ -11,6 +11,7 @@ import javax.persistence.*;
@ApiModel(description = "运输公司实体")
public class TransportCompany {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "编号")
@ApiModelProperty(value = "公司ID", example = "1", notes = "主键,自动生成")
private Integer id;
@@ -22,4 +23,4 @@ public class TransportCompany {
@Column(name = "备注", length = 300)
@ApiModelProperty(value = "备注", example = "长期合作伙伴")
private String remark;
}
}

+ 144
- 0
src/main/java/com/example/webapi/entity/TwiceWeighing.java 查看文件

@@ -0,0 +1,144 @@
package com.example.webapi.entity;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
@Data
@Entity
@Table(name = "TB_TWICEWEIGHING")
public class TwiceWeighing {
@Id
@Column(name = "ID", length = 22, nullable = false)
private String id;

@Column(name = "VEHICLETYPE", length = 10)
private String vehicleType;

@Column(name = "VEHICLEID", length = 10)
private String vehicleId;

@Column(name = "GROSS", precision = 18, scale = 3)
private BigDecimal gross;

@Column(name = "TARE", precision = 18, scale = 3)
private BigDecimal tare;

@Column(name = "NET", precision = 18, scale = 3)
private BigDecimal net;

@Column(name = "STANDARD", precision = 18, scale = 3)
private BigDecimal standard;

@Column(name = "MAXWEIGHT", precision = 18, scale = 3)
private BigDecimal maxWeight;

@Column(name = "OTHERNET", precision = 18, scale = 3)
private BigDecimal otherNet;

@Column(name = "GROSSTIME")
private Date grossTime;

@Column(name = "TARETIME")
private Date tareTime;

@Column(name = "NETTIME")
private Date netTime;

@Column(name = "WINTERVAL")
private Integer winterval;

@Column(name = "GROSSNODEID", length = 22)
private String grossNodeId;

@Column(name = "TARENODEID", length = 22)
private String tareNodeId;

@Column(name = "GROSSSCALEID", length = 10)
private String grossScaleId;

@Column(name = "TARESCALEID", length = 10)
private String tareScaleId;

@Column(name = "GROSSOPID", length = 10)
private String grossOpId;

@Column(name = "TAREOPID", length = 10)
private String tareOpId;

@Column(name = "TAREMODEL", length = 10)
private String tareModel;

@Column(name = "UPLOADFLAG")
private Boolean uploadFlag;

@Column(name = "USELESSFLAG")
private Boolean uselessFlag;

@Column(name = "PRINTCOUNT")
private Integer printCount;

@Column(name = "PRINTID", length = 30)
private String printId;

@Column(name = "DEMO", length = 50)
private String demo;

@Column(name = "MATERIALSID")
private Integer materialsId;

@Column(name = "SUPPLIERID")
private Integer supplierId;

@Column(name = "LOSSPATH")
private Float lossPath;

@Column(name = "WINWEIGHT")
private Float winWeight;

@Column(name = "LOSSWEIHGT")
private Float lossWeight;

@Column(name = "GROSSSPEED")
private Float grossSpeed;

@Column(name = "TARESPEED")
private Float tareSpeed;

@Column(name = "GROSSLISTID", length = 20)
private String grossListId;

@Column(name = "TARELISTID", length = 20)
private String tareListId;

@Column(name = "DELWEIGHT")
private Float delWeight;

@Column(name = "GOODS", length = 50)
private String goods;

@Column(name = "RECEIVEUNIT", length = 50)
private String receiveUnit;

@Column(name = "SENDUNIT", length = 50)
private String sendUnit;

@Column(name = "SENDSTSTION", length = 50)
private String sendStation;

@Column(name = "THESTATION", length = 50)
private String theStation;

@Column(name = "FURNACENUMBER", length = 50)
private String furnaceNumber;

@Column(name = "IRONNUMBER", length = 50)
private String ironNumber;

@Column(name = "DIRECTION", length = 50)
private String direction;


}

+ 2
- 1
src/main/java/com/example/webapi/entity/VehicleInfo.java 查看文件

@@ -11,6 +11,7 @@ import javax.persistence.*;
@ApiModel(description = "车辆信息实体")
public class VehicleInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@ApiModelProperty(value = "车辆ID", example = "1", notes = "主键,自动生成")
private Integer id;
@@ -42,4 +43,4 @@ public class VehicleInfo {
@Column(name = "Remarks", length = 1000)
@ApiModelProperty(value = "备注", example = "新购车辆")
private String remarks;
}
}

+ 2
- 1
src/main/java/com/example/webapi/entity/WeighingRecord.java 查看文件

@@ -13,6 +13,7 @@ import java.util.Date;
@ApiModel(description = "称重记录实体")
public class WeighingRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
@ApiModelProperty(value = "记录ID", example = "1", notes = "主键,自动生成")
private Integer id;
@@ -132,4 +133,4 @@ public class WeighingRecord {
@Column(name = "WTId")
@ApiModelProperty(value = "称重类型ID", example = "1")
private Integer wtId;
}
}

+ 141
- 0
src/main/java/com/example/webapi/entity/postgresql/TwiceWeighingPostgreSQL.java 查看文件

@@ -0,0 +1,141 @@
package com.example.webapi.entity.postgresql;

import lombok.Data;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;

@Data
@Entity
@Table(name = "tb_twice_weighing")
public class TwiceWeighingPostgreSQL {
@Id
@Column(name = "id", length = 22, nullable = false)
private String id;

@Column(name = "vehicle_type", length = 10)
private String vehicleType;

@Column(name = "vehicle_id", length = 10)
private String vehicleId;

@Column(name = "gross", precision = 18, scale = 3)
private BigDecimal gross;

@Column(name = "tare", precision = 18, scale = 3)
private BigDecimal tare;

@Column(name = "net", precision = 18, scale = 3)
private BigDecimal net;

@Column(name = "standard", precision = 18, scale = 3)
private BigDecimal standard;

@Column(name = "max_weight", precision = 18, scale = 3)
private BigDecimal maxWeight;

@Column(name = "other_net", precision = 18, scale = 3)
private BigDecimal otherNet;

@Column(name = "gross_time")
private Date grossTime;

@Column(name = "tare_time")
private Date tareTime;

@Column(name = "net_time")
private Date netTime;

@Column(name = "winterval")
private Integer winterval;

@Column(name = "gross_node_id", length = 22)
private String grossNodeId;

@Column(name = "tare_node_id", length = 22)
private String tareNodeId;

@Column(name = "gross_scale_id", length = 10)
private String grossScaleId;

@Column(name = "tare_scale_id", length = 10)
private String tareScaleId;

@Column(name = "gross_op_id", length = 10)
private String grossOpId;

@Column(name = "tare_op_id", length = 10)
private String tareOpId;

@Column(name = "tare_model", length = 10)
private String tareModel;

@Column(name = "upload_flag")
private Boolean uploadFlag;

@Column(name = "useless_flag")
private Boolean uselessFlag;

@Column(name = "print_count")
private Integer printCount;

@Column(name = "print_id", length = 30)
private String printId;

@Column(name = "demo", length = 50)
private String demo;

@Column(name = "materials_id")
private Integer materialsId;

@Column(name = "supplier_id")
private Integer supplierId;

@Column(name = "loss_path")
private Float lossPath;

@Column(name = "win_weight")
private Float winWeight;

@Column(name = "loss_weight")
private Float lossWeight;

@Column(name = "gross_speed")
private Float grossSpeed;

@Column(name = "tare_speed")
private Float tareSpeed;

@Column(name = "gross_list_id", length = 20)
private String grossListId;

@Column(name = "tare_list_id", length = 20)
private String tareListId;

@Column(name = "del_weight")
private Float delWeight;

@Column(name = "goods", length = 50)
private String goods;

@Column(name = "receive_unit", length = 50)
private String receiveUnit;

@Column(name = "send_unit", length = 50)
private String sendUnit;

@Column(name = "send_station", length = 50)
private String sendStation;

@Column(name = "the_station", length = 50)
private String theStation;

@Column(name = "furnace_number", length = 50)
private String furnaceNumber;

@Column(name = "iron_number", length = 50)
private String ironNumber;

@Column(name = "direction", length = 50)
private String direction;
}

+ 73
- 0
src/main/java/com/example/webapi/repository/TwiceWeighingRepository.java 查看文件

@@ -0,0 +1,73 @@
package com.example.webapi.repository;

import com.example.webapi.entity.TwiceWeighing;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;

/**
* 二次称重记录数据访问层
*
* @author Your Name
* @version 1.0.0
*/
@Repository("twiceWeighingRepository")
public interface TwiceWeighingRepository extends JpaRepository<TwiceWeighing, String>, JpaSpecificationExecutor<TwiceWeighing> {
/**
* 根据车号查询记录
*
* @param vehicleId 车号
* @return 二次称重记录
*/
TwiceWeighing findByVehicleId(String vehicleId);
/**
* 根据打印编号查询记录
*
* @param printId 打印编号
* @return 二次称重记录
*/
TwiceWeighing findByPrintId(String printId);
/**
* 根据上传标志查询记录数量
*
* @param uploadFlag 上传标志
* @return 记录数量
*/
long countByUploadFlag(Boolean uploadFlag);
/**
* 根据作废标志查询记录数量
*
* @param uselessFlag 作废标志
* @return 记录数量
*/
long countByUselessFlag(Boolean uselessFlag);
/**
* 根据上传标志查询记录列表
*
* @param uploadFlag 上传标志
* @return 二次称重记录列表
*/
java.util.List<TwiceWeighing> findByUploadFlag(Boolean uploadFlag);
/**
* 根据皮重时间查询大于指定时间的记录
*
* @param tareTime 皮重时间
* @return 二次称重记录列表
*/
java.util.List<TwiceWeighing> findByTareTimeAfter(java.util.Date tareTime);
/**
* 根据皮重时间查询大于指定时间且未上传的记录
*
* @param tareTime 皮重时间
* @param uploadFlag 上传标志
* @return 二次称重记录列表
*/
java.util.List<TwiceWeighing> findByTareTimeAfterAndUploadFlag(java.util.Date tareTime, Boolean uploadFlag);
}

+ 38
- 0
src/main/java/com/example/webapi/repository/pg/TwiceWeighingPostgreSQLRepository.java 查看文件

@@ -0,0 +1,38 @@
package com.example.webapi.repository.pg;

import com.example.webapi.entity.postgresql.TwiceWeighingPostgreSQL;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface TwiceWeighingPostgreSQLRepository extends JpaRepository<TwiceWeighingPostgreSQL, String> {
@Query("SELECT t FROM TwiceWeighingPostgreSQL t WHERE t.uploadFlag = :uploadFlag")
List<TwiceWeighingPostgreSQL> findByUploadFlag(@Param("uploadFlag") Boolean uploadFlag);
@Query("SELECT t FROM TwiceWeighingPostgreSQL t WHERE t.uselessFlag = :uselessFlag")
List<TwiceWeighingPostgreSQL> findByUselessFlag(@Param("uselessFlag") Boolean uselessFlag);
@Query("SELECT t FROM TwiceWeighingPostgreSQL t WHERE t.vehicleId = :vehicleId")
List<TwiceWeighingPostgreSQL> findByVehicleId(@Param("vehicleId") String vehicleId);
@Query("SELECT t FROM TwiceWeighingPostgreSQL t WHERE t.grossTime BETWEEN :startTime AND :endTime")
List<TwiceWeighingPostgreSQL> findByGrossTimeBetween(@Param("startTime") java.util.Date startTime,
@Param("endTime") java.util.Date endTime);
/**
* 查询最大的皮重时间
*/
@Query("SELECT MAX(t.tareTime) FROM TwiceWeighingPostgreSQL t WHERE t.tareTime IS NOT NULL")
java.util.Date findMaxTareTime();
/**
* 根据皮重时间范围查询记录
*/
@Query("SELECT t FROM TwiceWeighingPostgreSQL t WHERE t.tareTime > :tareTime")
List<TwiceWeighingPostgreSQL> findByTareTimeAfter(@Param("tareTime") java.util.Date tareTime);
}

+ 352
- 0
src/main/java/com/example/webapi/service/DataSyncService.java 查看文件

@@ -0,0 +1,352 @@
package com.example.webapi.service;

import com.example.webapi.entity.TwiceWeighing;
import com.example.webapi.entity.postgresql.TwiceWeighingPostgreSQL;
import com.example.webapi.repository.TwiceWeighingRepository;
import com.example.webapi.repository.pg.TwiceWeighingPostgreSQLRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

@Service
public class DataSyncService {

@Autowired
@Qualifier("twiceWeighingRepository")
private TwiceWeighingRepository twiceWeighingRepository;

@Autowired
@Qualifier("twiceWeighingPostgreSQLRepository")
private TwiceWeighingPostgreSQLRepository twiceWeighingPostgreSQLRepository;

/**
* 同步单条数据
*/
@Transactional(transactionManager = "postgresqlTransactionManager")
public boolean syncSingleRecord(String id) {
try {
Optional<TwiceWeighing> sourceRecord = twiceWeighingRepository.findById(id);
if (sourceRecord.isPresent()) {
TwiceWeighing source = sourceRecord.get();
TwiceWeighingPostgreSQL target = convertToPostgreSQL(source);

// 直接插入新记录
twiceWeighingPostgreSQLRepository.save(target);
return true;
}
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}

/**
* 批量同步数据 - 仅插入操作
*/
@Transactional(transactionManager = "postgresqlTransactionManager")
public int syncBatchRecords(List<String> ids) {
try {
List<TwiceWeighing> sourceRecords = new ArrayList<>();

// 批量查询源数据
for (String id : ids) {
Optional<TwiceWeighing> sourceRecord = twiceWeighingRepository.findById(id);
if (sourceRecord.isPresent()) {
sourceRecords.add(sourceRecord.get());
}
}

// 使用批量处理方法
return processBatch(sourceRecords);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}

/**
* 同步所有未上传的数据 - 分批处理
*/
@Transactional(transactionManager = "postgresqlTransactionManager")
public int syncUnuploadedRecords() {
return syncUnuploadedRecords(500);
}

/**
* 同步所有未上传的数据 - 指定批次大小
*/
@Transactional(transactionManager = "postgresqlTransactionManager")
public int syncUnuploadedRecords(int batchSize) {
try {
List<TwiceWeighing> unuploadedRecords = twiceWeighingRepository.findByUploadFlag(false);
int totalRecords = unuploadedRecords.size();

System.out.println("未上传数据同步开始,总记录数: " + totalRecords + ",批次大小: " + batchSize);

int successCount = 0;
int batchCount = 0;

// 分批处理
for (int i = 0; i < totalRecords; i += batchSize) {
int endIndex = Math.min(i + batchSize, totalRecords);
List<TwiceWeighing> batchRecords = unuploadedRecords.subList(i, endIndex);

batchCount++;
System.out.println("处理第 " + batchCount + " 批,记录范围: " + (i + 1) + " - " + endIndex);

int batchSuccessCount = processBatch(batchRecords);
successCount += batchSuccessCount;

System.out.println("第 " + batchCount + " 批处理完成,成功: " + batchSuccessCount + " 条");
}

System.out.println("未上传数据同步完成,总成功: " + successCount + " 条");
return successCount;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}

/**
* 增量同步数据(基于皮重时间)
*/
@Transactional(transactionManager = "postgresqlTransactionManager")
public int syncIncrementalData() {
try {
// 获取PostgreSQL中最大的皮重时间
Date maxTareTime = twiceWeighingPostgreSQLRepository.findMaxTareTime();

if (maxTareTime == null) {
// 如果PostgreSQL中没有数据,则同步所有数据
return syncAllData();
}

// 查询SQL Server中大于最大皮重时间的记录
List<TwiceWeighing> incrementalRecords = twiceWeighingRepository.findByTareTimeAfter(maxTareTime);

int successCount = 0;
for (TwiceWeighing source : incrementalRecords) {
TwiceWeighingPostgreSQL target = convertToPostgreSQL(source);

// 检查是否已存在
Optional<TwiceWeighingPostgreSQL> existingRecord = twiceWeighingPostgreSQLRepository.findById(source.getId());
if (existingRecord.isPresent()) {
// 更新现有记录
TwiceWeighingPostgreSQL existing = existingRecord.get();
updatePostgreSQLRecord(existing, source);
twiceWeighingPostgreSQLRepository.save(existing);
} else {
// 插入新记录
twiceWeighingPostgreSQLRepository.save(target);
}
successCount++;
}

return successCount;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}

/**
* 同步所有数据(用于首次同步或重置)- 分批处理
*/
@Transactional(transactionManager = "postgresqlTransactionManager")
public int syncAllData() {
return syncAllData(500);
}

/**
* 同步所有数据(用于首次同步或重置)- 指定批次大小
*/
@Transactional(transactionManager = "postgresqlTransactionManager")
public int syncAllData(int batchSize) {
try {
List<TwiceWeighing> allRecords = twiceWeighingRepository.findAll();
int totalRecords = allRecords.size();

System.out.println("全量同步开始,总记录数: " + totalRecords + ",批次大小: " + batchSize);

int successCount = 0;
int batchCount = 0;

// 分批处理
for (int i = 0; i < totalRecords; i += batchSize) {
int endIndex = Math.min(i + batchSize, totalRecords);
List<TwiceWeighing> batchRecords = allRecords.subList(i, endIndex);

batchCount++;
System.out.println("处理第 " + batchCount + " 批,记录范围: " + (i + 1) + " - " + endIndex);

int batchSuccessCount = processBatch(batchRecords);
successCount += batchSuccessCount;

System.out.println("第 " + batchCount + " 批处理完成,成功: " + batchSuccessCount + " 条");
}

System.out.println("全量同步完成,总成功: " + successCount + " 条");
return successCount;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}

/**
* 处理一批数据 - 仅插入操作
*/
private int processBatch(List<TwiceWeighing> batchRecords) {
int successCount = 0;
List<TwiceWeighingPostgreSQL> entitiesToSave = new ArrayList<>();
for (TwiceWeighing source : batchRecords) {
try {
// 直接转换为PostgreSQL实体
TwiceWeighingPostgreSQL target = convertToPostgreSQL(source);
entitiesToSave.add(target);
successCount++;
} catch (Exception e) {
System.err.println("处理记录失败,ID: " + source.getId() + ", 错误: " + e.getMessage());
}
}

// 批量插入并立即刷新
if (!entitiesToSave.isEmpty()) {
try {
twiceWeighingPostgreSQLRepository.saveAllAndFlush(entitiesToSave);
System.out.println("批量插入 " + entitiesToSave.size() + " 条记录成功");
} catch (Exception e) {
System.err.println("批量插入失败: " + e.getMessage());
// 如果批量插入失败,尝试逐条插入
for (TwiceWeighingPostgreSQL entity : entitiesToSave) {
try {
twiceWeighingPostgreSQLRepository.save(entity);
successCount++;
} catch (Exception ex) {
System.err.println("单条插入失败,ID: " + entity.getId() + ", 错误: " + ex.getMessage());
}
}
}
}

return successCount;
}

/**
* 将SQL Server实体转换为PostgreSQL实体
*/
private TwiceWeighingPostgreSQL convertToPostgreSQL(TwiceWeighing source) {
TwiceWeighingPostgreSQL target = new TwiceWeighingPostgreSQL();

target.setId(source.getId());
target.setVehicleType(source.getVehicleType());
target.setVehicleId(source.getVehicleId());
target.setGross(source.getGross());
target.setTare(source.getTare());
target.setNet(source.getNet());
target.setStandard(source.getStandard());
target.setMaxWeight(source.getMaxWeight());
target.setOtherNet(source.getOtherNet());
target.setGrossTime(source.getGrossTime());
target.setTareTime(source.getTareTime());
target.setNetTime(source.getNetTime());
target.setWinterval(source.getWinterval());
target.setGrossNodeId(source.getGrossNodeId());
target.setTareNodeId(source.getTareNodeId());
target.setGrossScaleId(source.getGrossScaleId());
target.setTareScaleId(source.getTareScaleId());
target.setGrossOpId(source.getGrossOpId());
target.setTareOpId(source.getTareOpId());
target.setTareModel(source.getTareModel());
target.setUploadFlag(source.getUploadFlag());
target.setUselessFlag(source.getUselessFlag());
target.setPrintCount(source.getPrintCount());
target.setPrintId(source.getPrintId());
target.setDemo(source.getDemo());
target.setMaterialsId(source.getMaterialsId());
target.setSupplierId(source.getSupplierId());
target.setLossPath(source.getLossPath());
target.setWinWeight(source.getWinWeight());
target.setLossWeight(source.getLossWeight());
target.setGrossSpeed(source.getGrossSpeed());
target.setTareSpeed(source.getTareSpeed());
target.setGrossListId(source.getGrossListId());
target.setTareListId(source.getTareListId());
target.setDelWeight(source.getDelWeight());
target.setGoods(source.getGoods());
target.setReceiveUnit(source.getReceiveUnit());
target.setSendUnit(source.getSendUnit());
target.setSendStation(source.getSendStation());
target.setTheStation(source.getTheStation());
target.setFurnaceNumber(source.getFurnaceNumber());
target.setIronNumber(source.getIronNumber());
target.setDirection(source.getDirection());

return target;
}

/**
* 更新PostgreSQL记录
*/
private void updatePostgreSQLRecord(TwiceWeighingPostgreSQL target, TwiceWeighing source) {
target.setVehicleType(source.getVehicleType());
target.setVehicleId(source.getVehicleId());
target.setGross(source.getGross());
target.setTare(source.getTare());
target.setNet(source.getNet());
target.setStandard(source.getStandard());
target.setMaxWeight(source.getMaxWeight());
target.setOtherNet(source.getOtherNet());
target.setGrossTime(source.getGrossTime());
target.setTareTime(source.getTareTime());
target.setNetTime(source.getNetTime());
target.setWinterval(source.getWinterval());
target.setGrossNodeId(source.getGrossNodeId());
target.setTareNodeId(source.getTareNodeId());
target.setGrossScaleId(source.getGrossScaleId());
target.setTareScaleId(source.getTareScaleId());
target.setGrossOpId(source.getGrossOpId());
target.setTareOpId(source.getTareOpId());
target.setTareModel(source.getTareModel());
target.setUploadFlag(source.getUploadFlag());
target.setUselessFlag(source.getUselessFlag());
target.setPrintCount(source.getPrintCount());
target.setPrintId(source.getPrintId());
target.setDemo(source.getDemo());
target.setMaterialsId(source.getMaterialsId());
target.setSupplierId(source.getSupplierId());
target.setLossPath(source.getLossPath());
target.setWinWeight(source.getWinWeight());
target.setLossWeight(source.getLossWeight());
target.setGrossSpeed(source.getGrossSpeed());
target.setTareSpeed(source.getTareSpeed());
target.setGrossListId(source.getGrossListId());
target.setTareListId(source.getTareListId());
target.setDelWeight(source.getDelWeight());
target.setGoods(source.getGoods());
target.setReceiveUnit(source.getReceiveUnit());
target.setSendUnit(source.getSendUnit());
target.setSendStation(source.getSendStation());
target.setTheStation(source.getTheStation());
target.setFurnaceNumber(source.getFurnaceNumber());
target.setIronNumber(source.getIronNumber());
target.setDirection(source.getDirection());
}
}

+ 60
- 0
src/main/java/com/example/webapi/service/ScheduledSyncService.java 查看文件

@@ -0,0 +1,60 @@
package com.example.webapi.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Component
@Slf4j
@RequiredArgsConstructor
public class ScheduledSyncService implements CommandLineRunner {

private static final Logger logger = LoggerFactory.getLogger(ScheduledSyncService.class);

@Autowired
private DataSyncService dataSyncService;

/**
* 每5分钟执行一次增量同步
*/
@Scheduled(fixedRate = 300000) // 5分钟 = 300000毫秒
public void syncIncrementalData() {
try {
logger.info("开始定时增量同步数据...");
int count = dataSyncService.syncIncrementalData();
logger.info("定时增量同步完成,成功同步 {} 条记录", count);
} catch (Exception e) {
logger.error("定时增量同步过程中发生错误: {}", e.getMessage(), e);
}
}

/**
* 每天凌晨2点执行全量同步检查
*/
@Scheduled(cron = "0 0 2 * * ?")
public void dailyFullSync() {
try {
logger.info("开始每日全量同步检查...");
int count = dataSyncService.syncIncrementalData();
logger.info("每日全量同步检查完成,成功同步 {} 条记录", count);
} catch (Exception e) {
logger.error("每日全量同步检查过程中发生错误: {}", e.getMessage(), e);
}
}

@Override
public void run(String... args) throws Exception {
System.out.println("项目启动后执行增量同步------------------");
try {
syncIncrementalData();
} catch (Exception e) {
logger.error("启动时增量同步失败: {}", e.getMessage(), e);
}
}
}

+ 259
- 0
src/main/java/com/example/webapi/service/TwiceWeighingService.java 查看文件

@@ -0,0 +1,259 @@
package com.example.webapi.service;

import com.example.webapi.dto.TwiceWeighingQueryDTO;
import com.example.webapi.entity.TwiceWeighing;
import com.example.webapi.repository.TwiceWeighingRepository;
import com.example.webapi.util.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
* 二次称重记录服务层
*
* @author Your Name
* @version 1.0.0
*/
@Service
@Transactional
public class TwiceWeighingService {

@Autowired
private TwiceWeighingRepository repository;

/**
* 根据条件分页查询二次称重记录
*
* @param queryDTO 查询条件
* @return 分页结果
*/
public Page<TwiceWeighing> findByConditions(TwiceWeighingQueryDTO queryDTO) {
// 构建分页和排序
Pageable pageable = buildPageable(queryDTO);

// 构建查询条件
Specification<TwiceWeighing> spec = buildSpecification(queryDTO);

return repository.findAll(spec, pageable);
}

/**
* 根据ID查询二次称重记录
*
* @param id 记录ID
* @return 二次称重记录
*/
public Optional<TwiceWeighing> findById(String id) {
return repository.findById(id);
}

/**
* 保存二次称重记录
*
* @param entity 二次称重记录
* @return 保存后的记录
*/
public TwiceWeighing save(TwiceWeighing entity) {
return repository.save(entity);
}

/**
* 根据ID删除二次称重记录
*
* @param id 记录ID
*/
public void deleteById(String id) {
repository.deleteById(id);
}

/**
* 根据车号查询记录
*
* @param vehicleId 车号
* @return 二次称重记录
*/
public TwiceWeighing findByVehicleId(String vehicleId) {
return repository.findByVehicleId(vehicleId);
}

/**
* 根据打印编号查询记录
*
* @param printId 打印编号
* @return 二次称重记录
*/
public TwiceWeighing findByPrintId(String printId) {
return repository.findByPrintId(printId);
}

/**
* 获取上传记录数量
*
* @param uploadFlag 上传标志
* @return 记录数量
*/
public long countByUploadFlag(Boolean uploadFlag) {
return repository.countByUploadFlag(uploadFlag);
}

/**
* 获取作废记录数量
*
* @param uselessFlag 作废标志
* @return 记录数量
*/
public long countByUselessFlag(Boolean uselessFlag) {
return repository.countByUselessFlag(uselessFlag);
}

/**
* 构建分页和排序
*
* @param queryDTO 查询条件
* @return 分页对象
*/
private Pageable buildPageable(TwiceWeighingQueryDTO queryDTO) {
// 分页参数
int page = queryDTO.getPage() != null ? queryDTO.getPage() : 0;
int size = queryDTO.getSize() != null ? queryDTO.getSize() : 10;

// 排序
Sort sort = Sort.unsorted();
if (StringUtils.hasText(queryDTO.getSortBy())) {
String direction = "desc".equalsIgnoreCase(queryDTO.getSortDirection()) ? "desc" : "asc";
sort = Sort.by(Sort.Direction.fromString(direction), queryDTO.getSortBy());
}

return PageRequest.of(page, size, sort);
}

/**
* 构建查询条件
*
* @param queryDTO 查询条件
* @return 查询规格
*/
private Specification<TwiceWeighing> buildSpecification(TwiceWeighingQueryDTO queryDTO) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();

// 车号模糊查询
if (StringUtils.hasText(queryDTO.getVehicleId())) {
predicates.add(criteriaBuilder.like(root.get("vehicleId"), "%" + queryDTO.getVehicleId() + "%"));
}

// 车型精确匹配
if (StringUtils.hasText(queryDTO.getVehicleType())) {
predicates.add(criteriaBuilder.equal(root.get("vehicleType"), queryDTO.getVehicleType()));
}

// 货物模糊查询
if (StringUtils.hasText(queryDTO.getGoods())) {
predicates.add(criteriaBuilder.like(root.get("goods"), "%" + queryDTO.getGoods() + "%"));
}

// 收货单位模糊查询
if (StringUtils.hasText(queryDTO.getReceiveUnit())) {
predicates.add(criteriaBuilder.like(root.get("receiveUnit"), "%" + queryDTO.getReceiveUnit() + "%"));
}

// 发货单位模糊查询
if (StringUtils.hasText(queryDTO.getSendUnit())) {
predicates.add(criteriaBuilder.like(root.get("sendUnit"), "%" + queryDTO.getSendUnit() + "%"));
}

// 发货站模糊查询
if (StringUtils.hasText(queryDTO.getSendStation())) {
predicates.add(criteriaBuilder.like(root.get("sendStation"), "%" + queryDTO.getSendStation() + "%"));
}

// 到站模糊查询
if (StringUtils.hasText(queryDTO.getTheStation())) {
predicates.add(criteriaBuilder.like(root.get("theStation"), "%" + queryDTO.getTheStation() + "%"));
}

// 炉号模糊查询
if (StringUtils.hasText(queryDTO.getFurnaceNumber())) {
predicates.add(criteriaBuilder.like(root.get("furnaceNumber"), "%" + queryDTO.getFurnaceNumber() + "%"));
}

// 铁号模糊查询
if (StringUtils.hasText(queryDTO.getIronNumber())) {
predicates.add(criteriaBuilder.like(root.get("ironNumber"), "%" + queryDTO.getIronNumber() + "%"));
}

// 方向精确匹配
if (StringUtils.hasText(queryDTO.getDirection())) {
predicates.add(criteriaBuilder.equal(root.get("direction"), queryDTO.getDirection()));
}

// 毛重操作员ID模糊查询
if (StringUtils.hasText(queryDTO.getGrossOpId())) {
predicates.add(criteriaBuilder.like(root.get("grossOpId"), "%" + queryDTO.getGrossOpId() + "%"));
}

// 皮重操作员ID模糊查询
if (StringUtils.hasText(queryDTO.getTareOpId())) {
predicates.add(criteriaBuilder.like(root.get("tareOpId"), "%" + queryDTO.getTareOpId() + "%"));
}

// 打印编号模糊查询
if (StringUtils.hasText(queryDTO.getPrintId())) {
predicates.add(criteriaBuilder.like(root.get("printId"), "%" + queryDTO.getPrintId() + "%"));
}

// 备注模糊查询
if (StringUtils.hasText(queryDTO.getDemo())) {
predicates.add(criteriaBuilder.like(root.get("demo"), "%" + queryDTO.getDemo() + "%"));
}

// 物资ID精确匹配
if (queryDTO.getMaterialsId() != null) {
predicates.add(criteriaBuilder.equal(root.get("materialsId"), queryDTO.getMaterialsId()));
}

// 供应商ID精确匹配
if (queryDTO.getSupplierId() != null) {
predicates.add(criteriaBuilder.equal(root.get("supplierId"), queryDTO.getSupplierId()));
}

// 上传标志精确匹配
if (queryDTO.getUploadFlag() != null) {
predicates.add(criteriaBuilder.equal(root.get("uploadFlag"), queryDTO.getUploadFlag()));
}

// 作废标志精确匹配
if (queryDTO.getUselessFlag() != null) {
predicates.add(criteriaBuilder.equal(root.get("uselessFlag"), queryDTO.getUselessFlag()));
}

// 皮重模式精确匹配
if (StringUtils.hasText(queryDTO.getTareModel())) {
predicates.add(criteriaBuilder.equal(root.get("tareModel"), queryDTO.getTareModel()));
}

// 毛重衡器ID精确匹配
if (StringUtils.hasText(queryDTO.getGrossScaleId())) {
predicates.add(criteriaBuilder.equal(root.get("grossScaleId"), queryDTO.getGrossScaleId()));
}

// 皮重衡器ID精确匹配
if (StringUtils.hasText(queryDTO.getTareScaleId())) {
predicates.add(criteriaBuilder.equal(root.get("tareScaleId"), queryDTO.getTareScaleId()));
}

return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
}

+ 163
- 0
src/main/java/com/example/webapi/util/DataSyncTest.java 查看文件

@@ -0,0 +1,163 @@
package com.example.webapi.util;

import com.example.webapi.entity.TwiceWeighing;
import com.example.webapi.entity.postgresql.TwiceWeighingPostgreSQL;
import com.example.webapi.repository.TwiceWeighingRepository;
import com.example.webapi.repository.pg.TwiceWeighingPostgreSQLRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
* 数据同步测试工具类
*/
@Component
public class DataSyncTest {

@Autowired
@Qualifier("twiceWeighingRepository")
private TwiceWeighingRepository twiceWeighingRepository;

@Autowired
@Qualifier("twiceWeighingPostgreSQLRepository")
private TwiceWeighingPostgreSQLRepository twiceWeighingPostgreSQLRepository;

/**
* 测试数据源连接
*/
public void testDataSources() {
System.out.println("=== 测试数据源连接 ===");
try {
// 测试SQL Server连接
long sqlServerCount = twiceWeighingRepository.count();
System.out.println("SQL Server连接正常,记录总数: " + sqlServerCount);
// 测试PostgreSQL连接
long postgresqlCount = twiceWeighingPostgreSQLRepository.count();
System.out.println("PostgreSQL连接正常,记录总数: " + postgresqlCount);
} catch (Exception e) {
System.err.println("数据源连接测试失败: " + e.getMessage());
e.printStackTrace();
}
}

/**
* 测试数据同步
*/
public void testDataSync() {
System.out.println("=== 测试数据同步 ===");
try {
// 获取SQL Server中的一条记录
List<TwiceWeighing> records = twiceWeighingRepository.findAll();
if (!records.isEmpty()) {
TwiceWeighing sourceRecord = records.get(0);
System.out.println("源记录ID: " + sourceRecord.getId());
// 转换为PostgreSQL实体
TwiceWeighingPostgreSQL targetRecord = convertToPostgreSQL(sourceRecord);
// 保存到PostgreSQL
twiceWeighingPostgreSQLRepository.save(targetRecord);
System.out.println("数据同步测试成功");
} else {
System.out.println("SQL Server中没有找到记录");
}
} catch (Exception e) {
System.err.println("数据同步测试失败: " + e.getMessage());
e.printStackTrace();
}
}

/**
* 测试增量同步
*/
public void testIncrementalSync() {
System.out.println("=== 测试增量同步 ===");
try {
// 获取PostgreSQL中最大的皮重时间
Date maxTareTime = twiceWeighingPostgreSQLRepository.findMaxTareTime();
System.out.println("PostgreSQL中最大皮重时间: " + maxTareTime);
if (maxTareTime == null) {
System.out.println("PostgreSQL中没有数据,将执行全量同步");
return;
}
// 查询SQL Server中大于最大皮重时间的记录
List<TwiceWeighing> incrementalRecords = twiceWeighingRepository.findByTareTimeAfter(maxTareTime);
System.out.println("需要增量同步的记录数: " + incrementalRecords.size());
if (!incrementalRecords.isEmpty()) {
System.out.println("第一条增量记录ID: " + incrementalRecords.get(0).getId());
System.out.println("第一条增量记录皮重时间: " + incrementalRecords.get(0).getTareTime());
}
} catch (Exception e) {
System.err.println("增量同步测试失败: " + e.getMessage());
e.printStackTrace();
}
}

/**
* 将SQL Server实体转换为PostgreSQL实体
*/
private TwiceWeighingPostgreSQL convertToPostgreSQL(TwiceWeighing source) {
TwiceWeighingPostgreSQL target = new TwiceWeighingPostgreSQL();
target.setId(source.getId());
target.setVehicleType(source.getVehicleType());
target.setVehicleId(source.getVehicleId());
target.setGross(source.getGross());
target.setTare(source.getTare());
target.setNet(source.getNet());
target.setStandard(source.getStandard());
target.setMaxWeight(source.getMaxWeight());
target.setOtherNet(source.getOtherNet());
target.setGrossTime(source.getGrossTime());
target.setTareTime(source.getTareTime());
target.setNetTime(source.getNetTime());
target.setWinterval(source.getWinterval());
target.setGrossNodeId(source.getGrossNodeId());
target.setTareNodeId(source.getTareNodeId());
target.setGrossScaleId(source.getGrossScaleId());
target.setTareScaleId(source.getTareScaleId());
target.setGrossOpId(source.getGrossOpId());
target.setTareOpId(source.getTareOpId());
target.setTareModel(source.getTareModel());
target.setUploadFlag(source.getUploadFlag());
target.setUselessFlag(source.getUselessFlag());
target.setPrintCount(source.getPrintCount());
target.setPrintId(source.getPrintId());
target.setDemo(source.getDemo());
target.setMaterialsId(source.getMaterialsId());
target.setSupplierId(source.getSupplierId());
target.setLossPath(source.getLossPath());
target.setWinWeight(source.getWinWeight());
target.setLossWeight(source.getLossWeight());
target.setGrossSpeed(source.getGrossSpeed());
target.setTareSpeed(source.getTareSpeed());
target.setGrossListId(source.getGrossListId());
target.setTareListId(source.getTareListId());
target.setDelWeight(source.getDelWeight());
target.setGoods(source.getGoods());
target.setReceiveUnit(source.getReceiveUnit());
target.setSendUnit(source.getSendUnit());
target.setSendStation(source.getSendStation());
target.setTheStation(source.getTheStation());
target.setFurnaceNumber(source.getFurnaceNumber());
target.setIronNumber(source.getIronNumber());
target.setDirection(source.getDirection());
return target;
}
}

+ 52
- 0
src/main/java/com/example/webapi/util/DatabaseConnectionTest.java 查看文件

@@ -0,0 +1,52 @@
package com.example.webapi.util;

import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

@Component
public class DatabaseConnectionTest {

public void testConnection() {
try {
// 设置连接属性
Properties props = new Properties();
props.setProperty("user", "sa");
props.setProperty("password", "sa");
props.setProperty("encrypt", "false");
props.setProperty("trustServerCertificate", "true");
props.setProperty("hostNameInCertificate", "*");
props.setProperty("serverNameAsACE", "false");
props.setProperty("sendStringParametersAsUnicode", "false");
props.setProperty("loginTimeout", "60");
props.setProperty("integratedSecurity", "false");
props.setProperty("rewriteBatchedStatements", "true");
props.setProperty("SelectMethod", "cursor");
props.setProperty("validateBulkLoadParameters", "false");
props.setProperty("sendTemporalDataTypesAsStringForBulkCopy", "true");
props.setProperty("delayLoadingLobs", "true");
props.setProperty("useNTLMV2", "true");
props.setProperty("authenticationScheme", "NativeAuthentication");

// 测试连接
String url = "jdbc:sqlserver://192.168.35.216:1433;DatabaseName=WY_DATAMANAGE20250731";
Connection conn = DriverManager.getConnection(url, props);
System.out.println("数据库连接测试成功!");
System.out.println("数据库产品名称: " + conn.getMetaData().getDatabaseProductName());
System.out.println("数据库版本: " + conn.getMetaData().getDatabaseProductVersion());
System.out.println("驱动名称: " + conn.getMetaData().getDriverName());
System.out.println("驱动版本: " + conn.getMetaData().getDriverVersion());
conn.close();
} catch (SQLException e) {
System.err.println("数据库连接测试失败!");
System.err.println("错误信息: " + e.getMessage());
e.printStackTrace();
}
}
}

+ 150
- 0
src/main/java/com/example/webapi/util/SQLServerVersionTest.java 查看文件

@@ -0,0 +1,150 @@
package com.example.webapi.util;

import org.springframework.stereotype.Component;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

@Component
public class SQLServerVersionTest {

public void testConnection() {
System.out.println("=== SQL Server 连接测试 ===");
// 测试JTDS驱动
testJTDSConnection();
// 测试Microsoft驱动
testMicrosoftConnection();
}
private void testJTDSConnection() {
System.out.println("\n--- 测试JTDS驱动 ---");
try {
// JTDS驱动连接
System.out.println("尝试JTDS驱动连接...");
String url = "jdbc:jtds:sqlserver://192.168.35.216:1433/WY_DATAMANAGE20250731";
Properties props = new Properties();
props.setProperty("user", "sa");
props.setProperty("password", "sa");
props.setProperty("ssl", "ignore");
props.setProperty("sendStringParametersAsUnicode", "false");
props.setProperty("loginTimeout", "30");
props.setProperty("useNTLMV2", "true");
props.setProperty("useLOBs", "false");
props.setProperty("useCursors", "true");
props.setProperty("batchSize", "0");
props.setProperty("tds", "8.0");
Connection conn = DriverManager.getConnection(url, props);
printConnectionInfo(conn, "JTDS驱动");
conn.close();
} catch (SQLException e) {
System.err.println("JTDS驱动连接失败: " + e.getMessage());
e.printStackTrace();
}
}
private void testMicrosoftConnection() {
System.out.println("\n--- 测试Microsoft驱动 ---");
try {
// 方法1: 最简单的连接方式
System.out.println("尝试方法1: 简单连接...");
String url1 = "jdbc:sqlserver://192.168.35.216:1433;DatabaseName=WY_DATAMANAGE20250731";
Properties props1 = new Properties();
props1.setProperty("user", "sa");
props1.setProperty("password", "sa");
Connection conn1 = DriverManager.getConnection(url1, props1);
printConnectionInfo(conn1, "方法1");
conn1.close();
} catch (SQLException e1) {
System.err.println("方法1失败: " + e1.getMessage());
try {
// 方法2: 明确禁用SSL
System.out.println("尝试方法2: 明确禁用SSL...");
String url2 = "jdbc:sqlserver://192.168.35.216:1433;DatabaseName=WY_DATAMANAGE20250731;encrypt=false;trustServerCertificate=true";
Properties props2 = new Properties();
props2.setProperty("user", "sa");
props2.setProperty("password", "sa");
props2.setProperty("encrypt", "false");
props2.setProperty("trustServerCertificate", "true");
Connection conn2 = DriverManager.getConnection(url2, props2);
printConnectionInfo(conn2, "方法2");
conn2.close();
} catch (SQLException e2) {
System.err.println("方法2失败: " + e2.getMessage());
try {
// 方法3: 使用老版本的连接方式
System.out.println("尝试方法3: 老版本连接方式...");
String url3 = "jdbc:sqlserver://192.168.35.216:1433;DatabaseName=WY_DATAMANAGE20250731;SelectMethod=cursor;sendStringParametersAsUnicode=false";
Properties props3 = new Properties();
props3.setProperty("user", "sa");
props3.setProperty("password", "sa");
props3.setProperty("SelectMethod", "cursor");
props3.setProperty("sendStringParametersAsUnicode", "false");
Connection conn3 = DriverManager.getConnection(url3, props3);
printConnectionInfo(conn3, "方法3");
conn3.close();
} catch (SQLException e3) {
System.err.println("方法3失败: " + e3.getMessage());
try {
// 方法4: 完全禁用所有SSL相关功能
System.out.println("尝试方法4: 完全禁用SSL...");
String url4 = "jdbc:sqlserver://192.168.35.216:1433;DatabaseName=WY_DATAMANAGE20250731;encrypt=false;trustServerCertificate=true;hostNameInCertificate=*;serverNameAsACE=false;sendStringParametersAsUnicode=false;loginTimeout=60;integratedSecurity=false;rewriteBatchedStatements=true;SelectMethod=cursor;validateBulkLoadParameters=false;sendTemporalDataTypesAsStringForBulkCopy=true;delayLoadingLobs=true;useNTLMV2=true;authenticationScheme=NativeAuthentication";
Properties props4 = new Properties();
props4.setProperty("user", "sa");
props4.setProperty("password", "sa");
props4.setProperty("encrypt", "false");
props4.setProperty("trustServerCertificate", "true");
props4.setProperty("hostNameInCertificate", "*");
props4.setProperty("serverNameAsACE", "false");
props4.setProperty("sendStringParametersAsUnicode", "false");
props4.setProperty("loginTimeout", "60");
props4.setProperty("integratedSecurity", "false");
props4.setProperty("rewriteBatchedStatements", "true");
props4.setProperty("SelectMethod", "cursor");
props4.setProperty("validateBulkLoadParameters", "false");
props4.setProperty("sendTemporalDataTypesAsStringForBulkCopy", "true");
props4.setProperty("delayLoadingLobs", "true");
props4.setProperty("useNTLMV2", "true");
props4.setProperty("authenticationScheme", "NativeAuthentication");
Connection conn4 = DriverManager.getConnection(url4, props4);
printConnectionInfo(conn4, "方法4");
conn4.close();
} catch (SQLException e4) {
System.err.println("方法4失败: " + e4.getMessage());
System.err.println("Microsoft驱动所有连接方法都失败了!");
}
}
}
}
}
private void printConnectionInfo(Connection conn, String method) throws SQLException {
DatabaseMetaData metaData = conn.getMetaData();
System.out.println("✓ " + method + " 连接成功!");
System.out.println(" 数据库产品名称: " + metaData.getDatabaseProductName());
System.out.println(" 数据库版本: " + metaData.getDatabaseProductVersion());
System.out.println(" 驱动名称: " + metaData.getDriverName());
System.out.println(" 驱动版本: " + metaData.getDriverVersion());
System.out.println(" URL: " + metaData.getURL());
System.out.println(" 用户名: " + metaData.getUserName());
}
}

+ 86
- 0
src/main/java/com/example/webapi/util/SSLTest.java 查看文件

@@ -0,0 +1,86 @@
package com.example.webapi.util;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import java.security.Security;
import java.util.Arrays;

public class SSLTest {
public static void main(String[] args) {
if (args.length > 0 && "list-ciphers".equals(args[0])) {
listCipherSuites();
} else {
testSSLConfiguration();
}
}
public static void testSSLConfiguration() {
System.out.println("=== SSL配置测试 ===");
try {
// 获取默认的SSL上下文
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, null);
// 获取SSLSocketFactory
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
System.out.println("✓ SSL上下文创建成功");
System.out.println("✓ SSLSocketFactory创建成功");
// 检查系统属性
System.out.println("\n系统属性检查:");
System.out.println("jdk.tls.client.cipherSuites: " + System.getProperty("jdk.tls.client.cipherSuites"));
System.out.println("jdk.tls.client.protocols: " + System.getProperty("jdk.tls.client.protocols"));
System.out.println("https.protocols: " + System.getProperty("https.protocols"));
System.out.println("jdk.tls.disabledAlgorithms: " + System.getProperty("jdk.tls.disabledAlgorithms"));
// 检查SQL Server连接属性
System.out.println("\nSQL Server连接属性:");
System.out.println("encrypt: " + System.getProperty("com.microsoft.sqlserver.jdbc.SQLServerConnection.encrypt"));
System.out.println("trustServerCertificate: " + System.getProperty("com.microsoft.sqlserver.jdbc.SQLServerConnection.trustServerCertificate"));
System.out.println("\n✓ SSL配置测试完成");
} catch (Exception e) {
System.err.println("✗ SSL配置测试失败: " + e.getMessage());
e.printStackTrace();
}
}
public static void listCipherSuites() {
System.out.println("=== 支持的密码套件 ===");
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
String[] defaultCipherSuites = sslSocketFactory.getDefaultCipherSuites();
String[] supportedCipherSuites = sslSocketFactory.getSupportedCipherSuites();
System.out.println("默认密码套件:");
for (String cipher : defaultCipherSuites) {
if (!cipher.startsWith("TLS_DHE_")) {
System.out.println(" ✓ " + cipher);
} else {
System.out.println(" ✗ " + cipher + " (已禁用)");
}
}
System.out.println("\n支持的密码套件:");
for (String cipher : supportedCipherSuites) {
if (!cipher.startsWith("TLS_DHE_")) {
System.out.println(" ✓ " + cipher);
} else {
System.out.println(" ✗ " + cipher + " (已禁用)");
}
}
} catch (Exception e) {
System.err.println("获取密码套件失败: " + e.getMessage());
e.printStackTrace();
}
}
}

+ 39
- 5
src/main/resources/application.yml 查看文件

@@ -6,21 +6,53 @@ server:
spring:
application:
name: fuquanapi
main:
allow-bean-definition-overriding: true
datasource:
url: jdbc:sqlserver://112.33.47.173:6789;SelectMethod=cursor;rewriteBatchedStatements=true;DatabaseName=ERPPlatForm2025_FQ_JK;encrypt=false;trustServerCertificate=true
username: PlatForm_FuQ
password: p|Rc9fZza[@XR-4
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# SQL Server数据源配置
sqlserver:
# 西宁火车煤 - 备用配置
# url: jdbc:sqlserver://192.168.35.216:1433;SelectMethod=cursor;rewriteBatchedStatements=true;DatabaseName=WY_DATAMANAGE;encrypt=false;trustServerCertificate=true
# username: sa
# password: sa
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://112.33.47.173:6789;SelectMethod=cursor;rewriteBatchedStatements=true;DatabaseName=WY_DATAMANAGE20250731;encrypt=false;trustServerCertificate=true
username: admin
password: admin@Erp2021
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
# 连接池配置
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000

# PostgreSQL数据源配置
postgresql:
url: jdbc:postgresql://112.33.111.160:5432/auseft_web_stage
username: postgres
password: Auseft@2025qwer
driver-class-name: org.postgresql.Driver
# 连接池配置
hikari:
maximum-pool-size: 10
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
jpa:
hibernate:
ddl-auto: none
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.SQLServer2012Dialect
dialect: org.hibernate.dialect.SQLServer2008Dialect
format_sql: true
physical_naming_strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
use_sql_comments: true
# 禁用默认数据源自动配置
open-in-view: false
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
@@ -40,3 +72,5 @@ logging:
com.example.webapi: DEBUG
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"

# Swagger配置 - Swagger2不需要额外配置

正在加载...
取消
保存