Ver código fonte

首次提交

ZhuJiaHao 7 meses atrás
pai
commit
478593baa7
30 arquivos alterados com 996 adições e 491 exclusões
  1. 0 32
      exchange/.gitignore
  2. 0 9
      exchange/application.properties_backup
  3. 0 87
      exchange/pom.xml
  4. 0 48
      exchange/src/main/java/com/jyxt/thridparty/exchange/ExchangeApplication.java
  5. 0 38
      exchange/src/main/java/com/jyxt/thridparty/exchange/ExchangeConfiguration.java
  6. 0 29
      exchange/src/main/java/com/jyxt/thridparty/exchange/ScheduledTasks.java
  7. 0 129
      exchange/src/main/java/com/jyxt/thridparty/exchange/bx/VendorBinxiang.java
  8. 0 46
      exchange/src/main/java/com/jyxt/thridparty/exchange/bx/repository/BinxiangRepository.java
  9. 0 50
      exchange/src/main/java/com/jyxt/thridparty/exchange/bx/repository/VendorBinxiangRepository.java
  10. 0 9
      exchange/src/main/resources/application.properties
  11. 0 13
      exchange/src/test/java/com/jyxt/thridparty/exchange/ExchangeApplicationTests.java
  12. 113 0
      reagent-consumable/pom.xml
  13. 3 1
      reagent-consumable/readme.md
  14. 13 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/ReagentConsumableApplication.java
  15. 69 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/config/MysqlDataSourceConfig.java
  16. 70 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/config/PostgresqlDataSourceConfig.java
  17. 22 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/controller/ReagentConsumableController.java
  18. 20 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/dao/mysql/ReagentDao.java
  19. 21 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/dao/pg/PgReagentDao.java
  20. 103 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/entity/ReagentConsumableData.java
  21. 46 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/entity/ReagentConsumableRawData.java
  22. 46 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/enums/TransactionTypeEnum.java
  23. 26 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/scheduled/ReagentConsumableScheduledTask.java
  24. 126 0
      reagent-consumable/src/main/java/com/jyxt/thridparty/service/ReagentConsumableService.java
  25. 44 0
      reagent-consumable/src/main/resources/application.yml
  26. 28 0
      reagent-consumable/src/main/resources/log4j2.xml
  27. 136 0
      reagent-consumable/src/main/resources/mapper/mysql/ReagentMapper.xml
  28. 54 0
      reagent-consumable/src/main/resources/mapper/pg/PgReagentMapper.xml
  29. 27 0
      reagent-consumable/start.sh
  30. 29 0
      reagent-consumable/stop.sh

+ 0 - 32
exchange/.gitignore

@@ -1,32 +0,0 @@
-target/
-!.mvn/wrapper/maven-wrapper.jar
-!**/src/main/**/target/
-!**/src/test/**/target/
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-.sts4-cache
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-/nbproject/private/
-/nbbuild/
-/dist/
-/nbdist/
-/.nb-gradle/
-build/
-!**/src/main/**/build/
-!**/src/test/**/build/
-
-### VS Code ###
-.vscode/

+ 0 - 9
exchange/application.properties_backup

@@ -1,9 +0,0 @@
-spring.datasource.jdbc-url = jdbc:oracle:thin:@10.1.5.3:1521/his1db
-spring.datasource.username = SUPPLIER_JYXT
-spring.datasource.password = Jyxt#20240320
-spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
-spring.second-datasource.jdbc-url = jdbc:mysql://10.1.6.245:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
-spring.second-datasource.username = root
-spring.second-datasource.password = Zdqy123456
-spring.second-datasource.driver-class-name = com.mysql.cj.jdbc.Driver
-fetch.sql=select * from jyk1.v_get_ref_temperature  where TO_CHAR(\u91c7\u96c6\u65f6\u95f4,'YYYY-MM-DD')=TO_CHAR(SYSDATE,'YYYY-MM-DD')

+ 0 - 87
exchange/pom.xml

@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>com.jyxt.thridparty</groupId>
-    <artifactId>exchange</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>exchange</name>
-    <packaging>jar</packaging>
-    <description>exchange project for thrid party</description>
-    <properties>
-        <java.version>1.8</java.version>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <spring-boot.version>2.7.6</spring-boot.version>
-    </properties>
-    <dependencies>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-jdbc</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.mysql</groupId>
-            <artifactId>mysql-connector-j</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.oracle.database.jdbc</groupId>
-            <artifactId>ojdbc8</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>com.oracle.ojdbc</groupId>
-            <artifactId>orai18n</artifactId>
-            <version>19.3.0.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-dependencies</artifactId>
-                <version>${spring-boot.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.1</version>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                    <encoding>UTF-8</encoding>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring-boot.version}</version>
-                <configuration>
-                    <mainClass>com.jyxt.thridparty.exchange.ExchangeApplication</mainClass>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>repackage</id>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>

+ 0 - 48
exchange/src/main/java/com/jyxt/thridparty/exchange/ExchangeApplication.java

@@ -1,48 +0,0 @@
-package com.jyxt.thridparty.exchange;
-
-import com.jyxt.thridparty.exchange.bx.VendorBinxiang;
-import com.jyxt.thridparty.exchange.bx.repository.BinxiangRepository;
-import com.jyxt.thridparty.exchange.bx.repository.VendorBinxiangRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableScheduling;
-
-import java.util.List;
-
-@SpringBootApplication
-//@EnableScheduling
-public class ExchangeApplication implements CommandLineRunner {
-
-    private static final Logger log = LoggerFactory.getLogger(ExchangeApplication.class);
-
-    @Autowired
-    private VendorBinxiangRepository vendorBinxiangRepository;
-
-    @Autowired
-    private BinxiangRepository binxiangRepository;
-
-    public static void main(String[] args) {
-        SpringApplication.run(ExchangeApplication.class, args);
-
-    }
-
-    @Override
-    public void run(String... args) throws Exception {
-        List<VendorBinxiang> bxs = vendorBinxiangRepository.query();
-        if(bxs != null){
-            for (VendorBinxiang bx : bxs) {
-                try {
-                    binxiangRepository.save(bx);
-                    log.info(String.format("save a new id with: %s",bx.getId()));
-                }catch (Exception ex){
-                    log.error(ex.getMessage());
-                }
-            }
-        }
-
-    }
-}

+ 0 - 38
exchange/src/main/java/com/jyxt/thridparty/exchange/ExchangeConfiguration.java

