Commit fed7a97e935020698399dcbafad8dd3162b17f33

Authored by 徐烜
0 parents

初始化

Showing 40 changed files with 2239 additions and 0 deletions
.gitignore 0 → 100644
  1 +++ a/.gitignore
  1 +HELP.md
  2 +target/
  3 +!.mvn/wrapper/maven-wrapper.jar
  4 +!**/src/main/**
  5 +!**/src/test/**
  6 +
  7 +### STS ###
  8 +.apt_generated
  9 +.classpath
  10 +.factorypath
  11 +.project
  12 +.settings
  13 +.springBeans
  14 +.sts4-cache
  15 +
  16 +### IntelliJ IDEA ###
  17 +.idea
  18 +*.iws
  19 +*.iml
  20 +*.ipr
  21 +
  22 +### NetBeans ###
  23 +/nbproject/private/
  24 +/nbbuild/
  25 +/dist/
  26 +/nbdist/
  27 +/.nb-gradle/
  28 +build/
  29 +
  30 +### VS Code ###
  31 +.vscode/
  32 +
  33 +### mvn2 ###
  34 +mvnw
  35 +mvnw.cmd
  36 +.mvn
... ...
pom.xml 0 → 100644
  1 +++ a/pom.xml
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4 + <modelVersion>4.0.0</modelVersion>
  5 + <parent>
  6 + <groupId>org.springframework.boot</groupId>
  7 + <artifactId>spring-boot-starter-parent</artifactId>
  8 + <version>2.3.0.RELEASE</version>
  9 + <relativePath/> <!-- lookup parent from repository -->
  10 + </parent>
  11 + <groupId>com.bsth.control_v3</groupId>
  12 + <artifactId>plan_module-service-data_sync</artifactId>
  13 + <version>0.0.1-SNAPSHOT</version>
  14 + <name>plan_module-service-data_sync</name>
  15 + <description>浦东计划调度数据同步模块</description>
  16 +
  17 + <properties>
  18 + <java.version>1.8</java.version>
  19 + </properties>
  20 +
  21 + <dependencies>
  22 + <dependency>
  23 + <groupId>org.springframework.boot</groupId>
  24 + <artifactId>spring-boot-starter-batch</artifactId>
  25 + </dependency>
  26 + <dependency>
  27 + <groupId>org.springframework.boot</groupId>
  28 + <artifactId>spring-boot-starter-data-jdbc</artifactId>
  29 + </dependency>
  30 + <dependency>
  31 + <groupId>org.springframework.boot</groupId>
  32 + <artifactId>spring-boot-starter-data-jpa</artifactId>
  33 + </dependency>
  34 + <dependency>
  35 + <groupId>org.springframework.boot</groupId>
  36 + <artifactId>spring-boot-starter-jdbc</artifactId>
  37 + </dependency>
  38 +
  39 + <dependency>
  40 + <groupId>com.h2database</groupId>
  41 + <artifactId>h2</artifactId>
  42 + <scope>test</scope>
  43 + </dependency>
  44 + <dependency>
  45 + <groupId>mysql</groupId>
  46 + <artifactId>mysql-connector-java</artifactId>
  47 + <scope>runtime</scope>
  48 + </dependency>
  49 + <dependency>
  50 + <groupId>org.springframework.boot</groupId>
  51 + <artifactId>spring-boot-starter-test</artifactId>
  52 + <scope>test</scope>
  53 + <exclusions>
  54 + <exclusion>
  55 + <groupId>org.junit.vintage</groupId>
  56 + <artifactId>junit-vintage-engine</artifactId>
  57 + </exclusion>
  58 + </exclusions>
  59 + </dependency>
  60 + <dependency>
  61 + <groupId>org.springframework.batch</groupId>
  62 + <artifactId>spring-batch-test</artifactId>
  63 + <scope>test</scope>
  64 + </dependency>
  65 + <dependency>
  66 + <groupId>org.dbunit</groupId>
  67 + <artifactId>dbunit</artifactId>
  68 + <version>2.4.9</version>
  69 + <scope>test</scope>
  70 + </dependency>
  71 + </dependencies>
  72 +
  73 + <build>
  74 + <plugins>
  75 + <plugin>
  76 + <groupId>org.springframework.boot</groupId>
  77 + <artifactId>spring-boot-maven-plugin</artifactId>
  78 + </plugin>
  79 + </plugins>
  80 + </build>
  81 +
  82 +</project>
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/PlanModuleServiceDataSyncApplication.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/PlanModuleServiceDataSyncApplication.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync;
  2 +
  3 +import org.springframework.boot.CommandLineRunner;
  4 +import org.springframework.boot.SpringApplication;
  5 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  6 +import org.springframework.transaction.annotation.EnableTransactionManagement;
  7 +
  8 +@EnableTransactionManagement
  9 +@SpringBootApplication
  10 +public class PlanModuleServiceDataSyncApplication implements CommandLineRunner {
  11 +
  12 + @Override
  13 + public void run(String... args) throws Exception {
  14 + // TODO:其他初始化代码
  15 +
  16 + }
  17 +
  18 + public static void main(String[] args) {
  19 +
  20 + SpringApplication.run(PlanModuleServiceDataSyncApplication.class, args);
  21 +
  22 + }
  23 +
  24 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/MySQL5InnoDBDialectExt.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/MySQL5InnoDBDialectExt.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch;
  2 +
  3 +import org.hibernate.dialect.InnoDBStorageEngine;
  4 +import org.hibernate.dialect.MySQL5Dialect;
  5 +import org.hibernate.dialect.MySQLStorageEngine;
  6 +
  7 +/**
  8 + * springBoot 2使用了新的mysql驱动类 com.mysql.cj.jdbc.Driver,和原来的比较会有一些问题
  9 + * 1、日期,默认保存日期会差12个小时,是时区问题,需要在数据库连接字符串上加 serverTimezone=GMT%2B8
  10 + * 2、默认创建表示使用的引擎是 MyIsam,默认的字符集为 latin1,需要在配置文件中设定 MySQL5Dialect,如下:
  11 + * spring.jpa.database-platform=com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.MySQL5InnoDBDialectExt
  12 + */
  13 +public class MySQL5InnoDBDialectExt extends MySQL5Dialect {
  14 +
  15 + @Override
  16 + protected MySQLStorageEngine getDefaultMySQLStorageEngine() {
  17 + return InnoDBStorageEngine.INSTANCE;
  18 + }
  19 +
  20 + @Override
  21 + public String getTableTypeString() {
  22 + return "ENGINE=InnoDB DEFAULT CHARSET=utf8";
  23 + }
  24 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/VehicleDataSyncBatchConfig.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/VehicleDataSyncBatchConfig.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleData;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStatusEnum;
  6 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataRepo;
  7 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncRepo;
  8 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener.*;
  9 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.process.PrepareStepDataProcessor;
  10 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.process.SyncStepDataProcessor;
  11 +import org.springframework.batch.core.Job;
  12 +import org.springframework.batch.core.Step;
  13 +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
  14 +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
  15 +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
  16 +import org.springframework.batch.core.launch.support.RunIdIncrementer;
  17 +import org.springframework.batch.item.data.RepositoryItemReader;
  18 +import org.springframework.batch.item.data.RepositoryItemWriter;
  19 +import org.springframework.batch.item.data.builder.RepositoryItemReaderBuilder;
  20 +import org.springframework.batch.item.data.builder.RepositoryItemWriterBuilder;
  21 +import org.springframework.beans.factory.annotation.Autowired;
  22 +import org.springframework.context.annotation.Bean;
  23 +import org.springframework.context.annotation.Configuration;
  24 +import org.springframework.data.domain.Sort;
  25 +
  26 +import java.util.Collections;
  27 +
  28 +/**
  29 + * 车辆数据同步批处理相关配置config。
  30 + */
  31 +@Configuration
  32 +@EnableBatchProcessing
  33 +public class VehicleDataSyncBatchConfig {
  34 + @Autowired
  35 + private JobBuilderFactory jobBuilderFactory;
  36 + @Autowired
  37 + private StepBuilderFactory stepBuilderFactory;
  38 + @Autowired
  39 + private VehicleDataSyncRepo vehicleDataSyncDomainRepo;
  40 + @Autowired
  41 + private VehicleDataRepo vehicleDataRepo;
  42 +
  43 + //------------------ process service ------------------//
  44 + @Autowired
  45 + private PrepareStepDataProcessor prepareStepDataProcessor;
  46 + @Autowired
  47 + private SyncStepDataProcessor syncStepDataProcessor;
  48 +
  49 + //------------------ 监听器service ----------------//
  50 + @Autowired
  51 + private JobStatListener jobStatListener;
  52 + @Autowired
  53 + private PrepareStepReadStatListener prepareStepReadStatListener;
  54 + @Autowired
  55 + private PrepareStepProcessStatListener prepareStepProcessStatListener;
  56 + @Autowired
  57 + private PrepareStepWriteStatListener prepareStepWriteStatListener;
  58 + @Autowired
  59 + private SyncStepReadStatListener syncStepReadStatListener;
  60 + @Autowired
  61 + private SyncStepProcessStatListener syncStepProcessStatListener;
  62 + @Autowired
  63 + private SyncStepWriteStatListener syncStepWriteStatListener;
  64 +
  65 + @Bean
  66 + public Job vehicleDataSyncJob() {
  67 + return this.jobBuilderFactory
  68 + .get("vehicleDataSyncJob")
  69 + .start(vehicleDataSyncPrepareStep())
  70 + .next(vehicleDataSyncSyncStep())
  71 + .listener(jobStatListener)
  72 + .incrementer(new RunIdIncrementer())
  73 + .build();
  74 + }
  75 +
  76 + //--------------- prepare step 配置 -----------------//
  77 + @Bean
  78 + public Step vehicleDataSyncPrepareStep() {
  79 + return this.stepBuilderFactory
  80 + .get("vehicleDataSyncPrepareStep")
  81 + .<VehicleDataSync, VehicleDataSync>chunk(10)
  82 + .reader(vehicleDataSyncPrepareStepDataReader())
  83 + .processor(prepareStepDataProcessor)
  84 + .writer(vehicleDataSyncPrepareStepDataWriter())
  85 + .listener(prepareStepReadStatListener)
  86 + .listener(prepareStepProcessStatListener)
  87 + .listener(prepareStepWriteStatListener)
  88 + .build();
  89 + }
  90 + @Bean
  91 + public RepositoryItemReader<VehicleDataSync> vehicleDataSyncPrepareStepDataReader() {
  92 + return new RepositoryItemReaderBuilder<VehicleDataSync>()
  93 + .saveState(false) // 不保存step状态
  94 + .repository(this.vehicleDataSyncDomainRepo)
  95 + .methodName("findByStatus")
  96 + .arguments(Collections.singletonList(VehicleDataSyncStatusEnum.PREPARE))
  97 + .sorts(Collections.singletonMap("createDate", Sort.Direction.ASC))
  98 + .build();
  99 + }
  100 + @Bean
  101 + public RepositoryItemWriter<VehicleDataSync> vehicleDataSyncPrepareStepDataWriter() {
  102 + return new RepositoryItemWriterBuilder<VehicleDataSync>()
  103 + .repository(this.vehicleDataSyncDomainRepo)
  104 + .methodName("save")
  105 + .build();
  106 + }
  107 +
  108 +
  109 + //--------------- sync step 配置 -----------------//
  110 + @Bean
  111 + public Step vehicleDataSyncSyncStep() {
  112 + return this.stepBuilderFactory
  113 + .get("vehicleDataSyncSyncStep")
  114 + .<VehicleDataSync, VehicleData>chunk(10)
  115 + .reader(vehicleDataSyncSyncStepDataReader())
  116 + .processor(syncStepDataProcessor)
  117 + .writer(vehicleDataSyncSyncStepDataWriter())
  118 + .listener(syncStepReadStatListener)
  119 + .listener(syncStepProcessStatListener)
  120 + .listener(syncStepWriteStatListener)
  121 + .build();
  122 + }
  123 + @Bean
  124 + public RepositoryItemReader<VehicleDataSync> vehicleDataSyncSyncStepDataReader() {
  125 + return new RepositoryItemReaderBuilder<VehicleDataSync>()
  126 + .saveState(false) // 不保存step状态
  127 + .repository(this.vehicleDataSyncDomainRepo)
  128 + .methodName("findByStatus")
  129 + .arguments(Collections.singletonList(VehicleDataSyncStatusEnum.SYNCING))
  130 + .sorts(Collections.singletonMap("createDate", Sort.Direction.ASC))
  131 + .build();
  132 + }
  133 + @Bean
  134 + public RepositoryItemWriter<VehicleData> vehicleDataSyncSyncStepDataWriter() {
  135 + return new RepositoryItemWriterBuilder<VehicleData>()
  136 + .repository(this.vehicleDataRepo)
  137 + .methodName("save")
  138 + .build();
  139 + }
  140 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/VehicleDataSyncBatchThread.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/VehicleDataSyncBatchThread.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStatusEnum;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncRepo;
  5 +import org.slf4j.Logger;
  6 +import org.slf4j.LoggerFactory;
  7 +import org.springframework.batch.core.Job;
  8 +import org.springframework.batch.core.JobParameters;
  9 +import org.springframework.batch.core.launch.JobLauncher;
  10 +import org.springframework.beans.factory.DisposableBean;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.beans.factory.annotation.Qualifier;
  13 +import org.springframework.stereotype.Component;
  14 +
  15 +import javax.annotation.PostConstruct;
  16 +import java.util.Date;
  17 +
  18 +@Component
  19 +public class VehicleDataSyncBatchThread implements Runnable, DisposableBean {
  20 + /** 日志记录器 */
  21 + private final static Logger LOG = LoggerFactory.getLogger(VehicleDataSyncBatchThread.class);
  22 +
  23 + /** bean是否销毁(用于优雅退出) */
  24 + private volatile boolean beanDestroy = false;
  25 + /** service是否完成 */
  26 + private volatile boolean serviceComplete = false;
  27 +
  28 + /** 最近service完成时间 */
  29 + private Date lastServiceCompleteDate = new Date();
  30 + /** 数据同步间隔(秒) */
  31 + private Integer serviceIdleSecond = 1;
  32 +
  33 + @PostConstruct
  34 + public void init() {
  35 + LOG.info("车辆数据同步服务启动!");
  36 + // 启动线程实例
  37 + new Thread(this).start();
  38 + }
  39 +
  40 + @Override
  41 + public void destroy() throws Exception {
  42 + beanDestroy = true;
  43 + while (!serviceComplete) {
  44 + // 等待service完成
  45 + try {
  46 + // 等待1秒后继续判定
  47 + Thread.sleep(1000);
  48 + } catch (Exception exp) {
  49 + exp.printStackTrace();
  50 + }
  51 + }
  52 + LOG.info("车辆数据同步服务销毁!");
  53 + }
  54 +
  55 + @Override
  56 + public void run() {
  57 + while (!beanDestroy) {
  58 + Date current = new Date();
  59 + long testIdleTime = current.getTime() - lastServiceCompleteDate.getTime();
  60 + if (testIdleTime > serviceIdleSecond * 1000) {
  61 + service();
  62 + }
  63 +
  64 + // 等待100毫秒后继续判定
  65 + try {
  66 + Thread.sleep(100);
  67 + } catch (Exception exp) {
  68 + exp.printStackTrace();
  69 + }
  70 + }
  71 + }
  72 +
  73 + @Autowired
  74 + private VehicleDataSyncRepo vehicleDataSyncRepo;
  75 + protected void service() {
  76 + serviceComplete = false;
  77 + try {
  78 + long prepareCount = this.vehicleDataSyncRepo.countByStatus(VehicleDataSyncStatusEnum.PREPARE);
  79 + if (prepareCount > 0) {
  80 + doService();
  81 + }
  82 + } catch (Exception exp) {
  83 + exp.printStackTrace();
  84 + } finally {
  85 + lastServiceCompleteDate = new Date();
  86 + serviceComplete = true;
  87 + }
  88 + }
  89 +
  90 + @Autowired
  91 + private JobLauncher jobLauncher;
  92 + @Autowired
  93 + @Qualifier("vehicleDataSyncJob")
  94 + private Job vehicleDataSyncJob;
  95 + protected void doService() throws Exception {
  96 + LOG.info("车辆数据同步开始...");
  97 + // 启动job
  98 + this.jobLauncher.run(vehicleDataSyncJob, new JobParameters());
  99 + LOG.info("车辆数据同步结束...");
  100 + }
  101 +}
  102 +
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleData.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleData.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain;
  2 +
  3 +import javax.persistence.*;
  4 +import java.io.Serializable;
  5 +import java.util.Date;
  6 +
  7 +/**
  8 + * 车辆数据用Domain。
  9 + */
  10 +@Entity
  11 +@Table(name = "bsth_c_cars")
  12 +public class VehicleData implements Serializable {
  13 + /** 主健Id */
  14 + @Id
  15 + @GeneratedValue
  16 + private Integer id;
  17 +
  18 + /** 自编号/内部编号 */
  19 + @Column(nullable = false, length = 20, unique = true)
  20 + private String insideCode;
  21 +
  22 + /** 公司代码 */
  23 + @Column(nullable = false)
  24 + private String businessCode;
  25 + /** 公司名称 */
  26 + @Column(nullable = false)
  27 + private String company;
  28 + /** 分公司编码 */
  29 + private String brancheCompanyCode;
  30 + /** 分公司 */
  31 + private String brancheCompany;
  32 +
  33 + /** 车辆编码(TODO:在原系统里没有,这里暂时留着) */
  34 + @Column(nullable = false)
  35 + private String carCode;
  36 + /** 车牌号 */
  37 + @Column(nullable = false)
  38 + private String carPlate;
  39 + /** 供应商名称 */
  40 + @Column(nullable = false)
  41 + private String supplierName;
  42 + /** 设备终端号 */
  43 + @Column(nullable = false)
  44 + private String equipmentCode;
  45 +
  46 + // 以下信息来自总公司的业务系统,可能需要调用相关接口
  47 + /** 车型类别 */
  48 + private String carClass ;
  49 + /** 技术速度 */
  50 + private Double speed;
  51 + /** 座位数 */
  52 + private Integer carSeatnNumber;
  53 + /** 载客标准 */
  54 + private String carStandard;
  55 + /** 标准油耗(开空调) */
  56 + private Double kburnStandard;
  57 + /** 标准油耗(关空调) */
  58 + private Double gburnStandard;
  59 + /** 报废号 */
  60 + private String scrapCode;
  61 + /** 报废日期 */
  62 + private Date scrapDate;
  63 + /** 厂牌型号1 */
  64 + private String makeCodeOne;
  65 + /** 厂牌型号2 */
  66 + private String makeCodeTwo;
  67 + /** 车辆等级标准 */
  68 + private String carGride;
  69 + /** 出厂排放标准 */
  70 + private String emissionsStandard;
  71 + /** 发动机号码1 */
  72 + private String engineCodeOne;
  73 + /** 发动机号码2 */
  74 + private String engineCodeTwo;
  75 + /** 车架号码1 */
  76 + private String carNumberOne;
  77 + /** 车架号码2 */
  78 + private String carNumberTwo;
  79 + /** 启用日期(2008-10-10)*/
  80 + private Date openDate;
  81 + /** 取消日期 */
  82 + private Date closeDate;
  83 +
  84 + /** 是否空调车 */
  85 + @Column(nullable = true)
  86 + private Boolean hvacCar;
  87 + /** 有无人售票 */
  88 + @Column(nullable = true)
  89 + private Boolean ticketType;
  90 + /** 是否有LED服务屏 */
  91 + @Column(nullable = true)
  92 + private Boolean ledScreen;
  93 + /** 是否有TV视频 */
  94 + @Column(nullable = true)
  95 + private Boolean tvVideoType;
  96 +
  97 + /** 车辆类型 */
  98 + private String carType;
  99 + /** 是否机动车(机动车类型选择)*/
  100 + private String vehicleStats;
  101 + /** 营运状态 */
  102 + private String operatorsState;
  103 + /** 营运证编码 */
  104 + private String serviceNo;
  105 + /** 是否电车(TODO:在原系统里没有,这里暂时留着) */
  106 + private Boolean sfdc;
  107 + /** 是否混合动力(TODO:在原系统里没有,这里暂时留着) */
  108 + private Boolean sfmix;
  109 + /** 备注/描述 */
  110 + private String descriptions;
  111 +
  112 + /** 车辆序号(TODO:在原系统里没有,这里暂时留着) */
  113 + private String carOrdinal;
  114 + /** 视频编号 */
  115 + private String videoCode;
  116 + /** 是否报废 */
  117 + @Column(nullable = true)
  118 + private Boolean scrapState;
  119 + /** 是否切换(TODO:在原系统里没有,这里暂时留着)*/
  120 + private Integer isSwitch;
  121 + /** 线路名称(TODO:在原系统里没有,这里暂时留着,并且不做线路关联,只保留个名字) */
  122 + private String xlmc;
  123 +
  124 + /** 创建日期 */
  125 + @Column(updatable = false, name = "create_date")
  126 + private Date createDate;
  127 + /** 修改日期 */
  128 + @Column(name = "update_date")
  129 + private Date updateDate;
  130 +
  131 + public Integer getId() {
  132 + return id;
  133 + }
  134 +
  135 + public void setId(Integer id) {
  136 + this.id = id;
  137 + }
  138 +
  139 + public String getInsideCode() {
  140 + return insideCode;
  141 + }
  142 +
  143 + public void setInsideCode(String insideCode) {
  144 + this.insideCode = insideCode;
  145 + }
  146 +
  147 + public String getBusinessCode() {
  148 + return businessCode;
  149 + }
  150 +
  151 + public void setBusinessCode(String businessCode) {
  152 + this.businessCode = businessCode;
  153 + }
  154 +
  155 + public String getCompany() {
  156 + return company;
  157 + }
  158 +
  159 + public void setCompany(String company) {
  160 + this.company = company;
  161 + }
  162 +
  163 + public String getBrancheCompanyCode() {
  164 + return brancheCompanyCode;
  165 + }
  166 +
  167 + public void setBrancheCompanyCode(String brancheCompanyCode) {
  168 + this.brancheCompanyCode = brancheCompanyCode;
  169 + }
  170 +
  171 + public String getBrancheCompany() {
  172 + return brancheCompany;
  173 + }
  174 +
  175 + public void setBrancheCompany(String brancheCompany) {
  176 + this.brancheCompany = brancheCompany;
  177 + }
  178 +
  179 + public String getCarCode() {
  180 + return carCode;
  181 + }
  182 +
  183 + public void setCarCode(String carCode) {
  184 + this.carCode = carCode;
  185 + }
  186 +
  187 + public String getCarPlate() {
  188 + return carPlate;
  189 + }
  190 +
  191 + public void setCarPlate(String carPlate) {
  192 + this.carPlate = carPlate;
  193 + }
  194 +
  195 + public String getSupplierName() {
  196 + return supplierName;
  197 + }
  198 +
  199 + public void setSupplierName(String supplierName) {
  200 + this.supplierName = supplierName;
  201 + }
  202 +
  203 + public String getEquipmentCode() {
  204 + return equipmentCode;
  205 + }
  206 +
  207 + public void setEquipmentCode(String equipmentCode) {
  208 + this.equipmentCode = equipmentCode;
  209 + }
  210 +
  211 + public String getCarClass() {
  212 + return carClass;
  213 + }
  214 +
  215 + public void setCarClass(String carClass) {
  216 + this.carClass = carClass;
  217 + }
  218 +
  219 + public Double getSpeed() {
  220 + return speed;
  221 + }
  222 +
  223 + public void setSpeed(Double speed) {
  224 + this.speed = speed;
  225 + }
  226 +
  227 + public Integer getCarSeatnNumber() {
  228 + return carSeatnNumber;
  229 + }
  230 +
  231 + public void setCarSeatnNumber(Integer carSeatnNumber) {
  232 + this.carSeatnNumber = carSeatnNumber;
  233 + }
  234 +
  235 + public String getCarStandard() {
  236 + return carStandard;
  237 + }
  238 +
  239 + public void setCarStandard(String carStandard) {
  240 + this.carStandard = carStandard;
  241 + }
  242 +
  243 + public Double getKburnStandard() {
  244 + return kburnStandard;
  245 + }
  246 +
  247 + public void setKburnStandard(Double kburnStandard) {
  248 + this.kburnStandard = kburnStandard;
  249 + }
  250 +
  251 + public Double getGburnStandard() {
  252 + return gburnStandard;
  253 + }
  254 +
  255 + public void setGburnStandard(Double gburnStandard) {
  256 + this.gburnStandard = gburnStandard;
  257 + }
  258 +
  259 + public String getScrapCode() {
  260 + return scrapCode;
  261 + }
  262 +
  263 + public void setScrapCode(String scrapCode) {
  264 + this.scrapCode = scrapCode;
  265 + }
  266 +
  267 + public Date getScrapDate() {
  268 + return scrapDate;
  269 + }
  270 +
  271 + public void setScrapDate(Date scrapDate) {
  272 + this.scrapDate = scrapDate;
  273 + }
  274 +
  275 + public String getMakeCodeOne() {
  276 + return makeCodeOne;
  277 + }
  278 +
  279 + public void setMakeCodeOne(String makeCodeOne) {
  280 + this.makeCodeOne = makeCodeOne;
  281 + }
  282 +
  283 + public String getMakeCodeTwo() {
  284 + return makeCodeTwo;
  285 + }
  286 +
  287 + public void setMakeCodeTwo(String makeCodeTwo) {
  288 + this.makeCodeTwo = makeCodeTwo;
  289 + }
  290 +
  291 + public String getCarGride() {
  292 + return carGride;
  293 + }
  294 +
  295 + public void setCarGride(String carGride) {
  296 + this.carGride = carGride;
  297 + }
  298 +
  299 + public String getEmissionsStandard() {
  300 + return emissionsStandard;
  301 + }
  302 +
  303 + public void setEmissionsStandard(String emissionsStandard) {
  304 + this.emissionsStandard = emissionsStandard;
  305 + }
  306 +
  307 + public String getEngineCodeOne() {
  308 + return engineCodeOne;
  309 + }
  310 +
  311 + public void setEngineCodeOne(String engineCodeOne) {
  312 + this.engineCodeOne = engineCodeOne;
  313 + }
  314 +
  315 + public String getEngineCodeTwo() {
  316 + return engineCodeTwo;
  317 + }
  318 +
  319 + public void setEngineCodeTwo(String engineCodeTwo) {
  320 + this.engineCodeTwo = engineCodeTwo;
  321 + }
  322 +
  323 + public String getCarNumberOne() {
  324 + return carNumberOne;
  325 + }
  326 +
  327 + public void setCarNumberOne(String carNumberOne) {
  328 + this.carNumberOne = carNumberOne;
  329 + }
  330 +
  331 + public String getCarNumberTwo() {
  332 + return carNumberTwo;
  333 + }
  334 +
  335 + public void setCarNumberTwo(String carNumberTwo) {
  336 + this.carNumberTwo = carNumberTwo;
  337 + }
  338 +
  339 + public Date getOpenDate() {
  340 + return openDate;
  341 + }
  342 +
  343 + public void setOpenDate(Date openDate) {
  344 + this.openDate = openDate;
  345 + }
  346 +
  347 + public Date getCloseDate() {
  348 + return closeDate;
  349 + }
  350 +
  351 + public void setCloseDate(Date closeDate) {
  352 + this.closeDate = closeDate;
  353 + }
  354 +
  355 + public Boolean getHvacCar() {
  356 + return hvacCar;
  357 + }
  358 +
  359 + public void setHvacCar(Boolean hvacCar) {
  360 + this.hvacCar = hvacCar;
  361 + }
  362 +
  363 + public Boolean getTicketType() {
  364 + return ticketType;
  365 + }
  366 +
  367 + public void setTicketType(Boolean ticketType) {
  368 + this.ticketType = ticketType;
  369 + }
  370 +
  371 + public Boolean getLedScreen() {
  372 + return ledScreen;
  373 + }
  374 +
  375 + public void setLedScreen(Boolean ledScreen) {
  376 + this.ledScreen = ledScreen;
  377 + }
  378 +
  379 + public Boolean getTvVideoType() {
  380 + return tvVideoType;
  381 + }
  382 +
  383 + public void setTvVideoType(Boolean tvVideoType) {
  384 + this.tvVideoType = tvVideoType;
  385 + }
  386 +
  387 + public String getCarType() {
  388 + return carType;
  389 + }
  390 +
  391 + public void setCarType(String carType) {
  392 + this.carType = carType;
  393 + }
  394 +
  395 + public String getVehicleStats() {
  396 + return vehicleStats;
  397 + }
  398 +
  399 + public void setVehicleStats(String vehicleStats) {
  400 + this.vehicleStats = vehicleStats;
  401 + }
  402 +
  403 + public String getOperatorsState() {
  404 + return operatorsState;
  405 + }
  406 +
  407 + public void setOperatorsState(String operatorsState) {
  408 + this.operatorsState = operatorsState;
  409 + }
  410 +
  411 + public String getServiceNo() {
  412 + return serviceNo;
  413 + }
  414 +
  415 + public void setServiceNo(String serviceNo) {
  416 + this.serviceNo = serviceNo;
  417 + }
  418 +
  419 + public Boolean getSfdc() {
  420 + return sfdc;
  421 + }
  422 +
  423 + public void setSfdc(Boolean sfdc) {
  424 + this.sfdc = sfdc;
  425 + }
  426 +
  427 + public Boolean getSfmix() {
  428 + return sfmix;
  429 + }
  430 +
  431 + public void setSfmix(Boolean sfmix) {
  432 + this.sfmix = sfmix;
  433 + }
  434 +
  435 + public String getDescriptions() {
  436 + return descriptions;
  437 + }
  438 +
  439 + public void setDescriptions(String descriptions) {
  440 + this.descriptions = descriptions;
  441 + }
  442 +
  443 + public String getCarOrdinal() {
  444 + return carOrdinal;
  445 + }
  446 +
  447 + public void setCarOrdinal(String carOrdinal) {
  448 + this.carOrdinal = carOrdinal;
  449 + }
  450 +
  451 + public String getVideoCode() {
  452 + return videoCode;
  453 + }
  454 +
  455 + public void setVideoCode(String videoCode) {
  456 + this.videoCode = videoCode;
  457 + }
  458 +
  459 + public Boolean getScrapState() {
  460 + return scrapState;
  461 + }
  462 +
  463 + public void setScrapState(Boolean scrapState) {
  464 + this.scrapState = scrapState;
  465 + }
  466 +
  467 + public Integer getIsSwitch() {
  468 + return isSwitch;
  469 + }
  470 +
  471 + public void setIsSwitch(Integer isSwitch) {
  472 + this.isSwitch = isSwitch;
  473 + }
  474 +
  475 + public String getXlmc() {
  476 + return xlmc;
  477 + }
  478 +
  479 + public void setXlmc(String xlmc) {
  480 + this.xlmc = xlmc;
  481 + }
  482 +
  483 + public Date getCreateDate() {
  484 + return createDate;
  485 + }
  486 +
  487 + public void setCreateDate(Date createDate) {
  488 + this.createDate = createDate;
  489 + }
  490 +
  491 + public Date getUpdateDate() {
  492 + return updateDate;
  493 + }
  494 +
  495 + public void setUpdateDate(Date updateDate) {
  496 + this.updateDate = updateDate;
  497 + }
  498 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSync.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSync.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain;
  2 +
  3 +import javax.persistence.*;
  4 +import java.util.Date;
  5 +
  6 +/**
  7 + * 车辆数据同步数据。
  8 + */
  9 +@Entity
  10 +@Table(name = "bsth_c_cars_sync")
  11 +public class VehicleDataSync {
  12 + /** 主健Id */
  13 + @Id
  14 + @GeneratedValue
  15 + private Long id;
  16 +
  17 + //--------------- 标识车辆的数据(自编号和车牌号) ---------------//
  18 + /** 自编号/内部编号 */
  19 + @Column(nullable = false, length = 20, unique = true)
  20 + private String idenZbh;
  21 + /** 车牌号 */
  22 + @Column(nullable = false)
  23 + private String idenCph;
  24 +
  25 + //--------------- 更新的数据 ------------//
  26 + /** 更新 公司代码 */
  27 + private String updateGsdm;
  28 + /** 更新 公司名称 */
  29 + private String updateGsmc;
  30 +
  31 + // TODO:后续再添加
  32 +
  33 + //--------------- 时间,状态数据 ------------//
  34 + /** 创建时间 */
  35 + @Column(nullable = false)
  36 + private Date createDate;
  37 + /** 更新时间 */
  38 + @Column(nullable = false)
  39 + private Date updateDate;
  40 + /** 同步状态 */
  41 + @Column(nullable = false)
  42 + @Convert(converter = VehicleDataSyncStatusEnumConverter.class)
  43 + private VehicleDataSyncStatusEnum status;
  44 +
  45 + public Long getId() {
  46 + return id;
  47 + }
  48 +
  49 + public void setId(Long id) {
  50 + this.id = id;
  51 + }
  52 +
  53 + public String getIdenZbh() {
  54 + return idenZbh;
  55 + }
  56 +
  57 + public void setIdenZbh(String idenZbh) {
  58 + this.idenZbh = idenZbh;
  59 + }
  60 +
  61 + public String getIdenCph() {
  62 + return idenCph;
  63 + }
  64 +
  65 + public void setIdenCph(String idenCph) {
  66 + this.idenCph = idenCph;
  67 + }
  68 +
  69 + public String getUpdateGsdm() {
  70 + return updateGsdm;
  71 + }
  72 +
  73 + public void setUpdateGsdm(String updateGsdm) {
  74 + this.updateGsdm = updateGsdm;
  75 + }
  76 +
  77 + public String getUpdateGsmc() {
  78 + return updateGsmc;
  79 + }
  80 +
  81 + public void setUpdateGsmc(String updateGsmc) {
  82 + this.updateGsmc = updateGsmc;
  83 + }
  84 +
  85 + public Date getCreateDate() {
  86 + return createDate;
  87 + }
  88 +
  89 + public void setCreateDate(Date createDate) {
  90 + this.createDate = createDate;
  91 + }
  92 +
  93 + public Date getUpdateDate() {
  94 + return updateDate;
  95 + }
  96 +
  97 + public void setUpdateDate(Date updateDate) {
  98 + this.updateDate = updateDate;
  99 + }
  100 +
  101 + public VehicleDataSyncStatusEnum getStatus() {
  102 + return status;
  103 + }
  104 +
  105 + public void setStatus(VehicleDataSyncStatusEnum status) {
  106 + this.status = status;
  107 + }
  108 +}
0 109 \ No newline at end of file
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSyncStat.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSyncStat.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain;
  2 +
  3 +import javax.persistence.*;
  4 +import java.util.Date;
  5 +
  6 +/**
  7 + * 车辆数据同步数据统计。
  8 + */
  9 +@Entity
  10 +@Table(name = "bsth_c_cars_sync_stat")
  11 +public class VehicleDataSyncStat {
  12 + /** 主健Id */
  13 + @Id
  14 + @GeneratedValue
  15 + private Long id;
  16 +
  17 + /** job实例Id */
  18 + @Column(nullable = false)
  19 + private Long jobId;
  20 + /** job名字 */
  21 + @Column(nullable = false)
  22 + private String jobName;
  23 + /** job执行Id */
  24 + @Column(nullable = false, unique = true)
  25 + private Long jobExecutionId;
  26 +
  27 + /** 待同步的车辆数据ids(同步状态=SYNCING) */
  28 + @Column(length = 2000)
  29 + private String syncDataPrepareIds;
  30 + /** 待同步的车辆数据自编号s(同步状态=SYNCING) */
  31 + @Column(length = 2000)
  32 + private String syncDataPrepareZbhs;
  33 +
  34 + /** 待同步的车辆count */
  35 + private Integer syncDataPrepareCount;
  36 + /** 同步成功的车辆count */
  37 + private Integer syncDataSuccessCount;
  38 +
  39 + /** 退出step执行Id */
  40 + private Long exitStepExecutionId;
  41 + /** 退出异常stack信息 */
  42 + @Column(length = 2500)
  43 + private String exitStackTrace;
  44 +
  45 + /** 同步状态 */
  46 + @Column(nullable = false)
  47 + @Convert(converter = VehicleDataSyncStatusEnumConverter.class)
  48 + private VehicleDataSyncStatusEnum status;
  49 +
  50 + /** job执行开始时间 */
  51 + @Column(nullable = false)
  52 + private Date startDate;
  53 + /** job执行结束时间 */
  54 + private Date endDate;
  55 +
  56 + public Long getId() {
  57 + return id;
  58 + }
  59 +
  60 + public void setId(Long id) {
  61 + this.id = id;
  62 + }
  63 +
  64 + public Long getJobId() {
  65 + return jobId;
  66 + }
  67 +
  68 + public void setJobId(Long jobId) {
  69 + this.jobId = jobId;
  70 + }
  71 +
  72 + public String getJobName() {
  73 + return jobName;
  74 + }
  75 +
  76 + public void setJobName(String jobName) {
  77 + this.jobName = jobName;
  78 + }
  79 +
  80 + public Long getJobExecutionId() {
  81 + return jobExecutionId;
  82 + }
  83 +
  84 + public void setJobExecutionId(Long jobExecutionId) {
  85 + this.jobExecutionId = jobExecutionId;
  86 + }
  87 +
  88 + public String getSyncDataPrepareIds() {
  89 + return syncDataPrepareIds;
  90 + }
  91 +
  92 + public void setSyncDataPrepareIds(String syncDataPrepareIds) {
  93 + this.syncDataPrepareIds = syncDataPrepareIds;
  94 + }
  95 +
  96 + public String getSyncDataPrepareZbhs() {
  97 + return syncDataPrepareZbhs;
  98 + }
  99 +
  100 + public void setSyncDataPrepareZbhs(String syncDataPrepareZbhs) {
  101 + this.syncDataPrepareZbhs = syncDataPrepareZbhs;
  102 + }
  103 +
  104 + public Integer getSyncDataPrepareCount() {
  105 + return syncDataPrepareCount;
  106 + }
  107 +
  108 + public void setSyncDataPrepareCount(Integer syncDataPrepareCount) {
  109 + this.syncDataPrepareCount = syncDataPrepareCount;
  110 + }
  111 +
  112 + public Integer getSyncDataSuccessCount() {
  113 + return syncDataSuccessCount;
  114 + }
  115 +
  116 + public void setSyncDataSuccessCount(Integer syncDataSuccessCount) {
  117 + this.syncDataSuccessCount = syncDataSuccessCount;
  118 + }
  119 +
  120 + public Long getExitStepExecutionId() {
  121 + return exitStepExecutionId;
  122 + }
  123 +
  124 + public void setExitStepExecutionId(Long exitStepExecutionId) {
  125 + this.exitStepExecutionId = exitStepExecutionId;
  126 + }
  127 +
  128 + public String getExitStackTrace() {
  129 + return exitStackTrace;
  130 + }
  131 +
  132 + public void setExitStackTrace(String exitStackTrace) {
  133 + this.exitStackTrace = exitStackTrace;
  134 + }
  135 +
  136 + public VehicleDataSyncStatusEnum getStatus() {
  137 + return status;
  138 + }
  139 +
  140 + public void setStatus(VehicleDataSyncStatusEnum status) {
  141 + this.status = status;
  142 + }
  143 +
  144 + public Date getStartDate() {
  145 + return startDate;
  146 + }
  147 +
  148 + public void setStartDate(Date startDate) {
  149 + this.startDate = startDate;
  150 + }
  151 +
  152 + public Date getEndDate() {
  153 + return endDate;
  154 + }
  155 +
  156 + public void setEndDate(Date endDate) {
  157 + this.endDate = endDate;
  158 + }
  159 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSyncStatusEnum.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSyncStatusEnum.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonCreator;
  4 +import com.fasterxml.jackson.annotation.JsonValue;
  5 +import org.springframework.util.StringUtils;
  6 +
  7 +import java.util.HashMap;
  8 +import java.util.Map;
  9 +
  10 +/**
  11 + * 车辆数据同步状态enum。
  12 + */
  13 +public enum VehicleDataSyncStatusEnum {
  14 + PREPARE("准备"),
  15 + SYNCING("同步中"),
  16 + SUCCESS("成功"),
  17 + FAILURE("失败");
  18 +
  19 + public static Map<String, VehicleDataSyncStatusEnum> enumMap =
  20 + new HashMap<String, VehicleDataSyncStatusEnum>() {{
  21 + put("准备", PREPARE);
  22 + put("同步中", SYNCING);
  23 + put("成功", SUCCESS);
  24 + put("失败", FAILURE);
  25 + }};
  26 +
  27 + /** 字典描述(对应数据库的字典) */
  28 + private String dicDesc;
  29 +
  30 + @JsonCreator
  31 + VehicleDataSyncStatusEnum(String dicDesc) {
  32 + this.dicDesc = dicDesc;
  33 + }
  34 +
  35 + public static VehicleDataSyncStatusEnum fromDicDesc(String dicDesc) {
  36 + if (StringUtils.isEmpty(dicDesc)) {
  37 + throw new RuntimeException("车辆数据同步状态描述不能为空!");
  38 + } else if (enumMap.get(dicDesc) == null) {
  39 + throw new RuntimeException("车辆数据同步状态未定义:" + dicDesc);
  40 + }
  41 + return enumMap.get(dicDesc);
  42 + }
  43 +
  44 + @JsonValue
  45 + public String getDicDesc() {
  46 + return dicDesc;
  47 + }
  48 +
  49 + public void setDicDesc(String dicDesc) {
  50 + this.dicDesc = dicDesc;
  51 + }
  52 +
  53 + @Override
  54 + public String toString() {
  55 + return dicDesc;
  56 + }
  57 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSyncStatusEnumConverter.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/domain/VehicleDataSyncStatusEnumConverter.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain;
  2 +
  3 +import javax.persistence.AttributeConverter;
  4 +import javax.persistence.Convert;
  5 +
  6 +@Convert
  7 +public class VehicleDataSyncStatusEnumConverter implements AttributeConverter<VehicleDataSyncStatusEnum, String> {
  8 + @Override
  9 + public String convertToDatabaseColumn(VehicleDataSyncStatusEnum vehicleDataSyncStatusEnum) {
  10 + return vehicleDataSyncStatusEnum.getDicDesc();
  11 + }
  12 +
  13 + @Override
  14 + public VehicleDataSyncStatusEnum convertToEntityAttribute(String s) {
  15 + return VehicleDataSyncStatusEnum.fromDicDesc(s);
  16 + }
  17 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/repo/VehicleDataRepo.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/repo/VehicleDataRepo.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleData;
  4 +import org.springframework.data.jpa.repository.JpaRepository;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +@Repository
  8 +public interface VehicleDataRepo extends JpaRepository<VehicleData, Integer> {
  9 + VehicleData findByInsideCodeAndCarPlate(String insideCode, String carPlate);
  10 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/repo/VehicleDataSyncRepo.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/repo/VehicleDataSyncRepo.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStatusEnum;
  5 +import org.springframework.data.domain.Page;
  6 +import org.springframework.data.domain.Pageable;
  7 +import org.springframework.data.jpa.repository.JpaRepository;
  8 +import org.springframework.stereotype.Repository;
  9 +
  10 +@Repository
  11 +public interface VehicleDataSyncRepo extends JpaRepository<VehicleDataSync, Long> {
  12 + Page<VehicleDataSync> findByStatus(VehicleDataSyncStatusEnum status, Pageable pageRequest);
  13 + long countByStatus(VehicleDataSyncStatusEnum status);
  14 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/repo/VehicleDataSyncStatRepo.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/repo/VehicleDataSyncStatRepo.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  4 +import org.springframework.data.jpa.repository.JpaRepository;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +@Repository
  8 +public interface VehicleDataSyncStatRepo extends JpaRepository<VehicleDataSyncStat, Long> {
  9 + VehicleDataSyncStat findByJobExecutionId(Long id);
  10 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/JobStatListener.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/JobStatListener.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStatusEnum;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  6 +import org.springframework.batch.core.JobExecution;
  7 +import org.springframework.batch.core.JobExecutionListener;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.stereotype.Service;
  10 +import org.springframework.transaction.annotation.Isolation;
  11 +import org.springframework.transaction.annotation.Propagation;
  12 +import org.springframework.transaction.annotation.Transactional;
  13 +
  14 +import java.util.Date;
  15 +
  16 +@Service
  17 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  18 +public class JobStatListener implements JobExecutionListener {
  19 + @Autowired
  20 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  21 +
  22 + @Override
  23 + public void beforeJob(JobExecution jobExecution) {
  24 + VehicleDataSyncStat vehicleDataSyncStat = new VehicleDataSyncStat();
  25 + vehicleDataSyncStat.setJobId(jobExecution.getJobId());
  26 + vehicleDataSyncStat.setJobName(jobExecution.getJobInstance().getJobName());
  27 + vehicleDataSyncStat.setJobExecutionId(jobExecution.getId());
  28 +
  29 + vehicleDataSyncStat.setStatus(VehicleDataSyncStatusEnum.SYNCING);
  30 + vehicleDataSyncStat.setStartDate(new Date());
  31 +
  32 + vehicleDataSyncStatRepo.save(vehicleDataSyncStat);
  33 + }
  34 +
  35 + @Override
  36 + public void afterJob(JobExecution jobExecution) {
  37 + VehicleDataSyncStat vehicleDataSyncStat =
  38 + this.vehicleDataSyncStatRepo.findByJobExecutionId(jobExecution.getId());
  39 + if (jobExecution.getStatus().isUnsuccessful()) {
  40 + vehicleDataSyncStat.setStatus(VehicleDataSyncStatusEnum.FAILURE);
  41 + } else {
  42 + vehicleDataSyncStat.setStatus(VehicleDataSyncStatusEnum.SUCCESS);
  43 + }
  44 + vehicleDataSyncStat.setEndDate(new Date());
  45 + }
  46 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/PrepareStepProcessStatListener.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/PrepareStepProcessStatListener.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  6 +import org.springframework.batch.core.ItemProcessListener;
  7 +import org.springframework.batch.core.StepExecution;
  8 +import org.springframework.batch.core.configuration.annotation.StepScope;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Value;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.transaction.annotation.Isolation;
  13 +import org.springframework.transaction.annotation.Propagation;
  14 +import org.springframework.transaction.annotation.Transactional;
  15 +
  16 +import java.util.Arrays;
  17 +
  18 +@StepScope
  19 +@Service
  20 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  21 +public class PrepareStepProcessStatListener implements ItemProcessListener<VehicleDataSync, VehicleDataSync> {
  22 + @Value("#{stepExecution}")
  23 + private StepExecution stepExecution;
  24 + @Autowired
  25 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  26 +
  27 + @Override
  28 + public void beforeProcess(VehicleDataSync item) {
  29 +
  30 + }
  31 +
  32 + @Override
  33 + public void afterProcess(VehicleDataSync item, VehicleDataSync result) {
  34 +
  35 + }
  36 +
  37 + @Override
  38 + public void onProcessError(VehicleDataSync item, Exception ex) {
  39 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  40 + stepExecution.getJobExecutionId()
  41 + );
  42 + vehicleDataSyncStat.setExitStepExecutionId(stepExecution.getId());
  43 + vehicleDataSyncStat.setExitStackTrace(Arrays.asList(ex.getStackTrace()).toString());
  44 + }
  45 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/PrepareStepReadStatListener.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/PrepareStepReadStatListener.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  6 +import org.springframework.batch.core.ItemReadListener;
  7 +import org.springframework.batch.core.StepExecution;
  8 +import org.springframework.batch.core.configuration.annotation.StepScope;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Value;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.transaction.annotation.Isolation;
  13 +import org.springframework.transaction.annotation.Propagation;
  14 +import org.springframework.transaction.annotation.Transactional;
  15 +
  16 +import java.util.Arrays;
  17 +
  18 +@StepScope
  19 +@Service
  20 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  21 +public class PrepareStepReadStatListener implements ItemReadListener<VehicleDataSync> {
  22 + @Value("#{stepExecution}")
  23 + private StepExecution stepExecution;
  24 + @Autowired
  25 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  26 +
  27 + @Override
  28 + public void beforeRead() {
  29 +
  30 + }
  31 +
  32 + @Override
  33 + public void afterRead(VehicleDataSync item) {
  34 +
  35 + }
  36 +
  37 + @Override
  38 + public void onReadError(Exception ex) {
  39 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  40 + stepExecution.getJobExecutionId()
  41 + );
  42 + vehicleDataSyncStat.setExitStepExecutionId(stepExecution.getId());
  43 + vehicleDataSyncStat.setExitStackTrace(Arrays.asList(ex.getStackTrace()).toString());
  44 + }
  45 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/PrepareStepWriteStatListener.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/PrepareStepWriteStatListener.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  6 +import org.springframework.batch.core.ItemWriteListener;
  7 +import org.springframework.batch.core.StepExecution;
  8 +import org.springframework.batch.core.configuration.annotation.StepScope;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Value;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.transaction.annotation.Isolation;
  13 +import org.springframework.transaction.annotation.Propagation;
  14 +import org.springframework.transaction.annotation.Transactional;
  15 +import org.springframework.util.CollectionUtils;
  16 +import org.springframework.util.StringUtils;
  17 +
  18 +import java.util.ArrayList;
  19 +import java.util.Arrays;
  20 +import java.util.List;
  21 +
  22 +@StepScope
  23 +@Service
  24 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  25 +public class PrepareStepWriteStatListener implements ItemWriteListener<VehicleDataSync> {
  26 + @Value("#{stepExecution}")
  27 + private StepExecution stepExecution;
  28 + @Autowired
  29 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  30 +
  31 + @Override
  32 + public void beforeWrite(List<? extends VehicleDataSync> items) {
  33 +
  34 + }
  35 +
  36 + @Override
  37 + public void afterWrite(List<? extends VehicleDataSync> items) {
  38 + if (!CollectionUtils.isEmpty(items)) {
  39 + List<String> ids = new ArrayList<>();
  40 + List<String> zbhs = new ArrayList<>();
  41 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  42 + stepExecution.getJobExecutionId()
  43 + );
  44 +
  45 + if (!StringUtils.isEmpty(vehicleDataSyncStat.getSyncDataPrepareIds())) {
  46 + ids.addAll(Arrays.asList(vehicleDataSyncStat.getSyncDataPrepareIds().split(",")));
  47 + }
  48 + if (!StringUtils.isEmpty(vehicleDataSyncStat.getSyncDataPrepareZbhs())) {
  49 + zbhs.addAll(Arrays.asList(vehicleDataSyncStat.getSyncDataPrepareZbhs().split(",")));
  50 + }
  51 +
  52 + for (VehicleDataSync item : items) {
  53 + ids.add(item.getId().toString());
  54 + zbhs.add(item.getIdenZbh());
  55 + }
  56 +
  57 + vehicleDataSyncStat.setSyncDataPrepareIds(String.join(",", ids));
  58 + vehicleDataSyncStat.setSyncDataPrepareZbhs(String.join(",", zbhs));
  59 +
  60 + // 更新数量
  61 + if (vehicleDataSyncStat.getSyncDataPrepareCount() == null) {
  62 + vehicleDataSyncStat.setSyncDataPrepareCount(items.size());
  63 + } else {
  64 + vehicleDataSyncStat.setSyncDataPrepareCount(
  65 + vehicleDataSyncStat.getSyncDataPrepareCount() + items.size());
  66 + }
  67 + }
  68 + }
  69 +
  70 + @Override
  71 + public void onWriteError(Exception ex, List<? extends VehicleDataSync> items) {
  72 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  73 + stepExecution.getJobExecutionId()
  74 + );
  75 + vehicleDataSyncStat.setExitStepExecutionId(stepExecution.getId());
  76 + vehicleDataSyncStat.setExitStackTrace(Arrays.asList(ex.getStackTrace()).toString());
  77 + }
  78 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/SyncStepProcessStatListener.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/SyncStepProcessStatListener.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleData;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  6 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  7 +import org.springframework.batch.core.ItemProcessListener;
  8 +import org.springframework.batch.core.StepExecution;
  9 +import org.springframework.batch.core.configuration.annotation.StepScope;
  10 +import org.springframework.beans.factory.annotation.Autowired;
  11 +import org.springframework.beans.factory.annotation.Value;
  12 +import org.springframework.stereotype.Service;
  13 +import org.springframework.transaction.annotation.Isolation;
  14 +import org.springframework.transaction.annotation.Propagation;
  15 +import org.springframework.transaction.annotation.Transactional;
  16 +
  17 +import java.util.Arrays;
  18 +
  19 +@StepScope
  20 +@Service
  21 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  22 +public class SyncStepProcessStatListener implements ItemProcessListener<VehicleDataSync, VehicleData> {
  23 + @Value("#{stepExecution}")
  24 + private StepExecution stepExecution;
  25 + @Autowired
  26 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  27 +
  28 + @Override
  29 + public void beforeProcess(VehicleDataSync item) {
  30 +
  31 + }
  32 +
  33 + @Override
  34 + public void afterProcess(VehicleDataSync item, VehicleData result) {
  35 +
  36 + }
  37 +
  38 + @Override
  39 + public void onProcessError(VehicleDataSync item, Exception ex) {
  40 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  41 + stepExecution.getJobExecutionId()
  42 + );
  43 + vehicleDataSyncStat.setExitStepExecutionId(stepExecution.getId());
  44 + vehicleDataSyncStat.setExitStackTrace(Arrays.asList(ex.getStackTrace()).toString());
  45 + }
  46 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/SyncStepReadStatListener.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/SyncStepReadStatListener.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  6 +import org.springframework.batch.core.ItemReadListener;
  7 +import org.springframework.batch.core.StepExecution;
  8 +import org.springframework.batch.core.configuration.annotation.StepScope;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Value;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.transaction.annotation.Isolation;
  13 +import org.springframework.transaction.annotation.Propagation;
  14 +import org.springframework.transaction.annotation.Transactional;
  15 +
  16 +import java.util.Arrays;
  17 +
  18 +@StepScope
  19 +@Service
  20 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  21 +public class SyncStepReadStatListener implements ItemReadListener<VehicleDataSync> {
  22 + @Value("#{stepExecution}")
  23 + private StepExecution stepExecution;
  24 + @Autowired
  25 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  26 +
  27 + @Override
  28 + public void beforeRead() {
  29 +
  30 + }
  31 +
  32 + @Override
  33 + public void afterRead(VehicleDataSync item) {
  34 +
  35 + }
  36 +
  37 + @Override
  38 + public void onReadError(Exception ex) {
  39 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  40 + stepExecution.getJobExecutionId()
  41 + );
  42 + vehicleDataSyncStat.setExitStepExecutionId(stepExecution.getId());
  43 + vehicleDataSyncStat.setExitStackTrace(Arrays.asList(ex.getStackTrace()).toString());
  44 + }
  45 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/SyncStepWriteStatListener.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/listener/SyncStepWriteStatListener.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.listener;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleData;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  6 +import org.springframework.batch.core.ItemWriteListener;
  7 +import org.springframework.batch.core.StepExecution;
  8 +import org.springframework.batch.core.configuration.annotation.StepScope;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.beans.factory.annotation.Value;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.transaction.annotation.Isolation;
  13 +import org.springframework.transaction.annotation.Propagation;
  14 +import org.springframework.transaction.annotation.Transactional;
  15 +import org.springframework.util.CollectionUtils;
  16 +
  17 +import java.util.Arrays;
  18 +import java.util.List;
  19 +
  20 +@StepScope
  21 +@Service
  22 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  23 +public class SyncStepWriteStatListener implements ItemWriteListener<VehicleData> {
  24 + @Value("#{stepExecution}")
  25 + private StepExecution stepExecution;
  26 + @Autowired
  27 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  28 +
  29 + @Override
  30 + public void beforeWrite(List<? extends VehicleData> items) {
  31 +
  32 + }
  33 +
  34 + @Override
  35 + public void afterWrite(List<? extends VehicleData> items) {
  36 + if (!CollectionUtils.isEmpty(items)) {
  37 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  38 + stepExecution.getJobExecutionId()
  39 + );
  40 + // 更新数量
  41 + if (vehicleDataSyncStat.getSyncDataSuccessCount() == null) {
  42 + vehicleDataSyncStat.setSyncDataSuccessCount(items.size());
  43 + } else {
  44 + vehicleDataSyncStat.setSyncDataSuccessCount(
  45 + vehicleDataSyncStat.getSyncDataSuccessCount() + items.size()
  46 + );
  47 + }
  48 + }
  49 + }
  50 +
  51 + @Override
  52 + public void onWriteError(Exception ex, List<? extends VehicleData> items) {
  53 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findByJobExecutionId(
  54 + stepExecution.getJobExecutionId()
  55 + );
  56 + vehicleDataSyncStat.setExitStepExecutionId(stepExecution.getId());
  57 + vehicleDataSyncStat.setExitStackTrace(Arrays.asList(ex.getStackTrace()).toString());
  58 + }
  59 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/process/PrepareStepDataProcessor.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/process/PrepareStepDataProcessor.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.process;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStatusEnum;
  5 +import org.springframework.batch.core.configuration.annotation.StepScope;
  6 +import org.springframework.batch.item.ItemProcessor;
  7 +import org.springframework.stereotype.Service;
  8 +import org.springframework.transaction.annotation.Isolation;
  9 +import org.springframework.transaction.annotation.Propagation;
  10 +import org.springframework.transaction.annotation.Transactional;
  11 +
  12 +import java.util.Date;
  13 +
  14 +@StepScope
  15 +@Service
  16 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  17 +public class PrepareStepDataProcessor implements ItemProcessor<VehicleDataSync, VehicleDataSync> {
  18 + @Override
  19 + public VehicleDataSync process(VehicleDataSync item) throws Exception {
  20 + if (item.getStatus() == VehicleDataSyncStatusEnum.PREPARE) {
  21 + item.setStatus(VehicleDataSyncStatusEnum.SYNCING);
  22 + item.setUpdateDate(new Date());
  23 + return item;
  24 + } else {
  25 + // 过滤状态不为 PREPARE 的记录
  26 + return null;
  27 + }
  28 + }
  29 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/process/SyncStepDataProcessor.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/batch/service/process/SyncStepDataProcessor.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.service.process;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleData;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStatusEnum;
  6 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataRepo;
  7 +import org.springframework.batch.core.configuration.annotation.StepScope;
  8 +import org.springframework.batch.item.ItemProcessor;
  9 +import org.springframework.beans.factory.annotation.Autowired;
  10 +import org.springframework.stereotype.Service;
  11 +import org.springframework.transaction.annotation.Isolation;
  12 +import org.springframework.transaction.annotation.Propagation;
  13 +import org.springframework.transaction.annotation.Transactional;
  14 +
  15 +import java.util.Date;
  16 +
  17 +@StepScope
  18 +@Service
  19 +@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
  20 +public class SyncStepDataProcessor implements ItemProcessor<VehicleDataSync, VehicleData> {
  21 + @Autowired
  22 + private VehicleDataRepo vehicleDataRepo;
  23 +
  24 + @Override
  25 + public VehicleData process(VehicleDataSync item) throws Exception {
  26 + if (item.getStatus() == VehicleDataSyncStatusEnum.SYNCING) {
  27 + // 1、查找车辆信息
  28 + VehicleData vehicleData = this.vehicleDataRepo.findByInsideCodeAndCarPlate(
  29 + item.getIdenZbh(), item.getIdenCph()
  30 + );
  31 +
  32 + // 2、判断是否找到,没有重新创建,有更新update相关字段
  33 + if (vehicleData == null) {
  34 + vehicleData = new VehicleData();
  35 + // 标识用字段
  36 + vehicleData.setInsideCode(item.getIdenZbh()); // 自编号
  37 + vehicleData.setCarPlate(item.getIdenCph()); // 车牌号
  38 +
  39 + // TODO:后面添加其他的非空字段
  40 + vehicleData.setBusinessCode(item.getUpdateGsdm()); // 公司代码
  41 + vehicleData.setCompany(item.getUpdateGsmc()); // 公司名称
  42 + vehicleData.setCarCode(item.getIdenZbh()); // 车辆编码(初始使用自编号代替)
  43 + vehicleData.setSupplierName("1"); // 供应商名称(字典:1=巴士拓华)
  44 + vehicleData.setEquipmentCode(item.getIdenZbh()); // 设备编号(初始使用自编号代替)
  45 + vehicleData.setCreateDate(new Date()); // 创建时间
  46 +
  47 + } else {
  48 + // TODO:后面添加其他更新字段
  49 + vehicleData.setBusinessCode(item.getUpdateGsdm());
  50 + vehicleData.setCompany(item.getUpdateGsmc());
  51 + }
  52 +
  53 + // 3、更新车辆同步数据字段
  54 + item.setStatus(VehicleDataSyncStatusEnum.SUCCESS);
  55 + item.setUpdateDate(new Date());
  56 +
  57 + return vehicleData;
  58 + } else {
  59 + // 过滤状态不为 SYNCING 的记录
  60 + return null;
  61 + }
  62 + }
  63 +}
... ...
src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/facade/VehicleDataSyncFacadeConfig.java 0 → 100644
  1 +++ a/src/main/java/com/bsth/control_v3/plan_module/service/data_sync/vehicle/facade/VehicleDataSyncFacadeConfig.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.vehicle.facade;
  2 +
  3 +/**
  4 + * TODO:车辆数据同步facade相关配置。
  5 + */
  6 +public class VehicleDataSyncFacadeConfig {
  7 + // TODO:
  8 +}
... ...
src/main/resources/application-active_dev.properties 0 → 100644
  1 +++ a/src/main/resources/application-active_dev.properties
  1 +# jpa配置
  2 +spring.jpa.properties.hibernate.hbm2ddl.auto = update
  3 +
  4 +# db配置
  5 +
  6 +# ds配置
  7 +
... ...
src/main/resources/application-active_prod.properties 0 → 100644
  1 +++ a/src/main/resources/application-active_prod.properties
  1 +# jpa配置
  2 +
  3 +# db配置
  4 +
  5 +# ds配置
  6 +
... ...
src/main/resources/application-include_batch.properties 0 → 100644
  1 +++ a/src/main/resources/application-include_batch.properties
  1 +#----------------- spring batch profile 配置 ----------------#
  2 +# BatchAutoConfiguration中的配置,false,关闭自动启动所有job,手动启动,默认为true
  3 +spring.batch.job.enabled=false
  4 +# 创建batch相关schema
  5 +spring.batch.initialize-schema=always
0 6 \ No newline at end of file
... ...
src/main/resources/application-include_db.properties 0 → 100644
  1 +++ a/src/main/resources/application-include_db.properties
  1 +#----------------- database profile 配置 ----------------#
  2 +# 数据源配置
  3 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  4 +# serverTimezone参数解决数据库时区不一致的问题
  5 +spring.datasource.url=jdbc:mysql://127.0.0.1/spring_batch_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
  6 +spring.datasource.username=root
  7 +spring.datasource.password=
  8 +
  9 +
... ...
src/main/resources/application-include_ds.properties 0 → 100644
  1 +++ a/src/main/resources/application-include_ds.properties
  1 +#------------- datasource profile配置 -----------------#
  2 +# spring2.x默认使用HikariPool连接池
  3 +spring.datasource.hikari.maximum-pool-size=13
0 4 \ No newline at end of file
... ...
src/main/resources/application-include_jpa.properties 0 → 100644
  1 +++ a/src/main/resources/application-include_jpa.properties
  1 +#------------- jpa profile ---------------#
  2 +# core数据源jpa配置
  3 +# dialect
  4 +spring.jpa.database= MYSQL
  5 +# 是否显示sql,格式化sql
  6 +#spring.jpa.core.show-sql= false
  7 +spring.jpa.properties.hibernate.show_sql= false
  8 +spring.jpa.properties.hibernate.format_sql= false
  9 +# ddl schema是否更新
  10 +#spring.jpa.core.hibernate.ddl-auto= none (自定义多数据源,这种写法没作用,使用下面的属性)
  11 +spring.jpa.properties.hibernate.hbm2ddl.auto= none
  12 +# hibernate5的命名策略
  13 +spring.jpa.properties.hibernate.implicit_naming_strategy= org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
  14 +spring.jpa.properties.hibernate.physical_naming_strategy= org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
  15 +
  16 +
  17 +spring.jpa.database-platform=com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.MySQL5InnoDBDialectExt
  18 +
... ...
src/main/resources/application.properties 0 → 100644
  1 +++ a/src/main/resources/application.properties
  1 +#------------------ main profile 主配置 ----------------#
  2 +# 启动的profile
  3 +spring.profiles.active=active_dev
  4 +# 包含的profile
  5 +spring.profiles.include=include_jpa,include_db,include_ds,include_batch
  6 +
  7 +# application名字
  8 +spring.application.name=plan_module-service-data_sync
  9 +
... ...
src/main/resources/logback.xml 0 → 100644
  1 +++ a/src/main/resources/logback.xml
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!-- scan="true" 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
  3 +<!-- scanPeriod="30 seconds" 设置每30秒自动扫描,若没有指定具体单位则以milliseconds为标准(单位:milliseconds, seconds, minutes or hours) -->
  4 +<!-- debug="false"当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
  5 +<configuration scan="true" scanPeriod="30 seconds">
  6 + <!-- 控制台输出 -->
  7 + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  8 + <encoder>
  9 + <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
  10 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%file:%line] %-5level-%msg%n</pattern>
  11 + </encoder>
  12 + </appender>
  13 +
  14 + <!-- 日志输出级别 -->
  15 + <root level="INFO">
  16 + <appender-ref ref="STDOUT" />
  17 + </root>
  18 +
  19 + <logger name="com.bsth.control_mini.service.dvr.service.process.handler.impl"
  20 + level="DEBUG" additivity="false">
  21 + <appender-ref ref="STDOUT" />
  22 + </logger>
  23 +
  24 +</configuration>
0 25 \ No newline at end of file
... ...
src/test/java/com/bsth/control_v3/plan_module/service/data_sync/PlanModuleServiceDataSyncTestApplication.java 0 → 100644
  1 +++ a/src/test/java/com/bsth/control_v3/plan_module/service/data_sync/PlanModuleServiceDataSyncTestApplication.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync;
  2 +
  3 +import org.springframework.boot.CommandLineRunner;
  4 +import org.springframework.boot.SpringApplication;
  5 +import org.springframework.boot.autoconfigure.SpringBootApplication;
  6 +import org.springframework.context.annotation.ComponentScan;
  7 +import org.springframework.context.annotation.FilterType;
  8 +import org.springframework.transaction.annotation.EnableTransactionManagement;
  9 +
  10 +@EnableTransactionManagement
  11 +@SpringBootApplication
  12 +@ComponentScan(excludeFilters = {
  13 + @ComponentScan.Filter(
  14 + type = FilterType.ASSIGNABLE_TYPE,
  15 + value = {
  16 + PlanModuleServiceDataSyncApplication.class
  17 + }
  18 + )
  19 +})
  20 +public class PlanModuleServiceDataSyncTestApplication implements CommandLineRunner {
  21 + @Override
  22 + public void run(String... args) throws Exception {
  23 + // TODO:其他初始化代码
  24 +
  25 + }
  26 +
  27 + public static void main(String[] args) throws Exception {
  28 + SpringApplication.run(PlanModuleServiceDataSyncTestApplication.class, args);
  29 + }
  30 +}
... ...
src/test/java/com/bsth/control_v3/plan_module/service/data_sync/base/BaseTest.java 0 → 100644
  1 +++ a/src/test/java/com/bsth/control_v3/plan_module/service/data_sync/base/BaseTest.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.base;
  2 +
  3 +import ch.qos.logback.classic.LoggerContext;
  4 +import ch.qos.logback.classic.joran.JoranConfigurator;
  5 +import ch.qos.logback.core.util.StatusPrinter;
  6 +import org.dbunit.database.DatabaseConfig;
  7 +import org.dbunit.database.DatabaseConnection;
  8 +import org.dbunit.database.DatabaseSequenceFilter;
  9 +import org.dbunit.database.IDatabaseConnection;
  10 +import org.dbunit.dataset.FilteredDataSet;
  11 +import org.dbunit.dataset.IDataSet;
  12 +import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
  13 +import org.dbunit.ext.h2.H2DataTypeFactory;
  14 +import org.dbunit.operation.DatabaseOperation;
  15 +import org.junit.After;
  16 +import org.junit.Before;
  17 +import org.junit.BeforeClass;
  18 +import org.junit.Rule;
  19 +import org.junit.rules.TestName;
  20 +import org.slf4j.Logger;
  21 +import org.slf4j.LoggerFactory;
  22 +import org.springframework.core.io.ClassPathResource;
  23 +import org.springframework.core.io.Resource;
  24 +import org.springframework.util.StringUtils;
  25 +
  26 +import javax.sql.DataSource;
  27 +import java.io.File;
  28 +import java.util.Map;
  29 +
  30 +/**
  31 + * 基础测试类。
  32 + */
  33 +public abstract class BaseTest {
  34 + /** 日志记录器 */
  35 + public static final Logger LOG = LoggerFactory.getLogger(BaseTest.class);
  36 +
  37 + @Rule
  38 + public TestName name = new TestName();
  39 +
  40 + @BeforeClass
  41 + public static void initLogConfig() throws Exception {
  42 + File logFile = new File(BaseTest.class.getResource("/logback.xml").toURI());
  43 + LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
  44 + JoranConfigurator configurator = new JoranConfigurator();
  45 + configurator.setContext(lc);
  46 + lc.reset();
  47 + configurator.doConfigure(logFile);
  48 + StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
  49 + }
  50 +
  51 + /**
  52 + * 获取DBUnit数据源。
  53 + * @return
  54 + */
  55 + private IDataSet getDataSet() throws Exception {
  56 + Map<String, String> dbFileMap = getDbunitTestDbFileClassPathMap();
  57 + String dbunitClassPath = dbFileMap.get(name.getMethodName());
  58 + if (StringUtils.isEmpty(dbunitClassPath)) {
  59 + LOG.info("dbunit测试xml为空,key={}", name.getMethodName());
  60 + }
  61 + Resource res = new ClassPathResource(dbunitClassPath);
  62 + FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
  63 + builder.setColumnSensing(true);
  64 + return builder.build(res.getInputStream());
  65 + }
  66 +
  67 + /**
  68 + * 获取数据库连接。
  69 + * @return
  70 + */
  71 + private IDatabaseConnection getConnection() throws Exception {
  72 + DatabaseConnection conn = new DatabaseConnection(getDataSource().getConnection());
  73 + DatabaseConfig config = conn.getConfig();
  74 + config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new H2DataTypeFactory());
  75 + return conn;
  76 + }
  77 +
  78 + /**
  79 + * 初始化数据。
  80 + * @throws Exception
  81 + */
  82 + @Before
  83 + public void initDbunitDataSet() throws Exception {
  84 + LOG.info(name.getMethodName());
  85 + LOG.info("junit setup:dbunit-载入测试数据!===>");
  86 + IDatabaseConnection connection = getConnection();
  87 + DatabaseOperation.CLEAN_INSERT.execute(connection, getDataSet());
  88 + connection.close();
  89 + }
  90 +
  91 + /**
  92 + * 销毁测试数据。
  93 + * @throws Exception
  94 + */
  95 + @After
  96 + public void afterDbunitDataSet() throws Exception {
  97 + LOG.info("===>junit teardown:dbunit-销毁测试数据!");
  98 + IDatabaseConnection connection = getConnection();
  99 + // 使用FilteredDataSet重新定义数据库,否则删除的时候会发生外健依赖错误
  100 + // 因为默认删除是按照表名字母顺序删除的,如果外健关联的表先删除,则发生外健约束错误
  101 + IDataSet fullDataSet = new FilteredDataSet(new DatabaseSequenceFilter(connection), connection.createDataSet());
  102 + DatabaseOperation.DELETE_ALL.execute(getConnection(), fullDataSet);
  103 + connection.close();
  104 + }
  105 +
  106 + /**
  107 + * 获取Dbunit测试数据文件xml映射,key=测试方法名,value=dbunit测试文件classpath
  108 + * key:子类testCase方法名
  109 + * value:dbunit数据文件classpath(如:db/testdata/dbunit_testdata1.xml)
  110 + * @return
  111 + */
  112 + public abstract Map<String, String> getDbunitTestDbFileClassPathMap();
  113 +
  114 + /**
  115 + * 获取数据源。
  116 + * @return
  117 + */
  118 + public abstract DataSource getDataSource();
  119 +}
... ...
src/test/java/com/bsth/control_v3/plan_module/service/data_sync/batch/TestJob.java 0 → 100644
  1 +++ a/src/test/java/com/bsth/control_v3/plan_module/service/data_sync/batch/TestJob.java
  1 +package com.bsth.control_v3.plan_module.service.data_sync.batch;
  2 +
  3 +import com.bsth.control_v3.plan_module.service.data_sync.PlanModuleServiceDataSyncTestApplication;
  4 +import com.bsth.control_v3.plan_module.service.data_sync.base.BaseTest;
  5 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleData;
  6 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSync;
  7 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStat;
  8 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.domain.VehicleDataSyncStatusEnum;
  9 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataRepo;
  10 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncRepo;
  11 +import com.bsth.control_v3.plan_module.service.data_sync.vehicle.batch.repo.VehicleDataSyncStatRepo;
  12 +import org.junit.Assert;
  13 +import org.junit.Test;
  14 +import org.junit.runner.RunWith;
  15 +import org.springframework.batch.core.Job;
  16 +import org.springframework.batch.core.JobParameters;
  17 +import org.springframework.batch.core.launch.JobLauncher;
  18 +import org.springframework.batch.test.context.SpringBatchTest;
  19 +import org.springframework.beans.factory.annotation.Autowired;
  20 +import org.springframework.beans.factory.annotation.Qualifier;
  21 +import org.springframework.boot.test.context.SpringBootTest;
  22 +import org.springframework.test.context.junit4.SpringRunner;
  23 +
  24 +import javax.sql.DataSource;
  25 +import java.util.HashMap;
  26 +import java.util.Map;
  27 +
  28 +@RunWith(SpringRunner.class)
  29 +@SpringBatchTest
  30 +@SpringBootTest(classes = {PlanModuleServiceDataSyncTestApplication.class})
  31 +public class TestJob extends BaseTest {
  32 + @Autowired
  33 + private DataSource dataSource;
  34 +
  35 + @Override
  36 + public DataSource getDataSource() {
  37 + return dataSource;
  38 + }
  39 +
  40 + @Override
  41 + public Map<String, String> getDbunitTestDbFileClassPathMap() {
  42 + Map<String, String> dbFileMap = new HashMap<>();
  43 + dbFileMap.put("case1", "testdata/dbunit_vehicle_case1.xml");
  44 + return dbFileMap;
  45 + }
  46 +
  47 +
  48 + /**
  49 + * JobLauncherTestUtils在当前spring context下如果有多个Job,会报错因为内部是@Autowired注入
  50 + * 所以,如果要正常使用JobLauncherTestUtils,请在上下文中只有一个Job配置,这需要@SpringBootTest配合
  51 + * 因为这里是每个Test都是系统全部启动注入的,上下文会存在多个Job配置,以后考虑部分注入配合@SpringBootTest
  52 + */
  53 +// @Autowired
  54 +// private JobLauncherTestUtils jobLauncherTestUtils;
  55 +
  56 + @Autowired
  57 + private JobLauncher jobLauncher;
  58 + @Autowired
  59 + @Qualifier("vehicleDataSyncJob")
  60 + private Job vehicleDataSyncJob;
  61 +
  62 + @Autowired
  63 + private VehicleDataRepo vehicleDataRepo;
  64 + @Autowired
  65 + private VehicleDataSyncRepo vehicleDataSyncDomainRepo;
  66 + @Autowired
  67 + private VehicleDataSyncStatRepo vehicleDataSyncStatRepo;
  68 +
  69 + @Test
  70 + public void case1() throws Exception {
  71 + LOG.info("TestJob case1测试");
  72 +
  73 + // 验证车辆数据
  74 + VehicleData vehicleData = this.vehicleDataRepo.findById(1).get();
  75 + Assert.assertNotNull("车辆数据id=1为空!", vehicleData);
  76 +
  77 + // 验证车辆同步数据
  78 + VehicleDataSync vehicleDataSyncDomain = this.vehicleDataSyncDomainRepo.findById(1L).get();
  79 + Assert.assertNotNull("车辆同步数据id=1为空!", vehicleDataSyncDomain);
  80 + Assert.assertArrayEquals(
  81 + "车辆同步数据id=1字段值不一致!",
  82 + new Object[] {VehicleDataSyncStatusEnum.PREPARE},
  83 + new Object[] {vehicleDataSyncDomain.getStatus()});
  84 +
  85 + // 启动job
  86 + this.jobLauncher.run(vehicleDataSyncJob, new JobParameters());
  87 +
  88 + // 验证同步后,车辆数据
  89 + vehicleData = this.vehicleDataRepo.findById(1).get();
  90 + Assert.assertNotNull("车辆数据id=1为空!", vehicleData);
  91 + Assert.assertArrayEquals(
  92 + "同步后,车辆id=1数据字段值不一致",
  93 + new Object[] {"05", "杨高公司"},
  94 + new Object[] {vehicleData.getBusinessCode(), vehicleData.getCompany()});
  95 +
  96 + // 验证同步后,车辆同步数据
  97 + vehicleDataSyncDomain = this.vehicleDataSyncDomainRepo.findById(1L).get();
  98 + Assert.assertNotNull("车辆同步数据id=1为空!", vehicleDataSyncDomain);
  99 + Assert.assertArrayEquals(
  100 + "同步后,车辆同步数据id=1字段值不一致!",
  101 + new Object[] {VehicleDataSyncStatusEnum.SUCCESS},
  102 + new Object[] {vehicleDataSyncDomain.getStatus()});
  103 +
  104 + // 验证同步后,车辆同步数据stat
  105 + VehicleDataSyncStat vehicleDataSyncStat = this.vehicleDataSyncStatRepo.findById(1L).get();
  106 + Assert.assertNotNull("车辆同步数据stat id=1为空!", vehicleDataSyncStat);
  107 + Assert.assertArrayEquals(
  108 + "同步后,车辆同步数据stat id=1字段值不一致!",
  109 + new Object[] {
  110 + "1",
  111 + "SSS-01",
  112 + 1,
  113 + 1,
  114 + true,
  115 + true,
  116 + VehicleDataSyncStatusEnum.SUCCESS,
  117 + true
  118 + },
  119 + new Object[] {
  120 + vehicleDataSyncStat.getSyncDataPrepareIds(),
  121 + vehicleDataSyncStat.getSyncDataPrepareZbhs(),
  122 + vehicleDataSyncStat.getSyncDataPrepareCount(),
  123 + vehicleDataSyncStat.getSyncDataSuccessCount(),
  124 + vehicleDataSyncStat.getExitStepExecutionId() == null,
  125 + vehicleDataSyncStat.getExitStackTrace() == null,
  126 + vehicleDataSyncStat.getStatus(),
  127 + vehicleDataSyncStat.getEndDate() != null
  128 + });
  129 +
  130 + }
  131 +
  132 +
  133 +}
... ...
src/test/resources/application-test.properties 0 → 100644
  1 +++ a/src/test/resources/application-test.properties
  1 +# jpa配置
  2 +spring.jpa.database= H2
  3 +spring.jpa.properties.hibernate.show_sql= true
  4 +spring.jpa.properties.hibernate.hbm2ddl.auto = update
  5 +spring.jpa.properties.hibernate.format_sql= true
  6 +
  7 +# db配置
  8 +spring.datasource.driver-class-name=org.h2.Driver
  9 +# h2 v1.4.200 不支持 mvcc了去除
  10 +# spring.datasource.url=jdbc:h2:mem:core;DB_CLOSE_DELAY=1000;MVCC=TRUE;LOCK_TIMEOUT=10000
  11 +spring.datasource.url=jdbc:h2:mem:core;DB_CLOSE_DELAY=1000;LOCK_TIMEOUT=10000
  12 +spring.datasource.username=sa
  13 +spring.datasource.password=
  14 +
  15 +# ds配置
... ...
src/test/resources/application.properties 0 → 100644
  1 +++ a/src/test/resources/application.properties
  1 +#------------------ main profile 主配置 ----------------#
  2 +# 启动的profile
  3 +spring.profiles.active=test
  4 +# 包含的profile
  5 +spring.profiles.include=include_jpa,include_db,include_ds,include_batch
  6 +
  7 +# application名字
  8 +spring.application.name=dvr
  9 +
... ...
src/test/resources/logback.xml 0 → 100644
  1 +++ a/src/test/resources/logback.xml
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!-- scan="true" 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
  3 +<!-- scanPeriod="30 seconds" 设置每30秒自动扫描,若没有指定具体单位则以milliseconds为标准(单位:milliseconds, seconds, minutes or hours) -->
  4 +<!-- debug="false"当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
  5 +<configuration scan="true" scanPeriod="30 seconds">
  6 + <!-- 控制台输出 -->
  7 + <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  8 + <encoder>
  9 + <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
  10 + <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%file:%line] %-5level-%msg%n</pattern>
  11 + </encoder>
  12 + </appender>
  13 +
  14 + <!-- 日志输出级别 -->
  15 + <root level="INFO">
  16 + <appender-ref ref="STDOUT" />
  17 + </root>
  18 +
  19 + <logger name="com.bsth.control_mini.service.dvr.service.process.handler.impl"
  20 + level="DEBUG" additivity="false">
  21 + <appender-ref ref="STDOUT" />
  22 + </logger>
  23 +
  24 +</configuration>
0 25 \ No newline at end of file
... ...
src/test/resources/testdata/dbunit_vehicle_case1.xml 0 → 100644
  1 +++ a/src/test/resources/testdata/dbunit_vehicle_case1.xml
  1 +<?xml version='1.0' encoding='UTF-8'?>
  2 +<dataset>
  3 + <!-- 车辆基础信息 -->
  4 + <bsth_c_cars id="1" inside_code="SSS-01"
  5 + business_code="22" company="金高公司" branche_company_code="01" branche_company="一分公司"
  6 + car_code="11111" car_plate="沪88888" supplier_name="bsth" equipment_code="123456"
  7 + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0"
  8 + create_date="2020-02-01"
  9 + />
  10 +
  11 + <!-- 车辆同步数据 -->
  12 + <bsth_c_cars_sync id="1" iden_zbh="SSS-01" iden_cph="沪88888"
  13 + update_gsdm="05" update_gsmc="杨高公司"
  14 + create_date="2020-03-01" update_date="2020-03-01" status="准备"
  15 + />
  16 +
  17 +
  18 +</dataset>
0 19 \ No newline at end of file
... ...
src/test/resources/testdata/dbunit_vehicle_data.xml 0 → 100644
  1 +++ a/src/test/resources/testdata/dbunit_vehicle_data.xml
  1 +<?xml version='1.0' encoding='UTF-8'?>
  2 +<dataset>
  3 + <!-- 车辆基础信息 -->
  4 + <bsth_c_cars id="1" inside_code="SSS-01"
  5 + business_code="22" company="金高公司" branche_company_code="01" branche_company="一分公司"
  6 + car_code="11111" car_plate="沪88888" supplier_name="bsth" equipment_code="123456"
  7 + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" />
  8 + <bsth_c_cars id="2" inside_code="SSS-02"
  9 + business_code="22" company="金高公司" branche_company_code="01" branche_company="一分公司"
  10 + car_code="11111" car_plate="沪88888" supplier_name="bsth" equipment_code="123456"
  11 + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" />
  12 + <bsth_c_cars id="3" inside_code="SSS-03"
  13 + business_code="55" company="南汇公司" branche_company_code="01" branche_company="一分公司"
  14 + car_code="11111" car_plate="沪88888" supplier_name="bsth" equipment_code="123456"
  15 + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" />
  16 + <bsth_c_cars id="4" inside_code="SSS-04"
  17 + business_code="22" company="金高公司" branche_company_code="02" branche_company="二分公司"
  18 + car_code="11111" car_plate="沪88888" supplier_name="bsth" equipment_code="123456"
  19 + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" />
  20 +
  21 +
  22 +
  23 +
  24 +
  25 +</dataset>
0 26 \ No newline at end of file
... ...