Kaynağa Gözat

采集功能合并调试

lingfeng 9 yıl önce
ebeveyn
işleme
73631fc081
21 değiştirilmiş dosya ile 2195 ekleme ve 98 silme
  1. 0 98
      .idea/artifacts/Hos_Resource_Mini_Helper_war_exploded.xml
  2. 325 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/controller/CrawlerController.java
  3. 124 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterDataSet.java
  4. 96 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterDict.java
  5. 13 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterDictEntry.java
  6. 86 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterMetaData.java
  7. 152 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/config/SysConfig.java
  8. 103 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/patient/Patient.java
  9. 59 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/patient/PatientIdentity.java
  10. 9 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/DictDataType.java
  11. 65 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/EhrCondition.java
  12. 15 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/IVerifier.java
  13. 12 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/LogicValues.java
  14. 45 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/MetaDataType.java
  15. 37 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/MetaDataVerify.java
  16. 21 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/TransformType.java
  17. 226 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/service/CrawlerManager.java
  18. 216 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/service/DataCollectDispatcher.java
  19. 172 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/service/DataSetTransformer.java
  20. 335 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/service/EsbHttp.java
  21. 84 0
      Hos-resource/src/main/java/com/yihu/ehr/crawler/service/PatientCDAIndex.java

+ 0 - 98
.idea/artifacts/Hos_Resource_Mini_Helper_war_exploded.xml

@ -1,98 +0,0 @@
<component name="ArtifactManager">
  <artifact type="exploded-war" name="Hos-Resource-Mini-Helper:war exploded">
    <output-path>$PROJECT_DIR$/Hos-Resource-Mini-helper/target/Hos-Resource-Mini-Helper-1.0-SNAPSHOT</output-path>
    <root id="root">
      <element id="directory" name="WEB-INF">
        <element id="directory" name="classes">
          <element id="module-output" name="Hos-Resource-Mini-Helper" />
        </element>
        <element id="directory" name="lib">
          <element id="library" level="project" name="Maven: com.yihu.core:ehr-dbhelper:1.1.5" />
          <element id="library" level="project" name="Maven: mysql:mysql-connector-java:5.1.37" />
          <element id="library" level="project" name="Maven: com.oracle:ojdbc14:10.2.0.3.0" />
          <element id="library" level="project" name="Maven: org.xerial:sqlite-jdbc:3.8.11.2" />
          <element id="library" level="project" name="Maven: net.sf.json-lib:json-lib:2.4" />
          <element id="library" level="project" name="Maven: org.json:json:20151123" />
          <element id="library" level="project" name="Maven: commons-beanutils:commons-beanutils:1.9.2" />
          <element id="library" level="project" name="Maven: commons-logging:commons-logging:1.1.1" />
          <element id="library" level="project" name="Maven: commons-collections:commons-collections:3.2.1" />
          <element id="library" level="project" name="Maven: commons-codec:commons-codec:1.10" />
          <element id="library" level="project" name="Maven: org.apache.commons:commons-dbcp2:2.1" />
          <element id="library" level="project" name="Maven: org.apache.commons:commons-pool2:2.3" />
          <element id="library" level="project" name="Maven: commons-configuration:commons-configuration:1.10" />
          <element id="library" level="project" name="Maven: commons-lang:commons-lang:2.6" />
          <element id="library" level="project" name="Maven: commons-dbutils:commons-dbutils:1.6" />
          <element id="library" level="project" name="Maven: org.springframework:spring-aop:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: aopalliance:aopalliance:1.0" />
          <element id="library" level="project" name="Maven: org.springframework:spring-aspects:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.aspectj:aspectjweaver:1.8.7" />
          <element id="library" level="project" name="Maven: org.springframework:spring-beans:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-context:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-context-support:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-core:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-expression:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-jdbc:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-tx:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-web:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-webmvc:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-webmvc-portlet:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.springframework:spring-websocket:4.1.8.RELEASE" />
          <element id="library" level="project" name="Maven: org.slf4j:slf4j-nop:1.7.13" />
          <element id="library" level="project" name="Maven: org.slf4j:slf4j-api:1.7.12" />
          <element id="library" level="project" name="Maven: org.apache.logging.log4j:log4j-core:2.4.1" />
          <element id="library" level="project" name="Maven: org.apache.logging.log4j:log4j-api:2.4.1" />
          <element id="library" level="project" name="Maven: log4j:log4j:1.2.17" />
          <element id="library" level="project" name="Maven: javax.servlet:servlet-api:2.5" />
          <element id="library" level="project" name="Maven: jstl:jstl:1.2" />
          <element id="library" level="project" name="Maven: com.fasterxml.jackson.core:jackson-core:2.4.6" />
          <element id="library" level="project" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.4.6" />
          <element id="library" level="project" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.4.6" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-extras:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-core:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-api:3.0.5" />
          <element id="library" level="project" name="Maven: commons-digester:commons-digester:2.0" />
          <element id="library" level="project" name="Maven: org.slf4j:jcl-over-slf4j:1.7.6" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-request-servlet-wildcard:1.0.6" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-request-servlet:1.0.6" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-request-mustache:1.0.6" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-request-api:1.0.6" />
          <element id="library" level="project" name="Maven: com.github.spullara.mustache.java:compiler:0.8.4" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-jsp:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-servlet:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-template:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-autotag-core-runtime:1.1.0" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-request-jsp:1.0.6" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-freemarker:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-request-freemarker:1.0.6" />
          <element id="library" level="project" name="Maven: org.freemarker:freemarker:2.3.15" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-velocity:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.velocity:velocity-tools:2.0" />
          <element id="library" level="project" name="Maven: oro:oro:2.0.8" />
          <element id="library" level="project" name="Maven: org.apache.velocity:velocity:1.6.2" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-request-velocity:1.0.6" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-el:3.0.5" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-mvel:3.0.5" />
          <element id="library" level="project" name="Maven: org.mvel:mvel2:2.0.11" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-ognl:3.0.5" />
          <element id="library" level="project" name="Maven: ognl:ognl:2.7.3" />
          <element id="library" level="project" name="Maven: jboss:javassist:3.7.ga" />
          <element id="library" level="project" name="Maven: org.apache.tiles:tiles-compat:3.0.5" />
          <element id="library" level="project" name="Maven: com.google.guava:guava:12.0.1" />
          <element id="library" level="project" name="Maven: com.google.code.findbugs:jsr305:1.3.9" />
          <element id="library" level="project" name="Maven: org.apache.httpcomponents:httpclient:4.5.1" />
          <element id="library" level="project" name="Maven: org.apache.httpcomponents:httpmime:4.5.1" />
          <element id="library" level="project" name="Maven: org.apache.httpcomponents:httpcore:4.4.3" />
          <element id="library" level="project" name="Maven: org.apache.ant:ant:1.7.0" />
          <element id="library" level="project" name="Maven: org.apache.ant:ant-launcher:1.7.0" />
          <element id="library" level="project" name="Maven: dom4j:dom4j:1.6.1" />
          <element id="library" level="project" name="Maven: xml-apis:xml-apis:1.0.b2" />
          <element id="library" level="project" name="Maven: net.lingala.zip4j:zip4j:1.3.2" />
        </element>
      </element>
      <element id="directory" name="META-INF">
        <element id="file-copy" path="$PROJECT_DIR$/Hos-Resource-Mini-helper/target/Hos-Resource-Mini-Helper-1.0-SNAPSHOT/META-INF/MANIFEST.MF" />
      </element>
      <element id="javaee-facet-resources" facet="Hos-Resource-Mini-Helper/web/Web" />
    </root>
  </artifact>
</component>

+ 325 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/controller/CrawlerController.java

@ -0,0 +1,325 @@
package com.yihu.ehr.crawler.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.core.constant.LogAttribute;
import com.yihu.core.util.log.BusinessLogger;
import com.yihu.core.util.log.DebugLogger;
import com.yihu.core.util.log.LogUtil;
import com.yihu.core.util.operator.DateUtil;
import com.yihu.ehr.mqhelper.ActiveMQHelper;
import com.yihu.ehr.vanguard.common.constant.*;
import com.yihu.ehr.vanguard.common.controller.BaseController;
import com.yihu.ehr.vanguard.crawler.DataCollectDispatcher;
import com.yihu.ehr.vanguard.crawler.service.patient.Patient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
/**
 * 目前版本只需要采集,上传和注册病人档案就可了。
 * <p>
 * Created by Airhead on 2015/12/16.
 */