@@ -1,38 +0,0 @@
-package com.jyxt.thridparty.exchange;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.jdbc.DataSourceBuilder;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.jdbc.core.JdbcTemplate;
-
-import javax.sql.DataSource;
-
-@Configuration
-public class ExchangeConfiguration {
-    @Bean
-    @Primary
-    @ConfigurationProperties(prefix = "spring.datasource")
-    public DataSource primaryDataSource() {
-        return DataSourceBuilder.create().build();
-    }
-
-    @Bean(name = "secondDatasource")
-    @ConfigurationProperties(prefix = "spring.second-datasource")
-    public DataSource secondDataSource() {
-        return DataSourceBuilder.create().build();
-    }
-
-    @Bean
-    @Primary
-    public JdbcTemplate primaryJdbcTemplate(DataSource dataSource) {
-        return new JdbcTemplate(dataSource);
-    }
-
-    @Bean(name = "secondJdbcTemplate")
-    public JdbcTemplate secondJdbcTemplate(@Qualifier("secondDatasource") DataSource dataSource) {
-        return new JdbcTemplate(dataSource);
-    }
-}

+ 0 - 29
exchange/src/main/java/com/jyxt/thridparty/exchange/ScheduledTasks.java

@@ -1,29 +0,0 @@
-package com.jyxt.thridparty.exchange;
-
-import com.jyxt.thridparty.exchange.bx.VendorBinxiang;
-import com.jyxt.thridparty.exchange.bx.repository.VendorBinxiangRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-
-//@Component
-public class ScheduledTasks {
-    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
-
-    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
-    @Autowired
-    private VendorBinxiangRepository vendorBinxiangRepository;
-
-//    @Scheduled(fixedRate = 5000)
-    public void exportBinxingData() {
-        log.info("The time is now {}", dateFormat.format(new Date()));
-        List<VendorBinxiang> binxiang = vendorBinxiangRepository.query();
-        log.info(binxiang.get(0).getWendu());
-    }
-}

+ 0 - 129
exchange/src/main/java/com/jyxt/thridparty/exchange/bx/VendorBinxiang.java

@@ -1,129 +0,0 @@
-package com.jyxt.thridparty.exchange.bx;
-
-public class VendorBinxiang {
-    private String id;
-    private String wendu;
-    //采集时间
-    private String caiJiTime;
-    //冰箱ID
-    private String binXiangId;
-    //冰箱名称
-    private String binxiangName;
-    //采集器ID
-    private String caiJiId;
-    //采集器名称
-    private String caiJiName;
-    //温度上限
-    private String wenduUp;
-    //温度下限
-    private String wenduDown;
-    //实验组
-    private String shiyanzhuName;
-    //实验组ID
-    private String shiyanzhuId;
-
-    public String getWendu() {
-        return wendu;
-    }
-
-    public void setWendu(String wendu) {
-        this.wendu = wendu;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    public void setId(String id) {
-        this.id = id;
-    }
-
-    public String getCaiJiTime() {
-        return caiJiTime;
-    }
-
-    public void setCaiJiTime(String caiJiTime) {
-        this.caiJiTime = caiJiTime;
-    }
-
-    public String getBinXiangId() {
-        return binXiangId;
-    }
-
-    public void setBinXiangId(String binXiangId) {
-        this.binXiangId = binXiangId;
-    }
-
-    public String getBinxiangName() {
-        return binxiangName;
-    }
-
-    public void setBinxiangName(String binxiangName) {
-        this.binxiangName = binxiangName;
-    }
-
-    public String getCaiJiId() {
-        return caiJiId;
-    }
-
-    public void setCaiJiId(String caiJiId) {
-        this.caiJiId = caiJiId;
-    }
-
-    public String getCaiJiName() {
-        return caiJiName;
-    }
-
-    public void setCaiJiName(String caiJiName) {
-        this.caiJiName = caiJiName;
-    }
-
-    public String getWenduUp() {
-        return wenduUp;
-    }
-
-    public void setWenduUp(String wenduUp) {
-        this.wenduUp = wenduUp;
-    }
-
-    public String getWenduDown() {
-        return wenduDown;
-    }
-
-    public void setWenduDown(String wenduDown) {
-        this.wenduDown = wenduDown;
-    }
-
-    public String getShiyanzhuName() {
-        return shiyanzhuName;
-    }
-
-    public void setShiyanzhuName(String shiyanzhuName) {
-        this.shiyanzhuName = shiyanzhuName;
-    }
-
-    public String getShiyanzhuId() {
-        return shiyanzhuId;
-    }
-
-    public void setShiyanzhuId(String shiyanzhuId) {
-        this.shiyanzhuId = shiyanzhuId;
-    }
-
-    @Override
-    public String toString() {
-        return "VendorBinxiang{" +
-                "id='" + id + '\'' +
-                ", wendu='" + wendu + '\'' +
-                ", caiJiTime='" + caiJiTime + '\'' +
-                ", binXiangId='" + binXiangId + '\'' +
-                ", binxiangName='" + binxiangName + '\'' +
-                ", caiJiId='" + caiJiId + '\'' +
-                ", caiJiName='" + caiJiName + '\'' +
-                ", wenduUp='" + wenduUp + '\'' +
-                ", wenduDown='" + wenduDown + '\'' +
-                ", shiyanzhuName='" + shiyanzhuName + '\'' +
-                ", shiyanzhuId='" + shiyanzhuId + '\'' +
-                '}';
-    }
-}

+ 0 - 46
exchange/src/main/java/com/jyxt/thridparty/exchange/bx/repository/BinxiangRepository.java

@@ -1,46 +0,0 @@
-package com.jyxt.thridparty.exchange.bx.repository;
-
-import com.jyxt.thridparty.exchange.bx.VendorBinxiang;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.PreparedStatementCreator;
-import org.springframework.stereotype.Repository;
-
-import java.sql.*;
-import java.time.Instant;
-import java.util.Calendar;
-
-@Repository
-public class BinxiangRepository {
-
-    @Autowired
-    @Qualifier("secondJdbcTemplate")
-    private JdbcTemplate jdbcTemplate;
-
-    public void save(final VendorBinxiang bx){
-        //sql语句
-        final String sql = "insert into t_dsfbxwdjl (id_,create_time_,cai_ji_shi_jian_,wen_du_,bing_xiang_id_,bing_xiang_ming_c,cai_ji_qi_id_," +
-                "cai_ji_qi_ming_ch,wen_du_shang_xian,wen_du_xia_xian_,shi_yan_zu_,shi_yan_zu_id_)" +
-                " values (?,?,?,?,?,?,?,?,?,?,?,?) ";
-        jdbcTemplate.update(new PreparedStatementCreator() {
-            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
-                PreparedStatement prepareStatement = connection.prepareStatement(sql);
-                prepareStatement.setString(1,bx.getId());
-                prepareStatement.setTimestamp(2, Timestamp.from(Instant.now()));
-                prepareStatement.setString(3,bx.getCaiJiTime());
-                prepareStatement.setString(4,bx.getWendu());
-                prepareStatement.setString(5,bx.getBinXiangId());
-                prepareStatement.setString(6,bx.getBinxiangName());
-                prepareStatement.setString(7,bx.getCaiJiId());
-                prepareStatement.setString(8,bx.getCaiJiName());
-                prepareStatement.setString(9,bx.getWenduUp());
-                prepareStatement.setString(10,bx.getWenduDown());
-                prepareStatement.setString(11,bx.getShiyanzhuName());
-                prepareStatement.setString(12,bx.getShiyanzhuId());
-                return prepareStatement;
-            }
-        });
-    }
-
-}

