Jelajahi Sumber

深圳三院质量指标与LIS视图接口

huangws 10 bulan lalu
induk
melakukan
061703a6a9
25 mengubah file dengan 1605 tambahan dan 0 penghapusan
  1. 96 0
      GetDataByRESTful/pom.xml
  2. 40 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/GetDataByRESTfulApplication.java
  3. 30 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/GetDataByRESTfulConfiguration.java
  4. 48 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/ApiClientService.java
  5. 19 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/ApiException.java
  6. 34 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/ApiResponse.java
  7. 50 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/HandleDataService.java
  8. 43 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/IBPSService.java
  9. 94 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/view/TemperatureEntity.java
  10. 49 0
      GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/view/repository/TemperatureEntityRepository.java
  11. 16 0
      GetDataByRESTful/src/main/resources/application.properties
  12. 13 0
      GetDataByRESTful/src/test/java/com/jyxt/getdatabyrestful/GetDataByResTfulApplicationTests.java
  13. 92 0
      GetDataByView/pom.xml
  14. 98 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/DateRangeUtil.java
  15. 60 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/GetDataByViewApplication.java
  16. 38 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/GetDataByViewConfiguration.java
  17. 126 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/HandleData.java
  18. 15 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/ScheduledTasks.java
  19. 61 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/ValueEvaluator.java
  20. 68 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/view/LISView.java
  21. 72 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/view/QualityIndicator.java
  22. 300 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/LISViewRepository.java
  23. 105 0
      GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/QualityIndicatorRepository.java
  24. 17 0
      GetDataByView/src/main/resources/application.properties
  25. 21 0
      GetDataByView/src/test/java/com/jyxt/getdatabyview/GetDataByViewApplicationTests.java

+ 96 - 0
GetDataByRESTful/pom.xml

@@ -0,0 +1,96 @@
+<?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</groupId>
+    <artifactId>GetDataByRESTful</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>GetDataByRESTful</name>
+    <description>GetDataByRESTful</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</artifactId>
+        </dependency>
+        <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>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </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>
+                <exclusions>
+                    <!-- 排除冲突的SLF4J绑定 -->
+                    <exclusion>
+                        <groupId>org.slf4j</groupId>
+                        <artifactId>slf4j-log4j12</artifactId>
+                    </exclusion>
+                </exclusions>
+            </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.getdatabyrestful.GetDataByRESTfulApplication</mainClass>
+                    <skip>true</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 40 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/GetDataByRESTfulApplication.java

@@ -0,0 +1,40 @@
+package com.jyxt.getdatabyrestful;
+
+import com.jyxt.getdatabyrestful.service.IBPSService;
+import com.jyxt.getdatabyrestful.view.TemperatureEntity;
+import com.jyxt.getdatabyrestful.view.repository.TemperatureEntityRepository;
+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.context.ConfigurableApplicationContext;
+
+import java.util.List;
+
+@SpringBootApplication
+public class GetDataByRESTfulApplication implements CommandLineRunner {
+
+    private static final Logger log = LoggerFactory.getLogger(GetDataByRESTfulApplication.class);
+
+
+    public static void main(String[] args) {
+        SpringApplication.run(GetDataByRESTfulApplication.class, args);
+    }
+
+    @Autowired
+    private ConfigurableApplicationContext context;
+
+    @Autowired
+    IBPSService ibpsService;
+
+    @Override
+    public void run(String... args) throws Exception{
+        log.info("<-------------new turn start...------------->");
+        ibpsService.QryUndoData();
+        context.close(); // 直接关闭上下文
+        log.info("<-------------this turn finish...------------->");
+    }
+
+}

+ 30 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/GetDataByRESTfulConfiguration.java

@@ -0,0 +1,30 @@
+package com.jyxt.getdatabyrestful;
+
+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 GetDataByRESTfulConfiguration {
+    @Bean
+    @Primary
+    @ConfigurationProperties(prefix = "spring.datasource")
+    public DataSource primaryDataSource() {
+        return DataSourceBuilder.create().build();
+    }
+
+
+
+    @Bean
+    @Primary
+    public JdbcTemplate primaryJdbcTemplate(DataSource dataSource) {
+        return new JdbcTemplate(dataSource);
+    }
+
+}

+ 48 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/ApiClientService.java

@@ -0,0 +1,48 @@
+package com.jyxt.getdatabyrestful.service;
+
+import com.jyxt.getdatabyrestful.GetDataByRESTfulApplication;
+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.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+
+@Service
+public class ApiClientService {
+
+    private static final RestTemplate restTemplate = new RestTemplate();
+
+    private static final Logger log = LoggerFactory.getLogger(ApiClientService.class);
+
+    @Value("${api.resources.path}") // 注入配置文件中的路径
+    private String apiPath;
+
+    @Value("${UrlAddr}")
+    private String UrlAddr;
+
+
+    // GET请求
+    public static String sendGet(String url) {
+        String RetVal = restTemplate.getForObject(url, String.class);
+        return RetVal;
+    }
+
+    // POST请求
+    public static String sendPost(String url, Object request) {
+        // 设置请求头(如 JSON)
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        // 包装请求体和头
+        HttpEntity<Object> httpEntity = new HttpEntity<>(request, headers);
+        // 发送 POST 请求
+        String RetVal = restTemplate.postForObject(url, request, String.class);
+        return RetVal;
+    }
+
+
+}

+ 19 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/ApiException.java

@@ -0,0 +1,19 @@
+package com.jyxt.getdatabyrestful.service;
+
+public class ApiException extends RuntimeException {
+    private final int statusCode;
+
+    public ApiException(String message, int statusCode) {
+        super(message);
+        this.statusCode = statusCode;
+    }
+
+    // 新增单参数构造(默认状态码500)
+    public ApiException(String message) {
+        this(message, 500);
+    }
+
+    public int getStatusCode() {
+        return statusCode;
+    }
+}

+ 34 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/ApiResponse.java

