Browse Source

first commit

wangweiqun 6 years ago
commit
9d6c1400df

+ 1159 - 0
ehr-cloud/pom.xml

@ -0,0 +1,1159 @@
<?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.yihu.ehr</groupId>
    <artifactId>ehr-cloud</artifactId>
    <version>1.2.0</version>
    <packaging>pom</packaging>
    <name>ehr-cloud</name>
    <description>EHR parent pom for all</description>
    <url>http://ehr.yihu.com</url>
    <organization>
        <name>JKZL Software, Inc.</name>
        <url>http://www.yihu.com</url>
    </organization>
    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
        </license>
    </licenses>
    <developers>
        <developer>
            <id>sand</id>
            <name>Sand Wen</name>
            <email>sand.fj.wen@gmail.com</email>
            <organization>JKZL Software, Inc.</organization>
            <organizationUrl>http://www.yihu.com</organizationUrl>
            <roles>
                <role>Project lead</role>
                <role>Project designer</role>
                <role>Project programmer</role>
            </roles>
        </developer>
        <developer>
            <id>yzh</id>
            <name>叶泽华</name>
            <email>yzh@qq.com</email>
            <organization>JKZL Software, Inc.</organization>
            <organizationUrl>http://www.yihu.com</organizationUrl>
            <roles>
                <role>Project programmer</role>
            </roles>
        </developer>
        <developer>
            <id>cws</id>
            <name>陈维山</name>
            <email>hill9868@qq.com</email>
            <organization>JKZL Software, Inc.</organization>
            <organizationUrl>http://www.yihu.com</organizationUrl>
            <roles>
                <role>Project programmer</role>
            </roles>
        </developer>
        <developer>
            <id>hzy</id>
            <name>黄志勇</name>
            <email>hzy@qq.com</email>
            <organization>JKZL Software, Inc.</organization>
            <organizationUrl>http://www.yihu.com</organizationUrl>
            <roles>
                <role>Project programmer</role>
            </roles>
        </developer>
    </developers>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <version.spring-framework>4.3.13.RELEASE</version.spring-framework>
        <version.spring-boot>1.5.9.RELEASE</version.spring-boot>
        <version.spring-cloud-starter>1.3.2.RELEASE</version.spring-cloud-starter>
        <version.spring-cloud>1.4.2.RELEASE</version.spring-cloud>
        <version.spring-security>4.2.3.RELEASE</version.spring-security>
        <version.spring-oauth2>2.0.14.RELEASE</version.spring-oauth2>
        <version.spring-session>1.3.1.RELEASE</version.spring-session>
        <version.spring-session-hazelcast>2.0.1.RELEASE</version.spring-session-hazelcast>
        <version.spring-data-commons>1.13.9.RELEASE</version.spring-data-commons>
        <version.spring-data-hadoop>2.2.0.RELEASE</version.spring-data-hadoop>
        <version.spring-data-solr>2.1.3.RELEASE</version.spring-data-solr>
        <version.spring-data-redis>1.7.1.RELEASE</version.spring-data-redis>
        <version.spring-data-jpa>1.11.10.RELEASE</version.spring-data-jpa>
        <version.spring-kafka>1.0.5.RELEASE</version.spring-kafka>
        <version.commons-bean-utils>1.9.2</version.commons-bean-utils>
        <version.commons-codec>1.9</version.commons-codec>
        <version.commons-collections>3.2.1</version.commons-collections>
        <version.commons-compress>1.9</version.commons-compress>
        <version.commons-dbcp2>2.1.1</version.commons-dbcp2>
        <version.commons-dbutils>1.6</version.commons-dbutils>
        <version.commons-io>2.4</version.commons-io>
        <version.commons-lang3>3.2.1</version.commons-lang3>
        <version.commons-pool2>2.4.2</version.commons-pool2>
        <version.zookeeper>3.4.6</version.zookeeper>
        <version.hadoop-client>2.6.5</version.hadoop-client>
        <version.hbase-client>1.1.1</version.hbase-client>
        <version.solr>5.5.4</version.solr>
        <version.hibernate>4.3.11.Final</version.hibernate>
        <version.hibernate-validator>6.0.10.Final</version.hibernate-validator>
        <version.hibernate-jpa-api>1.0.0.Final</version.hibernate-jpa-api>
        <version.http-core>4.4.3</version.http-core>
        <version.http-client>4.5.1</version.http-client>
        <version.http-mime>4.5.1</version.http-mime>
        <version.io-dropwizard-metrics>3.1.2</version.io-dropwizard-metrics>
        <version.java>1.8</version.java>
        <version.jackson>2.6.6</version.jackson>
        <version.jedis>2.9.0</version.jedis>
        <version.jcl-over-slf4j>1.7.19</version.jcl-over-slf4j>
        <version.jul-over-slf4j>1.7.21</version.jul-over-slf4j>
        <version.joda-time>2.8.2</version.joda-time>
        <version.junit>4.12</version.junit>
        <version.logging>1.2</version.logging>
        <version.log4j>1.2.17</version.log4j>
        <version.log4j2>2.4.1</version.log4j2>
        <version.logback>1.1.7</version.logback>
        <version.mysql>5.1.45</version.mysql>
        <version.pinyin4j>2.5.0</version.pinyin4j>
        <version.quartz>2.2.3</version.quartz>
        <version.servlet-api>3.1.0</version.servlet-api>
        <version.slf4j>1.7.21</version.slf4j>
        <version.statsd-client>3.1.0</version.statsd-client>
        <version.swagger>2.7.0</version.swagger>
        <version.swagger-ui>2.7.0</version.swagger-ui>
        <version.thrift>0.9.1</version.thrift>
        <version.tomcat-embed>8.5.27</version.tomcat-embed>
        <version.websocket-api>1.1</version.websocket-api>
        <version.zip4j>1.3.2</version.zip4j>
        <version.poi>3.12</version.poi>
        <version.scala>2.10.6</version.scala>
        <version.elasticsearch>2.1.0</version.elasticsearch>
        <version.elasticsearch-sql>2.4.1.0</version.elasticsearch-sql>
        <version.jest>2.4.0</version.jest>
        <version.alibaba-druid>1.0.15</version.alibaba-druid>
        <version.feign>9.5.0</version.feign>
        <version.hystrix>1.5.10</version.hystrix>
        <version.archaius>0.7.5</version.archaius>
        <version.ehr>1.2.0</version.ehr>
        <version.eip>1.3.1</version.eip>
        <version.json>20160212</version.json>
        <version.json-lib>2.4</version.json-lib>
        <version.fastjson>1.2.17</version.fastjson>
        <version.commons-net>3.3</version.commons-net>
        <version.jxl>2.6</version.jxl>
        <version.fastdfs>1.27</version.fastdfs>
        <version.spring.boot.admin>1.5.7</version.spring.boot.admin>
        <version.jettison>1.3.7</version.jettison>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!--<dependency>-->
                <!--<groupId>org.springframework.boot</groupId>-->
                <!--<artifactId>spring-boot-dependencies</artifactId>-->
                <!--<version>1.5.9.RELEASE</version>-->
                <!--<type>pom</type>-->
                <!--<scope>import</scope>-->
            <!--</dependency>-->
            <!--<dependency>-->
                <!--<groupId>org.springframework.cloud</groupId>-->
                <!--<artifactId>spring-cloud-dependencies</artifactId>-->
                <!--<version>Finchley.M5</version>-->
                <!--<type>pom</type>-->
                <!--<scope>import</scope>-->
            <!--</dependency>-->
            <!-- Base library-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>${version.servlet-api}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${version.junit}</version>
                <scope>test</scope>
            </dependency>
            <!-- Spring framework family -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-messaging</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-oxm</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${version.spring-framework}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka -->
            <dependency>
                <groupId>org.springframework.kafka</groupId>
                <artifactId>spring-kafka</artifactId>
                <version>${version.spring-kafka}</version>
            </dependency>
            <!-- Spring boot family -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-actuator</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-aop</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-batch</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>${version.spring-boot}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-mongodb</artifactId>
                <version>${version.spring-boot}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Spring cloud family -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter</artifactId>
                <version>${version.spring-cloud-starter}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-config-server</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-archaius</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-netflix-eureka</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-feign</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zuul</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
                <version>${version.spring-cloud}</version>
            </dependency>
            <!-- Feign -->
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-core</artifactId>
                <version>${version.feign}</version>
            </dependency>
            <!-- Hystrix -->
            <dependency>
                <groupId>com.netflix.hystrix</groupId>
                <artifactId>hystrix-core</artifactId>
                <version>${version.hystrix}</version>
            </dependency>
            <!-- Archaius -->
            <dependency>
                <groupId>com.netflix.archaius</groupId>
                <artifactId>archaius-core</artifactId>
                <version>${version.archaius}</version>
            </dependency>
            <!-- Spring data family -->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-commons</artifactId>
                <version>${version.spring-data-commons}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-hadoop-hbase</artifactId>
                <version>${version.spring-data-hadoop}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-solr</artifactId>
                <version>${version.spring-data-solr}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Spring session family-->
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-hazelcast</artifactId>
                <version>${version.spring-session-hazelcast}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session</artifactId>
                <version>${version.spring-session}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
                <version>${version.spring-session}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Spring Security -->
            <!--<dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-config</artifactId>
                <version>${version.spring-security}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>${version.spring-security}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-crypto</artifactId>
                <version>${version.spring-security}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
                <version>${version.spring-security}</version>
                <scope>${dependency.scope}</scope>
            </dependency>-->
            <!-- Oauth2 -->
            <dependency>
                <groupId>org.springframework.security.oauth</groupId>
                <artifactId>spring-security-oauth2</artifactId>
                <version>${version.spring-oauth2}</version>
                <scope>${dependency.scope}</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.security</groupId>
                        <artifactId>*</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--Jackson library -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>${version.jackson}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>${version.jackson}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${version.jackson}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Http library -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
                <version>${version.http-core}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>${version.http-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpmime</artifactId>
                <version>${version.http-mime}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!--Apache commons library -->
            <dependency>
                <groupId>org.codehaus.woodstox</groupId>
                <artifactId>stax2-api</artifactId>
                <version>3.1.4</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.codehaus.woodstox</groupId>
                <artifactId>woodstox-core-asl</artifactId>
                <version>4.4.1</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.noggit</groupId>
                <artifactId>noggit</artifactId>
                <version>0.6</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${version.commons-lang3}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>${version.poi}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>${version.commons-bean-utils}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
                <version>${version.commons-pool2}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>commons-dbutils</groupId>
                <artifactId>commons-dbutils</artifactId>
                <version>${version.commons-dbutils}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-dbcp2</artifactId>
                <version>${version.commons-dbcp2}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${version.commons-io}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
                <version>${version.commons-collections}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>${version.commons-codec}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-compress</artifactId>
                <version>${version.commons-compress}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Mysql library -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${version.mysql}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Hibernate framework library -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>${version.hibernate}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>${version.hibernate-validator}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>${version.hibernate}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.hibernate.javax.persistence</groupId>
                <artifactId>hibernate-jpa-2.1-api</artifactId>
                <version>${version.hibernate-jpa-api}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Zookeeper library -->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>${version.zookeeper}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Hadoop library -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-annotations</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-auth</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-distcp</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-mapreduce-client-common</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-mapreduce-client-core</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-mapreduce-client-shuffle</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-streaming</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-yarn-api</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-yarn-client</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-yarn-common</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-yarn-server-common</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-yarn-server-nodemanager</artifactId>
                <version>${version.hadoop-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-client</artifactId>
                <version>${version.hbase-client}</version>
                <scope>${dependency.scope}</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.apache.hadoop</groupId>
                        <artifactId>*</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-common</artifactId>
                <version>${version.hbase-client}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-protocol</artifactId>
                <version>${version.hbase-client}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- export library -->
            <dependency>
                <groupId>net.sourceforge.jexcelapi</groupId>
                <artifactId>jxl</artifactId>
                <version>${version.jxl}</version>
            </dependency>
            <!-- Google library -->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>18.0</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.findbugs</groupId>
                <artifactId>jsr305</artifactId>
                <version>3.0.1</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.6.2</version>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>2.5.0</version>
            </dependency>
            <dependency>
                <groupId>com.google.inject</groupId>
                <artifactId>guice</artifactId>
                <version>4.1.0</version>
            </dependency>
            <!-- Solr library -->
            <dependency>
                <groupId>org.apache.solr</groupId>
                <artifactId>solr-core</artifactId>
                <version>${version.solr}</version>
                <scope>${dependency.scope}</scope>
                <exclusions>
                    <exclusion>
                        <groupId>commons-lang</groupId>
                        <artifactId>commons-lang</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.solr</groupId>
                <artifactId>solr-solrj</artifactId>
                <version>${version.solr}</version>
                <exclusions>
                    <exclusion>
                        <groupId>commons-lang</groupId>
                        <artifactId>commons-lang</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- Elasticsearch -->
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>${version.elasticsearch}</version>
            </dependency>
            <dependency>
                <groupId>org.nlpcn</groupId>
                <artifactId>elasticsearch-sql</artifactId>
                <version>${version.elasticsearch-sql}</version>
            </dependency>
            <!-- Jest -->
            <dependency>
                <groupId>io.searchbox</groupId>
                <artifactId>jest</artifactId>
                <version>${version.jest}</version>
            </dependency>
            <!-- Redis library -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>${version.jedis}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- FastDFS library -->
            <dependency>
                <groupId>org.csource</groupId>
                <artifactId>fastdfs-client-java</artifactId>
                <version>${version.fastdfs}</version>
            </dependency>
            <!-- Quartz library -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>${version.quartz}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz-jobs</artifactId>
                <version>${version.quartz}</version>
            </dependency>
            <!-- Zip library -->
            <dependency>
                <groupId>net.lingala.zip4j</groupId>
                <artifactId>zip4j</artifactId>
                <version>${version.zip4j}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Pinyin library -->
            <dependency>
                <groupId>com.belerweb</groupId>
                <artifactId>pinyin4j</artifactId>
                <version>${version.pinyin4j}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Swagger-ui library -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${version.swagger}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${version.swagger-ui}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- date Time util library -->
            <dependency>
                <groupId>joda-time</groupId>
                <artifactId>joda-time</artifactId>
                <version>${version.joda-time}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.thrift</groupId>
                <artifactId>libthrift</artifactId>
                <version>${version.thrift}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>com.timgroup</groupId>
                <artifactId>java-statsd-client</artifactId>
                <version>${version.statsd-client}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>io.dropwizard.metrics</groupId>
                <artifactId>metrics-core</artifactId>
                <version>${version.io-dropwizard-metrics}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Log framework library -->
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
                <version>${version.logging}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${version.log4j}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>${version.slf4j}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${version.logback}</version>
                <scope>${dependency.scope}</scope>
            </dependency>
            <!-- Alibaba -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${version.alibaba-druid}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${version.fastjson}</version>
            </dependency>
            <!-- Spring Boot Admin -->
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-server</artifactId>
                <version>${version.spring.boot.admin}</version>
            </dependency>
            <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-server-ui</artifactId>
                <version>${version.spring.boot.admin}</version>
            </dependency>
            <!-- Extend library-->
            <dependency>
                <groupId>org.codehaus.jettison</groupId>
                <artifactId>jettison</artifactId>
                <version>${version.jettison}</version>
            </dependency>
            <dependency>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
                <version>${version.json}</version>
            </dependency>
            <dependency>
                <groupId>net.sf.json-lib</groupId>
                <artifactId>json-lib</artifactId>
                <version>${version.json-lib}</version>
            </dependency>
            <dependency>
                <groupId>commons-net</groupId>
                <artifactId>commons-net</artifactId>
                <version>${version.commons-net}</version>
            </dependency>
            <!-- 个推相关 -->
            <dependency>
                <groupId>com.gexin.platform</groupId>
                <artifactId>gexin-rp-sdk-http</artifactId>
                <version>4.0.1.17</version>
            </dependency>
            <dependency>
                <groupId>com.gexin.platform</groupId>
                <artifactId>gexin-rp-fastjson</artifactId>
                <version>1.0.0.1</version>
            </dependency>
            <dependency>
                <groupId>com.gexin.platform</groupId>
                <artifactId>gexin-rp-sdk-base</artifactId>
                <version>4.0.0.22</version>
            </dependency>
            <dependency>
                <groupId>com.gexin.platform</groupId>
                <artifactId>gexin-rp-sdk-template</artifactId>
                <version>4.0.0.16</version>
            </dependency>
            <dependency>
                <groupId>com.gexin.platform</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>2.5.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <repositories>
        <repository>
            <id>public</id>
            <name>public</name>
            <url>http://172.19.103.43:8081/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>public</name>
            <url>http://172.19.103.43:8081/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
    <build>
        <extensions>
            <extension>
                <groupId>org.apache.maven.wagon</groupId>
                <artifactId>wagon-ssh</artifactId>
                <version>2.10</version>
            </extension>
            <extension>
                <groupId>org.apache.maven.wagon</groupId>
                <artifactId>wagon-http-lightweight</artifactId>
                <version>2.10</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <compilerArguments>
                        <verbose/>
                        <bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
                    </compilerArguments>
                </configuration>
                <version>3.1</version>
            </plugin>
        </plugins>
    </build>
</project>

+ 606 - 0
ehr-ms-parent-pom/pom.xml

@ -0,0 +1,606 @@
<?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>
    <parent>
        <groupId>com.yihu.ehr</groupId>
        <artifactId>ehr-cloud</artifactId>
        <version>1.2.0</version>
        <relativePath>../ehr-cloud/pom.xml</relativePath>
    </parent>
    <artifactId>ehr-ms-parent-pom</artifactId>
    <packaging>pom</packaging>
    <description>EHR micro service parent pom</description>
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.jooq</groupId>
                    <artifactId>jooq-codegen-maven</artifactId>
                    <version>${jooq.version}</version>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.7</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.5.1</version>
                    <configuration>
                        <recompressZippedFiles>false</recompressZippedFiles>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>2.5</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>2.8.2</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.10</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-eclipse-plugin</artifactId>
                    <version>2.9</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <version>2.18</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>2.5.2</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-help-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.5</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-javadoc-plugin</artifactId>
                    <version>2.10.1</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.7</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.3</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.3</version>
                    <dependencies>
                        <dependency>
                            <groupId>org.apache.maven.doxia</groupId>
                            <artifactId>doxia-module-markdown</artifactId>
                            <version>1.5</version>
                        </dependency>
                    </dependencies>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>2.4</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.18.1</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.5</version>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>build-helper-maven-plugin</artifactId>
                    <version>1.9.1</version>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <version>1.3.2</version>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>versions-maven-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
                <plugin>
                    <groupId>pl.project13.maven</groupId>
                    <artifactId>git-commit-id-plugin</artifactId>
                    <version>2.1.11</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${version.spring-boot}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.17</version>
                <executions>
                    <execution>
                        <id>checkstyle-validation</id>
                        <phase>validate</phase>
                        <configuration>
                            <skip>true</skip>
                            <configLocation>src/checkstyle/checkstyle.xml</configLocation>
                            <suppressionsLocation>src/checkstyle/checkstyle-suppressions.xml</suppressionsLocation>
                            <headerLocation>src/checkstyle/checkstyle-header.txt</headerLocation>
                            <propertyExpansion>checkstyle.build.directory=${project.build.directory}</propertyExpansion>
                            <encoding>UTF-8</encoding>
                            <consoleOutput>true</consoleOutput>
                            <failsOnError>true</failsOnError>
                            <includeTestSourceDirectory>true</includeTestSourceDirectory>
                        </configuration>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${version.java}</source>
                    <target>${version.java}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>1.4</version>
                <executions>
                    <execution>
                        <id>enforce-rules</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <requireJavaVersion>
                                    <version>[1.8,)</version>
                                </requireJavaVersion>
                                <!--<requireProperty>
                                    <property>main.basedir</property>
                                </requireProperty>-->
                                <!--<requireProperty>
                                    <property>project.organization.name</property>
                                </requireProperty>-->
                                <!--<requireProperty>
                                    <property>project.name</property>
                                </requireProperty>-->
                                <!--<requireProperty>
                                    <property>project.description</property>
                                </requireProperty>-->
                            </rules>
                            <fail>true</fail>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                    <excludes>
                        <exclude>**/Abstract*.java</exclude>
                    </excludes>
                    <!--<systemPropertyVariables>-->
                    <!--<java.security.egd>file:/dev/./urandom</java.security.egd>-->
                    <!--<java.awt.headless>true</java.awt.headless>-->
                    <!--</systemPropertyVariables>-->
                    <argLine>-Xmx1024m</argLine>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar-no-fork</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!--<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>animal-sniffer-maven-plugin</artifactId>
                <configuration>
                    <skip>${disable.checks}</skip>
                    <signature>
                        <groupId>org.codehaus.mojo.signature</groupId>
                        <artifactId>java16</artifactId>
                        <version>1.0</version>
                    </signature>
                    <annotations>
                        <annotation>org.springframework.lang.UsesJava8</annotation>
                        <annotation>org.springframework.lang.UsesJava7</annotation>
                        <annotation>org.springframework.boot.lang.UsesUnsafeJava</annotation>
                    </annotations>
                </configuration>
                <executions>
                    <execution>
                        <id>enforce-java-6</id>
                        <phase>test</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>-->
        </plugins>
    </build>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-admin-gateway-model</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-data-elasticsearch</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-data-fastdfs</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-data-hbase</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-data-mysql</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-data-query</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-data-redis</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-data-solr</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-ehr-constants</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-entity</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <!--<dependency>-->
            <!--<groupId>com.yihu.ehr</groupId>-->
            <!--<artifactId>commons-metrics</artifactId>-->
            <!--<version>${version.ehr}</version>-->
            <!--</dependency>-->
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-profile-core</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-redis-mq</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-rest-model</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.hos</groupId>
                <artifactId>common-rest-model</artifactId>
                <version>${version.eip}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-ui-swagger</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-util</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-web</artifactId>
                <version>${version.ehr}</version>
            </dependency>
            <!--<dependency>
                <groupId>com.yihu.ehr</groupId>
                <artifactId>commons-metrics</artifactId>
                <version>${version.ehr}</version>
            </dependency>-->
        </dependencies>
    </dependencyManagement>
    <!--
    profiles分为三种场景(dev,test,prod),三种部署模式(jar,war,docker).预计是9种模式,
    但目前仅使用到dev,test,prod的jar,test的war.若有需要可以组合配置这些部署模式.
    - dev的可执行jar包,在本机调试,不需要配置wagon参数。
    - test,prod的可执行jar包,需要在编译后传送到服务器上部署,故需配置wagon参数,参数可根据服务需要自行配置。
    - dev,test,prod的war包,编译后使用tomcat api部署,故需配置tomcat参数,参数可根据服务需要自行配置。
    -->
    <profiles>
        <profile>
            <id>dev-jar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <skipTests>true</skipTests>
                <packaging.type>jar</packaging.type>
                <dependency.scope>compile</dependency.scope>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </dependency>
                <!--<dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-devtools</artifactId>
                    <scope>${dependency.scope}</scope>
                </dependency>-->
            </dependencies>
        </profile>
        <profile>
            <id>test-jar</id>
            <properties>
                <skipTests>true</skipTests>
                <packaging.type>jar</packaging.type>
                <dependency.scope>compile</dependency.scope>
                <wagonServerId/>
                <wagonUrl/>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>wagon-maven-plugin</artifactId>
                        <version>1.0</version>
                        <configuration>
                            <serverId>${wagonServerId}</serverId>
                            <fromFile>${project.build.directory}/${project.build.finalName}.jar</fromFile>
                            <url>${wagonUrl}</url>
                            <commands>
                                <command>pkill -f ${project.build.finalName}.jar</command>
                                <command>nohub java -Djava.security.egd=file:/dev/./urandom -jar
                                    ${project.build.finalName}.jar &amp;
                                </command>
                            </commands>
                            <displayCommandOutputs>true</displayCommandOutputs>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
            <dependencies>
                <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>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-devtools</artifactId>
                    <scope>${dependency.scope}</scope>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>test-war</id>
            <activation>
                <property>
                    <name>spring.profiles.active</name>
                    <value>default,test</value>
                </property>
            </activation>
            <properties>
                <skipTests>true</skipTests>
                <packaging.type>war</packaging.type>
                <dependency.scope>provided</dependency.scope>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <scope>${dependency.scope}</scope>
                    <exclusions>
                        <exclusion>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-logging</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>${dependency.scope}</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-devtools</artifactId>
                    <scope>${dependency.scope}</scope>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.tomcat.maven</groupId>
                        <artifactId>tomcat7-maven-plugin</artifactId>
                        <version>2.2</version>
                        <configuration>
                            <url>http://localhost:8080/manager/text</url>
                            <server>tomcat8</server>
                            <username>deployer</username>
                            <password>jkzldeployer</password>
                            <path>/${project.artifactId}</path>
                            <update>true</update>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>prod-jar</id>
            <activation>
                <property>
                    <name>spring.profiles.active</name>
                    <value>default,prod</value>
                </property>
            </activation>
            <properties>
                <skipTests>true</skipTests>
                <packaging.type>war</packaging.type>
                <dependency.scope>compile</dependency.scope>
                <wagonServerId>11.1.2.21</wagonServerId>
                <wagonUrl>scp://user:password@11.1.2.21/home/root/ehr-release</wagonUrl>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <scope>${dependency.scope}</scope>
                    <exclusions>
                        <exclusion>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-logging</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>prod-war</id>
            <properties>
                <skipTests>true</skipTests>
                <packaging.type>war</packaging.type>
                <dependency.scope>provided</dependency.scope>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                    <scope>${dependency.scope}</scope>
                    <exclusions>
                        <exclusion>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-starter-logging</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <scope>${dependency.scope}</scope>
                </dependency>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-devtools</artifactId>
                    <scope>${dependency.scope}</scope>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

+ 113 - 0
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>
    <parent>
        <groupId>com.yihu.ehr</groupId>
        <artifactId>ehr-ms-parent-pom</artifactId>
        <version>1.2.0</version>
        <relativePath>ehr-ms-parent-pom/pom.xml</relativePath>
    </parent>
    <artifactId>svr-pack-mgr</artifactId>
    <!--<packaging>${packaging.type}</packaging>-->
    <packaging>war</packaging>
    <properties>
        <wagonServerId>192.168.1.220</wagonServerId>
        <wagonUrl>scp://sand:timeneverstop@192.168.1.221/home/sand/ehr-release</wagonUrl>
    </properties>
    <dependencies>
        <!-- true -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <!-- actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.timgroup</groupId>
            <artifactId>java-statsd-client</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-ehr-constants</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-util</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-data-mysql</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-rest-model</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-data-redis</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-data-fastdfs</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-web</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-ui-swagger</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.ehr</groupId>
            <artifactId>commons-profile-core</artifactId>
        </dependency>
    </dependencies>
</project>

File diff suppressed because it is too large
+ 43 - 0
readme.md


+ 35 - 0
src/main/java/com/yihu/ehr/SvrPackMgr.java

@ -0,0 +1,35 @@
package com.yihu.ehr;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@EnableAutoConfiguration(exclude = {
        SecurityAutoConfiguration.class})
@ComponentScan
@EnableDiscoveryClient
@EnableFeignClients
@EnableScheduling
@EnableAsync
@SpringBootApplication
public class SvrPackMgr extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(SvrPackMgr.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SvrPackMgr.class);
    }
}