+ 0 - 50
exchange/src/main/java/com/jyxt/thridparty/exchange/bx/repository/VendorBinxiangRepository.java

@@ -1,50 +0,0 @@
-package com.jyxt.thridparty.exchange.bx.repository;
-
-import com.jyxt.thridparty.exchange.ExchangeApplication;
-import com.jyxt.thridparty.exchange.bx.VendorBinxiang;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.stereotype.Repository;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-@Repository
-public class VendorBinxiangRepository {
-    private static final Logger log = LoggerFactory.getLogger(VendorBinxiangRepository.class);
-    @Autowired
-    private JdbcTemplate jdbcTemplate;
-
-    @Value("${fetch.sql}")
-    private String sql;
-
-    public List<VendorBinxiang> query() {
-        log.info(sql);
-        return jdbcTemplate.query(
-                sql,new RowMapper<VendorBinxiang>(){
-
-                    @Override
-                    public VendorBinxiang mapRow(ResultSet rs, int rowNum) throws SQLException {
-                        VendorBinxiang bx = new VendorBinxiang();
-                        bx.setId(rs.getString("id"));
-                        bx.setWendu(rs.getString("温度"));
-                        bx.setBinXiangId(rs.getString("冰箱ID"));
-                        bx.setBinxiangName(rs.getString("冰箱名称"));
-                        bx.setCaiJiId(rs.getString("采集器ID"));
-                        bx.setCaiJiName(rs.getString("采集器名称"));
-                        bx.setCaiJiTime(rs.getString("采集时间"));
-                        bx.setWenduUp(rs.getString("温度上限"));
-                        bx.setWenduDown(rs.getString("温度下限"));
-                        bx.setShiyanzhuName(rs.getString("实验组"));
-                        bx.setShiyanzhuId(rs.getString("实验组ID"));
-                        return bx;
-                    }
-                }
-        );
-    }
-
-}

+ 0 - 9
exchange/src/main/resources/application.properties

@@ -1,9 +0,0 @@
-spring.datasource.jdbc-url = jdbc:mysql://dev1.local:3306/zdqy_view?characterEncoding=utf8&useSSL=false
-spring.datasource.username = root
-spring.datasource.password = test001
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.second-datasource.jdbc-url = jdbc:mysql://dev1.local:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
-spring.second-datasource.username = root
-spring.second-datasource.password = test001
-spring.second-datasource.driver-class-name = com.mysql.cj.jdbc.Driver
-fetch.sql=select * from v_get_ref_temperature  where date(\u91c7\u96c6\u65f6\u95f4)=curdate()

+ 0 - 13
exchange/src/test/java/com/jyxt/thridparty/exchange/ExchangeApplicationTests.java

@@ -1,13 +0,0 @@
-package com.jyxt.thridparty.exchange;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class ExchangeApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}

+ 113 - 0
reagent-consumable/pom.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.jyxt.thridparty</groupId>
+    <artifactId>reagent-consumable</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version>
+        <relativePath/>
+    </parent>
+
+    <properties>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <!-- Spring Boot Web -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- Log4j2 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+
+        <!-- Spring Boot AOP -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <!-- Jackson (spring-boot-starter-web里面应该已经有了,这里再显式声明一下) -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <!-- MyBatis Plus Starter (注意这是适用于Spring Boot 2.x的版本) -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.5.3.1</version>
+        </dependency>
+
+        <!-- MySQL Driver -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.33</version>
+        </dependency>
+
+        <!-- PostgreSQL Driver -->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.7.3</version>
+        </dependency>
+
+        <!-- lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope> <!-- 阻止依赖被打入最终的部署包 -->
+            <optional>true</optional> <!-- 阻止依赖被传递到其他模块 -->
+        </dependency>
+
+        <!-- Spring Boot Test -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- 这里打包成FatJar (ibps是打包成ThinJar的) -->
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.jyxt.thridparty.ReagentConsumableApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal> <!-- 用于打包fatjar -->
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 3 - 1
exchange/readme.md → reagent-consumable/readme.md

@@ -1,4 +1,6 @@
-# 安装指南
+## 说明
+
+### 用于恒生医院试剂耗材输入库数据接入
 
 把根目录下的`application.properties_backup` 改名为 `application.properties`后 放到jar同级目录下。
 

+ 13 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/ReagentConsumableApplication.java

@@ -0,0 +1,13 @@
+package com.jyxt.thridparty;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+public class ReagentConsumableApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ReagentConsumableApplication.class, args);
+    }
+}

+ 69 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/config/MysqlDataSourceConfig.java