@@ -0,0 +1,34 @@
+package com.jyxt.getdatabyrestful.service;
+
+public class ApiResponse {
+    private int code;
+    private String message;
+    private Object data;
+
+
+
+    // 标准getter/setter
+    public boolean isSuccess() {
+        return code == 200;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+}

+ 50 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/HandleDataService.java

@@ -0,0 +1,50 @@
+package com.jyxt.getdatabyrestful.service;
+
+import com.jyxt.getdatabyrestful.GetDataByRESTfulApplication;
+import com.jyxt.getdatabyrestful.view.repository.TemperatureEntityRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class HandleDataService {
+    private static final Logger log = LoggerFactory.getLogger(GetDataByRESTfulApplication.class);
+
+    @Autowired
+    private ApiClientService apiClientService;
+
+    @Autowired
+    private TemperatureEntityRepository temperatureEntityRepository;
+
+    public void startHandleData(String ID,String Bianzhishijian,String EntityName) {
+        log.info("ID: {}, Bianzhishijian: {}, EntityName: {}", ID, Bianzhishijian, EntityName);
+//        String retVal = apiClientService.sendGet("https://petstore-demo.apifox.com/pet/1");
+//        System.out.println(retVal);
+        System.out.println("---------------------------------------------------------------");
+        Map<String, Object> params = new HashMap<>();
+        params.put("username", "test");  // 替换为实际值
+        params.put("password", "test01");    // 替换为实际值
+        String retVal2 = apiClientService.sendPost("http://120.27.156.224:8089/data/api/getToken",params);
+        System.out.println(retVal2);
+//        apiClientService.callThirdPartyApi(ID, Bianzhishijian, EntityName)
+//                .doOnNext(response -> {
+//                    if(response.isSuccess()) {
+//                        log.info("处理成功数据: {}", response.getData());
+//                        // 业务处理逻辑
+//                    } else {
+//                        log.warn("业务异常: {}", response.getMessage());
+//                    }
+//                })
+//                .doOnError(e -> log.error("处理失败", e))
+//                .subscribe(
+//                    response -> {}, // 成功处理(通常留空,因已用 doOnNext)
+//                    error -> log.error("全局捕获:", error) // 兜底异常处理
+//                );
+
+    }
+
+}

+ 43 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/service/IBPSService.java

@@ -0,0 +1,43 @@
+package com.jyxt.getdatabyrestful.service;
+
+import com.jyxt.getdatabyrestful.view.TemperatureEntity;
+import com.jyxt.getdatabyrestful.view.repository.TemperatureEntityRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class IBPSService {
+
+    private static final Logger log = LoggerFactory.getLogger(IBPSService.class);
+
+    @Autowired
+    private TemperatureEntityRepository temperatureEntityRepository;
+
+    @Autowired
+    private HandleDataService handleDataService;
+
+    public void QryUndoData(){
+        List<TemperatureEntity> qiList = temperatureEntityRepository.query();
+        if(qiList != null){
+            for (TemperatureEntity te : qiList) {
+                try {
+                    String Id = te.getId();
+                    String Bianzhishijian = te.getBianzhishijian();
+                    String EntityName = te.getEntityname();
+                    handleDataService.startHandleData(Id,Bianzhishijian,EntityName);
+                    break;
+                }catch (Exception ex){
+                    log.error(ex.getMessage());
+                }
+            }
+        }
+    };
+
+    public void InsertUnControlRecord(){
+
+    }
+}

+ 94 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/view/TemperatureEntity.java

@@ -0,0 +1,94 @@
+package com.jyxt.getdatabyrestful.view;
+
+public class TemperatureEntity {
+    private String id;
+    private String bianzhishijian;
+    private String caijiqiid;
+    private String entitytype;
+    private String entityname;
+    private String entityname2;
+    private String entityid;
+    private String status;
+    private String monitordate;
+    private String monitordetail;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getBianzhishijian() {
+        return bianzhishijian;
+    }
+
+    public void setBianzhishijian(String bianzhishijian) {
+        this.bianzhishijian = bianzhishijian;
+    }
+
+    public String getCaijiqiid() {
+        return caijiqiid;
+    }
+
+    public void setCaijiqiid(String caijiqiid) {
+        this.caijiqiid = caijiqiid;
+    }
+
+    public String getEntitytype() {
+        return entitytype;
+    }
+
+    public void setEntitytype(String entitytype) {
+        this.entitytype = entitytype;
+    }
+
+    public String getEntityname() {
+        return entityname;
+    }
+
+    public void setEntityname(String entityname) {
+        this.entityname = entityname;
+    }
+
+    public String getEntityname2() {
+        return entityname2;
+    }
+
+    public void setEntityname2(String entityname2) {
+        this.entityname2 = entityname2;
+    }
+
+    public String getEntityid() {
+        return entityid;
+    }
+
+    public void setEntityid(String entityid) {
+        this.entityid = entityid;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getMonitordate() {
+        return monitordate;
+    }
+
+    public void setMonitordate(String monitordate) {
+        this.monitordate = monitordate;
+    }
+
+    public String getMonitordetail() {
+        return monitordetail;
+    }
+
+    public void setMonitordetail(String monitordetail) {
+        this.monitordetail = monitordetail;
+    }
+}

+ 49 - 0
GetDataByRESTful/src/main/java/com/jyxt/getdatabyrestful/view/repository/TemperatureEntityRepository.java

@@ -0,0 +1,49 @@
+package com.jyxt.getdatabyrestful.view.repository;
+
+import com.jyxt.getdatabyrestful.view.TemperatureEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+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 TemperatureEntityRepository {
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    private static final Logger log = LoggerFactory.getLogger(TemperatureEntityRepository.class);
+
+    @Value("${fetch.sqlGetUndo}")
+    private String sql;
+
+    @Value("${config.qrymode}")
+    private String qryMode;
+
+    public List<TemperatureEntity> query(){
+        log.info("excute sql:" + sql);
+        List<TemperatureEntity> result = jdbcTemplate.query(
+                sql,
+                new RowMapper<TemperatureEntity>() {
+                    public TemperatureEntity mapRow(ResultSet rs, int rowNum) throws SQLException {
+                        TemperatureEntity te = new TemperatureEntity();
+                        te.setId(rs.getString("id_"));
+                        te.setBianzhishijian(rs.getString("bian_zhi_shi_jian"));
+                        te.setEntityname(rs.getString("bing_xiang_bian_h"));
+                        return te;
+                    }
+                });
+        if (result.isEmpty()) {
+            log.info("-------------no data finded,nothing to do...-------------");
+        }
+        return result;
+    }
+
+}

+ 16 - 0
GetDataByRESTful/src/main/resources/application.properties

@@ -0,0 +1,16 @@
+spring.application.name=GetDataByRESTful
+#spring.datasource.jdbc-url = jdbc:mysql://demo2.local:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
+spring.datasource.jdbc-url = jdbc:mysql://dev1.local:3306/klims-ibps3?characterEncoding=utf8&useSSL=false
+spring.datasource.username = root
+spring.datasource.password = test001
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+
+#fetch.sqlGetUndo=select id_,bian_zhi_shi_jian,zhi_liang_zhi_bia,yuan_shi_shu_ju_ from t_zlzbpjzb where zhuang_tai_='\u5f85\u5904\u7406'
+fetch.sqlGetUndo=SELECT * from t_bxwdjkjlb where shi_fou_guo_shen_='\u5f85\u5904\u7406' and date(create_time_) = curdate()
+logging.file.name=logs/GetDataByRESTful.log
+# level:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
+logging.level.root=INFO
+#1 or 0,1 means only qry,0 means update
+config.qrymode=0
+UrlAddr=http://coolaf.com/tool
+api.resources.path=/ibps/platform/v3/auth/resources/getDefaultResources

+ 13 - 0
GetDataByRESTful/src/test/java/com/jyxt/getdatabyrestful/GetDataByResTfulApplicationTests.java

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

+ 92 - 0
GetDataByView/pom.xml

@@ -0,0 +1,92 @@
+<?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.example</groupId>
+    <artifactId>GetDataByView</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>GetDataByView</name>
+    <packaging>jar</packaging>
+    <description>GetDataByView</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>ojdbc6</artifactId>
+            <version>11.2.0.4</version>
+        </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>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-starter-log4j2</artifactId>-->
+<!--        </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>
+                <exclusions>
+                    <!-- 排除冲突的SLF4J绑定 -->
+                    <exclusion>
+                        <groupId>org.slf4j</groupId>
+                        <artifactId>slf4j-log4j12</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <mainClass>com.jyxt.getdatabyview.GetDataByViewApplication</mainClass>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>repackage</id>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 98 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/DateRangeUtil.java

@@ -0,0 +1,98 @@
+package com.jyxt.getdatabyview;
+
+import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class DateRangeUtil {
+
+    public static String getDateRange(String input) {
+        // 定义正则表达式匹配模式和对应的处理逻辑
+        Matcher monthMatcher = Pattern.compile("^(\\d{4})年(\\d{1,2})月份$").matcher(input);
+        Matcher quarterMatcher = Pattern.compile("^(\\d{4})年第([1-4])季度$").matcher(input);
+        Matcher halfYearMatcher = Pattern.compile("^(\\d{4})年(上|下)半年$").matcher(input);
+        Matcher yearMatcher = Pattern.compile("^(\\d{4})年度$").matcher(input);
+
+        try {
+            if (monthMatcher.matches()) {
+                int year = Integer.parseInt(monthMatcher.group(1));
+                int month = Integer.parseInt(monthMatcher.group(2));
+                YearMonth ym = YearMonth.of(year, month);
+                return formatDate(ym.atDay(1), ym.atEndOfMonth());
+            } else if (quarterMatcher.matches()) {
+                int year = Integer.parseInt(quarterMatcher.group(1));
+                int quarter = Integer.parseInt(quarterMatcher.group(2));
+                YearMonth startYm = YearMonth.of(year, (quarter - 1) * 3 + 1);
+                YearMonth endYm = YearMonth.of(year, quarter * 3);
+                return formatDate(startYm.atDay(1), endYm.atEndOfMonth());
+            } else if (halfYearMatcher.matches()) {
+                int year = Integer.parseInt(halfYearMatcher.group(1));
+                String half = halfYearMatcher.group(2);
+                YearMonth startYm = YearMonth.of(year, "上".equals(half) ? 1 : 7);
+                YearMonth endYm = YearMonth.of(year, "上".equals(half) ? 6 : 12);
+                return formatDate(startYm.atDay(1), endYm.atEndOfMonth());
+            } else if (yearMatcher.matches()) {
+                int year = Integer.parseInt(yearMatcher.group(1));
+                return formatDate(YearMonth.of(year, 1).atDay(1), YearMonth.of(year, 12).atEndOfMonth());
+            } else {
+                throw new IllegalArgumentException("无效的日期格式");
+            }
+        } catch (Exception e) {
+            throw new IllegalArgumentException("无效的日期参数", e);
+        }
+    }
+
+
+    private static String formatDate(LocalDate start, LocalDate end) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        return start.format(formatter) + "|" + end.format(formatter);
+    }
+
+    public static void Test(){
+        String [] firstName = {"张","李","王","孙","赵"};
+        String [] lastName = {"一","二","三","四","五","六"};
+        Random rand = new Random();
+        int randomIntFirstName = rand.nextInt(5);
+        int randomIntLastName = rand.nextInt(6);
+        String UserName = firstName[randomIntFirstName] + lastName[randomIntLastName];
+        String [] firstWord = {"吃","穿","用","打"};
+        String [] lastWord = {"衣服","汽车","电话","电脑","杯子"};
+        int randomIntFirstWord = rand.nextInt(4);
+        int randomIntLastWord = rand.nextInt(5);
+        String Role = firstWord[randomIntFirstWord] + lastWord[randomIntLastWord];
+        Map<String, Object> params = new HashMap<>();
+        params.put("user_name", UserName);
+        params.put("role", Role);
+        List<Map<String, Object>> list1 = new ArrayList<>();
+        list1.add(params);
+        System.out.println(list1);
+    }
+
+    public static void main(String[] args) {
+        // 测试用例
+//        System.out.println(getDateRange("2024年5月份"));
+//        System.out.println(getDateRange("2024年11月份"));
+//        System.out.println(getDateRange("2024年7月份"));
+//        System.out.println(getDateRange("2020年上半年"));
+//        System.out.println(getDateRange("2020年2月份"));
+//        System.out.println(getDateRange("2021年2月份"));
+//        System.out.println(getDateRange("2022年2月份"));
+//        System.out.println(getDateRange("2023年2月份"));
+//        System.out.println(getDateRange("2023年度"));
+//        System.out.println(getDateRange("2023年第3季度"));
+//        System.out.println(getDateRange("2025年第1季度"));
+        Test();
+        Test();
+        Test();
+        Test();
+        Test();
+        Test();
+        Test();
+        Test();
+        Test();
+        Test();
+    }
+}

+ 60 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/GetDataByViewApplication.java

@@ -0,0 +1,60 @@
+package com.jyxt.getdatabyview;
+
+import com.jyxt.getdatabyview.view.QualityIndicator;
+import com.jyxt.getdatabyview.view.repository.LISViewRepository;
+import com.jyxt.getdatabyview.view.repository.QualityIndicatorRepository;
+
+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.context.ConfigurableApplicationContext;
+
+import java.util.List;
+
+@SpringBootApplication
+public class GetDataByViewApplication implements CommandLineRunner{
+
+    private static final Logger log = LoggerFactory.getLogger(GetDataByViewApplication.class);
+
+    @Autowired
+    private LISViewRepository lisViewRepository;
+
+    @Autowired
+    private QualityIndicatorRepository qualityIndicatorRepository;
+
+    public static void main(String[] args) {
+        SpringApplication.run(GetDataByViewApplication.class, args);
+    }
+
+    @Autowired
+    private HandleData handleData;
+
+    @Autowired
+    private ConfigurableApplicationContext context;
+
+    @Override
+    public void run(String... args) throws Exception {
+//        System.out.println("in run");
+        log.info("<-------------new turn start...------------->");
+        List<QualityIndicator> qiList = qualityIndicatorRepository.query();
+        if(qiList != null){
+            for (QualityIndicator qi : qiList) {
+                try {
+                    String pingjiaId = qi.getId();
+                    String zhiliangzhibia = qi.getzhiliangzhibia();
+                    String bianzhishijian = qi.getbianzhishijian();
+                    String yuanshishuju = qi.getYuanshishuju();
+                    handleData.startHandleData(pingjiaId,zhiliangzhibia,bianzhishijian,yuanshishuju);
+
+                }catch (Exception ex){
+                    log.error(ex.getMessage());
+                }
+            }
+        }
+        log.info("<-------------this turn finish...------------->");
+        context.close(); // 直接关闭上下文
+    }
+}

+ 38 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/GetDataByViewConfiguration.java

@@ -0,0 +1,38 @@
+package com.jyxt.getdatabyview;
+
+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 GetDataByViewConfiguration {
+    @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);
+    }
+}