+ 27 - 0
src/main/java/com/yihu/ehr/pack/config/TenantConfiguration.java

@ -0,0 +1,27 @@
package com.yihu.ehr.pack.config;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 *   ehr使用 feginClient 调用eip(涉及到app应用,标准等) 时,需要此类,增加请求头信息
 */
@Configuration
public class TenantConfiguration {
    @Value("${eip.tenant}")
    private String tenant;
    @Bean
    public RequestInterceptor tenantInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                requestTemplate.header("tenant_name", tenant);
            }
        };
    }
}

+ 169 - 0
src/main/java/com/yihu/ehr/pack/controller/DatasetPackageEndPoint.java

@ -0,0 +1,169 @@
package com.yihu.ehr.pack.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.yihu.ehr.constants.*;
import com.yihu.ehr.controller.EnvelopRestEndPoint;
import com.yihu.ehr.exception.ApiException;
import com.yihu.ehr.model.app.MApp;
import com.yihu.ehr.model.packs.MPackage;
import com.yihu.ehr.pack.feign.AppClient;
import com.yihu.ehr.pack.entity.DatasetPackage;
import com.yihu.ehr.pack.service.DatasetPackageService;
import com.yihu.ehr.profile.ArchiveStatus;
import com.yihu.ehr.profile.queue.RedisCollection;
import com.yihu.ehr.util.datetime.DateUtil;
import com.yihu.ehr.util.encrypt.MD5;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
/**
 * 非病人维度档案包控制器。
 *
 * @author HZY
 * @version 1.0
 */