@@ -0,0 +1,69 @@
+package com.jyxt.thridparty.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+import javax.sql.DataSource;
+
+@Configuration
+@MapperScan(
+        // 扫描mysql的Mapper接口
+        basePackages = "com.jyxt.thridparty.dao.mysql",
+        // 使用mysql的SqlSessionFactory
+        sqlSessionFactoryRef = "mysqlSqlSessionFactory"
+)
+public class MysqlDataSourceConfig {
+
+    // MySQL 数据源
+    @Bean(name = "mysqlDataSource")
+    @ConfigurationProperties(prefix = "spring.datasource.mysql")
+    public DataSource mysqlDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    // MySQL 事务管理器
+    @Bean(name = "mysqlTransactionManager")
+    public DataSourceTransactionManager mysqlTransactionManager(
+            @Qualifier("mysqlDataSource") DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+    // MySQL 分页插件
+    @Bean(name = "mysqlMybatisPlusInterceptor")
+    public MybatisPlusInterceptor mysqlMybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 配置MySQL分页插件
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+
+    // MySQL SqlSessionFactory
+    @Bean(name = "mysqlSqlSessionFactory")
+    public SqlSessionFactory mysqlSqlSessionFactory(
+            @Qualifier("mysqlDataSource") DataSource dataSource,
+            @Qualifier("mysqlMybatisPlusInterceptor") MybatisPlusInterceptor interceptor) throws Exception {
+
+        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        sessionFactory.setMapperLocations(
+                new PathMatchingResourcePatternResolver()
+                        .getResources("classpath:mapper/mysql/*.xml") // 指定MySQL的Mapper XML文件位置
+        );
+
+        // 设置分页插件
+        sessionFactory.setPlugins(interceptor);
+
+        return sessionFactory.getObject();
+    }
+}

+ 70 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/config/PostgresqlDataSourceConfig.java

@@ -0,0 +1,70 @@
+package com.jyxt.thridparty.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.jdbc.DataSourceBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import javax.sql.DataSource;
+
+
+
+@Configuration
+@MapperScan(
+        // 扫描PostgreSQL的Mapper接口
+        basePackages = "com.jyxt.thridparty.dao.pg",
+        // 使用PostgreSQL的SqlSessionFactory
+        sqlSessionFactoryRef = "pgSqlSessionFactory"
+)
+public class PostgresqlDataSourceConfig {
+
+    // PostgreSQL 数据源
+    @Bean(name = "pgDataSource")
+    @ConfigurationProperties(prefix = "spring.datasource.pg")
+    public DataSource pgDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+    // PostgreSQL 事务管理器
+    @Bean(name = "pgTransactionManager")
+    public DataSourceTransactionManager pgTransactionManager(
+            @Qualifier("pgDataSource") DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+    // PostgreSQL 分页插件
+    @Bean(name = "pgMybatisPlusInterceptor")
+    public MybatisPlusInterceptor pgMybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        // 配置PostgreSQL分页插件
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
+        return interceptor;
+    }
+
+    // PostgreSQL SqlSessionFactory
+    @Bean(name = "pgSqlSessionFactory")
+    public SqlSessionFactory pgSqlSessionFactory(
+            @Qualifier("pgDataSource") DataSource dataSource,
+            @Qualifier("pgMybatisPlusInterceptor") MybatisPlusInterceptor interceptor) throws Exception {
+
+        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        sessionFactory.setMapperLocations(
+                new PathMatchingResourcePatternResolver()
+                        .getResources("classpath:mapper/pg/*.xml") // 指定PostgreSQL的Mapper XML文件位置
+        );
+
+        // 设置分页插件
+        sessionFactory.setPlugins(interceptor);
+
+        return sessionFactory.getObject();
+    }
+}

+ 22 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/controller/ReagentConsumableController.java

@@ -0,0 +1,22 @@
+package com.jyxt.thridparty.controller;
+
+import com.jyxt.thridparty.service.ReagentConsumableService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ReagentConsumableController {
+
+
+    @Autowired
+    ReagentConsumableService reagentConsumableService;
+
+    @RequestMapping(value = "/startTask", method = RequestMethod.GET)
+    public void startTask(@RequestParam(required = false) String startTime,
+                     @RequestParam(required = false) String endTime) {
+        reagentConsumableService.startTask(startTime, endTime);
+    }
+}

+ 20 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/dao/mysql/ReagentDao.java

@@ -0,0 +1,20 @@
+package com.jyxt.thridparty.dao.mysql;
+
+import com.jyxt.thridparty.entity.ReagentConsumableData;
+import com.jyxt.thridparty.entity.ReagentConsumableRawData;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface ReagentDao {
+    int insertBatch(List<ReagentConsumableRawData> dataList);
+    
+    List<ReagentConsumableData> selectFilteredData();
+    
+    int insertInboundBatch(List<ReagentConsumableData> inboundDataList);
+    
+    int insertOutboundBatch(List<ReagentConsumableData> outboundDataList);
+    
+    int updateStatusBySids(List<String> sids);
+}

+ 21 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/dao/pg/PgReagentDao.java

@@ -0,0 +1,21 @@
+package com.jyxt.thridparty.dao.pg;
+
+
+import com.jyxt.thridparty.entity.ReagentConsumableRawData;
+import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+
+@Mapper
+public interface PgReagentDao {
+
+    /**
+     * 查询所有记录
+     */
+    List<ReagentConsumableRawData> selectAll();
+
+    /**
+     * 根据创建时间范围查询
+     */
+    List<ReagentConsumableRawData> selectByCreateTime(String startTime, String endTime);
+
+}

+ 103 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/entity/ReagentConsumableData.java

@@ -0,0 +1,103 @@
+package com.jyxt.thridparty.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.sql.Timestamp;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ReagentConsumableData {
+    /** 主键 */
+    private String id;
+    /** 租户ID */
+    private String tenantId;
+    /** IP地址 */
+    private String ip;
+    /** 创建人 */
+    private String createBy;
+    /** 创建时间 */
+    private Timestamp createTime;
+    /** 更新人 */
+    private String updateBy;
+    /** 更新时间 */
+    private Timestamp updateTime;
+    /** 是否过审 */
+    private String shiFouGuoShen;
+    /** 地点 */
+    private String diDian;
+    /** 编制人 */
+    private String bianZhiRen;
+    /** 编制部门 */
+    private String bianZhiBuMen;
+    /** 编制时间 */
+    private String bianZhiShiJian;
+    /** 快照 */
+    private String kuaiZhao;
+    /** 试剂耗材名称 */
+    private String mingCheng;
+    /** 批次号 */
+    private String piCiHao;
+    /** 包装规格 */
+    private String baoZhuangGuiGe;
+    /** 最小规格 */
+    private String zuiXiaoGuiGe;
+    /** 单位 */
+    private String danWei;
+    /** 厂家 */
+    private String changJia;
+    /** 有效期 */
+    private String youXiaoQi;
+    /** 存储条件 */
+    private String cunChuTiaoJian;
+    /** 备注 */
+    private String beiZhu;
+    /** 类别 */
+    private String leiBie;
+    /** 开瓶效期 */
+    private String kaiPingXiaoQi;
+    /** 单价 */
+    private String danJia;
+    /** 编码 */
+    private String bianMa;
+    /** 产品批号 */
+    private String chanPinPiHao;
+    /** 附件 */
+    private String fuJian;
+    /** 供应商 */
+    private String gongYingShang;
+    /** 分类 */
+    private String fenLei;
+    /** 注册证号 */
+    private String zhuCeZhengHao;
+    /** 仪器设备 */
+    private String yiQiSheBei;
+    /** 设备名称 */
+    private String sheBeiMingChen;
+    /** 设备编号 */
+    private String sheBeiBianHao;
+    /** 货号 */
+    private String huoHao;
+    /** 存放位置 */
+    private String cunFangWeiZhi;
+    /** 最低库存量 */
+    private String zuiDiYuCun;
+    /** 库存量 */
+    private String kuCunLiang;
+    /** 批号 */
+    private String piHao;
+    /** 注册证有效期 */
+    private String zhuCeZhengYou;
+    /** 数量 */
+    private int shuLiang;
+    /** 有效期至 */
+    private String youXiaoQiZhi;
+    /** 到货日期 */
+    private String daoHuoRiQi;
+    /** 状态 */
+    private String zhuangTai;
+    /** 事务处理类型 */
+    private String transactionType;
+}

+ 46 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/entity/ReagentConsumableRawData.java

@@ -0,0 +1,46 @@
+package com.jyxt.thridparty.entity;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ReagentConsumableRawData {
+    private String id;
+    /** 流水号 */
+    private String sid;
+    /** 产品编码 */
+    private String productCode;
+    /** 产品名称 */
+    private String productName;
+    /** 处理数量 */
+    private Double processQuantity;
+    /** 处理时间 */
+    private String processTime;
+    /** 交易类型 */
+    private String transactionType;
+    /** 批号 */
+    private String batchNumber;
+    /** 有效期 */
+    private String expirationDate;
+    /** 创建时间 */
+    private String createTime;
+
+    @Override
+    public String toString() {
+        return "ReagentConsumableRawData{" +
+                "id='" + id + '\'' +
+                ", productCode='" + productCode + '\'' +
+                ", productName='" + productName + '\'' +
+                ", processQuantity=" + processQuantity +
+                ", processTime='" + processTime + '\'' +
+                ", transactionType='" + transactionType + '\'' +
+                ", batchNumber='" + batchNumber + '\'' +
+                ", expirationDate='" + expirationDate + '\'' +
+                ", createTime='" + createTime + '\'' +
+                '}';
+    }
+}

+ 46 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/enums/TransactionTypeEnum.java

@@ -0,0 +1,46 @@
+package com.jyxt.thridparty.enums;
+
+public enum TransactionTypeEnum {
+    // 入库数据
+    PURCHASE_IN("采购入库", "入库"),
+    PURCHASE_RETURN("采购退货", "入库"),
+    CONSIGNMENT_IN("寄售入库", "入库"),
+    CONSIGNMENT_RETURN("寄售退库", "入库"),
+    
+    // 出库数据
+    WAREHOUSE_OUT("库房出库", "出库"),
+    WAREHOUSE_RETURN("库房退库", "出库");
+    
+    private final String type;
+    private final String category;
+    
+    TransactionTypeEnum(String type, String category) {
+        this.type = type;
+        this.category = category;
+    }
+    
+    public String getType() {
+        return type;
+    }
+    
+    public String getCategory() {
+        return category;
+    }
+    
+    public static String getCategoryByType(String type) {
+        for (TransactionTypeEnum e : values()) {
+            if (e.getType().equals(type)) {
+                return e.getCategory();
+            }
+        }
+        return null;
+    }
+    
+    public static boolean isInbound(String type) {
+        return "入库".equals(getCategoryByType(type));
+    }
+    
+    public static boolean isOutbound(String type) {
+        return "出库".equals(getCategoryByType(type));
+    }
+}

+ 26 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/scheduled/ReagentConsumableScheduledTask.java

@@ -0,0 +1,26 @@
+package com.jyxt.thridparty.scheduled;
+
+import com.jyxt.thridparty.service.ReagentConsumableService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+@Component
+public class ReagentConsumableScheduledTask {
+
+    @Autowired
+    private ReagentConsumableService reagentConsumableService;
+
+    @Scheduled(cron = "${scheduled.reagent-consumable.cron}")
+    public void startTask() {
+        LocalDate today = LocalDate.now();
+        String startTime = today.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
+        String endTime = today.plusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
+        
+        reagentConsumableService.startTask(startTime, endTime);
+    }
+}

+ 126 - 0
reagent-consumable/src/main/java/com/jyxt/thridparty/service/ReagentConsumableService.java

@@ -0,0 +1,126 @@
+package com.jyxt.thridparty.service;
+
+import com.jyxt.thridparty.dao.mysql.ReagentDao;
+import com.jyxt.thridparty.dao.pg.PgReagentDao;
+import com.jyxt.thridparty.entity.ReagentConsumableData;
+import com.jyxt.thridparty.entity.ReagentConsumableRawData;
+import com.jyxt.thridparty.enums.TransactionTypeEnum;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+
+@Service
+public class ReagentConsumableService {
+
+    private static final Logger logger = LogManager.getLogger(ReagentConsumableService.class);
+
+    @Autowired
+    PgReagentDao pgReagentDao;
+    
+    @Autowired
+    ReagentDao reagentDao;
+
+    @Transactional("mysqlTransactionManager")
+    public void startTask(String startTime, String endTime) {
+        logger.info("开始处理试剂耗材数据...");
+
+        /**
+         * 客户的恒生的数据库(试剂耗材出入库记录的视图)
+         * 数据库:postgre
+         * 数据库IP:10.10.11.166;
+         * 端口号:5432;
+         * 数据库名:PROD;
+         * 用户名:hs_jt;
+         * 密码:hs_jt@hsyy;
+         * 视图名:hs_jt
+         */
+
+        /**------ 从客户提供的视图获取原始数据(PostgreSQL)------ */
+        List<ReagentConsumableRawData> dataList;
+        if (startTime != null || endTime != null) {
+            logger.info("查询日期条件,startTime:"+startTime+" endTime:"+endTime);
+            dataList = pgReagentDao.selectByCreateTime(startTime, endTime);
+        } else {
+            dataList = pgReagentDao.selectAll();
+        }
+        logger.info("从客户提供的视图获取到 {} 条数据", dataList.size());
+
+
+
+        /**------ 将原始数据转存到t_sjhccrklsysb表 ------*/
+        if (!dataList.isEmpty()) {
+            // 为每条数据生成ID和sid
+            for (ReagentConsumableRawData data : dataList) {
+                // 使用更安全的ID生成策略,包含更多唯一性因子
+                String id = data.getProductCode() + "_" + data.getTransactionType() + "_" + 
+                           data.getBatchNumber() + "_" + data.getCreateTime() + "_" + 
+                           data.getProcessQuantity();
+                data.setId(id);
+                data.setSid(UUID.randomUUID().toString());
+            }
+            
+            // 批量插入到MySQL
+            int insertCount = reagentDao.insertBatch(dataList);
+            logger.info("将原始数据转存到t_sjhccrklsysb表共 {} 条数据", insertCount);
+        } else {
+            logger.info("没有数据需要处理");
+        }
+        logger.info("原始数据转存完成");
+
+
+        
+        /**------ 查询出原始,做关联和填充 ------*/
+        //原始数据(t_sjhccrklsysb) 和 试剂耗材基础数据配置列表(t_sjhcjcsjpz) 做关联,“编码”对应才做关联
+        List<ReagentConsumableData> filteredDataList = reagentDao.selectFilteredData();
+        logger.info("筛选出 {} 条关联数据", filteredDataList.size());
+
+
+
+        /**------ 分类为入库和出库数据 ------*/
+        //入库数据:采购入库、采购退货、寄售入库、寄售退库
+        //出库数据:库房出库、库房退库
+        List<ReagentConsumableData> inboundDataList = new ArrayList<>();
+        List<ReagentConsumableData> outboundDataList = new ArrayList<>();
+        for (ReagentConsumableData data : filteredDataList) {
+            if (TransactionTypeEnum.isInbound(data.getTransactionType())) {
+                inboundDataList.add(data);
+            } else if (TransactionTypeEnum.isOutbound(data.getTransactionType())) {
+                outboundDataList.add(data);
+            }
+        }
+        logger.info("入库数据: {} 条", inboundDataList.size());
+        logger.info("出库数据: {} 条", outboundDataList.size());
+
+
+        /**------ 入库和出库数据插入库,插入成功后,把t_sjhccrklsysb的statu置为1,避免下次重复查询出来重复插入 ------*/
+        List<String> processedSids = new ArrayList<>();
+        //processedSids用于记录所有已处理数据的sid,最后统一更新状态
+        if (!inboundDataList.isEmpty()) {
+            //插入入库数据
+            int inboundCount = reagentDao.insertInboundBatch(inboundDataList);
+            logger.info("成功插入入库数据 {} 条", inboundCount);
+            processedSids.addAll(inboundDataList.stream().map(ReagentConsumableData::getId).collect(Collectors.toList()));
+        }
+        
+        if (!outboundDataList.isEmpty()) {
+            //插入出库数据
+            int outboundCount = reagentDao.insertOutboundBatch(outboundDataList);
+            logger.info("成功插入出库数据 {} 条", outboundCount);
+            processedSids.addAll(outboundDataList.stream().map(ReagentConsumableData::getId).collect(Collectors.toList()));
+        }
+        
+        // 更新已处理数据的status为1
+        if (!processedSids.isEmpty()) {
+            int updateCount = reagentDao.updateStatusBySids(processedSids);
+            logger.info("更新原始数据表状态 {} 条", updateCount);
+        }
+    }
+}

+ 44 - 0
reagent-consumable/src/main/resources/application.yml

@@ -0,0 +1,44 @@
+
+server:
+  port: 5666
+
+spring:
+  datasource:
+    # PostgreSQL 配置
+    pg:
+      jdbc-url: jdbc:postgresql://127.0.0.1:5432/prod
+      username: postgres
+      password: test001
+      driver-class-name: org.postgresql.Driver
+      hikari:
+        maximum-pool-size: 10
+        minimum-idle: 5
+        connection-timeout: 30000
+
+    # MySQL 配置
+    mysql:
+      jdbc-url: jdbc:mysql://192.168.2.220:3306/klims-ibps3?useUnicode=true&characterEncoding=utf8&useSSL=false
+      username: root
+      password: test1994
+      driver-class-name: com.mysql.cj.jdbc.Driver
+      hikari:
+        maximum-pool-size: 10
+        minimum-idle: 5
+        connection-timeout: 30000
+
+# MyBatis 配置
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.log4j2.Log4j2Impl
+
+# Log4j2 配置
+logging:
+  config: file:log4j2.xml
+  level:
+    com.jyxt.thridparty: info
+
+# 定时任务配置
+scheduled:
+  reagent-consumable:
+    cron: "0 0 * * * *"
+    #cron: "0 * * * * *"

+ 28 - 0
reagent-consumable/src/main/resources/log4j2.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="warn">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+        </Console>
+        
+        <RollingFile name="RollingFile" fileName="logs/reagent-consumable.log" filePattern="logs/reagent-consumable-%d{yyyy-MM-dd}.log">
+            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
+            <Policies>
+                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
+            </Policies>
+            <DefaultRolloverStrategy max="30"/>
+        </RollingFile>
+    </Appenders>
+    
+    <Loggers>
+        <Logger name="com.jyxt.thridparty" level="info" additivity="false">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Logger>
+        
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+            <AppenderRef ref="RollingFile"/>
+        </Root>
+    </Loggers>
+</Configuration>

+ 136 - 0
reagent-consumable/src/main/resources/mapper/mysql/ReagentMapper.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jyxt.thridparty.dao.mysql.ReagentDao">
+
+    <insert id="insertBatch" parameterType="java.util.List">
+        INSERT IGNORE INTO t_sjhccrklsysb (
+            id_, s_id, create_time_, update_time_, product_code, product_name,
+            process_quantity, process_time, transaction_type, batch_number,
+            expiration_date, status
+        ) VALUES
+        <foreach collection="list" item="item" separator=",">
+        (
+            #{item.id}, #{item.sid}, #{item.createTime}, NOW(), #{item.productCode}, #{item.productName},
+            #{item.processQuantity}, #{item.processTime}, #{item.transactionType}, #{item.batchNumber},
+            #{item.expirationDate}, 0
+        )
+        </foreach>
+    </insert>
+
+    <select id="selectFilteredData" resultType="com.jyxt.thridparty.entity.ReagentConsumableData">
+        SELECT 
+            t1.s_id as id,
+            t2.tenant_id_ as tenantId,
+            t2.ip_ as ip,
+            t2.create_by_ as createBy,
+            t2.create_time_ as createTime,
+            t2.update_by_ as updateBy,
+            t2.update_time_ as updateTime,
+            t2.shi_fou_guo_shen_ as shiFouGuoShen,
+            t2.di_dian_ as diDian,
+            t2.bian_zhi_ren_ as bianZhiRen,
+            t2.bian_zhi_bu_men_ as bianZhiBuMen,
+            t2.bian_zhi_shi_jian as bianZhiShiJian,
+            t2.kuai_zhao_ as kuaiZhao,
+            t2.ming_cheng_ as mingCheng,
+            t2.pi_ci_hao_ as piCiHao,
+            t2.bao_zhuang_gui_ge as baoZhuangGuiGe,
+            t2.zui_xiao_gui_ge_ as zuiXiaoGuiGe,
+            t2.dan_wei_ as danWei,
+            t2.chang_jia_ as changJia,
+            t2.you_xiao_qi_ as youXiaoQi,
+            t2.cun_chu_tiao_jian as cunChuTiaoJian,
+            t2.bei_zhu_ as beiZhu,
+            t2.lei_bie_ as leiBie,
+            t2.kai_ping_xiao_qi_ as kaiPingXiaoQi,
+            t2.dan_jia_ as danJia,
+            t2.bian_ma_ as bianMa,
+            t2.chan_pin_pi_hao_ as chanPinPiHao,
+            t2.fu_jian_ as fuJian,
+            t2.gong_ying_shang_ as gongYingShang,
+            t2.fen_lei_ as fenLei,
+            t2.zhu_ce_zheng_hao_ as zhuCeZhengHao,
+            t2.yi_qi_she_bei_ as yiQiSheBei,
+            t2.she_bei_ming_chen as sheBeiMingChen,
+            t2.she_bei_bian_hao_ as sheBeiBianHao,
+            t2.huo_hao_ as huoHao,
+            t2.cun_fang_wei_zhi_ as cunFangWeiZhi,
+            t2.zui_di_yu_cun_ as zuiDiYuCun,
+            t2.ku_cun_liang_ as kuCunLiang,
+            t1.batch_number as piHao,
+            t2.zhu_ce_zheng_you_ as zhuCeZhengYou,
+            t1.process_quantity as shuLiang,
+            t1.expiration_date as youXiaoQiZhi,
+            t1.process_time as daoHuoRiQi,
+            t1.status as zhuangTai,
+            t1.transaction_type as transactionType
+        FROM t_sjhccrklsysb t1
+        INNER JOIN t_sjhcjcsjpz t2 ON t1.product_code = t2.bian_ma_
+        WHERE t1.status = 0
+    </select>
+
+    <insert id="insertInboundBatch" parameterType="java.util.List">
+        INSERT IGNORE INTO t_sjhcrkls (
+            id_, tenant_id_, ip_, create_by_, create_time_, update_by_, update_time_,
+            shi_fou_guo_shen_, di_dian_, bian_zhi_ren_, bian_zhi_bu_men_, bian_zhi_shi_jian,
+            kuai_zhao_, ming_cheng_, pi_ci_hao_, bao_zhuang_gui_ge, zui_xiao_gui_ge_,
+            dan_wei_, chang_jia_, you_xiao_qi_, cun_chu_tiao_jian, bei_zhu_, lei_bie_,
+            kai_ping_xiao_qi_, dan_jia_, bian_ma_, chan_pin_pi_hao_, fu_jian_,
+            gong_ying_shang_, fen_lei_, zhu_ce_zheng_hao_, yi_qi_she_bei_, she_bei_ming_chen,
+            she_bei_bian_hao_, huo_hao_, cun_fang_wei_zhi_, zui_di_yu_cun_, ku_cun_liang_,
+            pi_hao_, zhu_ce_zheng_you_, shu_liang_, you_xiao_qi_zhi_, dao_huo_ri_qi_, zhuang_tai_
+        ) VALUES
+        <foreach collection="list" item="item" separator=",">
+        (
+            #{item.id}, #{item.tenantId}, #{item.ip}, #{item.createBy}, #{item.createTime},
+            #{item.updateBy}, #{item.updateTime}, #{item.shiFouGuoShen}, #{item.diDian},
+            #{item.bianZhiRen}, #{item.bianZhiBuMen}, #{item.bianZhiShiJian}, #{item.kuaiZhao},
+            #{item.mingCheng}, #{item.piCiHao}, #{item.baoZhuangGuiGe}, #{item.zuiXiaoGuiGe},
+            #{item.danWei}, #{item.changJia}, #{item.youXiaoQi}, #{item.cunChuTiaoJian},
+            #{item.beiZhu}, #{item.leiBie}, #{item.kaiPingXiaoQi}, #{item.danJia},
+            #{item.bianMa}, #{item.chanPinPiHao}, #{item.fuJian}, #{item.gongYingShang},
+            #{item.fenLei}, #{item.zhuCeZhengHao}, #{item.yiQiSheBei}, #{item.sheBeiMingChen},
+            #{item.sheBeiBianHao}, #{item.huoHao}, #{item.cunFangWeiZhi}, #{item.zuiDiYuCun},
+            #{item.kuCunLiang}, #{item.piHao}, #{item.zhuCeZhengYou}, #{item.shuLiang},
+            #{item.youXiaoQiZhi}, #{item.daoHuoRiQi}, #{item.zhuangTai}
+        )
+        </foreach>
+    </insert>
+
+    <insert id="insertOutboundBatch" parameterType="java.util.List">
+        INSERT IGNORE INTO t_sjhccklsb (
+            id_, tenant_id_, ip_, create_by_, create_time_, update_by_, update_time_,
+            shi_fou_guo_shen_, di_dian_, bian_zhi_ren_, bian_zhi_bu_men_, bian_zhi_shi_jian,
+            kuai_zhao_, ming_cheng_, pi_ci_hao_, bao_zhuang_gui_ge, zui_xiao_gui_ge_,
+            dan_wei_, chang_jia_, you_xiao_qi_, cun_chu_tiao_jian, bei_zhu_, lei_bie_,
+            kai_ping_xiao_qi_, dan_jia_, bian_ma_, chan_pin_pi_hao_, fu_jian_,
+            gong_ying_shang_, fen_lei_, zhu_ce_zheng_hao_, yi_qi_she_bei_, she_bei_ming_chen,
+            she_bei_bian_hao_, huo_hao_, cun_fang_wei_zhi_, zui_di_yu_cun_, ku_cun_liang_,
+            pi_hao_, zhu_ce_zheng_you_, shu_liang_, you_xiao_qi_zhi_, dao_huo_ri_qi_, zhuang_tai_
+        ) VALUES
+        <foreach collection="list" item="item" separator=",">
+        (
+            #{item.id}, #{item.tenantId}, #{item.ip}, #{item.createBy}, #{item.createTime},
+            #{item.updateBy}, #{item.updateTime}, #{item.shiFouGuoShen}, #{item.diDian},
+            #{item.bianZhiRen}, #{item.bianZhiBuMen}, #{item.bianZhiShiJian}, #{item.kuaiZhao},
+            #{item.mingCheng}, #{item.piCiHao}, #{item.baoZhuangGuiGe}, #{item.zuiXiaoGuiGe},
+            #{item.danWei}, #{item.changJia}, #{item.youXiaoQi}, #{item.cunChuTiaoJian},
+            #{item.beiZhu}, #{item.leiBie}, #{item.kaiPingXiaoQi}, #{item.danJia},
+            #{item.bianMa}, #{item.chanPinPiHao}, #{item.fuJian}, #{item.gongYingShang},
+            #{item.fenLei}, #{item.zhuCeZhengHao}, #{item.yiQiSheBei}, #{item.sheBeiMingChen},
+            #{item.sheBeiBianHao}, #{item.huoHao}, #{item.cunFangWeiZhi}, #{item.zuiDiYuCun},
+            #{item.kuCunLiang}, #{item.piHao}, #{item.zhuCeZhengYou}, #{item.shuLiang},
+            #{item.youXiaoQiZhi}, #{item.daoHuoRiQi}, #{item.zhuangTai}
+        )
+        </foreach>
+    </insert>
+
+    <update id="updateStatusBySids" parameterType="java.util.List">
+        UPDATE t_sjhccrklsysb SET status = 1 WHERE s_id IN
+        <foreach collection="list" item="sid" open="(" separator="," close=")">
+            #{sid}
+        </foreach>
+    </update>
+
+</mapper>

+ 54 - 0
reagent-consumable/src/main/resources/mapper/pg/PgReagentMapper.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jyxt.thridparty.dao.pg.PgReagentDao">
+
+    <!-- 实体类与数据库字段的映射配置 -->
+    <resultMap id="BaseResultMap" type="com.jyxt.thridparty.entity.ReagentConsumableRawData">
+        <result column="产品编码" property="productCode" jdbcType="VARCHAR" />
+        <result column="产品名称" property="productName" jdbcType="VARCHAR" />
+        <result column="处理数量" property="processQuantity" jdbcType="DECIMAL" />
+        <result column="处理时间" property="processTime" jdbcType="TIMESTAMP" />
+        <result column="事务处理类型" property="transactionType" jdbcType="VARCHAR" />
+        <result column="批次号" property="batchNumber" jdbcType="VARCHAR" />
+        <result column="到期日" property="expirationDate" jdbcType="TIMESTAMP" />
+        <result column="创建时间" property="createTime" jdbcType="TIMESTAMP" />
+    </resultMap>
+
+    <!-- 查询所有记录的SQL -->
+    <select id="selectAll" resultMap="BaseResultMap">
+        SELECT
+        产品编码,
+        产品名称,
+        处理数量,
+        处理时间,
+        事务处理类型,
+        批次号,
+        到期日,
+        创建时间
+        FROM hs_jt
+    </select>
+
+    <!-- 根据创建时间范围查询的SQL -->
+    <select id="selectByCreateTime" resultMap="BaseResultMap">
+        SELECT
+        产品编码,
+        产品名称,
+        处理数量,
+        处理时间,
+        事务处理类型,
+        批次号,
+        到期日,
+        创建时间
+        FROM hs_jt
+        <where>
+            <if test="startTime != null">
+                AND 创建时间 &gt;= #{startTime}
+            </if>
+            <if test="endTime != null">
+                AND 创建时间 &lt;= #{endTime}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 27 - 0
reagent-consumable/start.sh

@@ -0,0 +1,27 @@
+#!/bin/bash
+
+JAR_NAME="reagent-consumable-1.0-SNAPSHOT.jar"
+PID_FILE="app.pid"
+
+# 检查jar包是否存在
+if [ ! -f "$JAR_NAME" ]; then
+    echo "错误: $JAR_NAME 文件不存在"
+    exit 1
+fi
+
+# 检查是否已经在运行
+if [ -f "$PID_FILE" ]; then
+    PID=$(cat $PID_FILE)
+    if ps -p $PID > /dev/null 2>&1; then
+        echo "应用已在运行,PID: $PID"
+        exit 1
+    else
+        rm -f $PID_FILE
+    fi
+fi
+
+# 启动应用
+echo "启动应用..."
+nohup java -jar $JAR_NAME > /dev/null 2>&1 &
+echo $! > $PID_FILE
+echo "应用已启动,PID: $(cat $PID_FILE)"

+ 29 - 0
reagent-consumable/stop.sh

@@ -0,0 +1,29 @@
+#!/bin/bash
+
+PID_FILE="app.pid"
+
+# 检查PID文件是否存在
+if [ ! -f "$PID_FILE" ]; then
+    echo "应用未运行或PID文件不存在"
+    exit 1
+fi
+
+# 读取PID并停止应用
+PID=$(cat $PID_FILE)
+if ps -p $PID > /dev/null 2>&1; then
+    echo "停止应用,PID: $PID"
+    kill $PID
+    sleep 2
+    
+    # 检查是否成功停止
+    if ps -p $PID > /dev/null 2>&1; then
+        echo "强制停止应用"
+        kill -9 $PID
+    fi
+    
+    rm -f $PID_FILE
+    echo "应用已停止"
+else
+    echo "应用进程不存在,清理PID文件"
+    rm -f $PID_FILE
+fi