+ 126 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/HandleData.java

@@ -0,0 +1,126 @@
+package com.jyxt.getdatabyview;
+
+import com.jyxt.getdatabyview.view.repository.LISViewRepository;
+import com.jyxt.getdatabyview.view.repository.QualityIndicatorRepository;
+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.stereotype.Component;
+
+import java.util.*;
+
+@Component
+public class HandleData {
+    private static final Logger log = LoggerFactory.getLogger(GetDataByViewApplication.class);
+
+    @Autowired
+    private LISViewRepository lisViewRepository;
+
+    @Autowired
+    private QualityIndicatorRepository qualityIndicatorRepository;
+
+    private static final String RESULT_DELIMITER = "\\^";
+
+    private static final List<String> qualityIndicatorList = Collections.unmodifiableList(
+            Arrays.asList(
+                    "总标本不合格率",                // 0
+                    "抗凝标本凝集率",                // 1
+                    "标本类型错误率",                // 2
+                    "标本容器错误率",                // 3
+                    "标本溶血率",                   // 4
+                    "标本采集量错误率",              // 5
+                    "急诊常规实验室内TAT中位数",      // 6
+                    "急诊生化免疫实验室内TAT中位数",   // 7
+                    "急诊凝血实验室内TAT中位数",      // 8
+                    "急诊血常规检验前周转时间中位数",   // 9
+                    "急诊血常规实验室内周转时间中位数", // 10
+                    "常规检验报告发放TAT时间符合率",   // 11
+                    "检验报告不正确率",              // 12
+                    "危急值通报率",                 // 13
+                    "危急值通报及时率",              // 14
+                    "标本合格率",                   // 15
+                    "TAT时间合格率",                // 16
+                    "报告准确率",                   // 17
+                    "危急值通报符合率"               // 18
+            )
+    );
+
+    public void startHandleData(String pingjiaId,String zhiliangzhibia,String bianzhishijian, String yuanshishuju) {
+
+        if (qualityIndicatorList.contains(zhiliangzhibia)){
+//            System.out.println(output);
+            log.info("ID: {}, zhiliangzhibia: {}, bianzhishijian: {}", pingjiaId, zhiliangzhibia, bianzhishijian);
+            int QIIndex = qualityIndicatorList.indexOf(zhiliangzhibia);
+            String DataDetail = "";
+            String dateRange = DateRangeUtil.getDateRange(bianzhishijian);
+            String[] resultParts = lisViewRepository.query(QIIndex,dateRange).split(RESULT_DELIMITER);
+//            String[] resultParts = new String[] {"", "", ""};
+//            if (pingjiaId.equals("1367710945618427904")) {
+//                resultParts = new String[] {"100", "10000", "10000"};
+//            }
+            String resultValue = resultParts[0];
+            if (resultValue.startsWith(".")) {
+                resultValue = "0" + resultValue;
+            }
+            String IsQualified = null;
+            if ((!Objects.equals(resultValue, ""))){
+                IsQualified = ValueEvaluator.evaluateValue(resultValue,yuanshishuju);
+            }
+            //总数统计
+            if (resultParts.length==2){
+                String total = resultParts[1];
+                if ((!Objects.equals(resultValue, ""))&&(!Objects.equals(resultValue,null))&&(!Objects.equals(resultValue,"-1"))) {
+//                System.out.println("output:"+ResultValue);
+                    log.info("Get LIS RetVal:{},zhiliangzhibiao:{},bianzhishijian:{}",resultParts,zhiliangzhibia,bianzhishijian);
+                    if (QIIndex==6){
+                        DataDetail = "同期临检(住院)及临检(门诊)的三大常规(血、尿、便)标本共 "+resultParts[1]+" 例";
+                    } else if (QIIndex==7){
+                        DataDetail = "同期临检急诊组的急诊生化、免疫标本共 "+resultParts[1]+" 例";
+                    } else if (QIIndex==8){
+                        DataDetail = "同期临检(住院)及临检(门诊) 的急诊血凝标本共 "+resultParts[1]+" 例";
+                    } else if ((QIIndex==9)||(QIIndex==10)){
+                        DataDetail = "同期临检(住院)及临检(门诊) 的急诊血常规标本共 "+resultParts[1]+" 例";
+                    }
+//                    qualityIndicatorRepository.save(pingjiaId, resultValue,total,DataDetail,IsQualified);
+                    //分子不需要整数
+                    qualityIndicatorRepository.save(pingjiaId, resultValue,resultValue,DataDetail,IsQualified);
+                }
+            } else if (resultParts.length==3){
+                String numerator = resultParts[1];
+                String denominator = resultParts[2];
+                if ((!Objects.equals(resultValue, ""))&&(!Objects.equals(resultValue,null))&&(!Objects.equals(resultValue,"-1"))){
+                    log.info("Get LIS RetVal:{},zhiliangzhibiao:{},bianzhishijian:{}",resultParts,zhiliangzhibia,bianzhishijian);
+                    if (QIIndex==0){
+                        DataDetail = "不合格标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==1){
+                        DataDetail = "凝集的标本数 "+resultParts[1]+" 例,同期需抗凝的标本总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==2){
+                        DataDetail = "类型错误或不适当的标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==3){
+                        DataDetail = "采集容器错误的标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==4){
+                        DataDetail = "溶血的标本 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==5){
+                        DataDetail = "量不足或过多(抗凝标本)的标本数 "+resultParts[1]+" 例,同期标本总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==12){
+                        DataDetail = "实验室发出的不正确报告数 "+resultParts[1]+" 例,报告总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==13){
+                        DataDetail = "已通报危急值数 "+resultParts[1]+" 例,同期需要通报危急值总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==14){
+                        DataDetail = "危急值通报时间(从结果确认到与临床医生交流的时间)满足规定时间的检验项目数 "+resultParts[1]+" 例,同期需要危急值通报的检验项目总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==15){
+                        DataDetail = "全年合格标本总数 "+resultParts[1]+" 例,全年标本总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==17){
+                        DataDetail = "实验室发出的正确报告数 "+resultParts[1]+" 例,同期实验室发出报告总数 "+resultParts[2]+" 例";
+                    } else if (QIIndex==18){
+                        DataDetail = "危急值通报时间(从结果确认到与临床医生交流的时间)满足规定时间的检验项目数 "+resultParts[1]+" 例,同期需要危急值通报的检验项目总数 "+resultParts[2]+" 例";
+                    }
+                    qualityIndicatorRepository.save(pingjiaId,resultValue,numerator,denominator,DataDetail,IsQualified);
+                }
+            } else {
+                log.info("no result to save:zhiliangzhibiao:{},bianzhishijian:{}",zhiliangzhibia,bianzhishijian);
+            }
+        }
+    }
+}