@RestController
@RequestMapping(ApiVersionPrefix.CommonVersion + "/crawler")
@Api(protocols = "https", value = "CrawlerController", description = "档案采集接口", tags = {"采集"})
public class CrawlerController extends BaseController {
    @RequestMapping(value = "/patient/fetch", method = RequestMethod.POST)
    @ApiOperation(value = "采集病人健康档案", produces = "application/json", notes = "采集病人健康档案")
    public RestEcho fetch(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "patient", value = "病人索引信息", required = true)
            @RequestParam(value = "patient", required = true) String patientInfo,
            @ApiParam(name = "userId", value = "用户ID", required = true)
            @RequestParam(value = "userId") Integer userId,
            @ApiParam(name = "accessToken", value = "数据令牌", required = true)
            @RequestParam(value = "accessToken") String accessToken,
            HttpServletRequest request ) {
        Map<String, String[]> parameterMap = request.getParameterMap();
        System.out.println(parameterMap);
        boolean result = false;
        RestEcho restEcho = new RestEcho();
        try {
            restEcho = tokenValid(userId, accessToken);
            if (restEcho.getCode().asText().equals(Constants.OK)) {
                Patient patient = DataCollectDispatcher.getInstance().parsePatient(patientInfo);
                if (patient != null) {
                    boolean patientStore = DataCollectDispatcher.getInstance().isPatientStore(patient.getOrgCode(), patient.getPatientId(), patient.getEventNo());
                    if (patientStore && !LogicValues.LOGIC_TRUE.equals(patient.getReUploadFlg())) {//是否已传并不是为补传的病人
                        restEcho.failed(Constants.NO);
                        return restEcho;
                    }else {
                        result = DataCollectDispatcher.getInstance().collectData(patient);
                    }
                }
                if (!result) {
                    restEcho.failed(Constants.NO);
                } else {
                    restEcho.success();
                }
            } else {
                // token验证失败处理
                sendFailPatient(patientInfo, FlowType.AUTH_FAIL_COLLECT);
            }
        } catch (IOException e) {
            restEcho.failed(Constants.NO);
            DebugLogger.error(LogAttribute.MARK_EXCEPTION,request,LogAttribute.FAIL,"CrawlerController采集异常", e);
        }catch (Exception e) {
            sendFailPatient(patientInfo, FlowType.AUTH_FAIL_COLLECT);
            restEcho.failed(Constants.NO);
            DebugLogger.error(LogAttribute.MARK_EXCEPTION,request,LogAttribute.FAIL,"CrawlerController采集异常", e);
        }
        return restEcho;
    }
    @RequestMapping(value = "/patient/query", method = RequestMethod.GET)
    @ApiOperation(value = "查询病人健康档案", produces = "application/json", notes = "查询病人健康档案")
    public RestEcho query(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "patient", value = "病人索引信息", required = true)
            @RequestParam(value = "patient") String patient,
            @ApiParam(name = "userId", value = "用户ID", required = true)
            @RequestParam(value = "userId") Integer userId,
            @ApiParam(name = "accessToken", value = "数据令牌", required = true)
            @RequestParam(value = "accessToken") String accessToken) {
        RestEcho restEcho = tokenValid(userId, accessToken);
        return restEcho;
    }
    @RequestMapping(value = "/patient/check/{orgCode}/{patientID}/{eventNo}", method = RequestMethod.POST)
    @ApiOperation(value = "检查病人是否已采集", produces = "application/json", notes = "检查病人是否已采集")
    public RestEcho check(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "orgCode", value = "机构编码", required = true)
            @PathVariable(value = "orgCode") String orgCode,
            @ApiParam(name = "patientID", value = "病人ID", required = true)
            @PathVariable(value = "patientID") String patientID,
            @ApiParam(name = "eventNo", value = "事件号", required = true)
            @PathVariable(value = "eventNo") String eventNo,
            @ApiParam(name = "userId", value = "用户ID", required = true)
            @RequestParam(value = "userId") Integer userId,
            @ApiParam(name = "accessToken", value = "数据令牌", required = true)
            @RequestParam(value = "accessToken") String accessToken) {
        RestEcho restEcho = tokenValid(userId, accessToken);
        boolean patientStore = DataCollectDispatcher.getInstance().isPatientStore(orgCode, patientID, eventNo);
        if (patientStore) {
            return restEcho.success();
        }
        return restEcho.failed(Constants.NO);
    }
    @RequestMapping(value = "/patient/transform/{orgCode}/{patientID}/{eventNo}", method = RequestMethod.POST)
    @ApiOperation(value = "转换档案到标准格式", produces = "application/json", notes = "采集病人健康档案")
    public String transform(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "orgCode", value = "机构编码", required = true)
            @PathVariable(value = "orgCode") String orgCode,
            @ApiParam(name = "patientID", value = "病人ID", required = true)
            @PathVariable(value = "patientID") String patientID,
            @ApiParam(name = "eventNo", value = "事件号", required = true)
            @PathVariable(value = "eventNo") String eventNo,
            @ApiParam(name = "content", value = "档案内容", required = true)
            @PathVariable(value = "content") String content,
            @ApiParam(name = "userId", value = "用户ID", required = true)
            @RequestParam(value = "userId") Integer userId,
            @ApiParam(name = "accessToken", value = "数据令牌", required = true)
            @RequestParam(value = "accessToken") String accessToken) {
        return content;
    }
    @RequestMapping(value = "/patient/storage/{orgCode}/{patientID}/{eventNo}", method = RequestMethod.POST)
    @ApiOperation(value = "采集病人健康档案", produces = "application/json", notes = "采集病人健康档案")
    public String storage(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "orgCode", value = "机构编码", required = true)
            @PathVariable(value = "orgCode") String orgCode,
            @ApiParam(name = "patientID", value = "病人ID", required = true)
            @PathVariable(value = "patientID") String patientID,
            @ApiParam(name = "eventNo", value = "事件号", required = true)
            @PathVariable(value = "eventNo") String eventNo,
            @ApiParam(name = "storageType", value = "保存类型", required = true)
            @PathVariable(value = "storageType") String storageType,
            @ApiParam(name = "content", value = "档案内容", required = true)
            @PathVariable(value = "content") String content) {
        return "";
    }
    @RequestMapping(value = "/patient/upload", method = RequestMethod.POST)
    @ApiOperation(value = "向总支撑平台上传病人档案", produces = "application/json", notes = "向总支撑平台上传病人档案")
    public RestEcho upload(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "patient", value = "病人索引信息", required = true)
            @RequestParam(value = "patient", required = true) String patientInfo,
            @ApiParam(name = "userId", value = "用户ID", required = true)
            @RequestParam(value = "userId") Integer userId,
            @ApiParam(name = "accessToken", value = "数据令牌", required = true)
            @RequestParam(value = "accessToken") String accessToken,
            HttpServletRequest request) {
        RestEcho restEcho = tokenValid(userId, accessToken);
        try {
            if (restEcho.getCode().asText().equals(Constants.OK)) {
                boolean result = false;
                Patient patient = DataCollectDispatcher.getInstance().parsePatient(patientInfo);
                if (patient != null) {
                    result = DataCollectDispatcher.getInstance().upload(patient);
                }
                if (!result) {
                    restEcho.failed(Constants.NO);
                } else {
                    restEcho.success();
                }
            } else {
                // token验证失败处理
                sendFailPatient(patientInfo, FlowType.AUTH_FAIL_UPLAOD);
            }
        } catch (IOException e) {
            restEcho.failed(Constants.NO);
            DebugLogger.error(LogAttribute.MARK_EXCEPTION,request,LogAttribute.FAIL,"CrawlerController上传异常", e);
        } catch (Exception e) {
            sendFailPatient(patientInfo, FlowType.AUTH_FAIL_UPLAOD);
            restEcho.failed(Constants.NO);
            DebugLogger.fatal(LogAttribute.MARK_EXCEPTION, request, LogAttribute.FAIL, "CrawlerController上传异常", e);
        }
        return restEcho;
    }
    @RequestMapping(value = "/patient/register", method = RequestMethod.POST)
    @ApiOperation(value = "向总支撑平台注册病人", produces = "application/json", notes = "向总支撑平台注册病人")
    public RestEcho register(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "patient", value = "病人索引信息", required = true)
            @RequestParam(value = "patient", required = true) String patientInfo,
            @ApiParam(name = "userId", value = "用户ID", required = true)
            @RequestParam(value = "userId") Integer userId,
            @ApiParam(name = "accessToken", value = "数据令牌", required = true)
            @RequestParam(value = "accessToken") String accessToken,
            HttpServletRequest request) {
        RestEcho restEcho = tokenValid(userId, accessToken);
        try {
            if (restEcho.getCode().asText().equals(Constants.OK)) {
                boolean result = false;
                Patient patient = DataCollectDispatcher.getInstance().parsePatient(patientInfo);
                if (patient != null) {
                    result = DataCollectDispatcher.getInstance().register(patient);
                }
                if (!result) {
                    restEcho.failed(Constants.NO);
                } else {
                    restEcho.success();
                }
            } else {
                // token验证失败处理
                sendFailPatient(patientInfo, FlowType.AUTH_FAIL_REGISTER);
            }
        } catch (IOException e) {
            restEcho.failed(Constants.NO);
            DebugLogger.error(LogAttribute.MARK_EXCEPTION, request, LogAttribute.FAIL, "CrawlerController注册异常", e);
        }  catch (Exception e) {
            sendFailPatient(patientInfo, FlowType.AUTH_FAIL_REGISTER);
            restEcho.failed(Constants.NO);
            DebugLogger.fatal(LogAttribute.MARK_EXCEPTION, request, LogAttribute.FAIL, "CrawlerController注册异常", e);
        }
        return restEcho;
    }
    @RequestMapping(value = "/security/saveFail", method = RequestMethod.POST)
    @ApiOperation(value = "安全认证失败病人保存", produces = "application/json", notes = "安全认证失败病人保存到队列")
    public RestEcho saveAuthFail(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
            @ApiParam(name = "patient", value = "病人索引信息", required = true)
            @RequestParam(value = "patient", required = true) String patientInfo) {
        RestEcho restEcho = new RestEcho();
        DebugLogger.debug("saveAuthFail");
        boolean succ= sendFailPatient(patientInfo, FlowType.AUTH_GEN_FAIL);
        if (succ){
            restEcho.success();
        }else {
            restEcho.failed(Constants.NO);
        }
        return restEcho;
    }
    public boolean sendFailPatient(String patientInfo, String failType) {
        boolean result=false;
     try {
            ObjectMapper objectMapper = new ObjectMapper();
            ObjectNode rootNode = objectMapper.readValue(patientInfo, ObjectNode.class);
            rootNode.put(FlowType.AUTH_FAIL_TYPE, failType);
            String patient = rootNode.toString();
            ActiveMQHelper activeMQSender = new ActiveMQHelper();
            activeMQSender.sendJSONMessage(FlowType.AUTH_FAIL_PATIENT, patient);
            result=true;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    @RequestMapping(value = "/patient/uploadLog", method = RequestMethod.POST)
    @ApiOperation(value = "向总支撑平台上传日志文件", produces = "application/json", notes = "向总支撑平台上传日志文件")
    public RestEcho uploadLog(
            @ApiParam(name = "apiVersion", value = "API版本号", defaultValue = "v1.0")
            @PathVariable(value = "apiVersion") String apiVersion,
//            @ApiParam(name = "types", value = "日志类型", required = true)
//            @RequestParam(value = "types", required = true) String[] types,
            @ApiParam(name = "beginTime", value = "开始时间", required = true)
            @RequestParam(value = "beginTime") String beginTime,
            @ApiParam(name = "endTime", value = "结束时间", required = true)
            @RequestParam(value = "endTime") String endTime,
            @ApiParam(name = "userId", value = "用户ID", required = true)
            @RequestParam(value = "userId") Integer userId,
            @ApiParam(name = "accessToken", value = "数据令牌", required = true)
            @RequestParam(value = "accessToken") String accessToken,
            HttpServletRequest request) {
        RestEcho restEcho = tokenValid(userId, accessToken);
        SimpleDateFormat sdf=new SimpleDateFormat(DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
        try {
            Date begin=sdf.parse(beginTime);
            Date end=sdf.parse(endTime);
            if (restEcho.getCode().asText().equals(Constants.OK)) {
                   boolean result = DataCollectDispatcher.getInstance().uploadLog(null,begin,end);
                if (!result) {
                    restEcho.failed(Constants.NO);
                } else {
                    restEcho.success();
                }
            } else {
                System.out.println("---------------");
                // TODO token验证失败处理
            }
        } catch (ParseException e) {
            restEcho.failed(Constants.NO);
            DebugLogger.fatal("CrawlerController日志上传异常", e);
        }
        return restEcho;
    }
}

+ 124 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterDataSet.java

@ -0,0 +1,124 @@
package com.yihu.ehr.crawler.model.adapter;
import com.yihu.ehr.crawler.model.PatientIdentity;
import com.yihu.ehr.framework.util.operator.CollectionUtil;
import com.yihu.ehr.framework.util.operator.StringUtil;
import com.yihu.ehr.standard.model.adapter.AdapterDatasetModel;
import com.yihu.ehr.standard.model.adapter.AdapterMetadataModel;
import com.yihu.ehr.standard.model.standard.StdMetaDataModel;
import com.yihu.ehr.standard.service.adapter.AdapterMetadataService;
import com.yihu.ehr.standard.service.bo.AdapterVersion;
import net.sf.json.JSONObject;
import javax.annotation.Resource;
import java.util.*;
/**
 * @author Air
 * @version 1.0
 * @created 2015.08.11 11:29
 */
public class AdapterDataSet {
    @Resource(name = AdapterMetadataService.BEAN_ID)
    private AdapterMetadataService metadataService;
    private List<AdapterMetaData> adapterMetaDataList;
    private AdapterDatasetModel adapterDatasetModel;
    private Map<String, AdapterMetaData> adapterMetaDataMap;
    private List<StdMetaDataModel> stdMetaDataModelList;
    private Map<String, StdMetaDataModel> stdMetaDataModelMap;
    private String eventNoCode;
    private AdapterVersion adapterVersion;
    public AdapterDataSet(AdapterDatasetModel adapterDatasetModel, AdapterVersion adapterVersion) {
        this.adapterDatasetModel = adapterDatasetModel;
        this.adapterVersion = adapterVersion;
        getAdapterMetaDataList();
        getAdapterMetaDataMap();
    }
    public AdapterDatasetModel getAdapterDataSetT() {
        return adapterDatasetModel;
    }
    public List<AdapterMetaData> getAdapterMetaDataList() {
        if (CollectionUtil.isEmpty(adapterMetaDataList)) {
            adapterMetaDataList = new ArrayList<>();
            Map<String,String> condition = new HashMap<String,String>();
            condition.put("stdDatasetId", StringUtil.toString(adapterDatasetModel.getStdDatasetId()));
            JSONObject jsonpObject = JSONObject.fromObject(condition);
            List<AdapterMetadataModel> adapterMetaDataModelList = metadataService.getMetadataList(AdapterMetadataModel.class, adapterVersion.getVersion(), jsonpObject.toString(), null, null, null);
            if (!CollectionUtil.isEmpty(adapterMetaDataModelList)) {
                for (AdapterMetadataModel adapterMetadataModel : adapterMetaDataModelList) {
                    adapterMetaDataList.add(new AdapterMetaData(adapterMetadataModel, adapterVersion));
                }
            }
        }
        return adapterMetaDataList;
    }
//    public List<StdMetaDataModel> getStdMetaDataModelList() {
//        Map<String,String> condition = new HashMap<String,String>();
//        condition.put("stdDatasetId", StringUtil.toString(adapterDatasetModel.getStdDatasetId()));
//        JSONObject jsonpObject = JSONObject.fromObject(condition);
//        stdMetaDataModelList = metadataService.getMetadataList(AdapterMetadataModel.class, adapterVersion, jsonpObject.toString(), null, null, null);
//
//
//        return stdMetaDataList;
//    }
    public Map<String, AdapterMetaData> getAdapterMetaDataMap() {
        if (CollectionUtil.isEmpty(adapterMetaDataList)) {
            getAdapterMetaDataList();
        }
        if (!CollectionUtil.isEmpty(adapterMetaDataList)) {
            if (adapterMetaDataMap == null) {
                adapterMetaDataMap = new HashMap<>();
                for (AdapterMetaData adapterMetaData : adapterMetaDataList) {
                    adapterMetaDataMap.put(adapterMetaData.getAdapterMetadataModel().getStdMetadataCode(), adapterMetaData);
                }
            }
        }
        return adapterMetaDataMap;
    }
    public boolean isHavePatientID() {
        return findPatientIdentity(PatientIdentity.getPatientIDCode());
    }
    public boolean isHaveEventNo() {
        Set<String> eventNoSet = PatientIdentity.getEventNoSet();
        for (String eventNo : eventNoSet) {
            if (findPatientIdentity(eventNo)) {
                eventNoCode = eventNo;
                return true;
            }
        }
        return false;
    }
    public boolean isHaveLocalCardNo() {
        return findPatientIdentity(PatientIdentity.getLocalCardNoCode());
    }
    public boolean isHaveIdCard() {
        return findPatientIdentity(PatientIdentity.getIdCardCode());
    }
    public boolean findPatientIdentity(String code) {
        if (getAdapterMetaDataMap().get(code) == null) {
            return false;
        }
        return true;
    }
    public String getEventNoCode() {
        return eventNoCode;
    }
}

+ 96 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterDict.java

@ -0,0 +1,96 @@
package com.yihu.ehr.crawler.model.adapter;
import com.yihu.ehr.framework.util.operator.CollectionUtil;
import com.yihu.ehr.framework.util.operator.StringUtil;
import com.yihu.ehr.standard.model.adapter.AdapterDictEntryModel;
import com.yihu.ehr.standard.model.adapter.AdapterDictModel;
import com.yihu.ehr.standard.service.adapter.AdapterDictEntryService;
import com.yihu.ehr.standard.service.bo.AdapterVersion;
import net.sf.json.JSONObject;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @author Air
 * @version 1.0
 * @created 2015.08.11 11:31
 */
public class AdapterDict {
    @Resource(name = AdapterDictEntryService.BEAN_ID)
    private AdapterDictEntryService adapterDictEntryService;
    public static final String INVALID_ADAPTER_DICT = "";   //"Invalid Adapter";
    private AdapterDictModel adapterDictModel;
    private AdapterVersion adapterVersion;
    public AdapterDict(AdapterDictModel adapterDictModel, AdapterVersion adapterVersion) {
        this.adapterDictModel = adapterDictModel;
        this.adapterVersion = adapterVersion;
    }
    public Boolean isValidAdapterDict() {
        return adapterDictModel != null;
    }
    public String getStdDictEntryValueByCode(String adapterEntryCode) {
        Map<String,String> condition = new HashMap<String,String>();
        condition.put("adapterDictId", StringUtil.toString(adapterDictModel.getId()));
        condition.put("adapterEntryCode", adapterEntryCode);
        JSONObject jsonpObject = JSONObject.fromObject(condition);
        List<AdapterDictEntryModel> adapterDictEntryModelList = adapterDictEntryService.getList(AdapterDictEntryModel.class, adapterVersion.getDictEntryTableName(), jsonpObject.toString(), null, null, null, null);
        if (!CollectionUtil.isEmpty(adapterDictEntryModelList)) {
            String stdDictEntryValue = adapterDictEntryModelList.get(0).getStdEntryValue();
            if (!StringUtil.isEmpty(stdDictEntryValue)) {
                return stdDictEntryValue;
            }
        }
        return new String(INVALID_ADAPTER_DICT);
    }
    public String getStdDictEntryCodeByValue(String adapterEntryValue) {
        Map<String,String> condition = new HashMap<String,String>();
        condition.put("adapterDictId", StringUtil.toString(adapterDictModel.getId()));
        condition.put("adapterEntryValue", adapterEntryValue);
        JSONObject jsonpObject = JSONObject.fromObject(condition);
        List<AdapterDictEntryModel> adapterDictEntryModelList = adapterDictEntryService.getList(AdapterDictEntryModel.class, adapterVersion.getDictEntryTableName(), jsonpObject.toString(), null, null, null, null);
        if (!CollectionUtil.isEmpty(adapterDictEntryModelList)) {
            String stdDictEntryCode = adapterDictEntryModelList.get(0).getStdEntryCode();
            if (!StringUtil.isEmpty(stdDictEntryCode)) {
                return stdDictEntryCode;
            }
        }
        return new String(INVALID_ADAPTER_DICT);
    }
    public String getStdDictEntryCodeByCode(String adapterEntryCode) {
        Map<String,String> condition = new HashMap<String,String>();
        condition.put("adapterDictId", StringUtil.toString(adapterDictModel.getId()));
        condition.put("adapterEntryCode", adapterEntryCode);
        JSONObject jsonpObject = JSONObject.fromObject(condition);
        List<AdapterDictEntryModel> adapterDictEntryModelList = adapterDictEntryService.getList(AdapterDictEntryModel.class, adapterVersion.getDictEntryTableName(), jsonpObject.toString(), null, null, null, null);
        if (!CollectionUtil.isEmpty(adapterDictEntryModelList)) {
            String stdDictEntryCode = adapterDictEntryModelList.get(0).getStdEntryCode();
            if (!StringUtil.isEmpty(stdDictEntryCode)) {
                return stdDictEntryCode;
            }
        }
        return new String(INVALID_ADAPTER_DICT);
    }
    public String getStdDictEntryValueByValue(String adapterEntryValue) {
        Map<String,String> condition = new HashMap<String,String>();
        condition.put("adapterDictId", StringUtil.toString(adapterDictModel.getId()));
        condition.put("adapterEntryValue", adapterEntryValue);
        JSONObject jsonpObject = JSONObject.fromObject(condition);
        List<AdapterDictEntryModel> adapterDictEntryModelList = adapterDictEntryService.getList(AdapterDictEntryModel.class, adapterVersion.getDictEntryTableName(), jsonpObject.toString(), null, null, null, null);
        if (!CollectionUtil.isEmpty(adapterDictEntryModelList)) {
            String stdDictEntryValue = adapterDictEntryModelList.get(0).getStdEntryValue();
            if (!StringUtil.isEmpty(stdDictEntryValue)) {
                return stdDictEntryValue;
            }
        }
        return new String(INVALID_ADAPTER_DICT);
    }
}

+ 13 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterDictEntry.java

@ -0,0 +1,13 @@
package com.yihu.ehr.crawler.model.adapter;
import com.yihu.ehr.standard.model.adapter.AdapterDictEntryModel;
public class AdapterDictEntry {
    private AdapterDictEntryModel adapterDictEntryModel;
    private String version;
    public AdapterDictEntry(AdapterDictEntryModel adapterDictEntryModel, String version) {
        this.adapterDictEntryModel = adapterDictEntryModel;
        this.version = version;
    }
}

+ 86 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/adapter/AdapterMetaData.java

@ -0,0 +1,86 @@
package com.yihu.ehr.crawler.model.adapter;
import com.yihu.ehr.crawler.model.DictDataType;
import com.yihu.ehr.crawler.model.MetaDataType;
import com.yihu.ehr.framework.constrant.ErrorCode;
import com.yihu.ehr.framework.util.operator.NumberUtil;
import com.yihu.ehr.standard.model.adapter.AdapterDictModel;
import com.yihu.ehr.standard.model.adapter.AdapterMetadataModel;
import com.yihu.ehr.standard.model.standard.StdMetaDataModel;
import com.yihu.ehr.standard.service.adapter.AdapterDictService;
import com.yihu.ehr.standard.service.bo.AdapterVersion;
import com.yihu.ehr.standard.service.standard.StdMetadataService;
import javax.annotation.Resource;
/**
 * @author Air
 * @version 1.0
 * @created 2015.08.11 11:31
 */
public class AdapterMetaData {
    @Resource(name = StdMetadataService.BEAN_ID)
    StdMetadataService stdMetadataService;
    @Resource(name = AdapterDictService.BEAN_ID)
    private AdapterDictService adapterDictService;
    private AdapterMetadataModel adapterMetadataModel;
    private AdapterDict adapterDict;
    private StdMetaDataModel stdMetaDataModel;
    private AdapterVersion adapterVersion;
    public AdapterMetaData(AdapterMetadataModel adapterMetadataModel, AdapterVersion adapterVersion) {
        this.adapterMetadataModel = adapterMetadataModel;
        this.adapterVersion = adapterVersion;
    }
    public AdapterMetadataModel getAdapterMetadataModel() {
        return adapterMetadataModel;
    }
    public AdapterDict getAdapterDict() {
        if (adapterDict == null) {
            StdMetaDataModel stdMetaDataModel = getStdMetaDataModel();
            if (!NumberUtil.isZero(stdMetaDataModel.getDictId())) {
                AdapterDictModel adapterDictModel = (AdapterDictModel) adapterDictService.get(AdapterDictModel.class, adapterVersion.getDictTableName(), stdMetaDataModel.getDictId(), ErrorCode.GetDictFaild);
                if (adapterDictModel != null) {
                    adapterDict = new AdapterDict(adapterDictModel, adapterVersion);
                }
            }
        }
        return adapterDict;
    }
    public StdMetaDataModel getStdMetaDataModel() {
        if (stdMetaDataModel == null) {
            stdMetaDataModel = (StdMetaDataModel) stdMetadataService.get(StdMetaDataModel.class, adapterVersion.getMetaDataTableName(), adapterMetadataModel.getStdMetadataId(), ErrorCode.GetMetaDataFailed);
        }
        return stdMetaDataModel;
    }
    public DictDataType getAdapterDictDataType() {
        Integer orgDictDataType = adapterMetadataModel.getAdapterDataType();
        if (orgDictDataType == null){
            return DictDataType.VALUE;
        }
        return DictDataType.values()[orgDictDataType];
    }
    public DictDataType getStdDictDataType() {
        if (stdMetaDataModel == null) {
            getAdapterMetadataModel();
        }
        Integer dictId = stdMetaDataModel.getDictId();
        String type = stdMetaDataModel.getType();
        int dictValueType;
        if (!NumberUtil.isZero(dictId) && (type.equals(MetaDataType.S2.name()) || type.equals(MetaDataType.S3.name()))) {
            dictValueType = DictDataType.CODE.ordinal();
        } else {
            dictValueType = DictDataType.VALUE.ordinal();
        }
        return DictDataType.values()[dictValueType];
    }
}

+ 152 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/config/SysConfig.java

@ -0,0 +1,152 @@
package com.yihu.ehr.crawler.model.config;
import com.yihu.ehr.crawler.model.patient.PatientIdentity;
import com.yihu.ehr.framework.util.log.LogService;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
public class SysConfig {
    public static final String HOS_RESOURCES_CONFIG = "/config/sys.config.xml";
    public static String publicKey;
    public static String orgCode;
    public static String tempFile;
    public static String registerDataSet;
    public static String registerIdCardNo;
    private static volatile SysConfig instance = null;
    private HashMap<String, PatientIdentity> patientIdentityHashMap;
    private SysConfig() {
        patientIdentityHashMap = new HashMap<>();
        init();
    }
    public static SysConfig getInstance() {
        if (instance == null) {
            synchronized (SysConfig.class) {
                if (instance == null) {
                    try {
                        instance = new SysConfig();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return instance;
    }
    public void finalize() throws Throwable {
    }
    public String getTempFile() {
        return this.tempFile;
    }
    public void setTempFile(String tempFile) {
        this.tempFile = tempFile;
    }
    public String getPublicKey() {
        return publicKey;
    }
    public void setPublicKey(String publicKey) {
        this.publicKey = publicKey;
    }
    public PatientIdentity getPatientIdentity(String dataSetCode) {
        return patientIdentityHashMap.get(dataSetCode);
    }
    public HashMap<String, PatientIdentity> getPatientIdentityHashMap() {
        return patientIdentityHashMap;
    }
    public String getRegisterDataSet() {
        return registerDataSet;
    }
    public String getRegisterIdCardNo() {
        return registerIdCardNo;
    }
    private Document getDocument() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = null;
        try {
            InputStream inputStream = SysConfig.class.getResourceAsStream(HOS_RESOURCES_CONFIG);
            document = reader.read(inputStream);
            return document;
        } catch (DocumentException de) {
            LogService.getLogger().info("读取classpath下的xml文档路径发生异常");
            return null;
        }
    }
    private void init() {
        try {
            Document document = this.getDocument();
            Element rootElement = null;
            if (document != null) {
                rootElement = document.getRootElement();
            }
            if (rootElement == null) {
                return;
            }
            this.initCrawler(rootElement);
            this.initEventNo(rootElement);
        } catch (Exception e) {
            LogService.getLogger().error(e.getCause().toString());
        }
    }
    private void initCrawler(Element rootElement) {
        List queueDataSets = rootElement.element("patient_queue").elements("dataset");
        for (Object obj : queueDataSets) {
            if (obj instanceof Element) {
                Element element = (Element) obj;
                String dataSetCode = element.attributeValue("code");
                String eventNo = element.elementTextTrim("event_no");
                String refTime = element.elementTextTrim("ref_time");
                PatientIdentity patientIdentity = new PatientIdentity(eventNo, refTime);
                patientIdentityHashMap.put(dataSetCode, patientIdentity);
            }
        }
        Element registerDataSet = rootElement.element("register").element("dataset");
        this.registerDataSet = registerDataSet.attributeValue("code");
        this.registerIdCardNo = registerDataSet.elementTextTrim("id_card");
    }
    private void initEventNo(Element rootElement) {
        List eventItems = rootElement.element("event_no").elements("item");
        for (Object obj : eventItems) {
            if (obj instanceof Element) {
                Element element = (Element) obj;
                String eventNoCode = element.getTextTrim();
                PatientIdentity.addEventNoCode(eventNoCode);
            }
        }
    }
    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }
    public String getOrgCode() {
        return orgCode;
    }
}//end SysConfig

+ 103 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/patient/Patient.java

@ -0,0 +1,103 @@
package com.yihu.ehr.crawler.model.patient;
/**
 * @author Air
 * @version 1.0
 * @created 2015.08.14 10:12
 */
public class Patient {
    private String patientId;
    private String eventNo;
    private String localCardNo;
    private String idCard;
    private String orgCode;
    private String latestTime;
    private String referenceTime;
    private String reUploadFlg;
    private String jobTimeStamp;
    private String failType; //采集失败类型
    public Patient() {
    }
    public String getPatientId() {
        return patientId;
    }
    public void setPatientId(String patientId) {
        this.patientId = patientId;
    }
    public String getEventNo() {
        return eventNo;
    }
    public void setEventNo(String eventNo) {
        this.eventNo = eventNo;
    }
    public String getLocalCardNo() {
        return localCardNo;
    }
    public void setLocalCardNo(String localCardNo) {
        this.localCardNo = localCardNo;
    }
    public String getIdCard() {
        return idCard;
    }
    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }
    public String getOrgCode() {
        return orgCode;
    }
    public void setOrgCode(String orgCode) {
        this.orgCode = orgCode;
    }
    public String getLatestTime() {
        return latestTime;
    }
    public void setLatestTime(String latestTime) {
        this.latestTime = latestTime;
    }
    public String getReferenceTime() {
        return referenceTime;
    }
    public void setReferenceTime(String referenceTime) {
        this.referenceTime = referenceTime;
    }
    public String getJobTimeStamp() {
        return jobTimeStamp;
    }
    public void setJobTimeStamp(String jobTimeStamp) {
        this.jobTimeStamp = jobTimeStamp;
    }
    public String getReUploadFlg() {
        return reUploadFlg;
    }
    public void setReUploadFlg(String reUploadFlg) {
        this.reUploadFlg = reUploadFlg;
    }
    public String getFailType() {
        return failType;
    }
    public void setFailType(String failType) {
        this.failType = failType;
    }
}

+ 59 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/patient/PatientIdentity.java

@ -0,0 +1,59 @@
package com.yihu.ehr.crawler.model.patient;
import java.util.HashSet;
import java.util.Set;
/**
 * 病人身份标识
 * 病人ID, 事件号(门诊号,住院号等),卡号,身份证号
 * 目前使用的是病人ID和事件号
 *
 * @author Air
 * @version 1.0
 * @created 2015.06.16 16:29
 */
public class PatientIdentity {
    public static final String PATIENT_ID = "PATIENT_ID";
    public static final String LOCAL_CARD_NO = "CARD_NO";
    public static final String ID_CARD = "DE02_01_030_00";
    public static Set<String> EVENT_NO_SET = new HashSet<>();
    private String eventNoCode;
    private String refTimeCode;
    public PatientIdentity(String eventNoCode, String refTimeCode) {
        this.eventNoCode = eventNoCode;
        this.refTimeCode = refTimeCode;
        EVENT_NO_SET.add(eventNoCode);
    }
    public static String getPatientIDCode() {
        return PATIENT_ID;
    }
    public static String getLocalCardNoCode() {
        return LOCAL_CARD_NO;
    }
    public static String getIdCardCode() {
        return ID_CARD;
    }
    public static Set<String> getEventNoSet() {
        return EVENT_NO_SET;
    }
    public static void addEventNoCode(String eventNoCode) {
        EVENT_NO_SET.add(eventNoCode);
    }
    public String getEventNoCode() {
        return eventNoCode;
    }
    public String getRefTimeCode() {
        return refTimeCode;
    }
}

+ 9 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/DictDataType.java

@ -0,0 +1,9 @@
package com.yihu.ehr.crawler.model.transform;
/**
 * Created by Administrator on 2015/9/16.
 */
public enum DictDataType {
    VALUE, //值
    CODE //编码
}

+ 65 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/EhrCondition.java

@ -0,0 +1,65 @@
package com.yihu.ehr.crawler.model.transform;
/**
 * 集成平台采集条件基类
 * Created by HZY on 2016/2/25.
 */
public class EhrCondition {
    private String andOr;
    private String field;
    private String condition;
    private String value;
    public EhrCondition(String condition, String field, String value){
        this.andOr=" AND ";
        this.field=field;
        this.condition=condition;
        this.value=value;
    }
    public void andQuery(String condition,String field,String value){
        this.andOr=" AND ";
        this.field=field;
        this.condition=condition;
        this.value=value;
    }
    public void orQuery(String condition,String field,String value){
        this.andOr=" OR ";
        this.field=field;
        this.condition=condition;
        this.value=value;
    }
    public String getAndOr() {
        return andOr;
    }
    public void setAndOr(String andOr) {
        this.andOr = andOr;
    }
    public String getField() {
        return field;
    }
    public void setField(String field) {
        this.field = field;
    }
    public String getCondition() {
        return condition;
    }
    public void setCondition(String condition) {
        this.condition = condition;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
}

+ 15 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/IVerifier.java

@ -0,0 +1,15 @@
package com.yihu.ehr.crawler.model.transform;
/**
 * @author Airhead
 * @version 1.0
 * @created 22-5-2015 11:24:26
 */
public interface IVerifier {
    /**
     */
    boolean check();
    String getErrorInfo();
}

+ 12 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/LogicValues.java

@ -0,0 +1,12 @@
package com.yihu.ehr.crawler.model.transform;
/**
 * Created by HZY on 2016/1/29.
 */
public class LogicValues {
    public static final String LOGIC_OK = "ok";
    public static final String LOGIC_NO = "no";
    public static final String LOGIC_TRUE = "true";
    public static final String LOGIC_FALSE = "false";
}

+ 45 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/MetaDataType.java

@ -0,0 +1,45 @@
package com.yihu.ehr.crawler.model.transform;
/**
 * 数据元类型
 *
 * @created Created by Air on 2015/6/9.
 */
public enum MetaDataType {
    /**
     * 字符,不可枚举
     */
    S1,
    /**
     * 字符,枚举<=3个
     */
    S2,
    /**
     * 字符,代码表
     */
    S3,
    /**
     * 布尔,0(False),1(True)
     */
    L,
    /**
     * 数值,
     */
    N,
    /**
     * 日期
     */
    D,
    /**
     * 时间日期
     */
    DT,
    /**
     * 时间
     */
    T,
    /**
     * 二进制
     */
    BY
}

+ 37 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/MetaDataVerify.java

@ -0,0 +1,37 @@
package com.yihu.ehr.crawler.model.transform;
import com.yihu.ehr.standard.model.standard.StdMetaDataModel;
/**
 * @author Airhead
 * @version 1.0
 * @created 22-5-2015 11:24:25
 */
public class MetaDataVerify implements IVerifier {
    private StdMetaDataModel stdMetaDataModel;
    private String value;
    private String errorInfo;
    public MetaDataVerify(StdMetaDataModel stdMetaDataModel, String value) {
        this.stdMetaDataModel = stdMetaDataModel;
        this.value = value;
    }
    public void finalize() throws Throwable {
    }
    /**
     * 目前不做任何数据校验
     * 必要时根据StdMetaData的type, format内容做校验
     */
    public boolean check() {
        return true;
    }
    @Override
    public String getErrorInfo() {
        return errorInfo;
    }
}//end MetaDataVerify

+ 21 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/model/transform/TransformType.java

@ -0,0 +1,21 @@
package com.yihu.ehr.crawler.model.transform;
/**
 * @created  Air on 2015/6/8.
 */
public enum TransformType {
    /**
     * 数据集
     */
    DATA_SET_JSON,
    DATA_SET_XML,
    /**
     * CDA
     */
    CDA_JSON,
    CDA_XML,
    /**
     * 非结构化
     */
    DOCUMENT,
}

+ 226 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/service/CrawlerManager.java

@ -0,0 +1,226 @@
package com.yihu.ehr.crawler.service;
import com.yihu.ehr.common.config.SysConfig;
import com.yihu.ehr.common.constants.Constants;
import com.yihu.ehr.dbhelper.jdbc.DBHelper;
import com.yihu.ehr.model.DataSource;
import com.yihu.ehr.model.Patient;
import com.yihu.ehr.model.entity.adapter.AdapterDataSet;
import com.yihu.ehr.model.entity.adapter.AdapterDataSetT;
import com.yihu.ehr.util.db.DBSessionFactory;
import com.yihu.ehr.util.httpclient.EsbHttp;
import com.yihu.ehr.util.log.LogUtil;
import org.json.JSONObject;
import java.sql.SQLException;
import java.util.*;
/**
 * 标准管理,负责版本的升级,解包及相关安全
 *
 * @created Created by Air on 2015/6/3.
 */
public class CrawlerManager {
    private DBHelper db;
    private static volatile CrawlerManager instance;
    private static DataCollectDispatcher dispatch;
    private List<AdapterDataSet> adapterDataSetList;
    private List<DataSource> dataSourceList;
    private List<Patient> patientList;
    public CrawlerManager() {
        db = new DBHelper();
        dispatch = DataCollectDispatcher.getInstance();
    }
    public void finalize() throws Throwable {
    }
    public static CrawlerManager getInstance() {
        if (instance == null) {
            synchronized (CrawlerManager.class) {
                if (instance == null) {
                    try {
                        instance = new CrawlerManager();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return instance;
    }
    public void dataCrawlerFrequency() {
        List<JSONObject> versionList = db.query("select code from std_inner_version order by code desc");
        if(versionList==null)
        {
            LogUtil.info("标准数据还未初始化,请确认!");
            return;
        }
        String uuid = UUID.randomUUID().toString();
        Date lastCralwerTime = DateUtil.getSysDateTime();
        lastCralwerTime = DateUtil.formatYMDToYMDHMS(lastCralwerTime.toString());
        JSONObject json = db.load("select param_value from system_param where param_key = 'LAST_TIME'");
        if (!json.isNull("param_value") && !StringUtil.isEmpty(json.getString("param_value"))) {
            lastCralwerTime = DateUtil.formatYMDToYMDHMS(json.getString("param_value"));
        }
        Date current = DateUtil.fromatDateToTimestamp(DateUtil.getSysDateTime());
        db.execute("update system_param set param_value = '" + current.toString() + "'  where param_key = 'LAST_TIME'");
        LogUtil.info("采集任务开始!任务ID:" + uuid + ",采集时间:" + lastCralwerTime + "~" + current);
        if ((current.getTime() - lastCralwerTime.getTime()) <= 0) {
            LogUtil.info("采集不予执行,时间间隔小于或等于0!任务ID:" + uuid + ",采集时间:" + lastCralwerTime + "~" + current);
            return;
        }
        String message = dataCrawler(lastCralwerTime, current, uuid, 0);
        LogUtil.info("采集任务结束!任务ID:" + uuid + ",采集时间:" + lastCralwerTime + "~" + current + "\n" +message);
    }
    public void dataCrawlerSupply() {
        List<JSONObject> versionList = db.query("select code from std_inner_version order by code desc");
        if(versionList==null)
        {
            LogUtil.info("标准数据还未初始化,请确认!");
            return;
        }
        List<JSONObject> jsonList = db.query("select * from crawler_supply where status != 1");
        if (!CollectionUtil.isEmpty(jsonList)) {
            for (JSONObject json : jsonList) {
                String id = json.getString("id");
                db.execute("update crawler_supply set status = 2 where id = '"+id+"'");
                Date startTime = DateUtil.formatYMDToYMDHMS(json.getString("start_time"));
                Date endTime = DateUtil.formatYMDToYMDHMS(json.getString("end_time"));
                String message = "";
                if(startTime!=null && endTime!=null) {
                    LogUtil.info("补采任务开始!任务ID:" + id + ",采集时间:" + startTime + "~" + endTime);
                    if ((endTime.getTime() - startTime.getTime()) <= 0) {
                        LogUtil.info("补采任务提前结束,时间间隔小于或等于0!任务ID:" + id + ",采集时间:" + startTime + "~" + endTime);
                        changeFillMiningStatus(json, "补采任务提前结束,时间间隔小于或等于0!");
                        return;
                    }
                    message = dataCrawler(startTime, endTime, id, 1);
                    LogUtil.info("补采任务结束!任务ID:" + id + ",采集时间:" + startTime + "~" + endTime + "\n" + message);
                }
                else{
                    message = "采集时间范围:" + startTime + "~" + endTime + "无效!";
                    LogUtil.info(message);
                }
                if (!StringUtil.isEmpty(message)) {
                    changeFillMiningStatus(json, message);
                }
            }
        }
    }
    public void changeFillMiningStatus(JSONObject json, String message) {
        String id = json.getString("id");
        db.execute("update crawler_supply set status = 1 where id = '"+id+"'");
        if (!json.isNull("remote_id") && !StringUtil.isEmpty(json.getString("remote_id"))) {
            EsbHttp.changeFillMiningStatus(json.getString("remote_id"), message, "1");
        }
    }
    public synchronized String dataCrawler(Date begin, Date end, String taskId, int type) {
        if (SysConfig.getInstance().isEmptyOrgCode()) {
            return "本次任务执行失败,机构代码为空";
        }
        Integer count = 0;
        Integer totalCount = 0;
        getAdapterDataSetList();
        getDataSourceList();
        Map<String, Object> condition = new HashMap<>();
        condition.put("beginDate", begin);
        condition.put("endDate", end);
        condition.put("orgCode", SysConfig.getInstance().orgCode);
        Map<String, DBSessionFactory> dataSourceMap = new HashMap<>();
        try {
            if (!CollectionUtil.isEmpty(dataSourceList)) {
                for (DataSource dataSource : dataSourceList) {
                    String name = dataSource.getName();
                    String config = dataSource.getConfig();
                    DBSessionFactory.addDataSource(name, config);
                    DBSessionFactory dbSessionFactory = new DBSessionFactory(name);
                    dataSourceMap.put(dataSource.getId(), dbSessionFactory);
                }
                patientList = dispatch.getPatientQueue(condition, adapterDataSetList, dataSourceMap);
                if (!CollectionUtil.isEmpty(patientList)) {
                    totalCount = patientList.size();
                    for (Patient patient : patientList) {
                        String token;
                        try {
                            token = EsbHttp.getToken();
                        } catch (Exception e) {
                            LogUtil.error("本次任务执行失败,获取token失败!");
                            return "本次任务执行失败,获取token失败!";
                        }
                        if (type == 1) {
                            patient.setReUploadFlg(StringUtil.toString(true));
                        } else {
                            patient.setReUploadFlg(StringUtil.toString(false));
                        }
                        LogUtil.trace("采集->注册->打包上传,任务ID:"+taskId+",patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
                        // COLLECT->REGISTER->UPLOAD
                        Boolean result = dispatch.collectData(patient, adapterDataSetList, dataSourceMap, token);
                        SqlCreate sqlCreate = new SqlCreate();
                        sqlCreate.setTableName("task_track");
                        Map<String, String> keyValueMap = new HashMap<>();
                        UUID uuid = UUID.randomUUID();
                        keyValueMap.put("id", Constants.SINGLE_QUOTE_MARK + uuid.toString() + Constants.SINGLE_QUOTE_MARK);
                        keyValueMap.put("patient_id", Constants.SINGLE_QUOTE_MARK + patient.getPatientId() + Constants.SINGLE_QUOTE_MARK);
                        keyValueMap.put("event_no", Constants.SINGLE_QUOTE_MARK + patient.getEventNo() + Constants.SINGLE_QUOTE_MARK);
                        keyValueMap.put("crawler_time", Constants.SINGLE_QUOTE_MARK + DateUtil.getCurrentString(DateUtil.DEFAULT_YMDHMSDATE_FORMAT) + Constants.SINGLE_QUOTE_MARK);
                        if (result) {
                            keyValueMap.put("status", "1");
                            ++count;
                        } else {
                            keyValueMap.put("status", "0");
                        }
                        sqlCreate.setKeyValueMap(keyValueMap);
                        db.execute(sqlCreate.insertDataByKeyValue());
                    }
                }
            }
        } catch (Exception e) {
            LogUtil.error(e);
            return null;
        } finally {
            for(String key : dataSourceMap.keySet()) {
                DBSessionFactory dbSessionFactory = dataSourceMap.get(key);
                try {
                    dbSessionFactory.close();
                } catch (SQLException e) {
                    LogUtil.error(e);
                    return null;
                }
            }
        }
        String message = "本次采集病人共" + totalCount + "条,成功采集信息"+ count + "条";
        LogUtil.info(message);
        return message;
    }
    public void getAdapterDataSetList() {
        adapterDataSetList = new ArrayList<>();
        List<JSONObject> dataSetList = db.query("select id, std_dataset_id, std_dataset_code, org_dataset_code from adapter_dataset");
        for (JSONObject json : dataSetList) {
            AdapterDataSetT datasetT = new AdapterDataSetT();
            datasetT.setId(json.getInt("id"));
            datasetT.setStdDatasetCode(json.getString("std_dataset_code"));
            datasetT.setStdDatasetId(json.getInt("std_dataset_id"));
            if (!json.isNull("org_dataset_code")) {
                datasetT.setOrgDatasetCode(json.getString("org_dataset_code"));
            }
            adapterDataSetList.add(new AdapterDataSet(datasetT, db));
        }
    }
    public void getDataSourceList() {
        dataSourceList = db.query(DataSource.class, "select * from system_datasource");
    }
}

+ 216 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/service/DataCollectDispatcher.java

@ -0,0 +1,216 @@
package com.yihu.ehr.crawler.service;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.ehr.common.config.SysConfig;
import com.yihu.ehr.common.constants.Constants;
import com.yihu.ehr.model.Patient;
import com.yihu.ehr.model.PatientIdentity;
import com.yihu.ehr.model.entity.adapter.AdapterDataSet;
import com.yihu.ehr.service.patient.PatientCDAIndex;
import com.yihu.ehr.service.patient.PatientCDAUpload;
import com.yihu.ehr.util.db.DBSessionFactory;
import com.yihu.ehr.util.file.FileUtil;
import com.yihu.ehr.util.httpclient.EsbHttp;
import com.yihu.ehr.util.log.LogUtil;
import com.yihu.ehr.util.operator.CollectionUtil;
import com.yihu.ehr.util.operator.StringUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataCollectDispatcher {
    public static String registerMethod;
    private static DataCollectDispatcher ourInstance = new DataCollectDispatcher();
    private DataCollectDispatcher() {
    }
    public static DataCollectDispatcher getInstance() {
        return ourInstance;
    }
    public void finalize() throws Throwable {
    }
    /**
     * @param patient 病人
     * @return true-采集成功,false-采集失败
     */
    public Boolean collectData(Patient patient, List<AdapterDataSet> adapterDataSetList, Map<String, DBSessionFactory> dataSourceMap, String token) {
        Boolean result = true;
        Map<String, AdapterDataSet> dataSetMap = new HashMap<>();
        List<ObjectNode> dataList = new ArrayList<>();
        try {
            for (String key : dataSourceMap.keySet()) {
                DBOrigin dataCollector = new DBOrigin();
                if (dataCollector == null) {
                    LogUtil.fatal("采集数据:无法获取采集数据源.");
                    continue;
                }
                for (AdapterDataSet adapterDataSet : adapterDataSetList) {
                    //采集病人信息
                    ObjectNode jsonObject = dataCollector.fecthData(patient, dataSourceMap.get(key), adapterDataSet);
                    if (jsonObject == null) {
                        continue;
                    }
                    if (jsonObject != null && !StringUtil.isEmpty(jsonObject)) {
                        dataSetMap.put(adapterDataSet.getAdapterDataSetT().getStdDatasetCode(), adapterDataSet);
                        dataList.add(jsonObject);
                    }
                    //注册病人
                    if (SysConfig.getInstance().getRegisterDataSet().equals(adapterDataSet.getAdapterDataSetT().getStdDatasetCode())) {
                        if (!StringUtil.isEmpty(jsonObject.get("data")) && !StringUtil.isEmpty(jsonObject.get("data").get(0))) {
                            if (!StringUtil.isEmpty(jsonObject.get("data").get(0).get(SysConfig.getInstance().getRegisterIdCardNo()))) {
                                register(patient, StringUtil.toString(jsonObject), token);
                            }
                        }
                    }
                }
            }
            LogUtil.info("采集病人成功,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
        } catch (Exception e) {
            LogUtil.error("采集病人失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
            LogUtil.error(e);
            result = false;
        }
        //上传档案
        try {
            if (!CollectionUtil.isEmpty(dataList)) {
                if (!upload(dataList, patient, dataSetMap, token)) {
                    result = false;
                }
            }
        } catch (Exception e) {
            result = false;
            LogUtil.error("档案上传失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
        }
        return result;
    }
    public Boolean upload(List<ObjectNode> dataList, Patient patient, Map<String, AdapterDataSet> dataSetMap, String token) {
        Boolean result = true;
        try {
            DataSetTransformer dataTransformer = new DataSetTransformer();
            for (ObjectNode data : dataList) {
                dataTransformer.setData(data);
                if (!toFile(dataTransformer, patient, "origin")) {
                    LogUtil.fatal("存储原始文件失败:patient_id=" + patient.getPatientId()
                            +"event_no=" + patient.getEventNo());
                    result = false;
                    break;
                }
                dataTransformer.transfer(dataSetMap);
                if (!toFile(dataTransformer, patient, "standard")) {
                    LogUtil.fatal("存储标准文件失败:patient_id=" + patient.getPatientId()
                            + "event_no=" + patient.getEventNo());
                    result = false;
                    break;
                }
            }
            PatientCDAUpload patientCDAUpload = new PatientCDAUpload();
            if (!patientCDAUpload.upload(patient, token)) {
                result = false;
            }
        } catch (Exception e) {
            result = false;
        }
        return result;
    }
    public boolean toFile(DataSetTransformer dataTransformer, Patient patient, String fileName) {
        ObjectNode jsonObject = dataTransformer.getJsonObject();
        PatientCDAIndex patientCDAIndex = new PatientCDAIndex(patient);
        String filePath = patientCDAIndex.createDataIndex(fileName, PatientCDAIndex.FileType.JSON);
        boolean writeFile = false;
        try {
            writeFile = FileUtil.writeFile(filePath, jsonObject.toString(), "UTF-8");
        } catch (IOException e) {
            LogUtil.fatal("存储临时文件失败.");
            LogUtil.error(e);
        }
        return writeFile;
    }
    /**
     * @param patient
     * @return boolean
     * 注册不是否成功 统一返回true
     */
    public Boolean register(Patient patient, String data, String token) {
        return EsbHttp.register(patient, data, token);
    }
    /**
     * @param condition 查询条件
     * @return 病人列表
     */
    public List<Patient> getPatientQueue(Map<String, Object> condition, List<AdapterDataSet> adapterDataSetList, Map<String, DBSessionFactory> dataSourceMap) {
        List<Patient> patientList = new ArrayList<>();
        DBOrigin dbOrigin = new DBOrigin();
        for(String key : dataSourceMap.keySet()) {
            DBSessionFactory dbSessionFactory = dataSourceMap.get(key);
            for (AdapterDataSet adapterDataSet : adapterDataSetList) {
                PatientIdentity patientIdentity = SysConfig.getInstance().getPatientIdentity(adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
                if (patientIdentity == null) {
                    continue;
                }
                List<Patient> patients = dbOrigin.getPatientList(dbSessionFactory, key, adapterDataSet, condition);
                if (patients == null) {
                    return null;
                }
                if (patients.size() > 0) {
                    patientList.addAll(patients);
                }
            }
        }
        return patientList;
    }
    /**
     * 解析病人索引信息
     *
     * @param patientInfo 病人索引信息
     * @return
     */
    public Patient parsePatient(String patientInfo) throws IOException {
        Patient patient = null;
        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = null;
        patient = new Patient();
        patient = mapper.readValue(patientInfo, Patient.class);
        return patient;
    }
    /**
     * 解析token内容
     *
     * @param responToken
     * @return
     */
    public Map<String, Object> parseToken(String responToken) {
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> tokenMap = null;
        try {
            Map<String, Object> map = mapper.readValue(responToken, Map.class);
            String code = (String) map.get("code");
            if (Constants.OK.equals(code)) {
                tokenMap = (Map<String, Object>) map.get("result");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tokenMap;
    }
}//end DataCollectDispatcher

+ 172 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/service/DataSetTransformer.java

@ -0,0 +1,172 @@
package com.yihu.ehr.crawler.service;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.ehr.common.constants.DictDataType;
import com.yihu.ehr.common.constants.TransformType;
import com.yihu.ehr.dbhelper.jdbc.DBHelper;
import com.yihu.ehr.model.Patient;
import com.yihu.ehr.model.entity.adapter.AdapterDataSet;
import com.yihu.ehr.model.entity.adapter.AdapterDict;
import com.yihu.ehr.model.entity.adapter.AdapterMetaData;
import com.yihu.ehr.service.standard.StandardManager;
import java.util.Iterator;
import java.util.Map;
/**
 * 目前只处理json格式
 * <p>
 * json 格式
 * {
 * "inner_version":"xxxxx",
 * "patient_id":"xxxx",
 * "event_no":"xxxx",
 * "code":"dataset_code",
 * "org_code":"xxxx"
 * "data":
 * [{"metadata_code1":"5","metadata_code2":"6"},
 * [{"metadata_code1":"1","metadata_code2":"2"}]}
 * <p>
 * Created by Air on 2015/6/4.
 */
public class DataSetTransformer {
    private ObjectNode jsonObject;
    private Patient patient;
    private static DBHelper db;
    public ObjectNode getJsonObject() {
        return jsonObject;
    }
    public DataSetTransformer() {
        if (db == null) {
            db = new DBHelper();
        }
    }
    public boolean transfer(Map<String, AdapterDataSet> dataSetMap) {
        if (jsonObject != null) {
            String dataSetCode = jsonObject.get("code").asText();
            ArrayNode jsonArray = (ArrayNode) jsonObject.get("data");
            AdapterDataSet adapterDataSet = dataSetMap.get(dataSetCode);
            boolean transfer = transferJson(jsonArray, adapterDataSet);
            return transfer;
        }
        return false;
    }
    public String getData() {
        //确保文档有版本信息
        StandardManager standardManager = StandardManager.getInstance();
        jsonObject.put("inner_version", standardManager.getCurrentVersion());
        return jsonObject.asText();
    }
    public void setData(ObjectNode data) {
        jsonObject = data;
        setPatient();
    }
    public TransformType getTransformType() {
        return TransformType.DATA_SET_JSON;
    }
    /**
     * json 格式
     * {
     * "inner_version":"xxxxx",
     * "patient_id":"xxxx",
     * "event_no":"xxxx",
     * "code":"dataset_code",
     * "data":
     * [{"metadata_code1":"5","metadata_code2":"6"},
     * [{"metadata_code1":"1","metadata_code2":"2"}]}
     *
     * @param jsonArray
     * @param adapterDataSet
     * @return
     */
    public boolean transferJson(ArrayNode jsonArray, AdapterDataSet adapterDataSet) {
        for (Object objectRow : jsonArray) {
            if (objectRow instanceof JsonNode) {
                transferJsonRow((ObjectNode) objectRow, adapterDataSet);
            }
        }
        return false;
    }
    public void transferJsonRow(ObjectNode jsonObject, AdapterDataSet adapterDataSet) {
        Iterator<Map.Entry<String, JsonNode>> fields = jsonObject.fields();
        while (fields.hasNext()) {
            Map.Entry<String, JsonNode> next = fields.next();
            String key = next.getKey();
            JsonNode jsonNode = next.getValue();
            String value = jsonNode.asText();
            String stdValue = transferElem(adapterDataSet, key, value);
            if (jsonNode instanceof ObjectNode) {
                ObjectNode objectNode = (ObjectNode) next;
                objectNode.put(key, stdValue);
            }
        }
    }
    /**
     * @param adapterDataSet 数据集编码
     * @param code        数据元编码
     * @param data        数据
     * @return String 标准值
     * @modify 2015.09.16 airhead 增加值与编码转换
     */
    public String transferElem(AdapterDataSet adapterDataSet, String code, String data) {
        Map<String, AdapterMetaData> adapterMetaDataMap = adapterDataSet.getAdapterMetaDataMap();
        AdapterMetaData adapterMetaData = adapterMetaDataMap.get(code);
        AdapterDict adapterDict = adapterMetaData.getAdapterDict();
//        StdMetaDataT metaDataT = adapterMetaData.getStdMetaDataT();
//        if (adapterDict == null || !adapterDict.isValidAdapterDict()) {
//            MetaDataVerify metaDataVerify = new MetaDataVerify(metaDataT, data);
//            boolean check = metaDataVerify.check();
//            if (!check) {
//                LogUtil.fatal("保存:数据元校验错误." + metaDataVerify.getErrorInfo());
//                return null;    //未校验成功数据,清空
//            }
//
//            return data;
//        }
        if (adapterDict == null) {
            return data;
        }
        String stdData = null;
        DictDataType stdDictDataType = adapterMetaData.getStdDictDataType();
        DictDataType orgDictDataType = adapterMetaData.getOrgDictDataType();
        if (stdDictDataType == DictDataType.VALUE) {
            if (orgDictDataType == DictDataType.VALUE) {
                stdData = adapterDict.getStdDictItemValueByValue(data);
            } else if (orgDictDataType == DictDataType.CODE) {
                stdData = adapterDict.getStdDictItemValueByCode(data);
            }
        } else if (stdDictDataType == DictDataType.CODE) {
            if (orgDictDataType == DictDataType.VALUE) {
                stdData = adapterDict.getStdDictItemCodeByValue(data);
            } else if (orgDictDataType == DictDataType.CODE) {
                stdData = adapterDict.getStdDictItemCodeByCode(data);
            }
        }
        return stdData;
    }
    /**
     * 根据DataSet信息构造Patient
     */
    private void setPatient() {
        patient = new Patient();
        patient.setPatientId(jsonObject.get("patient_id").asText());
        patient.setEventNo(jsonObject.get("event_no").asText());
        patient.setOrgCode(jsonObject.get("org_code").asText());
    }
}

+ 335 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/service/EsbHttp.java

@ -0,0 +1,335 @@
package com.yihu.ehr.crawler.service;
import com.yihu.ehr.common.config.SysConfig;
import com.yihu.ehr.common.constants.Constants;
import com.yihu.ehr.model.Patient;
import com.yihu.ehr.service.intf.ISystemManager;
import com.yihu.ehr.util.encrypt.MD5;
import com.yihu.ehr.util.log.LogUtil;
import com.yihu.ehr.util.operator.ConfigureUtil;
import com.yihu.ehr.util.operator.StringUtil;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import sun.misc.BASE64Encoder;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by hzp on 2016/3/10.
 */
public class EsbHttp {
    @Autowired
    private static ISystemManager system;
    /***************************** 用户接口 *********************************************/
    /**
     * 用户登录验证
     */
    public static Response loginAction(String user,String password) throws Exception{
        String loginAction = HttpHelper.defaultHttpUrl+"/authorizations/users/" + user;
        Map<String,Object> header = new HashMap<>();
        String auth  = new BASE64Encoder().encode((user+":"+password).getBytes());
        header.put("Authorization","Basic "+auth);
        return HttpHelper.put(loginAction, null, header);
    }
    /*
    *   获取用户信息
    * */
    public static Response getUserInfo(String user,String token)
    {
        String url = HttpHelper.defaultHttpUrl+"/users/" + user;
        Map<String,Object> params = new HashMap<>();
        params.put("token",token);
        params.put("user",user);
        return HttpHelper.get(url, params);
    }
    /***************************** 应用接口 *********************************************/
    /**
     * 获取本机指纹
     * @return
     */
    private static String GetFingerprint(){
        try {
            return system.getSystemParam("FINGER_PRINT");
        }
        catch (Exception e)
        {
            System.out.print(e.getMessage());
            return "";
        }
    }
    /**
     * 应用登录验证
     */
    public static String getToken(){
        try {
            String loginAction = HttpHelper.defaultHttpUrl + "/authorizations/clients/" + HttpHelper.clientId;
            Map<String, Object> header = new HashMap<>();
            header.put("Authorization", "Basic " + HttpHelper.clientKey);
            //本地指纹
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("info", "{\"fingerprint\": \"" + GetFingerprint() + "\"}");
            Response response = HttpHelper.put(loginAction, params, header);
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                JSONObject obj = new JSONObject(response.getBody());
                //判断是否成功
                if (obj.has("token")) {
                    return obj.getString("token");
                } else {
                    LogUtil.info("返回未包含token。");
                    return null;
                }
            } else {
                String msg = "获取Token失败。";
                if (response != null) {
                    msg += "(错误代码:" + response.getStatusCode() + ",错误信息:" + response.getBody() + ")";
                }
                LogUtil.info(msg);
                return null;
            }
        }
        catch (Exception ex)
        {
            LogUtil.info("获取Token失败," + ex.getMessage());
            return null;
        }
    }
    /**
     * 修改远程补传状态
     */
    public static void changeFillMiningStatus(String remoteId,String message, String status){
        try {
            String token = getToken();
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("id", remoteId);
            paramMap.put("status", status);
            paramMap.put("message", message);
            paramMap.put("token", token);
            String fillMiningMethod = HttpHelper.defaultHttpUrl + "/simplified-esb/changeFillMiningStatus";
            Response response = HttpHelper.post(fillMiningMethod, paramMap);
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                LogUtil.info("修改远程补传状态成功。");
            }
            else{
                String msg = "修改远程补传状态失败。";
                if (response != null)
                {
                    msg +="(错误代码:"+ response.getStatusCode() + ",错误信息:"+response.getBody()+")";
                }
                LogUtil.info(msg);
            }
        }
        catch (Exception ex)
        {
            LogUtil.info("修改远程补传状态失败." + ex.getMessage());
        }
    }
    /**
     * 获取公钥
     */
    public static String getPublicKey(){
        try {
            String token = getToken();
            if (SysConfig.getInstance().getPublicKey() != null) {
                return SysConfig.getInstance().getPublicKey();
            }
            String orgCode = SysConfig.getInstance().getOrgCode();
            Map<String, Object> paramMap = new HashMap<>();
            paramMap.put("org_code", orgCode);
            paramMap.put("token", token);
            String publicKeyMethod = HttpHelper.defaultHttpUrl + "/organizations/"+orgCode+"/key";
            Response response = HttpHelper.get(publicKeyMethod, paramMap);
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                JSONObject json = new JSONObject(response.getBody());
                if(json.has("publicKey"))
                {
                    String key = json.getString("publicKey");
                    SysConfig.getInstance().setPublicKey(key);
                    return key;
                }
                else{
                    LogUtil.info("获取公钥失败,返回未包含publicKey。");
                    return null;
                }
            }
            else{
                String msg = "获取公钥失败。";
                if (response != null)
                {
                    msg +="(错误代码:"+ response.getStatusCode() + ",错误信息:"+response.getBody()+")";
                }
                LogUtil.info(msg);
                return null;
            }
        } catch (Exception e) {
            LogUtil.info(e.getMessage());
            return null;
        }
    }
    /**
     * 获取健康云平台标准版本号
     */
    public static String getRemoteVersion(String orgCode) {
        try {
            String token = getToken();
            String versionMethod = HttpHelper.defaultHttpUrl + "/adaptions/org_plan/version";
            Map<String, Object> params = new HashMap<>();
            params.put("org_code", orgCode);
            params.put("token", token);
            Response response = HttpHelper.get(versionMethod, params);
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                return response.getBody();
            }
            else{
                String msg = "获取健康云平台标准版本号失败";
                if (response != null)
                {
                    msg +="(错误代码:"+ response.getStatusCode() + ",错误信息:"+response.getBody()+")";
                }
                LogUtil.info(msg);
                return null;
            }
        } catch (Exception e) {
            LogUtil.fatal("获取远程版本号异常");
            LogUtil.error(e);
            return null;
        }
    }
    /**
     * 注册病人
     */
    public static Boolean register(Patient patient, String data, String token) {
        try {
            JSONObject json = new JSONObject(data);
            String colName = SysConfig.registerIdCardNo;
            if(json!=null && json.has("data"))
            {
                JSONObject p = (JSONObject)json.getJSONArray("data").get(0);
                if(!p.has(colName) || p.get(colName).equals(null) || p.getString(colName).length()==0)
                {
                    LogUtil.info("注册病人信息请求失败:身份证号码为空,patient_id=" + patient.getPatientId() + ", event_no=" + patient.getEventNo());
                    return false;
                }
                else{
                    String idCord = p.getString(colName);
                    String registerMethod = HttpHelper.defaultHttpUrl + "/patients/"+idCord;
                    if (StringUtil.isEmpty(data)) {
                        LogUtil.info("注册病人信息请求失败:无具体病人信息,patient_id=" + patient.getPatientId() + ", event_no=" + patient.getEventNo());
                        return false;
                    }
                    Map<String, Object> paramMap = new HashMap<>();
                    paramMap.put("demographic_id", idCord);
                    paramMap.put("json", data);
                    paramMap.put("token", token);
                    Response response = HttpHelper.post(registerMethod, paramMap);
                    if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                        LogUtil.info("注册病人信息成功。patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
                        return true;
                    }
                    else{
                        String msg = "注册病人信息请求失败。patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo();
                        if(response != null)
                        {
                            msg +="(错误代码:"+ response.getStatusCode() + ",错误信息:"+response.getBody()+")";
                        }
                        LogUtil.info(msg);
                        return false;
                    }
                }
            }
            else{
                LogUtil.info("注册病人信息请求失败:传入数据无效,patient_id=" + patient.getPatientId() + ", event_no=" + patient.getEventNo());
                return false;
            }
        }
        catch (Exception e)
        {
            LogUtil.info("注册病人信息请求失败."+e.getMessage());
            return false;
        }
    }
    /**
     * 上传病人档案
     */
    public static boolean upload(Patient patient, File file, String encryptPwd, String token) {
        try {
            String uploadMethod = HttpHelper.defaultHttpUrl + "/packages";
            String fileMd5= MD5.getMd5ByFile(file);
            Map<String, Object> paramMap = new HashMap<>();
            List<NameValuePair> formParams = new ArrayList<>();
            formParams.add(new BasicNameValuePair("md5", fileMd5));
            formParams.add(new BasicNameValuePair("package_crypto", encryptPwd));
            formParams.add(new BasicNameValuePair("org_code", SysConfig.getInstance().getOrgCode()));
            formParams.add(new BasicNameValuePair("token", token));
            Response response = HttpHelper.postFile(uploadMethod, formParams, file.getAbsolutePath());
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                LogUtil.info("上传病人档案成功,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo());
                return true;
            }
            else {
                String msg = "上传病人档案请求失败,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo();
                if (response != null)
                {
                    msg +="(错误代码:"+ response.getStatusCode() + ",错误信息:"+response.getBody()+")";
                }
                LogUtil.info(msg);
                return false;
            }
        }
        catch (Exception e) {
            LogUtil.fatal("上传病人档案异常,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo());
            LogUtil.error(e);
            return false;
        }
    }
    /**
     * 下载标准包
     */
    public static Response download(String remoteVersion, String orgCode) {
        try {
            String token = getToken();
            String downLoadMethod = HttpHelper.defaultHttpUrl + "/adaptions/"+orgCode+"/source";
            Map<String, Object> params = new HashMap<>();
            params.put("version_code", remoteVersion);
            params.put("org_code", orgCode);
            params.put("token", token);
            Response response = HttpHelper.get(downLoadMethod, params);
            return response;
        } catch (Exception e) {
            LogUtil.fatal("下载标准包异常:");
            LogUtil.error(e);
            return null;
        }
    }
}

+ 84 - 0
Hos-resource/src/main/java/com/yihu/ehr/crawler/service/PatientCDAIndex.java

@ -0,0 +1,84 @@
package com.yihu.ehr.crawler.service;
import com.yihu.ehr.common.config.SysConfig;
import com.yihu.ehr.crawler.model.Patient;
import com.yihu.ehr.model.Patient;
import java.util.UUID;
/**
 * 病人文件索引类,用于生成文件路径,不确保文件路径存在
 *
 * @author Air
 * @version 1.0
 * @created 2015.07.01 18:06
 */
public class PatientCDAIndex {
    private Patient patient;
    public PatientCDAIndex(Patient patient) {
        this.patient = patient;
    }
    public String getDirectory() {
        String dir = SysConfig.getInstance().getTempFile();
        return dir + "/" + patient.getOrgCode() + "/" + patient.getOrgCode() + "-" + patient.getPatientId() + "-" + patient.getEventNo();
    }
    /**
     * 生成病人档案目录
     * orgCode-pateintId-eventNo/data
     *
     * @return
     */
    public String getDataDirectory() {
        return getDirectory() + "/" + IndexType.DATA;
    }
    public String createIndex(String indexType, String fileType) {
        UUID uuid = UUID.randomUUID();
        String index = uuid.toString();
        String dir = getDirectory() + "/" + indexType;
        return dir + "/" + index + fileType;
    }
    public String createDataSetIndex(String indexType, String fileType) {
        UUID uuid = UUID.randomUUID();
        String index = "dataset_index";
        String dir = getDirectory() + "/" + IndexType.DATA + "/" +indexType;
        return dir + "/" + index + fileType;
    }
    /**
     * 生成最终病人档案目录
     * data/cda
     * data/origin
     * data/standard
     *
     * @param indexType
     * @param fileType
     * @return
     */
    public String createDataIndex(String indexType, String fileType) {
        return createIndex(IndexType.DATA + "/" + indexType, fileType);
    }
    public class FileType {
        public final static String XML = ".xml";
        public final static String JSON = ".json";
        public final static String ZIP = ".zip";
    }
    public class IndexType {
        public final static String DATA = "data";   //病人档案数据目录
        public final static String CDA = "cda";     //病人cda档案目录
        public final static String STANDARD = "standard";   //病人标准档案目录
        public final static String ORIGIN = "origin";   //病人原始档案目录
        public final static String ZIP = "zip";         //病人压缩包目录
        public final static String DOCUMENT = "document";
    }
}