Browse Source

质控包上传

huangzhiyong 7 years ago
parent
commit
dd531ffeec
36 changed files with 2170 additions and 449 deletions
  1. 369 369
      hos-broker/src/main/java/com/yihu/hos/broker/util/SigarUtil.java
  2. 33 0
      hos-camel2/pom.xml
  3. 3 1
      hos-camel2/src/main/java/camel/crawler/processor/Split.java
  4. 20 0
      hos-camel2/src/main/java/camel/qcrule/processor/PatientProcessor.java
  5. 159 0
      hos-camel2/src/main/java/camel/qcrule/processor/QcHttpProcessor.java
  6. 63 0
      hos-camel2/src/main/java/camel/qcrule/router/QcCrawlerRoute.java
  7. 20 0
      hos-camel2/src/main/java/camel/quartz2/processor/Quartz2Processor.java
  8. 11 0
      hos-camel2/src/main/java/camel/quartz2/route/Quartz2Route.java
  9. 121 13
      hos-rest/src/main/java/com/yihu/hos/rest/common/format/DataSetTransformer.java
  10. 3 0
      hos-rest/src/main/java/com/yihu/hos/rest/common/http/EHRHttpHelper.java
  11. 91 20
      hos-rest/src/main/java/com/yihu/hos/rest/controllers/CrawlerController.java
  12. 1 1
      hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/config/SysConfig.java
  13. 135 0
      hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/qc/QcDaily.java
  14. 42 0
      hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/qc/QcPatientIndex.java
  15. 68 0
      hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/qc/QcRuleModel.java
  16. 16 6
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/CrawlerManager.java
  17. 151 11
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/DataCollectDispatcher.java
  18. 1 0
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/DatacollectService.java
  19. 75 4
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/EsbHttp.java
  20. 5 1
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/PatientCDAUpload.java
  21. 486 0
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/QCCrawlerManager.java
  22. 138 0
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/QCDataIndex.java
  23. 36 0
      hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/QcRuleService.java
  24. 10 1
      hos-rest/src/main/resources/application.yml
  25. 2 2
      hos-rest/src/main/resources/config/dbhelper.properties
  26. 2 0
      hos-rest/src/main/resources/config/http.properties
  27. 37 0
      hos-rest/src/main/resources/hibernate/QcRule.hbm.xml
  28. 14 0
      hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/QcResultConstant.java
  29. 1 0
      src/main/java/com/yihu/hos/datacollect/service/DatacollectManager.java
  30. 3 1
      src/main/java/com/yihu/hos/standard/model/adapter/AdapterSchemeModel.java
  31. 27 10
      src/main/java/com/yihu/hos/standard/service/adapter/AdapterSchemeService.java
  32. 1 1
      src/main/java/com/yihu/hos/system/dao/BaseDictDao.java
  33. 3 3
      src/main/java/com/yihu/hos/system/dao/DatasourceDao.java
  34. 4 0
      src/main/java/com/yihu/hos/system/service/FlowManager.java
  35. 5 5
      src/main/resources/application.yml
  36. 14 0
      src/main/resources/text/message_en_US.properties

+ 369 - 369
hos-broker/src/main/java/com/yihu/hos/broker/util/SigarUtil.java

@ -1,407 +1,407 @@
package com.yihu.hos.broker.util;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import org.hyperic.sigar.*;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.*;
/**
 * sigar 服务器硬件指标 工具类
 *
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/10/10.
 */
public class SigarUtil {
    