+ 15 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/ScheduledTasks.java

@@ -0,0 +1,15 @@
+package com.jyxt.getdatabyview;
+
+
+//@Component
+public class ScheduledTasks {
+//    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
+
+//    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
+
+
+//    @Scheduled(fixedRate = 5000)
+    public void exportLISViewData() {
+
+    }
+}

+ 61 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/ValueEvaluator.java

@@ -0,0 +1,61 @@
+package com.jyxt.getdatabyview;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ValueEvaluator {
+
+    private static final Logger log = LoggerFactory.getLogger(GetDataByViewApplication.class);
+
+    public static String evaluateValue(String actualValue, String criteria) {
+//        System.out.println(actualValue+" "+criteria);
+        // 拆分判断依据为操作符、数值和单位
+        String[] parts = criteria.split("@");
+        if (parts.length != 3) {
+//            throw new IllegalArgumentException("判断依据格式不正确");
+            log.info("判断依据格式不正确!----actualValue: " + actualValue+", criteria: " + criteria);
+            return "";
+        }
+
+        String operator = parts[0];
+        String criteriaValueStr = parts[1];
+
+        // 将实际值和判断值转换为double类型
+        double actual;
+        double criteriaValue;
+        try {
+            actual = Double.parseDouble(actualValue);
+            criteriaValue = Double.parseDouble(criteriaValueStr);
+        } catch (NumberFormatException e) {
+//            throw new IllegalArgumentException("数值格式错误", e);
+            log.info("数值格式错误!----actualValue: " + actualValue+", criteria: " + criteria);
+            return "";
+        }
+
+        // 根据操作符进行比较
+        boolean result;
+        if (operator.equals("<") || operator.equals("<")) {
+            result = actual < criteriaValue;
+        } else if (operator.equals(">") || operator.equals(">")) {
+            result = actual > criteriaValue;
+        } else if (operator.equals("≤")) {
+            result = actual <= criteriaValue;
+        } else if (operator.equals("≥")) {
+            result = actual >= criteriaValue;
+        }else if (operator.equals("=")) {
+            result = actual == criteriaValue;
+        } else {
+//            throw new IllegalArgumentException("不支持的操作符: " + operator);
+            log.info("不支持的操作符!----actualValue: " + actualValue+", criteria: " + criteria);
+            return "";
+        }
+
+        return result ? "Y" : "N";
+    }
+
+//    public static void main(String[] args) {
+//        // 示例测试
+//        System.out.println(evaluateValue("98", ">@98.98@%")); // Y
+//
+//    }
+}