@RestController
@RequestMapping(ApiVersion.Version1_0)
@Api(value = "package_service", description = "档案包服务(非病人维度兼容)", tags = {"档案包服务-档案包服务(非病人维度兼容)"})
public class DatasetPackageEndPoint extends EnvelopRestEndPoint {
    @Autowired
    private DatasetPackageService datasetPackService;
    @Autowired
    private AppClient appClient;
    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;
    @RequestMapping(value = ServiceApi.DatasetPackages.AcquirePackage, method = RequestMethod.GET)
    @ApiOperation(value = "处理档案包(更新状态)")
    public String acquirePackage(
            @ApiParam(name = "id", value = "档案包编号", defaultValue = "")
            @RequestParam(required = false) String id) throws Exception {
        String re = "";
        DatasetPackage aPackage = datasetPackService.acquirePackage(id);
        if(aPackage!=null)
        {
            re = objectMapper.writeValueAsString(aPackage);
        }
        return re;
    }
    @RequestMapping(value = ServiceApi.DatasetPackages.Package, method = RequestMethod.GET)
    @ApiOperation(value = "获取档案包", notes = "获取档案包的信息,若ID为OLDEST,则获取最早,还没解析的档案包")
    public ResponseEntity<MPackage> getPackage(
            @ApiParam(name = "id", value = "档案包编号", defaultValue = "OLDEST")
            @PathVariable(value = "id") String id) throws IOException {
        DatasetPackage aPackage = datasetPackService.getPackage(id);
        if (aPackage == null) return new ResponseEntity<>((MPackage) new MPackage(), HttpStatus.NOT_FOUND);
        return new ResponseEntity<>(convertToModel(aPackage, MPackage.class), HttpStatus.OK);
    }
    @RequestMapping(value = ServiceApi.DatasetPackages.Package, method = {RequestMethod.PUT})
    @ApiOperation(value = "修改档案包状态", notes = "修改档案包状态")
    public ResponseEntity<MPackage> reportStatus(@ApiParam(value = "档案包编号")
                                                 @PathVariable(value = "id") String id,
                                                 @ApiParam(value = "状态")
                                                 @RequestParam(value = "status") ArchiveStatus status,
                                                 @ApiParam(value = "消息")
                                                 @RequestBody String message) throws Exception {
        DatasetPackage aPackage = datasetPackService.getPackage(id);
        if (aPackage == null) return new ResponseEntity<>((MPackage) null, HttpStatus.NOT_FOUND);
        aPackage.setArchiveStatus(status);
        //资源化状态,0未入库 1已入库
        aPackage.setResourced(true);
        aPackage.setMessage(message);
        if (status == ArchiveStatus.Finished) {
            //入库成功
            Map<String,String> map = objectMapper.readValue(message,Map.class);
            aPackage.setEventType(map.get("eventType"));
            aPackage.setEventNo(map.get("eventNo"));
            aPackage.setEventDate(DateUtil.strToDate(map.get("eventDate")));
            aPackage.setPatientId(map.get("patientId"));
            aPackage.setFinishDate(new Date());
        }
        else if(status == ArchiveStatus.Acquired)
        {
            aPackage.setParseDate(new Date()); //入库执行时间
        }
        else {
            aPackage.setFinishDate(null);
        }
        datasetPackService.save(aPackage);
        return new ResponseEntity<>((MPackage) null, HttpStatus.OK);
    }
    @RequestMapping(value = ServiceApi.DatasetPackages.Package, method = {RequestMethod.DELETE})
    @ApiOperation(value = "删除档案包", response = Object.class, notes = "删除一个数据包")
    public void deletePackage(@ApiParam(name = "id", value = "档案包编号")
                              @PathVariable(value = "id") String id) {
        datasetPackService.deletePackage(id);
    }
    //zip包密码规则:MD5(secret+packPwdSeed+secret)
    @RequestMapping(value = ServiceApi.DatasetPackages.Packages, method = RequestMethod.POST)
    @ApiOperation(value = "接收档案(兼容非病人维度)", notes = "支持数非健康档案维度的数据包接收")
    public DatasetPackage savePackageForGateway(
            @ApiParam(name = "pack", value = "档案包", allowMultiple = true)
            @RequestPart() MultipartFile pack,
            @ApiParam(name = "orgCode", value = "机构代码")
            @RequestParam(value = "orgCode") String orgCode,
            @ApiParam(name = "packPwdSeed", value = "档案包密码种子")
            @RequestParam(value = "packPwdSeed") String packPwdSeed,
            @ApiParam(name = "md5", value = "档案包MD5")
            @RequestParam(value = "md5", required = false) String md5,
            @ApiParam(name = "appKey", value = "应用ID,用于获取secret生成包密码")
            @RequestParam(value = "appKey", required = false) String appKey,
            HttpServletRequest request) throws JsonProcessingException {
        MApp app = appClient.getApp(appKey);
        String secret = null;
        if (app != null && !StringUtils.isEmpty(app.getSecret())){
            secret = app.getSecret();
        } else {
            throw new ApiException(ErrorCode.FORBIDDEN, "Invalid app key, maybe you used the error appKey?");
        }
        DatasetPackage aPackage =null;
        try {
            String password = MD5.hash(secret+packPwdSeed+secret);//MD5 生成zip包密码
            aPackage = datasetPackService.receiveDatasets(pack.getInputStream(), password, md5, orgCode, getClientId(request));
        } catch (Exception ex) {
            throw new ApiException(ErrorCode.FORBIDDEN, "javax.crypto.BadPaddingException." + ex.getMessage());
        }
        redisTemplate.opsForList().leftPush(RedisCollection.AnalyzeQueue, objectMapper.writeValueAsString(aPackage));
        //messageBuffer.putMessage(convertToModel(aPackage, MPackage.class));
        return aPackage;
    }
    @RequestMapping(value = ServiceApi.Apps.App, method = RequestMethod.GET)
    @ApiOperation(value = "获取App")
    public MApp getApp(
            @ApiParam(name = "app_id", value = "id")
            @PathVariable(value = "app_id") String appId) throws Exception {
        MApp app = appClient.getApp(appId);
        return app;
    }
}

+ 497 - 0
src/main/java/com/yihu/ehr/pack/controller/PackageEndPoint.java