    static private final Logger logger = LoggerFactory.getLogger(SigarUtil.class);
    public final static Sigar sigar = initSigar();
    private static Sigar initSigar() {
        try {
            //此处只为得到依赖库文件的目录,可根据实际项目自定义
            String sigarLibPath = SigarUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath() ;
            String path = System.getProperty("java.library.path");
            //为防止java.library.path重复加,此处判断了一下
            if (!path.contains(sigarLibPath)) {
                if (isOSWin()) {
                    path += ";" + sigarLibPath;
                } else {
                    path += ":" + sigarLibPath;
                }
                System.setProperty("java.library.path", path);
            }
            return new Sigar();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    package com.yihu.hos.broker.util;
    public URL getUrl() {
        return this.getClass().getResource("/");
    }
    import com.yihu.hos.core.log.Logger;
    import com.yihu.hos.core.log.LoggerFactory;
    import org.hyperic.sigar.*;
//    public static void main(String[] args) {
//        DecimalFormat df = new DecimalFormat("#0.00");
//        double d = 0;
//        String f = df.format(d);
//        double e = Double.parseDouble(String.format("%.2f", d));
//        logger.info(e);
//    }
    import java.net.InetAddress;
    import java.net.URL;
    import java.net.UnknownHostException;
    import java.util.*;
    /**
    /**
     * 是否是windows系统
     * sigar 服务器硬件指标 工具类
     *
     *
     * @return
     * @author HZY
     * @vsrsion 1.0
     * Created at 2016/10/10.
     */
     */
    public static boolean isOSWin() {//OS 版本判断
        String OS = System.getProperty("os.name").toLowerCase();
        if (OS.indexOf("win") >= 0) {
            return true;
        } else return false;
    }
    public class SigarUtil {
        static private final Logger logger = LoggerFactory.getLogger(SigarUtil.class);
        public final static Sigar sigar = initSigar();
        private static Sigar initSigar() {
            try {
                //此处只为得到依赖库文件的目录,可根据实际项目自定义
                String sigarLibPath = SigarUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath() ;
                String path = System.getProperty("java.library.path");
                //为防止java.library.path重复加,此处判断了一下
                if (!path.contains(sigarLibPath)) {
                    if (isOSWin()) {
                        path += ";" + sigarLibPath;
                    } else {
                        path += ":" + sigarLibPath;
                    }
                    System.setProperty("java.library.path", path);
                }
                return new Sigar();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    /* ==================================================   以下是打印测试   ========================================================================== */
        public URL getUrl() {
            return this.getClass().getResource("/");
        }
    /**
     * 系统信息  jvm等
     *
     * @throws UnknownHostException
     */
    //    public static void main(String[] args) {
    //        DecimalFormat df = new DecimalFormat("#0.00");
    //        double d = 0;
    //        String f = df.format(d);
    //        double e = Double.parseDouble(String.format("%.2f", d));
    //        logger.info(e);
    //    }
        /**
         * 是否是windows系统
         *
         * @return
         */
        public static boolean isOSWin() {//OS 版本判断
            String OS = System.getProperty("os.name").toLowerCase();
            if (OS.indexOf("win") >= 0) {
                return true;
            } else return false;
        }
    public static String getHostName(){
        try {
            NetInfo netInfo = sigar.getNetInfo();
            String hostName = netInfo.getHostName();
            return hostName;
        } catch (SigarException e) {
            e.printStackTrace();
        /* ==================================================   以下是打印测试   ========================================================================== */
        /**
         * 系统信息  jvm等
         *
         * @throws UnknownHostException
         */
        public static String getHostName(){
            try {
                NetInfo netInfo = sigar.getNetInfo();
                String hostName = netInfo.getHostName();
                return hostName;
            } catch (SigarException e) {
                e.printStackTrace();
            }
            return "";
        }
        }
        return "";
    }
    public static String getHost(){
        try {
            NetInterfaceConfig netInterfaceConfig = sigar.getNetInterfaceConfig(null);
            String ip = netInterfaceConfig.getAddress();
            return ip;
        } catch (SigarException e) {
            e.printStackTrace();
        public static String getHost(){
            try {
                NetInterfaceConfig netInterfaceConfig = sigar.getNetInterfaceConfig(null);
                String ip = netInterfaceConfig.getAddress();
                return ip;
            } catch (SigarException e) {
                e.printStackTrace();
            }
            return "unknowHost";
        }
        }
        return "unknowHost";
    }
    private static void property() throws UnknownHostException {
        Runtime r = Runtime.getRuntime();
        Properties props = System.getProperties();
        InetAddress addr;
        addr = InetAddress.getLocalHost();
        String ip = addr.getHostAddress();
        Map<String, String> map = System.getenv();
        String userName = map.get("USERNAME");// 获取用户名
        String computerName = map.get("COMPUTERNAME");// 获取计算机名
        String userDomain = map.get("USERDOMAIN");// 获取计算机域名
        logger.info("用户名:    " + userName);
        logger.info("计算机名:    " + computerName);
        logger.info("计算机域名:    " + userDomain);
        logger.info("本地ip地址:    " + ip);
        logger.info("本地主机名:    " + addr.getHostName());
        logger.info("JVM可以使用的总内存:    " + r.totalMemory());
        logger.info("JVM可以使用的剩余内存:    " + r.freeMemory());
        logger.info("JVM可以使用的处理器个数:    " + r.availableProcessors());
        logger.info("Java的运行环境版本:    " + props.getProperty("java.version"));
        logger.info("Java的运行环境供应商:    " + props.getProperty("java.vendor"));
        logger.info("Java供应商的URL:    " + props.getProperty("java.vendor.url"));
        logger.info("Java的安装路径:    " + props.getProperty("java.home"));
        logger.info("Java的虚拟机规范版本:    " + props.getProperty("java.vm.specification.version"));
        logger.info("Java的虚拟机规范供应商:    " + props.getProperty("java.vm.specification.vendor"));
        logger.info("Java的虚拟机规范名称:    " + props.getProperty("java.vm.specification.name"));
        logger.info("Java的虚拟机实现版本:    " + props.getProperty("java.vm.version"));
        logger.info("Java的虚拟机实现供应商:    " + props.getProperty("java.vm.vendor"));
        logger.info("Java的虚拟机实现名称:    " + props.getProperty("java.vm.name"));
        logger.info("Java运行时环境规范版本:    " + props.getProperty("java.specification.version"));
        logger.info("Java运行时环境规范供应商:    " + props.getProperty("java.specification.vender"));
        logger.info("Java运行时环境规范名称:    " + props.getProperty("java.specification.name"));
        logger.info("Java的类格式版本号:    " + props.getProperty("java.class.version"));
        logger.info("Java的类路径:    " + props.getProperty("java.class.path"));
        logger.info("加载库时搜索的路径列表:    " + props.getProperty("java.library.path"));
        logger.info("默认的临时文件路径:    " + props.getProperty("java.io.tmpdir"));
        logger.info("一个或多个扩展目录的路径:    " + props.getProperty("java.ext.dirs"));
        logger.info("操作系统的名称:    " + props.getProperty("os.name"));
        logger.info("操作系统的构架:    " + props.getProperty("os.arch"));
        logger.info("操作系统的版本:    " + props.getProperty("os.version"));
        logger.info("文件分隔符:    " + props.getProperty("file.separator"));
        logger.info("路径分隔符:    " + props.getProperty("path.separator"));
        logger.info("行分隔符:    " + props.getProperty("line.separator"));
        logger.info("用户的账户名称:    " + props.getProperty("user.name"));
        logger.info("用户的主目录:    " + props.getProperty("user.home"));
        logger.info("用户的当前工作目录:    " + props.getProperty("user.dir"));
    }
        private static void property() throws UnknownHostException {
            Runtime r = Runtime.getRuntime();
            Properties props = System.getProperties();
            InetAddress addr;
            addr = InetAddress.getLocalHost();
            String ip = addr.getHostAddress();
            Map<String, String> map = System.getenv();
            String userName = map.get("USERNAME");// 获取用户名
            String computerName = map.get("COMPUTERNAME");// 获取计算机名
            String userDomain = map.get("USERDOMAIN");// 获取计算机域名
            logger.info("用户名:    " + userName);
            logger.info("计算机名:    " + computerName);
            logger.info("计算机域名:    " + userDomain);
            logger.info("本地ip地址:    " + ip);
            logger.info("本地主机名:    " + addr.getHostName());
            logger.info("JVM可以使用的总内存:    " + r.totalMemory());
            logger.info("JVM可以使用的剩余内存:    " + r.freeMemory());
            logger.info("JVM可以使用的处理器个数:    " + r.availableProcessors());
            logger.info("Java的运行环境版本:    " + props.getProperty("java.version"));
            logger.info("Java的运行环境供应商:    " + props.getProperty("java.vendor"));
            logger.info("Java供应商的URL:    " + props.getProperty("java.vendor.url"));
            logger.info("Java的安装路径:    " + props.getProperty("java.home"));
            logger.info("Java的虚拟机规范版本:    " + props.getProperty("java.vm.specification.version"));
            logger.info("Java的虚拟机规范供应商:    " + props.getProperty("java.vm.specification.vendor"));
            logger.info("Java的虚拟机规范名称:    " + props.getProperty("java.vm.specification.name"));
            logger.info("Java的虚拟机实现版本:    " + props.getProperty("java.vm.version"));
            logger.info("Java的虚拟机实现供应商:    " + props.getProperty("java.vm.vendor"));
            logger.info("Java的虚拟机实现名称:    " + props.getProperty("java.vm.name"));
            logger.info("Java运行时环境规范版本:    " + props.getProperty("java.specification.version"));
            logger.info("Java运行时环境规范供应商:    " + props.getProperty("java.specification.vender"));
            logger.info("Java运行时环境规范名称:    " + props.getProperty("java.specification.name"));
            logger.info("Java的类格式版本号:    " + props.getProperty("java.class.version"));
            logger.info("Java的类路径:    " + props.getProperty("java.class.path"));
            logger.info("加载库时搜索的路径列表:    " + props.getProperty("java.library.path"));
            logger.info("默认的临时文件路径:    " + props.getProperty("java.io.tmpdir"));
            logger.info("一个或多个扩展目录的路径:    " + props.getProperty("java.ext.dirs"));
            logger.info("操作系统的名称:    " + props.getProperty("os.name"));
            logger.info("操作系统的构架:    " + props.getProperty("os.arch"));
            logger.info("操作系统的版本:    " + props.getProperty("os.version"));
            logger.info("文件分隔符:    " + props.getProperty("file.separator"));
            logger.info("路径分隔符:    " + props.getProperty("path.separator"));
            logger.info("行分隔符:    " + props.getProperty("line.separator"));
            logger.info("用户的账户名称:    " + props.getProperty("user.name"));
            logger.info("用户的主目录:    " + props.getProperty("user.home"));
            logger.info("用户的当前工作目录:    " + props.getProperty("user.dir"));
        }
    /**
     * 内存信息
     *
     * @return 返回单位 :G
     * @throws SigarException
     */
    public static Map<String, Object> memory() throws SigarException {
        Mem mem = sigar.getMem();
        Swap swap = sigar.getSwap();
        Map<String, Object> memory = new HashMap<>();
        memory.put("total", getDouble((double)mem.getTotal() / 1024L / 1024L / 1024L));
        memory.put("used",  getDouble((double)mem.getUsed() / 1024L / 1024L / 1024L));
        memory.put("free",  getDouble((double)mem.getFree() / 1024L / 1024L / 1024L));
        memory.put("freePerc", getDouble(mem.getFreePercent()));
        memory.put("usedPerc", getDouble(mem.getUsedPercent()));
        //交换区
        memory.put("swapTotal", getDouble((double)swap.getTotal() / 1024L / 1024L / 1024L));
        memory.put("swapUsed",  getDouble((double)swap.getUsed() / 1024L / 1024L / 1024L));
        memory.put("swapFree", getDouble((double) swap.getFree() / 1024L / 1024L / 1024L));
        return memory;
    }
        /**
         * 内存信息
         *
         * @return 返回单位 :G
         * @throws SigarException
         */
        public static Map<String, Object> memory() throws SigarException {
            Mem mem = sigar.getMem();
            Swap swap = sigar.getSwap();
            Map<String, Object> memory = new HashMap<>();
            memory.put("total", getDouble((double)mem.getTotal() / 1024L / 1024L / 1024L));
            memory.put("used",  getDouble((double)mem.getUsed() / 1024L / 1024L / 1024L));
            memory.put("free",  getDouble((double)mem.getFree() / 1024L / 1024L / 1024L));
            memory.put("freePerc", getDouble(mem.getFreePercent()));
            memory.put("usedPerc", getDouble(mem.getUsedPercent()));
            //交换区
            memory.put("swapTotal", getDouble((double)swap.getTotal() / 1024L / 1024L / 1024L));
            memory.put("swapUsed",  getDouble((double)swap.getUsed() / 1024L / 1024L / 1024L));
            memory.put("swapFree", getDouble((double) swap.getFree() / 1024L / 1024L / 1024L));
            return memory;
        }
    /**
     * cpu使用情况
     *
     * @return
     * @throws SigarException
     */
    public static Map<String, Object> cpu()  {
        Map<String, Object> cpuMap = new HashMap<>();
        try {
            Cpu timer = sigar.getCpu();
            CpuInfo infos[] = sigar.getCpuInfoList();
            Cpu cpu = sigar.getCpu();
            ThreadCpu threadCpu = sigar.getThreadCpu();
            CpuInfo[] cpuInfoList = sigar.getCpuInfoList();
            CpuPerc cpuPerc = sigar.getCpuPerc();
            CpuInfo info1 = infos[0];
            //cpu信息
            cpuMap.put("quantity", infos.length);
            cpuMap.put("model", info1.getModel());// CPU型号
            cpuMap.put("totalCores", info1.getTotalCores());// CPU逻辑个数
            cpuMap.put("totalSockets", info1.getTotalSockets());// CPU物理个数
            cpuMap.put("Mhz", info1.getMhz());
            cpuMap.put("cores",info1.getCoresPerSocket());//核数
            long cacheSize = info1.getCacheSize();
            if (cacheSize != Sigar.FIELD_NOTIMPL) {
                cpuMap.put("cache",info1.getCacheSize());//核数
        /**
         * cpu使用情况
         *
         * @return
         * @throws SigarException
         */
        public static Map<String, Object> cpu()  {
            Map<String, Object> cpuMap = new HashMap<>();
            try {
                Cpu timer = sigar.getCpu();
                CpuInfo infos[] = sigar.getCpuInfoList();
                Cpu cpu = sigar.getCpu();
                ThreadCpu threadCpu = sigar.getThreadCpu();
                CpuInfo[] cpuInfoList = sigar.getCpuInfoList();
                CpuPerc cpuPerc = sigar.getCpuPerc();
                CpuInfo info1 = infos[0];
                //cpu信息
                cpuMap.put("quantity", infos.length);
                cpuMap.put("model", info1.getModel());// CPU型号
                cpuMap.put("totalCores", info1.getTotalCores());// CPU逻辑个数
                cpuMap.put("totalSockets", info1.getTotalSockets());// CPU物理个数
                cpuMap.put("Mhz", info1.getMhz());
                cpuMap.put("cores",info1.getCoresPerSocket());//核数
                long cacheSize = info1.getCacheSize();
                if (cacheSize != Sigar.FIELD_NOTIMPL) {
                    cpuMap.put("cache",info1.getCacheSize());//核数
                }
                //cpu使用率
                cpuMap.put("timer",timer.getUser());//核数
                cpuMap.put("totalPerc", getDouble(cpuPerc.getCombined() * 100));
                cpuMap.put("userPerc", getDouble(cpuPerc.getUser() * 100));
                cpuMap.put("sysPerc", getDouble(cpuPerc.getSys() * 100));
                cpuMap.put("wait", getDouble(cpuPerc.getWait() * 100));
                cpuMap.put("nice", getDouble(cpuPerc.getNice() * 100));
                cpuMap.put("freePerc", getDouble(cpuPerc.getIdle() * 100));
            } catch (SigarException e){
                e.printStackTrace();
            }
            }
            //cpu使用率
            cpuMap.put("timer",timer.getUser());//核数
            cpuMap.put("totalPerc", getDouble(cpuPerc.getCombined() * 100));
            cpuMap.put("userPerc", getDouble(cpuPerc.getUser() * 100));
            cpuMap.put("sysPerc", getDouble(cpuPerc.getSys() * 100));
            cpuMap.put("wait", getDouble(cpuPerc.getWait() * 100));
            cpuMap.put("nice", getDouble(cpuPerc.getNice() * 100));
            cpuMap.put("freePerc", getDouble(cpuPerc.getIdle() * 100));
        } catch (SigarException e){
            e.printStackTrace();
            return cpuMap;
        }
        }
        return cpuMap;
    }
    /**
     * 操作系统信息
     */
    private static void os() {
        OperatingSystem OS = OperatingSystem.getInstance();
        // 操作系统内核类型如: 386、486、586等x86
        logger.info("操作系统:    " + OS.getArch());
        logger.info("操作系统CpuEndian():    " + OS.getCpuEndian());//
        logger.info("操作系统DataModel():    " + OS.getDataModel());//
        // 系统描述
        logger.info("操作系统的描述:    " + OS.getDescription());
        // 操作系统类型
        // logger.info("OS.getName():    " + OS.getName());
        // logger.info("OS.getPatchLevel():    " + OS.getPatchLevel());//
        // 操作系统的卖主
        logger.info("操作系统的卖主:    " + OS.getVendor());
        // 卖主名称
        logger.info("操作系统的卖主名:    " + OS.getVendorCodeName());
        // 操作系统名称
        logger.info("操作系统名称:    " + OS.getVendorName());
        // 操作系统卖主类型
        logger.info("操作系统卖主类型:    " + OS.getVendorVersion());
        // 操作系统的版本号
        logger.info("操作系统的版本号:    " + OS.getVersion());
    }
        /**
         * 操作系统信息
         */
        private static void os() {
            OperatingSystem OS = OperatingSystem.getInstance();
            // 操作系统内核类型如: 386、486、586等x86
            logger.info("操作系统:    " + OS.getArch());
            logger.info("操作系统CpuEndian():    " + OS.getCpuEndian());//
            logger.info("操作系统DataModel():    " + OS.getDataModel());//
            // 系统描述
            logger.info("操作系统的描述:    " + OS.getDescription());
            // 操作系统类型
            // logger.info("OS.getName():    " + OS.getName());
            // logger.info("OS.getPatchLevel():    " + OS.getPatchLevel());//
            // 操作系统的卖主
            logger.info("操作系统的卖主:    " + OS.getVendor());
            // 卖主名称
            logger.info("操作系统的卖主名:    " + OS.getVendorCodeName());
            // 操作系统名称
            logger.info("操作系统名称:    " + OS.getVendorName());
            // 操作系统卖主类型
            logger.info("操作系统卖主类型:    " + OS.getVendorVersion());
            // 操作系统的版本号
            logger.info("操作系统的版本号:    " + OS.getVersion());
        }
    private static void who() throws SigarException {
        Who who[] = sigar.getWhoList();
        if (who != null && who.length > 0) {
            for (int i = 0; i < who.length; i++) {
                // logger.info("当前系统进程表中的用户名" + String.valueOf(i));
                Who _who = who[i];
                logger.info("用户控制台:    " + _who.getDevice());
                logger.info("用户host:    " + _who.getHost());
                // logger.info("getTime():    " + _who.getTime());
                // 当前系统进程表中的用户名
                logger.info("当前系统进程表中的用户名:    " + _who.getUser());
        private static void who() throws SigarException {
            Who who[] = sigar.getWhoList();
            if (who != null && who.length > 0) {
                for (int i = 0; i < who.length; i++) {
                    // logger.info("当前系统进程表中的用户名" + String.valueOf(i));
                    Who _who = who[i];
                    logger.info("用户控制台:    " + _who.getDevice());
                    logger.info("用户host:    " + _who.getHost());
                    // logger.info("getTime():    " + _who.getTime());
                    // 当前系统进程表中的用户名
                    logger.info("当前系统进程表中的用户名:    " + _who.getUser());
                }
            }
            }
        }
        }
    }
    /**
     * 硬盘信息
     */
    public static List<Map<String, Object>> file() {
        List<Map<String, Object>> files = new ArrayList<>();
        Map<String, Object> fileMap = null;
        FileSystem fslist[] = new FileSystem[0];
        try {
            fslist = sigar.getFileSystemList();
            for (int i = 0; i < fslist.length; i++) {
                FileSystem fs = fslist[i];
                fileMap = new HashMap<>();
                switch (fs.getType()) {
                    case 0: // TYPE_UNKNOWN :未知
                        break;
                    case 1: // TYPE_NONE
                        break;
                    case 2: // TYPE_LOCAL_DISK : 本地硬盘
                        FileSystemUsage usage = sigar.getFileSystemUsage(fs.getDirName());
                        fileMap.put("devName", fs.getDevName());
                        fileMap.put("dirName", fs.getDirName());
                        fileMap.put("flags", fs.getFlags());
                        fileMap.put("sysTypeName", fs.getSysTypeName());
                        fileMap.put("typeName", fs.getTypeName());
                        fileMap.put("type", fs.getType());
                        fileMap.put("total", usage.getTotal() / 1024L / 1024L);
                        fileMap.put("free", usage.getFree() / 1024L / 1024L);
                        fileMap.put("aVall", usage.getAvail() / 1024L / 1024L);//可用大小
                        fileMap.put("used", usage.getUsed() / 1024L / 1024L);
                        fileMap.put("usePercent", usage.getUsePercent() * 100D);
                        fileMap.put("diskRead", usage.getDiskReads());
                        fileMap.put("diskWrite", usage.getDiskWrites());
                        files.add(fileMap);
                        break;
                    case 3:// TYPE_NETWORK :网络
                        break;
                    case 4:// TYPE_RAM_DISK :闪存
                        break;
                    case 5:// TYPE_CDROM :光驱
                        break;
                    case 6:// TYPE_SWAP :页面交换
                        break;
                }
        /**
         * 硬盘信息
         */
        public static List<Map<String, Object>> file() {
            List<Map<String, Object>> files = new ArrayList<>();
            Map<String, Object> fileMap = null;
            FileSystem fslist[] = new FileSystem[0];
            try {
                fslist = sigar.getFileSystemList();
                for (int i = 0; i < fslist.length; i++) {
                    FileSystem fs = fslist[i];
                    fileMap = new HashMap<>();
                    switch (fs.getType()) {
                        case 0: // TYPE_UNKNOWN :未知
                            break;
                        case 1: // TYPE_NONE
                            break;
                        case 2: // TYPE_LOCAL_DISK : 本地硬盘
                            FileSystemUsage usage = sigar.getFileSystemUsage(fs.getDirName());
                            fileMap.put("devName", fs.getDevName());
                            fileMap.put("dirName", fs.getDirName());
                            fileMap.put("flags", fs.getFlags());
                            fileMap.put("sysTypeName", fs.getSysTypeName());
                            fileMap.put("typeName", fs.getTypeName());
                            fileMap.put("type", fs.getType());
                            fileMap.put("total", usage.getTotal() / 1024L / 1024L);
                            fileMap.put("free", usage.getFree() / 1024L / 1024L);
                            fileMap.put("aVall", usage.getAvail() / 1024L / 1024L);//可用大小
                            fileMap.put("used", usage.getUsed() / 1024L / 1024L);
                            fileMap.put("usePercent", usage.getUsePercent() * 100D);
                            fileMap.put("diskRead", usage.getDiskReads());
                            fileMap.put("diskWrite", usage.getDiskWrites());
                            files.add(fileMap);
                            break;
                        case 3:// TYPE_NETWORK :网络
                            break;
                        case 4:// TYPE_RAM_DISK :闪存
                            break;
                        case 5:// TYPE_CDROM :光驱
                            break;
                        case 6:// TYPE_SWAP :页面交换
                            break;
                    }
                }
            } catch (SigarException e) {
                e.printStackTrace();
            }
            }
        } catch (SigarException e) {
            e.printStackTrace();
            return files;
        }
        }
        return files;
    }
    /**
     * 网络信息
     *
     * @throws Exception
     */
    public static Map<String, Object> net() {
        Map<String, Object> netMap = new HashMap<>();
        NetInterfaceConfig netConfig = null;
        try {
            netConfig = sigar.getNetInterfaceConfig(null);
            NetInterfaceStat netIfStat = sigar.getNetInterfaceStat(netConfig.getName());
            Map<String, Object> bps = populate(netConfig.getName());//bps
            netMap.put("name", netConfig.getName());
            netMap.put("address", netConfig.getAddress());
            netMap.put("mac", netConfig.getHwaddr());
            netMap.put("type", netConfig.getType());
            netMap.put("broadcast", netConfig.getBroadcast());
            netMap.put("netmask", netConfig.getNetmask());
            netMap.put("rxPackets", netIfStat.getRxPackets());
            netMap.put("txPackets", netIfStat.getTxPackets());
            netMap.put("rxBytes", netIfStat.getRxBytes());
            netMap.put("txBytes", netIfStat.getTxBytes());
            netMap.put("txPackets", netIfStat.getTxPackets());
            netMap.put("txbps", bps.get("txbps"));
            netMap.put("rxbps", bps.get("rxbps"));
        } catch (SigarException e) {
            e.printStackTrace();
        /**
         * 网络信息
         *
         * @throws Exception
         */
        public static Map<String, Object> net() {
            Map<String, Object> netMap = new HashMap<>();
            NetInterfaceConfig netConfig = null;
            try {
                netConfig = sigar.getNetInterfaceConfig(null);
                NetInterfaceStat netIfStat = sigar.getNetInterfaceStat(netConfig.getName());
                Map<String, Object> bps = populate(netConfig.getName());//bps
                netMap.put("name", netConfig.getName());
                netMap.put("address", netConfig.getAddress());
                netMap.put("mac", netConfig.getHwaddr());
                netMap.put("type", netConfig.getType());
                netMap.put("broadcast", netConfig.getBroadcast());
                netMap.put("netmask", netConfig.getNetmask());
                netMap.put("rxPackets", netIfStat.getRxPackets());
                netMap.put("txPackets", netIfStat.getTxPackets());
                netMap.put("rxBytes", netIfStat.getRxBytes());
                netMap.put("txBytes", netIfStat.getTxBytes());
                netMap.put("txPackets", netIfStat.getTxPackets());
                netMap.put("txbps", bps.get("txbps"));
                netMap.put("rxbps", bps.get("rxbps"));
            } catch (SigarException e) {
                e.printStackTrace();
            }
            return netMap;
        }
        }
        return netMap;
    }
    private static void ethernet() throws SigarException {
        String[] ifaces = sigar.getNetInterfaceList();
        for (int i = 0; i < ifaces.length; i++) {
            NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]);
            if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
                    || NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())
                    || NetFlags.ANY_ADDR.equals(cfg.getAddress())) {
                continue;
            }
            if ((cfg.getFlags() & 1L) <= 0L) {
                System.out.println("!IFF_UP...skipping getNetInterfaceStat");
                continue;
            }
            logger.info(cfg.getName() + "IP地址:" + cfg.getAddress());// IP地址
            logger.info(cfg.getName() + "网关广播地址:" + cfg.getBroadcast());// 网关广播地址
            logger.info(cfg.getName() + "网卡MAC地址:" + cfg.getHwaddr());// 网卡MAC地址
            logger.info(cfg.getName() + "子网掩码:" + cfg.getNetmask());// 子网掩码
            logger.info(cfg.getName() + "网卡描述信息:" + cfg.getDescription());// 网卡描述信息
            logger.info(cfg.getName() + "网卡类型" + cfg.getType());//
        private static void ethernet() throws SigarException {
            String[] ifaces = sigar.getNetInterfaceList();
            for (int i = 0; i < ifaces.length; i++) {
                NetInterfaceConfig cfg = sigar.getNetInterfaceConfig(ifaces[i]);
                if (NetFlags.LOOPBACK_ADDRESS.equals(cfg.getAddress()) || (cfg.getFlags() & NetFlags.IFF_LOOPBACK) != 0
                        || NetFlags.NULL_HWADDR.equals(cfg.getHwaddr())
                        || NetFlags.ANY_ADDR.equals(cfg.getAddress())) {
                    continue;
                }
                if ((cfg.getFlags() & 1L) <= 0L) {
                    System.out.println("!IFF_UP...skipping getNetInterfaceStat");
                    continue;
                }
                logger.info(cfg.getName() + "IP地址:" + cfg.getAddress());// IP地址
                logger.info(cfg.getName() + "网关广播地址:" + cfg.getBroadcast());// 网关广播地址
                logger.info(cfg.getName() + "网卡MAC地址:" + cfg.getHwaddr());// 网卡MAC地址
                logger.info(cfg.getName() + "子网掩码:" + cfg.getNetmask());// 子网掩码
                logger.info(cfg.getName() + "网卡描述信息:" + cfg.getDescription());// 网卡描述信息
                logger.info(cfg.getName() + "网卡类型" + cfg.getType());//
            }
        }
        }
    }
    /**
     * 網絡傳輸速率 bps
     *
     * @param name
     * @throws SigarException
     */
    public static Map<String, Object> populate(String name)
            throws SigarException {
        Map<String, Object> bps = new HashMap<>();
        try {
            long start = System.currentTimeMillis();
            NetInterfaceStat statStart = sigar.getNetInterfaceStat(name);
            long rxBytesStart = statStart.getRxBytes();
            long txBytesStart = statStart.getTxBytes();
            Thread.sleep(1000);
            long end = System.currentTimeMillis();
            NetInterfaceStat statEnd = sigar.getNetInterfaceStat(name);
            long rxBytesEnd = statEnd.getRxBytes();
            long txBytesEnd = statEnd.getTxBytes();
            long rxbps = ((rxBytesEnd - rxBytesStart) * 8 / 1024) / ((end - start) / 1000);
            long txbps = ((txBytesEnd - txBytesStart) * 8 / 1024) / ((end - start) / 1000);
            bps.put("rxbps", rxbps);
            bps.put("txbps", txbps);
            logger.info("#######rxbps: " + rxbps + " txbps: " + txbps);
        } catch (SigarException e) {
        } catch (Exception e) {
        /**
         * 網絡傳輸速率 bps
         *
         * @param name
         * @throws SigarException
         */
        public static Map<String, Object> populate(String name)
                throws SigarException {
            Map<String, Object> bps = new HashMap<>();
            try {
                long start = System.currentTimeMillis();
                NetInterfaceStat statStart = sigar.getNetInterfaceStat(name);
                long rxBytesStart = statStart.getRxBytes();
                long txBytesStart = statStart.getTxBytes();
                Thread.sleep(1000);
                long end = System.currentTimeMillis();
                NetInterfaceStat statEnd = sigar.getNetInterfaceStat(name);
                long rxBytesEnd = statEnd.getRxBytes();
                long txBytesEnd = statEnd.getTxBytes();
                long rxbps = ((rxBytesEnd - rxBytesStart) * 8 / 1024) / ((end - start) / 1000);
                long txbps = ((txBytesEnd - txBytesStart) * 8 / 1024) / ((end - start) / 1000);
                bps.put("rxbps", rxbps);
                bps.put("txbps", txbps);
                logger.info("#######rxbps: " + rxbps + " txbps: " + txbps);
            } catch (SigarException e) {
            } catch (Exception e) {
            }
            return bps;
        }
        }
        return bps;
    }
    /**
     * 获取两位小数的double值
     * @param value
     * @return
     */
    public static double getDouble(double value){
        String total = String.format("%.2f", value );
        return Double.parseDouble(total);
    }
        /**
         * 获取两位小数的double值
         * @param value
         * @return
         */
        public static double getDouble(double value){
            String total = String.format("%.2f", value );
            return Double.parseDouble(total);
        }
}
    }