+ 68 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/LISView.java

@@ -0,0 +1,68 @@
+package com.jyxt.getdatabyview.view;
+
+public class LISView {
+
+    private String ResultValue;
+
+    private String DetailComment;
+
+    private String Numerator;
+
+    private String Denominator;
+
+    private String Total;
+
+    public String getResultValue() {
+        return ResultValue;
+    }
+
+    public void setResultValue(String ResultValue) {
+        this.ResultValue = ResultValue;
+    }
+
+    public String getDetailComment() {
+        return DetailComment;
+    }
+
+    public void setDetailComment(String DetailComment) {
+        this.DetailComment = DetailComment;
+    }
+
+    public String getNumerator() {
+        return Numerator;
+    }
+
+    public void setNumerator(String numerator) {
+        Numerator = numerator;
+    }
+
+    public String getDenominator() {
+        return Denominator;
+    }
+
+    public void setDenominator(String denominator) {
+        Denominator = denominator;
+    }
+
+    public String getTotal() {
+        return Total;
+    }
+
+    public void setTotal(String total) {
+        Total = total;
+    }
+
+
+    @Override
+    public String toString() {
+        return "{" +
+                "'ResultValue':'" + ResultValue + '\'' +
+                ", 'DetailComment':'" + DetailComment + '\'' +
+                ", 'Numerator':'" + Numerator + '\'' +
+                ", 'Denominator':'" + Denominator + '\'' +
+                ", 'Total':'" + Total + '\'' +
+                '}';
+    }
+
+
+}