@ -0,0 +1,497 @@
package com.yihu.ehr.pack.controller;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.ErrorCode;
import com.yihu.ehr.constants.ServiceApi;
import com.yihu.ehr.controller.EnvelopRestEndPoint;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.exception.ApiException;
import com.yihu.ehr.fastdfs.FastDFSUtil;
import com.yihu.ehr.model.packs.EsDetailsPackage;
import com.yihu.ehr.model.packs.EsSimplePackage;
import com.yihu.ehr.model.security.MKey;
import com.yihu.ehr.pack.feign.SecurityClient;
import com.yihu.ehr.pack.service.RedisService;
import com.yihu.ehr.pack.task.FastDFSTask;
import com.yihu.ehr.profile.AnalyzeStatus;
import com.yihu.ehr.profile.ArchiveStatus;
import com.yihu.ehr.profile.queue.RedisCollection;
import com.yihu.ehr.util.encrypt.RSA;
import com.yihu.ehr.util.rest.Envelop;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
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.data.domain.Page;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 档案包控制器。
 *
 * @author Sand
 * @version 1.0
 */
@RestController
@RequestMapping(ApiVersion.Version1_0)
@Api(value = "PackageEndPoint", description = "档案包", tags = {"档案包服务-档案包"})
public class PackageEndPoint extends EnvelopRestEndPoint {
    private static final Logger logger = LoggerFactory.getLogger(PackageEndPoint.class);
    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static final String INDEX = "json_archives";
    private static final String TYPE = "info";
    private static final Integer PAGE_SIZE = 1000;
    @Value("${deploy.region}")
    private Short adminRegion;
    @Autowired
    private SecurityClient securityClient;
    @Autowired
    private FastDFSUtil fastDFSUtil;
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;
    @Autowired
    private FastDFSTask fastDFSTask;
    @Autowired
    private RedisService redisService;
   /* @Autowired
    private JsonArchivesService jsonArchivesService;*/
    @RequestMapping(value = ServiceApi.Packages.Packages, method = RequestMethod.POST)
    @ApiOperation(value = "接收档案", notes = "从集成开放平台接收健康档案数据包")
    public boolean savePackageWithOrg (
            @ApiParam(name = "pack", value = "档案包", allowMultiple = true)
            @RequestPart() MultipartFile pack,
            @ApiParam(name = "org_code", value = "机构代码")
            @RequestParam(value = "org_code") String orgCode,
            @ApiParam(name = "package_crypto", value = "档案包解压密码,二次加密")
            @RequestParam(value = "package_crypto") String packageCrypto,
            @ApiParam(name = "md5", value = "档案包MD5")
            @RequestParam(value = "md5", required = false) String md5,
            @ApiParam(name = "packType", value = "包类型 默认为1(结构化) 1结构化档案,2文件档案,3链接档案,4数据集档案")
            @RequestParam(value = "packType", required = false) Integer packType,
            HttpServletRequest request) throws Exception {
        MKey key = securityClient.getOrgKey(orgCode);
        if (key == null || key.getPrivateKey() == null) {
            throw new ApiException(HttpStatus.FORBIDDEN, ErrorCode.FORBIDDEN, "Invalid private key, maybe you miss the organization code?");
        }
        String password;
        try {
            password = RSA.decrypt(packageCrypto, RSA.genPrivateKey(key.getPrivateKey()));
        } catch (Exception ex) {
            throw new ApiException(HttpStatus.FORBIDDEN, ErrorCode.FORBIDDEN, "javax.crypto.BadPaddingException." + ex.getMessage());
        }
        String clientId = getClientId(request);
        if (packType == null){
            packType = 1;
        }
        //更改成异步--->>防止大文件接收,导致阻塞,超时等问题
        fastDFSTask.savePackageWithOrg(pack.getInputStream(), password, orgCode, md5, clientId, packType);
        return true;
    }
    @RequestMapping(value = ServiceApi.Packages.Packages, method = RequestMethod.DELETE)
    @ApiOperation(value = "批量删除档案包", notes = "每次删除一万条记录")
    public boolean deletePackages(
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "count", value = "删除数量", required = true, defaultValue = "10000")
            @RequestParam(value = "count") Integer count) throws Exception {
        if (count > 10000) {
            count = 10000;
        }
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, filters, 1, count);
        List<String> idList = new ArrayList<>();
        for (Map<String, Object> temp : result) {
            String [] tokens =  String.valueOf(temp.get("remote_path")).split(":");
            fastDFSUtil.delete(tokens[0], tokens[1]);
            idList.add(String.valueOf(temp.get("_id")));
        }
        if (idList.size() > 0) {
            String [] _id = new String[idList.size()];
            elasticSearchUtil.bulkDelete(INDEX, TYPE, idList.toArray(_id));
        }
        return true;
    }
    @RequestMapping(value = ServiceApi.Packages.PackagesByFilter, method = RequestMethod.DELETE)
    @ApiOperation(value = "批量删除档案包")
    public boolean deletePackages(
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件,慎用!最好先条件查询,确定是否是需要删除的数据")
            @RequestParam(value = "filters", required = false) String filters) throws Exception {
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, filters, 1, 10000);
        while (CollectionUtils.isNotEmpty(result.getContent())){
            List<String> idList = new ArrayList<>();
            for (Map<String, Object> temp : result.getContent()) {
                String [] tokens =  String.valueOf(temp.get("remote_path")).split(":");
                fastDFSUtil.delete(tokens[0], tokens[1]);
                idList.add(String.valueOf(temp.get("_id")));
            }
            if (idList.size() > 0) {
                String [] _id = new String[idList.size()];
                elasticSearchUtil.bulkDelete(INDEX, TYPE, idList.toArray(_id));
            }
            result = elasticSearchUtil.page(INDEX, TYPE, filters, 1, 10000);
        }
        return true;
    }
    @RequestMapping(value = ServiceApi.Packages.Package, method = RequestMethod.DELETE)
    @ApiOperation(value = "删除单个档案包", notes = "删除一个数据包")
    public boolean deletePackage (
            @ApiParam(name = "id", value = "档案包编号")
            @PathVariable(value = "id") String id) throws Exception {
        Map<String, Object> source = elasticSearchUtil.findById(INDEX, TYPE, id);
        if (null == source) {
            return false;
        }
        String [] tokens =  String.valueOf(source.get("remote_path")).split(":");
        fastDFSUtil.delete(tokens[0], tokens[1]);
        elasticSearchUtil.delete(INDEX, TYPE, id);
        return true;
    }
    @RequestMapping(value = ServiceApi.Packages.Analyze, method = RequestMethod.PUT)
    @ApiOperation(value = "更新档案包分析状态", notes = "更新档案包分析状态")
    public boolean analyzeStatus(
            @ApiParam(name = "id", value = "档案包编号", required = true)
            @PathVariable(value = "id") String id,
            @ApiParam(name = "status", value = "状态", required = true)
            @RequestParam(value = "status") AnalyzeStatus status,
            @ApiParam(name = "errorType", value = "错误类型(0 = 正常; -1 = 质控服务出错; -2 解析服务出错; 1 = 压缩包有误; 2 = Json文件有误; 3 = Json数据有误)", required = true)
            @RequestParam(value = "errorType") int errorType,
            @ApiParam(name = "message", value = "消息", required = true)
            @RequestBody String message) throws Exception {
        Map<String, Object> updateSource = new HashMap<>();
        if (status == AnalyzeStatus.Failed) {
            if (3 <= errorType && errorType <= 7) {
                updateSource.put("analyze_fail_count", 3);
            } else {
                Map<String, Object> sourceMap = elasticSearchUtil.findById(INDEX, TYPE, id);
                if (null == sourceMap) {
                    return false;
                }
                if ((int)sourceMap.get("analyze_fail_count") < 3) {
                    int failCount = (int)sourceMap.get("analyze_fail_count");
                    updateSource.put("analyze_fail_count", failCount + 1);
                }
            }
        } else if (status == AnalyzeStatus.Acquired) {
            updateSource.put("analyze_date", dateFormat.format(new Date()));
        }
        updateSource.put("message", message);
        updateSource.put("error_type", errorType);
        updateSource.put("analyze_status", status.ordinal());
        elasticSearchUtil.voidUpdate(INDEX, TYPE, id, updateSource);
        return true;
    }
    @RequestMapping(value = ServiceApi.Packages.Resolve, method = {RequestMethod.PUT})
    @ApiOperation(value = "更新档案包解析状态", notes = "更新档案包解析状态")
    public boolean resolveStatus(
            @ApiParam(name = "id", value = "档案包编号", required = true)
            @PathVariable(value = "id") String id,
            @ApiParam(name = "status", value = "状态", required = true)
            @RequestParam(value = "status") ArchiveStatus status,
            @ApiParam(name = "errorType", value = "错误类型(0 = 正常; -1 = 质控服务出错; -2 解析服务出错; 1 = 压缩包有误; 2 = Json文件有误; 3 = Json数据有误)", required = true)
            @RequestParam(value = "errorType") int errorType,
            @ApiParam(name = "message", value = "消息", required = true)
            @RequestBody String message) throws Exception {
        Map<String, Object> updateSource = new HashMap<>();
        if (status == ArchiveStatus.Finished) {
            //入库成功
            Map<String, String> map = objectMapper.readValue(message, Map.class);
            updateSource.put("profile_id", map.get("profile_id"));
            updateSource.put("demographic_id", map.get("demographic_id"));
            updateSource.put("event_type", map.get("event_type"));
            updateSource.put("event_no", map.get("event_no"));
            updateSource.put("event_date", map.get("event_date"));
            updateSource.put("patient_id", map.get("patient_id"));
            updateSource.put("dept", map.get("dept"));
            updateSource.put("delay",  map.get("delay"));
            updateSource.put("re_upload_flg", map.get("re_upload_flg"));
            updateSource.put("finish_date", dateFormat.format(new Date()));
            updateSource.put("message", "resolve success");
            updateSource.put("resourced", 1);
            updateSource.put("defect", map.get("defect"));
            updateSource.put("patient_name", map.get("patient_name"));
        } else if (status == ArchiveStatus.Acquired) {
            //开始入库
            updateSource.put("parse_date", dateFormat.format(new Date()));
            updateSource.put("message", message);
        } else {
            //入库失败
            updateSource.put("finish_date", null);
            if (3 <= errorType && errorType <= 7) {
                updateSource.put("fail_count", 3);
            } else {
                Map<String, Object> sourceMap = elasticSearchUtil.findById(INDEX, TYPE, id);
                if (null == sourceMap) {
                    return false;
                }
                if ((int)sourceMap.get("fail_count") < 3) {
                    int failCount = (int)sourceMap.get("fail_count");
                    updateSource.put("fail_count", failCount + 1);
                }
            }
            updateSource.put("message", message);
            updateSource.put("resourced", 0);
        }
        updateSource.put("error_type", errorType);
        updateSource.put("archive_status", status.ordinal());
        elasticSearchUtil.voidUpdate(INDEX, TYPE, id, updateSource);
        return true;
    }
    @RequestMapping(value = ServiceApi.Packages.Analyzes, method = RequestMethod.PUT)
    @ApiOperation(value = "根据条件批量修改档案包质控状态", notes = "根据条件批量修改档案包质控状态")
    public Integer updateAnalyzer (
            @ApiParam(name = "filters", value = "条件", required = true)
            @RequestParam(value = "filters") String filters,
            @ApiParam(name = "status", value = "状态", required = true)
            @RequestParam(value = "status") AnalyzeStatus status,
            @ApiParam(name = "page", value = "消息", required = true)
            @RequestParam(value = "page") Integer page,
            @ApiParam(name = "size", value = "状态", required = true)
            @RequestParam(value = "size") Integer size) throws Exception {
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, filters, page, size);
        List<Map<String, Object>> updateSourceList = new ArrayList<>();
        final int _status = status.ordinal();
        result.forEach(item -> {
            Map<String, Object> updateSource = new HashMap<>();
            updateSource.put("_id", item.get("_id"));
            updateSource.put("analyze_status", status.ordinal());
            if (_status == 2) {
                updateSource.put("analyze_fail_count", 3);
            } else if(_status == 0){
                updateSource.put("analyze_fail_count", 0);
                updateSource.put("analyze_status",0);
                updateSource.put("archive_status",0);
            } else {
                updateSource.put("analyze_fail_count", 0);
            }
            updateSourceList.add(updateSource);
        });
        elasticSearchUtil.bulkUpdate(INDEX, TYPE, updateSourceList);
        return result.getNumberOfElements();
    }
    @RequestMapping(value = ServiceApi.Packages.Resolves, method = RequestMethod.PUT)
    @ApiOperation(value = "根据条件批量修改档案包解析状态", notes = "根据条件批量修改档案包解析状态")
    public Integer update(
            @ApiParam(name = "filters", value = "条件", required = true)
            @RequestParam(value = "filters") String filters,
            @ApiParam(name = "status", value = "状态", required = true)
            @RequestParam(value = "status") ArchiveStatus status,
            @ApiParam(name = "page", value = "消息", required = true)
            @RequestParam(value = "page") Integer page,
            @ApiParam(name = "size", value = "状态", required = true)
            @RequestParam(value = "size") Integer size) throws Exception {
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, filters, page, size);
        List<Map<String, Object>> updateSourceList = new ArrayList<>();
        final int _status = status.ordinal();
        result.forEach(item -> {
            Map<String, Object> updateSource = new HashMap<>();
            updateSource.put("_id", item.get("_id"));
            updateSource.put("archive_status", status.ordinal());
            if (_status == 2) {
                updateSource.put("fail_count", 3);
            } else {
                updateSource.put("fail_count", 0);
            }
            updateSourceList.add(updateSource);
        });
        elasticSearchUtil.bulkUpdate(INDEX, TYPE, updateSourceList);
        return result.getNumberOfElements();
    }
    @RequestMapping(value = ServiceApi.Packages.Packages, method = RequestMethod.GET)
    @ApiOperation(value = "搜索档案包")
    public Envelop page(
            @ApiParam(name = "filters", value = "过滤条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "page", value = "页码", required = true, defaultValue = "1")
            @RequestParam(value = "page") int page,
            @ApiParam(name = "size", value = "分页大小", required = true, defaultValue = "15")
            @RequestParam(value = "size") int size) throws Exception {
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, filters, page, size);
        Envelop envelop = getPageResult(result.getContent(), (int)result.getTotalElements(), page, size);
        return envelop;
    }
    @RequestMapping(value = ServiceApi.Packages.Search, method = RequestMethod.GET)
    @ApiOperation(value = "搜索档案包")
    public List<EsDetailsPackage> search (
            @ApiParam(name = "filters", value = "过滤条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "sorts", value = "排序")
            @RequestParam(value = "sorts", required = false) String sorts,
            @ApiParam(name = "page", value = "页码", required = true, defaultValue = "1")
            @RequestParam(value = "page") int page,
            @ApiParam(name = "size", value = "分页大小", required = true, defaultValue = "15")
            @RequestParam(value = "size") int size) throws Exception {
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, filters, sorts, page, size);
        List<EsDetailsPackage> esDetailsPackages = new ArrayList<>();
        for (Map<String, Object> temp : result) {
            esDetailsPackages.add(objectMapper.readValue(objectMapper.writeValueAsString(temp), EsDetailsPackage.class));
        }
        return esDetailsPackages;
    }
    @RequestMapping(value = ServiceApi.Packages.Package, method = RequestMethod.GET)
    @ApiOperation(value = "获取档案包", notes = "获取档案包的信息")
    public EsSimplePackage getPackage(
            @ApiParam(name = "id", value = "档案包编号")
            @PathVariable(value = "id") String id) throws Exception {
        Map<String, Object> source = elasticSearchUtil.findById(INDEX, TYPE, id);
        if (source != null) {
            EsSimplePackage esSimplePackage = new EsSimplePackage();
            esSimplePackage.set_id(String.valueOf(source.get("_id")));
            esSimplePackage.setPwd(String.valueOf(source.get("pwd")));
            esSimplePackage.setRemote_path(String.valueOf(source.get("remote_path")));
            esSimplePackage.setClient_id(String.valueOf(source.get("client_id")));
            esSimplePackage.setReceive_date(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(String.valueOf(source.get("receive_date"))));
            return esSimplePackage;
        }
        return null;
    }
    @RequestMapping(value = ServiceApi.Packages.Download, method = {RequestMethod.GET})
    @ApiOperation(value = "下载档案包", notes = "下载档案包")
    public ResponseEntity downloadPackage(
            @ApiParam(name = "id", value = "档案包编号")
            @PathVariable(value = "id") String id,
            HttpServletResponse response) throws Exception {
        Map<String, Object> source = elasticSearchUtil.findById(INDEX, TYPE, id);
        if (source != null) {
            String [] tokens =  String.valueOf(source.get("remote_path")).split(":");
            byte [] data = fastDFSUtil.download(tokens[0], tokens[1]);
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            response.setHeader("Content-Disposition", "attachment; filename=" + id + ".zip");
            IOUtils.copy(new ByteArrayInputStream(data), response.getOutputStream());
            response.flushBuffer();
            return new ResponseEntity(HttpStatus.OK);
        }
        return null;
    }
    @RequestMapping(value = ServiceApi.Packages.PackageCrypto, method = RequestMethod.POST)
    @ApiOperation(value = "档案包密码加密")
    public String getPackageCrypto(
            @ApiParam(name = "org_code", value = "机构代码")
            @RequestParam(value = "org_code") String orgCode,
            @ApiParam(name = "package_crypto", value = "档案包解压密码,二次加密")
            @RequestParam(value = "package_crypto") String packageCrypto) throws Exception {
        MKey key = securityClient.getOrgKey(orgCode);
        if (key == null || key.getPublicKey() == null) {
            throw new ApiException(HttpStatus.FORBIDDEN, ErrorCode.FORBIDDEN, "Invalid private key, maybe you miss the organization code?");
        }
        return RSA.encrypt(packageCrypto, RSA.genPublicKey(key.getPublicKey()));
    }
    @RequestMapping(value = ServiceApi.Packages.Queue, method = RequestMethod.GET)
    @ApiOperation(value = "获取相关队列数")
    public long queueSize(
            @ApiParam(name = "queue", value = "队列 - 质控:analyze_queue 解析:resolve_queue 省平台:provincial_platform_queue", required = true)
            @RequestParam(value = "queue") String queue) throws Exception {
        if (!queue.endsWith("_vice")) {
            return redisTemplate.opsForList().size(queue);
        } else {
            return redisTemplate.opsForSet().size(queue);
        }
    }
    @RequestMapping(value = ServiceApi.Packages.Queue, method = RequestMethod.DELETE)
    @ApiOperation(value = "删除相关队列")
    public boolean deleteQueue(
            @ApiParam(name = "queue", value = "队列 - 解析:resolve_queue 质控:analyze_queue 省平台:provincial_platform_queue")
            @RequestParam(value = "queue") String queue) throws Exception {
        redisTemplate.delete(queue);
        return true;
    }
    @RequestMapping(value = ServiceApi.Packages.UploadProvincialQueueSize, method = RequestMethod.POST)
    @ApiOperation(value = "添加省平台上传队列", notes = "通过事件时间,添加已解析的档案包到队列中")
    public String uploadProvincialQueue(
            @ApiParam(name = "sorts", value = "排序(建议使用默认值,以解析较早之前的数据)", defaultValue = "event_date")
            @RequestParam(value = "sorts", required = false) String sorts,
            @ApiParam(name = "startDate", value = "开始时间(eg:2017-01-01)", required = true )
            @RequestParam(value = "startDate") String startDate,
            @ApiParam(name = "endDate", value = "结束时间(eg:2017-01-02)", required = true )
            @RequestParam(value = "endDate") String endDate) throws Exception {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("event_date>=" + startDate + " 00:00:00;");
        stringBuilder.append("event_date<" + endDate + " 00:00:00;");
        stringBuilder.append("archive_status=3");
        int count = (int)elasticSearchUtil.count(INDEX, TYPE, stringBuilder.toString());
        if (count > 0) {
            int page = count / PAGE_SIZE + 1;
            for (int i = 1; i <= page; i++) {
                Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, stringBuilder.toString(), sorts, i, PAGE_SIZE);
                for (Map<String, Object> item : result) {
                    EsSimplePackage esSimplePackage = new EsSimplePackage();
                    esSimplePackage.set_id(String.valueOf(item.get("_id")));
                    esSimplePackage.setPwd(String.valueOf(item.get("pwd")));
                    esSimplePackage.setRemote_path(String.valueOf(item.get("remote_path")));
                    esSimplePackage.setClient_id(String.valueOf(item.get("client_id")));
                    esSimplePackage.setRowkey(String.valueOf(item.get("profile_id")));
                    esSimplePackage.setPatient_id(String.valueOf(item.get("patient_id")));
                    esSimplePackage.setEvent_date(String.valueOf(item.get("event_date")));
                    esSimplePackage.setEvent_no(String.valueOf(item.get("event_no")));
                    esSimplePackage.setEvent_type( Integer.valueOf(item.get("event_type").toString()));
                    esSimplePackage.setOrg_code(String.valueOf(item.get("org_code")));
                    esSimplePackage.setIdcard_no(String.valueOf(item.get("demographic_id")));
                    esSimplePackage.setPatient_name(String.valueOf(item.get("patient_name")));
                    if (String.valueOf(item.get("org_code")) !=null ){
                        String orgName = redisService.getOrgName(String.valueOf(item.get("org_code")));
                        if (StringUtils.isNoneEmpty(orgName)) {
                            esSimplePackage.setOrg_name(orgName);
                        }
                    }
                    //存入省平台上传队列
                    redisTemplate.opsForList().leftPush(RedisCollection.ProvincialPlatformQueue, objectMapper.writeValueAsString(esSimplePackage));
                }
            }
            return "操作成功!";
        } else {
            return "该段时间内无数据";
        }
    }
    //-------------------------------------------------
    /*@RequestMapping(value = ServiceApi.Packages.Migrate, method = RequestMethod.POST)
    @ApiOperation(value = "数据迁移")
    public boolean migrate() throws Exception {
        jsonArchivesService.migrate();
        return true;
    }*/
}

