浏览代码

Merge branch 'master' of http://192.168.1.220:10080/CoSharp/eip

zhangjinjun 8 年之前
父节点
当前提交
02c94daaa6
共有 92 个文件被更改,包括 3756 次插入3182 次删除
  1. 41 2
      README.md
  2. 1 0
      hos-arbiter/pom.xml
  3. 2 1
      hos-arbiter/src/main/resources/logback.xml
  4. 17 21
      hos-broker/pom.xml
  5. 3 4
      hos-broker/src/main/java/com/yihu/hos/broker/HosBrokerApplication.java
  6. 0 40
      hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/CrawlerMongoRouter.java
  7. 16 0
      hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/MonitorRouterBulider.java
  8. 8 12
      hos-broker/src/main/java/com/yihu/hos/broker/common/constants/MonitorConstant.java
  9. 0 41
      hos-broker/src/main/java/com/yihu/hos/broker/common/processor/AddMongoProcessor.java
  10. 0 59
      hos-broker/src/main/java/com/yihu/hos/broker/common/scheduler/MonitorScheduler.java
  11. 0 31
      hos-broker/src/main/java/com/yihu/hos/broker/configurations/GatewayConfiguration.java
  12. 1 0
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBCamelController.java
  13. 2 2
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBMycatlController.java
  14. 1 0
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBShellController.java
  15. 0 66
      hos-broker/src/main/java/com/yihu/hos/broker/controllers/GatewayController.java
  16. 0 37
      hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayRequestResult.java
  17. 0 86
      hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayResponseResult.java
  18. 0 25
      hos-broker/src/main/java/com/yihu/hos/broker/services/CenterMongoService.java
  19. 0 96
      hos-broker/src/main/java/com/yihu/hos/broker/services/GatewayService.java
  20. 3 6
      hos-broker/src/main/java/com/yihu/hos/broker/services/ServerMonitorService.java
  21. 0 397
      hos-broker/src/main/java/com/yihu/hos/broker/services/ServiceMonitorService.java
  22. 4 9
      hos-broker/src/main/resources/application.yml
  23. 4 4
      hos-broker/src/main/resources/logback-spring.xml
  24. 20 0
      hos-camel2/pom.xml
  25. 5 2
      hos-camel2/src/main/java/camel/HosCamelApplication.java
  26. 56 0
      hos-camel2/src/main/java/camel/central/archives/processor/ArchivesService.java
  27. 60 0
      hos-camel2/src/main/java/camel/central/archives/route/ArchivesRouterBuilder.java
  28. 39 0
      hos-camel2/src/main/java/camel/central/gateway/processor/ErrorHandle.java
  29. 46 23
      hos-camel2/src/main/java/camel/central/gateway/processor/GatewayProcessor.java
  30. 53 4
      hos-camel2/src/main/java/camel/central/gateway/route/GatewayRouterBuilder.java
  31. 52 0
      hos-camel2/src/main/java/camel/monitor/processor/LogOffset.java
  32. 140 0
      hos-camel2/src/main/java/camel/monitor/processor/ServiceMonitorService.java
  33. 16 0
      hos-camel2/src/main/java/camel/monitor/route/MonitorRouterBulider.java
  34. 32 0
      hos-camel2/src/main/java/camel/terminal/tenant/processor/AddMongoProcessor.java
  35. 1 1
      hos-broker/src/main/java/com/yihu/hos/broker/common/processor/CrawlerMongoProcessor.java
  36. 39 0
      hos-camel2/src/main/java/camel/terminal/tenant/route/CrawlerMongoRouter.java
  37. 13 5
      hos-camel2/src/main/resources/application.yml
  38. 1 1
      hos-camel2/src/main/resources/logback-spring.xml
  39. 二进制
      hos-camel2/src/main/resources/tomcat.keystore
  40. 24 0
      hos-configuration/.gitignore
  41. 二进制
      hos-configuration/.mvn/wrapper/maven-wrapper.jar
  42. 1 0
      hos-configuration/.mvn/wrapper/maven-wrapper.properties
  43. 6 0
      hos-configuration/README.md
  44. 225 0
      hos-configuration/mvnw
  45. 143 0
      hos-configuration/mvnw.cmd
  46. 63 0
      hos-configuration/pom.xml
  47. 14 0
      hos-configuration/src/main/java/com/yihu/hos/configuration/HosConfigurationApplication.java
  48. 32 0
      hos-configuration/src/main/resources/application.yml
  49. 16 0
      hos-configuration/src/test/java/com/yihu/hos/configuration/HosConfigurationApplicationTests.java
  50. 1 0
      hos-dfs/pom.xml
  51. 0 1
      hos-logger/src/main/java/com/yihu/hos/logger/camel/processor/EHRLogProcesser.java
  52. 7 0
      hos-logger/src/main/java/com/yihu/hos/logger/configuration/LoggerConfiguration.java
  53. 13 0
      hos-logger/src/main/java/com/yihu/hos/logger/model/HosLog.java
  54. 5 3
      hos-logger/src/main/java/com/yihu/hos/logger/service/HosLogService.java
  55. 2 1
      hos-logger/src/main/resources/application.yml
  56. 6 9
      hos-parent/pom.xml
  57. 1 0
      hos-rest/pom.xml
  58. 13 0
      hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/ArchivesConstant.java
  59. 33 0
      hos-web-framework/src/main/java/com/yihu/hos/web/framework/util/controller/BaseController.java
  60. 6 0
      pom.xml
  61. 12 3
      src/main/java/com/yihu/hos/common/CommonPageController.java
  62. 4 0
      src/main/java/com/yihu/hos/common/constants/ContextAttributes.java
  63. 0 3
      src/main/java/com/yihu/hos/filter/SessionOutTimeFilter.java
  64. 23 14
      src/main/java/com/yihu/hos/monitor/controller/ServiceMonitorController.java
  65. 1 1
      src/main/java/com/yihu/hos/monitor/dao/ServiceMonitorDao.java
  66. 30 27
      src/main/java/com/yihu/hos/monitor/service/ServerMonitorService.java
  67. 27 106
      src/main/java/com/yihu/hos/monitor/service/ServiceMonitorService.java
  68. 58 0
      src/main/java/com/yihu/hos/qc/controller/ReportController.java
  69. 22 4
      src/main/java/com/yihu/hos/tenant/controller/TenantController.java
  70. 1 1
      src/main/java/com/yihu/hos/tenant/dao/TenantDao.java
  71. 48 3
      src/main/java/com/yihu/hos/tenant/service/TenantService.java
  72. 7 1
      src/main/resources/application.yml
  73. 3 2
      src/main/webapp/WEB-INF/ehr/commons/jsp/commonFoot.jsp
  74. 1 1
      src/main/webapp/WEB-INF/ehr/jsp/common/index.jsp
  75. 13 5
      src/main/webapp/WEB-INF/ehr/jsp/common/indexJs.jsp
  76. 3 0
      src/main/webapp/WEB-INF/ehr/jsp/common/signinJs.jsp
  77. 20 0
      src/main/webapp/WEB-INF/ehr/jsp/common/test.jsp
  78. 38 0
      src/main/webapp/WEB-INF/ehr/jsp/common/testJs.jsp
  79. 0 0
      src/main/webapp/WEB-INF/ehr/jsp/common/tokenValidFailJs.jsp
  80. 0 74
      src/main/webapp/WEB-INF/ehr/jsp/monitor/monitor.jsp
  81. 1 1
      src/main/webapp/WEB-INF/ehr/jsp/monitor/server/sEnvManage.jsp
  82. 259 218
      src/main/webapp/WEB-INF/ehr/jsp/monitor/server/sEnvManageJs.jsp
  83. 83 23
      src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManage.jsp
  84. 164 168
      src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManageJs.jsp
  85. 11 0
      src/main/webapp/WEB-INF/ehr/jsp/qc/report.jsp
  86. 5 0
      src/main/webapp/WEB-INF/ehr/jsp/qc/reportJs.jsp
  87. 11 0
      src/main/webapp/WEB-INF/ehr/jsp/qc/storageReport.jsp
  88. 5 0
      src/main/webapp/WEB-INF/ehr/jsp/qc/storageReportJs.jsp
  89. 1538 1538
      src/main/webapp/WEB-INF/ehr/jsp/standard/adapterplan/configurationJs.jsp
  90. 26 0
      src/main/webapp/develop/lib/module/dateExt.js
  91. 35 0
      src/main/webapp/develop/lib/plugin/echarts-2.2.7/echarts-all.js
  92. 20 0
      src/main/webapp/develop/lib/plugin/echarts-2.2.7/echarts.js

+ 41 - 2
README.md

@ -1,3 +1,42 @@
# eip
# 简介
信息共享交换平台(CoSharp)是一个面向医疗服务的智能化集成开发平台,定位于实现和推动医疗机构内外异构系统间的数据和服务信息共享与交换,实现网内外系统的互联互通。
信息共享交换平台通过提供标准转换和各语言开发相关SDK或语言无关的API来规范开发流程,解耦应用间的依赖,降低系统的集成的难度,缩短时间周期和减少成本。
# 代码规范
进行代码开发前,请先阅读代码规范。
具体内容参看Specification/Java代码规范.md
# 项目结构
[代码位置](http://192.168.1.220:10080/Cosharp/eip)
模块| 说明
---|---
hos-parent | 依赖Jar版本管理
hos-core | 通用组件
hos-web-framework | 业务相关通用组件
hos-logger | 日志服务组件等
hos-dfs | 基于Mongo GirdFS的简易文件服务器
hos-arbiter | 服务协调组件
hos-broker | 服务运行组件
hos-admin | 控制管理 
hos-central-rest | 内置服务
hos-rest | 内置服务
hos-camel2| 服务编排实现模块
hos-docker | Docker化模块
sdk | 开发包
## 注意事项
通过dependencyManagement方式管理引入工程中类库及版本,其他模块只指定依赖,不设置版本号。以保证统一。
# 系统结构
系统 | 组成模块(只列可运行模块)
---|---
中心控制系统 | hos-admin,hos-dfs
中心交换系统 | hos-logger,hos-arbiter,hos-broker,hos-rest
前置一体机 | hos-logger,hos-arbiter,hos-broker,hos-rest
# 开发过程
开发过程中,如果工程最终是要通过tomcat容器进行部署的话;在功能模块完成后最好能够在idea中使用集成的外置tomcat容器运行测试下,如此可以模拟生产环境的运行状态;
信息共享交换平台(CoSharp)是一个面向医疗服务的智能化集成开发平台,定位于实现和推动医疗机构内外异构系统间的数据和服务信息共享与交换,实现网内外系统的互联互通。信息共享交换平台通过提供标准转换和各语言开发相关SDK或语言无关的API来规范开发流程,解耦应用间的依赖,降低系统的集成的难度,缩短时间周期和减少成本

+ 1 - 0
hos-arbiter/pom.xml

@ -73,6 +73,7 @@
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-version}</version>
                <executions>
                    <execution>
                        <goals>

+ 2 - 1
hos-arbiter/src/main/resources/logback.xml

@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!-- 日志文件基础目录-->
    <property name="log_dir" value="/usr/local/esb/logs/" />
    <!-- 应用名称 -->
    <property name="APP_NAME" value="hos-arbiter" />
    <property name="log_dir" value="logs/" />
    <!--日志文件的保存路径,首先查找系统属性-Dlog.dir,如果存在就使用其;否则,在当前目录下创建名为logs目录做日志存放的目录 -->
    <property name="LOG_HOME" value="${log_dir:-logs}/${APP_NAME}" />
    <!-- 日志输出格式 -->

+ 17 - 21
hos-broker/pom.xml

@ -16,18 +16,27 @@
    <name>hos-broker</name>
    <description>ESB服务运行模块</description>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix</artifactId>
            <version>${spring-cloud-version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>${spring-cloud-version}</version>
        </dependency>
        <!-- spring-boot -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
@ -40,12 +49,6 @@
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
@ -63,11 +66,6 @@
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <!--<dependency>-->
        <!--<groupId>org.springframework.cloud</groupId>-->
        <!--<artifactId>spring-cloud-starter-eureka</artifactId>-->
        <!--</dependency>-->
        <!-- sigar -->
        <dependency>
            <groupId>org.fusesource</groupId>
@ -133,11 +131,8 @@
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-restlet</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- camel end -->
        <dependency>
            <groupId>com.yihu.hos</groupId>
            <artifactId>hos-core</artifactId>
@ -153,6 +148,7 @@
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-version}</version>
                <executions>
                    <execution>
                        <goals>

+ 3 - 4
hos-broker/src/main/java/com/yihu/hos/broker/HosBrokerApplication.java

@ -19,6 +19,7 @@ import java.util.concurrent.Executors;
@EnableScheduling
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableAsync
//@EnableEurekaClient
public class HosBrokerApplication extends SpringBootServletInitializer implements CommandLineRunner {
    @Autowired
    private GridFsOperations operations;
@ -27,8 +28,7 @@ public class HosBrokerApplication extends SpringBootServletInitializer implement
    private ExecutorService executorService = Executors.newSingleThreadExecutor();
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(HosBrokerApplication.class);
        app.run(args);
        SpringApplication.run(HosBrokerApplication.class, args);
    }
    @Override
@ -49,7 +49,6 @@ public class HosBrokerApplication extends SpringBootServletInitializer implement
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        builder.sources(this.getClass());
        return super.configure(builder);
        return builder.sources(HosBrokerApplication.class);
    }
}

+ 0 - 40
hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/CrawlerMongoRouter.java