+ 72 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/QualityIndicator.java

@@ -0,0 +1,72 @@
+package com.jyxt.getdatabyview.view;
+
+public class QualityIndicator {
+
+    private String id;
+    private String bianzhishijian;
+    private String zhiliangzhibia;
+    private String zhuangtai;
+    private String shijishuzhi;
+    private String yuanshishuju;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getbianzhishijian() {
+        return bianzhishijian;
+    }
+
+    public void setbianzhishijian(String bianzhishijian) {
+        this.bianzhishijian = bianzhishijian;
+    }
+
+    public String getzhiliangzhibia() {
+        return zhiliangzhibia;
+    }
+
+    public void setzhiliangzhibia(String zhiliangzhibia) {
+        this.zhiliangzhibia = zhiliangzhibia;
+    }
+
+    public String getzhuangtai() {
+        return zhuangtai;
+    }
+
+    public void setzhuangtai(String zhuangtai) {
+        this.zhuangtai = zhuangtai;
+    }
+
+    public String getshijishuzhi() {
+        return shijishuzhi;
+    }
+
+    public void setshijishuzhi(String shijishuzhi) {
+        this.shijishuzhi = shijishuzhi;
+    }
+
+    public String getYuanshishuju() {
+        return yuanshishuju;
+    }
+
+    public void setYuanshishuju(String yuanshishuju) {
+        this.yuanshishuju = yuanshishuju;
+    }
+
+    @Override
+    public String toString() {
+        return "VendorBinxiang{" +
+                "id='" + id + '\'' +
+                ", bianzhishijian='" + bianzhishijian + '\'' +
+                ", zhiliangzhibia='" + zhiliangzhibia + '\'' +
+                ", zhuangtai='" + zhuangtai + '\'' +
+                ", shijishuzhi='" + shijishuzhi + '\'' +
+                ", yuanshishuju='" + yuanshishuju + '\'' +
+                '}';
+    }
+
+}

+ 300 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/LISViewRepository.java