+ 25 - 0
src/main/java/com/yihu/ehr/pack/dao/DatasetPackageRepository.java

@ -0,0 +1,25 @@
package com.yihu.ehr.pack.dao;
import com.yihu.ehr.pack.entity.DatasetPackage;
import com.yihu.ehr.profile.ArchiveStatus;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import java.util.Date;
import java.util.List;
/**
 * @author HZY
 * @version 1.0
 * @created 2017.06.26 15:10
 */
public interface DatasetPackageRepository extends PagingAndSortingRepository<DatasetPackage, String> {
    @Query("select pack from DatasetPackage pack where archiveStatus in (:archiveStatus) and receiveDate between :from and :to")
    List<DatasetPackage> findAll(@Param("archiveStatus") ArchiveStatus archiveStatus, @Param("from") Date from, @Param("to") Date to, Pageable pageable);
    @Query("select pack from DatasetPackage pack where archiveStatus = 0 order by receiveDate asc")
    List<DatasetPackage> findEarliestOne(Pageable pageable);
}

+ 12 - 0
src/main/java/com/yihu/ehr/pack/dao/JsonArchivesDao.java

@ -0,0 +1,12 @@
package com.yihu.ehr.pack.dao;
import com.yihu.ehr.pack.entity.JsonArchives;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * 临时数据处理
 * Created by progr1mmer on 2018/4/23.
 */
public interface JsonArchivesDao extends PagingAndSortingRepository<JsonArchives, String> {
}

+ 188 - 0
src/main/java/com/yihu/ehr/pack/entity/DatasetPackage.java

@ -0,0 +1,188 @@
package com.yihu.ehr.pack.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.ehr.profile.ArchiveStatus;
import javax.persistence.*;
import java.util.Date;
/**
 * JSON档案包。(兼容非病人纬度的采集)
 *
 * 2017.06.22 增加来源机构,来源应用,档案md5及是否被资源化
 *
 * @author HZY
 * @created 2015.07.09 15:08
 */