@ -1,40 +0,0 @@
package com.yihu.hos.broker.common.camelrouter;
import com.yihu.hos.broker.common.processor.CrawlerMongoProcessor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class CrawlerMongoRouter extends RouteBuilder {
    @Override
    public void configure() throws Exception {
//        from("quartz://myGroup/myTimerName?cron=0 0/1 * * * ? ")
//            .process(new CrawlerMongoProcessor())
//                .to("stream:out");
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=runtime&collection=arbiterServer&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("runtime", "arbiterServer"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=runtime&collection=brokerServer&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("runtime", "brokerServer"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=runtime&collection=endpoint&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("runtime", "endpoint"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=log&collection=server&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("log", "server"))
//            .to("bean:centerMongoService?method=save")
//            .process(new CrawlerMongoProcessor())
//            .to("mongodb:mongo?database=log&collection=service&operation=findOneByQuery")
//            .split(simple("${body}"))
//            .process(new AddMongoProcessor("log", "service"))
//            .to("bean:centerMongoService?method=save");
    }
}

+ 16 - 0
hos-broker/src/main/java/com/yihu/hos/broker/common/camelrouter/MonitorRouterBulider.java

@ -0,0 +1,16 @@
package com.yihu.hos.broker.common.camelrouter;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
/**
 * Created by l4qiang on 2017-06-16.
 */
@Component
public class MonitorRouterBulider extends RouteBuilder {
    @Override
    public void configure() throws Exception {
//        from("quartz://monitor/monitorTimer?cron=0 0/1 * * * ?")
//                .to("bean:serverMonitorService?method=collectEnvHealth");
    }
}

+ 8 - 12
hos-broker/src/main/java/com/yihu/hos/broker/common/constants/MonitorConstant.java

@ -5,17 +5,13 @@ package com.yihu.hos.broker.common.constants;
 * @vsrsion 1.0
 * Created at 2016/11/3.
 */
public class MonitorConstant {
    public static String MONITOR_DATABASE = "log";
    public static String SERVER = "server";
    public static String SERVICE = "service";
    public static String BUSSINESS_LOG = "businessLog";
    public static String HOST = "host";     //这个是否需要,可以在runtime库中使用brokerServer?
    public static String CPU = "cpu";
    public static String FILES = "files";
    public static String MEMORY = "memory";
    public static String NET = "net";
public interface MonitorConstant {
    String DATABASE = "log";
    String SERVER = "server";
    String HOST = "host";     //这个是否需要,可以在runtime库中使用brokerServer?
    String CPU = "cpu";
    String FILES = "files";
    String MEMORY = "memory";
    String NET = "net";
}

+ 0 - 41
hos-broker/src/main/java/com/yihu/hos/broker/common/processor/AddMongoProcessor.java

@ -1,41 +0,0 @@
package com.yihu.hos.broker.common.processor;
import com.mongodb.BasicDBObject;
import com.mongodb.QueryOperators;
import com.yihu.hos.core.datatype.DateUtil;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.apache.camel.Processor;
import org.bson.types.ObjectId;
import org.json.JSONArray;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by Zdm on 2016/7/13.
 */
public class AddMongoProcessor implements Processor {
    private String database;
    private String collection;
    public AddMongoProcessor(String database, String collection) {
        this.database = database;
        this.collection = collection;
    }
    @Override
    public void process(Exchange exchange) throws Exception {
        Map record = exchange.getIn().getBody(Map.class);
        Map info = new HashMap();
        info.put("database", database);
        info.put("collection", collection);
        ObjectId objectId = (ObjectId) record.get("_id");
        record.put("_id", objectId.toString());
        JSONArray jsonArray = new JSONArray();
        jsonArray.put(info);
        jsonArray.put(record);
        exchange.getIn().setBody(jsonArray);
    }
}

+ 0 - 59
hos-broker/src/main/java/com/yihu/hos/broker/common/scheduler/MonitorScheduler.java

@ -1,59 +0,0 @@
package com.yihu.hos.broker.common.scheduler;
import com.yihu.hos.broker.services.ServerMonitorService;
import com.yihu.hos.broker.services.ServiceMonitorService;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * 服务器性能数据采集定时器
 *
 * @author HZY
 * @vsrsion 1.0
 * Created at 2016/10/11.
 */
@Component
public class MonitorScheduler {
    static private final Logger logger = LoggerFactory.getLogger(MonitorScheduler.class);
    @Resource(name = ServiceMonitorService.BEAN_ID)
    private ServiceMonitorService serviceMonitorService;
    @Resource(name = ServerMonitorService.BEAN_ID)
    private ServerMonitorService serverMonitorService;
    @Scheduled(cron = "0 0/1 * * * ?") //每分钟执行一次
    public void statusCheck() {
        logger.debug("每分钟执行一次。开始============================================");
        //TODO 采集服务器健康监控指标数据 statusTask.healthCheck();
        collectEnvHealth();
        collectServiceHealth();
        logger.info("每分钟执行一次。结束。");
    }
    /**
     * 服务器健康指标采集
     *
     * @return
     */
    public void collectEnvHealth() {
        serverMonitorService.collectEnvHealth();
    }
    public void collectServiceHealth() {
        serviceMonitorService.collectServiceHealth();
    }
    /**
     * 服务器列表保存
     */
//    @Scheduled(cron = "0 0 12 * * ?") //每天中午12点触发
    @Scheduled(fixedDelay = 3600 * 24 * 1000, initialDelay = 3000) //每天中午12点触发
    public void checkHost() {
        serverMonitorService.checkHost();
    }
}

+ 0 - 31
hos-broker/src/main/java/com/yihu/hos/broker/configurations/GatewayConfiguration.java

@ -1,31 +0,0 @@
package com.yihu.hos.broker.configurations;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
/**
 * @created Airhead 2016/8/4.
 */
@Configuration
public class GatewayConfiguration {
    @Value("${spring.gateway.ip}")
    private String ip;
    @Value("${spring.gateway.port}")
    private String port;
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getPort() {
        return port;
    }
    public void setPort(String port) {
        this.port = port;
    }
}

+ 1 - 0
hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBCamelController.java

@ -14,6 +14,7 @@ import java.util.List;
import java.util.Map;
/**
 * 流程管理
 * Created by lingfeng on 2016/8/4.
 */
@RestController

+ 2 - 2
hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBMycatlController.java

@ -11,15 +11,15 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
 * MyCat管理
 * Created by lingfeng on 2016/8/4.
 */
@RestController
@RequestMapping("/esb")
public class ESBMycatlController {
public class ESBMycatController {
    @Autowired
    private MycatConfigService mycatService;
    @RequestMapping(value = "/serviceMycat/update", produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
    @ApiOperation(value = "修改mycat", produces = "application/json", notes = "修改mycat的配置文件,并重新加载配置")
    public Result updateMycat(

+ 1 - 0
hos-broker/src/main/java/com/yihu/hos/broker/controllers/ESBShellController.java

@ -14,6 +14,7 @@ import javax.annotation.Resource;
/**
 * @author HZY
 * @vsrsion 1.0
 * SSH命令控制
 * Created at 2017/1/6.
 */
@RestController

+ 0 - 66
hos-broker/src/main/java/com/yihu/hos/broker/controllers/GatewayController.java

@ -1,66 +0,0 @@
package com.yihu.hos.broker.controllers;
import com.yihu.hos.core.constants.ExceptionConstant;
import com.yihu.hos.core.exception.ESBException;
import com.yihu.hos.broker.models.GatewayRequestResult;
import com.yihu.hos.broker.models.GatewayResponseResult;
import com.yihu.hos.broker.services.GatewayService;
import io.swagger.annotations.ApiParam;
import net.sf.json.JSONObject;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.Writer;
@RestController
@RequestMapping("/esb")
public class GatewayController {
    private final GatewayService gatewayService;
    @Autowired
    public GatewayController(GatewayService gatewayService) {
        this.gatewayService = gatewayService;
    }
    @RequestMapping(value = "/camel.central.gateway", method = RequestMethod.POST)
    public void transfer(HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("application/json;charset=UTF-8");
        Writer writer = response.getWriter();
        response.setCharacterEncoding("UTF-8");
        String returnString;
        String resultData;
        GatewayRequestResult gatewayRequestResult = new GatewayRequestResult();
        try {
            BeanUtils.populate(gatewayRequestResult, request.getParameterMap());
            //---end
            gatewayService.paramsIsNotNull(gatewayRequestResult.getApi());
            resultData = gatewayService.getResultData(gatewayRequestResult);
            returnString = resultData;
        } catch (Exception e) {
            e.printStackTrace();
            if (e instanceof ESBException) {
                ESBException esbException = (ESBException) e;
                returnString = JSONObject.fromObject(GatewayResponseResult.getError(esbException.getExceptionCode(), esbException.getExceptionMessage())).toString();
            } else {
                returnString = JSONObject.fromObject(GatewayResponseResult.getError(ExceptionConstant.EHREXCEPTION_SYSTEMEXCEPTION, ExceptionConstant.EHREXCEPTION_SYSTEMEXCEPTION_MESSAGE)).toString();
            }
        }
        writer.write(returnString);
        writer.flush();
        writer.close();
    }
    @RequestMapping(value = "/webservice/host", method = RequestMethod.GET)
    public String wsHost(
            @ApiParam(name = "serviceName", value = "微服务名", required = true)
            @RequestParam String serviceName) throws Exception {
        String uri = gatewayService.serviceUrl(serviceName);
        return uri;
    }
}

+ 0 - 37
hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayRequestResult.java

@ -1,37 +0,0 @@
package com.yihu.hos.broker.models;
import java.io.Serializable;
/**
 * Created by chenweida on 2016/1/27.
 */
public class GatewayRequestResult implements Serializable {
    private String api;
    private String param;
    //---end
    public String getApi() {
        return api;
    }
    public void setApi(String api) {
        this.api = api;
    }
    public String getParam() {
        return param;
    }
    public void setParam(String param) {
        this.param = param;
    }
    @Override
    public String toString() {
        return "{" +
                "api:'" + api + '\'' +
                ", param:'" + param + '\'' +
                '}';
    }
}

+ 0 - 86
hos-broker/src/main/java/com/yihu/hos/broker/models/GatewayResponseResult.java

@ -1,86 +0,0 @@
package com.yihu.hos.broker.models;
import com.yihu.hos.core.constants.ExceptionConstant;
import java.io.Serializable;
/**
 * Created by chenweida on 2016/1/27.
 */
public class GatewayResponseResult implements Serializable {
    private String responseCode = ExceptionConstant.EHREXCEPTION_SUCCESS;
    private String responseMessage = "";
    private String responseParams;
    private String requestId;
    private Object responseResult;
    public String getResponseCode() {
        return responseCode;
    }
    public void setResponseCode(String responseCode) {
        this.responseCode = responseCode;
    }
    public String getResponseMessage() {
        return responseMessage;
    }
    public void setResponseMessage(String responseMessage) {
        this.responseMessage = responseMessage;
    }
    public String getResponseParams() {
        return responseParams;
    }
    public void setResponseParams(String responseParams) {
        this.responseParams = responseParams;
    }
    public String getRequestId() {
        return requestId;
    }
    public void setRequestId(String requestId) {
        this.requestId = requestId;
    }
    public static GatewayResponseResult getSuccess(String responseParams, String requestId) {
        GatewayResponseResult responseModel = new GatewayResponseResult();
        responseModel.setRequestId(requestId);
        responseModel.setResponseParams(responseParams);
        return responseModel;
    }
    public static GatewayResponseResult getSuccess(String responseParams) {
        GatewayResponseResult responseModel = new GatewayResponseResult();
        responseModel.setResponseParams(responseParams);
        return responseModel;
    }
    public static GatewayResponseResult getError(String respCode, String respMessage) {
        GatewayResponseResult responseModel = new GatewayResponseResult();
        responseModel.setResponseCode(respCode);
        responseModel.setResponseMessage(respMessage);
        return responseModel;
    }
    @Override
    public String toString() {
        return "{" +
                "responseCode:'" + responseCode + '\'' +
                ", responseMessage:'" + responseMessage + '\'' +
                ", responseParams:'" + responseParams + '\'' +
                ", requestId:'" + requestId + '\'' +
                '}';
    }
    public Object getResponseResult() {
        return responseResult;
    }
    public void setResponseResult(Object responseResult) {
        this.responseResult = responseResult;
    }
}

+ 0 - 25
hos-broker/src/main/java/com/yihu/hos/broker/services/CenterMongoService.java

@ -1,25 +0,0 @@
package com.yihu.hos.broker.services;
import com.yihu.hos.core.http.HttpClientKit;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component("centerMongoService")
public class CenterMongoService {
    private static final Logger logger = LoggerFactory.getLogger(CenterMongoService.class);
    @Value("${hos.rest.url}")
    private String url;
    public void save(String msg) {
        Map<String, String> params = new HashMap<>();
        params.put("msg", msg);
        String returnData = HttpClientKit.post(url + "/metric/saveToMongo", params).getBody();
        System.out.println(returnData);
    }
}

+ 0 - 96
hos-broker/src/main/java/com/yihu/hos/broker/services/GatewayService.java

@ -1,96 +0,0 @@
package com.yihu.hos.broker.services;
import com.yihu.hos.broker.configurations.GatewayConfiguration;
import com.yihu.hos.core.constants.CoreConstant;
import com.yihu.hos.core.constants.ExceptionConstant;
import com.yihu.hos.core.exception.ESBException;
import com.yihu.hos.core.http.HttpClientKit;
import com.yihu.hos.broker.models.GatewayRequestResult;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
 * @author chenweida on 2016/1/27.
 */
@Service
public class GatewayService {
    private final GatewayConfiguration gatewayConfiguration;
    @Autowired
    public GatewayService(GatewayConfiguration gatewayConfiguration) {
        this.gatewayConfiguration = gatewayConfiguration;
    }
    @Autowired
    private DiscoveryClient discoveryClient;
    /**
     * 通过服务名获取微服务地址
     *
     * @param serviceName 微服务名
     * @return
     */
    public String serviceUrl(String serviceName) {
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
        if (instances != null && !instances.isEmpty()) {
            int index = (int) (Math.random() * instances.size());//随机获取其中一个服务
            ServiceInstance serviceInstance = instances.get(index);
            return serviceInstance.getUri().toString();
        } else {
            return null;
        }
    }
    public String getResultData(GatewayRequestResult gatewayRequestResult) throws ESBException {
        String returnData;
        //拼凑出URL
        String url = getUrl(gatewayConfiguration.getIp(), gatewayConfiguration.getPort(), gatewayRequestResult.getApi());
        try {
            Map<String, String> params = getParams(gatewayRequestResult.getParam());
            returnData = HttpClientKit.post(url, params).getBody();
            System.out.print(returnData);
        } catch (Exception e) {
            throw new ESBException(ExceptionConstant.EHREXCEPTION_SYSTEM_TRANSFER, ExceptionConstant.EHREXCEPTION_SYSTEM_TRANSFER_MESSAGE);
        }
        return returnData;
    }
    public void paramsIsNotNull(Object params) throws ESBException {
        if (StringUtils.isEmpty(params)) {
            throw new ESBException(ExceptionConstant.EHREXCEPTION_BUSINESS_PARAMS_EXCEPTION, ExceptionConstant.EHREXCEPTION_BUSINESS_PARAMS_EXCEPTION_MESSAGE);
        }
    }
    private String getUrl(String ip, String port, String api) {
        String url = CoreConstant.HTTP + CoreConstant.COLON + CoreConstant.BACKSLASH +
                CoreConstant.BACKSLASH + ip + CoreConstant.COLON + port +
                CoreConstant.BACKSLASH + api;
        return url;
    }
    private Map<String, String> getParams(String jsonParam) {
        JSONObject object = JSONObject.fromObject(jsonParam);
        Map<String, String> params = new HashMap<>();
        Iterator<?> keys = object.keys();
        while (keys.hasNext()) {
            String key = (String) keys.next();
            String value = object.getString(key);
            params.put(key, value);
        }
        return params;
    }
}

+ 3 - 6
hos-broker/src/main/java/com/yihu/hos/broker/services/ServerMonitorService.java

@ -10,13 +10,10 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service("ServerMonitorService")
@Service("serverMonitorService")
public class ServerMonitorService {
    public static final String BEAN_ID = "ServerMonitorService";
    @Value("${hos.tenant.name}")
    private String tenant;
    private static String host = SigarUtil.getHost();
@ -31,7 +28,7 @@ public class ServerMonitorService {
    public void collectEnvHealth() {
        try {
            BasicDBObject result = new BasicDBObject();
            DBCollection terminal = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.SERVER);
            DBCollection terminal = mongo.getDB(MonitorConstant.DATABASE).getCollection(MonitorConstant.SERVER);
            result.put("tenant", tenant);
            result.put("create_date", DateUtil.getCurrentString(DateUtil.DEFAULT_YMDHMSDATE_FORMAT));
            result.put("create_time", DateUtil.getSysDateTime());
@ -68,7 +65,7 @@ public class ServerMonitorService {
    }
    public void checkHost() {
        DBCollection terminal = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.HOST);
        DBCollection terminal = mongo.getDB(MonitorConstant.DATABASE).getCollection(MonitorConstant.HOST);
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{

+ 0 - 397
hos-broker/src/main/java/com/yihu/hos/broker/services/ServiceMonitorService.java

@ -1,397 +0,0 @@
package com.yihu.hos.broker.services;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mongodb.*;
import com.yihu.hos.broker.common.constants.MonitorConstant;
import com.yihu.hos.broker.daos.BrokerDao;
import com.yihu.hos.core.datatype.DateUtil;
import com.yihu.hos.core.datatype.NumberUtil;
import com.yihu.hos.core.datatype.StringUtil;
import com.yihu.hos.web.framework.model.bo.Endpoint;
import com.yihu.hos.web.framework.model.bo.ServiceFlow;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
/**
 * Created by chenweida on 2016/1/27.
 */
@Service("ServiceMonitorService")
public class ServiceMonitorService {
    public static final String BEAN_ID = "ServiceMonitorService";
    @Value("${hos.tenant.name}")
    private String tenant;
    @Autowired
    private Mongo mongo;
    @Autowired
    private BrokerDao brokerDao;
    private DBCollection businessLog;
    public DBCollection getBusinessLog() {
        if (businessLog == null) {
            businessLog = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.BUSSINESS_LOG);
        }
        return businessLog;
    }
    public void collectServiceHealth() {
        try {
            Date now = new Date();
            Date beforeDate = new Date(now.getTime() - 60000);
            String beginTime = DateUtil.toString(beforeDate, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
            String endTime = DateUtil.toString(now, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
            List<ServiceFlow> flowList = brokerDao.getServiceFlowList();
            List<Endpoint> endpointList = brokerDao.getEndPointList();
            List<String> codeList = new ArrayList<>();
            for (ServiceFlow systemServiceFlow : flowList) {
                codeList.add(systemServiceFlow.getRouteCode());
            }
            for (Endpoint systemServiceEndpoint : endpointList) {
                codeList.add(systemServiceEndpoint.getCode());
            }
            bandwidth(beginTime, endTime, codeList);
            qps(beginTime, endTime, codeList);
            delay(beginTime, endTime, codeList);
            usage(beginTime, endTime, codeList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void bandwidth(String beginTime, String endTime, List<String> codeList) {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        DBObject serviceGroup = getServiceGroupFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        //流程带宽
        Map<String, Integer> bandwidthMapF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            Integer bodyLength = Integer.parseInt(StringUtil.toString(dbObject.get("bodyLength")));
            if (bandwidthMapF.containsKey(code)) {
                bodyLength = bodyLength + bandwidthMapF.get(code);
                bandwidthMapF.put(code, bodyLength);
            } else {
                bandwidthMapF.put(code, bodyLength);
            }
        }
        //服务带宽
        // run aggregation
        AggregationOutput serviceOutput = getBusinessLog().aggregate(match, serviceGroup, sort);
        Map<String, Integer> bandwidthMapS = new HashMap<>();
        for (DBObject dbObject : serviceOutput.results()) {
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("code"));
            Integer bodyLength = Integer.parseInt(StringUtil.toString(dbObject.get("bodyLength")));
            if (bandwidthMapS.containsKey(code)) {
                bodyLength = bodyLength + bandwidthMapS.get(code);
                bandwidthMapS.put(code, bodyLength);
            } else {
                bandwidthMapS.put(code, bodyLength);
            }
        }
        for (String code : codeList) {
            BigDecimal bandwidth = BigDecimal.ZERO;
            long interval = getInterval(beginTime, endTime);
            if (!StringUtil.isEmpty(bandwidthMapF.get(code))) {
                Integer flowCalls = bandwidthMapF.get(code);
                bandwidth = NumberUtil.divideBigDecimal(BigDecimal.valueOf(flowCalls), BigDecimal.valueOf(interval));
            } else if (!StringUtil.isEmpty(bandwidthMapS.get(code))) {
                Integer serviceCalls = bandwidthMapS.get(code) / 2;
                bandwidth = NumberUtil.divideBigDecimal(BigDecimal.valueOf(serviceCalls), BigDecimal.valueOf(interval));
            }
            saveServiceMetrics(code, "bandwidth", bandwidth.toString(), endTime);
        }
    }
    public void qps(String beginTime, String endTime, List<String> codeList) {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        DBObject serviceGroup = getServiceGroupFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        //流程qps
        Map<String, Integer> qpsMapF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            Integer total = Integer.parseInt(StringUtil.toString(dbObject.get("total")));
            if (total == count / 2) {
                if (qpsMapF.containsKey(code)) {
                    Integer flowCalls = qpsMapF.get(code);
                    qpsMapF.put(code, ++flowCalls);
                } else {
                    qpsMapF.put(code, 1);
                }
            }
        }
        //服务带宽
        // run aggregation
        AggregationOutput serviceOutput = getBusinessLog().aggregate(match, serviceGroup, sort);
        Map<String, Integer> qpsMapS = new HashMap<>();
        for (DBObject dbObject : serviceOutput.results()) {
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("code"));
            if (qpsMapS.containsKey(code)) {
                Integer serviceCalls = qpsMapS.get(code);
                qpsMapS.put(code, ++serviceCalls);
            } else {
                qpsMapS.put(code, 1);
            }
        }
        for (String code : codeList) {
            BigDecimal qps = BigDecimal.ZERO;
            long interval = getInterval(beginTime, endTime);
            if (!StringUtil.isEmpty(qpsMapF.get(code))) {
                Integer flowCalls = qpsMapF.get(code);
                qps = NumberUtil.divideBigDecimal(BigDecimal.valueOf(flowCalls), BigDecimal.valueOf(interval));
            } else if (!StringUtil.isEmpty(qpsMapS.get(code))) {
                Integer serviceCalls = qpsMapS.get(code) / 2;
                qps = NumberUtil.divideBigDecimal(BigDecimal.valueOf(serviceCalls), BigDecimal.valueOf(interval));
            }
            saveServiceMetrics(code, "qps", qps.toString(), endTime);
        }
    }
    public void usage(String beginTime, String endTime, List<String> codeList) throws JsonProcessingException {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        Map<String, Integer> usageMapSuccessF = new HashMap<>();
        Map<String, Integer> usageMapFailF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            Integer total = Integer.parseInt(StringUtil.toString(dbObject.get("total")));
            Integer count = Integer.parseInt(StringUtil.toString(dbObject.get("count")));
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            if (total == count / 2) {
                if (usageMapSuccessF.containsKey(code)) {
                    Integer countTemp = usageMapSuccessF.get(code);
                    usageMapSuccessF.put(code, ++countTemp);
                } else {
                    usageMapSuccessF.put(code, 1);
                }
            } else {
                if (usageMapFailF.containsKey(code)) {
                    Integer countTemp = usageMapFailF.get(code);
                    usageMapFailF.put(code, ++countTemp);
                } else {
                    usageMapFailF.put(code, 1);
                }
            }
        }
        DBCursor serviceOutput = getBusinessLog().find(getQueryObject(beginTime, endTime));
        Map<String, Integer> usageMapSuccessS = new HashMap<>();
        Map<String, Integer> usageMapFailS = new HashMap<>();
        Map<String, String> serviceMap = new HashMap<>();
        for (DBObject dbObject : serviceOutput.toArray()) {
            String code = StringUtil.toString(dbObject.get("code"));
            String order = StringUtil.toString(dbObject.get("order"));
            String breadcrumbId = StringUtil.toString(dbObject.get("breadcrumbId"));
            if (serviceMap.containsKey(code + breadcrumbId + order)) {
                serviceMap.remove(code + breadcrumbId + order);
                if (usageMapSuccessS.containsKey(code)) {
                    Integer countTemp = usageMapSuccessS.get(code);
                    usageMapSuccessS.put(code, ++countTemp);
                } else {
                    usageMapSuccessS.put(code, 1);
                }
            } else {
                serviceMap.put(code + breadcrumbId + order, code);
            }
        }
        for (String key : serviceMap.keySet()) {
            String code = serviceMap.get(key);
            if (usageMapFailS.containsKey(code)) {
                Integer count = usageMapFailF.get(code);
                usageMapFailF.put(code, ++count);
            } else {
                usageMapFailF.put(code, 1);
            }
        }
        for (String code : codeList) {
            JSONObject result = new JSONObject();
            Integer successCountF = isNull(usageMapSuccessF.get(code));
            Integer failureCountF = isNull(usageMapFailF.get(code));
            Integer successCountS = isNull(usageMapSuccessS.get(code));
            Integer failureCountS = isNull(usageMapFailS.get(code));
            if (successCountF > 0 || failureCountF > 0) {
                result.put("totalCount", successCountF + failureCountF);
                result.put("successCount", successCountF);
                result.put("failureCount", failureCountF);
            } else if (successCountS > 0 || failureCountS > 0) {
                result.put("totalCount", successCountS + failureCountS);
                result.put("successCount", successCountS);
                result.put("failureCount", failureCountS);
            } else {
                result.put("totalCount", 0);
                result.put("successCount", 0);
                result.put("failureCount", 0);
            }
            ObjectMapper objectMapper = new ObjectMapper();
            saveServiceMetrics(code, "usage", objectMapper.writeValueAsString(result.toString()), endTime);
        }
    }
    public void delay(String beginTime, String endTime, List<String> codeList) {
        DBObject match = getMatchFields(beginTime, endTime);
        DBObject flowGroup = getFlowGroupFields();
        DBObject sort = getSortFields();
        // run aggregation
        AggregationOutput flowOutput = getBusinessLog().aggregate(match, flowGroup, sort);
        Map<String, BigDecimal> delayMapF = new HashMap<>();
        for (DBObject dbObject : flowOutput.results()) {
            BasicDBObject id = (BasicDBObject) dbObject.get("_id");
            String code = StringUtil.toString(id.get("routeId"));
            String begin = StringUtil.toString(dbObject.get("beginTime"));
            String end = StringUtil.toString(dbObject.get("endTime"));
            long interval = getIntervalExact(begin, end);
            if (delayMapF.containsKey(code)) {
                BigDecimal flowDelay = delayMapF.get(code);
                delayMapF.put(code, BigDecimal.valueOf(interval).add(flowDelay));
            } else {
                delayMapF.put(code, BigDecimal.valueOf(interval));
            }
        }
        DBCursor serviceOutput = getBusinessLog().find(getQueryObject(beginTime, endTime));
        Map<String, BigDecimal> delayMapS = new HashMap<>();
        Map<String, DBObject> serviceMap = new HashMap<>();
        for (DBObject dbObject : serviceOutput.toArray()) {
            String code = StringUtil.toString(dbObject.get("code"));
            if (serviceMap.containsKey(code)) {
                DBObject dbObjectTemp = serviceMap.remove(code);
                String begin = StringUtil.toString(dbObjectTemp.get("fireTimeSource"));
                String end = StringUtil.toString(dbObject.get("fireTimeSource"));
                long interval = getIntervalExact(begin, end);
                if (delayMapS.containsKey(code)) {
                    BigDecimal delayTemp = delayMapS.get(code);
                    delayMapS.put(code, delayTemp.add(BigDecimal.valueOf(interval)));
                } else {
                    delayMapS.put(code, BigDecimal.valueOf(interval));
                }
            } else {
                serviceMap.put(code, dbObject);
            }
        }
        for (String code : codeList) {
            BigDecimal delay = BigDecimal.ZERO;
            if (delayMapF.containsKey(code)) {
                delay = delayMapF.get(code);
            } else if (delayMapS.containsKey(code)) {
                delay = delayMapS.get(code);
            }
            saveServiceMetrics(code, "delay", delay.toString(), endTime);
        }
    }
    public DBObject getMatchFields(String beginTime, String endTime) {
        return new BasicDBObject("$match", getQueryObject(beginTime, endTime));
    }
    public DBObject getQueryObject(String beginTime, String endTime) {
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{
                        new BasicDBObject().append("fireTime",
                                new BasicDBObject().append(QueryOperators.GTE, DateUtil.toTimestamp(beginTime))),
                        new BasicDBObject().append("fireTime",
                                new BasicDBObject().append(QueryOperators.LT, DateUtil.toTimestamp(endTime)))});
        return queryObject;
    }
    public DBObject getServiceGroupFields() {
        // Now the $group operation
        DBObject groupFields = new BasicDBObject("_id",
                new BasicDBObject("id", "$_id")
                        .append("code", "$code"));
        groupFields.put("count", new BasicDBObject("$sum", 1));
        groupFields.put("bodyLength", new BasicDBObject("$sum", "$bodyLength"));
        groupFields.put("total", new BasicDBObject("$first", "$totalServers"));
        return new BasicDBObject("$group", groupFields);
    }
    public DBObject getFlowGroupFields() {
        // Now the $group operation
        DBObject groupFields = new BasicDBObject("_id",
                new BasicDBObject("breadcrumbId", "$breadcrumbId")
                        .append("routeId", "$routeId"));
        groupFields.put("count", new BasicDBObject("$sum", 1));
        groupFields.put("bodyLength", new BasicDBObject("$sum", "$bodyLength"));
        groupFields.put("total", new BasicDBObject("$first", "$totalServers"));
        groupFields.put("beginTime", new BasicDBObject("$first", "$fireTimeSource"));
        groupFields.put("endTime", new BasicDBObject("$last", "$fireTimeSource"));
        return new BasicDBObject("$group", groupFields);
    }
    public DBObject getSortFields() {
        DBObject sortFields = new BasicDBObject("_id", 1);
        return new BasicDBObject("$sort", sortFields);
    }
    public long getInterval(String beginTime, String endTime) {
        Date from = DateUtil.toTimestamp(beginTime, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
        Date to = DateUtil.toTimestamp(endTime, DateUtil.DEFAULT_YMDHMSDATE_FORMAT);
        long interval = (to.getTime() - from.getTime()) / 1000;
        return interval;
    }
    public long getIntervalExact(String beginTime, String endTime) {
        Date from = DateUtil.toTimestamp(beginTime, DateUtil.DEFAULT_TIMESTAMP_FORMAT);
        Date to = DateUtil.toTimestamp(endTime, DateUtil.DEFAULT_TIMESTAMP_FORMAT);
        long interval = (to.getTime() - from.getTime()) / 1000;
        return interval;
    }
    public void saveServiceMetrics(String name, String type, String value, String createTime) {
        BasicDBObject document = new BasicDBObject();
        document.put("tenant", tenant);
        document.put("name", name);
        document.put("type", type);
        document.put("value", value);
        document.put("create_time", createTime);
        DBCollection terminal = mongo.getDB(MonitorConstant.MONITOR_DATABASE).getCollection(MonitorConstant.SERVICE);
        terminal.save(document);
    }
    public Integer isNull(Integer count) {
        if (count == null) {
            count = 0;
        }
        return count;
    }
}

+ 4 - 9
hos-broker/src/main/resources/application.yml

@ -18,9 +18,9 @@ camel:
spring:
  profiles: dev
  activemq:
      broker-url: tcp://172.19.103.57:61616
      user: admin
      password: admin
    broker-url: tcp://172.19.103.57:61616
    user: admin
    password: admin
  data:
    mongodb:
      host: 172.19.103.57
@ -30,13 +30,11 @@ spring:
      authenticationDatabase: admin
      database: log
      gridFsDatabase: dfs
  camel.gateway:
    ip: localhost
    port: 8066
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.1.221:8761/eureka/
log:
  path: D://logs/logback/dev
  level: info
@ -77,9 +75,6 @@ spring:
      authenticationDatabase: admin
      database: log
      gridFsDatabase: dfs
  camel.gateway:
    ip: localhost
    port: 8066
eureka:
  client:
    serviceUrl:

+ 4 - 4
hos-broker/src/main/resources/logback-spring.xml

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<configuration debug="true">
    <!--<property name="log_dir" value="logs/"/>-->
    <!--&lt;!&ndash;日志文件的保存路径,首先查找系统属性-Dlog.dir,如果存在就使用其;否则,在当前目录下创建名为logs目录做日志存放的目录 &ndash;&gt;-->
    <!--<property name="LOG_HOME" value="${log_dir:-logs}"/>-->
@ -18,9 +18,9 @@
    </appender>
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">    
        <file>${LOG_HOME}/output.log</file>        
        <file>{LOG_HOME:-/usr/local/esb}/output.log</file>        
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>{LOG_HOME}/output.%d{yyyy-MM-dd_HH_mm}.%i.log.zip</fileNamePattern>
            <fileNamePattern>{LOG_HOME:-/usr/local/esb}/%d{yyyy-MM-dd_HH_mm}.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>
@ -55,7 +55,7 @@
            <appender-ref ref="queue"/>
        </logger>
        <logger name="org.hibernate" level="WARN"/>
        <logger name="org.springframework" level="WARN"/>
        <!--<logger name="org.springframework" level="INFO"/>-->
        <logger name="springfox.documentation" level="WARN"/>
        <root level="INFO">

+ 20 - 0
hos-camel2/pom.xml

@ -32,6 +32,14 @@
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-netflix</artifactId>
                <version>1.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
@ -76,6 +84,18 @@
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-stream</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>

+ 5 - 2
hos-camel2/src/main/java/camel/HosCamelApplication.java

@ -8,12 +8,15 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
 * Basic Spring Boot application.
 */
@SpringBootApplication
//@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class HosCamelApplication implements CommandLineRunner {
    @Autowired
    private CamelContext context;

+ 56 - 0
hos-camel2/src/main/java/camel/central/archives/processor/ArchivesService.java

@ -0,0 +1,56 @@
package camel.central.archives.processor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import org.apache.camel.Exchange;
import org.apache.camel.Message;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.io.IOException;
/**
 * 数据入库
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/06/26.
 */
@Service("archivesService")
public class ArchivesService {
    private static final Logger logger = LoggerFactory.getLogger(ArchivesService.class);
    private ObjectMapper objectMapper = new ObjectMapper();
    public void bodyValue(Exchange exchange) {
        Message in = exchange.getIn();
        String body = in.getBody(String.class);
    }
    //入库服务参数设置
    public void storageArchive(Exchange exchange) {
        Message in = exchange.getIn();
        String body = in.getBody(String.class);
        if (!StringUtils.isEmpty(body)){
            try {
                ObjectNode objectNode = objectMapper.readValue(body,ObjectNode.class);
                String packageId = objectNode.get("id").asText();
                String clientId = objectNode.get("clientId").asText();
                String query = "&packageId="+packageId+"&clientId="+clientId+"&echo="+false;
                exchange.getOut().setHeader(Exchange.REST_HTTP_QUERY,query);
                System.out.println("入库参数:"+query);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            System.out.println("上传档案失败处理,body: "+exchange.getIn().getBody(String.class));
        }
    }
}

+ 60 - 0
hos-camel2/src/main/java/camel/central/archives/route/ArchivesRouterBuilder.java

@ -0,0 +1,60 @@
package camel.central.archives.route;
import com.yihu.hos.web.framework.constant.ArchivesConstant;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jms.JmsComponent;
import org.apache.camel.model.ModelCamelContext;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.jms.ConnectionFactory;
/**
 * @author HZY
 * @vsrsion 1.0
 * Created at 2017/3/13.
 */
@Component
public class ArchivesRouterBuilder extends RouteBuilder {
    @Value("${spring.activemq.broker-url}")
    private String brokerURL;
    @Value("${spring.activemq.user}")
    private String user;
    @Value("${spring.activemq.password}")
    private String password;
    @Override
    public void configure() throws Exception {
        ModelCamelContext context = this.getContext();
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
                user, password, brokerURL);
        // Note we can explicit name the component
        context.addComponent(ArchivesConstant.CAMEL_COMPONENT, JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        // 档案上传接口代理 (兼容非病人维度上传)
        from("jetty:http://0.0.0.0:9912/api/dataset_package?bridgeEndpoint=true&enableMultipartFilter=false").routeId("datasetUpload1")
                .removeHeaders("CamelHttp*")
                .setHeader("User-Agent", header("UserAgent"))//使用postman测试时,无法设置User-Agent,使用UserAgent来获取
//                .setHeader("User-Agent", header("UserAgent"))//使用postman测试时,无法设置User-Agent,使用UserAgent来获取
//                .to("jetty:http://192.168.1.221:10140/api/v1.0/dataset_package")
                .to("jetty:http://192.168.131.106:10140/api/v1.0/datasetPackages")//上传档案
                .choice()
                .when(header(Exchange.HTTP_RESPONSE_CODE).isEqualTo("200")).to(ExchangePattern.InOnly, ArchivesConstant.CAMEL_ENDPOINT)//成功:发送入库消息
                .otherwise().log("上传失败").to("stream:out")
                .endChoice();
        ;
        //入库请求(消费MQ消息,发送入库接口请求)
        from(ArchivesConstant.CAMEL_ENDPOINT)
                .to("bean:archivesService?method=storageArchive")//参数设置
                .to("restlet:http://192.168.131.129:10170/api/v1.0/datasetPackages/resolve?restletMethod=PUT")
        ;
        ;
    }
}

+ 39 - 0
hos-camel2/src/main/java/camel/central/gateway/processor/ErrorHandle.java

@ -0,0 +1,39 @@
package camel.central.gateway.processor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.camel.Exchange;
import org.springframework.stereotype.Component;
/**
 * @author Airhead
 * @since 2017/3/17.
 */
@Component("errorHandle")
public class ErrorHandle {
    private ObjectMapper objectMapper =new ObjectMapper();
    public void paramError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"paramError!\",\"errorCode\":0}");
        exchange.getOut().setBody("{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"paramError!\",\"errorCode\":0}");
    }
    public void outdateError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"outdateError!\",\"errorCode\":0}");
        exchange.getOut().setBody("{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"outdateError!\",\"errorCode\":0}");
    }
    public void signValidError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"signValidError!\",\"errorCode\":0}");
        exchange.getOut().setBody("{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"signValidError!\",\"errorCode\":0}");
    }
    public void unauthorizedError(Exchange exchange) {
        exchange.getOut().setHeader("errorCode","{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"unauthorizedError!\",\"errorCode\":0}");
        exchange.getOut().setBody("{\"successFlg\":false,\"pageSize\":10,\"currPage\":0,\"totalPage\":0,\"totalCount\":0,\"detailModelList\":null,\"obj\":null,\"errorMsg\":\"unauthorizedError!\",\"errorCode\":0}");
    }
}

+ 46 - 23
hos-camel2/src/main/java/camel/central/gateway/processor/GatewayProcessor.java

@ -8,6 +8,7 @@ import com.yihu.hos.core.http.HttpClientKit;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.stereotype.Component;
@ -18,6 +19,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -46,36 +48,42 @@ public class GatewayProcessor implements Processor {
//        body = URLDecoder.decode(body, "UTF-8");
        Map<String, Object> params = exchange.getIn().getHeaders();
        if (params.get("appKey") == null) {
            return "restlet:http://0.0.0.0:8088/error/paramError?socketTimeout=60000&connectionTimeout=60000";    //TODO:
            exchange.getOut().setHeader(Exchange.HTTP_URI,"paramError");
            return "direct:errorHandle";
        }
        String appKey = params.get("appKey").toString();
        String secret = getSecret(appKey);
        if (secret.equals("")) {
            return "restlet:http://0.0.0.0:8088/error/paramError?socketTimeout=60000&connectionTimeout=60000";    //TODO:
            exchange.getOut().setHeader(Exchange.HTTP_URI,"paramError");
            return "direct:errorHandle";
        }
        boolean pass = checkParams(params);
        if (!pass) {
            return "jetty:http://0.0.0.0:8088/error/paramError?socketTimeout=60000&connectionTimeout=60000";    //TODO:
            exchange.getOut().setHeader(Exchange.HTTP_URI,"paramError");
            return "direct:errorHandle";
        }
        pass = checkTimeStamp(params);
        if (!pass) {
            return "restlet:http://0.0.0.0:8088/error/outdataError?socketTimeout=60000&connectionTimeout=60000";    //TODO:
            exchange.getOut().setHeader(Exchange.HTTP_URI,"outdateError");
            return "direct:errorHandle";
        }
        //获取secret接口,不做sign验证
        if (!"admin.apps.get".equals(params.get("api"))) {
            pass = checkSign(params, secret);
            if (!pass) {
                return "restlet:http://0.0.0.0:8088/error/signValidError?socketTimeout=60000&connectionTimeout=60000";    //TODO:
                exchange.getOut().setHeader(Exchange.HTTP_URI,"signValidError");
                return "direct:errorHandle";
            }
        }
        pass = checkAuthorized(params);
        if (!pass) {
            return "restlet:http://0.0.0.0:8088/error/unauthorizedError";    //TODO:
            exchange.getOut().setHeader(Exchange.HTTP_URI,"unauthorizedError");
            return "direct:errorHandle";
        }
        return genEndpoint(params, exchange);
@ -180,13 +188,17 @@ public class GatewayProcessor implements Processor {
            methodMap.put("3", "put");
            JsonNode jsonNode = objectMapper.readValue(param, JsonNode.class);
//            String url = serviceUrl(appApi.getMicroServiceName());
            String url = brokerUrl;
            String url = serviceUrl(appApi.getMicroServiceName());
            if (StringUtil.isEmpty(url)) {
                return "";
                url = appApi.getMicroServiceUri();
            }
            final String[] endPoint = {"restlet:" + appApi.getMicroServiceUri() + appApi.getMsMethodName() + "?socketTimeout=60000&connectionTimeout=60000&restletMethod=" + methodMap.get(appApi.getMethod())};
            final String[] endPoint = {""};
            if (exchange.getIn().getHeader(Exchange.CONTENT_TYPE,String.class).contains("multipart/form-data")){
                endPoint[0] = "jetty:" + url + appApi.getMsMethodName() + "?a=a";
            }else {
                endPoint[0] = "restlet:" + url + appApi.getMsMethodName() + "?socketTimeout=60000&connectionTimeout=60000&restletMethod=" + methodMap.get(appApi.getMethod());
            }
            final String[] body = {""};
            appApi.getParameters().forEach(p -> {
                JsonNode paramNode = jsonNode.get(p.getName());
@ -274,24 +286,35 @@ public class GatewayProcessor implements Processor {
     * @return
     */
    public String serviceUrl(String serviceName) {
        HTTPResponse response = HttpClientKit.get(brokerUrl + "/esb/webservice/host?serviceName=" + serviceName);
        if (response.getStatusCode() != 200) {
            System.out.println("获取服务地址请求失败!");
            return "";
        List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
        if (instances != null && !instances.isEmpty()) {
            int index = (int) (Math.random() * instances.size());   //随机获取其中一个服务
            ServiceInstance serviceInstance = instances.get(index);
            return serviceInstance.getUri().toString();
        } else {
            return null;
        }
        return response.getBody();
    }
    public String nodeValue(JsonNode node){
    public String nodeValue(JsonNode node) {
        Object value = null;
        try {
            switch (node.getNodeType().name()){
                case "NUMBER" : value = node.asInt();break;
                case "STRING" : value = node.asText();break;
                case "BOOLEAN" : value = node.asBoolean();break;
                case "OBJECT" : value = node.toString();break;
                default:value = "";break;
            switch (node.getNodeType().name()) {
                case "NUMBER":
                    value = node.asInt();
                    break;
                case "STRING":
                    value = node.asText();
                    break;
                case "BOOLEAN":
                    value = node.asBoolean();
                    break;
                case "OBJECT":
                    value = node.toString();
                    break;
                default:
                    value = "";
                    break;
            }
            return URLEncoder.encode(value.toString(), "UTF-8");
        } catch (UnsupportedEncodingException e) {

+ 53 - 4
hos-camel2/src/main/java/camel/central/gateway/route/GatewayRouterBuilder.java

@ -1,9 +1,15 @@
package camel.central.gateway.route;
import camel.central.gateway.processor.ErrorHandle;
import camel.central.gateway.processor.GatewayProcessor;
import camel.central.gateway.processor.WsProcessor;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jetty.JettyHttpComponent;
import org.apache.camel.util.jsse.KeyManagersParameters;
import org.apache.camel.util.jsse.KeyStoreParameters;
import org.apache.camel.util.jsse.SSLContextParameters;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
@ -19,23 +25,66 @@ public class GatewayRouterBuilder extends RouteBuilder {
//            + "&dataFormat=CXF_MESSAGE"
            ;
    @Value("${hos.https.enable}")
    private Boolean httpsEnable;
    @Override
    public void configure() throws Exception {
        if (httpsEnable) {
            //全局ssl设置
            KeyStoreParameters ksparams = new KeyStoreParameters();
            ksparams.setResource("tomcat.keystore");
            ksparams.setPassword("123456");
            KeyManagersParameters kmp = new KeyManagersParameters();
            kmp.setKeyStore(ksparams);
            kmp.setKeyPassword("123456");
            SSLContextParameters scp = new SSLContextParameters();
            scp.setKeyManagers(kmp);
            JettyHttpComponent jettyComponent = getContext().getComponent("jetty", JettyHttpComponent.class);
            jettyComponent.setSslContextParameters(scp);
        }
        //EHR ag-admin网关代理
        from("jetty:http://0.0.0.0:9998?matchOnUriPrefix=true").routeId("proxy")
                .to("jetty:http://192.168.1.221:10000?bridgeEndpoint=true&throwExceptionOnFailure=false");
        from("jetty:http://0.0.0.0:9999/api").routeId("api")
        // 档案上传接口代理
        from("jetty:http://0.0.0.0:9990/api/packages?bridgeEndpoint=true&enableMultipartFilter=false").routeId("proxyUploadPack")
                .removeHeaders("CamelHttp*")
                .to("jetty:http://192.168.1.221:10140/api/v1.0/packages");
        //统一网关入口(restful)
        from("jetty:http://0.0.0.0:9999/api?bridgeEndpoint=true&enableMultipartFilter=false").routeId("api")
                .setHeader("User-Agent", header("UserAgent"))//使用postman测试时,无法设置User-Agent,使用UserAgent来获取
                .removeHeaders("CamelHttp*")
                .process(new GatewayProcessor())
                .routingSlip(method(GatewayProcessor.class, "route"));
        from("jetty:http://0.0.0.0:9999/healthy").routeId("healthy")
                .log("=========================心跳测试=====================");
        //统一网关入口(web-service)
        from(SIMPLE_ENDPOINT_URI)
                .setHeader(Exchange.BEAN_MULTI_PARAMETER_ARRAY, constant(true))
                .process(new WsProcessor())
                .routingSlip(method(GatewayProcessor.class, "route"))
                .to("bean:wsProcessor?method=responseWs");
        //统一网关错误代码返回
        from("direct:errorHandle")
                .choice()
                .when(header(Exchange.HTTP_URI).contains("paramError")).bean(new ErrorHandle(), "paramError")
                .when(header(Exchange.HTTP_URI).contains("outdateError")).bean(new ErrorHandle(), "outdateError")
                .when(header(Exchange.HTTP_URI).contains("signValidError")).bean(new ErrorHandle(), "signValidError")
                .when(header(Exchange.HTTP_URI).contains("unauthorizedError")).bean(new ErrorHandle(), "unauthorizedError")
                .endChoice();
        //流程健康测试接口
        from("jetty:http://0.0.0.0:9999/healthy").routeId("healthy")
                .log("=========================心跳测试=====================");
    }
}

+ 52 - 0
hos-camel2/src/main/java/camel/monitor/processor/LogOffset.java

@ -0,0 +1,52 @@
package camel.monitor.processor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
/**
 * Created by l4qiang on 2017-06-16.
 */
@Document
public class LogOffset {
    @Id
    private String id;
    @Indexed(unique = true)
    private String name;    //需要采集的目标
    private long offset;
    private Date createTime;
    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 long getOffset() {
        return offset;
    }
    public void setOffset(long offset) {
        this.offset = offset;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}

+ 140 - 0
hos-camel2/src/main/java/camel/monitor/processor/ServiceMonitorService.java

@ -0,0 +1,140 @@
package camel.monitor.processor;
import com.mongodb.MongoClient;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.yihu.hos.core.datatype.DateUtil;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
 * 统计流程信息
 * <p>
 * Created by chenweida on 2016/1/27.
 */
@Service("serviceMonitorService")
public class ServiceMonitorService {
    private static final String DATABASE = "log";
    private static final String SERVICE = "service";
    private static final String SERVICE_METRICS = "serviceMetrics";
    private static final String BUSINESS = "business";
    @Autowired
    private MongoClient mongoClient;
    @Autowired
    private MongoOperations mongoOperations;
    public void monitor() {
        try {
            MongoDatabase database = mongoClient.getDatabase(DATABASE);
            Query query = new Query();
            query.addCriteria(Criteria.where("name").is(SERVICE));  //Service表中已有的数据时间。
            LogOffset offset = mongoOperations.findOne(query, LogOffset.class);
            Date begin = new Date();
            Date end = new Date();
            if (offset != null) {
                long lngOffset = offset.getOffset();
                begin = DateUtil.toDateFromTime(lngOffset);
            }
            DateFormat df = new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss z", Locale.ENGLISH);
//            begin = DateUtil.formatCharDateYMDHMS("2017-06-12 00:00:00");
//            end = DateUtil.formatCharDateYMDHMS("2017-06-20 00:00:00");
            String beginTime = df.format(begin);
            String endTime = df.format(end);
            mapReduce(database, beginTime, endTime);
            AggregateIterable<Document> documents = aggregate(database, beginTime, endTime);
            outPut(database, documents);
            if (offset == null) {
                offset = new LogOffset();
                offset.setName(SERVICE);
            }
            offset.setOffset(end.getTime());
            mongoOperations.save(offset);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void mapReduce(MongoDatabase database, String beginTime, String endTime) {
        Document document = new Document("mapReduce", BUSINESS);
        String mapFunc = "function(){emit(this.breadcrumbId, {fireTime:this.fireTime, createTime:this.createTime, bodyLength:this.bodyLength, tenant:this.tenant, routeId:this.routeId});}";
        document = document.append("map", mapFunc);
        String reduceFunc = "function(key, values){" +
                "var len=values.length;" +
                "var delay=values[len-1].fireTime-values[0].fireTime;" +
                "if(len == 1){delay=values[0].createTime-values[0].fireTime;}" +
                "return {fireTime: values[0].fireTime, in:values[0].bodyLength, out:values[len-1].bodyLength, delay:delay, tenant:values[0].tenant, routeId:values[0].routeId}}";
        document = document.append("reduce", reduceFunc);
        String query = "{fireTime:{$gte:new Date(\"" + beginTime + "\"), $lt:new Date(\"" + endTime + "\")}}";
        document = document.append("query", Document.parse(query));
        document = document.append("out", new Document("merge", SERVICE));
        database.runCommand(document);
    }
    private AggregateIterable<Document> aggregate(MongoDatabase database, String beginTime, String endTime) {
        MongoCollection<Document> serviceCollection = database.getCollection(SERVICE);
        List<Document> pipeline = new ArrayList<>();
        Document match = new Document();
        String query = "{\"value.fireTime\":{$gte:new Date(\"" + beginTime + "\"), $lt:new Date(\"" + endTime + "\")}}";
        match.put("$match", Document.parse(query));
        pipeline.add(match);
        Document group = new Document();
        group.append("_id", Document.parse("{" +
                "year:{\"$year\":\"$value.fireTime\"}," +
                "month:{\"$month\":\"$value.fireTime\"}," +
                "day:{\"$dayOfMonth\":\"$value.fireTime\"}," +
                "hour:{\"$hour\":\"$value.fireTime\"}," +
                "minute:{\"$minute\": \"$value.fireTime\"}" +
                "routeId:\"$value.routeId\"" +
                "tenant:\"$value.tenantId\"" +
                "}"));
        group.append("pv", Document.parse("{$sum:1}"));
        group.append("successful", Document.parse("{$sum:1}"));
        group.append("failure", Document.parse("{$sum:0}"));    //TODO:暂时为空
        group.append("delay", Document.parse("{$sum:\"$value.delay\"}"));
        group.append("avgDelay", Document.parse("{$avg:\"$value.delay\"}"));
        group.append("in", Document.parse("{$sum:\"$value.in\"}"));
        group.append("out", Document.parse("{$sum:\"$value.out\"}"));
        pipeline.add(new Document("$group", group));
        pipeline.add(new Document("$sort", Document.parse("{\"_id\":1}")));
        return serviceCollection.aggregate(pipeline);
    }
    private void outPut(MongoDatabase database, AggregateIterable<Document> documents) {
        MongoCollection<Document> serviceMetrics = database.getCollection(SERVICE_METRICS);
        for (Document document : documents) {
            Document id = (Document) document.get("_id");
            String time = String.format("%04d", (int) id.get("year")) + String.format("%02d", (int) id.get("month")) + String.format("%02d", (int) id.get("day")) +
                    String.format("%02d", (int) id.get("hour")) + String.format("%02d", (int) id.get("minute"));
            document.put("time", time);
            document.put("routeId", id.get("routeId"));
            document.put("tenant", id.get("tenant"));
            document.putIfAbsent("avgDelay", 0);
            Document query = new Document("_id", id);
            Document update = new Document("$set", document);
            serviceMetrics.updateOne(query, update, new UpdateOptions().upsert(true));
        }
    }
}

+ 16 - 0
hos-camel2/src/main/java/camel/monitor/route/MonitorRouterBulider.java

@ -0,0 +1,16 @@
package camel.monitor.route;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
/**
 * Created by l4qiang on 2017-06-16.
 */
@Component
public class MonitorRouterBulider extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("quartz://monitor/monitorTimer?cron=0 0/1 * * * ?")
                .to("bean:serviceMonitorService?method=monitor");
    }
}

+ 32 - 0
hos-camel2/src/main/java/camel/terminal/tenant/processor/AddMongoProcessor.java

@ -0,0 +1,32 @@
package camel.terminal.tenant.processor;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
/**
 * 
 * Created by Zdm on 2016/7/13.
 */
public class AddMongoProcessor implements Processor {
    private String database;
    private String collection;
    public AddMongoProcessor(String database, String collection) {
        this.database = database;
        this.collection = collection;
    }
    @Override
    public void process(Exchange exchange) throws Exception {
//        Map record = exchange.getIn().getBody(Map.class);
//        Map info = new HashMap();
//        info.put("database", database);
//        info.put("collection", collection);
//        ObjectId objectId = (ObjectId) record.get("_id");
//        record.put("_id", objectId.toString());
//        JSONArray jsonArray = new JSONArray();
//        jsonArray.put(info);
//        jsonArray.put(record);
//        exchange.getIn().setBody(jsonArray);
    }
}

+ 1 - 1
hos-broker/src/main/java/com/yihu/hos/broker/common/processor/CrawlerMongoProcessor.java

@ -1,4 +1,4 @@
package com.yihu.hos.broker.common.processor;
package camel.terminal.tenant.processor;
import com.mongodb.BasicDBObject;
import com.mongodb.QueryOperators;

+ 39 - 0
hos-camel2/src/main/java/camel/terminal/tenant/route/CrawlerMongoRouter.java

@ -0,0 +1,39 @@
package camel.terminal.tenant.route;
import camel.terminal.tenant.processor.AddMongoProcessor;
import camel.terminal.tenant.processor.CrawlerMongoProcessor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
@Component
public class CrawlerMongoRouter extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("quartz://myGroup/myTimerName?cron=0 0/1 * * * ? ")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=runtime&collection=arbiterServer&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("runtime", "arbiterServer"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=runtime&collection=brokerServer&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("runtime", "brokerServer"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=runtime&collection=endpoint&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("runtime", "endpoint"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=log&collection=server&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("log", "server"))
            .to("bean:centerMongoService?method=save")
            .process(new CrawlerMongoProcessor())
            .to("mongodb:mongo?database=log&collection=service&operation=findOneByQuery")
            .split(simple("${body}"))
            .process(new AddMongoProcessor("log", "service"))
            .to("bean:centerMongoService?method=save");
    }
}

+ 13 - 5
hos-camel2/src/main/resources/application.yml

@ -8,10 +8,6 @@ server:
---
spring:
  profiles: dev
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.1.221:8761/eureka/
  data:
    mongodb:
      host: 172.19.103.57
@ -20,4 +16,16 @@ eureka:
      password: esb
      authenticationDatabase: admin
      database: log
      gridFsDatabase: dfs
      gridFsDatabase: dfs
  activemq:
    broker-url: tcp://172.19.103.57:61616
    user: admin
    password: admin
eureka:
  client:
    serviceUrl:
      defaultZone: http://192.168.1.221:8761/eureka/
hos:
  https:
    enable: false

+ 1 - 1
hos-camel2/src/main/resources/logback-spring.xml

@ -17,7 +17,7 @@
        <InitialContextFactoryName>
            org.apache.activemq.jndi.ActiveMQInitialContextFactory
        </InitialContextFactoryName>
        <ProviderURL>tcp://172.19.103.42:61616</ProviderURL>
        <ProviderURL>tcp://172.19.103.57:61616</ProviderURL>
        <userName>admin</userName>
        <password>admin</password>
        <TopicConnectionFactoryBindingName>ConnectionFactory</TopicConnectionFactoryBindingName>

二进制
hos-camel2/src/main/resources/tomcat.keystore


+ 24 - 0
hos-configuration/.gitignore

@ -0,0 +1,24 @@
target/
!.mvn/wrapper/maven-wrapper.jar
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/

二进制
hos-configuration/.mvn/wrapper/maven-wrapper.jar


+ 1 - 0
hos-configuration/.mvn/wrapper/maven-wrapper.properties

@ -0,0 +1 @@
distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.0/apache-maven-3.5.0-bin.zip

+ 6 - 0
hos-configuration/README.md

@ -0,0 +1,6 @@
# hos-configuration
配置服务使用了Spring Cloud Config Server,采用Git来管理配置参数。
# 客户端使用
需要配置bootstrap.yml文件,其中`spring.applicaction.name`对应为Git中的文件名。
# TODO
暂未启用

+ 225 - 0
hos-configuration/mvnw

@ -0,0 +1,225 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven2 Start Up Batch script
#
# Required ENV vars:
# ------------------
#   JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
#   M2_HOME - location of maven2's installed home dir
#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
#     e.g. to debug Maven itself, use
#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
  if [ -f /etc/mavenrc ] ; then
    . /etc/mavenrc
  fi
  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi
fi
# OS specific support.  $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
  CYGWIN*) cygwin=true ;;
  MINGW*) mingw=true;;
  Darwin*) darwin=true
    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
    if [ -z "$JAVA_HOME" ]; then
      if [ -x "/usr/libexec/java_home" ]; then
        export JAVA_HOME="`/usr/libexec/java_home`"
      else
        export JAVA_HOME="/Library/Java/Home"
      fi
    fi
    ;;
esac
if [ -z "$JAVA_HOME" ] ; then
  if [ -r /etc/gentoo-release ] ; then
    JAVA_HOME=`java-config --jre-home`
  fi
fi
if [ -z "$M2_HOME" ] ; then
  ## resolve links - $0 may be a link to maven's home
  PRG="$0"
  # need this for relative symlinks
  while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
      PRG="$link"
    else
      PRG="`dirname "$PRG"`/$link"
    fi
  done
  saveddir=`pwd`
  M2_HOME=`dirname "$PRG"`/..
  # make it fully qualified
  M2_HOME=`cd "$M2_HOME" && pwd`
  cd "$saveddir"
  # echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
  [ -n "$M2_HOME" ] &&
    M2_HOME=`cygpath --unix "$M2_HOME"`
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Migwn, ensure paths are in UNIX format before anything is touched
if $mingw ; then
  [ -n "$M2_HOME" ] &&
    M2_HOME="`(cd "$M2_HOME"; pwd)`"
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
  # TODO classpath?
fi
if [ -z "$JAVA_HOME" ]; then
  javaExecutable="`which javac`"
  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
    # readlink(1) is not available as standard on Solaris 10.
    readLink=`which readlink`
    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
      if $darwin ; then
        javaHome="`dirname \"$javaExecutable\"`"
        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
      else
        javaExecutable="`readlink -f \"$javaExecutable\"`"
      fi
      javaHome="`dirname \"$javaExecutable\"`"
      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
      JAVA_HOME="$javaHome"
      export JAVA_HOME
    fi
  fi
fi
if [ -z "$JAVACMD" ] ; then
  if [ -n "$JAVA_HOME"  ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
      # IBM's JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
    else
      JAVACMD="$JAVA_HOME/bin/java"
    fi
  else
    JAVACMD="`which java`"
  fi
fi
if [ ! -x "$JAVACMD" ] ; then
  echo "Error: JAVA_HOME is not defined correctly." >&2
  echo "  We cannot execute $JAVACMD" >&2
  exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
  echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
  if [ -z "$1" ]
  then
    echo "Path not specified to find_maven_basedir"
    return 1
  fi
  basedir="$1"
  wdir="$1"
  while [ "$wdir" != '/' ] ; do
    if [ -d "$wdir"/.mvn ] ; then
      basedir=$wdir
      break
    fi
    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
    if [ -d "${wdir}" ]; then
      wdir=`cd "$wdir/.."; pwd`
    fi
    # end of workaround
  done
  echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
  if [ -f "$1" ]; then
    echo "$(tr -s '\n' ' ' < "$1")"
  fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
  exit 1;
fi
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
echo $MAVEN_PROJECTBASEDIR
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
  [ -n "$M2_HOME" ] &&
    M2_HOME=`cygpath --path --windows "$M2_HOME"`
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
  $MAVEN_OPTS \
  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

+ 143 - 0
hos-configuration/mvnw.cmd

@ -0,0 +1,143 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements.  See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership.  The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License.  You may obtain a copy of the License at
@REM
@REM    http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied.  See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven2 Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM     e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%

+ 63 - 0
hos-configuration/pom.xml

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.yihu.hos</groupId>
	<artifactId>hos-configuration</artifactId>
	<version>1.3.0</version>
	<packaging>jar</packaging>
	<name>hos-configuration</name>
	<description>Demo project for Spring Boot</description>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Dalston.SR1</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-config-server</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

+ 14 - 0
hos-configuration/src/main/java/com/yihu/hos/configuration/HosConfigurationApplication.java

@ -0,0 +1,14 @@
package com.yihu.hos.configuration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@EnableConfigServer
@SpringBootApplication
public class HosConfigurationApplication {
	public static void main(String[] args) {
		SpringApplication.run(HosConfigurationApplication.class, args);
	}
}

+ 32 - 0
hos-configuration/src/main/resources/application.yml

@ -0,0 +1,32 @@
server:
  port: 8010
---
spring:
  profiles: dev
  cloud:
    config:
      server:
        git:
          uri: http://192.168.1.220:10080/CoSharp/config
          default-label: dev
---
spring:
  profiles: test
  cloud:
    config:
      server:
        git:
          uri: http://192.168.1.220:10080/CoSharp/config
          default-label: test
---
spring:
  profiles: prod
  cloud:
    config:
      server:
        git:
          uri: http://192.168.1.220:10080/CoSharp/config
          default-label: master

+ 16 - 0
hos-configuration/src/test/java/com/yihu/hos/configuration/HosConfigurationApplicationTests.java

@ -0,0 +1,16 @@
package com.yihu.hos.configuration;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class HosConfigurationApplicationTests {
	@Test
	public void contextLoads() {
	}
}

+ 1 - 0
hos-dfs/pom.xml

@ -57,6 +57,7 @@
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-version}</version>
                <executions>
                    <execution>
                        <goals>

+ 0 - 1
hos-logger/src/main/java/com/yihu/hos/logger/camel/processor/EHRLogProcesser.java

@ -1,7 +1,6 @@
package com.yihu.hos.logger.camel.processor;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;

+ 7 - 0
hos-logger/src/main/java/com/yihu/hos/logger/configuration/LoggerConfiguration.java

@ -20,6 +20,9 @@ public class LoggerConfiguration {
    @Value("${logger.ehr}")
    private String ehrLogDir;
    @Value("${logger.tenant}")
    private String tenant;
    public String getBrokerURL() {
        return brokerURL;
    }
@ -35,4 +38,8 @@ public class LoggerConfiguration {
    public String getEhrLogDir() {
        return ehrLogDir;
    }
    public String getTenant() {
        return tenant;
    }
}

+ 13 - 0
hos-logger/src/main/java/com/yihu/hos/logger/model/HosLog.java

@ -32,6 +32,7 @@ public class HosLog {
    private String fireTimeSource;
    private Date updateTime;
    private Date createTime;
    private String tenant;
    public HosLog() {
        this.createTime = DateUtil.getSysDateTime();
@ -176,4 +177,16 @@ public class HosLog {
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public String getMessageId() {
        return messageId;
    }
    public String getTenant() {
        return tenant;
    }
    public void setTenant(String tenant) {
        this.tenant = tenant;
    }
}

+ 5 - 3
hos-logger/src/main/java/com/yihu/hos/logger/service/HosLogService.java

@ -1,8 +1,7 @@
package com.yihu.hos.logger.service;
import ch.qos.logback.classic.spi.ILoggingEvent;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.logger.configuration.LoggerConfiguration;
import com.yihu.hos.logger.model.HosLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
@ -16,10 +15,12 @@ import java.util.Map;
 */
@Component("businessLogService")
public class HosLogService {
    private static final Logger logger = LoggerFactory.getLogger(HosLogService.class);
    @Autowired
    private MongoOperations mongoOperations;
    @Autowired
    private LoggerConfiguration loggerConfiguration;
    /**
     * camel.exchangeId The exchange id
     * camel.messageId The message id
@ -47,6 +48,7 @@ public class HosLogService {
        hosLog.setCamelContextId(mdcPropertyMap.get("camel.contextId"));
        hosLog.setBody(event.getMessage());
        hosLog.setBodyLength(event.getMessage().length());
        hosLog.setTenant(loggerConfiguration.getTenant());
        mongoOperations.save(hosLog);
    }

+ 2 - 1
hos-logger/src/main/resources/application.yml

@ -16,7 +16,7 @@ camel:
spring:
  profiles: dev
  activemq:
      broker-url: tcp://172.19.103.42:61616
      broker-url: tcp://172.19.103.57:61616
      user: admin
      password: admin
  data:
@ -30,4 +30,5 @@ spring:
      gridFsDatabase: dfs
logger:
  tenant: jkzl
  ehr: e:/file

+ 6 - 9
hos-parent/pom.xml

@ -12,7 +12,7 @@
    <properties>
        <hos-version>1.3.0</hos-version>
        <spring-boot-version>1.4.5.RELEASE</spring-boot-version>
        <spring-cloud-version>1.2.6.RELEASE</spring-cloud-version>
        <camel-version>2.18.3</camel-version>
        <cxf-version>3.1.9</cxf-version>
        <hawtio-version>1.5.0</hawtio-version>
@ -248,14 +248,6 @@
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Camel -->
            <dependency>
                <groupId>org.apache.camel</groupId>
@ -290,6 +282,11 @@
                <artifactId>camel-jms</artifactId>
                <version>${camel-version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-stream</artifactId>
                <version>${camel-version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-http4</artifactId>

+ 1 - 0
hos-rest/pom.xml

@ -107,6 +107,7 @@
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-version}</version>
                <executions>
                    <execution>
                        <goals>

+ 13 - 0
hos-web-framework/src/main/java/com/yihu/hos/web/framework/constant/ArchivesConstant.java

@ -0,0 +1,13 @@
package com.yihu.hos.web.framework.constant;
/**
 * @author HZY
 * @since 2017/06/23.
 */
public interface ArchivesConstant {
    String ACTIVE_MQ = "runtime.archive";   //active-mq消息,arbiter到broker的通讯
    String CAMEL_COMPONENT = "event.archive";  //camel组件命名
    String CAMEL_ENDPOINT = CAMEL_COMPONENT + ":queue:" + ACTIVE_MQ;   //camel的Endpoint
}

+ 33 - 0
hos-web-framework/src/main/java/com/yihu/hos/web/framework/util/controller/BaseController.java

@ -44,6 +44,39 @@ public class BaseController extends AbstractController {
    public BaseController() {
    }
    public Envelop getEnvelop(String json){
        try {
            return objectMapper.readValue(json,Envelop.class);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     *将envelop中的DetailList串转化为模板对象集合
     *Envelop envelop = objectMapper.readValue(resultStr,Envelop.class)
     * modelList = envelop.getDetailModelList()
     * @param modelList
     * @param targets
     * @param targetCls
     * @param <T>
     * @return
     */
    public <T> Collection<T> getEnvelopList(List modelList, Collection<T> targets, Class<T> targetCls) {
        try {
            for (Object aModelList : modelList) {
                String objJsonData = objectMapper.writeValueAsString(aModelList);
                T model = objectMapper.readValue(objJsonData, targetCls);
                targets.add(model);
            }
            return targets;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    protected ModelAndView handleRequestInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        return null;
    }

+ 6 - 0
pom.xml

@ -211,6 +211,11 @@
            <artifactId>joda-time</artifactId>
            <version>2.9.9</version>
        </dependency>
        <dependency>
            <groupId>com.yihu.core</groupId>
            <artifactId>ehr-dbhelper</artifactId>
            <version>1.1.9</version>
        </dependency>
    </dependencies>
    <build>
@ -218,6 +223,7 @@
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot-version}</version>
                <executions>
                    <execution>
                        <goals>

+ 12 - 3
src/main/java/com/yihu/hos/common/CommonPageController.java

@ -50,12 +50,20 @@ public class CommonPageController extends BaseController {
    public String adminUrl;
    @Value("${service-gateway.portalUrl}")
    public String portalUrl;
    @Value("${service-gateway.oauth2authorize}")
    private String oauth2authUrl;
    @Autowired
    private AuthenticateService authenticateService;
    private RemoteShellService remoteShellService;
    @RequestMapping("testPage")
    public String initial(Model model) {
        model.addAttribute("contentPage", "/common/test");
        return "pageView";
    }
    /*
    登录页面
     */
@ -286,13 +294,14 @@ public class CommonPageController extends BaseController {
                             @ApiParam(name = "token")
                             @RequestParam String token) throws Exception {
        try {
            HttpSession session = request.getSession();
            Map<String, String> params = new HashMap<>();
            params.put("clientId", clientId);
            params.put("accessToken", token);
            HTTPResponse response = HttpClientKit.post(portalUrl + "/oauth/validToken", params);
            HTTPResponse response = HttpClientKit.post(oauth2authUrl + "/oauth/validToken", params);
            if (response.getStatusCode() != 200) {
                System.out.println("验证 token 请求失败!");
                System.out.println("验证 token 请求失败,token:"+token);
                return failed("验证 token 请求失败!");
            }
@ -300,7 +309,7 @@ public class CommonPageController extends BaseController {
            if ((Boolean) map.get("successFlg")) {
                AccessToken accessToken = objectMapper.readValue(objectMapper.writeValueAsString(map.get("data")), AccessToken.class);
                String loginName = accessToken.getUser();
                session.setAttribute("ehrUser",loginName);
                //验证通过。赋值session中的用户信息
                HTTPResponse userResponse = HttpClientKit.get(adminUrl + "/users/" + loginName, params);
                Envelop result =  this.objectMapper.readValue(userResponse.getBody(), Envelop.class);

+ 4 - 0
src/main/java/com/yihu/hos/common/constants/ContextAttributes.java

@ -10,6 +10,10 @@ public interface ContextAttributes {
    String USER_INFO = "userInfo";
    String TENANT_SESSION = "tenantSession";//session缓存的的schema 和 tenant
    String GLOBAL_DB = "global_db";//平台管理中心库
    String BASE_DB = "base_db";//基础库,用于新增租户后的库复制
    String TABLE_NAME = "TABLE_NAME";//表名
    String SHELL_RESPONSE = "shell_repsonse.";

+ 0 - 3
src/main/java/com/yihu/hos/filter/SessionOutTimeFilter.java

@ -25,7 +25,6 @@ public class SessionOutTimeFilter extends OncePerRequestFilter {
        if (path.indexOf("/login") != -1
                || path.indexOf("/system/loginAction") != -1
                || path.indexOf("/error") != -1
                || path.indexOf("/monitor") != -1
                || path.indexOf("/test.jsp") != -1
                || path.indexOf("/logoutAction") != -1
                || path.indexOf(httpServletRequest.getContextPath() + "/static-dev") != -1
@ -34,8 +33,6 @@ public class SessionOutTimeFilter extends OncePerRequestFilter {
                || path.indexOf(httpServletRequest.getContextPath() + "/process") != -1
                || path.indexOf("swagger") != -1
                || path.indexOf(httpServletRequest.getContextPath() + "/v2/api-docs") != -1
                || path.indexOf("/tenant/down") != -1
                || path.indexOf("/tenant/upload") != -1
                || path.indexOf("/tenant/delFile") != -1
                || path.indexOf(httpServletRequest.getContextPath() + "/mobile") != -1) {
            filterChain.doFilter(httpServletRequest, httpServletResponse);

+ 23 - 14
src/main/java/com/yihu/hos/monitor/controller/ServiceMonitorController.java

@ -1,10 +1,15 @@
package com.yihu.hos.monitor.controller;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.monitor.service.ServiceMonitorService;
import com.yihu.hos.system.service.FlowManager;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.web.framework.model.Result;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@ -24,8 +29,9 @@ import javax.servlet.http.HttpSession;
@Controller("ServiceMonitorController")
@RequestMapping("/monitor/service")
public class ServiceMonitorController {
    private static Logger logger = LoggerFactory.getLogger(ServiceMonitorController.class);
    @Resource(name = ServiceMonitorService.BEAN_ID)
    @Autowired
    private ServiceMonitorService monitorService;
    @Resource(name = FlowManager.BEAN_ID)
@ -52,8 +58,10 @@ public class ServiceMonitorController {
            @RequestParam(value = "endTime") String endTime) {
        try {
            HttpSession session = request.getSession();
            return monitorService.metrics(session,id, beginTime, endTime);
            TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
            return monitorService.serviceMetrics(tenantSession.getTenant(), id, beginTime, endTime);
        } catch (Exception e) {
            logger.error(e.getMessage());
            return Result.error("获取服务指标失败");
        }
    }
@ -65,6 +73,7 @@ public class ServiceMonitorController {
        try {
            return monitorService.getServiceTreeList();
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("获取服务树列表失败");
        }
    }
@ -76,12 +85,12 @@ public class ServiceMonitorController {
    public Result serviceStatus(
            HttpServletRequest request,
            @ApiParam(name = "routeCode", value = "流程Code", required = true)
            @RequestParam(value = "routeCode") Integer routeCode ) {
            @RequestParam(value = "routeCode") Integer routeCode) {
        try {
            boolean succ = flowManager.serviceOpenOrPause(routeCode,0);
            if (succ){
            boolean succ = flowManager.serviceOpenOrPause(routeCode, 0);
            if (succ) {
                return Result.success("获取服务状态成功");
            }else {
            } else {
                return Result.error("获取服务状态失败");
            }
        } catch (Exception e) {
@ -96,12 +105,12 @@ public class ServiceMonitorController {
    public Result startService(
            HttpServletRequest request,
            @ApiParam(name = "flowId", value = "流程ID", required = true)
            @RequestParam(value = "flowId") Integer flowId ) {
            @RequestParam(value = "flowId") Integer flowId) {
        try {
            boolean succ = flowManager.serviceOpenOrPause(flowId,1);
            if (succ){
            boolean succ = flowManager.serviceOpenOrPause(flowId, 1);
            if (succ) {
                return Result.success("开启服务成功");
            }else {
            } else {
                return Result.error("开启服务失败");
            }
        } catch (Exception e) {
@ -115,12 +124,12 @@ public class ServiceMonitorController {
    public Result stopService(
            HttpServletRequest request,
            @ApiParam(name = "flowId", value = "流程ID", required = true)
            @RequestParam(value = "flowId") Integer flowId ) {
            @RequestParam(value = "flowId") Integer flowId) {
        try {
            boolean succ = flowManager.serviceOpenOrPause(flowId,0);
            if (succ){
            boolean succ = flowManager.serviceOpenOrPause(flowId, 0);
            if (succ) {
                return Result.success("暂停服务成功");
            }else {
            } else {
                return Result.error("暂停服务失败");
            }
        } catch (Exception e) {

+ 1 - 1
src/main/java/com/yihu/hos/monitor/dao/ServiceMonitorDao.java

@ -36,7 +36,7 @@ public class ServiceMonitorDao extends SQLGeneralDAO {
    }
    public List<SystemServiceFlow> getFlowsByType(String type) throws Exception {
        return (List<SystemServiceFlow>) super.hibernateTemplate.find("from SystemServiceFlow s where s.type=?",type);
        return (List<SystemServiceFlow>) super.hibernateTemplate.find("from SystemServiceFlow s where s.fileType=?",type);
    }
}

+ 30 - 27
src/main/java/com/yihu/hos/monitor/service/ServerMonitorService.java

@ -14,6 +14,7 @@ import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpSession;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -35,23 +36,24 @@ public class ServerMonitorService {
    @Autowired
    private Mongo mongo;
    public Result getMonitorList(HttpSession session,String host, String type, String beginTime, String endTime) {
        TenantSession tenantSession = (TenantSession)session.getAttribute(ContextAttributes.TENANT_SESSION);
    public Result getMonitorList(HttpSession session, String host, String type, String beginTime, String endTime) {
        TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
        mongoOperations = new MongoTemplate(mongo, MONITOR);
        DBCollection envCollection = mongoOperations.getCollection(SERVER);
        Timestamp begin = DateUtil.toTimestamp(beginTime);
        Timestamp end = DateUtil.toTimestamp(endTime);
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{
                        new BasicDBObject().append("tenant",tenantSession.getTenant()),
                        new BasicDBObject().append("host",host),
                        new BasicDBObject().append("type",type),
                        new BasicDBObject().append("create_time",
                                new BasicDBObject().append(QueryOperators.GTE, DateUtil.toTimestamp(beginTime))),
                        new BasicDBObject().append("create_time",
                                new BasicDBObject().append(QueryOperators.LT, DateUtil.toTimestamp(endTime)))});
                        new BasicDBObject().append("tenant", tenantSession.getTenant()),
                        new BasicDBObject().append("host", host),
                        new BasicDBObject().append("type", type),
                        new BasicDBObject("create_time", new BasicDBObject().append(QueryOperators.GTE, begin)
                                .append(QueryOperators.LT, end))
                });
        List<DBObject> result = new ArrayList<>();
        DBCursor cursor = envCollection.find(queryObject);
        while(cursor.hasNext()) {
        while (cursor.hasNext()) {
            DBObject dbObject = cursor.next();
            dbObject.removeField("_id");
            result.add(dbObject);
@ -62,20 +64,21 @@ public class ServerMonitorService {
        return actionResult;
    }
    public Result getMonitorDetail(HttpSession session,String host, String type, String date) {
        TenantSession tenantSession = (TenantSession)session.getAttribute(ContextAttributes.TENANT_SESSION);
    public Result getMonitorDetail(HttpSession session, String host, String type, String date) {
        TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
        mongoOperations = new MongoTemplate(mongo, MONITOR);
        DBCollection envCollection = mongoOperations.getCollection(SERVER);
        Timestamp timestamp = DateUtil.toTimestamp(date);
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{
                        new BasicDBObject().append("tenant",tenantSession.getTenant()),
                        new BasicDBObject().append("tenant", tenantSession.getTenant()),
                        new BasicDBObject().append("host", host),
                        new BasicDBObject().append("type", type),
                        new BasicDBObject().append("create_time",new BasicDBObject().append(QueryOperators.LTE, DateUtil.toTimestamp(date)))});
                        new BasicDBObject("create_time", new BasicDBObject(QueryOperators.LTE, timestamp))});
        Map result = new HashMap<>();
        DBCursor cursor = envCollection.find(queryObject).sort(new BasicDBObject("create_time",-1)).limit(1);
        while(cursor.hasNext()) {
        DBCursor cursor = envCollection.find(queryObject).sort(new BasicDBObject("create_time", -1)).limit(1);
        while (cursor.hasNext()) {
            DBObject dbObject = cursor.next();
            dbObject.removeField("_id");
            result = dbObject.toMap();
@ -87,19 +90,18 @@ public class ServerMonitorService {
    }
    public Result getHosts() {
        List<Map<String,Object>> result = new ArrayList<>();
        List<Map<String, Object>> result = new ArrayList<>();
        mongoOperations = new MongoTemplate(mongo, MONITOR);
        DBCollection envCollection = mongoOperations.getCollection(HOST);
        DBCursor cursor = envCollection.find();
        while(cursor.hasNext()) {
        while (cursor.hasNext()) {
            DBObject dbObject = cursor.next();
            Map<String,Object> hostMap = new HashMap<>();
            hostMap.put("host",dbObject.get("host"));
            hostMap.put("name",dbObject.get("name"));
            Map<String, Object> hostMap = new HashMap<>();
            hostMap.put("host", dbObject.get("host"));
            hostMap.put("name", dbObject.get("name"));
            result.add(hostMap);
            hostMap=null;
            hostMap = null;
        }
        ActionResult actionResult = new ActionResult();
        actionResult.setData(result);
@ -108,27 +110,28 @@ public class ServerMonitorService {
    /**
     * 獲取服務器列表 树
     *
     * @return
     * @throws Exception
     */
    public Result getServerTreeList(HttpSession session) throws Exception {
        List<TreeView> treeList = new ArrayList<>();
        TenantSession tenantSession = (TenantSession)session.getAttribute(ContextAttributes.TENANT_SESSION);
        TenantSession tenantSession = (TenantSession) session.getAttribute(ContextAttributes.TENANT_SESSION);
        mongoOperations = new MongoTemplate(mongo, MONITOR);
        DBCollection envCollection = mongoOperations.getCollection(HOST);
        //查询条件
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{
                        new BasicDBObject().append("tenant",tenantSession.getTenant())});
                        new BasicDBObject().append("tenant", tenantSession.getTenant())});
        DBCursor cursor = envCollection.find(queryObject);
        while(cursor.hasNext()) {
        while (cursor.hasNext()) {
            DBObject dbObject = cursor.next();
            TreeView rootTree = new TreeView();
            rootTree.setId(dbObject.get("host").toString());
            rootTree.setPid("-1");
            rootTree.setText(dbObject.get("name").toString()+"/"+dbObject.get("host").toString());
            rootTree.setText(dbObject.get("name").toString() + "/" + dbObject.get("host").toString());
            treeList.add(rootTree);
        }

+ 27 - 106
src/main/java/com/yihu/hos/monitor/service/ServiceMonitorService.java

@ -1,110 +1,62 @@
package com.yihu.hos.monitor.service;
import com.mongodb.*;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.core.datatype.CollectionUtil;
import com.yihu.hos.monitor.dao.ServiceMonitorDao;
import com.yihu.hos.system.model.SystemServiceEndpoint;
import com.yihu.hos.system.model.SystemServiceFlow;
import com.yihu.hos.system.model.SystemServiceFlowConfig;
import com.yihu.hos.system.service.FlowManager;
import com.yihu.hos.tenant.model.TenantSession;
import com.yihu.hos.web.framework.constant.ServiceFlowConstant;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.model.TreeView;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2016/1/27.
 */
@Service("ServiceMonitorService")
@Service
public class ServiceMonitorService {
    public static final String BEAN_ID = "ServiceMonitorService";
    public static final String dbName = "log";
    public static final String tableName = "service";
    public static final String serviceFlow = "serviceFlow";
    public static final String tableName = "serviceMetrics";
    public static final String configuration = "configuration";
    @Autowired
    private MongoOperations mongoOperations;
    @Autowired
    private Mongo mongo;
    private MongoClient mongoClient;
    @Autowired
    private ServiceMonitorDao serviceMonitorDao;
    @Resource(name = FlowManager.BEAN_ID)
    private FlowManager flowManager;
    public Result metrics(HttpSession session,String id, String beginTime, String endTime) throws Exception {
        String name;
        String code;
        String description;
        TenantSession tenantSession = (TenantSession)session.getAttribute(ContextAttributes.TENANT_SESSION);
        if (id.contains("flow")) {
            Integer flowId = Integer.parseInt(id.replace("flow", ""));
            SystemServiceFlow systemServiceFlow = serviceMonitorDao.getFlowById(flowId);
            name = systemServiceFlow.getName();
            code = systemServiceFlow.getCode();
            description = systemServiceFlow.getDescription();
        } else {
            String endpointId =id.replace("endpoint", "");
            SystemServiceEndpoint systemServiceEndpoint = serviceMonitorDao.getEndpointById(endpointId);
            name = systemServiceEndpoint.getName();
            code = systemServiceEndpoint.getCode();
            description = systemServiceEndpoint.getDescription();
        }
        JSONObject serviceInfo = new JSONObject();
        serviceInfo.put("name", name);
        serviceInfo.put("description", description);
        mongoOperations = new MongoTemplate(mongo, dbName);
    public Result serviceMetrics(String tenant, String routeId, String beginTime, String endTime) throws Exception {
        MongoTemplate mongoOperations = new MongoTemplate(mongoClient, dbName);
        DBCollection metrics = mongoOperations.getCollection(tableName);
        BasicDBObject queryObject = new BasicDBObject().append(QueryOperators.AND,
                new BasicDBObject[]{
                        new BasicDBObject().append("create_time",
                                new BasicDBObject().append(QueryOperators.GTE, beginTime)),
                        new BasicDBObject().append("create_time",
                                new BasicDBObject().append(QueryOperators.LT, endTime)),
                        new BasicDBObject("name", code),
                        new BasicDBObject("tenant", tenantSession.getTenant())});
                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.GTE, beginTime)),
                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.LT, endTime))
//                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.GTE, "201706120000")),
//                        new BasicDBObject().append("time", new BasicDBObject().append(QueryOperators.LT, "201706200000"))
                        , new BasicDBObject("routeId", routeId)
                        , new BasicDBObject("tenant", tenant)
                });
        JSONObject result = new JSONObject();
        DBCursor cursor = metrics.find(queryObject);
        JSONArray bandwidth = new JSONArray();
        JSONArray qps = new JSONArray();
        JSONArray usage = new JSONArray();
        JSONArray delay = new JSONArray();
        while(cursor.hasNext()) {
        JSONArray data = new JSONArray();
        while (cursor.hasNext()) {
            DBObject dbObject = cursor.next();
            dbObject.removeField("_id");
            String type = dbObject.get("type").toString();
            switch (type) {
                case "bandwidth" : bandwidth.put(dbObject);break;
                case "qps" : qps.put(dbObject);break;
                case "usage" : usage.put(dbObject);break;
                case "delay" : delay.put(dbObject);break;
            }
            data.put(dbObject);
        }
        result.put("bandwidth", bandwidth);
        result.put("qps", qps);
        result.put("usage", usage);
        result.put("delay", delay);
        result.put("serviceInfo", serviceInfo);
        result.put("data", data);
        return Result.success(result.toString());
    }
@ -112,52 +64,21 @@ public class ServiceMonitorService {
        List<TreeView> treeList = new ArrayList<>();
        List<SystemServiceFlow> flowList = serviceMonitorDao.getFlowsByType(ServiceFlowConstant.CLASS);
        List<SystemServiceFlowConfig> flowEndpointList = serviceMonitorDao.getAllFlowEndpoints();
        List<SystemServiceEndpoint> endpointList = serviceMonitorDao.getAllEndpoints();
        Map<Integer, List<String>> flowEndpointMap = new HashMap<>();
        Map<String, SystemServiceEndpoint> endpointMap = new HashMap<>();
        for (SystemServiceFlowConfig systemServiceFlowConfig : flowEndpointList) {
            List<String> endpointIdList;
            if (flowEndpointMap.containsKey(systemServiceFlowConfig.getFlowId())) {
                endpointIdList = flowEndpointMap.get(systemServiceFlowConfig.getFlowId());
            } else {
                endpointIdList = new ArrayList<>();
            }
            endpointIdList.add(systemServiceFlowConfig.getEndpointId());
            flowEndpointMap.put(systemServiceFlowConfig.getFlowId(), endpointIdList);
        }
        for (SystemServiceEndpoint endpoint : endpointList) {
            endpointMap.put(endpoint.getId(), endpoint);
        }
        for (SystemServiceFlow flow : flowList) {
                TreeView rootTree = new TreeView();
                rootTree.setIschecked(false);
                rootTree.setId("flow" + flow.getId());
                rootTree.setPid("-1");
                rootTree.setText(flow.getName());
                treeList.add(rootTree);
                List<String> endpointIdList = flowEndpointMap.get(flow.getId());
                if (!CollectionUtil.isEmpty(endpointIdList)) {
                    for (String endpointId : endpointIdList) {
                        SystemServiceEndpoint endpoint = endpointMap.get(endpointId);
                        TreeView childTree = new TreeView();
                        childTree.setIschecked(false);
                        childTree.setId("endpoint" + endpoint.getId());
                        childTree.setPid("flow" + flow.getId());
                        childTree.setText(endpoint.getName());
                        treeList.add(childTree);
                    }
            }
            TreeView rootTree = new TreeView();
            rootTree.setIschecked(false);
            rootTree.setId("flow" + flow.getId());
            rootTree.setPid("-1");
            rootTree.setText(flow.getName());
            treeList.add(rootTree);
        }
        JSONArray jsonArray = new JSONArray(treeList);
        JSONArray jsonArray = new JSONArray(treeList);
        return Result.success(jsonArray.toString());
    }
    public boolean serviceStatus(String routeCode){
    public boolean serviceStatus(String routeCode) {
        boolean succ = false;
//        MongoDatabase db = mongoConfig.mongoClient().getDatabase(configuration);
//        MongoCollection<Document> collection = db.getCollection(serviceFlow);

+ 58 - 0
src/main/java/com/yihu/hos/qc/controller/ReportController.java

@ -0,0 +1,58 @@
package com.yihu.hos.qc.controller;
import com.yihu.hos.web.framework.util.controller.BaseController;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Created by llh on 2017/5/9.
 */
@Controller
@RequestMapping("/report")
//@SessionAttributes(SessionAttributeKeys.CurrentUser)
public class ReportController extends BaseController {
    @Value("${service-gateway.adminUrl}")
    private String comUrl;
    @Value("${service-gateway.oauth2authorize}")
    private String oauth2authUrl;
    @Value("${service-gateway.oauth2RedictUrl}")
    private String oauth2RedictUrl;
    @Value("${service-gateway.oauth2ReportClientId}")
    private String oauth2ReportClientId;
    /**
     * 单点登录-质控报告获取
     * @param request
     * @param response
     * @param user      门户登录用户
     * @throws Exception
     */
    @RequestMapping(value = "signin",method = RequestMethod.GET)
    public void signin(HttpServletRequest request,HttpServletResponse response, String user) throws Exception
    {
//        response.sendRedirect("http://localhost:10260/oauth/authorize?response_type=token&client_id=111111&redirect_uri=http://localhost:8011/login/test&user=me");
       String redict = oauth2authUrl + "oauth/authorize?response_type=token&client_id="+oauth2ReportClientId+"&redirect_uri="+oauth2RedictUrl+"&scope=read&user="+user;
        response.sendRedirect(redict);
    }
    /**
     * 趋势分析页
     * @param model
     * @return
     */
    @RequestMapping("initial")
    public String initial(Model model) {
        model.addAttribute("contentPage", "/qc/report/trendAnalysis");
        return "pageView";
    }
}

+ 22 - 4
src/main/java/com/yihu/hos/tenant/controller/TenantController.java

@ -10,12 +10,9 @@ import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@ -189,7 +186,7 @@ public class TenantController extends BaseController{
    @ResponseBody
    public Result createDB(HttpServletRequest request,
                           @ApiParam(name = "dbName", value = "数据库名称", allowMultiple = true)
                           @RequestPart() String dbName) {
                           @RequestParam() String dbName) {
        try {
            tenantService.createDB(dbName);
@ -199,4 +196,25 @@ public class TenantController extends BaseController{
            return Result.error("新建数据库失败!");
        }
    }
    /**
     * 数据库复制
     * @param dbName
     * @param dbConfig
     * @return
     * @throws Exception
     */
    @RequestMapping("dataBaseCopy")
    @ResponseBody
    public Result requestTest(
            @ApiParam(name = "dbName", value = "源数据库名称", allowMultiple = true)
            @RequestParam(value = "dbName") String dbName,
            @ApiParam(name = "dbConfig", value = "源数据库连接", allowMultiple = true)
            @RequestParam(value = "dbConfig")  String dbConfig) throws Exception {
        Result result = tenantService.copyBaseTables(dbName, dbConfig);
        return result;
    }
}

+ 1 - 1
src/main/java/com/yihu/hos/tenant/dao/TenantDao.java

@ -60,7 +60,7 @@ public class TenantDao extends SQLGeneralDAO {
    }
    public void createDB(String dbName) throws Exception {
        String sql = "CREATE DATABASE "+dbName;
        String sql = "CREATE DATABASE IF NOT EXISTS "+dbName;
        super.execute(sql);
    }

+ 48 - 3
src/main/java/com/yihu/hos/tenant/service/TenantService.java

@ -1,22 +1,25 @@
package com.yihu.hos.tenant.service;
import com.yihu.ehr.dbhelper.jdbc.DBHelper;
import com.yihu.hos.common.constants.ContextAttributes;
import com.yihu.hos.config.MongoConfig;
import com.yihu.hos.core.encrypt.DES;
import com.yihu.hos.core.log.Logger;
import com.yihu.hos.core.log.LoggerFactory;
import com.yihu.hos.services.ServiceMycatEventService;
import com.yihu.hos.tenant.dao.TenantDao;
import com.yihu.hos.tenant.model.DBInfoModel;
import com.yihu.hos.tenant.model.TenantModel;
import com.yihu.hos.web.framework.constant.MycatConstant;
import com.yihu.hos.web.framework.constant.SqlConstants;
import com.yihu.hos.web.framework.model.Result;
import com.yihu.hos.web.framework.model.bo.ServiceMycat;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -31,6 +34,7 @@ import java.util.UUID;
public class TenantService {
    public static final String BEAN_ID = "TenantService";
    static private final Logger logger = LoggerFactory.getLogger(TenantService.class);
    @Autowired
    private TenantDao tenantDao;
@ -139,4 +143,45 @@ public class TenantService {
        return Result.success("新建成功");
    }
    @Transactional
    public Result createDB(DBHelper targetDb,String targetDbName) throws Exception {
        //创建数据库
        String createDb = "CREATE DATABASE IF NOT EXISTS "+targetDbName;
        targetDb.execute(createDb);
        return Result.success("新建成功");
    }
    /**
     *  //TODO 库复制  (测试,可删除)
     * 数据库复制
     * @param targetDbName  目标数据库名称
     * @param targetDbUri   目标数据库连接信息
     * @return
     */
    public Result copyBaseTables(String targetDbName,String targetDbUri) throws Exception {
        String baseDbUri = "jdbc:mysql://172.19.103.57:3306/base_db?user=root&password=xmjkzl";//源数据库连接
        DBHelper originDb = new DBHelper(ContextAttributes.BASE_DB, baseDbUri);
        DBHelper targetDb = new DBHelper(targetDbName, targetDbUri);
        //创建数据库
        createDB(targetDb,targetDbName);
        //查询源数据库所有表名
        String tablesSql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '"+ ContextAttributes.BASE_DB+"';";
        //创建表
        List<JSONObject> tableNames = originDb.query(tablesSql);
        for (JSONObject jsonObject:tableNames){
            try {
            String tableName = jsonObject.getString(ContextAttributes.TABLE_NAME);
            boolean createTable = targetDb.execute(SqlConstants.CREATE_TABLE + targetDbName+"."+tableName + SqlConstants.LIKE + ContextAttributes.BASE_DB+"."+tableName);
            boolean insertData = targetDb.execute(SqlConstants.INSERT_INTO +  targetDbName+"."+tableName + SqlConstants.SELECT + "*" + SqlConstants.FROM + ContextAttributes.BASE_DB+"."+tableName);
            System.out.println(insertData);
            }catch (Exception e){
                logger.error("执行异常:"+e.getMessage());
            }
        }
        //新增表数据
        return Result.success("新建成功");
    }
}

+ 7 - 1
src/main/resources/application.yml

@ -62,7 +62,10 @@ hos:
service-gateway:
  portalUrl: http://192.168.1.221:10280/api/v1.0/portal
  adminUrl: http://192.168.1.221:10000/api/v1.0/admin
  url: http://172.19.103.70:9999/api
  oauth2authorize: http://192.168.131.106:10260/
  oauth2RedictUrl: http://192.168.131.106:8083/ehr/login/signinReport
  oauth2ReportClientId: 2YTOSRI0tw
  url: http://172.19.103.37:9999/api
---
spring:
  profiles: test
@ -108,4 +111,7 @@ hos:
service-gateway:
  portalUrl: http://192.168.1.221:10280/api/v1.0/portal
  adminUrl: http://192.168.1.221:10000/api/v1.0/admin
  oauth2authorize: http://192.168.1.221:10260/
  oauth2RedictUrl: http://192.168.1.221:8080/ehr/login/signinReport
  oauth2ReportClientId: 2YTOSRI0tw
  url: http://172.19.103.37:9999/api

+ 3 - 2
src/main/webapp/WEB-INF/ehr/commons/jsp/commonFoot.jsp

@ -7,11 +7,12 @@
<script src="${staticRoot}/lib/ligerui/custom/ligerOverwrite.js"></script>
<script src="${staticRoot}/lib/ligerui/plugins/customTree.js"></script>
<script src="${staticRoot}/lib/bootstrap/js/bootstrap.min.js"></script>
<script src="${staticRoot}/lib/module/dateExt.js"></script>
<script src="${staticRoot}/lib/module/util.js"></script>
<script src="${staticRoot}/lib/plugin/formEx/attrscan.js"></script>
<script src="${staticRoot}/lib/plugin/formEx/readonly.js"></script>
<script src="${staticRoot}/lib/plugin/tips/tips.js"></script>
<script src="${staticRoot}/lib/plugin/validate/jValidate.js"></script>
<%--<script src="${contextRoot}/develop/lib/plugin/echarts/echarts-all.js"></script>--%>
<script src="${contextRoot}/develop/lib/plugin/echarts-2.2.7/echarts-all.js"></script>

+ 1 - 1
src/main/webapp/WEB-INF/ehr/jsp/common/index.jsp

@ -54,7 +54,7 @@
    <div position="center" class="m-index-center" id="divIndexContent">
    </div>
<input type="hidden" id="ehrUser" value="${ehrUser}">
</div>

+ 13 - 5
src/main/webapp/WEB-INF/ehr/jsp/common/indexJs.jsp

@ -4,7 +4,7 @@
    // 设置jQuery Ajax全局的参数
    $.ajaxSetup({
        type: "POST",
        type: "GET",
        error: function (jqXHR, textStatus, errorThrown) {
            isLogin();
            switch (jqXHR.status) {
@ -66,7 +66,7 @@
            });
            $(".l-layout-left").css({background: "#dce6f0"})
            var ehrUser = $("#ehrUser").val();
            var tenantManager = {} ;
            var userRole = localStorage.getItem("userRole");
            //菜单列表
@ -115,6 +115,10 @@
                //质控规则管理
                {id: 8, text: '质控管理', icon: '${staticRoot}/images/index/menu05.png'},
                {id: 81, pid: 8, text: '规则管理', url: '${contextRoot}/rule/initial', icon: '${staticRoot}/images/index/Ins_icon.png'},
                <%--{id: 82, pid: 8, text: '质控报告', url: '${contextRoot}/oauth2/report', icon: '${staticRoot}/images/index/Ins_icon.png'},--%>
                {id: 82, pid: 8, text: '质控报告', url: '${contextRoot}/report/signin?user='+ehrUser, icon: '${staticRoot}/images/index/Ins_icon.png'},
                <%--{id: 83, pid: 8, text: '档案入库情况', url: '${contextRoot}/report/initialLs', icon: '${staticRoot}/images/index/Ins_icon.png'},--%>
                //系统配置
                {id: 9, text: '系统配置', icon: '${staticRoot}/images/index/menu07.png'},
                {id: 91, pid: 9, text: '系统参数', url: '${contextRoot}/param/initial', icon: '${staticRoot}/images/index/Ins_icon.png'},
@ -157,7 +161,12 @@
                nodeWidth: 176,
                onSelect: function (obj) {
                	if (obj.data.url != undefined) {
                        me.openMenu(obj);
                        debugger
                        if(obj.data.url.indexOf("report/signin") >= 0){
                            me.loadIframePage(obj.data.url);//质控页面
                        }else{
                            me.openMenu(obj);
                        }
                    }
                	//选中子菜单时默认选中父菜单
                	if(obj.data.children == undefined){
@ -189,8 +198,7 @@
					});
                },
                onClick:function(obj){
                	
					
                },
                //一级节点不可选中
                onAfterAppend: function () {

+ 3 - 0
src/main/webapp/WEB-INF/ehr/jsp/common/signinJs.jsp

@ -11,6 +11,7 @@
            {
                //获取accrss_token
                var tokenString =hash.substring(1,hash.indexOf("&"));
                debugger
                var token = tokenString.substr(hash.indexOf("="));
                //自动登录
                $.ajax({
@ -23,6 +24,8 @@
                    success: function (data) {
                        if(data.successFlg){
                            debugger
                            window.localStorage.setItem("ehrUser", token);
                            location.href = '${contextRoot}/'+tenantName + '/oauth2/index?loginName='+data.obj.user;
                        }else{
                            location.href = '${contextRoot}/common/tokenValidFail';

+ 20 - 0
src/main/webapp/WEB-INF/ehr/jsp/common/test.jsp

@ -0,0 +1,20 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="utf-8"%>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<div id="divErrorContent" style="background: url('${staticRoot}/images/404.png') no-repeat;">
</div>
<div id="main" style="width: 60%;height:400px;"></div>
<%-- 详细数据 --%>
<div id="detail" class="ml50 mt20">
</div>
</div>

+ 38 - 0
src/main/webapp/WEB-INF/ehr/jsp/common/testJs.jsp

@ -0,0 +1,38 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="utf-8"%>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<script>
    var option = {
        series: [
            {
                name: "3的指数",
                type: "line",
                data: []
            },
            {
                name: "2的指数",
                type: "line",
                data: []
            }
        ]
    }
    var myChart = echarts.init(document.getElementById('main'));
    // 基于准备好的dom,初始化echarts实例
    // 指定图表的配置项和数据
    myChart.setOption(option);
    myChart.on('mouseover', function (params) {
//                 getInfo(host,type,params.name);
        console.log(params);
    });
</script>

+ 0 - 0
src/main/webapp/WEB-INF/ehr/jsp/common/tokenValidFailJs.jsp


+ 0 - 74
src/main/webapp/WEB-INF/ehr/jsp/monitor/monitor.jsp

@ -1,74 +0,0 @@
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" %>
<html>
<head>
	<meta charset="utf-8">
	<title>数据收集监控</title>
	<%@include file="/WEB-INF/ehr/commons/jsp/commonHeader.jsp" %>
    <script>
        //加载js模块组件
        seajs.use(['jquery','i18n','app/monitor/monitor'], function ($,i18n, Monitor) {
        });
    </script>
</head>
<body>
	<div class="" id="message"></div>
	<div id="conditionAreaT" class="f-mt10 f-ml10" align="left">
        <table>
            <tr>
                <td>
                    <select name="table" class="f-w200" id="hosTableList" placeholder="请选择数据集">
                    </select>
                </td>
                <td>
                    <input type="text" class="f-ml10" name="rowkey" id="rowkey" value="" style="width: 240px" class="form-control"  placeholder="请输入rowkey">
                </td>
                <td>
                    <input type="button" id="btnQuery" class="btn btn-warning f-ml10" value="查询数据">
                    <input type="button" id="btnStatic" class="btn btn-warning f-ml10" value="统计数据集入库">
                    <input type="button" id="btnVerify" class="btn btn-warning f-ml10" value="数据核对">
                    <a href="http://tool.oschina.net/codeformat/json"  class="f-ml10"  target="_blank">结果格式化</a>
                </td>
            </tr>
        </table>
	</div>
	<div id="ResultAreaT" class="f-mt10 f-ml10" align="left">
		<table>
			<tr>
				<textarea id="result" rows="10" style="width:90%"></textarea>
			</tr>
		</table>
	</div>
	<div id="conditionAreaD" class="f-mt10 f-ml10" align="left">
		<table>
			<tr>
				<td>
					<a>开始时间:</a>
				</td>
				<td>
					<input size="16" type="text" name="start" id="start" value="" placeholder="设置开始时间" class="form_datetime">
				</td>
				<td>
					<a class="f-ml10">结束时间:</a>
				</td>
				<td>
					<input size="16" type="text" name="end" id="end" value="" placeholder="设置结束时间" class="form_datetime">
				</td>
                <td>
                    <input type="button" id="btnQueryReport" class="btn btn-warning f-ml10" value="生成数据入库报告">
                </td>
			</tr>
		</table>
	</div>
	<div id="ResultAreaD" class="f-mt10 f-ml10" align="left">
		<div id="tblStaticResult">
			<!-- 结果集列表区域 -->
		</div>
	</div>
</body>
</html>

+ 1 - 1
src/main/webapp/WEB-INF/ehr/jsp/monitor/server/sEnvManage.jsp

@ -55,7 +55,7 @@
            <div class="c-item" data-item="net">网络</div>
        </div>
            <%-- echarts 数据--%>
        <div id="main" style="width: 60%;height:400px;"></div>
        <div id="main" style="width: 60%;height:400px;border-bottom: 1px solid #999999 "></div>
            <%-- 详细数据 --%>
            <div id="detail" class="ml50 mt20">

+ 259 - 218
src/main/webapp/WEB-INF/ehr/jsp/monitor/server/sEnvManageJs.jsp

@ -1,11 +1,11 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<script src="${contextRoot}/develop/lib/plugin/echarts/echarts-all.js"></script>
<%--<script src="${contextRoot}/develop/echarts/echarts.js"></script>--%>
<script>
    var host ="";
    var host = "";
    var myChart;
    $(function () {
        myChart = echarts.init(document.getElementById('main'));
        getServerTree();
        //l-layout-left
        //初始化layout
@ -25,65 +25,62 @@
            width: 240,
            showTime: true
        });
        $("#repeatStartTime").ligerDateEditor("setValue",prevDate());
        $("#repeatEndTime").ligerDateEditor("setValue",nowDate());
        $("#repeatStartTime").ligerDateEditor("setValue", prevDate());
        $("#repeatEndTime").ligerDateEditor("setValue", nowDate());
        /*初始化时间控件-end*/
        //初始化图表
        var type = $(".div-menu .active").attr("data-item");
        var beginTime = $("#repeatStartTime").ligerDateEditor("getValue");
        var endTime = $("#repeatEndTime").ligerDateEditor("getValue");
        getServerInfo(host,type,beginTime,endTime);
        getInfo(host,type,endTime);
        getServerInfo(host, type, beginTime, endTime);
        getInfo(host, type, endTime);
        //搜索按钮事件
        $(".m-form-control").on("click","#btnSearch",function(){
        $(".m-form-control").on("click", "#btnSearch", function () {
            var beginTime = $("#repeatStartTime").ligerDateEditor("getValue");
            var endTime = $("#repeatEndTime").ligerDateEditor("getValue");
            if(beginTime=="" && $endTime=="")
            {
            if (beginTime == "" && $endTime == "") {
                $.ligerDialog.error("请选择起始结束时间!");
                return false;
            }
            if(beginTime > endTime)
            {
            if (beginTime > endTime) {
                $.ligerDialog.error("开始时间不能大于结束时间!");
                return false;
            }
            var type = $(".div-menu .active").attr("data-item");
            //获取服务器监控数据
            getServerInfo(host,type,beginTime,endTime);
            getInfo(host,type,endTime);
            getServerInfo(host, type, beginTime, endTime);
            getInfo(host, type, endTime);
        })
        //选项卡切换时间
        $(".div-menu").on("click",".c-item",function(){
        $(".div-menu").on("click", ".c-item", function () {
            $(".div-menu .c-item").removeClass("active");
            $(this).addClass("active");
            var type = $(this).attr("data-item");
            //获取服务器监控数据
            var beginTime = $("#repeatStartTime").ligerDateEditor("getValue");
            var endTime = $("#repeatEndTime").ligerDateEditor("getValue");
            if(beginTime > endTime)
            {
            if (beginTime > endTime) {
                $.ligerDialog.error("开始时间不能大于结束时间!");
                myChart.clear();
                return false;
            }
            getServerInfo(host,type,beginTime,endTime);
            getInfo(host,type,endTime);
            getServerInfo(host, type, beginTime, endTime);
            getInfo(host, type, endTime);
        })
    });
    function getServerTree(){
    function getServerTree() {
        var serviceTree = $("#div_wrapper_left_ul_resourcetree");
        //初始化树
        $.ajax({
            type: "GET",
            dataType : "json",
            dataType: "json",
            url: "${contextRoot}/monitor/server/trees",
            async: false,
            success: function (msg) {
@ -102,14 +99,12 @@
                            host = obj.data.id;
                            var beginTime = $("#repeatStartTime").ligerDateEditor("getValue");
                            var endTime = $("#repeatEndTime").ligerDateEditor("getValue");
                            if(beginTime=="" && $endTime=="")
                            {
                            if (beginTime == "" && $endTime == "") {
                                $.ligerDialog.error("请选择起始结束时间!");
                                return false;
                            }
                            if(beginTime > endTime)
                            {
                            if (beginTime > endTime) {
                                $.ligerDialog.error("开始时间不能大于结束时间!");
                                return false;
@ -118,8 +113,8 @@
                            var type = $(".div-menu .active").attr("data-item");
                            //获取服务器监控数据
                            getServerInfo(host,type,beginTime,endTime);
                            getInfo(host,type,endTime);
                            getServerInfo(host, type, beginTime, endTime);
                            getInfo(host, type, endTime);
                        },
                        onSuccess: function (data) {
                            alert(2222);
@ -131,18 +126,17 @@
        });
    }
    function getServerInfo(host,type,beginTime,endTime){
    function getServerInfo(host, type, beginTime, endTime) {
        $.ajax({
            type: "GET",
            url : "${contextRoot}/monitor/server/usage",
            dataType : "json",
            data:{host:host,type:type,beginTime:beginTime,endTime:endTime},
            cache:false,
            success :function(re){
                if(re.successFlg) {
            url: "${contextRoot}/monitor/server/usage",
            dataType: "json",
            data: {host: host, type: type, beginTime: beginTime, endTime: endTime},
            cache: false,
            success: function (re) {
                if (re.successFlg) {
                    //TODO 设置图表
                    switch(type)
                    {
                    switch (type) {
                        case "cpu":
                            env.cpuInfo(re);
                            break;
@ -159,19 +153,19 @@
                            break;
                    }
                }
                else{
                else {
                    $.ligerDialog.error(re.message);
                }
            },
            error :function(data){
                $.ligerDialog.error("Status:"+data.status +"(" +data.statusText+")");
            error: function (data) {
                $.ligerDialog.error("Status:" + data.status + "(" + data.statusText + ")");
            }
        });
    }
    var env ={
    var env = {
        $resourceTree: $("#div_wrapper_left_ul_resourcetree"),//树对象
    init:function(){
        init: function () {
            //初始化树
            var resourceTree = this.$resourceTree;
            $.ajax({
@ -193,96 +187,116 @@
                }
            });
        },
        cpuInfo:function(re){
         var data = re.data;
         if(data!=null && data.length>0)
         {
             var x = [];
             var y1=[];
             var y2=[];
             myChart = echarts.init(document.getElementById('main'));
             for(var i=0;i<data.length;i++)
             {
        cpuInfo: function (re) {
            var data = re.data;
            var option = {
                series: [
                    {
                        name: '系统使用率',
                        type: 'line',
                        data: []
                    },
                    {
                        name: '总使用率',
                        type: 'line',
                        data: []
                    }
                ]
            }
            myChart = echarts.init(document.getElementById('main'));
            if (data != null && data.length > 0) {
                var x = [];
                var y1 = [];
                var y2 = [];
                for (var i = 0; i < data.length; i++) {
//                 var create_date = data[i].create_date.substring(11,16);
//                 x.push(create_date);
                 x.push(data[i].create_date);
                 y1.push(data[i].data.sysPerc);
                 y2.push(data[i].data.totalPerc);
             }
             // 基于准备好的dom,初始化echarts实例
             // 指定图表的配置项和数据
             var option = {
                 title: {
                     text: ' CPU指标',
                     left: 'center'
                 },
                 tooltip: {
                     trigger: 'axis',
                     formatter: '{b} <br/>{a0}: {c0}% <br/>{a1}: {c1}%'
                 },
                 dataZoom : {
                     show : true,
                     start : 0,
                     end : 100
                 },
                 legend: {
                     left: 'left',
                     data: ['系统使用率','总使用率']
                 },
                 xAxis: {
                     type: 'category',
                     name: '时间',
                     splitLine: {show: false},
                     data: x
                 },
                 grid: {
                     left: '3%',
                     right: '4%',
                     bottom: '3%',
                     containLabel: true
                 },
                 yAxis: {
                     type: 'log',
                     name: '使用率'
                 },
                 series: [
                     {
                         name: '系统使用率',
                         type: 'line',
                    x.push(data[i].create_date);
                    y1.push(data[i].data.sysPerc);
                    y2.push(data[i].data.totalPerc);
                }
                // 基于准备好的dom,初始化echarts实例
                // 指定图表的配置项和数据
                option = {
                    title: {
                        text: ' CPU指标',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'axis',
                        formatter: '{b} <br/>{a0}: {c0}% <br/>{a1}: {c1}%'
                    },
                    dataZoom: {
                        show: true,
                        start: 0,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['系统使用率', '总使用率']
                    },
                    xAxis: {
                        type: 'category',
                        name: '时间',
                        splitLine: {show: false},
                        data: x
                    },
                    grid: {
                        left: '3%',
                        right: '4%',
                        bottom: '3%',
                        containLabel: true
                    },
                    yAxis: {
                        type: 'log',
                        name: '使用率'
                    },
                    series: [
                        {
                            name: '系统使用率',
                            type: 'line',
//                         itemStyle: {normal: {areaStyle: {type: 'default'}}},
                         data: y1
                     },
                     {
                         name: '总使用率',
                         type: 'line',
                            data: y1
                        },
                        {
                            name: '总使用率',
                            type: 'line',
//                         itemStyle: {normal: {areaStyle: {type: 'default'}}},
                         data: y2
                     }
                 ]
             };
             myChart.setOption(option);
             myChart.on('mouseover', function (params) {
                            data: y2
                        }
                    ]
                };
                myChart.setOption(option);
                myChart.on('mouseover', function (params) {
//                 getInfo(host,type,params.name);
                 console.log(params);
             });
             //设置图例下方的信息
         }
         else{
            //TODO 清除数据处理
             myChart.clear();
         }
    },
        memory:function(re){
                    console.log(params);
                });
                //设置图例下方的信息
            }
            else {
                //TODO 清除数据处理
                myChart.setOption(option);
                myChart.clear();
            }
        },
        memory: function (re) {
            var data = re.data;
            if(data!=null && data.length>0)
            {
            var option = {
                series: [
                    {
                        name: '使用率',
                        type: 'line',
                        data: []
                    }
                ]
            };
            myChart = echarts.init(document.getElementById('main'));
            if (data != null && data.length > 0) {
                var x = [];
                var y1=[];
                var y2=[];
                myChart = echarts.init(document.getElementById('main'));
                for(var i=0;i<data.length;i++)
                {
                var y1 = [];
                var y2 = [];
                for (var i = 0; i < data.length; i++) {
//                    var create_date = data[i].create_date.substring(11,16);
                    x.push(data[i].create_date);
                    y1.push(data[i].data.usedPerc);
@ -290,7 +304,7 @@
                }
                // 基于准备好的dom,初始化echarts实例
                // 指定图表的配置项和数据
                var option = {
                option = {
                    title: {
                        text: ' 内存使用率指标',
                        left: 'center'
@ -299,10 +313,10 @@
                        trigger: 'axis',
                        formatter: '{b} <br/>{a0}: {c0}% '
                    },
                    dataZoom : {
                        show : true,
                        start : 0,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 0,
                        end: 100
                    },
                    legend: {
                        left: 'left',
@ -334,26 +348,39 @@
                };
                myChart.setOption(option);
            }
            else{
               //TODO 清除数据
            else {
                //TODO 清除数据
                myChart.setOption(option);
                myChart.clear();
            }
        },
        files:function(re){
        files: function (re) {
            var data = re.data;
            if(data!=null && data.length>0)
            {
            myChart = echarts.init(document.getElementById('main'));
            var option = {
                series: [
                    {
                        name: '已使用',
                        type: 'line',
                        data: []
                    },
                    {
                        name: '总量',
                        type: 'line',
                        data: []
                    }
                ]
            };
            if (data != null && data.length > 0) {
                var x = [];
                var y1=[];
                var y2=[];
                myChart = echarts.init(document.getElementById('main'));
                for(var i=0;i<data.length;i++)
                {
                var y1 = [];
                var y2 = [];
                for (var i = 0; i < data.length; i++) {
                    var count = 0
                    var total =0;
                    var total = 0;
//                    var create_date = data[i].create_date.substring(11,16);
                    x.push(data[i].create_date);
                    for(var j=0;j<data[i].data.length;j++){
                    for (var j = 0; j < data[i].data.length; j++) {
                        count += data[i].data[j].used;
                        total += data[i].data[j].total;
                    }
@ -362,7 +389,7 @@
                }
                // 基于准备好的dom,初始化echarts实例
                // 指定图表的配置项和数据
                var option = {
                option = {
                    title: {
                        text: ' 磁盘指标',
                        left: 'center'
@ -372,10 +399,10 @@
                        formatter: '{b} <br/>{a0}: {c0} G <br/>{a1}: {c1} G'
                    },
                    dataZoom : {
                        show : true,
                        start : 0,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 0,
                        end: 100
                    },
                    legend: {
                        left: 'left',
@ -412,22 +439,36 @@
                };
                myChart.setOption(option);
            }
            else{
            else {
                //TODO 清除数据
                myChart.setOption(option);
                myChart.clear();
            }
        },
        net:function(re){
        net: function (re) {
            var me = this;
            var data = re.data;
            if(data!=null && data.length>0)
            {
            var option = {
                series: [
                    {
                        name: '接收',
                        type: 'line',
                        data: []
                    },
                    {
                        name: '发送',
                        type: 'line',
                        data: []
                    }
                ]
            };
            myChart = echarts.init(document.getElementById('main'));
            if (data != null && data.length > 0) {
                var x = [];
                var y1=[];
                var y2=[];
                myChart = echarts.init(document.getElementById('main'));
                for(var i=0;i<data.length;i++)
                {
                var y1 = [];
                var y2 = [];
                for (var i = 0; i < data.length; i++) {
//                    var create_date = data[i].create_date.substring(11,16);
                    x.push(data[i].create_date);
                    y1.push(data[i].data.rxbps);
@ -435,7 +476,7 @@
                }
                // 基于准备好的dom,初始化echarts实例
                // 指定图表的配置项和数据
                var option = {
                option = {
                    title: {
                        text: ' 网络指标',
                        left: 'center'
@ -444,16 +485,16 @@
                        trigger: 'axis',
                        formatter: '{b} <br/>{a0}: {c0} kbps <br/>{a1}: {c1} kbps'
                    },
                    dataZoom : {
                        show : true,
                        start : 0,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 0,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['接收', '发送']
                    },
                        xAxis: {
                    xAxis: {
                        type: 'category',
                        name: '时间',
                        splitLine: {show: false},
@ -484,8 +525,9 @@
                };
                myChart.setOption(option);
            }
            else{
               //TODO 清除数据
            else {
                //TODO 清除数据
                myChart.setOption(option);
                myChart.clear();
            }
        }
@ -493,7 +535,7 @@
    /*当前时间*/
    function nowDate(){
    function nowDate() {
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
@ -501,78 +543,77 @@
        var hour = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        return year + '-' + month + '-' + day  + ' ' + hour + ':' + minute + ':' + second;
        return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
    }
    /*前一天时间*/
    function prevDate(){
    function prevDate() {
        var now = new Date();
        var date = new Date(now.getTime() -  24 * 3600 * 1000);
        var date = new Date(now.getTime() - 24 * 3600 * 1000);
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        return year + '-' + month + '-' + day  + ' 00:00:00';
        return year + '-' + month + '-' + day + ' 00:00:00';
    }
    /* **************************动态DIV添加************************ */
    /*  详情数据*/
    function getInfo(host,type,date){
    function getInfo(host, type, date) {
        $.ajax({
            type: "GET",
            url : "${contextRoot}/monitor/server/detail",
            dataType : "json",
            data:{host:host,type:type,date:date},
            cache:false,
            success :function(re){
                if(re.successFlg) {
            url: "${contextRoot}/monitor/server/detail",
            dataType: "json",
            data: {host: host, type: type, date: date},
            cache: false,
            success: function (re) {
                if (re.successFlg) {
                    //TODO 设置详情数据
                    var data = re.data;
                    if(data!=null && !isEmpty(data)){
                    if (data != null && !isEmpty(data)) {
                        var envData = data.data;
                        var $envInfo = $("#detail");
                        var html;
                        switch(type)
                        {
                        switch (type) {
                            case "cpu":
                                html= getCpuHtml(envData);
                                html = getCpuHtml(envData);
                                break;
                            case "memory":
                                html= getMemoryHtml(envData);
                                html = getMemoryHtml(envData);
                                break;
                            case "files":
                                html= getFilesHtml(envData);
                                html = getFilesHtml(envData);
                                break;
                            case "net":
                                html= getNetHtml(envData);
                                html = getNetHtml(envData);
                                break;
                            default:
                                break;
                        }
                        $envInfo.html(html);
                    }else{
                    } else {
                        myChart.clear();
                    }
                }
                else{
                else {
                    $.ligerDialog.error(re.message);
                }
            },
            error :function(data){
                $.ligerDialog.error("Status:"+data.status +"(" +data.statusText+")");
            error: function (data) {
                $.ligerDialog.error("Status:" + data.status + "(" + data.statusText + ")");
            }
        });
    }
    function getCpuHtml(envData){
    function getCpuHtml(envData) {
        var html = "<div class=\"div-item\">\n" +
                "                    <div>\n" +
                "                        <div class=\"d-item\">利用率</div>" +
//                "                        <div class=\"d-item\">速度</div>" +
                "                    </div>" +
                "                    <div class=\"mb20\">\n" +
                "                        <div class=\"c-content\">"+envData.userPerc+"%</div>" +
                "                        <div class=\"c-content\">" + envData.userPerc + "%</div>" +
//                "                        <div class=\"c-content\">2.18GHZ</div>\n" +
                "                    </div>\n" +
//                "                    <div>\n" +
@ -591,11 +632,11 @@
//                "                    </div>\n" +
                "                </div>\n" +
                "                <div class=\"div-item\">\n" +
                "                    <div class=\"div-right-item\">最大速度:<span class=\"f-fs14 c-fwb\">"+envData.model.substring(envData.model.length-8)+"</span></div>\n" +
                "                    <div class=\"div-right-item\">最大速度:<span class=\"f-fs14 c-fwb\">" + envData.model.substring(envData.model.length - 8) + "</span></div>\n" +
//                "                    <div class=\"div-right-item\">插槽:<span class=\"f-fs14 c-fwb\">1</span></div>\n" +
                "                    <div class=\"div-right-item\">内核:<span class=\"f-fs14 c-fwb\">"+envData.quantity+"</span></div>\n" +
                "                    <div class=\"div-right-item\">逻辑处理器:<span class=\"f-fs14 c-fwb\">"+envData.totalCores+"</span></div>\n" +
                "                    <div class=\"div-right-item\">物理处理器:<span class=\"f-fs14 c-fwb\">"+envData.totalSockets+"</span></div>\n" +
                "                    <div class=\"div-right-item\">内核:<span class=\"f-fs14 c-fwb\">" + envData.quantity + "</span></div>\n" +
                "                    <div class=\"div-right-item\">逻辑处理器:<span class=\"f-fs14 c-fwb\">" + envData.totalCores + "</span></div>\n" +
                "                    <div class=\"div-right-item\">物理处理器:<span class=\"f-fs14 c-fwb\">" + envData.totalSockets + "</span></div>\n" +
//                "                    <div class=\"div-right-item\">L1缓存:<span class=\"f-fs14 c-fwb\">121KB</span></div>\n" +
//                "                    <div class=\"div-right-item\">L2缓存:<span class=\"f-fs14 c-fwb\">512KB</span></div>\n" +
//                "                    <div class=\"div-right-item\">L3缓存:<span class=\"f-fs14 c-fwb\">3.0MB</span></div>\n" +
@ -604,73 +645,73 @@
        return html;
    }
    function getMemoryHtml(envData){
    function getMemoryHtml(envData) {
        var html = "<div class=\"div-item\">\n" +
                "                    <div>\n" +
                "                        <div class=\"d-item\">已使用</div>" +
                "                        <div class=\"d-item\">可用</div>" +
                "                    </div>" +
                "                    <div class=\"mb20\">\n" +
                "                        <div class=\"c-content\">"+envData.used+"G</div>" +
                "                        <div class=\"c-content\">"+envData.free+"G</div>\n" +
                "                        <div class=\"c-content\">" + envData.used + "G</div>" +
                "                        <div class=\"c-content\">" + envData.free + "G</div>\n" +
                "                    </div>\n" +
                "                    <div>\n" +
                "                        <div class=\"d-item\">交换区使用量</div>\n" +
                "                        <div class=\"d-item\">交换区可用量</div>\n" +
                "                    </div>\n" +
                "                    <div class=\"mb20\">\n" +
                "                        <div class=\"c-content\">"+envData.swapUsed+"G</div>\n" +
                "                        <div class=\"c-content\">"+envData.swapFree+"G</div>\n" +
                "                        <div class=\"c-content\">" + envData.swapUsed + "G</div>\n" +
                "                        <div class=\"c-content\">" + envData.swapFree + "G</div>\n" +
                "                    </div>\n" +
                "                </div>\n" +
                "                <div class=\"div-item\">\n" +
                "            <div>" +
        "                        <div class=\"d-item\">总量:</div>\n" +
        "                        <div class=\"d-item\">交换区总量:</div>\n" +
        "                    </div>\n" +
        "                    <div class=\"mb20\">\n" +
        "                        <div class=\"c-content\">"+envData.total+"G</div>\n" +
        "                        <div class=\"c-content\">"+envData.swapTotal+"G</div>\n" +
        "                    </div>\n" +
                "                        <div class=\"d-item\">总量:</div>\n" +
                "                        <div class=\"d-item\">交换区总量:</div>\n" +
                "                    </div>\n" +
                "                    <div class=\"mb20\">\n" +
                "                        <div class=\"c-content\">" + envData.total + "G</div>\n" +
                "                        <div class=\"c-content\">" + envData.swapTotal + "G</div>\n" +
                "                    </div>\n" +
                "                </div>";
        return html;
    }
    function getFilesHtml(envData){
        var html ="";
    function getFilesHtml(envData) {
        var html = "";
        var total = "";
        var use ="";
        if(envData.length>0){
            for(var i=0;i<envData.length;i++){
                total+="<div class=\"div-right-item\">"+envData[i].devName+"盘总量:<span class=\"f-fs14 c-fwb\">"+envData[i].total+"G</span></div>";
                use+="<div class=\"div-right-item\">"+envData[i].devName+"盘已使用:<span class=\"f-fs14 c-fwb\">"+envData[i].used+"G</span></div>";
        var use = "";
        if (envData.length > 0) {
            for (var i = 0; i < envData.length; i++) {
                total += "<div class=\"div-right-item\">" + envData[i].devName + "盘总量:<span class=\"f-fs14 c-fwb\">" + envData[i].total + "G</span></div>";
                use += "<div class=\"div-right-item\">" + envData[i].devName + "盘已使用:<span class=\"f-fs14 c-fwb\">" + envData[i].used + "G</span></div>";
            }
            html = "<div class=\"div-item\">" +total+"</div><div class=\"div-item\">"+use+"</div>";
            html = "<div class=\"div-item\">" + total + "</div><div class=\"div-item\">" + use + "</div>";
        }
        return html;
    }
    function getNetHtml(envData){
    function getNetHtml(envData) {
        var html = "<div class=\"div-item\">\n" +
                "                    <div>\n" +
                "                        <div class=\"d-item\">发送</div>" +
                "                    </div>" +
                "                    <div class=\"mb20\">\n" +
                "                        <div class=\"c-content\">"+envData.txbps+" kbps</div>" +
                "                        <div class=\"c-content\">" + envData.txbps + " kbps</div>" +
                "                    </div>\n" +
                "                    <div>\n" +
                "                        <div class=\"d-item\">接收</div>\n" +
                "                    </div>\n" +
                "                    <div class=\"mb20\">\n" +
                "                        <div class=\"c-content\">"+envData.rxbps+" kbps</div>\n" +
                "                        <div class=\"c-content\">" + envData.rxbps + " kbps</div>\n" +
                "                    </div>\n" +
                "                </div>\n" +
                "                <div class=\"div-item\">\n" +
                "                    <div class=\"div-right-item\">適配器名:<span class=\"f-fs14 c-fwb\">"+envData.name+"</span></div>\n" +
                "                    <div class=\"div-right-item\">连接类型:<span class=\"f-fs14 c-fwb\">"+envData.type+"</span></div>\n" +
                "                    <div class=\"div-right-item\">IP地址:<span class=\"f-fs14 c-fwb\">"+envData.address+"</span></div>\n" +
                "                    <div class=\"div-right-item\">Mac地址:<span class=\"f-fs14 c-fwb\">"+envData.mac+"</span></div>\n" +
                "                    <div class=\"div-right-item\">適配器名:<span class=\"f-fs14 c-fwb\">" + envData.name + "</span></div>\n" +
                "                    <div class=\"div-right-item\">连接类型:<span class=\"f-fs14 c-fwb\">" + envData.type + "</span></div>\n" +
                "                    <div class=\"div-right-item\">IP地址:<span class=\"f-fs14 c-fwb\">" + envData.address + "</span></div>\n" +
                "                    <div class=\"div-right-item\">Mac地址:<span class=\"f-fs14 c-fwb\">" + envData.mac + "</span></div>\n" +
                "                </div>";
        return html;
    }

+ 83 - 23
src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManage.jsp

@ -4,27 +4,84 @@
<link rel="stylesheet" href="${contextRoot}/develop/lib/plugin/switchery/switchery.css">
<style>
    .c-item{float:left;height: 30px;line-height: 30px;width: 150px;background: #fff;color:#000;text-align: center;font-size: 12px;border:1px solid #dcdcdc;}
    .c-bor-r{border-right: 0;}
    .c-item.active{background: #16B3EE;color:#fff}
    .ml50{margin-left: 50px;}
    .mt20{margin-top: 20px;}
    .mb20{margin-bottom: 20px;}
    .f-dis-inline{display: inline-block;}
    .f-fs12{font-size: 12px;}
    .f-fs14{font-size: 14px;}
    .c-fwb{font-weight: bold;}
    .div-item{width:50%;float: left;}
    .c-item{font-size: 12px;display: inline-block;width: 100px;}
    .c-content{font-size: 16px;display: inline-block;width: 100px;font-weight: bold;}
    .div-right-item{font-size: 12px;width: 150px;}
    .c-item {
        float: left;
        height: 30px;
        line-height: 30px;
        width: 150px;
        background: #fff;
        color: #000;
        text-align: center;
        font-size: 12px;
        border: 1px solid #dcdcdc;
    }
    .c-bor-r {
        border-right: 0;
    }
    .c-item.active {
        background: #16B3EE;
        color: #fff
    }
    .ml50 {
        margin-left: 50px;
    }
    .mt20 {
        margin-top: 20px;
    }
    .mb20 {
        margin-bottom: 20px;
    }
    .f-dis-inline {
        display: inline-block;
    }
    .f-fs12 {
        font-size: 12px;
    }
    .f-fs14 {
        font-size: 14px;
    }
    .c-fwb {
        font-weight: bold;
    }
    .div-item {
        width: 50%;
        float: left;
    }
    .c-item {
        font-size: 12px;
        display: inline-block;
        width: 100px;
    }
    .c-content {
        font-size: 16px;
        display: inline-block;
        width: 100px;
        font-weight: bold;
    }
    .div-right-item {
        font-size: 12px;
        width: 150px;
    }
</style>
<!-- ####### 页面部分 ####### -->
<div id="div_wrapper">
    <!--左边 区域-->
    <div position="left"  style="margin-left:10px;margin-top:10px;border-right: thin solid rgb(162, 162, 162);">
    <div position="left" style="margin-left:10px;margin-top:10px;border-right: thin solid rgb(162, 162, 162);">
        <ul id="div_wrapper_left_ul_servicetree" class="m-snav"></ul>
    </div>
    <div position="center" style="margin-left:10px;margin-top:10px;margin-right:10px;">
@ -34,9 +91,10 @@
            <div class="m-form-group">
                <div class="col-sm-3" style="text-align: center;padding-top:10px;">
                    <div style="width:255px">
                        <input type="checkbox" class="js-switch" id="jobStatusSwitch" checked />
                        <input type="checkbox" class="js-switch" id="jobStatusSwitch" checked/>
                    </div>
                    <div style="float: left;width:235px;border-left:1px solid #e1e1e1;;line-height: 32px;" id="jobStatus">
                    <div style="float: left;width:235px;border-left:1px solid #e1e1e1;;line-height: 32px;"
                         id="jobStatus">
                        -
                    </div>
                    <div style="clear: both;padding-top:20px;">任务调度</div>
@ -52,11 +110,11 @@
            <div class="m-form-group" style="margin-left: 100px;">
                <label style="width: 100px;">开始时间:</label>
                <div class="m-form-control">
                    <input id="repeatStartTime" type="text" />
                    <input id="repeatStartTime" type="text"/>
                </div>
                <label style="width: 100px;">结束时间:</label>
                <div class="m-form-control">
                    <input id="repeatEndTime" type="text" />
                    <input id="repeatEndTime" type="text"/>
                </div>
                <div class="m-form-control">
                    <div id="btnSearch" class="l-button">
@ -65,13 +123,15 @@
                </div>
            </div>
            <%-- echarts 数据--%>
            <div id="main1" style="width: 500px;margin-left:130px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main1" style="width: 500px;margin-left:130px;height:250px;border: solid #a6a6a6 1px;"></div>
            <%-- echarts 数据--%>
            <div id="main2" style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main2"
                 style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid #a6a6a6 1px;"></div>
            <%-- echarts 数据--%>
            <div id="main3" style="width: 500px;margin-left:130px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main3" style="width: 500px;margin-left:130px;height:250px;border: solid #a6a6a6 1px;"></div>
            <%-- echarts 数据--%>
            <div id="main4" style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid deepskyblue 1px;"></div>
            <div id="main4"
                 style="width: 500px;margin:-250px 0px 20px 680px;height:250px;border: solid #a6a6a6 1px;"></div>
        </div>
    </div>
</div>

+ 164 - 168
src/main/webapp/WEB-INF/ehr/jsp/monitor/service/sEnvManageJs.jsp

@ -25,59 +25,56 @@
            width: 240,
            showTime: true
        });
        $("#repeatStartTime").ligerDateEditor("setValue",prevDate());
        $("#repeatEndTime").ligerDateEditor("setValue",nowDate());
        $("#repeatStartTime").ligerDateEditor("setValue", prevDate());
        $("#repeatEndTime").ligerDateEditor("setValue", nowDate());
        /*初始化时间控件-end*/
        //搜索按钮事件
        $(".m-form-control").on("click","#btnSearch",function(){
        $(".m-form-control").on("click", "#btnSearch", function () {
            var beginTime = $("#repeatStartTime").ligerDateEditor("getValue");
            var endTime = $("#repeatEndTime").ligerDateEditor("getValue");
            if(beginTime=="" && $endTime=="")
            {
            if (beginTime == "" && $endTime == "") {
                $.ligerDialog.error("请选择起始结束时间!");
                return false;
            }
            if(beginTime > endTime)
            {
            if (beginTime > endTime) {
                $.ligerDialog.error("开始时间不能大于结束时间!");
                return false;
            }
            var id = $("#selectId").val();
            //获取服务器监控数据
            getServiceInfo(id,beginTime,endTime);
            getServiceInfo(id, beginTime, endTime);
        });
        //初始化树
        getServiceTree();
    });
    function initSwitcher(){
    function initSwitcher() {
        var me = this;
        //开关控件
        var changeCheckbox = document.querySelector('#jobStatusSwitch');
        var switchery = new Switchery(changeCheckbox, { disabled: true,size: 'large' });
        changeCheckbox.onchange = function() {
            //debugger
        var switchery = new Switchery(changeCheckbox, {disabled: true, size: 'large'});
        changeCheckbox.onchange = function () {
            var a = me.switchery;
            var jobId = $("#selJob").ligerComboBox("getValue");
            if(!changeCheckbox.checked)
            {
                me.valid(jobId,"0");
            if (!changeCheckbox.checked) {
                me.valid(jobId, "0");
            }
            else{
                me.valid(jobId,"1");
            else {
                me.valid(jobId, "1");
            }
        };
    }
    function getServiceTree(){
    function getServiceTree() {
        var serviceTree = $("#div_wrapper_left_ul_servicetree");
        //初始化树
        $.ajax({
            type: "GET",
            dataType: "json",
            url: "${contextRoot}/monitor/service/trees",
            success: function (msg) {
                if (msg.successFlg) {
@ -109,128 +106,134 @@
        });
    }
    function getServiceInfo(id, beginTime, endTime){
    function getServiceInfo(id, beginTime, endTime) {
        beginTime = new Date(beginTime).format("yyyyMMddhhmm");
        endTime = new Date(endTime).format("yyyyMMddhhmm");
        debugger
        $.ajax({
            type: "GET",
            url : "${contextRoot}/monitor/service/metrics",
            dataType : "json",
            data:{id:id,beginTime:beginTime, endTime:endTime},
            cache:false,
            success :function(re){
                if(re.successFlg) {
            url: "${contextRoot}/monitor/service/metrics",
            dataType: "json",
            data: {id: id, beginTime: beginTime, endTime: endTime},
            cache: false,
            success: function (re) {
                if (re.successFlg) {
                    //TODO 设置图表
                    var message = JSON.parse(re.message);
                    var serviceInfo = message.serviceInfo;
                    $("#serviceName").text(serviceInfo.name);
                    $("#serviceDescription").text(serviceInfo.description);
//                    var serviceInfo = message.serviceInfo;
//                    $("#serviceName").text(serviceInfo.name);
//                    $("#serviceDescription").text(serviceInfo.description);
                    service.bandwidth(message.bandwidth);
                    service.qps(message.qps);
                    service.delay(message.delay);
                    service.usage(message.usage);
                    service.setJobStatus();
                    service.bandwidth(message.data);
                    service.qps(message.data);
                    service.delay(message.data);
                    service.usage(message.data);
//                    service.setJobStatus();
                } else {
                    $.ligerDialog.error(re.message);
                }
            },
            error :function(data){
                $.ligerDialog.error("Status:"+data.status +"(" +data.statusText+")");
            error: function (data) {
                $.ligerDialog.error("Status:" + data.status + "(" + data.statusText + ")");
            }
        });
    }
    var service = {
        switchery:null,
        bandwidth:function(data){
        switchery: null,
        bandwidth: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main1'));
             if(data!=null && data.length>0)
             {
                 var x = [];
                 var y = [];
                 for(var i=0;i<data.length;i++)
                 {
                     var createTime = data[i].createTime.substring(11,16);
                     x.push(createTime);
                     y.push(data[i].value);
                 }
                 // 指定图表的配置项和数据
                 var option = {
                     title: {
                         text: ' 带宽',
                         left: 'center'
                     },
                     tooltip: {
                         trigger: 'axis'
                     },
                     dataZoom : {
                         show : true,
                         start : 50,
                         end : 100
                     },
                     legend: {
                         left: 'left',
                         data: ['带宽']
                     },
                     xAxis: {
                         type: 'category',
                         name: '时间',
                         splitLine: {show: false},
                         data: x
                     },
                     grid: {
                         left: '3%',
                         right: '4%',
                         bottom: '3%',
                         containLabel: true
                     },
                     yAxis: {
                         type: 'log',
                     },
                     series: [
                         {
                             name: '带宽',
                             type: 'line',
                             data: y
                         },
                     ]
                 };
             myChart.setOption(option);
             //设置图例下方的信息
             } else{
                 myChart.clear();
             }
            if (data != null && data.length > 0) {
                var x = [];
                var inPut = [];
                var outPut = [];
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    inPut.push(data[i].in);
                    outPut.push(data[i].out);
                }
                // 指定图表的配置项和数据
                var option = {
                    title: {
                        text: ' 带宽',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['输入', "输出"]
                    },
                    xAxis: {
                        type: 'category',
                        name: '时间',
                        splitLine: {show: false},
                        data: x
                    },
                    grid: {
                        left: '3%',
                        right: '4%',
                        bottom: '3%',
                        containLabel: true
                    },
                    yAxis: {
                        type: 'log',
                    },
                    series: [
                        {
                            name: '输入',
                            type: 'line',
                            data: inPut
                        },
                        {
                            name: '输出',
                            type: 'line',
                            data: outPut
                        },
                    ]
                };
                myChart.setOption(option);
                //设置图例下方的信息
            } else {
                myChart.clear();
            }
        },
        qps:function(data){
        qps: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main2'));
            if(data!=null && data.length>0)
            {
            if (data != null && data.length > 0) {
                var x = [];
                var y = [];
                for(var i=0;i<data.length;i++)
                {
                    var createTime = data[i].createTime.substring(11,16);
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    y.push(data[i].value);
                    y.push(data[i].pv);
                }
                // 指定图表的配置项和数据
                var option = {
                    title: {
                        text: ' 吞吐量',
                        text: ' TPS',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    dataZoom : {
                        show : true,
                        start : 50,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['吞吐量']
                        data: ['TPS']
                    },
                    xAxis: {
                        type: 'category',
@ -249,7 +252,7 @@
                    },
                    series: [
                        {
                            name: '吞吐量',
                            name: 'TPS',
                            type: 'line',
                            data: y
                        },
@ -257,22 +260,22 @@
                };
                myChart.setOption(option);
            }
            else{
            else {
                myChart.clear();
            }
        },
        delay:function(data){
        delay: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main3'));
            if(data!=null && data.length>0)
            {
            if (data != null && data.length > 0) {
                var x = [];
                var y = [];
                for(var i=0;i<data.length;i++)
                {
                    var createTime = data[i].createTime.substring(11,16);
                var delay = [];
                var avgDelay = [];
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    y.push(data[i].value);
                    delay.push(data[i].delay);
                    avgDelay.push(data[i].avgDelay);
                }
                // 指定图表的配置项和数据
                var option = {
@ -283,14 +286,14 @@
                    tooltip: {
                        trigger: 'axis'
                    },
                    dataZoom : {
                        show : true,
                        start : 50,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['延时']
                        data: ['延时', '平均延时']
                    },
                    xAxis: {
                        type: 'category',
@ -311,54 +314,59 @@
                        {
                            name: '延时',
                            type: 'line',
                            data: y
                            data: delay
                        },
                        {
                            name: '平均延时',
                            type: 'line',
                            data: avgDelay
                        }
                    ]
                };
                myChart.setOption(option);
            }
            else{
            else {
                myChart.clear();
            }
        },
        usage:function(data){
        usage: function (data) {
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main4'));
            if(data!=null && data.length>0)
            {
            if (data != null && data.length > 0) {
                var x = [];
                var y1 = [];
                var y2 = [];
                var y3 = [];
                for(var i=0;i<data.length;i++)
                {
                    var createTime = data[i].createTime.substring(11,16);
                for (var i = 0; i < data.length; i++) {
                    var createTime = data[i].time.substring(8, 12);
                    x.push(createTime);
                    var count = JSON.parse(JSON.parse(data[i].value));
                    y1.push(count.totalCount);
                    y2.push(count.successCount);
                    y3.push(count.failureCount);
                    var count = data[i].pv;
                    var successful = data[i].successful;
                    y1.push(successful / count * 100);
                }
                // 指定图表的配置项和数据
                // 指定图表的配置项和数据
                var option = {
                    title: {
                        text: ' 使用率',
                        left: 'center'
                    },
                    tooltip: {
                        trigger: 'axis'
                        trigger: 'axis',
                        formatter: function (params) {
                            var index = params[0].dataIndex;
                            return params[0].seriesName + "<br/>" +
                                params[0].name + ' : ' + params[0].value + '% (' + data[index].successful + '/' + data[index].pv + ')';
                        }
                    },
                    dataZoom : {
                        show : true,
                        start : 50,
                        end : 100
                    dataZoom: {
                        show: true,
                        start: 50,
                        end: 100
                    },
                    legend: {
                        left: 'left',
                        data: ['总使用数', '成功数', '失败数']
                        data: ['使用率']
                    },
                        xAxis: {
                    xAxis: {
                        type: 'category',
                        name: '时间',
                        splitLine: {show: false},
@ -375,43 +383,31 @@
                    },
                    series: [
                        {
                            name: '总使用数',
                            name: '使用率',
                            type: 'line',
                            data: y1
                        },
                        {
                            name: '成功数',
                            type: 'line',
                            data: y2
                        },
                        {
                            name: '失败数',
                            type: 'line',
                            data: y3
                        }
                    ]
                };
                myChart.setOption(option);
            }
            else{
            else {
                myChart.clear();
            }
        },
        //任务状态
        setJobStatus:function(status)
        {
        setJobStatus: function (status) {
            var me = this;
            if(status=="1")
            {
                $('#jobStatusSwitch').attr("checked",true);
                me.switchery.element.checked=true;
            if (status == "1") {
                $('#jobStatusSwitch').attr("checked", true);
                me.switchery.element.checked = true;
                me.switchery.setPosition();
                $("#jobStatus").html('<span class="green job_run">正在运行中...</span>');
            }
            else{
            else {
                $('#jobStatusSwitch').removeAttr("checked");
                me.switchery.element.checked=false;
                me.switchery.element.checked = false;
                me.switchery.setPosition();
                $("#jobStatus").html('<span class="red job_stop">运行暂停</span>');
            }
@ -420,7 +416,7 @@
    /*当前时间*/
    function nowDate(){
    function nowDate() {
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
@ -428,16 +424,16 @@
        var hour = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        return year + '-' + month + '-' + day  + ' ' + hour + ':' + minute + ':' + second;
        return year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + second;
    }
    /*前一天时间*/
    function prevDate(){
    function prevDate() {
        var now = new Date();
        var date = new Date(now.getTime() -  24 * 3600 * 1000);
        var date = new Date(now.getTime() - 1 * 3600 * 1000);
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        return year + '-' + month + '-' + day  + ' 00:00:00';
        return year + '-' + month + '-' + day + ' 00:00:00';
    }
</script>

+ 11 - 0
src/main/webapp/WEB-INF/ehr/jsp/qc/report.jsp

@ -0,0 +1,11 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="utf-8"%>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<div   style="width: 100%; height: 100%">
  <!--head -->
  <iframe src="http://192.168.1.221:8080/ehr/report/outInitial" style="width: 100%; height: 100%;border: none;">
  </iframe>
</div>

+ 5 - 0
src/main/webapp/WEB-INF/ehr/jsp/qc/reportJs.jsp

@ -0,0 +1,5 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="utf-8"%>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

+ 11 - 0
src/main/webapp/WEB-INF/ehr/jsp/qc/storageReport.jsp

@ -0,0 +1,11 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="utf-8"%>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<div   style="width: 100%; height: 100%">
  <!--head -->
  <iframe src="http://192.168.1.221:8080/ehr/report/initialLs" style="width: 100%; height: 100%;border: none;">
  </iframe>
</div>

+ 5 - 0
src/main/webapp/WEB-INF/ehr/jsp/qc/storageReportJs.jsp

@ -0,0 +1,5 @@
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="utf-8"%>
<%@include file="/WEB-INF/ehr/commons/jsp/commonInclude.jsp" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

+ 1538 - 1538
src/main/webapp/WEB-INF/ehr/jsp/standard/adapterplan/configurationJs.jsp

@ -5,1656 +5,1656 @@
<script >
      /* ************************** 全局变量定义 **************************** */
      var status = $("#publish_status").val();
      var Util = $.Util;
      var retrieve = null;
      var master = null;
      var conditionArea = null;
      var entryRetrieve = null;
      var entryMaster = null;
      var cfgModel = 0;
      var changeFlag=false;
      var dataRows =0;
      var dataFlag = true;
      var cfg = [
        {
          left:{title:'数据集', cls:'', search:'/standardCenter/searchDatasetList', del:''},
          right:{title:'数据元', cls:'', search:'/adapterCenter/searchMetadataList', del:'',delLs:'/adapterCenter/delMetadata'}
  /* ************************** 全局变量定义 **************************** */
  var status = $("#publish_status").val();
  var Util = $.Util;
  var retrieve = null;
  var master = null;
  var conditionArea = null;
  var entryRetrieve = null;
  var entryMaster = null;
  var cfgModel = 0;
  var changeFlag=false;
  var dataRows =0;
  var dataFlag = true;
  var cfg = [
    {
      left:{title:'数据集', cls:'', search:'/standardCenter/searchDatasetList', del:''},
      right:{title:'数据元', cls:'', search:'/adapterCenter/searchMetadataList', del:'',delLs:'/adapterCenter/delMetadata'}
    },
    {
      left:{title:'字典', cls:'', search:'/standardCenter/searchDictList', del:''},
      right:{title:'字典项', cls:'', search:'/adapterCenter/searchDictEntryList', del:'',delLs:'/adapterCenter/delDictEntry'}
    }
  ];
  /* *************************** 函数定义 ******************************* */
  function pageInit() {
    if(status=="1"){//已发布
      $("#div_btn").hide();
    }else{//未发布
      $("#div_btn").show();
    }
    resizeContent();
    retrieve.init();
    conditionArea.init();
    entryRetrieve.init();
    master.init();
    //master.reloadGrid();
    entryMaster.init();
  }
  function reClass(){
    $(".l-grid-row-alt").each(function(){
      $(this).removeChild("l-grid-row-alt");
    })
  }
  function reloadGrid (url, params, columns) {
    if(columns)
      this.grid.set({
        columns:columns,
        url: url,
        parms: params
      });
    else
      this.grid.set({
        url: url,
        parms: params
      });
//        this.grid.reload();
  }
  function resizeContent(){
    var contentW = $('#grid_content').width();
    var leftW = $('#div_left').width();
    var div_wrapper = $("#div_wrapper").width();
    $('#div_right').width(contentW-leftW-20);
    $(".btn-group").css("margin-left",(div_wrapper-200)/2);
  }
  /* *************************** title模块初始化 ***************************** */
  conditionArea = {
    $element: $('#conditionArea'),
    $adapter_plan_name :$('#adapter_plan_name'),
    $adapter_plan_parent :$('#adapter_plan_parent'),
    $adapter_plan_type :$('#adapter_plan_type'),
    $adapter_plan_org :$('#adapter_plan_org'),
    $btn_switch_dataSet :$('#switch_dataSet'),
    $btn_switch_dict :$('#switch_dict'),
    init : function () {
      // this.initAdapterOrg();
      this.bindEvents();
      this.$element.show();
    },
    bindEvents : function () {
      this.$btn_switch_dataSet.click(function () {
        $("#btn_aoto_adpat").css("display","block");
        $("#btn_aoto_adpat_dic").css("display","none");
        if(cfgModel==0)
          return;
        cfgModel = 0;
        $("#btn_add_relation").hide();
        $("#isDataSet").val("1");//该input框为1时,代表此时显示字典
        retrieve.setTitle();
        entryRetrieve.setTitle();
        changeFlag=true;
        master.reloadGrid();
        $(".btn-default").removeClass("active");
        conditionArea.$btn_switch_dataSet.addClass("active");
        $("#searchNmEntry").attr("placeholder","请输入编码或名称")
      });
      this.$btn_switch_dict.click(function () {
        $("#btn_aoto_adpat").css("display","none");
        $("#btn_aoto_adpat_dic").css("display","block");
        if(cfgModel==1)
          return;
        cfgModel = 1;
//            $("#btn_add_relation").show();
        $("#isDataSet").val("0");//该input框为0时,代表此时显示数据集
        retrieve.setTitle();
        entryRetrieve.setTitle();
        changeFlag=true;
        master.reloadGrid();
        $(".btn-default").removeClass("active");
        conditionArea.$btn_switch_dict.addClass("active");
        $("#searchNmEntry").attr("placeholder","请输入编码或值");
      })
    }
  };
  /* *************************** left模块初始化 ***************************** */
  retrieve = {
    $element: $('#retrieve'),
    $searchNm: $('#searchNm'),
    $title :$('#left_title'),
    init: function () {
      this.$searchNm.ligerSearch({onClick: function (value) {
        master.reloadGrid();
      }});
      this.$element.show();
    },
    setTitle: function () {
      this.$title.html(cfg[cfgModel].left.title);
    }
  };
  master = {
    infoDialog: null,
    grid: null,
    stdIdStrLs:"",
    init: function () {
      var me = this;
      var stdVersion = $("#std_version").val();
      var adapterStdVersion = $("#adapter_std_version").val();
      var version = $("#version").val(); //adapter version
      var schemeId = $("#scheme_id").val();
      schemeId = schemeId.replace("scheme","");
      $("#version").val(version);
      $("#adapter_std_version").val(adapterStdVersion);
      $("#std_version").val(stdVersion);
      $("#scheme_id").val(schemeId);
      if(this.grid)
        return;
      var version = $("#version").val();
      var url = '${contextRoot}'+'/adapterCenter/searchDatasetList?adapterVersion=' + version;
      $.ajax({
        url: url,
        type:"post",
        dataType:"json",
        success:function (data) {
          if(data.successFlg) {
            for (var i=0; i<data.detailModelList.length;i++){
              var stdDatasetId = data.detailModelList[i].stdDatasetId;
              me.stdIdStrLs += stdDatasetId + ",";
            }
            me.initGrid(me.stdIdStrLs);
          }
        }
      });
      this.bindEvents();
    },
    initGrid: function (stdIdStrLs) {
      var me = this;
      this.grid = $("#div_left_grid").ligerGrid({
        url: '${contextRoot}'+cfg[cfgModel].left.search,
        parms:{stdVersion: $("#std_version").val(),condition: JSON.stringify({"name":"","stdId": stdIdStrLs})},
        columns: me.getColumn(),
        selectRowButtonOnly: true,
        allowHideColumn:false,
        validate : true,
        unSetValidateAttr:false,
        onBeforeShowData: function (data) {
          if(data.detailModelList.length==0){
            entryMaster.reloadGrid('');
          }
        },
        {
          left:{title:'字典', cls:'', search:'/standardCenter/searchDictList', del:''},
          right:{title:'字典项', cls:'', search:'/adapterCenter/searchDictEntryList', del:'',delLs:'/adapterCenter/delDictEntry'}
        onAfterShowData: function () {
          this.select(0);
        },
        onSelectRow: function(row){
          dataRows = 0;
          dataFlag = true;
          $("#std_dict_id").val(row.id);
          entryMaster.reloadGrid(row.id);
        }
      ];
      /* *************************** 函数定义 ******************************* */
      function pageInit() {
        if(status=="1"){//已发布
          $("#div_btn").hide();
        }else{//未发布
          $("#div_btn").show();
      });
    },
    bindEvents: function () {
      $("#searchNm").keyup(function (e) {
        if (e.keyCode == 13) {
          master.reloadGrid();
        }
        resizeContent();
        retrieve.init();
        conditionArea.init();
        entryRetrieve.init();
        master.init();
        //master.reloadGrid();
        entryMaster.init();
        
      }
      });
      function reClass(){
        $(".l-grid-row-alt").each(function(){
          $(this).removeChild("l-grid-row-alt");
        })
      }
    },
    reloadGrid: function () {
      function reloadGrid (url, params, columns) {
        if(columns)
          this.grid.set({
            columns:columns,
            url: url,
            parms: params
          });
        else
          this.grid.set({
            url: url,
            parms: params
          });
//        this.grid.reload();
      var me = this;
      var searchNm = $("#searchNm").val();
      var values = {
        stdVersion: $("#std_version").val(),
        condition: JSON.stringify({"name":searchNm,"stdId":me.stdIdStrLs})
      };
      if (changeFlag){
        var url = '${contextRoot}' + cfg[cfgModel].left.search;
        reloadGrid.call(this, url, values, this.getColumn());
      }else{
        me.grid.setOptions({parms: $.extend({},values),newPage: 1});
        //重新查询
        me.grid.loadData(true);
      }
      function resizeContent(){
        var contentW = $('#grid_content').width();
        var leftW = $('#div_left').width();
        var div_wrapper = $("#div_wrapper").width();
        $('#div_right').width(contentW-leftW-20);
        $(".btn-group").css("margin-left",(div_wrapper-200)/2);
    },
    getColumn: function () {
      var columnCfg =[];
      var stdId = 'id';
      var stdCode = 'code';
      var stdName = 'name';
      var codeDisplay = '目标标准数据集编码';
      var nameDisplay = '目标标准数据集名称';
      if(cfgModel==1){
        stdId = 'id';
        stdCode = 'code';
        stdName = 'name';
        codeDisplay = '目标标准字典编码';
        nameDisplay = '目标标准字典名称';
      }
      /* *************************** title模块初始化 ***************************** */
      conditionArea = {
        $element: $('#conditionArea'),
        $adapter_plan_name :$('#adapter_plan_name'),
        $adapter_plan_parent :$('#adapter_plan_parent'),
        $adapter_plan_type :$('#adapter_plan_type'),
        $adapter_plan_org :$('#adapter_plan_org'),
        $btn_switch_dataSet :$('#switch_dataSet'),
        $btn_switch_dict :$('#switch_dict'),
        init : function () {
         // this.initAdapterOrg();
          this.bindEvents();
          this.$element.show();
          
      columnCfg = [
        { display: 'id', name: 'id', hide:true },
        { display: stdId, name: stdId, hide:true },
        { display: codeDisplay, name: stdCode, width: '50%',isAllowHide: false ,align:'left' },
        { display: nameDisplay, name: stdName, width: '50%',isAllowHide: false ,align:'left' }
      ];
      return columnCfg;
    }
  };
  /* *************************** right模块初始化 ***************************** */
  entryRetrieve = {
    $element: $('#entryRetrieve'),
    $searchNm: $('#searchNmEntry'),
    $title: $('#right_title'),
    init: function () {
      this.$searchNm.ligerSearch({onClick: function (value) {
        entryMaster.reloadGrid();
      }});
      this.$element.show();
    },
    setTitle: function () {
      this.$title.html(cfg[cfgModel].right.title);
    }
  };
  entryMaster = {
    entryInfoDialog: null,
    grid: null,
    init: function (dictId) {
      if(this.grid)
        return;
      this.grid = $("#div_relation_grid").ligerGrid({
        url: '${contextRoot}'+cfg[cfgModel].right.search,
        columns: this.getColumn(),
        delayLoad:true,
        selectRowButtonOnly: true,
        allowHideColumn:false,
        validate : true,
        unSetValidateAttr:false,
        checkbox:false,
        onDblClickRow : function (row){
          //$.publish('grid:right:open',[row.id, 'modify']);
        },
        bindEvents : function () {
          this.$btn_switch_dataSet.click(function () {
            $("#btn_aoto_adpat").css("display","block");
            $("#btn_aoto_adpat_dic").css("display","none");
            if(cfgModel==0)
              return;
            cfgModel = 0;
            $("#btn_add_relation").hide();
            $("#isDataSet").val("1");//该input框为1时,代表此时显示字典
            retrieve.setTitle();
            entryRetrieve.setTitle();
            changeFlag=true;
            master.reloadGrid();
            $(".btn-default").removeClass("active");
            conditionArea.$btn_switch_dataSet.addClass("active");
            $("#searchNmEntry").attr("placeholder","请输入编码或名称")
          });
          this.$btn_switch_dict.click(function () {
            $("#btn_aoto_adpat").css("display","none");
            $("#btn_aoto_adpat_dic").css("display","block");
            if(cfgModel==1)
              return;
            cfgModel = 1;
//            $("#btn_add_relation").show();
            $("#isDataSet").val("0");//该input框为0时,代表此时显示数据集
            retrieve.setTitle();
            entryRetrieve.setTitle();
            changeFlag=true;
            master.reloadGrid();
            $(".btn-default").removeClass("active");
            conditionArea.$btn_switch_dict.addClass("active");
            $("#searchNmEntry").attr("placeholder","请输入编码或值");
          })
        }
      };
      /* *************************** left模块初始化 ***************************** */
      retrieve = {
        $element: $('#retrieve'),
        $searchNm: $('#searchNm'),
        $title :$('#left_title'),
        init: function () {
          this.$searchNm.ligerSearch({onClick: function (value) {
            master.reloadGrid();
          }});
          this.$element.show();
        rowClsRender:function (rowdata,rowid){
          if(rowdata.adapterInfo=="0"){//疑似适配
            return "unadapt";
          }
          if(rowdata.adapterInfo=="1"){//疑似适配
            return "ysadapt";
          }
          if(rowdata.adapterInfo=="2"){//完全适配
            return "alladapt";
          }
        },
        setTitle: function () {
          this.$title.html(cfg[cfgModel].left.title);
        }
      };
      master = {
        infoDialog: null,
        grid: null,
        stdIdStrLs:"",
        init: function () {
          var me = this;
          var stdVersion = $("#std_version").val();
          var adapterStdVersion = $("#adapter_std_version").val();
          var version = $("#version").val(); //adapter version
          var schemeId = $("#scheme_id").val();
          schemeId = schemeId.replace("scheme","");
          $("#version").val(version);
          $("#adapter_std_version").val(adapterStdVersion);
          $("#std_version").val(stdVersion);
          $("#scheme_id").val(schemeId);
          if(this.grid)
            return;
          var version = $("#version").val();
          var url = '${contextRoot}'+'/adapterCenter/searchDatasetList?adapterVersion=' + version;
          $.ajax({
            url: url,
            type:"post",
            dataType:"json",
            success:function (data) {
              if(data.successFlg) {
                for (var i=0; i<data.detailModelList.length;i++){
                  var stdDatasetId = data.detailModelList[i].stdDatasetId;
                  me.stdIdStrLs += stdDatasetId + ",";
                }
                
                me.initGrid(me.stdIdStrLs);
              }
        _getHtmlFromData: function (data, frozen)
        {
          if (!data) return "";
          var g = this, p = this.options;
          var gridhtmlarr = [];
          for (var i = 0, l = data.length; i < l; i++)
          {
            var item = data[i];
            var rowid = item['__id'];
            if (!item) continue;
            gridhtmlarr.push('<tr');
            gridhtmlarr.push(' id="' + g._getRowDomId(item, frozen) + '"');
            gridhtmlarr.push(' class="l-grid-row'); //class start
            if (!frozen && g.enabledCheckbox() && p.isChecked && p.isChecked(item))
            {
              g.select(item);
              gridhtmlarr.push(' l-selected');
            }
          });
          this.bindEvents();
        },
        initGrid: function (stdIdStrLs) {
          
          var me = this;
          this.grid = $("#div_left_grid").ligerGrid({
            url: '${contextRoot}'+cfg[cfgModel].left.search,
            parms:{stdVersion: $("#std_version").val(),condition: JSON.stringify({"name":"","stdId": stdIdStrLs})},
            columns: me.getColumn(),
            selectRowButtonOnly: true,
            allowHideColumn:false,
            validate : true,
            unSetValidateAttr:false,
            onBeforeShowData: function (data) {
              
              if(data.detailModelList.length==0){
                entryMaster.reloadGrid('');
              }
            },
            onAfterShowData: function () {
              this.select(0);
            },
            onSelectRow: function(row){
              dataRows = 0;
              dataFlag = true;
              $("#std_dict_id").val(row.id);
              entryMaster.reloadGrid(row.id);
            else if (g.isSelected(item))
            {
              gridhtmlarr.push(' l-selected');
            }
          });
        },
        bindEvents: function () {
          $("#searchNm").keyup(function (e) {
            if (e.keyCode == 13) {
              master.reloadGrid();
            else if (p.isSelected && p.isSelected(item))
            {
              g.select(item);
              gridhtmlarr.push(' l-selected');
            }
          });
        },
        reloadGrid: function () {
          
          var me = this;
          var searchNm = $("#searchNm").val();
          var values = {
            stdVersion: $("#std_version").val(),
            condition: JSON.stringify({"name":searchNm,"stdId":me.stdIdStrLs})
          };
          if (changeFlag){
            var url = '${contextRoot}' + cfg[cfgModel].left.search;
            reloadGrid.call(this, url, values, this.getColumn());
          }else{
            me.grid.setOptions({parms: $.extend({},values),newPage: 1});
            //重新查询
            me.grid.loadData(true);
          }
        },
        getColumn: function () {
          var columnCfg =[];
          var stdId = 'id';
          var stdCode = 'code';
          var stdName = 'name';
          var codeDisplay = '平台标准数据集编码';
          var nameDisplay = '平台标准数据集名称';
          if(cfgModel==1){
            stdId = 'id';
            stdCode = 'code';
            stdName = 'name';
            codeDisplay = '平台标准字典编码';
            nameDisplay = '平台标准字典名称';
          }
          columnCfg = [
            { display: 'id', name: 'id', hide:true },
            { display: stdId, name: stdId, hide:true },
            { display: codeDisplay, name: stdCode, width: '50%',isAllowHide: false ,align:'left' },
            { display: nameDisplay, name: stdName, width: '50%',isAllowHide: false ,align:'left' }
          ];
          return columnCfg;
        }
      };
      /* *************************** right模块初始化 ***************************** */
      entryRetrieve = {
        $element: $('#entryRetrieve'),
        $searchNm: $('#searchNmEntry'),
        $title: $('#right_title'),
        init: function () {
          this.$searchNm.ligerSearch({onClick: function (value) {
            entryMaster.reloadGrid();
          }});
          this.$element.show();
        },
        setTitle: function () {
          this.$title.html(cfg[cfgModel].right.title);
        }
      };
      entryMaster = {
        entryInfoDialog: null,
        grid: null,
        init: function (dictId) {
          if(this.grid)
            return;
          this.grid = $("#div_relation_grid").ligerGrid({
            url: '${contextRoot}'+cfg[cfgModel].right.search,
            columns: this.getColumn(),
            delayLoad:true,
            selectRowButtonOnly: true,
            allowHideColumn:false,
            validate : true,
            unSetValidateAttr:false,
            checkbox:false,
            onDblClickRow : function (row){
              //$.publish('grid:right:open',[row.id, 'modify']);
            },
            rowClsRender:function (rowdata,rowid){
              if(rowdata.adapterInfo=="0"){//疑似适配
                return "unadapt";
              }
              if(rowdata.adapterInfo=="1"){//疑似适配
                return "ysadapt";
              }
              if(rowdata.adapterInfo=="2"){//完全适配
                return "alladapt";
              }
            },
            _getHtmlFromData: function (data, frozen)
            if (p.rowClsRender)
            {
              var rowcls = p.rowClsRender(item, rowid);
              rowcls && gridhtmlarr.push(' ' + rowcls);
            }
            gridhtmlarr.push('" ');  //class end
            if (p.rowAttrRender) gridhtmlarr.push(p.rowAttrRender(item, rowid));
            if (p.tree && g.collapsedRows && g.collapsedRows.length)
            {
              if (!data) return "";
              var g = this, p = this.options;
              var gridhtmlarr = [];
              for (var i = 0, l = data.length; i < l; i++)
              var isHide = function ()
              {
                var item = data[i];
                var rowid = item['__id'];
                if (!item) continue;
                gridhtmlarr.push('<tr');
                gridhtmlarr.push(' id="' + g._getRowDomId(item, frozen) + '"');
                gridhtmlarr.push(' class="l-grid-row'); //class start
                if (!frozen && g.enabledCheckbox() && p.isChecked && p.isChecked(item))
                var pitem = g.getParent(item);
                while (pitem)
                {
                  g.select(item);
                  gridhtmlarr.push(' l-selected');
                }
                else if (g.isSelected(item))
                {
                  gridhtmlarr.push(' l-selected');
                }
                else if (p.isSelected && p.isSelected(item))
                {
                  g.select(item);
                  gridhtmlarr.push(' l-selected');
                }
                if (p.rowClsRender)
                {
                  var rowcls = p.rowClsRender(item, rowid);
                  rowcls && gridhtmlarr.push(' ' + rowcls);
                }
                gridhtmlarr.push('" ');  //class end
                if (p.rowAttrRender) gridhtmlarr.push(p.rowAttrRender(item, rowid));
                if (p.tree && g.collapsedRows && g.collapsedRows.length)
                {
                  var isHide = function ()
                  {
                    var pitem = g.getParent(item);
                    while (pitem)
                    {
                      if ($.inArray(pitem, g.collapsedRows) != -1) return true;
                      pitem = g.getParent(pitem);
                    }
                    return false;
                  };
                  if (isHide()) gridhtmlarr.push(' style="display:none;" ');
                  if ($.inArray(pitem, g.collapsedRows) != -1) return true;
                  pitem = g.getParent(pitem);
                }
                return false;
              };
              if (isHide()) gridhtmlarr.push(' style="display:none;" ');
            }
            gridhtmlarr.push('>');
            $(g.columns).each(function (columnindex, column)
            {
              if (frozen != column.frozen) return;
              gridhtmlarr.push('<td');
              gridhtmlarr.push(' id="' + g._getCellDomId(item, this) + '"');
              //如果是行序号(系统列)
              if (this.isrownumber)
              {
                gridhtmlarr.push(' class="l-grid-row-cell l-grid-row-cell-rownumbers" style="width:' + this.width + 'px"><div class="l-grid-row-cell-inner"');
                if (p.fixedCellHeight)
                  gridhtmlarr.push(' style = "height:' + p.rowHeight + 'px;" ');
                else
                  gridhtmlarr.push(' style = "min-height:' + p.rowHeight + 'px;" ');
                gridhtmlarr.push('>' + (parseInt(item['__index']) + 1) + '</div></td>');
                return;
              }
              //如果是复选框(系统列)
              if (this.ischeckbox)
              {
                gridhtmlarr.push(' class="l-grid-row-cell l-grid-row-cell-checkbox" style="width:' + this.width + 'px"><div class="l-grid-row-cell-inner"');
                if (p.fixedCellHeight)
                  gridhtmlarr.push(' style = "height:' + p.rowHeight + 'px;" ');
                else
                  gridhtmlarr.push(' style = "min-height:' + p.rowHeight + 'px;" ');
                gridhtmlarr.push('>');
                $(g.columns).each(function (columnindex, column)
                gridhtmlarr.push('<span class="l-grid-row-cell-btn-checkbox"></span>');
                gridhtmlarr.push('</div></td>');
                return;
              }
              //如果是明细列(系统列)
              else if (this.isdetail)
              {
                gridhtmlarr.push(' class="l-grid-row-cell l-grid-row-cell-detail" style="width:' + this.width + 'px"><div class="l-grid-row-cell-inner"');
                if (p.fixedCellHeight)
                  gridhtmlarr.push(' style = "height:' + p.rowHeight + 'px;" ');
                else
                  gridhtmlarr.push(' style = "min-height:' + p.rowHeight + 'px;" ');
                gridhtmlarr.push('>');
                if (!p.isShowDetailToggle || p.isShowDetailToggle(item))
                {
                  if (frozen != column.frozen) return;
                  gridhtmlarr.push('<td');
                  gridhtmlarr.push(' id="' + g._getCellDomId(item, this) + '"');
                  //如果是行序号(系统列)
                  if (this.isrownumber)
                  {
                    gridhtmlarr.push(' class="l-grid-row-cell l-grid-row-cell-rownumbers" style="width:' + this.width + 'px"><div class="l-grid-row-cell-inner"');
                    if (p.fixedCellHeight)
                      gridhtmlarr.push(' style = "height:' + p.rowHeight + 'px;" ');
                    else
                      gridhtmlarr.push(' style = "min-height:' + p.rowHeight + 'px;" ');
                    gridhtmlarr.push('>' + (parseInt(item['__index']) + 1) + '</div></td>');
                    return;
                  }
                  //如果是复选框(系统列)
                  if (this.ischeckbox)
                  {
                    gridhtmlarr.push(' class="l-grid-row-cell l-grid-row-cell-checkbox" style="width:' + this.width + 'px"><div class="l-grid-row-cell-inner"');
                    if (p.fixedCellHeight)
                      gridhtmlarr.push(' style = "height:' + p.rowHeight + 'px;" ');
                    else
                      gridhtmlarr.push(' style = "min-height:' + p.rowHeight + 'px;" ');
                    gridhtmlarr.push('>');
                    gridhtmlarr.push('<span class="l-grid-row-cell-btn-checkbox"></span>');
                    gridhtmlarr.push('</div></td>');
                    return;
                  }
                  //如果是明细列(系统列)
                  else if (this.isdetail)
                  {
                    gridhtmlarr.push(' class="l-grid-row-cell l-grid-row-cell-detail" style="width:' + this.width + 'px"><div class="l-grid-row-cell-inner"');
                    if (p.fixedCellHeight)
                      gridhtmlarr.push(' style = "height:' + p.rowHeight + 'px;" ');
                    else
                      gridhtmlarr.push(' style = "min-height:' + p.rowHeight + 'px;" ');
                    gridhtmlarr.push('>');
                    if (!p.isShowDetailToggle || p.isShowDetailToggle(item))
                    {
                      gridhtmlarr.push('<span class="l-grid-row-cell-detailbtn"></span>');
                    }
                    gridhtmlarr.push('</div></td>');
                    return;
                  }
                  var colwidth = this._width;
                  gridhtmlarr.push(' class="l-grid-row-cell ');
                  if (g.changedCells[rowid + "_" + this['__id']]) gridhtmlarr.push("l-grid-row-cell-edited ");
                  if (this.islast)
                    gridhtmlarr.push('l-grid-row-cell-last ');
                  gridhtmlarr.push('"');
                  //if (this.columnname) gridhtmlarr.push('columnname="' + this.columnname + '"');
                  gridhtmlarr.push(' style = "');
                  gridhtmlarr.push('width:' + colwidth + 'px; ');
                  if (column._hide)
                  {
                    gridhtmlarr.push('display:none;');
                  }
                  gridhtmlarr.push(' ">');
                  gridhtmlarr.push(g._getCellHtml(item, column));
                  gridhtmlarr.push('</td>');
                  gridhtmlarr.push('<span class="l-grid-row-cell-detailbtn"></span>');
                }
                gridhtmlarr.push('</div></td>');
                return;
              }
              var colwidth = this._width;
              gridhtmlarr.push(' class="l-grid-row-cell ');
              if (g.changedCells[rowid + "_" + this['__id']]) gridhtmlarr.push("l-grid-row-cell-edited ");
              if (this.islast)
                gridhtmlarr.push('l-grid-row-cell-last ');
              gridhtmlarr.push('"');
              //if (this.columnname) gridhtmlarr.push('columnname="' + this.columnname + '"');
              gridhtmlarr.push(' style = "');
              gridhtmlarr.push('width:' + colwidth + 'px; ');
              if (column._hide)
              {
                gridhtmlarr.push('display:none;');
              }
              gridhtmlarr.push(' ">');
              gridhtmlarr.push(g._getCellHtml(item, column));
              gridhtmlarr.push('</td>');
            });
            gridhtmlarr.push('</tr>');
          }
          return gridhtmlarr.join('');
        },
        onAfterShowData: function () {//显示完数据事件
          //【应用数据元编码】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-metadata-code").each(function(){
            comAdapterMetaData($(this),"init","adapterMetadataCode","adapterMetadataName");
          });
          //【应用数据元名称】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-metadata-name").each(function(){
            comAdapterMetaData($(this),"init","adapterMetadataName","adapterMetadataCode");
          });
          //【源数据集编码】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-dataset-code").each(function(){
            comAdapterDataset($(this),"init","adapterDatasetCode","adapterDatasetName");
          });
          //【源数据集名称】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-dataset-name").each(function(){
            comAdapterDataset($(this),"init","adapterDatasetName","adapterDatasetCode");
          });
          //【目标字典项编码】初始化注册select2(下拉框带查询)事件
          $(".sel-std-dictEntry-code").each(function(){
            comStdDictEntry($(this),"init","stdEntryCode","stdEntryValue");
          });
          //【目标字典项名称】初始化注册select2(下拉框带查询)事件
          $(".sel-std-dictEntry-value").each(function(){
            comStdDictEntry($(this),"init","stdEntryValue","stdEntryCode");
          });
          //【应用字典编码】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-dict-code").each(function(){
            comAdapterDict($(this),"init","adapterDictCode","adapterDictName");
          });
          //【应用字典名称】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-dict-name").each(function(){
            comAdapterDict($(this),"init","adapterDictName","adapterDictCode");
          });
          //【应用字典项编码】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-dictEntry-code").each(function(){
            comAdapterDictEntry($(this),"init","adapterEntryCode","adapterEntryValue");
          });
          //【应用字典名称】初始化注册select2(下拉框带查询)事件
          $(".sel-adapter-dictEntry-value").each(function(){
            comAdapterDictEntry($(this),"init","adapterEntryValue","adapterEntryCode");
          });
          //【源数据集编码】change事件
          $(".sel-adapter-dataset-code").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterDatasetCode","");
            var select2 =  comAdapterDataset($(this),"change","adapterDatasetCode","adapterDatasetName");
            comAdapterMetaData($("#adapterMetadataCode"+index),"change","adapterMetadataCode","adapterMetadataName");
            var datasetCodeOption = $(this).find("option");
            var datasetNameOption = $("#adapterDatasetName"+index).find("option");
            if(dataRows == entryMaster.grid.getData().length){
              if(dataFlag){
                $(".sel-adapter-dataset-code").each(function(){
                  var index = $(this).attr("id").replace("adapterDatasetCode","");
                  $(this).append(datasetCodeOption);
                  $("#adapterDatasetName"+index).append(datasetNameOption);
                  comAdapterDataset($(this),"change","adapterDatasetCode","adapterDatasetName");
                  comAdapterDataset($("#adapterDatasetName"+index),"change","adapterDatasetName","adapterDatasetCode");
                  comAdapterMetaData($("#adapterMetadataCode"+index),"change","adapterMetadataCode","adapterMetadataName");
                  comAdapterMetaData($("#adapterMetadataName"+index),"change","adapterMetadataName","adapterMetadataCode");
                });
                gridhtmlarr.push('</tr>');
                dataFlag = false;
              }
              return gridhtmlarr.join('');
            },
            onAfterShowData: function () {//显示完数据事件
              //【应用数据元编码】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-metadata-code").each(function(){
                comAdapterMetaData($(this),"init","adapterMetadataCode","adapterMetadataName");
              });
              //【应用数据元名称】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-metadata-name").each(function(){
                comAdapterMetaData($(this),"init","adapterMetadataName","adapterMetadataCode");
              });
              //【应用数据集编码】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-dataset-code").each(function(){
                comAdapterDataset($(this),"init","adapterDatasetCode","adapterDatasetName");
              });
              //【应用数据集名称】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-dataset-name").each(function(){
                comAdapterDataset($(this),"init","adapterDatasetName","adapterDatasetCode");
              });
              //【平台字典项编码】初始化注册select2(下拉框带查询)事件
              $(".sel-std-dictEntry-code").each(function(){
                comStdDictEntry($(this),"init","stdEntryCode","stdEntryValue");
              });
              //【平台字典项名称】初始化注册select2(下拉框带查询)事件
              $(".sel-std-dictEntry-value").each(function(){
                comStdDictEntry($(this),"init","stdEntryValue","stdEntryCode");
              });
              //【应用字典编码】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-dict-code").each(function(){
                comAdapterDict($(this),"init","adapterDictCode","adapterDictName");
              });
              //【应用字典名称】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-dict-name").each(function(){
                comAdapterDict($(this),"init","adapterDictName","adapterDictCode");
              });
              //【应用字典项编码】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-dictEntry-code").each(function(){
                comAdapterDictEntry($(this),"init","adapterEntryCode","adapterEntryValue");
              });
              //【应用字典名称】初始化注册select2(下拉框带查询)事件
              $(".sel-adapter-dictEntry-value").each(function(){
                comAdapterDictEntry($(this),"init","adapterEntryValue","adapterEntryCode");
              });
              //【应用数据集编码】change事件
              $(".sel-adapter-dataset-code").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("adapterDatasetCode","");
                var select2 =  comAdapterDataset($(this),"change","adapterDatasetCode","adapterDatasetName");
                comAdapterMetaData($("#adapterMetadataCode"+index),"change","adapterMetadataCode","adapterMetadataName");
                var datasetCodeOption = $(this).find("option");
                var datasetNameOption = $("#adapterDatasetName"+index).find("option");
           
                if(dataRows == entryMaster.grid.getData().length){
                  if(dataFlag){
                    $(".sel-adapter-dataset-code").each(function(){
                      var index = $(this).attr("id").replace("adapterDatasetCode","");
                      $(this).append(datasetCodeOption);
                      $("#adapterDatasetName"+index).append(datasetNameOption);
                      comAdapterDataset($(this),"change","adapterDatasetCode","adapterDatasetName");
                      comAdapterDataset($("#adapterDatasetName"+index),"change","adapterDatasetName","adapterDatasetCode");
                      comAdapterMetaData($("#adapterMetadataCode"+index),"change","adapterMetadataCode","adapterMetadataName");
                      comAdapterMetaData($("#adapterMetadataName"+index),"change","adapterMetadataName","adapterMetadataCode");
                    });
                    dataFlag = false;
                  }
                }
                if(msg!="adapterDatasetCode"){//当【应用数据集编码】联动时,【应用数据集名称】不触发联动
                  $("#adapterDatasetName"+index).trigger("change",["adapterDatasetName"]);
                }
            }
            if(msg!="adapterDatasetCode"){//当【源数据集编码】联动时,【源数据集名称】不触发联动
              $("#adapterDatasetName"+index).trigger("change",["adapterDatasetName"]);
            }
                select2.select2("open");
                select2.select2("close");
              });
              //【应用数据集名称】change事件
              $(".sel-adapter-dataset-name").on("change", function(event,msg) {
                
                var index = $(this).attr("id").replace("adapterDatasetName","");
                var select2 =  comAdapterDataset($(this),"change","adapterDatasetName","adapterDatasetCode");
                comAdapterMetaData($("#adapterMetadataCode"+index),"change","adapterMetadataCode","adapterMetadataName");
                comAdapterMetaData($("#adapterMetadataName"+index),"change","adapterMetadataName","adapterMetadataCode");
                if(msg!="adapterDatasetName"){//当【应用数据集名称】联动时,【应用数据集编码】不触发联动
                  $("#adapterDatasetCode"+index).trigger("change","adapterDatasetCode");
                }
                select2.select2("open");
                select2.select2("close");
              });
              //【应用数据元编码】change事件
              $(".sel-adapter-metadata-code").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("adapterMetadataCode","");
                var select2 = comAdapterMetaData($(this),"change","adapterMetadataCode","adapterMetadataName");
                if(msg!="adapterMetadataCode"){//当【应用数据元编码】联动时,【应用数据元名称】不触发联动
                  $("#adapterMetadataName"+index).trigger("change",["adapterMetadataName"]);
                }
                select2.select2("open");
                select2.select2("close");
              });
              //【应用数据元名称】change事件
              $(".sel-adapter-metadata-name").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("adapterMetadataName","");
                var select2 = comAdapterMetaData($(this),"change","adapterMetadataName","adapterMetadataCode");
                if(msg!="adapterMetadataName"){//当【应用数据元名称】联动时,【应用数据元编码】不触发联动
                  $("#adapterMetadataCode"+index).trigger("change","adapterMetadataCode");
                }
                select2.select2("open");
                select2.select2("close");
                var selectValue = $("#adapterMetadataName"+index).val();
                if(selectValue!=null&&selectValue!=''&&selectValue!=undefined){
                  $("#adapterInfo"+index).html("<option value='1' >疑似适配</option><option value='2' >完全适配</option>")
                }else{
                  $("#adapterInfo"+index).html("<option value='0' >未适配</option>");
                }
              });
              //---------------------------------------------------------------------
              //【平台字典项编码】change事件
              $(".sel-std-dictEntry-code").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("stdEntryCode","");//取出当前机构适配值的索引
                var select2 =  comStdDictEntry($(this),"change","stdEntryCode","stdEntryValue");
                if(msg!="stdEntryCode"){//当机构适配值联动时,机构适配名称不触发联动
                  $("#stdEntryValue"+index).trigger("change",["stdEntryValue"]);
                }
                select2.select2("open");
                select2.select2("close");
              });
              //【平台字典项名称】change事件
              $(".sel-std-dictEntry-value").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("stdEntryValue","");//取出当前机构适配名称的索引
                var select2 =  comStdDictEntry($(this),"change","stdEntryValue","stdEntryCode");
                if(msg!="stdEntryValue"){//当机构适配名称联动时,机构适配值不触发联动
                  $("#stdEntryCode"+index).trigger("change","stdEntryCode");
                }
                select2.select2("open");
                select2.select2("close");
              });
              //【应用字典编码】change事件
              $(".sel-adapter-dict-code").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("adapterDictCode","");//取出当前机构适配值的索引
                var select2 =  comAdapterDict($(this),"change","adapterDictCode","adapterDictName");
                comAdapterDictEntry($("#adapterEntryCode"+index),"change","adapterEntryCode","adapterEntryValue");
                var dictCodeOption = $(this).find("option");
                var dictEntryOption = $("#adapterDictName"+index).find("option");
                if(dataRows == entryMaster.grid.getData().length){
                  if(dataFlag){
                    $(".sel-adapter-dict-code").each(function(){
                      var index = $(this).attr("id").replace("adapterDictCode","");
                      $(this).append(dictCodeOption);
                      $("#adapterDictName"+index).append(dictEntryOption);
                      comAdapterDict($(this),"change","adapterDictCode","adapterDictName");
                      comAdapterDict($("#adapterDictName"+index),"change","adapterDictName","adapterDictCode");
                      comAdapterDictEntry($("#adapterEntryCode"+index),"change","adapterEntryCode","adapterEntryValue");
                      comAdapterDictEntry($("#adapterEntryValue"+index),"change","adapterEntryValue","adapterEntryCode");
                    });
                    dataFlag = false;
                  }
                }
                if(msg!="adapterDictCode"){//当机构适配值联动时,机构适配名称不触发联动
                  $("#adapterDictName"+index).trigger("change",["adapterDictName"]);
                }
                select2.select2("open");
                select2.select2("close");
              });
              //【应用字典名称】change事件
              $(".sel-adapter-dict-name").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("adapterDictName","");//取出当前机构适配名称的索引
                var select2 =  comAdapterDict($(this),"change","adapterDictName","adapterDictCode");
                comAdapterDictEntry($("#adapterEntryCode"+index),"change","adapterEntryCode","adapterEntryValue");
                comAdapterDictEntry($("#adapterEntryValue"+index),"change","adapterEntryValue","adapterEntryCode");
                if(msg!="adapterDictName"){//当机构适配名称联动时,机构适配值不触发联动
                  $("#adapterDictCode"+index).trigger("change","adapterDictCode");
                }
                select2.select2("open");
                select2.select2("close");
              });
              //【应用字典项编码】change事件
              $(".sel-adapter-dictEntry-code").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("adapterEntryCode","");//取出当前机构适配值的索引
                var select2 =  comAdapterDictEntry($(this),"change","adapterEntryCode","adapterEntryValue");
                if(msg!="adapterEntryCode"){//当机构适配值联动时,机构适配名称不触发联动
                  $("#adapterEntryValue"+index).trigger("change",["adapterEntryValue"]);
                }
                select2.select2("open");
                select2.select2("close");
              });
              //【应用字典项名称】change事件
              $(".sel-adapter-dictEntry-value").on("change", function(event,msg) {
                var index = $(this).attr("id").replace("adapterEntryValue","");//取出当前机构适配名称的索引
                var select2 =  comAdapterDictEntry($(this),"change","adapterEntryValue","adapterEntryCode");
                if(msg!="adapterEntryValue"){//当机构适配名称联动时,机构适配值不触发联动
                  $("#adapterEntryCode"+index).trigger("change","adapterEntryCode");
                }
                select2.select2("open");
                select2.select2("close");
                debugger
                var selectValue = select2.val();
                if(selectValue!=null&&selectValue!=''&&selectValue!=undefined){
                  $("#adapterInfo"+index).html("<option value='1' >疑似适配</option><option value='2' >完全适配</option>")
                }else{
                  $("#adapterInfo"+index).html("<option value='0' >未适配</option>");
                }
              });
            select2.select2("open");
            select2.select2("close");
          });
          //【源数据集名称】change事件
          $(".sel-adapter-dataset-name").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterDatasetName","");
            var select2 =  comAdapterDataset($(this),"change","adapterDatasetName","adapterDatasetCode");
            comAdapterMetaData($("#adapterMetadataCode"+index),"change","adapterMetadataCode","adapterMetadataName");
            comAdapterMetaData($("#adapterMetadataName"+index),"change","adapterMetadataName","adapterMetadataCode");
            if(msg!="adapterDatasetName"){//当【源数据集名称】联动时,【源数据集编码】不触发联动
              $("#adapterDatasetCode"+index).trigger("change","adapterDatasetCode");
            }
            select2.select2("open");
            select2.select2("close");
          });
          this.bindEvents();
        },
        reloadGrid: function (parentId) {
          
          var searchNmEntry = $("#searchNmEntry").val();
          if(Util.isStrEmpty(parentId)){
            var row = master.grid.getSelectedRow();
            if(row != null){
              parentId = row.id;
          //【源数据元编码】change事件
          $(".sel-adapter-metadata-code").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterMetadataCode","");
            var select2 = comAdapterMetaData($(this),"change","adapterMetadataCode","adapterMetadataName");
            if(msg!="adapterMetadataCode"){//当【源数据元编码】联动时,【源数据元名称】不触发联动
              $("#adapterMetadataName"+index).trigger("change",["adapterMetadataName"]);
            }
          }
          var values = {
            adapterVersion:$("#version").val(),
            condition: JSON.stringify({"name":searchNmEntry,"stdDatasetId":parentId,"stdDictId":parentId})
          };
          if (changeFlag){
            reloadGrid.call(this, '${contextRoot}'+cfg[cfgModel].right.search, values, this.getColumn());
          }else{
            this.grid.setOptions({parms: $.extend({},values),newPage: 1});
            //重新查询
            this.grid.loadData(true);
          }
          changeFlag=false;
        },
        add:function(){
          if(master.grid.getData().length==0){
            $.ligerDialog.error("没有平台字典,不能新增字典项!");
            return  false;
          }
          var dataRow = {
            stdDictId:$("#std_dict_id").val(),
            schemeId:$("#scheme_id").val(),
            adapterDictId:'',
            stdEntryId:'',
            adapterEntryId:'',
            adapterDictCode:'',
            adapterDictName:'',
            stdEntryCode:'',
            stdEntryValue:'',
            adapterEntryCode:'',
            adapterEntryValue:''
          };
          //参数1:rowdata(非必填)
          //参数2:插入的位置 Row Data
          var rowData = entryMaster.grid.getData();
          for (var i = 0; i < rowData.length; i++) {
            entryMaster.grid.rows[i].schemeId = $("#scheme_id").val();
            entryMaster.grid.rows[i].stdDictId = $("#std_dict_id").val();
            var stdEntryCodeArr = $("#stdEntryCode"+i).val()==undefined ? "":$("#stdEntryCode"+i).val().split(",");
            if(stdEntryCodeArr.length>0){
              entryMaster.grid.rows[i].stdEntryId = stdEntryCodeArr[0];
              entryMaster.grid.rows[i].stdEntryValue = stdEntryCodeArr[1];
            }else{
              entryMaster.grid.rows[i].stdEntryId = "";
              entryMaster.grid.rows[i].stdEntryValue = "";
            select2.select2("open");
            select2.select2("close");
          });
          //【源数据元名称】change事件
          $(".sel-adapter-metadata-name").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterMetadataName","");
            var select2 = comAdapterMetaData($(this),"change","adapterMetadataName","adapterMetadataCode");
            if(msg!="adapterMetadataName"){//当【源数据元名称】联动时,【源数据元编码】不触发联动
              $("#adapterMetadataCode"+index).trigger("change","adapterMetadataCode");
            }
            entryMaster.grid.rows[i].stdEntryCode = $("#stdEntryCode"+i).text() == undefined ? "" : $("#stdEntryCode"+i).text();
            var adapterDictCodeArr = $("#adapterDictCode"+i).val()==undefined ? "":$("#adapterDictCode"+i).val().split(",");
            if(adapterDictCodeArr.length>0){
              entryMaster.grid.rows[i].adapterDictId = adapterDictCodeArr[0];
              entryMaster.grid.rows[i].adapterDictName = adapterDictCodeArr[1];
            select2.select2("open");
            select2.select2("close");
            var selectValue = $("#adapterMetadataName"+index).val();
            if(selectValue!=null&&selectValue!=''&&selectValue!=undefined){
              $("#adapterInfo"+index).html("<option value='1' >疑似适配</option><option value='2' >完全适配</option>")
            }else{
              entryMaster.grid.rows[i].adapterDictId = "";
              entryMaster.grid.rows[i].adapterDictName = "";
              $("#adapterInfo"+index).html("<option value='0' >未适配</option>");
            }
            entryMaster.grid.rows[i].adapterDictCode = $("#adapterDictCode"+i).text() == undefined ? "" : $("#adapterDictCode"+i).text();
            var adapterEntryCodeArr = $("#adapterEntryCode"+i).val()==undefined ? "":$("#adapterEntryCode"+i).val().split(",");
            if(adapterEntryCodeArr.length>0){
              entryMaster.grid.rows[i].adapterEntryId = adapterEntryCodeArr[0];
              entryMaster.grid.rows[i].adapterEntryValue = adapterEntryCodeArr[1];
            }else{
              entryMaster.grid.rows[i].adapterEntryId = "";
              entryMaster.grid.rows[i].adapterEntryValue = "";
          });
          //---------------------------------------------------------------------
          //【目标字典项编码】change事件
          $(".sel-std-dictEntry-code").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("stdEntryCode","");//取出当前机构适配值的索引
            var select2 =  comStdDictEntry($(this),"change","stdEntryCode","stdEntryValue");
            if(msg!="stdEntryCode"){//当机构适配值联动时,机构适配名称不触发联动
              $("#stdEntryValue"+index).trigger("change",["stdEntryValue"]);
            }
            entryMaster.grid.rows[i].adapterEntryCode = $("#adapterEntryCode"+i).text() == undefined ? "" : $("#adapterEntryCode"+i).text();
          }
          entryMaster.grid.addRow(dataRow);
        },
        delete:function(rowindex,flag){
          $.ligerDialog.confirm('确定清空该适配关系?', function (r) {
            if (r) {
              $("#adapterInfo"+rowindex).html("<option value='0'>未适配</option>");
              if(flag == "dataset"){//数据集
                $("#adapterDatasetCode"+rowindex).html("");
                $("#adapterDatasetName"+rowindex).html("");
                $("#adapterMetadataCode"+rowindex).html("");
                $("#adapterMetadataName"+rowindex).html("");
                comAdapterDataset($("#adapterDatasetCode"+rowindex),"change","adapterDatasetCode","adapterDatasetName");
                comAdapterDataset($("#adapterDatasetName"+rowindex),"change","adapterDatasetName","adapterDatasetCode");
                comAdapterMetaData($("#adapterMetadataCode"+rowindex),"change","adapterMetadataCode","adapterMetadataName");
                comAdapterMetaData($("#adapterMetadataName"+rowindex),"change","adapterMetadataName","adapterMetadataCode");
                //重新计算表格中的值是否都被清空
                dataRows = 0;
                $(".sel-adapter-dataset-code").each(function(){
                  if(Util.isStrEmpty($(this).val())){
                    dataRows ++;
                  }
                });
                if(dataRows == entryMaster.grid.getData().length) {
                  dataFlag = true;
                }
              }else{//字典
                $("#adapterDictCode"+rowindex).html("");
                $("#adapterDictName"+rowindex).html("");
                $("#adapterEntryCode"+rowindex).html("");
                $("#adapterEntryValue"+rowindex).html("");
                comAdapterDict($("#adapterDictCode"+rowindex),"change","adapterDictCode","adapterDictName");
                comAdapterDict($("#adapterDictName"+rowindex),"change","adapterDictName","adapterDictCode");
                comAdapterDictEntry($("#adapterEntryCode"+rowindex),"change","adapterEntryCode","adapterEntryValue");
                comAdapterDictEntry($("#adapterEntryValue"+rowindex),"change","adapterEntryValue","adapterEntryCode");
                //重新计算表格中的值是否都被清空
                dataRows = 0;
            select2.select2("open");
            select2.select2("close");
          });
          //【目标字典项名称】change事件
          $(".sel-std-dictEntry-value").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("stdEntryValue","");//取出当前机构适配名称的索引
            var select2 =  comStdDictEntry($(this),"change","stdEntryValue","stdEntryCode");
            if(msg!="stdEntryValue"){//当机构适配名称联动时,机构适配值不触发联动
              $("#stdEntryCode"+index).trigger("change","stdEntryCode");
            }
            select2.select2("open");
            select2.select2("close");
          });
          //【源字典编码】change事件
          $(".sel-adapter-dict-code").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterDictCode","");//取出当前机构适配值的索引
            var select2 =  comAdapterDict($(this),"change","adapterDictCode","adapterDictName");
            comAdapterDictEntry($("#adapterEntryCode"+index),"change","adapterEntryCode","adapterEntryValue");
            var dictCodeOption = $(this).find("option");
            var dictEntryOption = $("#adapterDictName"+index).find("option");
            if(dataRows == entryMaster.grid.getData().length){
              if(dataFlag){
                $(".sel-adapter-dict-code").each(function(){
                  if(Util.isStrEmpty($(this).val())){
                    dataRows ++;
                  }
                  var index = $(this).attr("id").replace("adapterDictCode","");
                  $(this).append(dictCodeOption);
                  $("#adapterDictName"+index).append(dictEntryOption);
                  comAdapterDict($(this),"change","adapterDictCode","adapterDictName");
                  comAdapterDict($("#adapterDictName"+index),"change","adapterDictName","adapterDictCode");
                  comAdapterDictEntry($("#adapterEntryCode"+index),"change","adapterEntryCode","adapterEntryValue");
                  comAdapterDictEntry($("#adapterEntryValue"+index),"change","adapterEntryValue","adapterEntryCode");
                });
                if(dataRows == entryMaster.grid.getData().length) {
                  dataFlag = true;
                }
                dataFlag = false;
              }
            }
            if(msg!="adapterDictCode"){//当机构适配值联动时,机构适配名称不触发联动
              $("#adapterDictName"+index).trigger("change",["adapterDictName"]);
            }
            select2.select2("open");
            select2.select2("close");
          });
        },
        save:function(){
          if (cfgModel == 0) {
            var dataResult = new Array();
            var rowData = entryMaster.grid.getData();
            for (var i = 0; i < rowData.length; i++) {
              var ob = new Object();
              ob.id = rowData[i].id == undefined ? "" : rowData[i].id;
              ob.schemeId = rowData[i].schemeId == undefined ? "" : rowData[i].schemeId;
              ob.stdDatasetId = rowData[i].stdDatasetId == undefined ? "" : rowData[i].stdDatasetId;
              ob.stdMetadataId = rowData[i].stdMetadataId == undefined ? "" : rowData[i].stdMetadataId;
              ob.stdMetadataCode = rowData[i].stdMetadataCode == undefined ? "" : rowData[i].stdMetadataCode;
              ob.stdMetadataName = rowData[i].stdMetadataName == undefined ? "" : rowData[i].stdMetadataName;
              ob.adapterDataType = rowData[i].adapterDataType == undefined ? "" : $("#adapterDataType"+i).val();
              ob.stdDictId = rowData[i].stdDictId == undefined ? "" : rowData[i].stdDictId;
              var adapterDatasetCodeArr = $("#adapterDatasetCode"+i).val()==undefined ? "":$("#adapterDatasetCode"+i).val().split(",");
              if(adapterDatasetCodeArr.length>0){
                ob.adapterDatasetId = adapterDatasetCodeArr[0];
                ob.adapterDatasetName = adapterDatasetCodeArr[1];
              }else {
                ob.adapterDatasetId = "";
                ob.adapterDatasetName = "";
              }
              ob.adapterInfo  = $("#adapterInfo"+i).val();
              ob.adapterDatasetCode = $("#adapterDatasetCode"+i).text() == undefined ? "" : $("#adapterDatasetCode"+i).text();
              var adapterMetadataCodeArr = $("#adapterMetadataCode"+i).val()==undefined ? "":$("#adapterMetadataCode"+i).val().split(",");
              if(adapterMetadataCodeArr.length>0){
                ob.adapterMetadataId = adapterMetadataCodeArr[0];
                ob.adapterMetadataName = adapterMetadataCodeArr[1];
                if(adapterMetadataCodeArr.length >2){
                  ob.adapterDictId = adapterMetadataCodeArr[2];
                }else {
                  ob.adapterDictId = "";
                }
              }else {
                ob.adapterMetadataId = "";
                ob.adapterMetadataName = "";
              }
              ob.adapterMetadataCode = $("#adapterMetadataCode"+i).text() == undefined ? "" : $("#adapterMetadataCode"+i).text();
              dataResult.push(ob)
          //【源字典名称】change事件
          $(".sel-adapter-dict-name").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterDictName","");//取出当前机构适配名称的索引
            var select2 =  comAdapterDict($(this),"change","adapterDictName","adapterDictCode");
            comAdapterDictEntry($("#adapterEntryCode"+index),"change","adapterEntryCode","adapterEntryValue");
            comAdapterDictEntry($("#adapterEntryValue"+index),"change","adapterEntryValue","adapterEntryCode");
            if(msg!="adapterDictName"){//当机构适配名称联动时,机构适配值不触发联动
              $("#adapterDictCode"+index).trigger("change","adapterDictCode");
            }
            //保存数据
            $.ajax({
              type : "POST",
              url: '${contextRoot}'+'/adapterCenter/updateMetadatas',
              data: 'list='+JSON.stringify(dataResult)+"&adapterVersion="+$("#version").val(),
              dataType : "json",
              async:false,
              success :function(data){
                if(data.successFlg){
                  entryMaster.reloadGrid(); //重新查询,返回json记录集
                  $.ligerDialog.success(data.message);
                }else{
                  $.ligerDialog.error(data.message);
                }
              },
              error :function(data){
                $.ligerDialog.error("保存失败!");
              }
            });
          } else {
            var dataResult = new Array();
            var rowData = entryMaster.grid.getData();
            for (var i = 0; i < rowData.length; i++) {
              var ob = new Object();
              ob.id = rowData[i].id == undefined ? "" : rowData[i].id;
              ob.schemeId = $("#scheme_id").val();
              ob.stdDictId = $("#std_dict_id").val();
              var stdEntryCodeArr = $("#stdEntryCode"+i).val()==undefined ? "":$("#stdEntryCode"+i).val().split(",");
              if(stdEntryCodeArr.length>0){
                if(stdEntryCodeArr[0]=="" || stdEntryCodeArr[1]==""){
                  $.ligerDialog.error("第"+Number(i+1)+"条记录:平台字典项编码和平台字典项值不能为空!");
                  return false;
                }
                ob.stdEntryId = stdEntryCodeArr[0];
                ob.stdEntryValue = stdEntryCodeArr[1];
              }
              ob.stdEntryCode = $("#stdEntryCode"+i).text() == undefined ? "" : $("#stdEntryCode"+i).text();
              ob.adapterInfo  = $("#adapterInfo"+i).val();
              var adapterDictCodeArr = $("#adapterDictCode"+i).val()==undefined ? "":$("#adapterDictCode"+i).val().split(",");
              if(adapterDictCodeArr.length>0){
                ob.adapterDictId = adapterDictCodeArr[0];
                ob.adapterDictName = adapterDictCodeArr[1];
              }else{
                ob.adapterDictId = "";
                ob.adapterDictName = "";
              }
              ob.adapterDictCode = $("#adapterDictCode"+i).text() == undefined ? "" : $("#adapterDictCode"+i).text();
              var adapterEntryCodeArr = $("#adapterEntryCode"+i).val()==undefined ? "":$("#adapterEntryCode"+i).val().split(",");
              if(adapterEntryCodeArr.length>0){
                ob.adapterEntryId = adapterEntryCodeArr[0];
                ob.adapterEntryValue = adapterEntryCodeArr[1];
              }else{
                ob.adapterEntryId = "";
                ob.adapterEntryValue = "";
              }
              ob.adapterEntryCode = $("#adapterEntryCode"+i).text() == undefined ? "" : $("#adapterEntryCode"+i).text();
            select2.select2("open");
            select2.select2("close");
          });
              dataResult.push(ob)
          //【源字典项编码】change事件
          $(".sel-adapter-dictEntry-code").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterEntryCode","");//取出当前机构适配值的索引
            var select2 =  comAdapterDictEntry($(this),"change","adapterEntryCode","adapterEntryValue");
            if(msg!="adapterEntryCode"){//当机构适配值联动时,机构适配名称不触发联动
              $("#adapterEntryValue"+index).trigger("change",["adapterEntryValue"]);
            }
            var uniqueArray = entryMaster.uniqueArray(dataResult);
            if(dataResult.length!==uniqueArray.length){
              $.ligerDialog.error("在同一个适配方案下,同一个平台标准字典对应的平台字典项和应用字典项不可重复!");
              return false;
            select2.select2("open");
            select2.select2("close");
          });
          //【源字典项名称】change事件
          $(".sel-adapter-dictEntry-value").on("change", function(event,msg) {
            var index = $(this).attr("id").replace("adapterEntryValue","");//取出当前机构适配名称的索引
            var select2 =  comAdapterDictEntry($(this),"change","adapterEntryValue","adapterEntryCode");
            if(msg!="adapterEntryValue"){//当机构适配名称联动时,机构适配值不触发联动
              $("#adapterEntryCode"+index).trigger("change","adapterEntryCode");
            }
            //保存数据
            $.ajax({
              type : "POST",
              url: '${contextRoot}'+'/adapterCenter/updateDictEntrys',
              data: 'list='+JSON.stringify(dataResult)+"&adapterVersion="+$("#version").val(),
              dataType : "json",
              async:false,
              success :function(data){
                
                if(data.successFlg){
                  entryMaster.reloadGrid(); //重新查询,返回json记录集
                  $.ligerDialog.success(data.message);
                }else{
                  $.ligerDialog.error(data.message);
                }
            select2.select2("open");
            select2.select2("close");
            debugger
            var selectValue = select2.val();
            if(selectValue!=null&&selectValue!=''&&selectValue!=undefined){
              $("#adapterInfo"+index).html("<option value='1' >疑似适配</option><option value='2' >完全适配</option>")
            }else{
              $("#adapterInfo"+index).html("<option value='0' >未适配</option>");
            }
          });
        }
      });
              },
              error :function(data){
                $.ligerDialog.error("保存失败!");
      this.bindEvents();
    },
    reloadGrid: function (parentId) {
      var searchNmEntry = $("#searchNmEntry").val();
      if(Util.isStrEmpty(parentId)){
        var row = master.grid.getSelectedRow();
        if(row != null){
          parentId = row.id;
        }
      }
      var values = {
        adapterVersion:$("#version").val(),
        condition: JSON.stringify({"name":searchNmEntry,"stdDatasetId":parentId,"stdDictId":parentId})
      };
      if (changeFlag){
        reloadGrid.call(this, '${contextRoot}'+cfg[cfgModel].right.search, values, this.getColumn());
      }else{
        this.grid.setOptions({parms: $.extend({},values),newPage: 1});
        //重新查询
        this.grid.loadData(true);
      }
      changeFlag=false;
    },
    add:function(){
      if(master.grid.getData().length==0){
        $.ligerDialog.error("没有目标字典,不能新增字典项!");
        return  false;
      }
      var dataRow = {
        stdDictId:$("#std_dict_id").val(),
        schemeId:$("#scheme_id").val(),
        adapterDictId:'',
        stdEntryId:'',
        adapterEntryId:'',
        adapterDictCode:'',
        adapterDictName:'',
        stdEntryCode:'',
        stdEntryValue:'',
        adapterEntryCode:'',
        adapterEntryValue:''
      };
      //参数1:rowdata(非必填)
      //参数2:插入的位置 Row Data
      var rowData = entryMaster.grid.getData();
      for (var i = 0; i < rowData.length; i++) {
        entryMaster.grid.rows[i].schemeId = $("#scheme_id").val();
        entryMaster.grid.rows[i].stdDictId = $("#std_dict_id").val();
        var stdEntryCodeArr = $("#stdEntryCode"+i).val()==undefined ? "":$("#stdEntryCode"+i).val().split(",");
        if(stdEntryCodeArr.length>0){
          entryMaster.grid.rows[i].stdEntryId = stdEntryCodeArr[0];
          entryMaster.grid.rows[i].stdEntryValue = stdEntryCodeArr[1];
        }else{
          entryMaster.grid.rows[i].stdEntryId = "";
          entryMaster.grid.rows[i].stdEntryValue = "";
        }
        entryMaster.grid.rows[i].stdEntryCode = $("#stdEntryCode"+i).text() == undefined ? "" : $("#stdEntryCode"+i).text();
        var adapterDictCodeArr = $("#adapterDictCode"+i).val()==undefined ? "":$("#adapterDictCode"+i).val().split(",");
        if(adapterDictCodeArr.length>0){
          entryMaster.grid.rows[i].adapterDictId = adapterDictCodeArr[0];
          entryMaster.grid.rows[i].adapterDictName = adapterDictCodeArr[1];
        }else{
          entryMaster.grid.rows[i].adapterDictId = "";
          entryMaster.grid.rows[i].adapterDictName = "";
        }
        entryMaster.grid.rows[i].adapterDictCode = $("#adapterDictCode"+i).text() == undefined ? "" : $("#adapterDictCode"+i).text();
        var adapterEntryCodeArr = $("#adapterEntryCode"+i).val()==undefined ? "":$("#adapterEntryCode"+i).val().split(",");
        if(adapterEntryCodeArr.length>0){
          entryMaster.grid.rows[i].adapterEntryId = adapterEntryCodeArr[0];
          entryMaster.grid.rows[i].adapterEntryValue = adapterEntryCodeArr[1];
        }else{
          entryMaster.grid.rows[i].adapterEntryId = "";
          entryMaster.grid.rows[i].adapterEntryValue = "";
        }
        entryMaster.grid.rows[i].adapterEntryCode = $("#adapterEntryCode"+i).text() == undefined ? "" : $("#adapterEntryCode"+i).text();
      }
      entryMaster.grid.addRow(dataRow);
    },
    delete:function(rowindex,flag){
      $.ligerDialog.confirm('确定清空该适配关系?', function (r) {
        if (r) {
          $("#adapterInfo"+rowindex).html("<option value='0'>未适配</option>");
          if(flag == "dataset"){//数据集
            $("#adapterDatasetCode"+rowindex).html("");
            $("#adapterDatasetName"+rowindex).html("");
            $("#adapterMetadataCode"+rowindex).html("");
            $("#adapterMetadataName"+rowindex).html("");
            comAdapterDataset($("#adapterDatasetCode"+rowindex),"change","adapterDatasetCode","adapterDatasetName");
            comAdapterDataset($("#adapterDatasetName"+rowindex),"change","adapterDatasetName","adapterDatasetCode");
            comAdapterMetaData($("#adapterMetadataCode"+rowindex),"change","adapterMetadataCode","adapterMetadataName");
            comAdapterMetaData($("#adapterMetadataName"+rowindex),"change","adapterMetadataName","adapterMetadataCode");
            //重新计算表格中的值是否都被清空
            dataRows = 0;
            $(".sel-adapter-dataset-code").each(function(){
              if(Util.isStrEmpty($(this).val())){
                dataRows ++;
              }
            });
          }
        },
        /**########数据集 BEGIN#########**/
        isAdaptationIng:function(){
          var version = $("#version").val();
          var self=this;//为了获取项目id
          var url="";//AdapterDatasetController
          var obj="";//为了获取进度条
          var isDataSet = $("#isDataSet").val();
          if(isDataSet!="0"){//数据集
            obj=self.$shujujiZdsp
            url="${contextRoot}/adapterCenter/isStrategy"
          }
          var isCanPlay= setInterval(function(){//判断 是否可以开始匹配了
            $.ajax({
              type:"POST",
              dataType:"",
              url:url,
              data:{version:version},
              success:function(res){
                var isPPing=JSON.parse(res.data).isAdapt//是否正在匹配
                if(isPPing=="false"){//如果不是正在匹配
                  self.pipeiDo();//开始匹配
                }else{//如果正在匹配
                  self.autoAdaptation(obj);//显示进度
                  clearInterval(isCanPlay)
                }
            if(dataRows == entryMaster.grid.getData().length) {
              dataFlag = true;
            }
          }else{//字典
            $("#adapterDictCode"+rowindex).html("");
            $("#adapterDictName"+rowindex).html("");
            $("#adapterEntryCode"+rowindex).html("");
            $("#adapterEntryValue"+rowindex).html("");
            comAdapterDict($("#adapterDictCode"+rowindex),"change","adapterDictCode","adapterDictName");
            comAdapterDict($("#adapterDictName"+rowindex),"change","adapterDictName","adapterDictCode");
            comAdapterDictEntry($("#adapterEntryCode"+rowindex),"change","adapterEntryCode","adapterEntryValue");
            comAdapterDictEntry($("#adapterEntryValue"+rowindex),"change","adapterEntryValue","adapterEntryCode");
            //重新计算表格中的值是否都被清空
            dataRows = 0;
            $(".sel-adapter-dict-code").each(function(){
              if(Util.isStrEmpty($(this).val())){
                dataRows ++;
              }
            })
          },3000)
        },
        pipeiDo:function(){
          var std_version = $("#std_version").val();
          var version = $("#version").val();
          var adapter_std_version = $("#adapter_std_version").val();
          var parmas = {std_version:std_version,version:version,adapter_std_version:adapter_std_version};
          var self=this;
          var obj;//当前属于字典还是数据集对象,赋值匹配中
          var btnObj//自动匹配的按钮
          var url//链接
          var isDataSet = $("#isDataSet").val();
          if(isDataSet!="0"){//数据集
            obj=$("#shujuji .boxleft");
            url="${contextRoot}/adapterCenter/strategy"
            });
            if(dataRows == entryMaster.grid.getData().length) {
              dataFlag = true;
            }
          }
          $("#btn_aoto_adpat span").html("匹配中...");
          $.ajax({
            type:"POST",
            dataType:"json",
            url:url,
            data:parmas,
            success:function(data){
              $("#btn_aoto_adpat span").html("自动适配");
            },
            error:function(){
        }
      });
    },
    save:function(){
      if (cfgModel == 0) {
        var dataResult = new Array();
        var rowData = entryMaster.grid.getData();
        for (var i = 0; i < rowData.length; i++) {
          var ob = new Object();
          ob.id = rowData[i].id == undefined ? "" : rowData[i].id;
          ob.schemeId = rowData[i].schemeId == undefined ? "" : rowData[i].schemeId;
          ob.stdDatasetId = rowData[i].stdDatasetId == undefined ? "" : rowData[i].stdDatasetId;
          ob.stdMetadataId = rowData[i].stdMetadataId == undefined ? "" : rowData[i].stdMetadataId;
          ob.stdMetadataCode = rowData[i].stdMetadataCode == undefined ? "" : rowData[i].stdMetadataCode;
          ob.stdMetadataName = rowData[i].stdMetadataName == undefined ? "" : rowData[i].stdMetadataName;
          ob.adapterDataType = rowData[i].adapterDataType == undefined ? "" : $("#adapterDataType"+i).val();
          ob.stdDictId = rowData[i].stdDictId == undefined ? "" : rowData[i].stdDictId;
          var adapterDatasetCodeArr = $("#adapterDatasetCode"+i).val()==undefined ? "":$("#adapterDatasetCode"+i).val().split(",");
          if(adapterDatasetCodeArr.length>0){
            ob.adapterDatasetId = adapterDatasetCodeArr[0];
            ob.adapterDatasetName = adapterDatasetCodeArr[1];
          }else {
            ob.adapterDatasetId = "";
            ob.adapterDatasetName = "";
          }
          ob.adapterInfo  = $("#adapterInfo"+i).val();
          ob.adapterDatasetCode = $("#adapterDatasetCode"+i).text() == undefined ? "" : $("#adapterDatasetCode"+i).text();
          var adapterMetadataCodeArr = $("#adapterMetadataCode"+i).val()==undefined ? "":$("#adapterMetadataCode"+i).val().split(",");
          if(adapterMetadataCodeArr.length>0){
            ob.adapterMetadataId = adapterMetadataCodeArr[0];
            ob.adapterMetadataName = adapterMetadataCodeArr[1];
            if(adapterMetadataCodeArr.length >2){
              ob.adapterDictId = adapterMetadataCodeArr[2];
            }else {
              ob.adapterDictId = "";
            }
          })
        },//开始匹配
        autoAdaptation:function(){
          var self=this;
          var url=""//进度
          var isDataSet = $("#isDataSet").val();
          var version = $("#version").val();
          if(isDataSet!="0"){//数据集
            url="${contextRoot}/adapterCenter/getStrategySize"
          }else {
            ob.adapterMetadataId = "";
            ob.adapterMetadataName = "";
          }
          var timeIng =setInterval(function(){
            var ver =
            $.ajax({
              type:"POST",
              dataType:"json",
              url:url,
              data:{version:version},
              success:function(res){
                if(res.data==undefined){
                  $("#btn_aoto_adpat span").html("请求中");
                }else{
                  if(res.data.all==0){//如果判断被除数不能为0  如果为0 直接清空
                    $("#btn_aoto_adpat span").html("匹配完成");
                    clearInterval(timeIng);
                    self.ppeiEnd()//结束匹配
                  }else{
                    var jdu=  res.data.adapt/res.data.all//进度
                    if(jdu!=1){
                      var jduBFB=parseInt(jdu*100)
                      if(!isNaN(jduBFB)){
                        $("#btn_aoto_adpat span").html("已匹配"+jduBFB+"%")
                      }
                    }else{
                      $("#btn_aoto_adpat span").html("匹配完成");
                      master.reloadGrid();
                      clearInterval(timeIng);
                      self.ppeiEnd()//结束匹配
                    }
                  }
                }
          ob.adapterMetadataCode = $("#adapterMetadataCode"+i).text() == undefined ? "" : $("#adapterMetadataCode"+i).text();
          dataResult.push(ob)
        }
        //保存数据
        $.ajax({
          type : "POST",
          url: '${contextRoot}'+'/adapterCenter/updateMetadatas',
          data: 'list='+JSON.stringify(dataResult)+"&adapterVersion="+$("#version").val(),
          dataType : "json",
          async:false,
          success :function(data){
            if(data.successFlg){
              entryMaster.reloadGrid(); //重新查询,返回json记录集
              $.ligerDialog.success(data.message);
            }else{
              $.ligerDialog.error(data.message);
            }
              },
              error :function(res){
              }
            })
          },3000)
        },//自动匹配进度
        ppeiEnd:function(){
          var self=this;
          var url="";
          var isDataSet = $("#isDataSet").val()
          if(isDataSet!="0"){//数据集
            url="${contextRoot}/adapterCenter/endStrategy"
          },
          error :function(data){
            $.ligerDialog.error("保存失败!");
          }
          $.ajax({
            type:"POST",
            dataType:"json",
            url:url,
            data:{version:$("#version").val()},
            success:function(res){
            },
            error :function(res){
        });
      } else {
        var dataResult = new Array();
        var rowData = entryMaster.grid.getData();
        for (var i = 0; i < rowData.length; i++) {
          var ob = new Object();
          ob.id = rowData[i].id == undefined ? "" : rowData[i].id;
          ob.schemeId = $("#scheme_id").val();
          ob.stdDictId = $("#std_dict_id").val();
          var stdEntryCodeArr = $("#stdEntryCode"+i).val()==undefined ? "":$("#stdEntryCode"+i).val().split(",");
          if(stdEntryCodeArr.length>0){
            if(stdEntryCodeArr[0]=="" || stdEntryCodeArr[1]==""){
              $.ligerDialog.error("第"+Number(i+1)+"条记录:目标字典项编码和目标字典项值不能为空!");
              return false;
            }
          })
        },//结束匹配
        /**########数据集 END#########**/
        /**########字典 BEGIN#########**/
        isAdaptationIngDic:function(){
          var version = $("#version").val();
          var self=this;//为了获取项目id
          var url="";//AdapterDatasetController
          var obj="";//为了获取进度条
          var isDataSet = $("#isDataSet").val();
          if(isDataSet=="0"){//字典
            obj=self.$zidianZdsp
            url="${contextRoot}/adapterCenter/isStrategyDic"
            ob.stdEntryId = stdEntryCodeArr[0];
            ob.stdEntryValue = stdEntryCodeArr[1];
          }
          var isCanPlay= setInterval(function(){//判断 是否可以开始匹配了
            $.ajax({
              type:"POST",
              dataType:"",
              url:url,
              data:{version:version},
              success:function(res){
                var isPPing=JSON.parse(res.data).isAdapt//是否正在匹配
                if(isPPing=="false"){//如果不是正在匹配
                  self.pipeiDoDic();//开始匹配
                }else{//如果正在匹配
                  self.autoAdaptationDic(obj);//显示进度
                  clearInterval(isCanPlay)
                }
              }
            })
          },3000)
        },
        pipeiDoDic:function(){
          var std_version = $("#std_version").val();
          var version = $("#version").val();
          var adapter_std_version = $("#adapter_std_version").val();
          var parmas = {std_version:std_version,version:version,adapter_std_version:adapter_std_version};
          var self=this;
          var obj;//当前属于字典还是数据集对象,赋值匹配中
          var btnObj//自动匹配的按钮
          var url//链接
          var isDataSet = $("#isDataSet").val();
          if(isDataSet=="0"){//字典
            obj=$("#zidian .boxleft");
            url="${contextRoot}/adapterCenter/strategyDic"
          ob.stdEntryCode = $("#stdEntryCode"+i).text() == undefined ? "" : $("#stdEntryCode"+i).text();
          ob.adapterInfo  = $("#adapterInfo"+i).val();
          var adapterDictCodeArr = $("#adapterDictCode"+i).val()==undefined ? "":$("#adapterDictCode"+i).val().split(",");
          if(adapterDictCodeArr.length>0){
            ob.adapterDictId = adapterDictCodeArr[0];
            ob.adapterDictName = adapterDictCodeArr[1];
          }else{
            ob.adapterDictId = "";
            ob.adapterDictName = "";
          }
          $("#btn_aoto_adpat_dic span").html("匹配中...");
          $.ajax({
            type:"POST",
            dataType:"json",
            url:url,
            data:parmas,
            success:function(data){
              $("#btn_aoto_adpat_dic span").html("自动适配");
            },
            error:function(){
            }
          })
        },//开始匹配
        autoAdaptationDic:function(){
          var self=this;
          var url=""//进度
          var isDataSet = $("#isDataSet").val();
          var version = $("#version").val();
          if(isDataSet=="0"){//字典
            url="${contextRoot}/adapterCenter/getStrategyDicSize"
          ob.adapterDictCode = $("#adapterDictCode"+i).text() == undefined ? "" : $("#adapterDictCode"+i).text();
          var adapterEntryCodeArr = $("#adapterEntryCode"+i).val()==undefined ? "":$("#adapterEntryCode"+i).val().split(",");
          if(adapterEntryCodeArr.length>0){
            ob.adapterEntryId = adapterEntryCodeArr[0];
            ob.adapterEntryValue = adapterEntryCodeArr[1];
          }else{
            ob.adapterEntryId = "";
            ob.adapterEntryValue = "";
          }
          var timeIng =setInterval(function(){
            var ver =
                    $.ajax({
                      type:"POST",
                      dataType:"json",
                      url:url,
                      data:{version:version},
                      success:function(res){
                        if(res.data==undefined){
                          $("#btn_aoto_adpat_dic span").html("请求中");
                        }else{
                          if(res.data.all==0){//如果判断被除数不能为0  如果为0 直接清空
                            $("#btn_aoto_adpat_dic span").html("匹配完成");
                            clearInterval(timeIng);
                            self.ppeiEndDic()//结束匹配
                          }else{
                            var jdu=  res.data.adapt/res.data.all//进度
                            if(jdu!=1){
                              var jduBFB=parseInt(jdu*100)
                              if(!isNaN(jduBFB)){
                                $("#btn_aoto_adpat_dic span").html("已匹配"+jduBFB+"%")
                              }
                            }else{
                              $("#btn_aoto_adpat_dic span").html("匹配完成");
                              master.reloadGrid();
                              clearInterval(timeIng);
                              self.ppeiEndDic()//结束匹配
                            }
                          }
                        }
          ob.adapterEntryCode = $("#adapterEntryCode"+i).text() == undefined ? "" : $("#adapterEntryCode"+i).text();
                      }
                    })
          },3000)
        },//自动匹配进度
        ppeiEndDic:function(){
          var self=this;
          var url="";
          var isDataSet = $("#isDataSet").val()
          if(isDataSet=="0"){//字典
            url="${contextRoot}/adapterCenter/endStrategyDic"
          }
          $.ajax({
            type:"POST",
            dataType:"json",
            url:url,
            data:{version:$("#version").val()},
            success:function(res){
          dataResult.push(ob)
        }
        var uniqueArray = entryMaster.uniqueArray(dataResult);
        if(dataResult.length!==uniqueArray.length){
          $.ligerDialog.error("在同一个适配方案下,同一个目标标准字典对应的目标字典项和源字典项不可重复!");
          return false;
        }
        //保存数据
        $.ajax({
          type : "POST",
          url: '${contextRoot}'+'/adapterCenter/updateDictEntrys',
          data: 'list='+JSON.stringify(dataResult)+"&adapterVersion="+$("#version").val(),
          dataType : "json",
          async:false,
          success :function(data){
            if(data.successFlg){
              entryMaster.reloadGrid(); //重新查询,返回json记录集
              $.ligerDialog.success(data.message);
            }else{
              $.ligerDialog.error(data.message);
            }
          })
        },//结束匹配
        /**########字典 END#########**/
        uniqueArray:function(a){ /* 判断适配方案id、平台字典id、平台字典项id、应用字典项id是否重复*/
          var temp = new Array();
          for(var i = 0; i < a.length; i ++){
            if(!entryMaster.contains(temp, a[i].schemeId + a[i].stdDictId+a[i].stdEntryId + a[i].adapterEntryId)){
              temp.length+=1;
              temp[temp.length-1] = a[i].schemeId + a[i].stdDictId+a[i].stdEntryId + a[i].adapterEntryId;
          },
          error :function(data){
            $.ligerDialog.error("保存失败!");
          }
        });
      }
    },
    /**########数据集 BEGIN#########**/
    isAdaptationIng:function(){
      var version = $("#version").val();
      var self=this;//为了获取项目id
      var url="";//AdapterDatasetController
      var obj="";//为了获取进度条
      var isDataSet = $("#isDataSet").val();
      if(isDataSet!="0"){//数据集
        obj=self.$shujujiZdsp
        url="${contextRoot}/adapterCenter/isStrategy"
      }
      var isCanPlay= setInterval(function(){//判断 是否可以开始匹配了
        $.ajax({
          type:"POST",
          dataType:"",
          url:url,
          data:{version:version},
          success:function(res){
            var isPPing=JSON.parse(res.data).isAdapt//是否正在匹配
            if(isPPing=="false"){//如果不是正在匹配
              self.pipeiDo();//开始匹配
            }else{//如果正在匹配
              self.autoAdaptation(obj);//显示进度
              clearInterval(isCanPlay)
            }
          }
          return temp;
        },
        contains:function(a,e){
          for(j=0;j<a.length;j++)if(a[j]==e)return true;
          return false
        })
      },3000)
    },
    pipeiDo:function(){
      var std_version = $("#std_version").val();
      var version = $("#version").val();
      var adapter_std_version = $("#adapter_std_version").val();
      var parmas = {std_version:std_version,version:version,adapter_std_version:adapter_std_version};
      var self=this;
      var obj;//当前属于字典还是数据集对象,赋值匹配中
      var btnObj//自动匹配的按钮
      var url//链接
      var isDataSet = $("#isDataSet").val();
      if(isDataSet!="0"){//数据集
        obj=$("#shujuji .boxleft");
        url="${contextRoot}/adapterCenter/strategy"
      }
      $("#btn_aoto_adpat span").html("匹配中...");
      $.ajax({
        type:"POST",
        dataType:"json",
        url:url,
        data:parmas,
        success:function(data){
          $("#btn_aoto_adpat span").html("自动适配");
        },
        bindEvents: function () {
          
          //窗体改变大小事件
          $(window).bind('resize', function() {
            resizeContent();
          });
        error:function(){
          $('#btn_add_relation').click(function () {
            entryMaster.add();;
          });
        }
      })
    },//开始匹配
    autoAdaptation:function(){
      var self=this;
      var url=""//进度
      var isDataSet = $("#isDataSet").val();
      var version = $("#version").val();
      if(isDataSet!="0"){//数据集
        url="${contextRoot}/adapterCenter/getStrategySize"
      }
      var timeIng =setInterval(function(){
        var ver =
                $.ajax({
                  type:"POST",
                  dataType:"json",
                  url:url,
                  data:{version:version},
                  success:function(res){
                    if(res.data==undefined){
                      $("#btn_aoto_adpat span").html("请求中");
                    }else{
                      if(res.data.all==0){//如果判断被除数不能为0  如果为0 直接清空
                        $("#btn_aoto_adpat span").html("匹配完成");
                        clearInterval(timeIng);
                        self.ppeiEnd()//结束匹配
                      }else{
                        var jdu=  res.data.adapt/res.data.all//进度
                        if(jdu!=1){
          $('#btn_save_relation').click(function () {
            entryMaster.save();
          });
                          var jduBFB=parseInt(jdu*100)
                          if(!isNaN(jduBFB)){
                            $("#btn_aoto_adpat span").html("已匹配"+jduBFB+"%")
                          }
          //数据集
          $('#btn_aoto_adpat').click(function () {
            entryMaster.isAdaptationIng();
          });
          //字典
          $('#btn_aoto_adpat_dic').click(function () {
            entryMaster.isAdaptationIngDic();
          });
                        }else{
                          $("#btn_aoto_adpat span").html("匹配完成");
                          master.reloadGrid();
                          clearInterval(timeIng);
                          self.ppeiEnd()//结束匹配
                        }
                      }
                    }
          $("#searchNmEntry").keyup(function (e) {
            if (e.keyCode == 13) {
              entryMaster.reloadGrid();
            }
          });
                  },
                  error :function(res){
                  }
                })
      },3000)
    },//自动匹配进度
    ppeiEnd:function(){
      var self=this;
      var url="";
      var isDataSet = $("#isDataSet").val()
      if(isDataSet!="0"){//数据集
        url="${contextRoot}/adapterCenter/endStrategy"
      }
      $.ajax({
        type:"POST",
        dataType:"json",
        url:url,
        data:{version:$("#version").val()},
        success:function(res){
        },
        getColumn: function () {
          var columnCfg =[];
          var width;
          if(status=="1"){//已发布
            width = ["15%","15%","15%","15%","15%","12%","12%"];
          }else{//未发布
            width = ["12%","12%","12%","15%","12%","15%","12%"];
        error :function(res){
        }
      })
    },//结束匹配
    /**########数据集 END#########**/
    /**########字典 BEGIN#########**/
    isAdaptationIngDic:function(){
      var version = $("#version").val();
      var self=this;//为了获取项目id
      var url="";//AdapterDatasetController
      var obj="";//为了获取进度条
      var isDataSet = $("#isDataSet").val();
      if(isDataSet=="0"){//字典
        obj=self.$zidianZdsp
        url="${contextRoot}/adapterCenter/isStrategyDic"
      }
      var isCanPlay= setInterval(function(){//判断 是否可以开始匹配了
        $.ajax({
          type:"POST",
          dataType:"",
          url:url,
          data:{version:version},
          success:function(res){
            var isPPing=JSON.parse(res.data).isAdapt//是否正在匹配
            if(isPPing=="false"){//如果不是正在匹配
              self.pipeiDoDic();//开始匹配
            }else{//如果正在匹配
              self.autoAdaptationDic(obj);//显示进度
              clearInterval(isCanPlay)
            }
          }
        })
      },3000)
    },
    pipeiDoDic:function(){
      var std_version = $("#std_version").val();
      var version = $("#version").val();
      var adapter_std_version = $("#adapter_std_version").val();
      var parmas = {std_version:std_version,version:version,adapter_std_version:adapter_std_version};
      var self=this;
      var obj;//当前属于字典还是数据集对象,赋值匹配中
      var btnObj//自动匹配的按钮
      var url//链接
      var isDataSet = $("#isDataSet").val();
      if(isDataSet=="0"){//字典
        obj=$("#zidian .boxleft");
        url="${contextRoot}/adapterCenter/strategyDic"
      }
      $("#btn_aoto_adpat_dic span").html("匹配中...");
      $.ajax({
        type:"POST",
        dataType:"json",
        url:url,
        data:parmas,
        success:function(data){
          $("#btn_aoto_adpat_dic span").html("自动适配");
        },
        error:function(){
          if(cfgModel==0){
            columnCfg = [
              { display: 'id', name: 'id', hide:true },
              { display: 'stdDatasetId', name: 'stdDatasetId', hide:true },
              { display: 'stdMetadataId', name: 'stdMetadataId', hide:true },
              { display: 'adapterDatasetId', name: 'adapterDatasetId', hide:true },
              { display: 'adapterMetadataId', name: 'adapterMetadataId', hide:true },
              { display: 'adapterDataType', name: 'adapterDataType', hide:true },
              { display: '平台数据元编码', name: 'stdMetadataCode',width: width[0], isAllowHide: false ,align:'left' },
              { display: '平台数据元名称', name: 'stdMetadataName',width: width[1], isAllowHide: false ,align:'left' },
              { display: '应用数据集编码', name: 'adapterDatasetCode', width: width[2], render: function (row, rowindex, value, column) {
                  if(status =="1"){//已发布
                        return row.adapterDatasetCode;
                  }else{//未发布
                      var select=null;
                      if(row.adapterDatasetId==undefined || row.adapterDatasetCode==undefined || row.adapterDatasetName==undefined){
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-code"  id="adapterDatasetCode'+rowindex +'" ></select></div>');
                        dataRows++;
                      }else{
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-code"  id="adapterDatasetCode'+rowindex+'" >'
                                +'<option value="'+row.adapterDatasetId+','+row.adapterDatasetName+'">'+row.adapterDatasetCode+'</option></select></div>');
                      }
                      $('option[value="'+value+'"]',select).attr('selected',true);
                      return  select.prop("outerHTML");
                  }
              }},
              { display: '应用数据集名称', name: 'adapterDatasetName', width: width[3], render: function (row, rowindex, value, column) {
                  if(status =="1"){//已发布
                    return row.adapterDatasetName;
                  }else{//未发布
                    var select=null;
                    if(row.adapterDatasetId==undefined || row.adapterDatasetCode==undefined || row.adapterDatasetName==undefined){
                      select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-name"  id="adapterDatasetName'+rowindex +'" ></select></div>');
        }
      })
    },//开始匹配
    autoAdaptationDic:function(){
      var self=this;
      var url=""//进度
      var isDataSet = $("#isDataSet").val();
      var version = $("#version").val();
      if(isDataSet=="0"){//字典
        url="${contextRoot}/adapterCenter/getStrategyDicSize"
      }
      var timeIng =setInterval(function(){
        var ver =
                $.ajax({
                  type:"POST",
                  dataType:"json",
                  url:url,
                  data:{version:version},
                  success:function(res){
                    if(res.data==undefined){
                      $("#btn_aoto_adpat_dic span").html("请求中");
                    }else{
                      select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-name"  id="adapterDatasetName'+rowindex +'" >'
                              +'<option value="'+row.adapterDatasetId+','+row.adapterDatasetCode+'">'+row.adapterDatasetName+'</option></select></div>');
                    }
                    $('option[value="'+value+'"]',select).attr('selected',true);
                    return  select.prop("outerHTML");
                  }
              }},
              { display: '应用数据元编码', name: 'adapterMetadataCode', width: width[4], render: function (row, rowindex, value, column) {
                    if(status =="1"){//已发布
                      return row.adapterMetadataCode;
                    }else {//未发布
                      var select=null;
                      if(row.adapterMetadataId==undefined || row.adapterMetadataCode==undefined || row.adapterMetadataName==undefined){
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-code"  id="adapterMetadataCode'+rowindex +'" ></select></div>');
                      if(res.data.all==0){//如果判断被除数不能为0  如果为0 直接清空
                        $("#btn_aoto_adpat_dic span").html("匹配完成");
                        clearInterval(timeIng);
                        self.ppeiEndDic()//结束匹配
                      }else{
                        if(row.adapterDictId==undefined) {
                          select = $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-code"  id="adapterMetadataCode'+rowindex+'" >'
                                  +'<option value="'+row.adapterMetadataId+','+row.adapterMetadataName+'">'+row.adapterMetadataCode+'</option></select></div>');
                        }else {
                          select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-code"  id="adapterMetadataCode'+rowindex+'" >'
                                  +'<option value="'+row.adapterMetadataId+','+row.adapterMetadataName+','+row.adapterDictId +'">'+row.adapterMetadataCode+'</option></select></div>');
                        var jdu=  res.data.adapt/res.data.all//进度
                        if(jdu!=1){
                          var jduBFB=parseInt(jdu*100)
                          if(!isNaN(jduBFB)){
                            $("#btn_aoto_adpat_dic span").html("已匹配"+jduBFB+"%")
                          }
                        }else{
                          $("#btn_aoto_adpat_dic span").html("匹配完成");
                          master.reloadGrid();
                          clearInterval(timeIng);
                          self.ppeiEndDic()//结束匹配
                        }
                      }
                      $('option[value="'+value+'"]',select).attr('selected',true);
                      return  select.prop("outerHTML");
                    }
              }},
              { display: '应用数据元名称', name: 'adapterMetadataName', width: width[5], render: function (row, rowindex, value, column) {
                  if(status =="1"){//已发布
                    return row.adapterMetadataName;
                  }else {//未发布
                    var select=null;
                    if(row.adapterMetadataId==undefined || row.adapterMetadataCode==undefined || row.adapterMetadataName==undefined){
                      select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-name"  id="adapterMetadataName'+rowindex +'" ></select></div>');
                    }else{
                      select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-name"  id="adapterMetadataName'+rowindex +'" >'
                              +'<option value="'+row.adapterMetadataId+','+row.adapterMetadataCode+'">'+row.adapterMetadataName+'</option></select></div>');
                    }
                    $('option[value="'+value+'"]',select).attr('selected',true);
                    return  select.prop("outerHTML");
                  }
              }},
              { display: '应用数据元类型', name: 'adapterDataType', width: width[6], render: function (row, rowindex, value, column) {
                
                if(status =="1"){//已发布
                  if(row.adapterDataType == 1) {
                      return "编码";
                  }else{
                    return "值"
                  }
                }else {//未发布
                  var select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-type"  id="adapterDataType'+rowindex +'" >'
                          +'<option value="0">'+'值'+'</option>'
                          +'<option value="1">'+'编码'+'</option></select></div>');
                  if(row.adapterDataType == null){
                     value = 0;
                  }
                })
      },3000)
    },//自动匹配进度
    ppeiEndDic:function(){
      var self=this;
      var url="";
      var isDataSet = $("#isDataSet").val()
      if(isDataSet=="0"){//字典
        url="${contextRoot}/adapterCenter/endStrategyDic"
      }
      $.ajax({
        type:"POST",
        dataType:"json",
        url:url,
        data:{version:$("#version").val()},
        success:function(res){
                  $('option[value="'+value+'"]',select).attr('selected',true);
                  return  select.prop("outerHTML");
                }
              }},{
                display:'适配情况',name:'adapterInfo',width:'5%',render: function (row, rowindex, value, column) {
                  var select=null;
                  if(row.adapterDatasetId==undefined || row.adapterDatasetCode==undefined || row.adapterDatasetName==undefined){
                    select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'" ><option value="0">未适配</option></select></div>');
                  }else{
                    select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'">'
                            +'<option value="1" >疑似适配</option><option value="2">完全适配</option></select></div>');
                  }
                  $('option[value="'+value+'"]',select).attr('selected',true);
                  return  select.prop("outerHTML");
                }
        }
      })
    },//结束匹配
    /**########字典 END#########**/
    uniqueArray:function(a){ /* 判断适配方案id、目标字典id、目标字典项id、源字典项id是否重复*/
      var temp = new Array();
      for(var i = 0; i < a.length; i ++){
        if(!entryMaster.contains(temp, a[i].schemeId + a[i].stdDictId+a[i].stdEntryId + a[i].adapterEntryId)){
          temp.length+=1;
          temp[temp.length-1] = a[i].schemeId + a[i].stdDictId+a[i].stdEntryId + a[i].adapterEntryId;
        }
      }
      return temp;
    },
    contains:function(a,e){
      for(j=0;j<a.length;j++)if(a[j]==e)return true;
      return false
    },
    bindEvents: function () {
      //窗体改变大小事件
      $(window).bind('resize', function() {
        resizeContent();
      });
      $('#btn_add_relation').click(function () {
        entryMaster.add();;
      });
      $('#btn_save_relation').click(function () {
        entryMaster.save();
      });
      //数据集
      $('#btn_aoto_adpat').click(function () {
        entryMaster.isAdaptationIng();
      });
      //字典
      $('#btn_aoto_adpat_dic').click(function () {
        entryMaster.isAdaptationIngDic();
      });
      $("#searchNmEntry").keyup(function (e) {
        if (e.keyCode == 13) {
          entryMaster.reloadGrid();
        }
      });
    },
    getColumn: function () {
      var columnCfg =[];
      var width;
      if(status=="1"){//已发布
        width = ["15%","15%","15%","15%","15%","12%","12%"];
      }else{//未发布
        width = ["12%","12%","12%","15%","12%","15%","12%"];
      }
      if(cfgModel==0){
        columnCfg = [
          { display: 'id', name: 'id', hide:true },
          { display: 'stdDatasetId', name: 'stdDatasetId', hide:true },
          { display: 'stdMetadataId', name: 'stdMetadataId', hide:true },
          { display: 'adapterDatasetId', name: 'adapterDatasetId', hide:true },
          { display: 'adapterMetadataId', name: 'adapterMetadataId', hide:true },
          { display: 'adapterDataType', name: 'adapterDataType', hide:true },
          { display: '目标数据元编码', name: 'stdMetadataCode',width: width[0], isAllowHide: false ,align:'left' },
          { display: '目标数据元名称', name: 'stdMetadataName',width: width[1], isAllowHide: false ,align:'left' },
          { display: '源数据集编码', name: 'adapterDatasetCode', width: width[2], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterDatasetCode;
            }else{//未发布
              var select=null;
              if(row.adapterDatasetId==undefined || row.adapterDatasetCode==undefined || row.adapterDatasetName==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-code"  id="adapterDatasetCode'+rowindex +'" ></select></div>');
                dataRows++;
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-code"  id="adapterDatasetCode'+rowindex+'" >'
                        +'<option value="'+row.adapterDatasetId+','+row.adapterDatasetName+'">'+row.adapterDatasetCode+'</option></select></div>');
              }
            ]
            if(status =="0"){//未发布
              columnCfg.push({ display: '操作', name: 'operator', width: '10%', render: function (row, rowindex, value, column) {
                var html = '<div class="m-inline-buttons" style="width:40px;">';
                html += '<a href="#" class="m-btn-clear" onclick="entryMaster.delete(\''+rowindex+'\',\'dataset\')"></a>';
                return html;
              }});
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }
          else{
            columnCfg = [
              { display: 'id', name: 'id', hide:true },
              { display: 'stdDictId', name: 'stdDictId', hide:true },
              { display: 'stdEntryId', name: 'stdEntryId', hide:true },
              { display: 'adapterDictId', name: 'adapterDictId', hide:true },
              { display: 'adapterEntryId', name: 'adapterEntryId', hide:true },
              { display: '平台字典项编码', name: 'stdEntryCode', width: width[0], render: function (row, rowindex, value, column) {
                  if(status =="1"){//已发布
                    return row.stdEntryCode;
                  }else {//未发布
                    var select=null;
                    if(row.stdEntryId==undefined || row.stdEntryCode==undefined || row.stdEntryValue==undefined){
                      select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-code"  id="stdEntryCode'+rowindex +'" ></select></div>');
                    }else{
                      select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-code"  id="stdEntryCode'+rowindex+'" >'
                              +'<option value="'+row.stdEntryId+','+row.stdEntryValue+'">'+row.stdEntryCode+'</option></select></div>');
                    }
                    $('option[value="'+value+'"]',select).attr('selected',true);
                    return  select.prop("outerHTML");
                  }
              }},
              { display: '平台字典项值', name: 'stdEntryValue', width: width[1], render: function (row, rowindex, value, column) {
                    if(status =="1"){//已发布
                      return row.stdEntryValue;
                    }else {//未发布
                      var select=null;
                      if(row.stdEntryId==undefined || row.stdEntryCode==undefined || row.stdEntryValue==undefined){
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-value"  id="stdEntryValue'+rowindex +'" ></select></div>');
                      }else{
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-value"  id="stdEntryValue'+rowindex +'" >'
                                +'<option value="'+row.stdEntryId+','+row.stdEntryCode+'">'+row.stdEntryValue+'</option></select></div>');
                      }
                      $('option[value="'+value+'"]',select).attr('selected',true);
                      return  select.prop("outerHTML");
                    }
              }},
              { display: '应用字典编码', name: 'adapterDictCode', width: width[2], render: function (row, rowindex, value, column) {
                    if(status =="1"){//已发布
                      return row.adapterDictCode;
                    }else {//未发布
                      var select=null;
                      if(row.adapterDictId==undefined || row.adapterDictCode==undefined || row.adapterDictName==undefined){
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-code"  id="adapterDictCode'+rowindex +'" ></select></div>');
                        dataRows++;
                      }else{
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-code"  id="adapterDictCode'+rowindex+'" >'
                                +'<option value="'+row.adapterDictId+','+row.adapterDictName+'">'+row.adapterDictCode+'</option></select></div>');
                      }
                      $('option[value="'+value+'"]',select).attr('selected',true);
                      return  select.prop("outerHTML");
                    }
              }},
              { display: '应用字典名称', name: 'adapterDictName', width: width[3], render: function (row, rowindex, value, column) {
                    if(status =="1"){//已发布
                      return row.adapterDictName;
                    }else {//未发布
                      var select=null;
                      if(row.adapterDictId==undefined || row.adapterDictCode==undefined || row.adapterDictName==undefined){
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-name"  id="adapterDictName'+rowindex +'" ></select></div>');
                      }else{
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-name"  id="adapterDictName'+rowindex +'" >'
                                +'<option value="'+row.adapterDictId+','+row.adapterDictCode+'">'+row.adapterDictName+'</option></select></div>');
                      }
                      $('option[value="'+value+'"]',select).attr('selected',true);
                      return  select.prop("outerHTML");
                    }
              }},
              { display: '应用字典项编码', name: 'adapterEntryCode', width: width[4], render: function (row, rowindex, value, column) {
                    if(status =="1"){//已发布
                      return row.adapterEntryCode;
                    }else {//未发布
                      var select=null;
                      if(row.adapterEntryId==undefined || row.adapterEntryCode==undefined || row.adapterEntryValue==undefined){
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-code"  id="adapterEntryCode'+rowindex +'" ></select></div>');
                      }else{
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-code"  id="adapterEntryCode'+rowindex+'" >'
                                +'<option value="'+row.adapterEntryId+','+row.adapterEntryValue+'">'+row.adapterEntryCode+'</option></select></div>');
                      }
                      $('option[value="'+value+'"]',select).attr('selected',true);
                      return  select.prop("outerHTML");
                    }
              }},
              { display: '应用字典项值', name: 'adapterEntryValue', width: width[5], render: function (row, rowindex, value, column) {
                    if(status =="1"){//已发布
                      return row.adapterEntryValue;
                    }else {//未发布
                      var select=null;
                      if(row.adapterEntryId==undefined || row.adapterEntryCode==undefined || row.adapterEntryValue==undefined){
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-value"  id="adapterEntryValue'+rowindex +'" ></select></div>');
                      }else{
                        select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-value"  id="adapterEntryValue'+rowindex +'" >'
                                +'<option value="'+row.adapterEntryId+','+row.adapterEntryCode+'">'+row.adapterEntryValue+'</option></select></div>');
                      }
                      $('option[value="'+value+'"]',select).attr('selected',true);
                      return  select.prop("outerHTML");
                    }
              }},{
                display:'适配情况',name:'adapterInfo',width:'5%',render: function (row, rowindex, value, column) {
                  var select=null;
                  if(row.adapterEntryId==undefined || row.adapterEntryCode==undefined || row.adapterEntryValue==undefined){
                    select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'" ><option value="0">未适配</option></select></div>');
                  }else{
                    select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'">'
                            +'<option value="1" >疑似适配</option><option value="2">完全适配</option></select></div>');
                  }
                  $('option[value="'+value+'"]',select).attr('selected',true);
                  return  select.prop("outerHTML");
          }},
          { display: '源数据集名称', name: 'adapterDatasetName', width: width[3], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterDatasetName;
            }else{//未发布
              var select=null;
              if(row.adapterDatasetId==undefined || row.adapterDatasetCode==undefined || row.adapterDatasetName==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-name"  id="adapterDatasetName'+rowindex +'" ></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dataset-name"  id="adapterDatasetName'+rowindex +'" >'
                        +'<option value="'+row.adapterDatasetId+','+row.adapterDatasetCode+'">'+row.adapterDatasetName+'</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},
          { display: '源数据元编码', name: 'adapterMetadataCode', width: width[4], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterMetadataCode;
            }else {//未发布
              var select=null;
              if(row.adapterMetadataId==undefined || row.adapterMetadataCode==undefined || row.adapterMetadataName==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-code"  id="adapterMetadataCode'+rowindex +'" ></select></div>');
              }else{
                if(row.adapterDictId==undefined) {
                  select = $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-code"  id="adapterMetadataCode'+rowindex+'" >'
                          +'<option value="'+row.adapterMetadataId+','+row.adapterMetadataName+'">'+row.adapterMetadataCode+'</option></select></div>');
                }else {
                  select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-code"  id="adapterMetadataCode'+rowindex+'" >'
                          +'<option value="'+row.adapterMetadataId+','+row.adapterMetadataName+','+row.adapterDictId +'">'+row.adapterMetadataCode+'</option></select></div>');
                }
              }
            ]
            if(status =="0") {//未发布
              columnCfg.push({ display: '操作', name: 'operator', width: '10%', render: function (row, rowindex, value, column) {
                var html = '<div class="m-inline-buttons" style="width:40px;">';
                html += '<a href="#" class="m-btn-clear" onclick="entryMaster.delete(\''+rowindex+'\',\'dict\')"></a>';
                return html;
              }});
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }
          return columnCfg;
        }
      };
          }},
          { display: '源数据元名称', name: 'adapterMetadataName', width: width[5], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterMetadataName;
            }else {//未发布
              var select=null;
              if(row.adapterMetadataId==undefined || row.adapterMetadataCode==undefined || row.adapterMetadataName==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-name"  id="adapterMetadataName'+rowindex +'" ></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-name"  id="adapterMetadataName'+rowindex +'" >'
                        +'<option value="'+row.adapterMetadataId+','+row.adapterMetadataCode+'">'+row.adapterMetadataName+'</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},
          { display: '源数据元类型', name: 'adapterDataType', width: width[6], render: function (row, rowindex, value, column) {
      //应用数据集编码-应用数据集名称联动公共方法
      function comAdapterDataset(that,requestType,targer,changeTarget){
        var index =that.attr("id").replace(targer,"");
        var adapterStdVersion = $("#adapter_std_version").val();
        var arr = that.val()==null?[]:that.val().split(",");
        var url = '${contextRoot}' + "/standardCenter/getDatasetCodeValues?stdVersion="+adapterStdVersion+"&rows=10&order=";
        if(arr.length>0){
          if(targer=="adapterDatasetCode"){
            var selectText = "";
            $('#adapterDatasetCode'+index+' option').each(function () {
              if($(this).val()==(arr[0]+","+arr[1])){
                selectText = $(this).html();
                return false;
            if(status =="1"){//已发布
              if(row.adapterDataType == 1) {
                return "编码";
              }else{
                return "值"
              }
            });
            url = '${contextRoot}' + "/standardCenter/getDatasetCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+selectText;//默认选中适配值
          }else{
            url = '${contextRoot}' + "/standardCenter/getDatasetCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+arr[1];//默认选中适配值
          }
            }else {//未发布
              var select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-metadata-type"  id="adapterDataType'+rowindex +'" >'
                      +'<option value="0">'+'值'+'</option>'
                      +'<option value="1">'+'编码'+'</option></select></div>');
        }
        return selectBind(that,arr,requestType,targer,changeTarget,index,url);
      }
              if(row.adapterDataType == null){
                value = 0;
              }
      //应用数据元编码-应用数据元名称联动公共方法
      function comAdapterMetaData(that,requestType,targer,changeTarget){
        var index =that.attr("id").replace(targer,"");
        var adapterDatasetArr = $("#adapterDatasetCode"+index).val()==null?[]:$("#adapterDatasetCode"+index).val().split(",");
        var arr = that.val()==null?[]:that.val().split(",");
        var adapterStdVersion = $("#adapter_std_version").val();
        if (adapterDatasetArr.length>0) {
          var url = '${contextRoot}' + "/standardCenter/getMetadataCodeValues?stdVersion="+adapterStdVersion+"&datasetId="+adapterDatasetArr[0]+"&rows=10&order=";
          if(arr.length>0){
            url = '${contextRoot}' + "/standardCenter/getMetadataCodeValues?stdVersion="+adapterStdVersion+"&datasetId="+adapterDatasetArr[0]+"&rows=10&order=&initMetadataNm="+arr[1];//默认选中适配值
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},{
            display:'适配情况',name:'adapterInfo',width:'5%',render: function (row, rowindex, value, column) {
              var select=null;
              if(row.adapterDatasetId==undefined || row.adapterDatasetCode==undefined || row.adapterDatasetName==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'" ><option value="0">未适配</option></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'">'
                        +'<option value="1" >疑似适配</option><option value="2">完全适配</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }
        }
        return selectBind(that,arr,requestType,targer,changeTarget,index,url);
      }
        ]
      //平台字典项编码-平台字典项名称联动公共方法
      function comStdDictEntry(that,requestType,targer,changeTarget){
        var index="";
        if(!Util.isStrEmpty(that.attr("id"))){
          index =that.attr("id").replace(targer,"");
        }
        var stdVersion = $("#std_version").val();
        var arr = that.val()==null?[]:that.val().split(",");
        var url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+stdVersion+"&dictId="+$("#std_dict_id").val()+"&rows=10&order=";
        if(arr.length>0){
          url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+stdVersion+"&dictId="+$("#std_dict_id").val()+"&rows=10&order=&initDictValue="+arr[1];//默认选中适配值
        if(status =="0"){//未发布
          columnCfg.push({ display: '操作', name: 'operator', width: '10%', render: function (row, rowindex, value, column) {
            var html = '<div class="m-inline-buttons" style="width:40px;">';
            html += '<a href="#" class="m-btn-clear" onclick="entryMaster.delete(\''+rowindex+'\',\'dataset\')"></a>';
            return html;
          }});
        }
        return selectBind(that,arr,requestType,targer,changeTarget,index,url);
      }
      //应用字典编码-应用字典名称联动公共方法
      function comAdapterDict(that,requestType,targer,changeTarget){
        var index =that.attr("id").replace(targer,"");
        var adapterStdVersion = $("#adapter_std_version").val();
        var arr = that.val()==null?[]:that.val().split(",");
        var url = '${contextRoot}' + "/standardCenter/getDictCodeValues?stdVersion="+adapterStdVersion+"&rows=10&order=";
        if(arr.length>0){
          if(targer=="adapterDictCode"){
            var selectText = "";
            $('#adapterDictCode'+index+' option').each(function () {
              if($(this).val()==(arr[0]+","+arr[1])){
                selectText = $(this).html();
                return false;
      else{
        columnCfg = [
          { display: 'id', name: 'id', hide:true },
          { display: 'stdDictId', name: 'stdDictId', hide:true },
          { display: 'stdEntryId', name: 'stdEntryId', hide:true },
          { display: 'adapterDictId', name: 'adapterDictId', hide:true },
          { display: 'adapterEntryId', name: 'adapterEntryId', hide:true },
          { display: '目标字典项编码', name: 'stdEntryCode', width: width[0], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.stdEntryCode;
            }else {//未发布
              var select=null;
              if(row.stdEntryId==undefined || row.stdEntryCode==undefined || row.stdEntryValue==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-code"  id="stdEntryCode'+rowindex +'" ></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-code"  id="stdEntryCode'+rowindex+'" >'
                        +'<option value="'+row.stdEntryId+','+row.stdEntryValue+'">'+row.stdEntryCode+'</option></select></div>');
              }
            });
            url = '${contextRoot}' + "/standardCenter/getDictCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+selectText;//默认选中适配值
          }else{
            url = '${contextRoot}' + "/standardCenter/getDictCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+arr[1];//默认选中适配值
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},
          { display: '目标字典项值', name: 'stdEntryValue', width: width[1], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.stdEntryValue;
            }else {//未发布
              var select=null;
              if(row.stdEntryId==undefined || row.stdEntryCode==undefined || row.stdEntryValue==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-value"  id="stdEntryValue'+rowindex +'" ></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-std-dictEntry-value"  id="stdEntryValue'+rowindex +'" >'
                        +'<option value="'+row.stdEntryId+','+row.stdEntryCode+'">'+row.stdEntryValue+'</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},
          { display: '源字典编码', name: 'adapterDictCode', width: width[2], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterDictCode;
            }else {//未发布
              var select=null;
              if(row.adapterDictId==undefined || row.adapterDictCode==undefined || row.adapterDictName==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-code"  id="adapterDictCode'+rowindex +'" ></select></div>');
                dataRows++;
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-code"  id="adapterDictCode'+rowindex+'" >'
                        +'<option value="'+row.adapterDictId+','+row.adapterDictName+'">'+row.adapterDictCode+'</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},
          { display: '源字典名称', name: 'adapterDictName', width: width[3], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterDictName;
            }else {//未发布
              var select=null;
              if(row.adapterDictId==undefined || row.adapterDictCode==undefined || row.adapterDictName==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-name"  id="adapterDictName'+rowindex +'" ></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dict-name"  id="adapterDictName'+rowindex +'" >'
                        +'<option value="'+row.adapterDictId+','+row.adapterDictCode+'">'+row.adapterDictName+'</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},
          { display: '源字典项编码', name: 'adapterEntryCode', width: width[4], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterEntryCode;
            }else {//未发布
              var select=null;
              if(row.adapterEntryId==undefined || row.adapterEntryCode==undefined || row.adapterEntryValue==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-code"  id="adapterEntryCode'+rowindex +'" ></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-code"  id="adapterEntryCode'+rowindex+'" >'
                        +'<option value="'+row.adapterEntryId+','+row.adapterEntryValue+'">'+row.adapterEntryCode+'</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},
          { display: '源字典项值', name: 'adapterEntryValue', width: width[5], render: function (row, rowindex, value, column) {
            if(status =="1"){//已发布
              return row.adapterEntryValue;
            }else {//未发布
              var select=null;
              if(row.adapterEntryId==undefined || row.adapterEntryCode==undefined || row.adapterEntryValue==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-value"  id="adapterEntryValue'+rowindex +'" ></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array sel-adapter-dictEntry-value"  id="adapterEntryValue'+rowindex +'" >'
                        +'<option value="'+row.adapterEntryId+','+row.adapterEntryCode+'">'+row.adapterEntryValue+'</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }},{
            display:'适配情况',name:'adapterInfo',width:'5%',render: function (row, rowindex, value, column) {
              var select=null;
              if(row.adapterEntryId==undefined || row.adapterEntryCode==undefined || row.adapterEntryValue==undefined){
                select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'" ><option value="0">未适配</option></select></div>');
              }else{
                select= $('<div class="f-mt25"><select class="js-example-data-array" id="adapterInfo'+rowindex+'">'
                        +'<option value="1" >疑似适配</option><option value="2">完全适配</option></select></div>');
              }
              $('option[value="'+value+'"]',select).attr('selected',true);
              return  select.prop("outerHTML");
            }
          }
        }
        return selectBind(that,arr,requestType,targer,changeTarget,index,url);
      }
        ]
      //应用字典项编码-应用字典项名称联动公共方法
      function comAdapterDictEntry(that,requestType,targer,changeTarget){
        var index="";
        if(!Util.isStrEmpty(that.attr("id"))){
          index =that.attr("id").replace(targer,"");
        if(status =="0") {//未发布
          columnCfg.push({ display: '操作', name: 'operator', width: '10%', render: function (row, rowindex, value, column) {
            var html = '<div class="m-inline-buttons" style="width:40px;">';
            html += '<a href="#" class="m-btn-clear" onclick="entryMaster.delete(\''+rowindex+'\',\'dict\')"></a>';
            return html;
          }});
        }
        var adapterDictCodeArr = $("#adapterDictCode"+index).val()==null?[]:$("#adapterDictCode"+index).val().split(",");
        var adapterStdVersion = $("#adapter_std_version").val();
        var arr = that.val()==null?[]:that.val().split(",");
        if (adapterDictCodeArr.length>0) {
          var url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+adapterStdVersion+"&dictId="+adapterDictCodeArr[0]+"&rows=10&order=";
          if(arr.length>0){
            url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+adapterStdVersion+"&dictId="+adapterDictCodeArr[0]+"&rows=10&order=&initDictValue="+arr[1];//默认选中适配值
      }
      return columnCfg;
    }
  };
  //源数据集编码-源数据集名称联动公共方法
  function comAdapterDataset(that,requestType,targer,changeTarget){
    var index =that.attr("id").replace(targer,"");
    var adapterStdVersion = $("#adapter_std_version").val();
    var arr = that.val()==null?[]:that.val().split(",");
    var url = '${contextRoot}' + "/standardCenter/getDatasetCodeValues?stdVersion="+adapterStdVersion+"&rows=10&order=";
    if(arr.length>0){
      if(targer=="adapterDatasetCode"){
        var selectText = "";
        $('#adapterDatasetCode'+index+' option').each(function () {
          if($(this).val()==(arr[0]+","+arr[1])){
            selectText = $(this).html();
            return false;
          }
        }
        return selectBind(that,arr,requestType,targer,changeTarget,index,url);
        });
        url = '${contextRoot}' + "/standardCenter/getDatasetCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+selectText;//默认选中适配值
      }else{
        url = '${contextRoot}' + "/standardCenter/getDatasetCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+arr[1];//默认选中适配值
      }
      function selectBind(that,arr,requestType,targer,changeTarget,index,url) {
        var selectId = "";
    }
    return selectBind(that,arr,requestType,targer,changeTarget,index,url);
  }
  //源数据元编码-源数据元名称联动公共方法
  function comAdapterMetaData(that,requestType,targer,changeTarget){
    var index =that.attr("id").replace(targer,"");
    var adapterDatasetArr = $("#adapterDatasetCode"+index).val()==null?[]:$("#adapterDatasetCode"+index).val().split(",");
    var arr = that.val()==null?[]:that.val().split(",");
    var adapterStdVersion = $("#adapter_std_version").val();
    if (adapterDatasetArr.length>0) {
      var url = '${contextRoot}' + "/standardCenter/getMetadataCodeValues?stdVersion="+adapterStdVersion+"&datasetId="+adapterDatasetArr[0]+"&rows=10&order=";
      if(arr.length>0){
        url = '${contextRoot}' + "/standardCenter/getMetadataCodeValues?stdVersion="+adapterStdVersion+"&datasetId="+adapterDatasetArr[0]+"&rows=10&order=&initMetadataNm="+arr[1];//默认选中适配值
      }
    }
    return selectBind(that,arr,requestType,targer,changeTarget,index,url);
  }
  //目标字典项编码-目标字典项名称联动公共方法
  function comStdDictEntry(that,requestType,targer,changeTarget){
    var index="";
    if(!Util.isStrEmpty(that.attr("id"))){
      index =that.attr("id").replace(targer,"");
    }
    var stdVersion = $("#std_version").val();
    var arr = that.val()==null?[]:that.val().split(",");
    var url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+stdVersion+"&dictId="+$("#std_dict_id").val()+"&rows=10&order=";
    if(arr.length>0){
      url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+stdVersion+"&dictId="+$("#std_dict_id").val()+"&rows=10&order=&initDictValue="+arr[1];//默认选中适配值
    }
    return selectBind(that,arr,requestType,targer,changeTarget,index,url);
  }
  //源字典编码-源字典名称联动公共方法
  function comAdapterDict(that,requestType,targer,changeTarget){
    var index =that.attr("id").replace(targer,"");
    var adapterStdVersion = $("#adapter_std_version").val();
    var arr = that.val()==null?[]:that.val().split(",");
    var url = '${contextRoot}' + "/standardCenter/getDictCodeValues?stdVersion="+adapterStdVersion+"&rows=10&order=";
    if(arr.length>0){
      if(targer=="adapterDictCode"){
        var selectText = "";
        if(arr.length>0 && requestType=="change"){
          var option ="";
          if(arr.length >2 && arr[2]!=undefined) {
            option = '<option value="'+arr[0]+","+  $('#'+that.attr("id")).find("option:selected").text()+ "," + arr[2] +'">'+arr[1]+'</option>';
          }else {
            option = '<option value="'+arr[0]+","+  $('#'+that.attr("id")).find("option:selected").text()+'">'+arr[1]+'</option>';
          }
          $("#"+changeTarget+index).html("");
          $("#"+changeTarget+index).append(option);
          if(targer=="adapterDatasetCode" || targer=="adapterDatasetName" || targer=="adapterDictCode" || targer=="adapterDictName"){
            selectId =  arr[0]+","+ arr[1];
            selectText = $('#'+that.attr("id")).find("option:selected").text();
        $('#adapterDictCode'+index+' option').each(function () {
          if($(this).val()==(arr[0]+","+arr[1])){
            selectText = $(this).html();
            return false;
          }
        });
        url = '${contextRoot}' + "/standardCenter/getDictCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+selectText;//默认选中适配值
      }else{
        url = '${contextRoot}' + "/standardCenter/getDictCodeValues?stdVersion="+adapterStdVersion+"&rows=9&order=&initVal="+arr[1];//默认选中适配值
      }
    }
    return selectBind(that,arr,requestType,targer,changeTarget,index,url);
  }
  //源字典项编码-源字典项名称联动公共方法
  function comAdapterDictEntry(that,requestType,targer,changeTarget){
    var index="";
    if(!Util.isStrEmpty(that.attr("id"))){
      index =that.attr("id").replace(targer,"");
    }
    var adapterDictCodeArr = $("#adapterDictCode"+index).val()==null?[]:$("#adapterDictCode"+index).val().split(",");
    var adapterStdVersion = $("#adapter_std_version").val();
    var arr = that.val()==null?[]:that.val().split(",");
    if (adapterDictCodeArr.length>0) {
      var url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+adapterStdVersion+"&dictId="+adapterDictCodeArr[0]+"&rows=10&order=";
      if(arr.length>0){
        url = '${contextRoot}' + "/standardCenter/getDictEntryCodeValues?stdVersion="+adapterStdVersion+"&dictId="+adapterDictCodeArr[0]+"&rows=10&order=&initDictValue="+arr[1];//默认选中适配值
      }
    }
    return selectBind(that,arr,requestType,targer,changeTarget,index,url);
  }
  function selectBind(that,arr,requestType,targer,changeTarget,index,url) {
    var selectId = "";
    var selectText = "";
    if(arr.length>0 && requestType=="change"){
      var option ="";
      if(arr.length >2 && arr[2]!=undefined) {
        option = '<option value="'+arr[0]+","+  $('#'+that.attr("id")).find("option:selected").text()+ "," + arr[2] +'">'+arr[1]+'</option>';
      }else {
        option = '<option value="'+arr[0]+","+  $('#'+that.attr("id")).find("option:selected").text()+'">'+arr[1]+'</option>';
      }
      $("#"+changeTarget+index).html("");
      $("#"+changeTarget+index).append(option);
      if(targer=="adapterDatasetCode" || targer=="adapterDatasetName" || targer=="adapterDictCode" || targer=="adapterDictName"){
        selectId =  arr[0]+","+ arr[1];
        selectText = $('#'+that.attr("id")).find("option:selected").text();
      }
        }else if(arr.length==0 && requestType=="change"){
          $("#"+changeTarget+index).html("");
        }
        if(Util.isStrEmpty(url)){
          var select2 =  that.select2({ placeholder: "只显示前10条结果",data:[]});
          return select2;
        }else{
          //查询下拉框数据
          var select2 =  that.select2({
            placeholder: "只显示前10条结果",
            ajax: {
              async:false,
              dataType : "json",
              url: url,
              processResults: function (data, page) {
                if(data.successFlg){
                  if(targer=="adapterDatasetCode" || targer=="adapterMetadataCode"
                          || targer=="adapterDictCode" || targer=="adapterEntryCode" || targer=="stdEntryCode"){//由于机构适配值的数据格式为id:id+“,”+code,text:name,但是机构适配值为id:id+","+name,text:code,所以需要重新组装数据
                    var toData;
                    var toArr = [];
                    var resultData = data.detailModelList||[];
                    if(targer=="adapterDatasetCode" || targer=="adapterDictCode" && resultData.length>0){//查询结果有值,才填充原本选中的值
                      toArr.push({id:selectId,text:selectText});
                    }
    }else if(arr.length==0 && requestType=="change"){
      $("#"+changeTarget+index).html("");
    }
    if(Util.isStrEmpty(url)){
      var select2 =  that.select2({ placeholder: "只显示前10条结果",data:[]});
      return select2;
    }else{
      //查询下拉框数据
      var select2 =  that.select2({
        placeholder: "只显示前10条结果",
        ajax: {
          async:false,
          dataType : "json",
          url: url,
          processResults: function (data, page) {
            if(data.successFlg){
              if(targer=="adapterDatasetCode" || targer=="adapterMetadataCode"
                      || targer=="adapterDictCode" || targer=="adapterEntryCode" || targer=="stdEntryCode"){//由于机构适配值的数据格式为id:id+“,”+code,text:name,但是机构适配值为id:id+","+name,text:code,所以需要重新组装数据
                var toData;
                var toArr = [];
                var resultData = data.detailModelList||[];
                if(targer=="adapterDatasetCode" || targer=="adapterDictCode" && resultData.length>0){//查询结果有值,才填充原本选中的值
                  toArr.push({id:selectId,text:selectText});
                }
                    for(var i=0;i<resultData.length;i++){
                      var name = resultData[i].text;
                      var id = "";
                      if(resultData[i].id.split(",").length >2) {
                        if(resultData[i].id.split(",")[2] != undefined) {
                          id = resultData[i].id==null?"": resultData[i].id.split(",")[0]+","+name + "," + resultData[i].id.split(",")[2];
                        }
                      }else {
                        id = resultData[i].id==null?"": resultData[i].id.split(",")[0]+","+name ;
                      }
                      var code =  resultData[i].id==null?"": resultData[i].id.split(",")[1];
                      toData = {id: id, text: code};
                      toArr.push(toData);
                for(var i=0;i<resultData.length;i++){
                  var name = resultData[i].text;
                  var id = "";
                  if(resultData[i].id.split(",").length >2) {
                    if(resultData[i].id.split(",")[2] != undefined) {
                      id = resultData[i].id==null?"": resultData[i].id.split(",")[0]+","+name + "," + resultData[i].id.split(",")[2];
                    }
                  }else {
                    id = resultData[i].id==null?"": resultData[i].id.split(",")[0]+","+name ;
                  }
                  var code =  resultData[i].id==null?"": resultData[i].id.split(",")[1];
                  toData = {id: id, text: code};
                  toArr.push(toData);
                }
                    return {
                      results:undulpicate(toArr)
                    };
                  }else{//机构适配名称
                    if(targer=="adapterDatasetName" || targer=="adapterDictName"){
                      var resultData = [];
                      var detailModelList = data.detailModelList;
                      if(detailModelList.length>0){
                        resultData.push({id:selectId,text:selectText});
                      }
                      for(var i=0;i<detailModelList.length;i++){
                        var  toData = {id: detailModelList[i].id, text: detailModelList[i].text};
                        resultData.push(toData);
                      }
                      return {
                        results:  undulpicate(resultData)
                      };
                    }else{
                      return {
                        results:  data.detailModelList
                      };
                    }
                return {
                  results:undulpicate(toArr)
                };
              }else{//机构适配名称
                if(targer=="adapterDatasetName" || targer=="adapterDictName"){
                  var resultData = [];
                  var detailModelList = data.detailModelList;
                  if(detailModelList.length>0){
                    resultData.push({id:selectId,text:selectText});
                  }
                  for(var i=0;i<detailModelList.length;i++){
                    var  toData = {id: detailModelList[i].id, text: detailModelList[i].text};
                    resultData.push(toData);
                  }
                  return {
                    results:  undulpicate(resultData)
                  };
                }else{
                  $.ligerDialog.error(data.message);
                  return {
                    results:  data.detailModelList
                  };
                }
              }
//                cache: true
              },
              escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
              minimumInputLength: 1,
            }else{
              $.ligerDialog.error(data.message);
            }
          })
          return select2;
        }
        function undulpicate(array){//删除数组重复元素
          array.sort();
          for(var i=0;i<array.length;i++) {
            for(var j=i+1;j<array.length;j++) {
              //注意 ===
              if(isObjectValueEqual(array[i],array[j])) {
                array.splice(j,1);
                j--;
              }
            }
          }
          return array;
//                cache: true
          },
          escapeMarkup: function (markup) { return markup; }, // let our custom formatter work
          minimumInputLength: 1,
        }
        function isObjectValueEqual(a, b) {//判断两个对象的值是否相等
          var aProps = Object.getOwnPropertyNames(a);
          var bProps = Object.getOwnPropertyNames(b);
          if (aProps.length != bProps.length) {
            return false;
      })
      return select2;
    }
    function undulpicate(array){//删除数组重复元素
      array.sort();
      for(var i=0;i<array.length;i++) {
        for(var j=i+1;j<array.length;j++) {
          //注意 ===
          if(isObjectValueEqual(array[i],array[j])) {
            array.splice(j,1);
            j--;
          }
          for (var i = 0; i < aProps.length; i++) {
            var propName = aProps[i];
            if (a[propName] !== b[propName]) {
              return false;
            }
          }
          return true;
        }
      }
      return array;
    }
    function isObjectValueEqual(a, b) {//判断两个对象的值是否相等
      var aProps = Object.getOwnPropertyNames(a);
      var bProps = Object.getOwnPropertyNames(b);
      if (aProps.length != bProps.length) {
        return false;
      }
      for (var i = 0; i < aProps.length; i++) {
        var propName = aProps[i];
        if (a[propName] !== b[propName]) {
          return false;
        }
      }
      return true;
    }
  }
      /* *************************** 页面功能 **************************** */
      $(function () {
      pageInit();
    });
  /* *************************** 页面功能 **************************** */
  $(function () {
    pageInit();
  });
</script>

+ 26 - 0
src/main/webapp/develop/lib/module/dateExt.js

@ -0,0 +1,26 @@
/**
 * Created by l4qiang on 2017-06-20.
 */
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
Date.prototype.format = function(fmt) { //author: meizz
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "h+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        "S": this.getMilliseconds() //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

文件差异内容过多而无法显示
+ 35 - 0
src/main/webapp/develop/lib/plugin/echarts-2.2.7/echarts-all.js


文件差异内容过多而无法显示
+ 20 - 0
src/main/webapp/develop/lib/plugin/echarts-2.2.7/echarts.js