@@ -0,0 +1,300 @@
+package com.jyxt.getdatabyview.view.repository;
+
+import com.jyxt.getdatabyview.view.LISView;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Component   // 通用注解
+@Repository
+public class LISViewRepository {
+    private static final Logger log = LoggerFactory.getLogger(LISViewRepository.class);
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+//        qualityIndicatorList.add("总标本不合格率");                //0
+//        qualityIndicatorList.add("抗凝标本凝集率");                //1
+//        qualityIndicatorList.add("标本类型错误率");               //2
+//        qualityIndicatorList.add("标本容器错误率");                //3
+//        qualityIndicatorList.add("标本溶血率");                   //4
+//        qualityIndicatorList.add("标本采集量错误率");              //5
+//        qualityIndicatorList.add("急诊常规实验室内TAT中位数");      //6
+//        qualityIndicatorList.add("急诊生化免疫实验室内TAT中位数");   //7
+//        qualityIndicatorList.add("急诊凝血实验室内TAT中位数");      //8
+//        qualityIndicatorList.add("急诊血常规检验前周转时间中位数");   //9
+//        qualityIndicatorList.add("急诊血常规实验室内周转时间中位数"); //10
+//        qualityIndicatorList.add("常规检验报告发放TAT时间符合率");   //11
+//        qualityIndicatorList.add("检验报告不正确率");              //12
+//        qualityIndicatorList.add("危急值通报率");                 //13
+//        qualityIndicatorList.add("危急值通报及时率");              //14
+//        qualityIndicatorList.add("标本合格率");                   //15
+//        qualityIndicatorList.add("TAT时间合格率");                //16
+//        qualityIndicatorList.add("报告准确率");                   //17
+//        qualityIndicatorList.add("危急值通报符合率");              //18
+
+    public String query(Integer QIIndex,String dateRange) {
+        String StartDate = dateRange.substring(0,10)+" 00:00:00";
+        String EndDate = dateRange.substring(11)+" 23:59:59";
+//        System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+
+        if (QIIndex != null) {
+            //总标本不合格率
+            if (QIIndex == 0) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM" +
+                        "(SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //抗凝标本凝集率
+            if (QIIndex == 1) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount*1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
+                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='02' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE sampletypeid='00' and RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //标本类型错误率
+            if (QIIndex == 2) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
+                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='2' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //标本容器错误率
+            if (QIIndex == 3) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
+                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='20' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //标本溶血率
+            if (QIIndex == 4) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
+                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE='01' and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //标本采集量错误率
+            if (QIIndex == 5) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM (" +
+                        "SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE REJECTREASONCODE in ('03','5') and RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //急诊常规实验室内TAT中位数
+            if (QIIndex == 6) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
+                        "WHERE b.INSTRUMENTGROUPCODE IN ('CG_BloodLAS','CG_UristLAS3','CG_XD6001','USF3000','CG_FA280S','CG_BC5390','CG_FA280S2') AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
+            }
+
+            //急诊生化免疫实验室内TAT中位数
+            if (QIIndex == 7) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
+                        "WHERE b.INSTRUMENTGROUPCODE='Abbott_IM_LAS_1' AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
+            }
+
+            //急诊凝血实验室内TAT中位数
+            if (QIIndex == 8) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
+                        "WHERE b.INSTRUMENTGROUPCODE='CG_StagoCompact' AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
+            }
+
+            //急诊血常规检验前周转时间中位数
+            if (QIIndex == 9) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT MEDIAN(c.PRETAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
+                        "WHERE b.INSTRUMENTGROUPCODE in ('CG_BloodLAS','CG_BC5390') AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
+            }
+
+            //急诊血常规实验室内周转时间中位数
+            if (QIIndex == 10) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT MEDIAN(c.INTAT) AS RESULTVALUE, MAX(d.TOTAL_COUNT) AS Total FROM  V_JT_TAT c INNER JOIN (SELECT  b.SAMPLEID,COUNT(*) OVER() AS TOTAL_COUNT FROM V_JT_LISREQUEST a INNER JOIN V_JT_LISREPORT b ON a.SAMPLEID = b.SAMPLEID " +
+                        "WHERE b.INSTRUMENTGROUPCODE in ('CG_BloodLAS','CG_BC5390') AND a.RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) d ON c.SAMPLEID = d.SAMPLEID";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getTotal();
+            }
+
+            //常规检验报告发放TAT时间符合率
+
+            //检验报告不正确率+
+            if (QIIndex == 12) {
+//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((CancelCount * 1.0 / AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,CancelCount as Numerator,AllCount as Denominator FROM (" +
+                        "SELECT (SELECT COUNT(*) FROM V_JT_LISCANCELREPORT WHERE GROUPID in ('30','06','05','00','31','07') and CANCELAUDITREASON like '%不正确%' and CANCELAUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS CancelCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisreport WHERE GROUPID in ('30','06','05','00','31','07') and AUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //危急值通报率
+            if (QIIndex == 13) {
+//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                //String sqlQry = "select count(*) as ResultValue from v_jt_lisrequest where SampleTime between ? and ?";
+//                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN ReceiverFlag = '1' THEN 1 END)/COUNT(*))*100,2) AS ResultValue FROM V_JT_CRITICAL where BUILDCRISISTIME between TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
+                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN ReceiverFlag = '1' THEN 1 END)/COUNT(*))*100, 2) AS ResultValue, COUNT(CASE WHEN ReceiverFlag = '1' THEN 1 END) AS Numerator,COUNT(*) AS Denominator FROM " +
+                        "V_JT_CRITICAL WHERE BUILDCRISISTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
+
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //危急值通报及时率
+            if (QIIndex == 14) {
+//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                //String sqlQry = "select count(*) as ResultValue from v_jt_lisrequest where SampleTime between ? and ?";
+                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN AccordFlag = '1' THEN 1 END)/COUNT(*))*100, 2) AS ResultValue, COUNT(CASE WHEN AccordFlag = '1' THEN 1 END) AS Numerator,COUNT(*) AS Denominator FROM " +
+                        "V_JT_CRITICAL WHERE BUILDCRISISTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+
+            //标本合格率
+            if (QIIndex == 15) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((RejectCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,RejectCount as Numerator,AllCount as Denominator FROM " +
+                        "(SELECT (SELECT COUNT(*) FROM v_jt_reject_sample WHERE RejectTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS RejectCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisrequest WHERE RegisterTime BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                // 提取三个部分的字符串值
+                String resultValueStr = lvList.get(0).getResultValue();
+                String denominatorStr = lvList.get(0).getDenominator();
+                String numeratorStr = lvList.get(0).getNumerator();
+
+                // 将分母和分子转换为整数进行计算(假设为整数类型)
+                int denominator = Integer.parseInt(denominatorStr);
+                int numerator = Integer.parseInt(numeratorStr);
+                int newNumeratorValue = denominator - numerator;
+                float resultValue = 100-Float.parseFloat(resultValueStr);
+
+                // 构造新的字符串
+                return String.join("^", String.valueOf(resultValue), String.valueOf(newNumeratorValue), denominatorStr);
+            }
+
+            //报告准确率
+            if (QIIndex == 17) {
+                //System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                String sqlQry = "SELECT CASE WHEN AllCount = 0 THEN -1 ELSE CAST((CancelCount * 1.0/AllCount)*100 AS DECIMAL(20,4)) END AS ResultValue,CancelCount as Numerator,AllCount as Denominator FROM (" +
+                        "SELECT (SELECT COUNT(*) FROM V_JT_LISCANCELREPORT WHERE CANCELAUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS CancelCount," +
+                        "(SELECT COUNT(*) FROM v_jt_lisreport WHERE AUDITTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')) AS AllCount FROM DUAL) Counts";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                // 提取三个部分的字符串值
+                String resultValueStr = lvList.get(0).getResultValue();
+                String denominatorStr = lvList.get(0).getDenominator();
+                String numeratorStr = lvList.get(0).getNumerator();
+
+                // 将分母和分子转换为整数进行计算(假设为整数类型)
+                int denominator = Integer.parseInt(denominatorStr);
+                int numerator = Integer.parseInt(numeratorStr);
+                int newNumeratorValue = denominator - numerator;
+                float resultValue = 100-Float.parseFloat(resultValueStr);
+
+                // 构造新的字符串
+                return String.join("^", String.valueOf(resultValue), String.valueOf(newNumeratorValue), denominatorStr);
+            }
+
+            //危急值通报符合率
+            if (QIIndex == 18) {
+//                System.out.println("dateRange:"+dateRange+",StartDate:"+StartDate+",EndDate:"+EndDate);
+                //String sqlQry = "select count(*) as ResultValue from v_jt_lisrequest where SampleTime between ? and ?";
+                String sqlQry = "SELECT ROUND((COUNT(CASE WHEN AccordFlag = '1' THEN 1 END)/COUNT(*))*100, 2) AS ResultValue, COUNT(CASE WHEN AccordFlag = '1' THEN 1 END) AS Numerator,COUNT(*) AS Denominator FROM " +
+                        "V_JT_CRITICAL WHERE BUILDCRISISTIME BETWEEN TO_DATE('"+StartDate+"', 'YYYY-MM-DD HH24:MI:SS') AND TO_DATE('"+EndDate+"', 'YYYY-MM-DD HH24:MI:SS')";
+                log.info("excute sql:"+sqlQry);
+                RowMapper<LISView> infoRowMapper = new BeanPropertyRowMapper<>(LISView.class);
+                List<LISView> lvList = jdbcTemplate.query(sqlQry, infoRowMapper);
+                //System.out.println(lvList.get(0).getResultValue());
+                return lvList.get(0).getResultValue()+"^"+lvList.get(0).getNumerator()+"^"+lvList.get(0).getDenominator();
+            }
+        }
+        return "";
+    }
+
+    public String query2(Integer QIIndex,String dateRange) {
+//        System.out.println("in qry2");
+        return "100^1675";
+    }
+
+}

+ 105 - 0
GetDataByView/src/main/java/com/jyxt/getdatabyview/view/repository/QualityIndicatorRepository.java