@Entity
@Table(name = "json_transfer")
@Access(value = AccessType.PROPERTY)
public class DatasetPackage {
    public final static String pathSeparator = ":";     // 使用冒号作为路径分隔符,与Linux一致
    private String id;
    private String pwd;
    private String remotePath;
    private String message;
    private String md5;
    private String orgCode;
    private String clientId;                            // 档案应用来源
    private Date receiveDate;
    private Date parseDate;
    private Date finishDate;
    private boolean resourced;                          // 是否已经资源化处理
    private ArchiveStatus archiveStatus;
    private String eventType;//就诊事件类型 0门诊 1住院 2体检',
    private String eventNo;//就诊事件no',
    private Date eventDate;//就诊时间',
    private String patientId;//医院患者ID'
    @Id
    @Column(name = "id", unique = true, nullable = false)
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @Column(name = "pwd", nullable = false)
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Column(name = "remote_path")
    public String getRemotePath() {
        return remotePath;
    }
    public void setRemotePath(String remotePath) {
        this.remotePath = remotePath;
    }
    @Column(name = "receive_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getReceiveDate() {
        return receiveDate;
    }
    public void setReceiveDate(Date date) {
        receiveDate = date;
    }
    @Column(name = "parse_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getParseDate() {
        return parseDate;
    }
    public void setParseDate(Date date) {
        this.parseDate = date;
    }
    @Column(name = "finish_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getFinishDate() {
        return finishDate;
    }
    public void setFinishDate(Date date) {
        this.finishDate = date;
    }
    @Column(name = "archive_status")
    public ArchiveStatus getArchiveStatus() {
        return archiveStatus;
    }
    public void setArchiveStatus(ArchiveStatus archiveStatus) {
        this.archiveStatus = archiveStatus;
    }
    @Column(name = "message")
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    @Column(name = "md5_value")
    public String getMd5() {
        return md5;
    }
    public void setMd5(String md5) {
        this.md5 = md5;
    }
    @Column(name = "org_code")
    public String getOrgCode() {
        return orgCode;
    }
    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }
    @Column(name = "client_id")
    public String getClientId() {
        return clientId;
    }
    public void setClientId(String clientId) {
        this.clientId = clientId;
    }
    @Column(name = "resourced")
    public boolean isResourced() {
        return resourced;
    }
    public void setResourced(boolean resourced) {
        this.resourced = resourced;
    }
    @Column(name = "event_type")
    public String getEventType() {
        return eventType;
    }
    public void setEventType(String eventType) {
        this.eventType = eventType;
    }
    @Column(name = "event_no")
    public String getEventNo() {
        return eventNo;
    }
    public void setEventNo(String eventNo) {
        this.eventNo = eventNo;
    }
    @Column(name = "event_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getEventDate() {
        return eventDate;
    }
    public void setEventDate(Date eventDate) {
        this.eventDate = eventDate;
    }
    @Column(name = "patient_id")
    public String getPatientId() {
        return patientId;
    }
    public void setPatientId(String patientId) {
        this.patientId = patientId;
    }
}

+ 234 - 0
src/main/java/com/yihu/ehr/pack/entity/JsonArchives.java

@ -0,0 +1,234 @@
package com.yihu.ehr.pack.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yihu.ehr.profile.ArchiveStatus;
import javax.persistence.*;
import java.util.Date;
/**
 * JSON档案包。
 * <p>
 * 2016.04.25 增加来源机构,来源应用,档案md5及是否被资源化
 * 2018.01.16 增加档案包分析状态,分析包主要用于按数据集的存储和数据质量控制,暂时不能与解析混淆。
 * 新增档案包分析状态的原因是:
 * 1.数据质量控制统计时,无原始数据(非资源化),无法有效的统计采集的质量问题
 * 2.本可以在档案解析包中,对数据集进行质量校验,但档案的包流程比较复杂,需要简化而非增加复杂度
 *
 * @author Sand
 * @created 2015.07.09 15:08
 */
@Entity
@Table(name = "json_archives")
@Access(value = AccessType.PROPERTY)
public class JsonArchives {
    public final static String pathSeparator = ":";     // 使用冒号作为路径分隔符,与Linux一致
    private String id;
    private String pwd;
    private String remotePath;
    private String message;
    private String md5;
    private String orgCode;
    private String clientId;// 档案应用来源
    private Date receiveDate;
    private Date parseDate;
    private Date finishDate;
    private boolean resourced;// 是否已经资源化处理
    private ArchiveStatus archiveStatus;
    private String eventType;//就诊事件类型 0门诊 1住院 2体检',
    private String eventNo;//就诊事件no',
    private Date eventDate;//就诊时间',
    private String patientId;//医院患者ID'
    private int failCount;
    private int analyzeStatus;  //档案分析状态,参看类说明
    private int analyzeFailCount;   //档案包分析错误状态,参看类说明
    private Date analyzeDate;   //档案包分析时间,参看类说明
    @Id
    @Column(name = "id", unique = true, nullable = false)
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @Column(name = "pwd", nullable = false)
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    @Column(name = "remote_path")
    public String getRemotePath() {
        return remotePath;
    }
    public void setRemotePath(String remotePath) {
        this.remotePath = remotePath;
    }
    @Column(name = "receive_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getReceiveDate() {
        return receiveDate;
    }
    public void setReceiveDate(Date date) {
        receiveDate = date;
    }
    @Column(name = "parse_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getParseDate() {
        return parseDate;
    }
    public void setParseDate(Date date) {
        this.parseDate = date;
    }
    @Column(name = "finish_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getFinishDate() {
        return finishDate;
    }
    public void setFinishDate(Date date) {
        this.finishDate = date;
    }
    @Column(name = "archive_status")
    public ArchiveStatus getArchiveStatus() {
        return archiveStatus;
    }
    public void setArchiveStatus(ArchiveStatus archiveStatus) {
        this.archiveStatus = archiveStatus;
    }
    @Column(name = "message")
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    @Column(name = "md5_value")
    public String getMd5() {
        return md5;
    }
    public void setMd5(String md5) {
        this.md5 = md5;
    }
    @Column(name = "org_code")
    public String getOrgCode() {
        return orgCode;
    }
    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }
    @Column(name = "client_id")
    public String getClientId() {
        return clientId;
    }
    public void setClientId(String clientId) {
        this.clientId = clientId;
    }
    @Column(name = "resourced")
    public boolean isResourced() {
        return resourced;
    }
    public void setResourced(boolean resourced) {
        this.resourced = resourced;
    }
    @Column(name = "event_type")
    public String getEventType() {
        return eventType;
    }
    public void setEventType(String eventType) {
        this.eventType = eventType;
    }
    @Column(name = "event_no")
    public String getEventNo() {
        return eventNo;
    }
    public void setEventNo(String eventNo) {
        this.eventNo = eventNo;
    }
    @Column(name = "event_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getEventDate() {
        return eventDate;
    }
    public void setEventDate(Date eventDate) {
        this.eventDate = eventDate;
    }
    @Column(name = "patient_id")
    public String getPatientId() {
        return patientId;
    }
    public void setPatientId(String patientId) {
        this.patientId = patientId;
    }
    @Column(name = "fail_count")
    public int getFailCount() {
        return failCount;
    }
    public void setFailCount(int failCount) {
        this.failCount = failCount;
    }
    @Column(name = "analyze_status")
    public int getAnalyzeStatus() {
        return analyzeStatus;
    }
    public void setAnalyzeStatus(int analyzeStatus) {
        this.analyzeStatus = analyzeStatus;
    }
    @Column(name = "analyze_fail_count")
    public int getAnalyzeFailCount() {
        return analyzeFailCount;
    }
    public void setAnalyzeFailCount(int analyzeFailCount) {
        this.analyzeFailCount = analyzeFailCount;
    }
    @Column(name = "analyze_date")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getAnalyzeDate() {
        return analyzeDate;
    }
    public void setAnalyzeDate(Date analyzeDate) {
        this.analyzeDate = analyzeDate;
    }
}

+ 28 - 0
src/main/java/com/yihu/ehr/pack/feign/AppClient.java

@ -0,0 +1,28 @@
package com.yihu.ehr.pack.feign;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.MicroServices;
import com.yihu.ehr.constants.ServiceApi;
import com.yihu.ehr.model.app.MApp;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
/**
 * Created by AndyCai on 2016/1/19.
 */
@FeignClient(name=MicroServices.Basic)
public interface AppClient {
    @RequestMapping(value = ApiVersion.Version1_0 + ServiceApi.Apps.App, method = RequestMethod.GET)
    @ApiOperation(value = "获取App")
    MApp getApp(
            @ApiParam(name = "app_id", value = "id", defaultValue = "")
            @PathVariable(value = "app_id") String appId);
}

+ 27 - 0
src/main/java/com/yihu/ehr/pack/feign/SecurityClient.java

@ -0,0 +1,27 @@
package com.yihu.ehr.pack.feign;
import com.yihu.ehr.constants.ServiceApi;
import com.yihu.ehr.constants.ApiVersion;
import com.yihu.ehr.constants.MicroServices;
import com.yihu.ehr.model.security.MKey;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import springfox.documentation.annotations.ApiIgnore;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
/**
 * @author Sand
 * @version 1.0
 * @created 2016.02.01 14:58
 */
@ApiIgnore
@FeignClient(value = MicroServices.Basic)
public interface SecurityClient {
    @RequestMapping(value = ApiVersion.Version1_0+ ServiceApi.Securities.UserKey, method = GET)
    MKey getUserKey(@PathVariable(value = "user_id") String userId);
    @RequestMapping(value = ApiVersion.Version1_0+ ServiceApi.Securities.OrganizationKey, method = GET)
    MKey getOrgKey(@PathVariable(value = "org_code") String orgCode);
}

+ 155 - 0
src/main/java/com/yihu/ehr/pack/service/DatasetPackageService.java

@ -0,0 +1,155 @@
package com.yihu.ehr.pack.service;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.ehr.fastdfs.FastDFSUtil;
import com.yihu.ehr.pack.dao.DatasetPackageRepository;
import com.yihu.ehr.pack.entity.DatasetPackage;
import com.yihu.ehr.pack.entity.JsonArchives;
import com.yihu.ehr.profile.ArchiveStatus;
import com.yihu.ehr.query.BaseJpaService;
import com.yihu.ehr.util.id.BizObject;
import com.yihu.ehr.util.id.ObjectId;
import com.yihu.ehr.util.log.LogService;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 兼容非病人维度
 * JSON档案管理器。将档案存到fastDFS中, 并做文件索引
 *
 * @author HZY
 * @version 1.0
 * @created 2017.06.26 9:50
 */