+ 33 - 0
hos-camel2/pom.xml

@ -98,6 +98,39 @@
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <artifactId>jackson-dataformat-xml</artifactId>
        </dependency>
        </dependency>
        <dependency>
            <groupId>com.yihu.hos</groupId>
            <artifactId>hos-web-framework</artifactId>
            <version>${hos-version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-jpa</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.yihu.core</groupId>
            <artifactId>api-dict</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>com.yihu.core</groupId>
            <artifactId>core-rpc</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.yihu.core</groupId>
            <artifactId>api-config</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.yihu.core</groupId>
            <artifactId>core-db</artifactId>
            <version>1.3.0</version>
        </dependency>
    </dependencies>
    </dependencies>
</project>
</project>

+ 3 - 1
hos-camel2/src/main/java/camel/crawler/processor/Split.java

@ -3,9 +3,11 @@ package camel.crawler.processor;
import net.sf.json.JSONArray;
import net.sf.json.JSONArray;
import org.apache.camel.Body;
import org.apache.camel.Body;
import java.io.IOException;
public class Split {
public class Split {
    public JSONArray splitJsonArray(@Body String jsonArrayStr) {
    public JSONArray splitJsonArray(@Body String jsonArrayStr) throws IOException {
        return JSONArray.fromObject(jsonArrayStr);
        return JSONArray.fromObject(jsonArrayStr);
    }
    }
}
}

+ 20 - 0
hos-camel2/src/main/java/camel/qcrule/processor/PatientProcessor.java

@ -0,0 +1,20 @@
package camel.qcrule.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
public class PatientProcessor implements Processor {
    public PatientProcessor() {
    }
    public void process(Exchange exchange) throws Exception {
        Message inMessage = exchange.getIn();
        Message outMessage = exchange.getOut();
        String body = inMessage.getBody(String.class);
        outMessage.setBody(body);
    }
}

+ 159 - 0
hos-camel2/src/main/java/camel/qcrule/processor/QcHttpProcessor.java

@ -0,0 +1,159 @@
package camel.qcrule.processor;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.hos.core.datatype.StringUtil;
import net.sf.json.JSONObject;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.util.Iterator;
import java.util.Map;
/**
 * 采集上传流程操作类
 * 用于参数解析
 */
@Component
public class QcHttpProcessor implements Processor {
    private String paramJson;
    public QcHttpProcessor() {
    }
    public QcHttpProcessor(String paramJson) {
        this.paramJson = paramJson;
    }
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        JSONObject jsonObject = JSONObject.fromObject(paramJson);
        Iterator iterator = jsonObject.keys();
        String queryStr = "";
        while (iterator.hasNext()) {
            String name = (String) iterator.next();
            String value = (String) jsonObject.get(name);
            queryStr += name + "=" + value + "&&";
        }
        queryStr = StringUtil.substring(queryStr, 0, queryStr.length() - 2);
        outMessage.setHeader(Exchange.HTTP_QUERY, queryStr);
    }
    //跳转到质控采集接口
    public String toQc(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        JSONObject jsonObject = JSONObject.fromObject(paramJson);
        Iterator iterator = jsonObject.keys();
        String queryStr = "jetty:http://0.0.0.0:8088/crawler/qc/patient";
        while (iterator.hasNext()) {
            String name = (String) iterator.next();
            String value = (String) jsonObject.get(name);
            queryStr += name + "=" + value + "&&";
        }
        queryStr = StringUtil.substring(queryStr, 0, queryStr.length() - 2);
        return queryStr;
//        outMessage.setHeader(Exchange.HTTP_QUERY, queryStr);
    }
    public void patient(Exchange exchange) throws Exception {
        Message inMessage = exchange.getIn();
        JSONObject jsonObject = JSONObject.fromObject(inMessage.getBody());
        exchange.getOut().setBody(jsonObject.toString());
        System.out.println(inMessage.getBody());
    }
    public String routeUploadPatient(Exchange exchange) throws IOException, ParseException {
//        body = URLDecoder.decode(body, "UTF-8");
        Map<String, Object> params = exchange.getIn().getHeaders();
//        String api = params.get("api").toString();                     // API接口名称
        String param = params.get("param").toString();
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            JsonNode jsonNode = objectMapper.readValue(param, JsonNode.class);
            String url = "jetty:http://0.0.0.0:8088/crawler/patient";
            final String[] endPoint = {url};
            final String[] body = {""};
//            body[0] += ("&" + p.getName() + "=" + value);
            if (body[0].length() != 0) {
                exchange.getOut().setHeader(Exchange.REST_HTTP_QUERY, body[0].substring(1));
            }
//            exchange.getOut().setBody(null);
            return endPoint[0];
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
    public String routeUploadQc(Exchange exchange) throws IOException, ParseException {
//        body = URLDecoder.decode(body, "UTF-8");
        Map<String, Object> params = exchange.getIn().getHeaders();
        String patient = URLEncoder.encode(params.get("patient").toString(), "UTF-8"); //病人信息
        String rules = exchange.getIn().getBody(String.class);//规则队列
        try {
            String endPoint = "jetty:http://0.0.0.0:8088/crawler/qc/patient";
            final String queryParams = "checkType=" + rules + "&patient=" + patient;
            exchange.getOut().setHeader(Exchange.REST_HTTP_QUERY, queryParams);
            return endPoint;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
    /**
     * 根据job上传质控数据和档案包
     * @param exchange
     * @return
     * @throws IOException
     * @throws ParseException
     */
    public String routeUploadQcByJob(Exchange exchange) throws IOException, ParseException {
//        body = URLDecoder.decode(body, "UTF-8");
        Map<String, Object> params = exchange.getIn().getHeaders();
        String jobId = (String) exchange.getIn().getHeader(Exchange.HTTP_QUERY);
        String rules = exchange.getIn().getBody(String.class);//规则队列
        try {
            String endPoint = "jetty:http://0.0.0.0:8088/crawler/qc/crawlerPatientList";
            final String queryParams = "checkType=" + rules + "&" + jobId;
            exchange.getOut().setHeader(Exchange.REST_HTTP_QUERY, queryParams);
            return endPoint;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
    /**
     * 统计规则,返回规则列表
     *
     * @param exchange
     * @throws Exception
     */
    public void coutType(Exchange exchange) throws Exception {
        Message inMessage = exchange.getIn();
        String newType = (String) inMessage.getHeader("checkType");
        Object countType = inMessage.getHeader("countType");
        if (countType != null && !StringUtil.isEmpty(countType)) {
            newType = newType + "," + countType;
        }
        exchange.getOut().setHeader("countType", newType);
        exchange.getOut().setBody(inMessage.getBody());
    }
}

+ 63 - 0
hos-camel2/src/main/java/camel/qcrule/router/QcCrawlerRoute.java

@ -0,0 +1,63 @@
package camel.qcrule.router;
import camel.crawler.processor.Split;
import camel.qcrule.processor.PatientProcessor;
import camel.qcrule.processor.QcHttpProcessor;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
/**
 * 采集上传流程
 *  此类为camel-quartz 采集使用的模板类,
 *  格式要求:1.routeId("routeId")
 *            2."{\"jobId\": \"jobId\"}"
 * @author HZY * @vsrsion 1.0 * Created at 2016/11/17.
 */
@Component
public class QcCrawlerRoute extends RouteBuilder {
    public void configure() throws Exception {
        from("jetty:http://0.0.0.0:8888/qc/crawler").routeId("creawrouteId").process(new QcHttpProcessor("{\"jobId\": \"4028cb815c7c0770015c7c0bbc3f0000\"}"))
                .setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .to("jetty:http://0.0.0.0:8088/crawler/qc/patientList")
                .split().method(Split.class, "splitJsonArray")//循环
                .to("direct:splitPatient");
        from("direct:splitPatient")
                .process(new PatientProcessor())
                .multicast().parallelProcessing()//多播
                //新增规则
                .to("direct:uploadQc", "direct:uploadPatient")
        .end();
        from("direct:uploadQc")
                .setHeader("patient", body())
                .to("jetty:http://0.0.0.0:8088/crawler/qc/rules")//获取规则列表
                .routingSlip(method(QcHttpProcessor.class, "routeUploadQc"))//质控采集路由
                .to("jetty:http://0.0.0.0:8088/crawler/test");
        from("direct:uploadPatient")
//                .routingSlip(method(QcHttpProcessor.class, "routeUploadPatient"));
                .to("jetty:http://0.0.0.0:8088/crawler/test2");
        from("jetty:http://0.0.0.0:7777/qc/{checkType}")
                .choice()
                .when(header(Exchange.HTTP_URI).contains("checkNull")).setHeader("checkType", constant("emptry")).bean(method(QcHttpProcessor.class, "coutType"))
                .when(header(Exchange.HTTP_URI).contains("checkRight")).setHeader("checkType", constant("error")).bean(method(QcHttpProcessor.class, "coutType"))
                .endChoice();
        //通过任务直接采集质控数据和档案数据
        from("jetty:http://0.0.0.0:8999/qc/crawler").routeId("crawlerQcList").process(new QcHttpProcessor("{\"jobId\": \"4028cb815c7c0770015c7c0bbc3f0000\"}"))
                .setHeader(Exchange.HTTP_METHOD, constant("POST"))
                .to("jetty:http://0.0.0.0:8088/crawler/qc/rules")//获取规则列表
                .routingSlip(method(QcHttpProcessor.class, "routeUploadQcByJob"))//根据job采集质控路由
                ;
    }
}

+ 20 - 0
hos-camel2/src/main/java/camel/quartz2/processor/Quartz2Processor.java

@ -0,0 +1,20 @@
package camel.quartz2.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
/**
 * Created by Zdm on 2016/7/13.
 */
public class Quartz2Processor extends ClassLoader implements Processor {
    public void process(Exchange exchange) throws Exception {
        Message outMessage = exchange.getOut();
        System.out.println("测试,quartz ####################################");
        for (int i=0;i<30;i++){
            Thread.sleep(1000*3);
            System.out.println(i);
        }
        outMessage.setBody("hello,quartz========================");
    }
}

+ 11 - 0
hos-camel2/src/main/java/camel/quartz2/route/Quartz2Route.java

@ -0,0 +1,11 @@
package camel.quartz2.route;
import camel.quartz2.processor.Quartz2Processor;
import org.apache.camel.builder.RouteBuilder;
public class Quartz2Route  extends RouteBuilder {
    public void configure() throws Exception {
        from("quartz://myGroup2/quartz2?cron=0 0/1 * * * ?").routeId("routeId").process(new Quartz2Processor())
               ;
    }
}

+ 121 - 13
hos-rest/src/main/java/com/yihu/hos/rest/common/format/DataSetTransformer.java

@ -1,6 +1,7 @@
package com.yihu.hos.rest.common.format;
package com.yihu.hos.rest.common.format;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.ehr.dbhelper.jdbc.DBHelper;
import com.yihu.ehr.dbhelper.jdbc.DBHelper;
@ -14,6 +15,7 @@ import com.yihu.hos.rest.models.crawler.patient.Patient;
import com.yihu.hos.rest.models.crawler.transform.DictDataType;
import com.yihu.hos.rest.models.crawler.transform.DictDataType;
import com.yihu.hos.rest.models.crawler.transform.TransformType;
import com.yihu.hos.rest.models.crawler.transform.TransformType;
import com.yihu.hos.rest.models.standard.standard.StdMetaDataModel;
import com.yihu.hos.rest.models.standard.standard.StdMetaDataModel;
import com.yihu.hos.web.framework.constant.QcResultConstant;
import com.yihu.hos.web.framework.constant.SqlConstants;
import com.yihu.hos.web.framework.constant.SqlConstants;
import java.util.Iterator;
import java.util.Iterator;
@ -39,6 +41,11 @@ public class DataSetTransformer implements IDataTransformer {
    private JsonNode jsonObject;
    private JsonNode jsonObject;
    private Patient patient;
    private Patient patient;
    private static DBHelper db;
    private static DBHelper db;
    private JsonNode qcObject;
    public JsonNode getQcObject() {
        return qcObject;
    }
    public JsonNode getJsonObject() {
    public JsonNode getJsonObject() {
        return jsonObject;
        return jsonObject;
@ -88,6 +95,9 @@ public class DataSetTransformer implements IDataTransformer {
                            JsonNode jsonNode = next.getValue();
                            JsonNode jsonNode = next.getValue();
                            String value = jsonNode.asText();
                            String value = jsonNode.asText();
                            String stdValue = transferElemTime(stdMetaDataModelMap, key, value);
                            String stdValue = transferElemTime(stdMetaDataModelMap, key, value);
                            if (stdValue==null){
                                stdValue="";
                            }
                            jsonObject.put(key, stdValue);
                            jsonObject.put(key, stdValue);
//                            if (jsonNode instanceof ObjectNode) {
//                            if (jsonNode instanceof ObjectNode) {
@ -115,6 +125,7 @@ public class DataSetTransformer implements IDataTransformer {
    public void setData(JsonNode data) {
    public void setData(JsonNode data) {
        jsonObject = data;
        jsonObject = data;
        qcObject = data;
        setPatient();
        setPatient();
    }
    }
@ -161,10 +172,7 @@ public class DataSetTransformer implements IDataTransformer {
            JsonNode jsonNode = next.getValue();
            JsonNode jsonNode = next.getValue();
            String value = jsonNode.asText();
            String value = jsonNode.asText();
            String stdValue = transferElem(adapterDataSet, key, value);
            String stdValue = transferElem(adapterDataSet, key, value);
            if (!StringUtil.isEmpty(value) && StringUtil.isEmpty(stdValue)){
                System.out.println("value:"+value +" stdValue:"+stdValue);
            }
            jsonObject.put(key,stdValue);
            jsonObject.put(key, stdValue);
//            if (jsonNode instanceof ObjectNode) {
//            if (jsonNode instanceof ObjectNode) {
//                ObjectNode objectNode = (ObjectNode) next;
//                ObjectNode objectNode = (ObjectNode) next;
@ -203,19 +211,24 @@ public class DataSetTransformer implements IDataTransformer {
    public String transferElemTime(Map<String, StdMetaDataModel> stdMetaDataModelMap, String code, String esbData) {
    public String transferElemTime(Map<String, StdMetaDataModel> stdMetaDataModelMap, String code, String esbData) {
        StdMetaDataModel stdMetaData = stdMetaDataModelMap.get(code);
        StdMetaDataModel stdMetaData = stdMetaDataModelMap.get(code);
        String columnType = stdMetaData.getColumnType();
        if (columnType == null) {
            return esbData;
        }
        if ("DATE".equals(columnType) || "DATETIME".equals(columnType)){
            //时间转换
            String utcDate = DateUtil.getUtcDate(esbData, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
            return utcDate;
        }else {
        if (stdMetaData == null ||stdMetaData.getColumnType() == null) {
            return esbData;
            return esbData;
        }
        }
        String columnType = stdMetaData.getColumnType();
        try{
            if ("DATE".equals(columnType) || "DATETIME".equals(columnType)) {
                //时间转换
                String utcDate = DateUtil.getUtcDate(esbData, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
                return utcDate;
            } else {
                return esbData;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return "";
    }
    }
    /**
    /**
@ -227,4 +240,99 @@ public class DataSetTransformer implements IDataTransformer {
        patient.setEventNo(jsonObject.get("event_no").asText());
        patient.setEventNo(jsonObject.get("event_no").asText());
        patient.setOrgCode(jsonObject.get("org_code").asText());
        patient.setOrgCode(jsonObject.get("org_code").asText());
    }
    }
    /* *************************** 以下为质控规则逻辑相关 **************************** add by hzy */
    public boolean genQcData(Map<String, AdapterDataSet> dataSetMap,String checkType) {
        if (jsonObject != null) {
            String dataSetCode = jsonObject.get("code").asText();
            ArrayNode jsonArray = (ArrayNode) jsonObject.get("data");
            AdapterDataSet adapterDataSet = dataSetMap.get(dataSetCode);
            //TODO 根据条件判断执行的规则
            switch (checkType){
                case  QcResultConstant.VALUE_EMPTY :checkDataIsNull(jsonArray,checkType);
                    break;
                case  QcResultConstant.VALUE_ERROR :checkDataTransfer(jsonArray, adapterDataSet, checkType);
                    break;
                default:
                    break;
            }
            return true;
        }
        return false;
    }
    //检测医院数据为空
    public void checkDataIsNull(ArrayNode jsonArray,String checkType) {
        ObjectMapper objectMapper = new ObjectMapper();
        ArrayNode arrayNode = objectMapper.createArrayNode();
        int realCount=0;
        for (Object objectRow : jsonArray) {
            if (objectRow instanceof JsonNode) {
                ObjectNode jsonObject = (ObjectNode) objectRow;
                Iterator<Map.Entry<String, JsonNode>> fields = jsonObject.fields();
                ObjectNode objectNode = objectMapper.createObjectNode();
                objectNode.put("total",jsonObject.size());
                while (fields.hasNext()) {
                    Map.Entry<String, JsonNode> next = fields.next();
                    String key = next.getKey();
                    JsonNode jsonNode = next.getValue();
                    String value = jsonNode.asText();
                    if (!StringUtil.isEmpty(value)) {
                        //医院数据是空
//                        jsonObject.remove(key);
                        System.out.println("value:" + value);
                    }else {
                        realCount++;
                        objectNode.put(key,checkType);
                    }
                }
                objectNode.put("error",realCount);
                arrayNode.add(objectNode);
                realCount=0;
            }
        }
        jsonArray.removeAll();
        jsonArray.addAll(arrayNode);
    }
    //检测是否转换异常
    public void checkDataTransfer(ArrayNode jsonArray, AdapterDataSet adapterDataSet,String checkType) {
        ObjectMapper objectMapper = new ObjectMapper();
        ArrayNode arrayNode = objectMapper.createArrayNode();
        int realCount=0;
        for (Object objectRow : jsonArray) {
            if (objectRow instanceof JsonNode) {
                ObjectNode jsonObject = (ObjectNode) objectRow;
                Iterator<Map.Entry<String, JsonNode>> fields = jsonObject.fields();
                ObjectNode objectNode = objectMapper.createObjectNode();
                objectNode.put("total",jsonObject.size());
                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 (!StringUtil.isEmpty(value) && StringUtil.isEmpty(stdValue)) {
                        //转换后数据异常
                        objectNode.put(key, checkType+": org_value: " + value + " stdValue: " + stdValue);
                        System.out.println("value: " + value + " stdValue:" + stdValue);
                        realCount++;
                    }
                }
                objectNode.put("error",realCount);
                arrayNode.add(objectNode);
                realCount=0;
            }
        }
        jsonArray.removeAll();
        jsonArray.addAll(arrayNode);
    }
}
}

+ 3 - 0
hos-rest/src/main/java/com/yihu/hos/rest/common/http/EHRHttpHelper.java

@ -20,6 +20,7 @@ import java.util.Properties;
public class EHRHttpHelper {
public class EHRHttpHelper {
    public static String defaultHttpUrl;
    public static String defaultHttpUrl;
    public static String httpCouldUrl;
    public static String httpCouldUrl;
    public static String httpAdminUrl;
    public static String clientId;
    public static String clientId;
    public static String clientKey;
    public static String clientKey;
    private static SSLConnectionSocketFactory defaultSSL;
    private static SSLConnectionSocketFactory defaultSSL;
@ -35,6 +36,7 @@ public class EHRHttpHelper {
            Properties props = PropertiesLoaderUtils.loadProperties(encRes);
            Properties props = PropertiesLoaderUtils.loadProperties(encRes);
            httpCouldUrl = props.getProperty("httpCouldUrl");
            httpCouldUrl = props.getProperty("httpCouldUrl");
            defaultHttpUrl = props.getProperty("httpUrl");
            defaultHttpUrl = props.getProperty("httpUrl");
            httpAdminUrl = props.getProperty("httpAdminUrl");
            defaultHttpUser = props.getProperty("httpUser");
            defaultHttpUser = props.getProperty("httpUser");
            defaultHttpPassword = props.getProperty("httpPassword");
            defaultHttpPassword = props.getProperty("httpPassword");
            clientId = props.getProperty("clientId");
            clientId = props.getProperty("clientId");
@ -126,6 +128,7 @@ public class EHRHttpHelper {
        return HttpClientKit.postFile(url, filePath, formParams,headers);
        return HttpClientKit.postFile(url, filePath, formParams,headers);
    }
    }
    public static HTTPResponse postFile(String url, Map<String, String> formParams, File file, Map<String, String> headers) {
    public static HTTPResponse postFile(String url, Map<String, String> formParams, File file, Map<String, String> headers) {
        return HttpClientKit.postFile(url, file.getAbsolutePath(), formParams,headers);
        return HttpClientKit.postFile(url, file.getAbsolutePath(), formParams,headers);
    }
    }

+ 91 - 20
hos-rest/src/main/java/com/yihu/hos/rest/controllers/CrawlerController.java

@ -2,9 +2,7 @@ package com.yihu.hos.rest.controllers;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.rest.models.crawler.patient.Patient;
import com.yihu.hos.rest.models.crawler.patient.Patient;
import com.yihu.hos.rest.services.crawler.CrawlerFlowManager;
import com.yihu.hos.rest.services.crawler.CrawlerManager;
import com.yihu.hos.rest.services.crawler.CrawlerService;
import com.yihu.hos.rest.services.crawler.*;
import com.yihu.hos.rest.services.standard.adapter.AdapterSchemeService;
import com.yihu.hos.rest.services.standard.adapter.AdapterSchemeService;
import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.model.ActionResult;
import com.yihu.hos.web.framework.model.DetailModelResult;
import com.yihu.hos.web.framework.model.DetailModelResult;
@ -12,16 +10,13 @@ import com.yihu.hos.web.framework.model.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiParam;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.IOException;
import java.util.Date;
import java.util.Date;
import java.util.List;
/**
/**
@ -30,7 +25,7 @@ import java.util.Date;
 * Created by Airhead on 2015/12/16.
 * Created by Airhead on 2015/12/16.
 */
 */
@RequestMapping("/crawler")
@RequestMapping("/crawler")
@Controller("crawlerController")
@RestController("crawlerController")
@Api(protocols = "http", value = "CrawlerController", description = "档案采集接口", tags = {"采集"})
@Api(protocols = "http", value = "CrawlerController", description = "档案采集接口", tags = {"采集"})
public class CrawlerController {
public class CrawlerController {
@ -39,17 +34,24 @@ public class CrawlerController {
    @Resource
    @Resource
    CrawlerManager crawlerManager;
    CrawlerManager crawlerManager;
    @Resource
    @Resource
    QCCrawlerManager qcCrawlerManager;
    @Resource
    CrawlerFlowManager crawlerFlowManager;
    CrawlerFlowManager crawlerFlowManager;
    @Resource(name = AdapterSchemeService.BEAN_ID)
    @Resource(name = AdapterSchemeService.BEAN_ID)
    private AdapterSchemeService adapterSchemeService;
    private AdapterSchemeService adapterSchemeService;
    @Resource(name = QcRuleService.BEAN_ID)
    private QcRuleService qcRuleService;
    @RequestMapping(value = "/test", produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
    @RequestMapping(value = "/test", produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
    @ApiOperation(value = "测试服务器可以正常连接", produces = "application/json", notes = "测试服务器可以正常连接")
    @ApiOperation(value = "测试服务器可以正常连接", produces = "application/json", notes = "测试服务器可以正常连接")
    public String test() {
    public String test() {
        System.out.println("test1111111111111111");
        return "test";
        return "test";
    }
    }
    /**
    /**
    任务编排
    任务编排
    */
    */
@ -92,17 +94,20 @@ public class CrawlerController {
            @ApiParam(name = "patient", value = "病人索引信息", required = true)
            @ApiParam(name = "patient", value = "病人索引信息", required = true)
            @RequestParam(value = "patient") String patientInfo) {
            @RequestParam(value = "patient") String patientInfo) {
        Patient patient = crawlerManager.parsePatient(patientInfo);
        if (patient != null) {
            Boolean result = crawlerManager.collectProcess(patient);
            if (result) {
                return Result.success("采集上传成功");
            } else {
                return Result.error("采集上传失败");
            }
        } else {
            return Result.error("参数转换病人实体失败");
        }
        System.out.println("采集上传接口调用:"+patientInfo);
        return Result.success("采集上传成功");
//        Patient patient = crawlerManager.parsePatient(patientInfo);
//        if (patient != null) {
//            Boolean result = crawlerManager.collectProcess(patient);
//            if (result) {
//                return Result.success("采集上传成功");
//            } else {
//                return Result.error("采集上传失败");
//            }
//        } else {
//            return Result.error("参数转换病人实体失败");
//        }
    }
    }
    @RequestMapping(value = "patient/flow", method = RequestMethod.POST)
    @RequestMapping(value = "patient/flow", method = RequestMethod.POST)
@ -320,4 +325,70 @@ public class CrawlerController {
    }
    }
    /* ***************************************** 以下为 质控校验规则添加后的采集逻辑 接口*********************************************** */
    @RequestMapping(value = "/qc/patientList", method = RequestMethod.POST)
    @ApiOperation(value = "采集病人事件列表", produces = "application/json", notes = "采集病人事件列表")
    @ResponseBody
    public List<Patient> getPatientList(
            @ApiParam(name = "jobId", value = "任务jobId", required = true)
            @RequestParam(value = "jobId") String jobId) {
        try {
            return qcCrawlerManager.PatientListByJobId(jobId);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    @RequestMapping(value = "qc/crawlerPatientList", method = RequestMethod.POST)
    @ApiOperation(value = "按任务采集质控数据", produces = "application/json", notes = "按任务采集质控数据")
    @ResponseBody
    public Result crawlerQCDataList(
            @ApiParam(name = "jobId", value = "任务jobId", required = true)
            @RequestParam(value = "jobId") String jobId,
            @ApiParam(name = "checkType", value = "质控规则类型集合,以“,”分割", required = false)
            @RequestParam(value = "checkType", required = false) String checkType) {
        try {
            return qcCrawlerManager.dataCrawlerByJobId(jobId,checkType);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("采集上传失败");
        }
    }
    @RequestMapping(value = "/qc/patient", method = RequestMethod.POST)
    @ApiOperation(value = "采集单份档案质控数据", produces = "application/json", notes = "采集病人档案质控数据")
    public Result crawlerQcData(
            @ApiParam(name = "patient", value = "病人索引信息", required = false)
            @RequestParam(value = "patient") String patientInfo,
            @ApiParam(name = "checkType", value = "质控规则类型集合,以“,”分割", required = false)
            @RequestParam(value = "checkType") String checkType) {
        Patient patient = qcCrawlerManager.parsePatient(patientInfo);
        //TODO 通过获取规则,获取规则类型,进行校验
        if (patient != null) {
            Boolean result = qcCrawlerManager.collectProcess(patient, checkType);
            if (result) {
                return Result.success("上传档案质控数据成功");
            } else {
                return Result.error("上传档案质控数据失败");
            }
        } else {
            return Result.error("病人索引实体,参数转换失败!");
        }
    }
    @RequestMapping(value = "qc/rules", method = RequestMethod.POST)
    @ApiOperation(value = "获取质控规则列表", produces = "application/json", notes = "获取质控规则列表")
    public String qcRules() {
        try {
            return qcRuleService.getRuleNames();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
}

+ 1 - 1
hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/config/SysConfig.java

@ -147,7 +147,7 @@ public class SysConfig {
                Element element = (Element) obj;
                Element element = (Element) obj;
                String dataSetCode = element.attributeValue("code");
                String dataSetCode = element.attributeValue("code");
                String version = element.elementTextTrim("version");
                String version = element.elementTextTrim("version");
                orgcode= element.attributeValue("code");
                String ehrVersion=new String(version);
                String ehrVersion=new String(version);
                versionMap.put(dataSetCode,ehrVersion);
                versionMap.put(dataSetCode,ehrVersion);
            }
            }

+ 135 - 0
hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/qc/QcDaily.java

@ -0,0 +1,135 @@
package com.yihu.hos.rest.models.crawler.qc;
import java.util.ArrayList;
import java.util.List;
/**
 * 质控-日报
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/6/1.
 */
public class QcDaily {
    private String org_code;
    private String create_date;
    private String inner_version;
    private Integer total_outpatient_num;
    private Integer real_outpatient_num;
    private Integer total_hospital_num;
    private Integer real_hospital_num;
    private List<QcPatientIndex> total_outpatient=new ArrayList<>();
    private List<QcPatientIndex> real_outpatient=new ArrayList<>();
    private List<QcPatientIndex> total_hospital=new ArrayList<>();;
    private List<QcPatientIndex> real_hospital=new ArrayList<>();;
    public void addTotal(QcPatientIndex patientIndex,String dataSet){
        if ("HDSC01_02".equals(dataSet)){
            this.total_outpatient.add(patientIndex);
        }else if ("HDSC02_09".equals(dataSet)){
            this.total_hospital.add(patientIndex);
        }else {
            return;
        }
    }
    public void addReal(QcPatientIndex patientIndex,String dataSet){
        if ("HDSC01_02".equals(dataSet)){
            this.real_outpatient.add(patientIndex);
        }else if ("HDSC02_09".equals(dataSet)){
            this.real_hospital.add(patientIndex);
        }else {
            return;
        }
    }
    public String getOrg_code() {
        return org_code;
    }
    public void setOrg_code(String org_code) {
        this.org_code = org_code;
    }
    public String getCreate_date() {
        return create_date;
    }
    public void setCreate_date(String create_date) {
        this.create_date = create_date;
    }
    public String getInner_version() {
        return inner_version;
    }
    public void setInner_version(String inner_version) {
        this.inner_version = inner_version;
    }
    public Integer getTotal_outpatient_num() {
        return total_outpatient_num;
    }
    public void setTotal_outpatient_num(Integer total_outpatient_num) {
        this.total_outpatient_num = total_outpatient_num;
    }
    public Integer getReal_outpatient_num() {
        return real_outpatient_num;
    }
    public void setReal_outpatient_num(Integer real_outpatient_num) {
        this.real_outpatient_num = real_outpatient_num;
    }
    public Integer getTotal_hospital_num() {
        return total_hospital_num;
    }
    public void setTotal_hospital_num(Integer total_hospital_num) {
        this.total_hospital_num = total_hospital_num;
    }
    public Integer getReal_hospital_num() {
        return real_hospital_num;
    }
    public void setReal_hospital_num(Integer real_hospital_num) {
        this.real_hospital_num = real_hospital_num;
    }
    public List<QcPatientIndex> getTotal_outpatient() {
        return total_outpatient;
    }
    public void setTotal_outpatient(List<QcPatientIndex> total_outpatient) {
        this.total_outpatient = total_outpatient;
    }
    public List<QcPatientIndex> getReal_outpatient() {
        return real_outpatient;
    }
    public void setReal_outpatient(List<QcPatientIndex> real_outpatient) {
        this.real_outpatient = real_outpatient;
    }
    public List<QcPatientIndex> getTotal_hospital() {
        return total_hospital;
    }
    public void setTotal_hospital(List<QcPatientIndex> total_hospital) {
        this.total_hospital = total_hospital;
    }
    public List<QcPatientIndex> getReal_hospital() {
        return real_hospital;
    }
    public void setReal_hospital(List<QcPatientIndex> real_hospital) {
        this.real_hospital = real_hospital;
    }
}

+ 42 - 0
hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/qc/QcPatientIndex.java

@ -0,0 +1,42 @@
package com.yihu.hos.rest.models.crawler.qc;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/6/1.
 */
public class QcPatientIndex {
    private String patient_id;
    private String event_no;
    private String event_time;
    public QcPatientIndex(String patient_id, String event_no, String event_time) {
        this.patient_id = patient_id;
        this.event_time = event_time;
        this.event_no = event_no;
    }
    public String getPatient_id() {
        return patient_id;
    }
    public void setPatient_id(String patient_id) {
        this.patient_id = patient_id;
    }
    public String getEvent_no() {
        return event_no;
    }
    public void setEvent_no(String event_no) {
        this.event_no = event_no;
    }
    public String getEvent_time() {
        return event_time;
    }
    public void setEvent_time(String event_time) {
        this.event_time = event_time;
    }
}

+ 68 - 0
hos-rest/src/main/java/com/yihu/hos/rest/models/crawler/qc/QcRuleModel.java

@ -0,0 +1,68 @@
package com.yihu.hos.rest.models.crawler.qc;
import java.io.Serializable;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/6/6.
 */
public class QcRuleModel implements Serializable {
    private String id;
    private String name;
    private String type;
    private String description;
    private String rule;
    private String errorCode;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getRule() {
        return rule;
    }
    public void setRule(String rule) {
        this.rule = rule;
    }
    public String getErrorCode() {
        return errorCode;
    }
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }
}

+ 16 - 6
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/CrawlerManager.java

@ -154,6 +154,7 @@ public class CrawlerManager {
            logger.error("适配数据尚未准备");
            logger.error("适配数据尚未准备");
            return false;
            return false;
        }
        }
        patient.setReUploadFlg(StringUtil.toString(false));
        patient.setReUploadFlg(StringUtil.toString(false));
        logger.trace("采集->注册->打包上传,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
        logger.trace("采集->注册->打包上传,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
        try {
        try {
@ -164,14 +165,23 @@ public class CrawlerManager {
//            }
//            }
            //getRemoteVersion
            //getRemoteVersion
            if (!dispatch.getRemoteVersion(patient.getOrgCode())) {
                logger.error("远程版本获取失败");
                return false;
            }
//            if (!dispatch.getRemoteVersion(patient.getOrgCode())) {
//                logger.error("远程版本获取失败");
//                return false;
//            }
            if(StringUtil.isEmpty(sysConfig.getVersionMap().get(patient.getOrgCode()))){
            if(StringUtil.isEmpty(sysConfig.getVersionMap().get(patient.getOrgCode()))){
                logger.error("版本获取失败");
                return false;
                Map.Entry<String, AdapterDataSet> next = adapterDataSetMap.entrySet().iterator().next();
                Integer schemeId = next.getValue().getAdapterDataSetT().getSchemeId();
                AdapterSchemeModel schemeModel = adapterSchemeService.getEntity(AdapterSchemeModel.class,schemeId);
                if (schemeModel.getStdVersion()!=null){
                    SysConfig.getInstance().getVersionMap().put(patient.getOrgCode(), schemeModel.getStdVersion());
                }else {
                    logger.error("版本获取失败");
                    return false;
                }
            }
            }
            Map<String, AdapterDataSet> dataSetMap = new HashMap<>();
            Map<String, AdapterDataSet> dataSetMap = new HashMap<>();

+ 151 - 11
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/DataCollectDispatcher.java

@ -44,6 +44,7 @@ public class DataCollectDispatcher {
    private static String unstructured_main = "unstructured_main";
    private static String unstructured_main = "unstructured_main";
    private static String unstructured_thin = "unstructured_thin";
    private static String unstructured_thin = "unstructured_thin";
    private static String gridFsDB = "files";
    private static String gridFsDB = "files";
    private DataCollectDispatcher() {
    private DataCollectDispatcher() {
    }
    }
@ -55,7 +56,7 @@ public class DataCollectDispatcher {
    }
    }
    public Boolean getToken () {
    public Boolean getToken() {
        try {
        try {
            token = EsbHttp.getToken();
            token = EsbHttp.getToken();
            if (StringUtil.isEmpty(token)) {
            if (StringUtil.isEmpty(token)) {
@ -68,7 +69,7 @@ public class DataCollectDispatcher {
        }
        }
    }
    }
    public Boolean getRemoteVersion (String orgCode) {
    public Boolean getRemoteVersion(String orgCode) {
        try {
        try {
            if (StringUtil.isEmpty(SysConfig.getInstance().getVersionMap().get(orgCode))) {
            if (StringUtil.isEmpty(SysConfig.getInstance().getVersionMap().get(orgCode))) {
                String stdVersion = EsbHttp.getRemoteVersion(orgCode);
                String stdVersion = EsbHttp.getRemoteVersion(orgCode);
@ -165,7 +166,7 @@ public class DataCollectDispatcher {
        if (adapterDataSet.isHaveEventNo()) {
        if (adapterDataSet.isHaveEventNo()) {
            AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(patientIdentity.getEventNoCode());
            AdapterMetaData adapterMetaData = adapterDataSet.getAdapterMetaDataMap().get(patientIdentity.getEventNoCode());
            propertyMap.put(SqlConstants.EVENT_NO,  adapterMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase());
            propertyMap.put(SqlConstants.EVENT_NO, adapterMetaData.getAdapterMetadataModel().getStdMetadataCode().toUpperCase());
        } else {
        } else {
            logger.error("采集病人列表数据集必须有event_no.");
            logger.error("采集病人列表数据集必须有event_no.");
            return null;
            return null;
@ -225,6 +226,7 @@ public class DataCollectDispatcher {
    /**
    /**
     * 根据编排任务进行采集
     * 根据编排任务进行采集
     *
     * @param patient
     * @param patient
     * @param adapterDataSet
     * @param adapterDataSet
     * @return
     * @return
@ -278,7 +280,7 @@ public class DataCollectDispatcher {
                jsonObject.put("org_code", agencyCode);
                jsonObject.put("org_code", agencyCode);
                jsonObject.put("inner_version", SysConfig.getInstance().getVersionMap().get(patient.getOrgCode()));
                jsonObject.put("inner_version", SysConfig.getInstance().getVersionMap().get(patient.getOrgCode()));
                jsonObject.put("create_date", DateUtil.getUtcDate(new Date()));
                jsonObject.put("create_date", DateUtil.getUtcDate(new Date()));
                jsonObject.put("event_time", DateUtil.getUtcDate(patient.getReferenceTime(),DateUtil.DEFAULT_YMDHMSDATE_FORMAT));//DateUtil.toString(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT)
                jsonObject.put("event_time", DateUtil.getUtcDate(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT));//DateUtil.toString(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT)
                if (StringUtil.isEmpty(patient.getReUploadFlg())) {
                if (StringUtil.isEmpty(patient.getReUploadFlg())) {
                    jsonObject.put("reUploadFlg", LogicValues.LOGIC_FALSE);
                    jsonObject.put("reUploadFlg", LogicValues.LOGIC_FALSE);
                } else {
                } else {
@ -320,7 +322,7 @@ public class DataCollectDispatcher {
        return EsbHttp.register(patient, data, token);
        return EsbHttp.register(patient, data, token);
    }
    }
    public Boolean upload(Map<String, JsonNode> dataMap, Patient patient, Map<String, AdapterDataSet> dataSetMap, Map<String,StdDataSet> stdDataSetMap) {
    public Boolean upload(Map<String, JsonNode> dataMap, Patient patient, Map<String, AdapterDataSet> dataSetMap, Map<String, StdDataSet> stdDataSetMap) {
        Boolean result = true;
        Boolean result = true;
        try {
        try {
            DataSetTransformer dataTransformer = new DataSetTransformer();
            DataSetTransformer dataTransformer = new DataSetTransformer();
@ -410,11 +412,12 @@ public class DataCollectDispatcher {
            MongodbQuery mdbSecond = new MongodbQuery("origin");
            MongodbQuery mdbSecond = new MongodbQuery("origin");
            DBList listSecond = mdbSecond.query(qe);
            DBList listSecond = mdbSecond.query(qe);
            JSONObject jo=new JSONObject();
            JSONObject jo = new JSONObject();
            jo.put("detailModelList", list.getList().toString());
            jo.put("detailModelList", list.getList().toString());
            jo.put("originList",listSecond.getList().toString());
            jo.put("originList", listSecond.getList().toString());
            return jo.toString();
            return jo.toString();
        } catch (Exception e) {
        } catch (Exception e) {
            e.printStackTrace();
            return "";
            return "";
        }
        }
    }
    }
@ -451,7 +454,7 @@ public class DataCollectDispatcher {
            paramsNode.put("tableCode", adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
            paramsNode.put("tableCode", adapterDataSet.getAdapterDataSetT().getStdDatasetCode());
            paramsNode.put("condition", mapper.writeValueAsString(queryParams));
            paramsNode.put("condition", mapper.writeValueAsString(queryParams));
            Map<String,String> formParams = new HashMap<>();
            Map<String, String> formParams = new HashMap<>();
//            formParams.add(new BasicNameValuePair("secret", secret));
//            formParams.add(new BasicNameValuePair("secret", secret));
            formParams.put("api", "collectionData");
            formParams.put("api", "collectionData");
            formParams.put("param", mapper.writeValueAsString(paramsNode));
            formParams.put("param", mapper.writeValueAsString(paramsNode));
@ -491,6 +494,7 @@ public class DataCollectDispatcher {
    /**
    /**
     * 生成非结构化索引文件document.json
     * 生成非结构化索引文件document.json
     *
     * @param dataTransformer
     * @param dataTransformer
     * @param patient
     * @param patient
     * @param fileName
     * @param fileName
@ -510,13 +514,149 @@ public class DataCollectDispatcher {
        return writeFile;
        return writeFile;
    }
    }
    public List<ObjectId> getObjectIds(JsonNode jsonNode){
    public List<ObjectId> getObjectIds(JsonNode jsonNode) {
        List<ObjectId> objectIds = new ArrayList<>();
        List<ObjectId> objectIds = new ArrayList<>();
        if (jsonNode.isArray()){
            for (JsonNode data:jsonNode){
        if (jsonNode.isArray()) {
            for (JsonNode data : jsonNode) {
                objectIds.add(new ObjectId(data.get("CONTENT").toString()));
                objectIds.add(new ObjectId(data.get("CONTENT").toString()));
            }
            }
        }
        }
        return objectIds;
        return objectIds;
    }
    }
    /* ******************************* 以下为质控规则执行的相关逻辑 ************************************** */
    /**
     * 质控数据生成&上传
     *
     * @param dataMap       数据集-数据元数据
     * @param patient       病人索引信息
     * @param dataSetMap    适配数据集列表
     * @param stdDataSetMap 标准数据集列表
     * @param checkType     规则检验类型
     * @return
     */
    public Boolean uploadQcData(Map<String, JsonNode> dataMap, Patient patient, Map<String, AdapterDataSet> dataSetMap, Map<String, StdDataSet> stdDataSetMap, String checkType) {
        Boolean result = true;
        try {
            DataSetTransformer dataTransformer = new DataSetTransformer();
            String[] split = checkType.split(",");
            for (String type : split) {
                for (String key : dataMap.keySet()) {
                    dataTransformer.setData(dataMap.get(key).deepCopy());
                    dataTransformer.transferTimeFormat(stdDataSetMap);
                    dataTransformer.genQcData(dataSetMap, type);
                    if (!toQcFile(dataTransformer, patient, type)) {
                        logger.info("存储标准文件失败:patient_id=" + patient.getPatientId()
                                + "event_no=" + patient.getEventNo());
                        result = false;
                        break;
                    }
                }
            }
            QCDataUpload qcDatapload = new QCDataUpload();
            if (!qcDatapload.uploadQc(patient, QCDataIndex.IndexType.QC_TYPE_DATASET)) {
                result = false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            result = false;
        }
        return result;
    }
    /**
     * 生成质控详情文件
     * @param dataTransformer
     * @param patient
     * @param ckeckType
     * @return
     */
    public boolean toQcFile(DataSetTransformer dataTransformer, Patient patient, String ckeckType) {
        JsonNode jsonObject = dataTransformer.getQcObject();
        QCDataIndex qcDataIndex = new QCDataIndex(patient, DateUtil.getCurrentString(DateUtil.DEFAULT_NOW_STRING_FORMAT));
        String filePath = qcDataIndex.createDataIndex(ckeckType, PatientCDAIndex.FileType.JSON);
        boolean writeFile = false;
        try {
            writeFile = FileUtil.writeFile(filePath, jsonObject.toString(), "UTF-8");
        } catch (IOException e) {
            logger.info("存储临时文件失败.");
            logger.error("", e);
        }
        return writeFile;
    }
    /**
     * 生成质控日报文件
     * @param jsonObject    采集的数据内容
     * @param patient
     * @return
     */
    public boolean toQcDataSetFile(JsonNode jsonObject, Patient patient) {
        QCDataIndex qcDataSetIndex = new QCDataIndex(patient , DateUtil.getCurrentString(DateUtil.DEFAULT_NOW_STRING_FORMAT));
        String filePath = qcDataSetIndex.createQcDataSetIndex(PatientCDAIndex.FileType.JSON);
        boolean writeFile = false;
        try {
            writeFile = FileUtil.writeFile(filePath, jsonObject.toString(), "UTF-8");
        } catch (IOException e) {
            logger.info("存储质控-数据集实收/应收情况临时文件失败.");
            logger.error("", e);
        }
        return writeFile;
    }
    public boolean toDailyFile(JsonNode jsonObject, Patient patient,String createDate) {
        QCDataIndex qcDaliyIndex = new QCDataIndex(patient,createDate);
        String filePath = qcDaliyIndex.createQcDaliyIndex(PatientCDAIndex.FileType.JSON);
        boolean writeFile = false;
        try {
            writeFile = FileUtil.writeFile(filePath, jsonObject.toString(), "UTF-8");
        } catch (IOException e) {
            logger.info("存储质控-生成日报包临时文件失败.");
            logger.error("", e);
        }
        return writeFile;
    }
    /**
     * 上传日报包
     * @param jsonObject
     * @param patient
     * @return
     */
    public Boolean uploadQcDaily(JsonNode jsonObject, Patient patient) {
        boolean result = false;
        String currentString = DateUtil.getCurrentString(DateUtil.DEFAULT_NOW_STRING_FORMAT);
        boolean b = toDailyFile(jsonObject, patient,currentString);
        QCDataUpload qcDatapload = new QCDataUpload();
        if (b) {
            result = qcDatapload.uploadQcDailyZip(patient, QCDataIndex.IndexType.QC_TYPE_DAILY,currentString);
        }else {
            logger.debug("质控服务-日报包文件生成失败!");
        }
        return result;
    }
    public ObjectNode genQcDataSet(Patient patient) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            ObjectNode jsonObject = mapper.createObjectNode();
            jsonObject.put("patient_id", patient.getPatientId());
            jsonObject.put("event_no", patient.getEventNo());
            String agencyCode = patient.getOrgCode();
            jsonObject.put("org_code", agencyCode);
            jsonObject.put("inner_version", SysConfig.getInstance().getVersionMap().get(patient.getOrgCode()));
            jsonObject.put("create_date", DateUtil.getUtcDate(new Date()));
            jsonObject.put("event_time", DateUtil.getUtcDate(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT));//DateUtil.toString(patient.getReferenceTime(), DateUtil.DEFAULT_YMDHMSDATE_FORMAT)
            return jsonObject;
        } catch (Exception e) {
            logger.error("", e);
        }
        return null;
    }
}//end DataCollectDispatcher
}//end DataCollectDispatcher

+ 1 - 0
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/DatacollectService.java

@ -118,6 +118,7 @@ public class DatacollectService {
                        logStr.append(message);
                        logStr.append(message);
                        success++;
                        success++;
                    } catch (Exception ex) {
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        logger.info("异常:" + ex.getMessage());
                        logger.info("异常:" + ex.getMessage());
                        logStr.append(ex.getMessage() + "\n");
                        logStr.append(ex.getMessage() + "\n");
                    }
                    }

+ 75 - 4
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/EsbHttp.java

@ -318,6 +318,81 @@ public class EsbHttp {
        }
        }
    }
    }
    /**
     *
     * 上传质控包
     */
    public static boolean uploadQC(Patient patient, File file, String encryptPwd, String type) {
        try {
            String uploadMethod = EHRHttpHelper.httpAdminUrl + "/admin/report/receiveReportFile";
            String fileMd5 = MD5.getMd5ByFile(file);
            Map<String, String> formParams = new HashMap<>();
            formParams.put("md5", fileMd5);
            formParams.put("package_crypto", encryptPwd);
            formParams.put("org_code", SysConfig.orgcode);
            formParams.put("type", type);// 文件包类型 1 质控包, 2 日报包
            Map<String, String> header = new HashMap<>();
            header.put("Authorization", "Basic " + EHRHttpHelper.clientKey);
            header.put("User-Agent", "client " + EHRHttpHelper.clientId);
            HTTPResponse response = EHRHttpHelper.postFile(uploadMethod, formParams, file.getAbsolutePath(), header);
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                logger.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() + ")";
                }
                logger.info(msg);
                return false;
            }
        } catch (Exception e) {
            logger.info("上传质控数据异常,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo());
            logger.error(e.getCause().toString());
            e.printStackTrace();
            return false;
        }
    }
    /**
     *
     * 上传日报包
     */
    public static boolean uploadQcDaily(Patient patient, File file, String encryptPwd, String type) {
        try {
            String uploadMethod = EHRHttpHelper.httpAdminUrl + "/admin/report/receiveReportFile";
            String fileMd5 = MD5.getMd5ByFile(file);
            Map<String, String> formParams = new HashMap<>();
            formParams.put("md5", fileMd5);
            formParams.put("package_crypto", encryptPwd);
            formParams.put("org_code", SysConfig.orgcode);
            formParams.put("type", type);// 文件包类型 1 质控包, 2 日报包
            Map<String, String> header = new HashMap<>();
            header.put("Authorization", "Basic " + EHRHttpHelper.clientKey);
            header.put("User-Agent", "client " + EHRHttpHelper.clientId);
            HTTPResponse response = EHRHttpHelper.postFile(uploadMethod, formParams, file.getAbsolutePath(), header);
            if (response != null && response.getStatusCode() == HttpStatus.SC_OK) {
                logger.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() + ")";
                }
                logger.info(msg);
                return false;
            }
        } catch (Exception e) {
            logger.info("上传质控数据异常,patient_id:" + patient.getPatientId() + ",event_no:" + patient.getEventNo());
            logger.error(e.getCause().toString());
            e.printStackTrace();
            return false;
        }
    }
    /**
    /**
     * 下载标准包
     * 下载标准包
@ -408,8 +483,4 @@ public class EsbHttp {
        }
        }
    }
    }
}
}

+ 5 - 1
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/PatientCDAUpload.java

@ -72,7 +72,11 @@ public class PatientCDAUpload {
            String pwd = uuidPwd.toString();
            String pwd = uuidPwd.toString();
            String publicKey = SysConfig.getInstance().getPublicKeyMap().get(patient.getOrgCode());
            String publicKey = SysConfig.getInstance().getPublicKeyMap().get(patient.getOrgCode());
            if(publicKey== null ||  publicKey.length() == 0) {
            if(publicKey== null ||  publicKey.length() == 0) {
                publicKey = EsbHttp.getPublicKey(patient.getOrgCode());
                publicKey = EsbHttp.getPublicKey(SysConfig.orgcode);
                if (publicKey==null){
                    logger.error("公钥获取失败,公钥为空.请检查机构代码和请求地址的正确性!");
                    return null;
                }
                SysConfig.getInstance().getPublicKeyMap().put(patient.getOrgCode(), publicKey);
                SysConfig.getInstance().getPublicKeyMap().put(patient.getOrgCode(), publicKey);
            }
            }

+ 486 - 0
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/QCCrawlerManager.java

@ -0,0 +1,486 @@
package com.yihu.hos.rest.services.crawler;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.hos.core.datatype.CollectionUtil;
import com.yihu.hos.core.datatype.DateUtil;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.rest.common.format.AdapterBase;
import com.yihu.hos.rest.common.format.StdBase;
import com.yihu.hos.rest.models.crawler.adapter.AdapterDataSet;
import com.yihu.hos.rest.models.crawler.adapter.StdDataSet;
import com.yihu.hos.rest.models.crawler.config.SysConfig;
import com.yihu.hos.rest.models.crawler.patient.Patient;
import com.yihu.hos.rest.models.crawler.qc.QcDaily;
import com.yihu.hos.rest.models.crawler.qc.QcPatientIndex;
import com.yihu.hos.rest.models.rs.RsJobConfig;
import com.yihu.hos.rest.models.standard.adapter.AdapterDatasetModel;
import com.yihu.hos.rest.models.standard.adapter.AdapterDictEntryModel;
import com.yihu.hos.rest.models.standard.adapter.AdapterSchemeModel;
import com.yihu.hos.rest.models.standard.adapter.AdapterSchemeVersionModel;
import com.yihu.hos.rest.models.standard.bo.AdapterVersion;
import com.yihu.hos.rest.models.standard.bo.StandardVersion;
import com.yihu.hos.rest.models.standard.standard.StdMetaDataModel;
import com.yihu.hos.rest.services.standard.adapter.*;
import com.yihu.hos.rest.services.standard.standard.StdMetadataService;
import com.yihu.hos.web.framework.model.DataGridResult;
import com.yihu.hos.web.framework.model.DictItem;
import com.yihu.hos.web.framework.model.Result;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
@Service("qCCrawlerManager")
public class QCCrawlerManager {
    public static final String BEAN_ID = "qCCrawlerManager";
    private static String unstructured = "unstructured";
    private static Logger logger = LoggerFactory.getLogger(QCCrawlerManager.class);
    @Resource
    private AdapterDatasetService adapterDatasetService;
    @Resource
    private AdapterMetadataService adapterMetadataService;
    @Resource
    private AdapterDictService adapterDictService;
    @Resource
    private AdapterSchemeVersionService adapterSchemeVersionService;
    @Resource
    private DatacollectManager datacollect;
    @Resource
    private StdMetadataService StdMetadataService;
    @Resource(name = AdapterSchemeService.BEAN_ID)
    private AdapterSchemeService adapterSchemeService;
    @Resource
    private ObjectMapper objectMapper;
    private static DataCollectDispatcher dispatch = DataCollectDispatcher.getInstance();
    private static SysConfig sysConfig = SysConfig.getInstance();
    private static Map<String, Map<String, AdapterDataSet>> adapterDataSetVersionMap = new HashMap<>();
    private static Map<String, Map<String, StdDataSet>> stdDataSetVersionMap = new HashMap<>();
    private static Map<Integer, List<StdMetaDataModel>> stdMetaDataMap = new HashMap<>();
    private Map<String, AdapterDataSet> adapterDataSetMap;
    private Map<String, StdDataSet> stdDataSetMap;
    private Boolean adapterFlg = false;
    private Boolean stdFlg = false;
    private String schemeVersion;
    private List<DictItem> datasetList;
    public void finalize() throws Throwable {
    }
    /**
     * 病人事件列表
     *
     * @param jobId
     * @return
     * @throws Exception
     */
    public List<Patient> PatientListByJobId(String jobId) throws Exception {
        RsJobConfig rsJobConfig = datacollect.getJobById(jobId);
        logger.info("质控服务-病人列表获取jobId:" + jobId);
        Date begin = rsJobConfig.getRepeatStartTime();
        Date end = rsJobConfig.getRepeatEndTime();
        if (end == null) {
            int totalOffset = rsJobConfig.getDelayTime();
            Calendar instance = Calendar.getInstance();
            instance.setTime(new Date(DateUtil.getSysDateTime().getTime()));
            instance.add(Calendar.SECOND, -totalOffset);    //调整截止时间,当前时间-偏移量
            end = instance.getTime();
        }
        if ((end.getTime() - begin.getTime()) <= 0) {
            System.out.println("质控服务-错误:采集结束时间小于开始时间!"); //结束时间小于开始时间时,不获取
            return null;
        }
        end = DateUtil.fromatDateToTimestamp(end);
        if (!rsJobConfig.getJobType().equals("0")) {
            //调整截止时间,当前时间-偏移量
            end = DateUtil.addDate(-rsJobConfig.getDelayTime(), DateUtil.getSysDateTime());
            if ((end.getTime() - begin.getTime()) <= 0) {
                System.out.println("质控服务-错误:采集结束时间小于开始时间!"); //结束时间小于开始时间时,不获取
                return null;
            }
        }
        if (DateUtil.getDifferenceOfDays(begin, end) > 1) {
            end = DateUtil.addDate(1, begin);
            end = DateUtil.fromatDateToTimestamp(end);
        }
        DataGridResult dataGridResult = datacollect.getJobDatasetByJobId(jobId);
        this.datasetList = dataGridResult.getDetailModelList();
        this.schemeVersion = rsJobConfig.getSchemeVersion();
        List<Patient> patientList = getPatientList(begin, end);
        return patientList;
    }
    public List<Patient> getPatientList(Date beginDate, Date endDate) {
        Map<String, Object> condition = new HashMap<>();
        condition.put("beginDate", beginDate);
        condition.put("endDate", endDate);
        Integer count = 0;
        Integer totalCount = 0;
        String message;
        /**
         * 适配基本数据准备
         */
        if (!getDataForPrepare()) {
            message = "适配数据尚未准备";
            logger.error(message);
            return null;
        }
        List<Patient> patientList = dispatch.getPatientList(condition, adapterDataSetMap);
            return patientList;
    }
    /**
     * 上传档案/质控上传
     * @param jobId
     * @param checkType
     * @return
     * @throws Exception
     */
    public Result dataCrawlerByJobId(String jobId,String checkType) throws Exception {
        RsJobConfig rsJobConfig = datacollect.getJobById(jobId);
        String random = UUID.randomUUID().toString();
        logger.info("质控数据采集上传开始,流水号:" + random + ",jobId:"+jobId);
        Date begin = rsJobConfig.getRepeatStartTime();
        Date end = rsJobConfig.getRepeatEndTime();
        if (end == null) {
            int totalOffset = rsJobConfig.getDelayTime();
            Calendar instance = Calendar.getInstance();
            instance.setTime(new Date(DateUtil.getSysDateTime().getTime()));
            instance.add(Calendar.SECOND, - totalOffset);    //调整截止时间,当前时间-偏移量
            end = instance.getTime();
        }
        if ((end.getTime() - begin.getTime()) <= 0) {
            return Result.error("错误:采集结束时间小于开始时间!"); //结束时间小于开始时间时,不获取
        }
        end = DateUtil.fromatDateToTimestamp(end);
        if (!rsJobConfig.getJobType().equals("0")) {
            //调整截止时间,当前时间-偏移量
            end = DateUtil.addDate(-rsJobConfig.getDelayTime(), DateUtil.getSysDateTime());
            if ((end.getTime() - begin.getTime()) <= 0) {
                return Result.success("错误:采集结束时间小于开始时间!"); //结束时间小于开始时间时,不获取
            }
        }
        if (DateUtil.getDifferenceOfDays(begin, end) > 1) {
            end = DateUtil.addDate(1, begin);
            end = DateUtil.fromatDateToTimestamp(end);
        }
        DataGridResult dataGridResult = datacollect.getJobDatasetByJobId(jobId);
        this.datasetList = dataGridResult.getDetailModelList();
        this.schemeVersion = rsJobConfig.getSchemeVersion();
        Result result = dataCrawler(begin, end,checkType);
        if (!rsJobConfig.getJobType().equals("0")) {
            rsJobConfig.setRepeatStartTime(end);
//            rsJobConfig.setRepeatEndTime(DateUtil.formatYMDToYMDHMS(DateUtil.getSysDateTime().toString()));
        }
        datacollect.updateJob(rsJobConfig);
        logger.info("质控采集上传结束,流水号:" + random + ",jobId:" + jobId + ",message:" + result.getMessage());
        return result;
    }
    public Result dataCrawler(Date beginDate, Date endDate,String checkType) {
        Map<String, Object> condition = new HashMap<>();
        condition.put("beginDate", beginDate);
        condition.put("endDate", endDate);
        Integer count = 0;
        Integer totalCount = 0;
        String message;
        /**
         * 适配基本数据准备
         */
        if (!getDataForPrepare()) {
            message = "适配数据尚未准备";
            logger.error(message);
            return Result.error(message);
        }
        List<Patient> patientList = dispatch.getPatientList(condition, adapterDataSetMap);
        if (!CollectionUtil.isEmpty(patientList)) {
            totalCount = patientList.size();
            QcDaily qcDaily = genQcDaily(patientList);
            QcPatientIndex qcPatientIndex =null;
            for (Patient patient : patientList) {
                Boolean result = collectProcess(patient,checkType);
                qcPatientIndex = new QcPatientIndex(patient.getPatientId(),patient.getEventNo(),patient.getReferenceTime());
                    qcDaily.addTotal(qcPatientIndex,patient.getDataSet());
                    if (result) {
                        count++;
                        qcDaily.addReal(qcPatientIndex,patient.getDataSet());
                    }
                }
            if (qcDaily!=null){
                qcDaily.setOrg_code(patientList.get(0).getOrgCode());
                qcDaily.setInner_version(this.schemeVersion);
                qcDaily.setCreate_date(DateUtil.getCurrentString(DateUtil.DATE_WORLD_FORMAT));
                qcDaily.setTotal_outpatient_num(qcDaily.getTotal_outpatient().size());
                qcDaily.setTotal_hospital_num(qcDaily.getTotal_hospital().size());
                qcDaily.setReal_outpatient_num(qcDaily.getReal_outpatient().size());
                qcDaily.setReal_hospital_num(qcDaily.getReal_hospital().size());
                boolean b = dispatch.uploadQcDaily(objectMapper.convertValue(qcDaily, JsonNode.class),patientList.get(0));
                if (!b){
                    logger.debug("质控服务-日报包上传失败!!!");
                }
            }
        }
        message = "本次采集病人共" + totalCount + "条,成功采集信息"+ count + "条";
        return Result.success(message);
    }
    //单个病人质控数据采集上传
    public Boolean collectProcess(Patient patient, String collectType) {
        if (!getDataForPrepare()) {
            logger.error("适配数据尚未准备");
            return false;
        }
        patient.setReUploadFlg(StringUtil.toString(false));
        logger.trace("采集->质控分析->打包上传,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
        try {
            if (StringUtil.isEmpty(sysConfig.getVersionMap().get(patient.getOrgCode()))) {
                Map.Entry<String, AdapterDataSet> next = adapterDataSetMap.entrySet().iterator().next();
                Integer schemeId = next.getValue().getAdapterDataSetT().getSchemeId();
                AdapterSchemeModel schemeModel = adapterSchemeService.getEntity(AdapterSchemeModel.class, schemeId);
                if (schemeModel.getStdVersion() != null) {
                    SysConfig.getInstance().getVersionMap().put(patient.getOrgCode(), schemeModel.getStdVersion());
                } else {
                    logger.error("版本获取失败");
                    return false;
                }
            }
            Map<String, AdapterDataSet> dataSetMap = new HashMap<>();
            Map<String, JsonNode> dataMap = new HashMap<>();
            int realCount = 0;
            List<String> realList = new ArrayList<>();
            ObjectNode qcDataSet = dispatch.genQcDataSet(patient);//获取质控数据结构
            qcDataSet.put("total_num",adapterDataSetMap.size());
            for (String key : adapterDataSetMap.keySet()) {
                /**
                 * 获取数据
                 */
                AdapterDataSet adapterDataSet = adapterDataSetMap.get(key);
                JsonNode jsonObject = dispatch.fecthData(patient, adapterDataSet);
                if (StringUtil.isEmpty(jsonObject)) {
                    continue;
                }
                dataSetMap.put(adapterDataSet.getAdapterDataSetT().getStdDatasetCode(), adapterDataSet);
                dataMap.put(key, jsonObject);
                realCount++;
                realList.add(key);
                /**
                 * 注册病人
                 */
//                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()))) {
//                            logger.info("注册病人");
//                            dispatch.register(patient, jsonObject.toString());
//                        }
//                    }
//                }
            }
            ObjectMapper objectMapper = new ObjectMapper();
            qcDataSet.put("real_num",realCount);
            qcDataSet.set("total", objectMapper.convertValue(adapterDataSetMap.keySet().toArray(), JsonNode.class));
            qcDataSet.set("real", objectMapper.convertValue(realList, JsonNode.class));
            boolean b = dispatch.toQcDataSetFile(qcDataSet, patient);//生成数据集质控文件
            logger.info("采集病人数据成功,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
            //上传档案
            logger.info("上传病人档案及质控数据");
            try {
                if (!CollectionUtil.isEmpty(dataMap.keySet())) {
                    if (StringUtil.isEmpty(collectType)) {
                        //采集档案
                        if (!dispatch.upload(dataMap, patient, dataSetMap, stdDataSetMap)) {
                            logger.error("上传档案失败");
                            return false;
                        }
                    } else {
                        //TODO 规则检验
                        if (!dispatch.uploadQcData(dataMap, patient, dataSetMap, stdDataSetMap,collectType)) {
                            logger.error("上传质控包失败");
                            return false;
                        }
                        if (!dispatch.upload(dataMap, patient, dataSetMap, stdDataSetMap)) {
                            logger.error("上传档案失败");
                            return false;
                        }
                    }
                }
            } catch (Exception e) {
                logger.error("质控数据上传失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo());
                return false;
            }
        } catch (Exception e) {
            logger.error("采集质控数据失败,patient_id:" + patient.getPatientId() + ", event_no:" + patient.getEventNo(), e);
            return false;
        }
        return true;
    }
    public Boolean getDataForPrepare() {
        if (adapterFlg && stdFlg) {
            return true;
        }
        AdapterBase.setAdapterMetadataService(adapterMetadataService);
        AdapterBase.setAdapterDictService(adapterDictService);
        AdapterBase.setAdapterSchemeVersionService(adapterSchemeVersionService);
        StdBase.setStdMetadataService(StdMetadataService);
        logger.info("适配基本相关数据准备");
        try {
            adapterDataSetMap = new HashMap<>();
            stdDataSetMap = new HashMap<>();
            AdapterVersion adapterVersion;
            StandardVersion standardVersion = null;
            List<AdapterDatasetModel> adapterDataSetModelList;
            if (!CollectionUtil.isEmpty(datasetList)) {
                /**
                 * 拉模式接口调用,由任务配置决定适配版本
                 */
                adapterVersion = new AdapterVersion(schemeVersion);
                List<Integer> datasetIdList = new ArrayList<>();
                for (DictItem dictItem : datasetList) {
                    Integer dataSetId = Integer.parseInt(dictItem.getCode());
                    datasetIdList.add(dataSetId);
                }
                adapterDataSetModelList = adapterDatasetService.getAdapterDatasetByAdapterIdList(adapterVersion, datasetIdList);
                if (adapterDataSetModelList != null && !adapterDataSetModelList.isEmpty()) {
                    AdapterSchemeModel adapterScheme = adapterSchemeService.getEntity(AdapterSchemeModel.class, adapterDataSetModelList.get(0).getSchemeId());
                    standardVersion = new StandardVersion(adapterScheme.getStdVersion());
                    for (DictItem dictItem : datasetList) {
                        Integer dataSetId = Integer.parseInt(dictItem.getCode());
                        if (!stdMetaDataMap.containsKey(dataSetId)) {
                            stdMetaDataMap.put(dataSetId, new StdDataSet(dataSetId, standardVersion).getStdMetaDataModelList());
                        }
                    }
                }
            } else {
                /**
                 * 推模式接口调用,默认只使用最新版本的适配
                 */
                AdapterSchemeVersionModel adapterSchemeVersionModel = adapterSchemeVersionService.getEhrAdapterVersionLasted();
                if (adapterSchemeVersionModel == null) {
                    logger.error("获取最新ehr适配版本错误");
                    return false;
                } else {
                    this.schemeVersion = adapterSchemeVersionModel.getVersion();
                    adapterVersion = new AdapterVersion(schemeVersion);
                }
                if (adapterDataSetVersionMap.get(schemeVersion) != null) {
                    adapterDataSetMap = adapterDataSetVersionMap.get(schemeVersion);
                    adapterFlg = true;
                }
                if (stdDataSetVersionMap.get(schemeVersion) != null) {
                    stdDataSetMap = stdDataSetVersionMap.get(schemeVersion);
                    stdFlg = true;
                }
                if (adapterFlg && stdFlg) {
                    return true;
                }
                Map<String, String> condition = new HashMap<>();
                condition.put("column", "adapter_dataset_code");
                ObjectMapper mapper = new ObjectMapper();
                String conditionStr = mapper.writeValueAsString(condition);
                adapterDataSetModelList = adapterDatasetService.getAdapterDatasetNotNullList(adapterVersion, conditionStr);
            }
            /**
             * 字典项初始化
             */
            List<AdapterDictEntryModel> adapterDictEntryModelList = adapterDatasetService.getList(AdapterDictEntryModel.class, adapterVersion.getDictEntryTableName(), null, null, null, null);
            Map<Integer, List<AdapterDictEntryModel>> adapterDictEntryModelMap = new HashMap<>();
            for (AdapterDictEntryModel adapterDictEntryModel : adapterDictEntryModelList) {
                List<AdapterDictEntryModel> entryModelList = adapterDictEntryModelMap.get(adapterDictEntryModel.getStdDictId());
                if (CollectionUtil.isEmpty(entryModelList)) {
                    entryModelList = new ArrayList<>();
                }
                entryModelList.add(adapterDictEntryModel);
                adapterDictEntryModelMap.put(adapterDictEntryModel.getStdDictId(), entryModelList);
            }
            /**
             * 数据集初始化
             */
            for (AdapterDatasetModel adapterDatasetModel : adapterDataSetModelList) {
                adapterDataSetMap.put(adapterDatasetModel.getStdDatasetCode(), new AdapterDataSet(adapterDatasetModel, adapterVersion, adapterDictEntryModelMap));
                stdDataSetMap.put(adapterDatasetModel.getStdDatasetCode(), new StdDataSet(adapterDatasetModel.getStdDatasetId(), standardVersion));
            }
            adapterDataSetVersionMap.put(schemeVersion, adapterDataSetMap);
            stdDataSetVersionMap.put(schemeVersion, stdDataSetMap);
            adapterFlg = true;
            stdFlg = true;
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * 解析病人索引信息
     *
     * @param patientInfo 病人索引信息
     * @return
     */
    public Patient parsePatient(String patientInfo) {
        try {
            ObjectMapper mapper = new ObjectMapper();
            Patient patient = mapper.readValue(patientInfo, Patient.class);
            return patient;
        } catch (Exception e) {
            logger.error("patient参数错误:" + patientInfo, e);
            return null;
        }
    }
    public void setSchemeVersion(String schemeVersion) {
        this.schemeVersion = schemeVersion;
    }
    public void setDatasetList(List<DictItem> datasetList) {
        this.datasetList = datasetList;
    }
    public QcDaily genQcDaily(List<Patient> patients){
        QcDaily qcDaily = new QcDaily();
        if (patients!=null && patients.isEmpty()){
            qcDaily.setOrg_code(patients.get(0).getOrgCode());
            qcDaily.setInner_version(SysConfig.getInstance().getVersionMap().get(patients.get(0).getOrgCode()));
            qcDaily.setCreate_date(DateUtil.getUtcDate(new Date()));
        }
        return qcDaily;
    }
}

+ 138 - 0
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/QCDataIndex.java

@ -0,0 +1,138 @@
package com.yihu.hos.rest.services.crawler;
import com.yihu.hos.rest.models.crawler.config.SysConfig;
import com.yihu.hos.rest.models.crawler.patient.Patient;
import java.util.UUID;
/**
 * 自控文件索引类,用于生成文件路径,不确保文件路径存在
 *
 * @author Air
 * @version 1.0
 * @created 2015.07.01 18:06
 */
public class QCDataIndex {
    private Patient patient;
    private String createDate;
    public QCDataIndex(Patient patient,String createDate) {
        this.patient = patient;
        this.createDate = createDate;
    }
    public String getDirectory() {
        String dir = SysConfig.getInstance().getTempFile();
        return dir + "/qc_data/" + 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 fileType) {
        String index = "qc_datasets";
        String dir = getDirectory() + "/" + IndexType.DATA;
        return dir + "/" + index + fileType;
    }
    /**
     * 生成最终档案包目录
     * qc_data/empty
     * qc_data/error
     * qc_data/other
     *
     * @param indexType
     * @param fileType
     * @return
     */
    public String createDataIndex(String indexType, String fileType) {
        return createIndex(IndexType.DATA + "/" + indexType, fileType);
    }
    /**
     * 质控-数据集实收应收情况
     *
     * @param fileType
     * @return
     */
    public String createQcDataSetIndex(String fileType) {
        return createDataSetIndex(fileType);
    }
    /* ************************* 日报包路径 *************************** */
    //基础目录
    public String getDailyDir() {
        String dir = SysConfig.getInstance().getTempFile();
        return dir + "/qc_daliy/" + createDate ;
    }
    public String getDataDailyDir() {
        return getDailyDir() + "/" + IndexType.DATA;
    }
    /**
     *  data 文件目录
     * @param fileType
     * @return
     */
    public String createQcDaliyIndex(String fileType) {
        String index = "qc_events";
        String dir = getDailyDir()+ "/" + IndexType.DATA;
        return dir + "/" + index + fileType;
    }
    /**
     * 生成日报质控包目录
     *
     * @param indexType
     * @param fileType
     * @return
     */
    public String createQcDailyIndex(String indexType, String fileType) {
        return createDailyIndex( indexType, fileType);
    }
    public String createDailyIndex(String indexType, String fileType) {
        UUID uuid = UUID.randomUUID();
        String index = uuid.toString();
        String dir = getDailyDir() + "/" + indexType;
        return dir + "/" + index + 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 QC_TYPE_DATASET = "1";//质控包类型-数据集
        public final static String QC_TYPE_DAILY = "2";//质控包类型-日报
        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";
    }
}

+ 36 - 0
hos-rest/src/main/java/com/yihu/hos/rest/services/crawler/QcRuleService.java

@ -0,0 +1,36 @@
package com.yihu.hos.rest.services.crawler;
import com.yihu.hos.rest.models.crawler.qc.QcRuleModel;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("QcRuleService")
public class QcRuleService extends SQLGeneralDAO {
    public static final String BEAN_ID = "QcRuleService";
    public QcRuleService() {
    }
    public void finalize() throws Throwable {
        super.finalize();
    }
    public String getRuleNames() throws Exception {
        StringBuilder stringBuilder =new StringBuilder();
        String hql = "from QcRuleModel";
        List<QcRuleModel> rules = super.getEntityList(QcRuleModel.class,hql);
        if (rules!=null && rules.size()>0){
            for (QcRuleModel rule:rules){
                stringBuilder.append(rule.getRule()).append(",");
            }
        }
        String names= stringBuilder.toString();
        return names.substring(0,names.lastIndexOf(",") );
    }
}

+ 10 - 1
hos-rest/src/main/resources/application.yml

@ -40,6 +40,14 @@ service-gateway:
---
---
spring:
spring:
  profiles: test
  profiles: test
  data:
    mongodb:
      host: 172.19.103.42
      port: 27017
      username: esb
      password: esb
      authenticationDatabase: admin
      database: runtime
qlc:
qlc:
  rpc:
  rpc:
    ip: 172.18.20.21
    ip: 172.18.20.21
@ -55,7 +63,8 @@ crawler:
    ip: localhost
    ip: localhost
    port: 8088
    port: 8088
    api: crawler/datapush
    api: crawler/datapush
service-gateway:
  url:
---
---
spring:
spring:
  profiles: lfq
  profiles: lfq

+ 2 - 2
hos-rest/src/main/resources/config/dbhelper.properties

@ -1,7 +1,7 @@
defaultName = hos-mysql
defaultName = hos-mysql
defaultUri = jdbc:mysql://172.19.103.57:3306/esb?useUnicode=true&characterEncoding=UTF-8
defaultUri = jdbc:mysql://172.19.103.57:3306/esb?useUnicode=true&characterEncoding=UTF-8
defaultUser = hos
defaultPassword = hos
defaultUser = esb
defaultPassword = esb
mongodbUri=mongodb://esb:esb@172.19.103.57:27017/?authSource=admin
mongodbUri=mongodb://esb:esb@172.19.103.57:27017/?authSource=admin
mongodbName=hos
mongodbName=hos

+ 2 - 0
hos-rest/src/main/resources/config/http.properties

@ -1,6 +1,8 @@
httpUrl = http://192.168.1.221:10140/api/v1.0
httpUrl = http://192.168.1.221:10140/api/v1.0
httpCouldUrl = http://192.168.1.221:10400/api/v1.0
httpCouldUrl = http://192.168.1.221:10400/api/v1.0
httpAdminUrl = http://192.168.131.134:10000/api/v1.0
#  http://172.19.103.73:1443/api/v1.0
#  http://172.19.103.73:1443/api/v1.0
#\uFFFD\uFFFDhttps://192.168.131.15:4432/api/v1.0
#\uFFFD\uFFFDhttps://192.168.131.15:4432/api/v1.0
  #https://172.19.103.73:443/api/v1.0
  #https://172.19.103.73:443/api/v1.0

+ 37 - 0
hos-rest/src/main/resources/hibernate/QcRule.hbm.xml

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.yihu.hos.rest.models.crawler.qc.QcRuleModel" table="qc_rule">
        <id name="id" type="java.lang.String">
            <column name="id" length="50" />
            <generator class="uuid" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="name" length="255" not-null="true">
                <comment>名称</comment>
            </column>
        </property>
        <property name="type" type="java.lang.String">
            <column name="type" length="20" not-null="true">
                <comment>类型:完整性-1,及时性-2,准确性-3</comment>
            </column>
        </property>
        <property name="description" type="java.lang.String">
            <column name="description" length="1000" not-null="false">
                <comment>描述</comment>
            </column>
        </property>
        <property name="rule" type="java.lang.String">
            <column name="rule" length="255" not-null="true">
                <comment>规则:脚本/接口</comment>
            </column>
        </property>
        <property name="errorCode" type="java.lang.String">
            <column name="error_code" length="50" not-null="false">
                <comment>统一错误代码</comment>
            </column>
        </property>
    </class>
</hibernate-mapping>

+ 14 - 0
hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/QcResultConstant.java

@ -0,0 +1,14 @@
package com.yihu.hos.web.framework.constant;
/**
 *  质控-规则检验-常量类
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/5/16.
 */
public interface QcResultConstant {
    String VALUE_EMPTY = "empty";//空
    String VALUE_ILLEGAL = "illegal";//非法
    String VALUE_ERROR = "error";//错误
}

+ 1 - 0
src/main/java/com/yihu/hos/datacollect/service/DatacollectManager.java

@ -249,6 +249,7 @@ public class DatacollectManager{
    public ActionResult updateJob(RsJobConfig obj, String cron, String jobDataset) throws Exception {
    public ActionResult updateJob(RsJobConfig obj, String cron, String jobDataset) throws Exception {
        Integer flowId = flowManage.updateCamelFile(obj.getId(),obj.getFlowTempId(), obj.getFlowId(), cron);
        Integer flowId = flowManage.updateCamelFile(obj.getId(),obj.getFlowTempId(), obj.getFlowId(), cron);
        if (flowId!=null){
        if (flowId!=null){
            obj.setFlowId(flowId);
            datacollectDao.updateEntity(obj);
            datacollectDao.updateEntity(obj);
            saveJobDataset(obj.getId(), jobDataset);
            saveJobDataset(obj.getId(), jobDataset);

+ 3 - 1
src/main/java/com/yihu/hos/standard/model/adapter/AdapterSchemeModel.java

@ -1,6 +1,7 @@
package com.yihu.hos.standard.model.adapter;
package com.yihu.hos.standard.model.adapter;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.model.Result;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
import javax.persistence.*;
import java.io.Serializable;
import java.io.Serializable;
@ -15,7 +16,8 @@ import java.io.Serializable;
public class AdapterSchemeModel extends Result implements Serializable {
public class AdapterSchemeModel extends Result implements Serializable {
    @Id
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @GeneratedValue(generator = "generator")
    @GenericGenerator(name = "generator", strategy = "increment")
    private Integer id;
    private Integer id;
    @Column(name="parent_id")
    @Column(name="parent_id")

+ 27 - 10
src/main/java/com/yihu/hos/standard/service/adapter/AdapterSchemeService.java

@ -1,10 +1,6 @@
package com.yihu.hos.standard.service.adapter;
package com.yihu.hos.standard.service.adapter;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.JsonNode;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import com.yihu.hos.web.framework.constant.SqlConstants;
import com.yihu.hos.web.framework.model.DetailModelResult;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.core.datatype.CollectionUtil;
import com.yihu.hos.core.datatype.CollectionUtil;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.standard.model.adapter.AdapterSchemeModel;
import com.yihu.hos.standard.model.adapter.AdapterSchemeModel;
@ -13,15 +9,17 @@ import com.yihu.hos.standard.model.adapter.resultModel.AdapterSchemeResultDetail
import com.yihu.hos.standard.model.adapter.resultModel.AdapterSchemeResultModel;
import com.yihu.hos.standard.model.adapter.resultModel.AdapterSchemeResultModel;
import com.yihu.hos.standard.model.standard.StandardModel;
import com.yihu.hos.standard.model.standard.StandardModel;
import com.yihu.hos.standard.model.standard.StandardVersionModel;
import com.yihu.hos.standard.model.standard.StandardVersionModel;
import com.yihu.hos.web.framework.constant.SqlConstants;
import com.yihu.hos.web.framework.dao.SQLGeneralDAO;
import com.yihu.hos.web.framework.model.DetailModelResult;
import com.yihu.hos.web.framework.model.Result;
import org.apache.poi.ss.formula.functions.T;
import org.hibernate.Query;
import org.hibernate.Query;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
/**
 * @created lingfeng 2015/12/25.
 * @created lingfeng 2015/12/25.
@ -167,10 +165,11 @@ public class AdapterSchemeService extends SQLGeneralDAO {
            for (AdapterSchemeModel adapterSchemeModel : adapterSchemeModelList) {
            for (AdapterSchemeModel adapterSchemeModel : adapterSchemeModelList) {
                schemeIdList.add(adapterSchemeModel.getId());
                schemeIdList.add(adapterSchemeModel.getId());
                stdIdList.add(adapterSchemeModel.getStdId());
                stdIdList.add(adapterSchemeModel.getStdId());
                stdIdList.add(adapterSchemeModel.getAdapterStdId());
//                stdIdList.add(adapterSchemeModel.getAdapterStdId());
                versionList.add(adapterSchemeModel.getStdVersion());
                versionList.add(adapterSchemeModel.getStdVersion());
                versionList.add(adapterSchemeModel.getAdapterStdVersion());
//                versionList.add(adapterSchemeModel.getAdapterStdVersion());
            }
            }
            versionList = delDuplicateArr(versionList);
            if (CollectionUtil.isEmpty(schemeIdList)) {
            if (CollectionUtil.isEmpty(schemeIdList)) {
                schemeIdList.add(null);
                schemeIdList.add(null);
            }
            }
@ -259,6 +258,7 @@ public class AdapterSchemeService extends SQLGeneralDAO {
            detailModelResult.setDetailModelList(resultDetailModelList);
            detailModelResult.setDetailModelList(resultDetailModelList);
            return detailModelResult;
            return detailModelResult;
        } catch (Exception e) {
        } catch (Exception e) {
            e.printStackTrace();
            return DetailModelResult.error("获取适配方案失败");
            return DetailModelResult.error("获取适配方案失败");
        }
        }
@ -297,4 +297,21 @@ public class AdapterSchemeService extends SQLGeneralDAO {
        result.setDetailModelList(schemeList);
        result.setDetailModelList(schemeList);
        return result;
        return result;
    }
    }
    public List delDuplicateArr(List<?> list){
        // 利用 Set 的特性,将所有项目放入 Set
        //中即可移除重复的项目
        Set<Object> set = new HashSet<>();
        for (Object element : list) {
            set.add(element);
        }
        // Set.size() 为不重复项目的个数
        List nonDuplicateArra = new ArrayList();
        // 将 Set 中的项目取出放到 nonDuplicateArray 中
        Object[] tempArray = set.toArray();
        for (int i = 0; i < tempArray.length; i++) {
           nonDuplicateArra.add ( tempArray[i]);
        }
        return nonDuplicateArra;
    }
}
}

+ 1 - 1
src/main/java/com/yihu/hos/system/dao/BaseDictDao.java

@ -95,7 +95,7 @@ public class BaseDictDao extends SQLGeneralDAO {
        else{
        else{
            sql+=",'' as extend";
            sql+=",'' as extend";
        }
        }
        sql += " from "+tableName;
        sql += " from "+tableName.toLowerCase();
        if(!StringUtil.isEmpty(Where))
        if(!StringUtil.isEmpty(Where))
        {
        {
            sql +=" where " + Where;
            sql +=" where " + Where;

+ 3 - 3
src/main/java/com/yihu/hos/system/dao/DatasourceDao.java

@ -83,7 +83,7 @@ public class DatasourceDao extends SQLGeneralDAO {
    public DataGridResult getDatasourceByOrg(String orgId) throws Exception
    public DataGridResult getDatasourceByOrg(String orgId) throws Exception
    {
    {
        DataGridResult re = new DataGridResult();
        DataGridResult re = new DataGridResult();
        String sql = "select * from System_Datasource";
        String sql = "select * from system_datasource";
        if(orgId!=null&&orgId.length()>0){
        if(orgId!=null&&orgId.length()>0){
            sql += " where org_id ='"+orgId+"'";
            sql += " where org_id ='"+orgId+"'";
        }
        }
@ -100,13 +100,13 @@ public class DatasourceDao extends SQLGeneralDAO {
   
   
    public void validDatasource(String id,String valid)  throws Exception
    public void validDatasource(String id,String valid)  throws Exception
    {
    {
        String sql = "update System_Datasource set activity_Flag='"+valid+"' where Id='"+id+"'";
        String sql = "update system_datasource set activity_Flag='"+valid+"' where Id='"+id+"'";
        super.execute(sql);
        super.execute(sql);
    }
    }
   
   
    public List<SystemDatasource> getDatasources(String orgId) throws Exception {
    public List<SystemDatasource> getDatasources(String orgId) throws Exception {
        String sql = "select * from System_Datasource";
        String sql = "select * from system_datasource";
        if(orgId!=null&&orgId.length()>0){
        if(orgId!=null&&orgId.length()>0){
            sql += " where org_id ='"+orgId+"'";
            sql += " where org_id ='"+orgId+"'";
        }
        }

+ 4 - 0
src/main/java/com/yihu/hos/system/service/FlowManager.java

@ -475,6 +475,10 @@ public class FlowManager {
        List<SystemServiceFlowTemp> flowTempProces = flowTempDao.getFlowTemps(flowTempId, ServiceFlowConstant.FLOW_TYPE_PROCESSOR);
        List<SystemServiceFlowTemp> flowTempProces = flowTempDao.getFlowTemps(flowTempId, ServiceFlowConstant.FLOW_TYPE_PROCESSOR);
        SystemServiceFlow flow = flowDao.getEntity(SystemServiceFlow.class, flowId);
        SystemServiceFlow flow = flowDao.getEntity(SystemServiceFlow.class, flowId);
        if (flow==null){
            //流程已经被删除,重新生成流程
            return genCamelFile(jobId,flowTempId,newCron);
        }
        //route模板文件记录是否存在。不存在就返回。
        //route模板文件记录是否存在。不存在就返回。
        if (!flowTempRouters.isEmpty()) {
        if (!flowTempRouters.isEmpty()) {
            SystemServiceFlowTemp flowTemp = flowTempRouters.get(0);
            SystemServiceFlowTemp flowTemp = flowTempRouters.get(0);

+ 5 - 5
src/main/resources/application.yml

@ -72,7 +72,7 @@ spring:
  #SAAS管理员账号,暂时配置在此处
  #SAAS管理员账号,暂时配置在此处
  datasource:
  datasource:
      driverClassName: com.mysql.jdbc.Driver
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://172.17.110.202:8066/global_db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
      url: jdbc:mysql://172.19.103.42:8066/global_db?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
      username: hos
      username: hos
      password: 123456
      password: 123456
      test-on-borrow: true
      test-on-borrow: true
@ -91,7 +91,7 @@ spring:
    show-sql: false
    show-sql: false
  data:
  data:
    mongodb:
    mongodb:
      host: 172.17.110.202
      host: 172.19.103.42
      port: 27017
      port: 27017
      username: esb
      username: esb
      password: esb
      password: esb
@ -99,7 +99,7 @@ spring:
      gridFsDatabase: dfs
      gridFsDatabase: dfs
      database: runtime
      database: runtime
  activemq:
  activemq:
    broker-url: tcp://172.17.110.202:61616?wireFormat.maxInactivityDuration=0
    broker-url: tcp://172.19.103.42:61616?wireFormat.maxInactivityDuration=0
    user: admin
    user: admin
    password: admin
    password: admin
    pooled: false
    pooled: false
@ -109,10 +109,10 @@ hos:
  zbus:
  zbus:
    url: 172.19.103.57:9020
    url: 172.19.103.57:9020
  filesystem:
  filesystem:
    url: http://172.19.103.57:9010/dfs/file
    url: http://172.19.103.37:9010/dfs/file
  mysql:
  mysql:
    filePath: /usr/local/esb/esb.sql   #租户基础表 sql文件位置
    filePath: /usr/local/esb/esb.sql   #租户基础表 sql文件位置
service-gateway:
service-gateway:
  portalUrl: http://192.168.1.221:10280/api/v1.0/portal
  portalUrl: http://192.168.1.221:10280/api/v1.0/portal
  adminUrl: http://192.168.1.221:10000/api/v1.0/admin
  adminUrl: http://192.168.1.221:10000/api/v1.0/admin
  url: http://172.19.103.70:9999/api
  url: http://172.19.103.37:9999/api

+ 14 - 0
src/main/resources/text/message_en_US.properties

@ -53,6 +53,20 @@ title.app.update                    = 修改应用信息
title.app.detail                    = 应用基本信息
title.app.detail                    = 应用基本信息
title.app.qualification             = 资质
title.app.qualification             = 资质
title.dict.detail                   = 标准字典
title.add.dataSet                   = 新增数据集
title.add.metaData                  = 新增数据元
title.updata.data                   = 修改数据集
title.updata.metaData               = 修改数据元
title.metaData                      = 数据元
title.basic.attribute               = 基本属性
title.database.attribute            = 数据库属性
title.dict.create                   = 新增字典
title.dict.update                   = 修改字典
title.dictItem.create               = 新增字典项
title.dictItem.update               = 修改字典项
title.rscategory.manage             = 资源分类管理
# Button 页面按钮 ------------------------------------------------------
# Button 页面按钮 ------------------------------------------------------
btn.login                           = 登录
btn.login                           = 登录