@@ -0,0 +1,105 @@
+package com.jyxt.getdatabyview.view.repository;
+
+import com.jyxt.getdatabyview.view.QualityIndicator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.PreparedStatementCreator;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Repository;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Objects;
+
+
+@Repository
+public class QualityIndicatorRepository {
+    @Autowired
+    @Qualifier("secondJdbcTemplate")
+    private JdbcTemplate jdbcTemplate;
+
+
+    private static final Logger log = LoggerFactory.getLogger(QualityIndicatorRepository.class);
+    @Value("${fetch.sqlGetUndo}")
+    private String sql;
+
+    @Value("${config.qrymode}")
+    private String qryMode;
+
+    public List<QualityIndicator> query() {
+        log.info("excute sql:" + sql);
+//        System.out.println(sql);
+        List<QualityIndicator> result = jdbcTemplate.query(
+                sql,
+                new RowMapper<QualityIndicator>() {
+                    @Override
+                    public QualityIndicator mapRow(ResultSet rs, int rowNum) throws SQLException {
+                        QualityIndicator qi = new QualityIndicator();
+                        qi.setId(rs.getString("id_"));
+                        qi.setbianzhishijian(rs.getString("bian_zhi_shi_jian"));
+                        qi.setzhiliangzhibia(rs.getString("zhi_liang_zhi_bia"));
+                        qi.setYuanshishuju(rs.getString("yuan_shi_shu_ju_"));
+                        return qi;
+                    }
+                }
+        );
+        if (result.isEmpty()) {
+            log.info("-------------no data finded,nothing to do...-------------");
+        }
+        return result;
+    }
+
+
+    public void save(String Id, String resultValue, String total, String DataDetail, String IsQualified){
+        //sql语句
+        final String sql = "update t_zlzbpjzb set shi_ji_shu_zhi_=?, fen_zi_=?,zhuang_tai_='已完成', bei_zhu_2_='自动导入',bei_zhu_='自动导入',shu_ju_xiang_qing=?,da_biao_qing_kuan=? where id_=? ";
+//        System.out.println("Id:"+Id+",ResultValue:"+ResultValue);
+//        System.out.println("Ready to update t_zlzbpjzb:Id:"+Id+",ResultValue:"+ResultValue);
+        if (Objects.equals(qryMode, "0")){
+            log.info("Ready to update t_zlzbpjzb:Id:"+Id+",ResultValue:"+resultValue+",total:"+total+",DataDetail:"+DataDetail+",IsQualified:"+IsQualified);
+            jdbcTemplate.update(new PreparedStatementCreator() {
+                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
+                    PreparedStatement prepareStatement = connection.prepareStatement(sql);
+                    prepareStatement.setString(1, resultValue);
+                    prepareStatement.setString(2, total);
+                    prepareStatement.setString(3, DataDetail);
+                    prepareStatement.setString(4, IsQualified);
+                    prepareStatement.setString(5, Id);
+                    return prepareStatement;
+                }
+            });
+        } else{
+            log.info("qryMode=1,pretend to update t_zlzbpjzb:Id:"+Id+",ResultValue:"+resultValue+",total:"+total+",DataDetail:"+DataDetail+",IsQualified:"+IsQualified);
+        }
+    }
+
+    public void save(String Id, String resultValue, String numerator, String denominator,String DataDetail, String IsQualified){
+        //sql语句
+        final String sql = "update t_zlzbpjzb set shi_ji_shu_zhi_=?, fen_zi_=?,fen_mu_=?,zhuang_tai_='已完成', bei_zhu_2_='自动导入',bei_zhu_='自动导入',shu_ju_xiang_qing=?,da_biao_qing_kuan=? where id_=? ";
+//        System.out.println("Id:"+Id+",ResultValue:"+ResultValue);
+        if (Objects.equals(qryMode, "0")){
+            log.info("Ready to update t_zlzbpjzb:Id:"+Id+",ResultValue:"+resultValue+",Numerator:"+numerator+",Denominator:"+denominator+",DataDetail:"+DataDetail+",IsQualified:"+IsQualified);
+            jdbcTemplate.update(new PreparedStatementCreator() {
+                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
+                    PreparedStatement prepareStatement = connection.prepareStatement(sql);
+                    prepareStatement.setString(1, resultValue);
+                    prepareStatement.setString(2, numerator);
+                    prepareStatement.setString(3, denominator);
+                    prepareStatement.setString(4, DataDetail);
+                    prepareStatement.setString(5, IsQualified);
+                    prepareStatement.setString(6, Id);
+                    return prepareStatement;
+                }
+            });
+        } else{
+            log.info("qryMode=1,pretend to update t_zlzbpjzb:Id:"+Id+",ResultValue:"+resultValue+",Numerator:"+numerator+",Denominator:"+denominator+",DataDetail:"+DataDetail+",IsQualified:"+IsQualified);
+        }
+    }
+}

+ 17 - 0
GetDataByView/src/main/resources/application.properties

@@ -0,0 +1,17 @@
+spring.application.name=GetDataByView
+spring.datasource.jdbc-url=jdbc:oracle:thin:@192.168.15.212:1521/SYHIS
+spring.datasource.username=JYXT
+spring.datasource.password=Jy#6688xt
+spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
+spring.second-datasource.jdbc-url = jdbc:mysql://localhost: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_jt_lisrequesttest
+fetch.sqlGetUndo=select id_,bian_zhi_shi_jian,zhi_liang_zhi_bia,yuan_shi_shu_ju_ from t_zlzbpjzb where zhuang_tai_='\u5f85\u5904\u7406'
+fetch.QualityIndicatorStr = ;???????????-??????-????; 
+logging.file.name=logs/GetDataByView.log
+# level:TRACE < DEBUG < INFO < WARN < ERROR < FATAL
+logging.level.root=INFO
+#1 or 0,1 means only qry,0 means update
+config.qrymode=1

+ 21 - 0
GetDataByView/src/test/java/com/jyxt/getdatabyview/GetDataByViewApplicationTests.java

@@ -0,0 +1,21 @@
+package com.jyxt.getdatabyview;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.*;
+
+@SpringBootTest
+class GetDataByViewApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+    public static void main(String[] args) {
+ 
+
+    }
+
+
+}