@Service
@Transactional
public class DatasetPackageService extends BaseJpaService<DatasetPackage, DatasetPackageRepository> {
    @Value("${deploy.region}")
    private Short adminRegion;
    @Autowired
    private FastDFSUtil fastDFSUtil;
    @Autowired
    private DatasetPackageRepository datasetPackageRepository;
    public DatasetPackage receiveDatasets(InputStream is, String pwd, String md5, String orgCode, String clientId) {
        Map<String, String> metaData = storeJsonPackage(is);
        return checkDatasetIn(metaData.get("id"), metaData.get("path"), pwd, md5, orgCode, clientId);
    }
    public DatasetPackage getPackage(String id) {
        return getRepo().findOne(id);
    }
    public DatasetPackage acquirePackage(String id) {
        DatasetPackage aPackage = null;
        if (StringUtils.isEmpty(id)){
            Pageable pageable = new PageRequest(0, 1);
            List<DatasetPackage> packages = getRepo().findEarliestOne(pageable);
            if(packages.size() > 0) aPackage = packages.get(0);
        } else {
            aPackage = getRepo().findOne(id);
        }
        if(aPackage == null) return null;
        // 设置为'解析'状态
        aPackage.setArchiveStatus(ArchiveStatus.Acquired);
        aPackage.setParseDate(new Date());
        getRepo().save(aPackage);
        return aPackage;
    }
    /**
     * 将JSON档案保存到特定的路径上。
     *
     * @param is 文件流
     * @return 完整路径
     */
    Map<String, String> storeJsonPackage(InputStream is) {
        ObjectId objectId = new ObjectId(adminRegion, BizObject.JsonPackage);
        try {
            ObjectNode msg = fastDFSUtil.upload(is, "zip", "健康档案JSON临时文件");
            String group = msg.get(FastDFSUtil.GROUP_NAME).asText();
            String remoteFile = msg.get(FastDFSUtil.REMOTE_FILE_NAME).asText();
            // 将组与文件ID使用英文分号隔开, 提取的时候, 只需要将它们这个串拆开, 就可以得到组与文件ID
            String remoteFilePath = String.join(JsonArchives.pathSeparator, new String[]{group, remoteFile});
            Map<String, String> metaData = new HashMap<>();
            metaData.put("id", objectId.toString());
            metaData.put("path", remoteFilePath);
            return metaData;
        } catch (Exception e) {
            LogService.getLogger(DatasetPackageService.class)
                    .error("存病人档案文件失败, 错误原因: " + ExceptionUtils.getStackTrace(e));
            return null;
        }
    }
    /**
     * 在数据库待解析的队列中登记. (新)(兼容非病人维度采集)
     * add in 2017/06/22 by HZY
     * @param path 完整路径
     * @param pwd  zip密码
     * @return 索引存储成功
     */
    DatasetPackage checkDatasetIn(String id, String path, String pwd, String md5, String orgCode, String clientId) {
        try {
            DatasetPackage aPackage = new DatasetPackage();
            aPackage.setId(id);
            aPackage.setMd5(md5);
            aPackage.setOrgCode(orgCode);
            aPackage.setClientId(clientId);
            aPackage.setRemotePath(path);
            aPackage.setPwd(pwd);
            aPackage.setReceiveDate(new Date());
            aPackage.setArchiveStatus(ArchiveStatus.Received);
            datasetPackageRepository.save(aPackage);
            return aPackage;
        } catch (HibernateException ex) {
            LogService.getLogger(DatasetPackageService.class).error(ex.getMessage());
            return null;
        }
    }
    public String downloadTo(String remotePath, String localPath) {
        try {
            String[] meta = remotePath.split(JsonArchives.pathSeparator);
            return fastDFSUtil.download(meta[0], meta[1], localPath);
        } catch (Exception ex) {
            throw new RuntimeException("fastDFS - " + ex.getMessage());
        }
    }
    public void deletePackage(String id) {
        getRepo().delete(id);
    }
    
    private DatasetPackageRepository getRepo(){
        return (DatasetPackageRepository)getRepository();
    }
}

+ 84 - 0
src/main/java/com/yihu/ehr/pack/service/JsonArchivesService.java

@ -0,0 +1,84 @@
package com.yihu.ehr.pack.service;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.pack.dao.JsonArchivesDao;
import com.yihu.ehr.pack.entity.JsonArchives;
import com.yihu.ehr.query.BaseJpaService;
import org.hibernate.FlushMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigInteger;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 临时数据处理
 * Created by progr1mmer on 2018/4/23.
 */
//@Service
public class JsonArchivesService extends BaseJpaService<JsonArchives, JsonArchivesDao> {
    private static final Integer SINGLE_SIZE = 2000;
    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private boolean isRun = false;
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    public void migrate() throws Exception {
        if (isRun) {
            return;
        }
        isRun = true;
        String countSql = "SELECT COUNT(1) FROM json_archives";
        Session session = currentSession();
        Query query = session.createSQLQuery(countSql);
        query.setFlushMode(FlushMode.COMMIT);
        int count = ((BigInteger)query.uniqueResult()).intValue();
        int totalPage;
        if (count % SINGLE_SIZE > 0) {
            totalPage  = count / SINGLE_SIZE + 1;
        } else {
            totalPage  = count / SINGLE_SIZE;
        }
        new Thread(() -> {
            try {
                migrateJsonArchives(totalPage);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }
    private void migrateJsonArchives(int totalPage) throws Exception {
        for (int i = 1 ; i <= totalPage; i ++) {
            List<JsonArchives> list = search(null, null, "+receiveDate", i, SINGLE_SIZE);
            List<Map<String, Object>> sourceList = new ArrayList<>(list.size());
            list.forEach(item -> {
                Map<String, Object> sourceMap = new HashMap<>();
                sourceMap.put("pwd", item.getPwd());
                sourceMap.put("remote_path", item.getRemotePath());
                sourceMap.put("receive_date", dateFormat.format(item.getReceiveDate()));
                sourceMap.put("archive_status", 0);
                sourceMap.put("org_code", item.getOrgCode());
                sourceMap.put("client_id", item.getClientId());
                sourceMap.put("resourced", 0);
                sourceMap.put("md5_value", item.getMd5());
                sourceMap.put("fail_count", 0);
                sourceMap.put("analyze_status", 0);
                sourceMap.put("analyze_fail_count", 0);
                sourceMap.put("pack_type", 1);
                sourceList.add(sourceMap);
            });
            elasticSearchUtil.bulkIndex("json_archives", "info", sourceList);
        }
    }
}

+ 35 - 0
src/main/java/com/yihu/ehr/pack/service/RedisService.java

@ -0,0 +1,35 @@
package com.yihu.ehr.pack.service;
import com.yihu.ehr.redis.schema.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * Redis管理
 * @author hzp add at 20170425
 */
@Service
public class RedisService {
    @Autowired
    private OrgKeySchema orgKeySchema;
    /**
     *获取机构名称redis
     * @return
     */
    public String getOrgName(String key) {
       return orgKeySchema.get(key);
    }
    /**
     *获取机构区域redis
     * @return
     */
    public String getOrgArea(String key) {
        return orgKeySchema.getOrgArea(key);
    }
}

+ 90 - 0
src/main/java/com/yihu/ehr/pack/task/FastDFSTask.java

@ -0,0 +1,90 @@
package com.yihu.ehr.pack.task;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.fastdfs.FastDFSUtil;
import com.yihu.ehr.model.packs.EsDetailsPackage;
import com.yihu.ehr.model.packs.EsSimplePackage;
import com.yihu.ehr.pack.service.RedisService;
import com.yihu.ehr.profile.queue.RedisCollection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Component;
import java.io.InputStream;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Future;
@Component
public class FastDFSTask {
    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Autowired
    private FastDFSUtil fastDFSUtil;
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;
    @Autowired
    protected ObjectMapper objectMapper;
    @Autowired
    private RedisService redisService;
    private static final Logger logger = LoggerFactory.getLogger(FastDFSTask.class);
    /**
     * 异步接收档案,存入fast dfs
     * @return
     */
    @Async
    public Future<Boolean> savePackageWithOrg(InputStream inputStream, String password, String orgCode, String md5, String clientId, Integer packType) throws Exception {
        //fastDfs
        ObjectNode msg = fastDFSUtil.upload(inputStream, "zip", "健康档案JSON文件");
        String group = msg.get(FastDFSUtil.GROUP_NAME).asText();
        String remoteFile = msg.get(FastDFSUtil.REMOTE_FILE_NAME).asText();
        //将组与文件ID使用英文分号隔开, 提取的时候, 只需要将它们这个串拆开, 就可以得到组与文件ID
        String remoteFilePath = String.join(EsDetailsPackage.PATH_SEPARATOR, new String[]{group, remoteFile});
        //elasticSearch
        Date now = new Date();
        String _now = dateFormat.format(now);
        Map<String, Object> sourceMap = new HashMap<>();
        sourceMap.put("pwd", password);
        sourceMap.put("remote_path", remoteFilePath);
        sourceMap.put("receive_date", _now);
        sourceMap.put("org_code", orgCode);
        sourceMap.put("org_name", redisService.getOrgName(orgCode));
        sourceMap.put("org_area", redisService.getOrgArea(orgCode));
        sourceMap.put("client_id", clientId);
        sourceMap.put("resourced", 0);
        sourceMap.put("md5_value", md5);
        sourceMap.put("archive_status", 0);
        sourceMap.put("fail_count", 0);
        sourceMap.put("analyze_status", 0);
        sourceMap.put("analyze_fail_count", 0);
        sourceMap.put("pack_type", packType);
        //保存索引出错的时候,删除文件
        try {
            sourceMap = elasticSearchUtil.index("json_archives", "info", sourceMap);
        } catch (Exception e) {
            fastDFSUtil.delete(group, remoteFile);
            throw e;
        }
        EsSimplePackage esSimplePackage = new EsSimplePackage();
        esSimplePackage.set_id((sourceMap.get("_id").toString()));
        esSimplePackage.setPwd(password);
        esSimplePackage.setReceive_date(now);
        esSimplePackage.setRemote_path(remoteFilePath);
        esSimplePackage.setClient_id(clientId);
        redisTemplate.opsForList().leftPush(RedisCollection.AnalyzeQueue, objectMapper.writeValueAsString(esSimplePackage));
        return new AsyncResult<>(true);
    }
}

+ 81 - 0
src/main/java/com/yihu/ehr/pack/task/PackAnalyzeTask.java

@ -0,0 +1,81 @@
package com.yihu.ehr.pack.task;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.model.packs.EsSimplePackage;
import com.yihu.ehr.profile.queue.RedisCollection;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 档案包质控容错处理任务
 * 1. 当质控队列为空,将状态为待质控的档案包加入质控队列
 * 2. 将质控状态为失败且错误次数小于三次的档案包重新加入质控队列
 * 3. 将质控状态为正在进行质控处理但质控开始时间超过当前时间一定范围内的档案包重新加入质控队列
 * Created by progr1mmer on 2017/12/18.
 */
@Component
public class PackAnalyzeTask {
    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    private static final String INDEX = "json_archives";
    private static final String TYPE = "info";
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;
    @Scheduled(fixedDelay = 30000)
    public void delayPushTask() throws Exception {
        List<String> esSimplePackageList = new ArrayList<>(200);
        //当质控队列为空,将状态为待质控的档案包加入质控队列
        if (redisTemplate.opsForSet().size(RedisCollection.AnalyzeQueueVice) <= 0) {
            //影像档案,如果是待质控,不添加入次质控队列, 防止主消息队列刚消费完,还未进行更改状态,就添加到 次质控队列,进而添加到次解析队列,进行二次解析(此时,很可能主解析队列已经将该影像档案入库,将ftp文件干掉了!)
            Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, "analyze_status=0;pack_type<>3", "+receive_date", 1, 1000);
            for (Map<String, Object> pack : result) {
                String packStr = objectMapper.writeValueAsString(pack);
                EsSimplePackage esSimplePackage = objectMapper.readValue(packStr, EsSimplePackage.class);
                redisTemplate.opsForSet().add(RedisCollection.AnalyzeQueueVice, objectMapper.writeValueAsString(esSimplePackage));
            }
        }
        //将质控状态为失败且错误次数小于三次的档案包重新加入质控队列
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, "analyze_status=2;analyze_fail_count<3", "+receive_date", 1, 100);
        List<Map<String, Object>> updateSourceList = new ArrayList<>();
        for (Map<String, Object> pack : result) {
            Map<String, Object> updateSource = new HashMap<>();
            updateSource.put("_id", pack.get("_id"));
            updateSource.put("analyze_status", 0);
            updateSourceList.add(updateSource);
            String packStr = objectMapper.writeValueAsString(pack);
            EsSimplePackage esSimplePackage = objectMapper.readValue(packStr, EsSimplePackage.class);
            esSimplePackageList.add(objectMapper.writeValueAsString(esSimplePackage));
        }
        //将质控状态为正在进行质控处理但质控开始时间超过当前时间一定范围内的档案包重新加入质控队列
        Date past = DateUtils.addDays(new Date(), -1);
        String pastStr = dateFormat.format(past) + " 00:00:00";
        result = elasticSearchUtil.page(INDEX, TYPE, "analyze_status=1;analyze_date<" + pastStr, "+receive_date", 1, 100);
        for (Map<String, Object> pack : result) {
            Map<String, Object> updateSource = new HashMap<>();
            updateSource.put("_id", pack.get("_id"));
            updateSource.put("analyze_status", 0);
            updateSourceList.add(updateSource);
            String packStr = objectMapper.writeValueAsString(pack);
            EsSimplePackage esSimplePackage = objectMapper.readValue(packStr, EsSimplePackage.class);
            esSimplePackageList.add(objectMapper.writeValueAsString(esSimplePackage));
        }
        elasticSearchUtil.bulkUpdate(INDEX, TYPE, updateSourceList);
        esSimplePackageList.forEach(item -> redisTemplate.opsForSet().add(RedisCollection.AnalyzeQueueVice, item));
    }
}

+ 81 - 0
src/main/java/com/yihu/ehr/pack/task/PackResolveTask.java

@ -0,0 +1,81 @@
package com.yihu.ehr.pack.task;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.ehr.elasticsearch.ElasticSearchUtil;
import com.yihu.ehr.model.packs.EsSimplePackage;
import com.yihu.ehr.profile.queue.RedisCollection;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 档案包解析容错处理任务
 * 1. 当解析队列为空,将完成质控且状态为待解析的档案包加入解析队列
 * 2. 将完成质控且解析状态为失败且错误次数小于三次的档案包重新加入解析队列
 * 3. 将完成质控且解析状态为正在解析但解析开始时间超过当前时间一定范围内的档案包重新加入解析队列
 * Created by progr1mmer on 2017/12/18.
 */
@Component
public class PackResolveTask {
    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    private static final String INDEX = "json_archives";
    private static final String TYPE = "info";
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private ElasticSearchUtil elasticSearchUtil;
    @Autowired
    private RedisTemplate<String, Serializable> redisTemplate;
    @Scheduled(fixedDelay = 30000)
    public void delayPushTask() throws Exception {
        List<String> esSimplePackageList = new ArrayList<>(200);
        //当解析队列为空,将数据库中状态为缓存状态的档案包加入解析队列
        if (redisTemplate.opsForSet().size(RedisCollection.ResolveQueueVice) <= 0) {
            //影像档案,如果是待解析,不添加入次解析队列, 防止主消息队列刚消费完,还未进行更改状态,就添加到 次解析队列,进行二次解析(此时,主解析队列已经入库,将ftp文件干掉了)
            Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, "analyze_status=3;archive_status=0;pack_type<>3", "+receive_date", 1, 1000);
            for (Map<String, Object> pack : result) {
                String packStr = objectMapper.writeValueAsString(pack);
                EsSimplePackage esSimplePackage = objectMapper.readValue(packStr, EsSimplePackage.class);
                redisTemplate.opsForSet().add(RedisCollection.ResolveQueueVice, objectMapper.writeValueAsString(esSimplePackage));
            }
        }
        //将解析状态为失败且错误次数小于三次的档案包重新加入解析队列
        Page<Map<String, Object>> result = elasticSearchUtil.page(INDEX, TYPE, "analyze_status=3;archive_status=2;fail_count<3", "+receive_date", 1, 100);
        List<Map<String, Object>> updateSourceList = new ArrayList<>();
        for (Map<String, Object> pack : result) {
            Map<String, Object> updateSource = new HashMap<>();
            updateSource.put("_id", pack.get("_id"));
            updateSource.put("archive_status", 0);
            updateSourceList.add(updateSource);
            String packStr = objectMapper.writeValueAsString(pack);
            EsSimplePackage esSimplePackage = objectMapper.readValue(packStr, EsSimplePackage.class);
            esSimplePackageList.add(objectMapper.writeValueAsString(esSimplePackage));
        }
        //将解析状态为正在解析但解析开始时间超过当前时间一定范围内的档案包重新加入解析队列
        Date past = DateUtils.addDays(new Date(), -1);
        String pastStr = dateFormat.format(past) + " 00:00:00";
        result = elasticSearchUtil.page(INDEX, TYPE, "analyze_status=3;archive_status=1;parse_date<" + pastStr, "+receive_date", 1, 100);
        for (Map<String, Object> pack : result) {
            Map<String, Object> updateSource = new HashMap<>();
            updateSource.put("_id", pack.get("_id"));
            updateSource.put("archive_status", 0);
            updateSourceList.add(updateSource);
            String packStr = objectMapper.writeValueAsString(pack);
            EsSimplePackage esSimplePackage = objectMapper.readValue(packStr, EsSimplePackage.class);
            esSimplePackageList.add(objectMapper.writeValueAsString(esSimplePackage));
        }
        elasticSearchUtil.bulkUpdate(INDEX, TYPE, updateSourceList);
        esSimplePackageList.forEach(item -> redisTemplate.opsForSet().add(RedisCollection.ResolveQueueVice, item));
    }
}

