@@ -43,7 +43,7 @@ public class SwaggerConfig { | |||||
.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信息配置 | * API信息配置 | ||||
*/ | */ | ||||
@@ -55,7 +55,7 @@ public class SwaggerConfig { | |||||
.contact(new Contact("开发团队", "http://www.example.com", "dev@example.com")) | .contact(new Contact("开发团队", "http://www.example.com", "dev@example.com")) | ||||
.build(); | .build(); | ||||
} | } | ||||
/** | /** | ||||
* 获取全局请求参数 | * 获取全局请求参数 | ||||
* 注意:在Swagger UI中这些参数设置为非必需,以便能够正常访问Swagger界面 | * 注意:在Swagger UI中这些参数设置为非必需,以便能够正常访问Swagger界面 | ||||
@@ -63,7 +63,7 @@ public class SwaggerConfig { | |||||
*/ | */ | ||||
private List<Parameter> getGlobalParameters() { | private List<Parameter> getGlobalParameters() { | ||||
List<Parameter> parameters = new ArrayList<>(); | List<Parameter> parameters = new ArrayList<>(); | ||||
// AK (Access Key) - 在Swagger中设为非必需,便于测试 | // AK (Access Key) - 在Swagger中设为非必需,便于测试 | ||||
Parameter akParam = new ParameterBuilder() | Parameter akParam = new ParameterBuilder() | ||||
.name("ak") | .name("ak") | ||||
@@ -73,7 +73,7 @@ public class SwaggerConfig { | |||||
.required(false) // 改为false,让Swagger UI可以正常访问 | .required(false) // 改为false,让Swagger UI可以正常访问 | ||||
.build(); | .build(); | ||||
parameters.add(akParam); | parameters.add(akParam); | ||||
// Timestamp - 在Swagger中设为非必需,便于测试 | // Timestamp - 在Swagger中设为非必需,便于测试 | ||||
Parameter timestampParam = new ParameterBuilder() | Parameter timestampParam = new ParameterBuilder() | ||||
.name("timestamp") | .name("timestamp") | ||||
@@ -83,7 +83,7 @@ public class SwaggerConfig { | |||||
.required(false) // 改为false,让Swagger UI可以正常访问 | .required(false) // 改为false,让Swagger UI可以正常访问 | ||||
.build(); | .build(); | ||||
parameters.add(timestampParam); | parameters.add(timestampParam); | ||||
// Signature - 在Swagger中设为非必需,便于测试 | // Signature - 在Swagger中设为非必需,便于测试 | ||||
Parameter signatureParam = new ParameterBuilder() | Parameter signatureParam = new ParameterBuilder() | ||||
.name("signature") | .name("signature") | ||||
@@ -93,7 +93,7 @@ public class SwaggerConfig { | |||||
.required(false) // 改为false,让Swagger UI可以正常访问 | .required(false) // 改为false,让Swagger UI可以正常访问 | ||||
.build(); | .build(); | ||||
parameters.add(signatureParam); | parameters.add(signatureParam); | ||||
return parameters; | return parameters; | ||||
} | } | ||||
} | |||||
} |
@@ -0,0 +1,62 @@ | |||||
package com.example.webapi.entity; | |||||
import lombok.Data; | |||||
import javax.persistence.*; | |||||
import java.util.Date; | |||||
@Data | |||||
@Entity | |||||
@Table(name = "TB_ONCEWEIGHING") | |||||
public class OnceWeighing { | |||||
@Id | |||||
@Column(name = "NODEID", length = 22, nullable = false) | |||||
private String nodeId; | |||||
@Column(name = "LISTID", length = 18) | |||||
private String listId; | |||||
@Column(name = "WEIGHT") | |||||
private Double weight; | |||||
@Column(name = "SPEED") | |||||
private Double speed; | |||||
@Column(name = "NODETIME") | |||||
private Date nodeTime; | |||||
@Column(name = "OPERATORID", length = 8) | |||||
private String operatorId; | |||||
@Column(name = "VEHICLETYPE", length = 10) | |||||
private String vehicleType; | |||||
@Column(name = "VEHICLEID", length = 10) | |||||
private String vehicleId; | |||||
@Column(name = "MANAGEFLAG") | |||||
private Boolean manageFlag; | |||||
@Column(name = "SNAPPICTIME", length = 14) | |||||
private String snapPicTime; | |||||
@Column(name = "UPLOADFLAG") | |||||
private Boolean uploadFlag; | |||||
@Column(name = "USELESSFLAG") | |||||
private Boolean uselessFlag; | |||||
@Column(name = "DEMO", length = 50) | |||||
private String demo; | |||||
@Column(name = "SCALEID", length = 10) | |||||
private String scaleId; | |||||
@Column(name = "GROSSORTARE", length = 1) | |||||
private String grossOrTare; | |||||
@Column(name = "BEFOREANDAFTERSLANTCARRY") | |||||
private Double beforeAndAfterSlantCarry; | |||||
@Column(name = "LEFTANDRIGHTLANTCARRY") | |||||
private Double leftAndRightLantCarry; | |||||
} |
@@ -0,0 +1,62 @@ | |||||
package com.example.webapi.entity.postgresql; | |||||
import lombok.Data; | |||||
import javax.persistence.*; | |||||
import java.util.Date; | |||||
@Data | |||||
@Entity | |||||
@Table(name = "tb_once_weighing") | |||||
public class OnceWeighingPostgreSQL { | |||||
@Id | |||||
@Column(name = "node_id", length = 22, nullable = false) | |||||
private String nodeId; | |||||
@Column(name = "list_id", length = 18) | |||||
private String listId; | |||||
@Column(name = "weight") | |||||
private Double weight; | |||||
@Column(name = "speed") | |||||
private Double speed; | |||||
@Column(name = "node_time") | |||||
private Date nodeTime; | |||||
@Column(name = "operator_id", length = 8) | |||||
private String operatorId; | |||||
@Column(name = "vehicle_type", length = 10) | |||||
private String vehicleType; | |||||
@Column(name = "vehicle_id", length = 10) | |||||
private String vehicleId; | |||||
@Column(name = "manage_flag") | |||||
private Boolean manageFlag; | |||||
@Column(name = "snap_pic_time", length = 14) | |||||
private String snapPicTime; | |||||
@Column(name = "upload_flag") | |||||
private Boolean uploadFlag; | |||||
@Column(name = "useless_flag") | |||||
private Boolean uselessFlag; | |||||
@Column(name = "demo", length = 50) | |||||
private String demo; | |||||
@Column(name = "scale_id", length = 10) | |||||
private String scaleId; | |||||
@Column(name = "gross_or_tare", length = 1) | |||||
private String grossOrTare; | |||||
@Column(name = "before_and_after_slant_carry") | |||||
private Double beforeAndAfterSlantCarry; | |||||
@Column(name = "left_and_right_lant_carry") | |||||
private Double leftAndRightLantCarry; | |||||
} |
@@ -0,0 +1,16 @@ | |||||
package com.example.webapi.repository; | |||||
import com.example.webapi.entity.OnceWeighing; | |||||
import org.springframework.data.jpa.repository.JpaRepository; | |||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; | |||||
import org.springframework.data.domain.Page; | |||||
import org.springframework.data.domain.Pageable; | |||||
import org.springframework.stereotype.Repository; | |||||
import java.util.List; | |||||
@Repository("onceWeighingRepository") | |||||
public interface OnceWeighingRepository extends JpaRepository<OnceWeighing, String>, JpaSpecificationExecutor<OnceWeighing> { | |||||
List<OnceWeighing> findByUploadFlag(Boolean uploadFlag); | |||||
List<OnceWeighing> findByNodeTimeAfter(java.util.Date nodeTime); | |||||
Page<OnceWeighing> findByNodeTimeNotNullOrderByNodeTimeDesc(Pageable pageable); | |||||
} |
@@ -0,0 +1,17 @@ | |||||
package com.example.webapi.repository.pg; | |||||
import com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL; | |||||
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 OnceWeighingPostgreSQLRepository extends JpaRepository<OnceWeighingPostgreSQL, String> { | |||||
@Query("SELECT o FROM OnceWeighingPostgreSQL o WHERE o.uploadFlag = :uploadFlag") | |||||
List<OnceWeighingPostgreSQL> findByUploadFlag(@Param("uploadFlag") Boolean uploadFlag); | |||||
@Query("SELECT MAX(o.nodeTime) FROM OnceWeighingPostgreSQL o WHERE o.nodeTime IS NOT NULL") | |||||
java.util.Date findMaxNodeTime(); | |||||
} |
@@ -22,6 +22,7 @@ import java.util.ArrayList; | |||||
import java.util.Date; | import java.util.Date; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Optional; | import java.util.Optional; | ||||
import java.util.stream.Collectors; | |||||
@Service | @Service | ||||
public class DataSyncService { | public class DataSyncService { | ||||
@@ -34,6 +35,13 @@ public class DataSyncService { | |||||
@Qualifier("twiceWeighingPostgreSQLRepository") | @Qualifier("twiceWeighingPostgreSQLRepository") | ||||
private TwiceWeighingPostgreSQLRepository twiceWeighingPostgreSQLRepository; | private TwiceWeighingPostgreSQLRepository twiceWeighingPostgreSQLRepository; | ||||
@Autowired | |||||
@Qualifier("onceWeighingRepository") | |||||
private com.example.webapi.repository.OnceWeighingRepository onceWeighingRepository; | |||||
@Autowired | |||||
private com.example.webapi.repository.pg.OnceWeighingPostgreSQLRepository onceWeighingPostgreSQLRepository; | |||||
/** | /** | ||||
* 同步单条数据 | * 同步单条数据 | ||||
*/ | */ | ||||
@@ -349,4 +357,182 @@ public class DataSyncService { | |||||
target.setIronNumber(source.getIronNumber()); | target.setIronNumber(source.getIronNumber()); | ||||
target.setDirection(source.getDirection()); | target.setDirection(source.getDirection()); | ||||
} | } | ||||
/** | |||||
* 一次过磅-同步所有未上传的数据 - 分批处理 | |||||
*/ | |||||
@Transactional(transactionManager = "postgresqlTransactionManager") | |||||
public int syncOnceUnuploadedRecords() { | |||||
return syncOnceUnuploadedRecords(500); | |||||
} | |||||
/** | |||||
* 一次过磅-同步所有未上传的数据 - 指定批次大小 | |||||
*/ | |||||
@Transactional(transactionManager = "postgresqlTransactionManager") | |||||
public int syncOnceUnuploadedRecords(int batchSize) { | |||||
try { | |||||
List<com.example.webapi.entity.OnceWeighing> unuploadedRecords = onceWeighingRepository.findByUploadFlag(false); | |||||
int totalRecords = unuploadedRecords.size(); | |||||
int successCount = 0; | |||||
int batchCount = 0; | |||||
for (int i = 0; i < totalRecords; i += batchSize) { | |||||
int endIndex = Math.min(i + batchSize, totalRecords); | |||||
List<com.example.webapi.entity.OnceWeighing> batchRecords = unuploadedRecords.subList(i, endIndex); | |||||
batchCount++; | |||||
int batchSuccessCount = processOnceBatch(batchRecords); | |||||
successCount += batchSuccessCount; | |||||
} | |||||
return successCount; | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
return 0; | |||||
} | |||||
} | |||||
/** | |||||
* 一次过磅-全量同步 | |||||
*/ | |||||
@Transactional(transactionManager = "postgresqlTransactionManager") | |||||
public int syncOnceAllData() { | |||||
return syncOnceAllData(500); | |||||
} | |||||
@Transactional(transactionManager = "postgresqlTransactionManager") | |||||
public int syncOnceAllData(int batchSize) { | |||||
try { | |||||
List<com.example.webapi.entity.OnceWeighing> allRecords = onceWeighingRepository.findAll(); | |||||
// org.springframework.data.domain.PageRequest pageRequest = org.springframework.data.domain.PageRequest.of(0, 500, org.springframework.data.domain.Sort.by(org.springframework.data.domain.Sort.Direction.DESC, "nodeTime")); | |||||
// List<com.example.webapi.entity.OnceWeighing> allRecords = onceWeighingRepository.findByNodeTimeNotNullOrderByNodeTimeDesc(pageRequest).getContent(); | |||||
int totalRecords = allRecords.size(); | |||||
int successCount = 0; | |||||
int batchCount = 0; | |||||
for (int i = 0; i < totalRecords; i += batchSize) { | |||||
int endIndex = Math.min(i + batchSize, totalRecords); | |||||
List<com.example.webapi.entity.OnceWeighing> batchRecords = allRecords.subList(i, endIndex); | |||||
batchCount++; | |||||
int batchSuccessCount = processOnceBatch(batchRecords); | |||||
successCount += batchSuccessCount; | |||||
} | |||||
return successCount; | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
return 0; | |||||
} | |||||
} | |||||
/** | |||||
* 一次过磅-增量同步(基于node_time,数据库层面过滤) | |||||
*/ | |||||
@Transactional(transactionManager = "postgresqlTransactionManager") | |||||
public int syncOnceIncrementalData() { | |||||
try { | |||||
// 获取PostgreSQL中最大的node_time(数据库层面) | |||||
java.util.Date maxNodeTime = onceWeighingPostgreSQLRepository.findMaxNodeTime(); | |||||
if (maxNodeTime == null) { | |||||
return syncOnceAllData(); | |||||
} | |||||
// 数据库层面过滤增量数据 | |||||
List<com.example.webapi.entity.OnceWeighing> incrementalRecords = onceWeighingRepository.findByNodeTimeAfter(maxNodeTime); | |||||
int successCount = 0; | |||||
for (com.example.webapi.entity.OnceWeighing source : incrementalRecords) { | |||||
try { | |||||
com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL target = convertOnceToPostgreSQL(source); | |||||
java.util.Optional<com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL> existingRecord = onceWeighingPostgreSQLRepository.findById(source.getNodeId()); | |||||
if (existingRecord.isPresent()) { | |||||
com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL existing = existingRecord.get(); | |||||
updateOncePostgreSQLRecord(existing, source); | |||||
onceWeighingPostgreSQLRepository.saveAndFlush(existing); | |||||
} else { | |||||
onceWeighingPostgreSQLRepository.saveAndFlush(target); | |||||
} | |||||
successCount++; | |||||
} catch (Exception e) { | |||||
System.err.println("同步记录失败,NODEID: " + source.getNodeId() + ", 错误: " + e.getMessage()); | |||||
} | |||||
} | |||||
return successCount; | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
return 0; | |||||
} | |||||
} | |||||
/** | |||||
* 一次过磅-批量处理 | |||||
*/ | |||||
private int processOnceBatch(List<com.example.webapi.entity.OnceWeighing> batchRecords) { | |||||
int successCount = 0; | |||||
List<com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL> entitiesToSave = new java.util.ArrayList<>(); | |||||
for (com.example.webapi.entity.OnceWeighing source : batchRecords) { | |||||
try { | |||||
com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL target = convertOnceToPostgreSQL(source); | |||||
entitiesToSave.add(target); | |||||
successCount++; | |||||
} catch (Exception e) { | |||||
System.err.println("处理记录失败,NODEID: " + source.getNodeId() + ", 错误: " + e.getMessage()); | |||||
} | |||||
} | |||||
if (!entitiesToSave.isEmpty()) { | |||||
try { | |||||
onceWeighingPostgreSQLRepository.saveAllAndFlush(entitiesToSave); | |||||
} catch (Exception e) { | |||||
for (com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL entity : entitiesToSave) { | |||||
try { | |||||
onceWeighingPostgreSQLRepository.save(entity); | |||||
} catch (Exception ex) { | |||||
System.err.println("单条插入失败,NODEID: " + entity.getNodeId() + ", 错误: " + ex.getMessage()); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return successCount; | |||||
} | |||||
/** | |||||
* 一次过磅-SQLServer实体转PostgreSQL实体 | |||||
*/ | |||||
private com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL convertOnceToPostgreSQL(com.example.webapi.entity.OnceWeighing source) { | |||||
com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL target = new com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL(); | |||||
target.setNodeId(source.getNodeId()); | |||||
target.setListId(source.getListId()); | |||||
target.setWeight(source.getWeight()); | |||||
target.setSpeed(source.getSpeed()); | |||||
target.setNodeTime(source.getNodeTime()); | |||||
target.setOperatorId(source.getOperatorId()); | |||||
target.setVehicleType(source.getVehicleType()); | |||||
target.setVehicleId(source.getVehicleId()); | |||||
target.setManageFlag(source.getManageFlag()); | |||||
target.setSnapPicTime(source.getSnapPicTime()); | |||||
target.setUploadFlag(source.getUploadFlag()); | |||||
target.setUselessFlag(source.getUselessFlag()); | |||||
target.setDemo(source.getDemo()); | |||||
target.setScaleId(source.getScaleId()); | |||||
target.setGrossOrTare(source.getGrossOrTare()); | |||||
target.setBeforeAndAfterSlantCarry(source.getBeforeAndAfterSlantCarry()); | |||||
target.setLeftAndRightLantCarry(source.getLeftAndRightLantCarry()); | |||||
return target; | |||||
} | |||||
/** | |||||
* 一次过磅-更新PostgreSQL记录 | |||||
*/ | |||||
private void updateOncePostgreSQLRecord(com.example.webapi.entity.postgresql.OnceWeighingPostgreSQL target, com.example.webapi.entity.OnceWeighing source) { | |||||
target.setListId(source.getListId()); | |||||
target.setWeight(source.getWeight()); | |||||
target.setSpeed(source.getSpeed()); | |||||
target.setNodeTime(source.getNodeTime()); | |||||
target.setOperatorId(source.getOperatorId()); | |||||
target.setVehicleType(source.getVehicleType()); | |||||
target.setVehicleId(source.getVehicleId()); | |||||
target.setManageFlag(source.getManageFlag()); | |||||
target.setSnapPicTime(source.getSnapPicTime()); | |||||
target.setUploadFlag(source.getUploadFlag()); | |||||
target.setUselessFlag(source.getUselessFlag()); | |||||
target.setDemo(source.getDemo()); | |||||
target.setScaleId(source.getScaleId()); | |||||
target.setGrossOrTare(source.getGrossOrTare()); | |||||
target.setBeforeAndAfterSlantCarry(source.getBeforeAndAfterSlantCarry()); | |||||
target.setLeftAndRightLantCarry(source.getLeftAndRightLantCarry()); | |||||
} | |||||
} | } |
@@ -34,25 +34,54 @@ public class ScheduledSyncService implements CommandLineRunner { | |||||
} | } | ||||
} | } | ||||
// /** | |||||
// * 每天凌晨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); | |||||
// } | |||||
// } | |||||
/** | /** | ||||
* 每天凌晨2点执行全量同步检查 | |||||
* 每5分钟执行一次一次过磅增量同步 | |||||
*/ | */ | ||||
@Scheduled(cron = "0 0 2 * * ?") | |||||
public void dailyFullSync() { | |||||
@Scheduled(fixedRate = 300000) // 5分钟 = 300000毫秒 | |||||
public void syncOnceIncrementalData() { | |||||
try { | try { | ||||
logger.info("开始每日全量同步检查..."); | |||||
int count = dataSyncService.syncIncrementalData(); | |||||
logger.info("每日全量同步检查完成,成功同步 {} 条记录", count); | |||||
logger.info("开始定时一次过磅增量同步数据..."); | |||||
int count = dataSyncService.syncOnceIncrementalData(); | |||||
logger.info("定时一次过磅增量同步完成,成功同步 {} 条记录", count); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
logger.error("每日全量同步检查过程中发生错误: {}", e.getMessage(), e); | |||||
logger.error("定时一次过磅增量同步过程中发生错误: {}", e.getMessage(), e); | |||||
} | } | ||||
} | } | ||||
// /** | |||||
// * 每天凌晨2点执行一次过磅全量同步检查 | |||||
// */ | |||||
// @Scheduled(cron = "0 5 2 * * ?") // 比二次过磅晚5分钟 | |||||
// public void dailyOnceFullSync() { | |||||
// try { | |||||
// logger.info("开始每日一次过磅全量同步检查..."); | |||||
// int count = dataSyncService.syncOnceAllData(); | |||||
// logger.info("每日一次过磅全量同步检查完成,成功同步 {} 条记录", count); | |||||
// } catch (Exception e) { | |||||
// logger.error("每日一次过磅全量同步检查过程中发生错误: {}", e.getMessage(), e); | |||||
// } | |||||
// } | |||||
@Override | @Override | ||||
public void run(String... args) throws Exception { | public void run(String... args) throws Exception { | ||||
System.out.println("项目启动后执行增量同步------------------"); | System.out.println("项目启动后执行增量同步------------------"); | ||||
try { | try { | ||||
syncIncrementalData(); | |||||
// syncIncrementalData(); | |||||
syncOnceIncrementalData(); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
logger.error("启动时增量同步失败: {}", e.getMessage(), e); | logger.error("启动时增量同步失败: {}", e.getMessage(), e); | ||||
} | } | ||||
@@ -0,0 +1,76 @@ | |||||
server: | |||||
port: 8806 | |||||
servlet: | |||||
context-path: /fuquanapi | |||||
spring: | |||||
application: | |||||
name: fuquanapi | |||||
main: | |||||
allow-bean-definition-overriding: true | |||||
datasource: | |||||
# 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://192.168.35.10:5435/auseft_web | |||||
username: postgres | |||||
password: Auseft@2025 | |||||
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.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 | |||||
mvc: | |||||
pathmatch: | |||||
matching-strategy: ant_path_matcher | |||||
# API客户端配置 | |||||
api: | |||||
client: | |||||
ak: 2760cd7c-cc0e-4034-86f3-d58e89f03d80 | |||||
sk: e2c0e9c1aaa72a0b1444f879c86a9034bf2f03be31a58b1e5b3b077948da75cf | |||||
# 日志配置 | |||||
logging: | |||||
level: | |||||
com.example.webapi: DEBUG | |||||
pattern: | |||||
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" | |||||
# Swagger配置 - Swagger2不需要额外配置 |
@@ -12,8 +12,6 @@ APP_CONTEXT_PATH="/fuquanapi" | |||||
# JVM配置 | # JVM配置 | ||||
JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+UseStringDeduplication" | JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC -XX:+UseStringDeduplication" | ||||
JVM_OPTS="$JVM_OPTS -Dserver.port=$APP_PORT" | |||||
JVM_OPTS="$JVM_OPTS -Dserver.servlet.context-path=$APP_CONTEXT_PATH" | |||||
# 日志配置 | # 日志配置 | ||||
LOG_DIR="./logs" | LOG_DIR="./logs" | ||||
@@ -55,6 +53,16 @@ check_jar() { | |||||
print_message $GREEN "找到应用JAR文件: $APP_JAR" | print_message $GREEN "找到应用JAR文件: $APP_JAR" | ||||
} | } | ||||
# 检查配置文件 | |||||
check_config() { | |||||
if [ -f "./application.yml" ]; then | |||||
print_message $GREEN "找到外部配置文件: ./application.yml" | |||||
print_message $BLUE "Spring Boot将自动使用外部配置文件" | |||||
else | |||||
print_message $YELLOW "未找到外部配置文件 ./application.yml,将使用JAR包内的默认配置" | |||||
fi | |||||
} | |||||
# 创建日志目录 | # 创建日志目录 | ||||
create_log_dir() { | create_log_dir() { | ||||
if [ ! -d "$LOG_DIR" ]; then | if [ ! -d "$LOG_DIR" ]; then | ||||
@@ -81,6 +89,9 @@ check_running() { | |||||
# 启动应用 | # 启动应用 | ||||
start_app() { | start_app() { | ||||
print_message $BLUE "正在启动 $APP_NAME..." | print_message $BLUE "正在启动 $APP_NAME..." | ||||
# 检查配置文件 | |||||
check_config | |||||
# 启动应用 | # 启动应用 | ||||
nohup java $JVM_OPTS -jar "$APP_JAR" > "$LOG_FILE" 2>&1 & | nohup java $JVM_OPTS -jar "$APP_JAR" > "$LOG_FILE" 2>&1 & | ||||
@@ -236,4 +247,4 @@ main() { | |||||
} | } | ||||
# 执行主函数 | # 执行主函数 | ||||
main "$@" | |||||
main "$@" |