+ 67 - 0
src/main/resources/application.yml

@ -0,0 +1,67 @@
server:
  port: ${svr-pack-mgr.server.port}
info:
  app:
    name: SVR-PACK-MGR
    description: EHR Platform Microservice.
    version: 1.0.0
spring:
  http:
    multipart:
      maxRequestSize: 1024MB  #配置最大上传为1G
      maxFileSize: 1024MB  #配置最大上传为1G
  # REDIS
  redis:
    database: 0 # Database index used by the connection factory.
    timeout: 0 # Connection timeout in milliseconds.
    #sentinel:
    #  master: # Name of Redis server.
    #  nodes: # Comma-separated list of host:port pairs.
    pool:
      max-active: 8 # Max number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.
      max-idle: 8 # Max number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.
      max-wait: -1 # Maximum amount of time (in milliseconds) a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.
      min-idle: 1 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    max-active: 20
    max-idle: 8
    min-idle: 8
    validation-query: SELECT 1
    test-on-borrow: true
fast-dfs:
  connect-timeout: 20
  network-timeout: 60
  charset: ISO8859-1
  pool:
    init-size: 15
    max-size: 30
    wait-time: 500
  http:
    tracker-http-port: 80
    anti-steal-token: no
    secret-key: FastDFS1234567890
eip:
  tenant: jkzl
---
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://172.19.103.50:3306/healtharchive?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: chenweishan
    password: chenweishan
  redis:
    host: 172.19.103.47
    port: 6379
    password: redis!@456
fast-dfs:
  tracker-server: 172.19.103.13:22122
  public-server: http://172.19.103.52:80
elasticsearch:
  cluster-name: elasticsearch
  cluster-nodes: 172.19.103.9:9300

+ 29 - 0
src/main/resources/banner.txt

@ -0,0 +1,29 @@
                                   _oo8oo_
                                  o8888888o
                                  88" . "88
                                  (| -_- |)
                                  0\  =  /0
                                ___/'==='\___
                              .' \\|     |// '.
                             / \\|||  :  |||// \
                            / _||||| -:- |||||_ \
                           |   | \\\  -  /// |   |
                           | \_|  ''\---/''  |_/ |
                           \  .-\__  '-'  __/-.  /
                         ___'. .'  /--.--\  '. .'___
                      ."" '<  '.___\_<|>_/___.'  >' "".
                     | | :  `- \`.:`\ _ /`:.`/ -`  : | |
                     \  \ `-.   \_ __\ /__ _/   .-` /  /
                 =====`-.____`.___ \_____/ ___.`____.-`=====
                                   `=---=`
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                      佛祖保佑     永不宕机     永无Bug
 __   _      ___       ___    __    __    _         _      __    ___
( (` \ \  / | |_)     | |_)  / /\  / /`  | |_/     | |\/| / /`_ | |_)
_)_)  \_\/  |_| \     |_|   /_/--\ \_\_, |_| \     |_|  | \_\_/ |_| \

+ 23 - 0
src/main/resources/bootstrap.yml

@ -0,0 +1,23 @@
spring:
  application:
    name: svr-pack-mgr
  cloud:
    config:
      username: user
      password: configuration
---
spring:
  profiles: dev
  cloud:
    config:
      uri: ${spring.config.uri:http://172.19.103.73:1221}
      label: ${spring.config.label:dev}
---
spring:
  profiles: prod
  cloud:
    config:
      uri: ${spring.config.uri}
      label: ${spring.config.label}

+ 141 - 0
src/main/resources/logback-spring.xml

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <springProperty scope="context" name="appName" source="spring.application.name" />
    <property name="log_home" value="/ehr-logs/${appName}" />
	<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
	<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
	<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
	<!-- 彩色日志格式 -->
	<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr([${appName}]){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}" />
	<!-- 文件日志格式 -->
	<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [${appName}] %-5level --- [%thread] - %logger{36}: %msg%n" />
	<!-- Standard output -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>${CONSOLE_LOG_PATTERN}</pattern>
			<charset class="java.nio.charset.Charset">UTF-8</charset>
		</encoder>
	</appender>
	<!-- Api Log Start -->
	<appender name="ApiInfoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log_home}/api/info/%d{yyyy-MM-dd}.log</fileNamePattern>
		</rollingPolicy>
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset class="java.nio.charset.Charset">UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<appender name="ApiWarnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log_home}/api/warn/%d{yyyy-MM-dd}.log</fileNamePattern>
		</rollingPolicy>
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset class="java.nio.charset.Charset">UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>WARN</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<appender name="ApiErrorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log_home}/api/error/%d{yyyy-MM-dd}.log</fileNamePattern>
		</rollingPolicy>
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset class="java.nio.charset.Charset">UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<logger name="com.yihu.ehr.exception.GlobalExceptionHandler" level="WARN" additivity="false">
		<appender-ref ref="console" />
		<appender-ref ref="ApiInfoFile" />
		<appender-ref ref="ApiWarnFile" />
		<appender-ref ref="ApiErrorFile" />
	</logger>
	<!-- Api Log End -->
    <!-- 如果微服务纳入全局异常处理,请勿修改以上代码,有新的日志处理请在以下追加!!! -->
	<!-- FastDfs Start -->
	<appender name="fastDfsInfoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log_home}/fastDfs/info/%d{yyyy-MM-dd}.log</fileNamePattern>
		</rollingPolicy>
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset class="java.nio.charset.Charset">UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<appender name="fastDfsWarnFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log_home}/fastDfs/warn/%d{yyyy-MM-dd}.log</fileNamePattern>
		</rollingPolicy>
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset class="java.nio.charset.Charset">UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>WARN</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<appender name="fastDfsErrorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${log_home}/fastDfs/error/%d{yyyy-MM-dd}.log</fileNamePattern>
		</rollingPolicy>
		<encoder>
			<pattern>${FILE_LOG_PATTERN}</pattern>
			<charset class="java.nio.charset.Charset">UTF-8</charset>
		</encoder>
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<logger name="com.yihu.ehr.fastdfs.FastDFSUtil" level="WARN" additivity="false">
        <springProfile name="dev">
            <appender-ref ref="console" />
        </springProfile>
		<appender-ref ref="fastDfsInfoFile" />
		<appender-ref ref="fastDfsWarnFile" />
		<appender-ref ref="fastDfsErrorFile" />
	</logger>
    <!-- FastDfs End -->
	<root level="INFO">
		<appender-ref ref="console" />
	</root>
</configuration>

+ 23 - 0
src/test/com/yihu/ehr/test/FileTest.java

@ -0,0 +1,23 @@
package com.yihu.ehr.test;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
/**
 * Created by progr1mmer on 2018/6/13.
 */
public class FileTest {
    @Test
    public void test() throws Exception {
        File file = new File("D:\\新建文本文档.txt");
        Long length = file.length();
        byte [] content = new byte[length.intValue()];
        FileInputStream fileInputStream = new FileInputStream(file);
        fileInputStream.read(content);
        String s = new String(content).replaceAll("\r\n", "").replaceAll("\\s*", "");
        System.out.println(s);
    }
}