瀏覽代碼

Merge remote-tracking branch 'origin/dev/one' into dev/one

wangyu 6 年之前
父節點
當前提交
9401c5d7d2
共有 90 個文件被更改,包括 4482 次插入53 次删除
  1. 7 0
      config-server/src/main/resources/shared/gateway-service-dev.yml
  2. 7 0
      config-server/src/main/resources/shared/gateway-service-local.yml
  3. 7 0
      config-server/src/main/resources/shared/gateway-service-test.yml
  4. 94 0
      config-server/src/main/resources/shared/triage-service-dev.yml
  5. 94 0
      config-server/src/main/resources/shared/triage-service-local.yml
  6. 94 0
      config-server/src/main/resources/shared/triage-service-test.yml
  7. 2 0
      diagbotman-service/src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  8. 2 0
      diagbotman-service/src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  9. 7 0
      diagbotman-service/src/main/java/com/diagbot/facade/OrderDetailsFacade.java
  10. 26 0
      diagbotman-service/src/main/java/com/diagbot/facade/ProductServiceFacade.java
  11. 30 0
      diagbotman-service/src/main/java/com/diagbot/facade/ServiceTokenFacade.java
  12. 12 0
      diagbotman-service/src/main/java/com/diagbot/facade/UserRenewalsFacade.java
  13. 6 0
      diagbotman-service/src/main/java/com/diagbot/mapper/OrderDetailsMapper.java
  14. 6 0
      diagbotman-service/src/main/java/com/diagbot/mapper/UserRenewalsMapper.java
  15. 2 0
      diagbotman-service/src/main/java/com/diagbot/service/OrderDetailsService.java
  16. 6 0
      diagbotman-service/src/main/java/com/diagbot/service/UserRenewalsService.java
  17. 5 1
      diagbotman-service/src/main/java/com/diagbot/service/impl/OrderDetailsServiceImpl.java
  18. 9 0
      diagbotman-service/src/main/java/com/diagbot/service/impl/UserRenewalsServiceImpl.java
  19. 25 0
      diagbotman-service/src/main/java/com/diagbot/web/ProductOrderController.java
  20. 1 1
      diagbotman-service/src/main/resources/mapper/LantoneProductMapper.xml
  21. 3 0
      diagbotman-service/src/main/resources/mapper/OrderDetailsMapper.xml
  22. 8 0
      diagbotman-service/src/main/resources/mapper/UserRenewalsMapper.xml
  23. 12 0
      docker-compose.yml
  24. 1 0
      pom.xml
  25. 25 0
      triage-service/.gitignore
  26. 184 0
      triage-service/pom.xml
  27. 34 0
      triage-service/src/main/java/com/diagbot/TriageServiceApplication.java
  28. 76 0
      triage-service/src/main/java/com/diagbot/aop/SysLoggerAspect.java
  29. 24 0
      triage-service/src/main/java/com/diagbot/client/AIServiceClient.java
  30. 53 0
      triage-service/src/main/java/com/diagbot/client/bean/AlgorithmClassify.java
  31. 159 0
      triage-service/src/main/java/com/diagbot/client/bean/Constants.java
  32. 202 0
      triage-service/src/main/java/com/diagbot/client/bean/Feature.java
  33. 34 0
      triage-service/src/main/java/com/diagbot/client/bean/FeatureRate.java
  34. 190 0
      triage-service/src/main/java/com/diagbot/client/bean/Response.java
  35. 77 0
      triage-service/src/main/java/com/diagbot/client/bean/ResponseData.java
  36. 259 0
      triage-service/src/main/java/com/diagbot/client/bean/SearchData.java
  37. 132 0
      triage-service/src/main/java/com/diagbot/client/bean/Status.java
  38. 24 0
      triage-service/src/main/java/com/diagbot/client/hystrix/AIServiceHystrix.java
  39. 19 0
      triage-service/src/main/java/com/diagbot/config/CustomAccessTokenConverter.java
  40. 15 0
      triage-service/src/main/java/com/diagbot/config/GlobalMethodSecurityConfigurer.java
  41. 48 0
      triage-service/src/main/java/com/diagbot/config/JwtConfigurer.java
  42. 29 0
      triage-service/src/main/java/com/diagbot/config/MybatisPlusConfigurer.java
  43. 47 0
      triage-service/src/main/java/com/diagbot/config/ResourceServerConfigurer.java
  44. 69 0
      triage-service/src/main/java/com/diagbot/config/SwaggerConfigurer.java
  45. 86 0
      triage-service/src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java
  46. 29 0
      triage-service/src/main/java/com/diagbot/config/security/UrlConfigAttribute.java
  47. 79 0
      triage-service/src/main/java/com/diagbot/config/security/UrlFilterSecurityInterceptor.java
  48. 40 0
      triage-service/src/main/java/com/diagbot/config/security/UrlMetadataSourceService.java
  49. 19 0
      triage-service/src/main/java/com/diagbot/dto/AIDTO.java
  50. 23 0
      triage-service/src/main/java/com/diagbot/dto/PartDTO.java
  51. 22 0
      triage-service/src/main/java/com/diagbot/dto/PartSymptomDTO.java
  52. 20 0
      triage-service/src/main/java/com/diagbot/dto/SymptomSearchDTO.java
  53. 69 0
      triage-service/src/main/java/com/diagbot/entity/Part.java
  54. 80 0
      triage-service/src/main/java/com/diagbot/entity/Symptom.java
  55. 85 0
      triage-service/src/main/java/com/diagbot/entity/SymptomWrapper.java
  56. 196 0
      triage-service/src/main/java/com/diagbot/entity/SysLog.java
  57. 50 0
      triage-service/src/main/java/com/diagbot/enums/ShowTypeEnum.java
  58. 81 0
      triage-service/src/main/java/com/diagbot/exception/CommonExceptionHandler.java
  59. 69 0
      triage-service/src/main/java/com/diagbot/facade/AIFacade.java
  60. 102 0
      triage-service/src/main/java/com/diagbot/facade/PartFacade.java
  61. 83 0
      triage-service/src/main/java/com/diagbot/facade/SymptomFacade.java
  62. 31 0
      triage-service/src/main/java/com/diagbot/mapper/PartMapper.java
  63. 39 0
      triage-service/src/main/java/com/diagbot/mapper/SymptomMapper.java
  64. 16 0
      triage-service/src/main/java/com/diagbot/mapper/SysLogMapper.java
  65. 23 0
      triage-service/src/main/java/com/diagbot/rabbit/MyProcessor.java
  66. 27 0
      triage-service/src/main/java/com/diagbot/rabbit/MySender.java
  67. 34 0
      triage-service/src/main/java/com/diagbot/service/PartService.java
  68. 44 0
      triage-service/src/main/java/com/diagbot/service/SymptomService.java
  69. 15 0
      triage-service/src/main/java/com/diagbot/service/SysLogService.java
  70. 31 0
      triage-service/src/main/java/com/diagbot/service/impl/PartServiceImpl.java
  71. 39 0
      triage-service/src/main/java/com/diagbot/service/impl/SymptomServiceImpl.java
  72. 19 0
      triage-service/src/main/java/com/diagbot/service/impl/SysLogServiceImpl.java
  73. 23 0
      triage-service/src/main/java/com/diagbot/vo/AIVO.java
  74. 20 0
      triage-service/src/main/java/com/diagbot/vo/PartSymptomVO.java
  75. 24 0
      triage-service/src/main/java/com/diagbot/vo/SymptomSearchVO.java
  76. 21 0
      triage-service/src/main/java/com/diagbot/vo/SymptomUsualVO.java
  77. 65 0
      triage-service/src/main/java/com/diagbot/web/AIController.java
  78. 40 0
      triage-service/src/main/java/com/diagbot/web/PartController.java
  79. 52 0
      triage-service/src/main/java/com/diagbot/web/SymptomController.java
  80. 19 0
      triage-service/src/main/resources/bootstrap.yml
  81. 280 0
      triage-service/src/main/resources/logback-spring.xml
  82. 53 0
      triage-service/src/main/resources/mapper/PartMapper.xml
  83. 73 0
      triage-service/src/main/resources/mapper/SymptomMapper.xml
  84. 22 0
      triage-service/src/main/resources/mapper/SysLogMapper.xml
  85. 9 0
      triage-service/src/main/resources/public.cert
  86. 83 0
      triage-service/src/test/java/com/diagbot/CodeGeneration.java
  87. 6 0
      user-service/src/main/java/com/diagbot/client/DiagbotmanClient.java
  88. 12 0
      user-service/src/main/java/com/diagbot/client/hystrix/DiagbotmanServiceHystrix.java
  89. 51 51
      user-service/src/main/java/com/diagbot/enums/StatusEnum.java
  90. 12 0
      user-service/src/main/java/com/diagbot/facade/UserFacade.java

+ 7 - 0
config-server/src/main/resources/shared/gateway-service-dev.yml

@@ -76,6 +76,13 @@ spring:
         - Path=/api/icss/**
         filters:
         - StripPrefix=2
+      - id: triage-service
+        uri: lb://triage-service
+        predicates:
+        - Path=/api/triage/**
+        filters:
+        - SwaggerHeaderFilter
+        - StripPrefix=2
 
 server:
   port: 5050

+ 7 - 0
config-server/src/main/resources/shared/gateway-service-local.yml

@@ -76,6 +76,13 @@ spring:
         - Path=/api/icss/**
         filters:
         - StripPrefix=2
+      - id: triage-service
+        uri: lb://triage-service
+        predicates:
+        - Path=/api/triage/**
+        filters:
+        - SwaggerHeaderFilter
+        - StripPrefix=2
 
 server:
   port: 5050

+ 7 - 0
config-server/src/main/resources/shared/gateway-service-test.yml

@@ -76,6 +76,13 @@ spring:
         - Path=/api/icss/**
         filters:
         - StripPrefix=2
+      - id: triage-service
+        uri: lb://triage-service
+        predicates:
+        - Path=/api/triage/**
+        filters:
+        - SwaggerHeaderFilter
+        - StripPrefix=2
 
 server:
   port: 5050

+ 94 - 0
config-server/src/main/resources/shared/triage-service-dev.yml

@@ -0,0 +1,94 @@
+server:
+  port: 8842
+
+# 驱动配置信息
+spring:
+  datasource:
+    druid:
+      driverClassName: com.mysql.jdbc.Driver
+      driver-class-name: com.mysql.jdbc.Driver
+      platform: mysql
+      url: jdbc:mysql://192.168.2.236:3306/sys-triage?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
+      username: root
+      password: lantone
+      # 连接池的配置信息
+      # 初始化大小,最小,最大
+      initialSize: 5
+      minIdle: 5
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      # 打开PSCache,并且指定每个连接上PSCache的大小
+      poolPreparedStatements: true
+      maxPoolPreparedStatementPerConnectionSize: 20
+      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+      filters.commons-log.connection-logger-name: stat,wall,log4j
+      filter.stat.log-slow-sql: true
+      filter.stat.slow-sql-millis: 2000
+      #监控配置
+      web-stat-filter:
+        enabled: true
+        url-pattern: /*
+        exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
+
+      # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
+      stat-view-servlet:
+        enabled: true
+        url-pattern: /druid/*
+        reset-enable: false
+        login-username: root
+        login-password: root
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: 192.168.2.236
+    port: 5672
+    username: lantone
+    password: lantone
+    publisher-confirms: true
+    virtual-host: /
+
+#mybatis
+mybatis-plus:
+  mapper-locations: classpath:/mapper/*Mapper.xml
+  #实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: com.diagbot.entity
+  global-config:
+    #刷新mapper 调试神器
+    db-config:
+      #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
+      id-type: id_worker
+      #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
+      field-strategy: not_empty
+      #驼峰下划线转换
+      column-underline: true
+      #数据库大写下划线转换
+      #capital-mode: true
+      #刷新mapper 调试神器
+      refresh-mapper: true
+      #逻辑删除配置
+      logic-delete-value: 0
+      logic-not-delete-value: 1
+      #自定义填充策略接口实现
+      #meta-object-handler: com.baomidou.springboot.xxx
+      #自定义SQL注入器
+      #sql-injector: com.baomidou.springboot.xxx
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+

+ 94 - 0
config-server/src/main/resources/shared/triage-service-local.yml

@@ -0,0 +1,94 @@
+server:
+  port: 8842
+
+# 驱动配置信息
+spring:
+  datasource:
+    druid:
+      driverClassName: com.mysql.jdbc.Driver
+      driver-class-name: com.mysql.jdbc.Driver
+      platform: mysql
+      url: jdbc:mysql://192.168.2.236:3306/sys-triage?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
+      username: root
+      password: lantone
+      # 连接池的配置信息
+      # 初始化大小,最小,最大
+      initialSize: 5
+      minIdle: 5
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      # 打开PSCache,并且指定每个连接上PSCache的大小
+      poolPreparedStatements: true
+      maxPoolPreparedStatementPerConnectionSize: 20
+      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+      filters.commons-log.connection-logger-name: stat,wall,log4j
+      filter.stat.log-slow-sql: true
+      filter.stat.slow-sql-millis: 2000
+      #监控配置
+      web-stat-filter:
+        enabled: true
+        url-pattern: /*
+        exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
+
+      # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
+      stat-view-servlet:
+        enabled: true
+        url-pattern: /druid/*
+        reset-enable: false
+        login-username: root
+        login-password: root
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: localhost
+    port: 5672
+    username: guest
+    password: guest
+    publisher-confirms: true
+    virtual-host: /
+
+#mybatis
+mybatis-plus:
+  mapper-locations: classpath:/mapper/*Mapper.xml
+  #实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: com.diagbot.entity
+  global-config:
+    #刷新mapper 调试神器
+    db-config:
+      #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
+      id-type: id_worker
+      #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
+      field-strategy: not_empty
+      #驼峰下划线转换
+      column-underline: true
+      #数据库大写下划线转换
+      #capital-mode: true
+      #刷新mapper 调试神器
+      refresh-mapper: true
+      #逻辑删除配置
+      logic-delete-value: 0
+      logic-not-delete-value: 1
+      #自定义填充策略接口实现
+      #meta-object-handler: com.baomidou.springboot.xxx
+      #自定义SQL注入器
+      #sql-injector: com.baomidou.springboot.xxx
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+

+ 94 - 0
config-server/src/main/resources/shared/triage-service-test.yml

@@ -0,0 +1,94 @@
+server:
+  port: 8842
+
+# 驱动配置信息
+spring:
+  datasource:
+    druid:
+      driverClassName: com.mysql.jdbc.Driver
+      driver-class-name: com.mysql.jdbc.Driver
+      platform: mysql
+      url: jdbc:mysql://192.168.2.241:3306/sys-triage?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
+      username: root
+      password: lantone
+      # 连接池的配置信息
+      # 初始化大小,最小,最大
+      initialSize: 5
+      minIdle: 5
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      # 打开PSCache,并且指定每个连接上PSCache的大小
+      poolPreparedStatements: true
+      maxPoolPreparedStatementPerConnectionSize: 20
+      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+      filters.commons-log.connection-logger-name: stat,wall,log4j
+      filter.stat.log-slow-sql: true
+      filter.stat.slow-sql-millis: 2000
+      #监控配置
+      web-stat-filter:
+        enabled: true
+        url-pattern: /*
+        exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
+
+      # StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
+      stat-view-servlet:
+        enabled: true
+        url-pattern: /druid/*
+        reset-enable: false
+        login-username: root
+        login-password: root
+
+  cloud:
+    stream:
+      bindings:
+        outputLog:
+          destination: myLog
+  #          contentType: text/plain      # 实体 json string 在传递的类型装换 查看 http://docs.spring
+
+  #mq
+  rabbitmq:
+    host: 192.168.2.241
+    port: 5672
+    username: lantone
+    password: lantone
+    publisher-confirms: true
+    virtual-host: /
+
+#mybatis
+mybatis-plus:
+  mapper-locations: classpath:/mapper/*Mapper.xml
+  #实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: com.diagbot.entity
+  global-config:
+    #刷新mapper 调试神器
+    db-config:
+      #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
+      id-type: id_worker
+      #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
+      field-strategy: not_empty
+      #驼峰下划线转换
+      column-underline: true
+      #数据库大写下划线转换
+      #capital-mode: true
+      #刷新mapper 调试神器
+      refresh-mapper: true
+      #逻辑删除配置
+      logic-delete-value: 0
+      logic-not-delete-value: 1
+      #自定义填充策略接口实现
+      #meta-object-handler: com.baomidou.springboot.xxx
+      #自定义SQL注入器
+      #sql-injector: com.baomidou.springboot.xxx
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+

+ 2 - 0
diagbotman-service/src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -29,6 +29,8 @@ public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
                         , "/service_filter/getAll", "/serviceToken/hasPermission").permitAll()
                 .antMatchers("/getDiagbotManEnumsData").permitAll()
                 .antMatchers("/productOrder/getInformationAvailableAll").permitAll()
+                .antMatchers("/productOrder/getUserWaitingRenewal").permitAll()
+                .antMatchers("/productOrder/getOrderByUserToAudit").permitAll()
                 .antMatchers("/**").authenticated();
         //        .antMatchers("/**").permitAll();
     }

+ 2 - 0
diagbotman-service/src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -93,6 +93,8 @@ public class UrlAccessDecisionManager implements AccessDecisionManager {
                 || matchers("/service_filter/getAll", request)
                 || matchers("/serviceToken/hasPermission", request)
                 || matchers("/productOrder/getInformationAvailableAll", request)
+                || matchers("/productOrder/getUserWaitingRenewal", request)
+                || matchers("/productOrder/getOrderByUserToAudit", request)
                 || matchers("/", request)) {
             return true;
         }

+ 7 - 0
diagbotman-service/src/main/java/com/diagbot/facade/OrderDetailsFacade.java

@@ -188,4 +188,11 @@ public class OrderDetailsFacade extends OrderDetailsServiceImpl {
         }
         return list;
     }
+    /**
+     * 根据用户id查询是否有在审核的数据数量
+     */
+	public int getOrderByUserToAudit(Long userId) {
+    	
+		return baseMapper.getOrderByUserToAudit(userId);
+    }
 }

+ 26 - 0
diagbotman-service/src/main/java/com/diagbot/facade/ProductServiceFacade.java

@@ -16,6 +16,7 @@ import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.service.impl.ProductServiceServiceImpl;
 import com.diagbot.util.DateUtil;
+import com.diagbot.util.EntityUtil;
 import com.diagbot.util.GuidUtil;
 import com.diagbot.util.UserUtils;
 import com.diagbot.vo.ProductServiceSaveVO;
@@ -23,6 +24,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description:产品与用户端关联业务层
@@ -149,6 +152,29 @@ public class ProductServiceFacade extends ProductServiceServiceImpl {
         return true;
     }
 
+    /**
+     * 删除产品后,级联删除产品服务端管理和令牌
+     * @param productId
+     * @return
+     */
+    public Boolean deleteByProductId(Long productId) {
+        QueryWrapper<ProductService> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("product_id", productId).eq("is_deleted", IsDeleteEnum.N.getKey());
+        List<ProductService> productServiceList = this.list(queryWrapper);
+        Map<Long, ProductService> map = EntityUtil.makeEntityMap(productServiceList, "id");
+        //删除令牌
+        QueryWrapper<ServiceToken> serviceTokenQueryWrapper = new QueryWrapper<>();
+        serviceTokenQueryWrapper.in("product_service_id", map.keySet());
+        serviceTokenFacade.deleteByWrapper(serviceTokenQueryWrapper);
+
+        //删除产品服务端关联
+        for (ProductService productService : productServiceList) {
+            productService.setIsDeleted(IsDeleteEnum.Y.getKey());
+        }
+        this.updateBatchById(productServiceList);
+        return true;
+    }
+
 
     /**
      * 获取当前用户产品服务关联列表

+ 30 - 0
diagbotman-service/src/main/java/com/diagbot/facade/ServiceTokenFacade.java

@@ -163,6 +163,36 @@ public class ServiceTokenFacade extends ServiceTokenServiceImpl {
         return this.updateRecord(serviceToken, uw);
     }
 
+    /**
+     * 根据id批量删除令牌
+     *
+     * @param ids
+     * @return
+     */
+    public Boolean deleteByIds(Long[] ids) {
+        QueryWrapper<ServiceToken> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("id", ids);
+        List<ServiceToken> serviceTokenList = this.list(queryWrapper);
+        for (ServiceToken serviceToken : serviceTokenList) {
+            serviceToken.setIsDeleted(IsDeleteEnum.Y.getKey());
+        }
+        return this.updateBatchById(serviceTokenList);
+    }
+
+    /**
+     * 根据条件批量删除令牌
+     *
+     * @param queryWrapper
+     * @return
+     */
+    public Boolean deleteByWrapper(QueryWrapper<ServiceToken> queryWrapper) {
+        List<ServiceToken> serviceTokenList = this.list(queryWrapper);
+        for (ServiceToken serviceToken : serviceTokenList) {
+            serviceToken.setIsDeleted(IsDeleteEnum.Y.getKey());
+        }
+        return this.updateBatchById(serviceTokenList);
+    }
+
     /**
      * 启用令牌
      *

+ 12 - 0
diagbotman-service/src/main/java/com/diagbot/facade/UserRenewalsFacade.java

@@ -18,6 +18,7 @@ import com.diagbot.enums.VisibleIdTypeEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.idc.VisibleIdCreater;
+import com.diagbot.service.UserRenewalsService;
 import com.diagbot.service.impl.UserRenewalsServiceImpl;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.DateUtil;
@@ -52,6 +53,8 @@ public class UserRenewalsFacade extends UserRenewalsServiceImpl {
     private LantoneProductFacade lantoneProductFacade;
     @Autowired
     private OpenedProductsFacade openedProductsFacade;
+    @Autowired
+    private UserRenewalsService userRenewalsService;
 
     /**
      * 产品续费
@@ -183,4 +186,13 @@ public class UserRenewalsFacade extends UserRenewalsServiceImpl {
         }
         return true;
     }
+    /**
+     *查詢用户的待续费数量
+     * @param userRenewals
+     * @return
+     */
+    public int getUserWaitingRenewal(UserRenewals userRenewals){
+    	
+    	return userRenewalsService.getUserWaitingRenewal(userRenewals);
+    }
 }

+ 6 - 0
diagbotman-service/src/main/java/com/diagbot/mapper/OrderDetailsMapper.java

@@ -46,4 +46,10 @@ public interface OrderDetailsMapper extends BaseMapper<OrderDetails> {
      * @return
      */
     public List<Long> getOrderDetailsByUser(Long userId);
+    /**
+     * 根据用户id查询是否有在审核的数据数量
+     * @param userId
+     * @return
+     */
+    public int  getOrderByUserToAudit(Long userId);
 }

+ 6 - 0
diagbotman-service/src/main/java/com/diagbot/mapper/UserRenewalsMapper.java

@@ -42,4 +42,10 @@ public interface UserRenewalsMapper extends BaseMapper<UserRenewals> {
      * @return
      */
     public boolean updateRenewalStatus(UserRenewals userRenewals);
+    /**
+     *查詢用户的待续费数量
+     * @param userRenewals
+     * @return
+     */
+    public int getUserWaitingRenewal(UserRenewals userRenewals);
 }

+ 2 - 0
diagbotman-service/src/main/java/com/diagbot/service/OrderDetailsService.java

@@ -45,4 +45,6 @@ public interface OrderDetailsService extends IService<OrderDetails> {
      * @return
      */
     public List<Long> getOrderDetailsByUser(Long userId);
+    
+    public int  getOrderByUserToAudit(Long userId);
 }

+ 6 - 0
diagbotman-service/src/main/java/com/diagbot/service/UserRenewalsService.java

@@ -42,4 +42,10 @@ public interface UserRenewalsService extends IService<UserRenewals> {
      * @return
      */
     public boolean updateRenewalStatus(UserRenewals userRenewals);
+    /**
+     * 
+     * @param userRenewals
+     * @return
+     */
+    public int getUserWaitingRenewal(UserRenewals userRenewals);
 }

+ 5 - 1
diagbotman-service/src/main/java/com/diagbot/service/impl/OrderDetailsServiceImpl.java

@@ -61,6 +61,10 @@ public class OrderDetailsServiceImpl extends ServiceImpl<OrderDetailsMapper, Ord
     public List<Long> getOrderDetailsByUser(Long userId) {
         return baseMapper.getOrderDetailsByUser(userId);
     }
-
+    @Override
+	public int getOrderByUserToAudit(Long userId) {
+		
+		return baseMapper.getOrderByUserToAudit(userId);
+	}
 
 }

+ 9 - 0
diagbotman-service/src/main/java/com/diagbot/service/impl/UserRenewalsServiceImpl.java

@@ -41,4 +41,13 @@ public class UserRenewalsServiceImpl extends ServiceImpl<UserRenewalsMapper, Use
 		// TODO Auto-generated method stub
 		return baseMapper.updateRenewalStatus(userRenewals);
 	}
+	/**
+     *查詢用户的待续费数量
+     * @param userRenewals
+     * @return
+     */
+	@Override
+	public int getUserWaitingRenewal(UserRenewals userRenewals){
+		return baseMapper.getUserWaitingRenewal(userRenewals);
+	}
 }

+ 25 - 0
diagbotman-service/src/main/java/com/diagbot/web/ProductOrderController.java

@@ -12,9 +12,12 @@ import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.UserAndProdutDTO;
 import com.diagbot.dto.WaitExamOrderCouDTO;
 import com.diagbot.entity.OpenedProducts;
+import com.diagbot.entity.UserRenewals;
 import com.diagbot.facade.LantoneProductFacade;
 import com.diagbot.facade.OpenedProductsFacade;
+import com.diagbot.facade.OrderDetailsFacade;
 import com.diagbot.facade.ProductOrderFacade;
+import com.diagbot.facade.UserRenewalsFacade;
 import com.diagbot.vo.ModifyOpeningTimeVO;
 import com.diagbot.vo.OpenUpOnTrialVO;
 import com.diagbot.vo.ProductOrderVO;
@@ -49,6 +52,10 @@ public class ProductOrderController {
     private ProductOrderFacade productOrderFacade;
     @Autowired
     private OpenedProductsFacade openedProductsFacade;
+    @Autowired
+    private OrderDetailsFacade orderDetailsFacade;
+    @Autowired
+    private UserRenewalsFacade userRenewalsFacade;
 
     @ApiOperation(value = "控制台-产品认证进度[by:rengb]", notes = "控制台-产品认证进度")
     @PostMapping("/productAuthProgress")
@@ -157,4 +164,22 @@ public class ProductOrderController {
     	List<UserAndProdutDTO> UserAndProdutData = openedProductsFacade.getInformationAvailableByUserIds(userIds);
     	return RespDTO.onSuc(UserAndProdutData);
     }
+    @ApiOperation(value = "客户中心-查询用户是否有待审核的产品数量[by:wangfeng]", notes = "用户已开通信息")
+    @PostMapping("/getOrderByUserToAudit")
+    @SysLogger("getOrderByUserToAudit")
+    @ApiIgnore
+    public RespDTO<Integer> getOrderByUserToAudit(Long userId){
+    	int sums = orderDetailsFacade.getOrderByUserToAudit(userId);
+    	return RespDTO.onSuc(sums);	
+    }
+    @ApiOperation(value = "客户中心-查询用户续费数量[by:wangfeng]", notes = "用户已开通信息")
+    @PostMapping("/getUserWaitingRenewal")
+    @SysLogger("getUserWaitingRenewal")
+    @ApiIgnore
+    public RespDTO<Integer> getUserWaitingRenewal(Long userId){
+    	UserRenewals userRenewals = new UserRenewals();
+    	userRenewals.setUserId(userId);
+    	int userIdSum = userRenewalsFacade.getUserWaitingRenewal(userRenewals);
+    	return RespDTO.onSuc(userIdSum);	
+    }
 }

+ 1 - 1
diagbotman-service/src/main/resources/mapper/LantoneProductMapper.xml

@@ -97,7 +97,7 @@
 			  and c.num=d.order_num
               and d.audit_status=1
               and a.is_deleted='N' and b.is_deleted='N' and c.is_deleted='N' and d.is_deleted='N'
-              and (find_in_set('1',a.access_type) or FIND_IN_SET('2',a.access_type))
+              and (find_in_set('2',a.access_type) or FIND_IN_SET('3',a.access_type))
               and b.user_id=#{userId}  and c.user_id=#{userId}  and d.user_id=#{userId}
     </select>
     

+ 3 - 0
diagbotman-service/src/main/resources/mapper/OrderDetailsMapper.xml

@@ -80,4 +80,7 @@
     <select id="getOrderDetailsByUser" resultType="java.lang.Long">
         SELECT a.product_id FROM diag_order_details a WHERE a.is_deleted ='N' and a.audit_status != 0 and a.user_id = #{userId}
     </select>
+    <select id="getOrderByUserToAudit" resultType="int">
+        SELECT COUNT(*) FROM diag_order_details a WHERE a.is_deleted ='N' and a.audit_status = 2 and a.user_id = #{userId}
+    </select>
 </mapper>

+ 8 - 0
diagbotman-service/src/main/resources/mapper/UserRenewalsMapper.xml

@@ -58,4 +58,12 @@
 	  </trim>
 	  WHERE a.renewals_no = #{renewalsNo}
 </update>
+    <select id="getUserWaitingRenewal"  resultType="int">
+	SELECT COUNT(*) FROM diag_user_renewals 
+	WHERE 
+	is_deleted = 'N' 
+	AND renewals_status = 0 
+	AND cancel_renewals = 0 
+	AND user_id = #{userId}
+    </select>
 </mapper>

+ 12 - 0
docker-compose.yml

@@ -119,4 +119,16 @@ services:
     environment:
       - spring.profiles.active=dev
       - myuri=eureka1
+    restart: always
+  triage-service:
+    image: 192.168.2.236:5000/diagbotcloud/triage-service:0.0.1-SNAPSHOT
+    depends_on:
+    #      - config1
+    - eureka1
+    volumes:
+    - "/etc/localtime:/etc/localtime:ro"
+    #      - "data/diagbotcloud/logs:/logs"
+    environment:
+    - spring.profiles.active=dev
+    - myuri=eureka1
     restart: always

+ 1 - 0
pom.xml

@@ -23,6 +23,7 @@
         <module>bi-service</module>
         <module>monitor-service</module>
         <module>admin-service</module>
+        <module>triage-service</module>
     </modules>
 
     <parent>

+ 25 - 0
triage-service/.gitignore

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

+ 184 - 0
triage-service/pom.xml

@@ -0,0 +1,184 @@
+<?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.diagbot</groupId>
+    <artifactId>triage-service</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>triage-service</name>
+    <description>Triage Service for Spring Boot</description>
+
+    <parent>
+        <groupId>com.diagbot</groupId>
+        <artifactId>diagbotcloud</artifactId>
+        <version>0.0.1-SNAPSHOT</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.diagbot</groupId>
+            <artifactId>common</artifactId>
+            <version>0.0.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
+        </dependency>
+
+        <!-- 配置-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</artifactId>
+        </dependency>
+
+        <!-- 开启web-->
+        <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-undertow</artifactId>
+        </dependency>
+
+        <!-- 开启feign-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <!-- dashboard -->
+        <!-- actuator-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <!--hystrix-dashboard-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
+        </dependency>
+        <!--hystrix -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
+        </dependency>
+
+        <!-- zipkin-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-zipkin</artifactId>
+        </dependency>
+
+        <!--swagger-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+        <!--database-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <!--security-->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-oauth2</artifactId>
+        </dependency>
+
+        <!-- mq -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
+        </dependency>
+
+        <!-- mybatis-plus begin -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+        </dependency>
+        <!-- mybatis-plus end -->
+
+        <!-- 阿里巴巴druid数据库连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- springboot整合mybatis(核心就这一个) -->
+        <!-- 注意顺序,这个一定要放在最下面 -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <!-- 添加docker-maven插件 -->
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <configuration>
+                    <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
+                    <forceTags>true</forceTags>
+                    <!--镜像的FROM,使用压缩的小镜像-->
+                    <baseImage>frolvlad/alpine-oraclejdk8:slim</baseImage>
+                    <entryPoint>["java", "-jar", "-Xms256m", "-Xmx1024m", "-Duser.timezone=GMT+8", "/${project.build.finalName}.jar"]</entryPoint>
+                    <resources>
+                        <resource>
+                            <targetPath>/</targetPath>
+                            <directory>${project.build.directory}</directory>
+                            <include>${project.build.finalName}.jar</include>
+                        </resource>
+                    </resources>
+                    <serverId>docker-registry</serverId>
+                    <registryUrl>http://192.168.2.236:5000/repository/diagbotcloud/</registryUrl>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 34 - 0
triage-service/src/main/java/com/diagbot/TriageServiceApplication.java

@@ -0,0 +1,34 @@
+package com.diagbot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration;
+import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.cloud.netflix.hystrix.EnableHystrix;
+import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * @Description: TRIAGE服务启动文件
+ * @author: gaodm
+ * @time: 2018/8/7 9:24
+ */
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
+        JmxAutoConfiguration.class, ThymeleafAutoConfiguration.class })
+@EnableEurekaClient
+@EnableFeignClients({ "com.diagbot.client" })
+@EnableHystrixDashboard
+@EnableHystrix
+@EnableCircuitBreaker
+@RefreshScope
+public class TriageServiceApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TriageServiceApplication.class, args);
+    }
+}

+ 76 - 0
triage-service/src/main/java/com/diagbot/aop/SysLoggerAspect.java

@@ -0,0 +1,76 @@
+package com.diagbot.aop;
+
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.entity.SysLog;
+import com.diagbot.enums.SysTypeEnum;
+import com.diagbot.rabbit.MySender;
+import com.diagbot.util.GsonUtil;
+import com.diagbot.util.HttpUtils;
+import com.diagbot.util.StringUtil;
+import com.diagbot.util.UserUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * @Description: 日志拦截切面
+ * @author: gaodm
+ * @time: 2018/8/2 13:36
+ */
+@Aspect
+@Component
+public class SysLoggerAspect {
+    @Autowired
+    private MySender mySender;
+
+    @Pointcut("@annotation(com.diagbot.annotation.SysLogger)")
+    public void loggerPointCut() {
+
+    }
+
+    @Before("loggerPointCut()")
+    public void saveSysLog(JoinPoint joinPoint) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+
+        SysLog sysLog = new SysLog();
+        SysLogger sysLogger = method.getAnnotation(SysLogger.class);
+        if (sysLogger != null) {
+            //注解上的描述
+            sysLog.setOperation(sysLogger.value());
+        }
+        //请求的方法名
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = signature.getName();
+        sysLog.setMethod(className + "." + methodName + "()");
+        //请求的参数
+        Object[] args = joinPoint.getArgs();
+        String params = "";
+        for (Object o : args) {
+            params += GsonUtil.toJson(o);
+        }
+        if (!StringUtil.isEmpty(params)) {
+            sysLog.setParams(params);
+        }
+        //设置IP地址
+        sysLog.setIp(HttpUtils.getIpAddress());
+        //用户名
+        String username = UserUtils.getCurrentPrinciple();
+        if (!StringUtil.isEmpty(username)) {
+            sysLog.setUsername(username);
+        }
+        sysLog.setGmtCreate(new Date());
+        sysLog.setSysType(SysTypeEnum.TRIAGE_SERVICE.getKey());
+        //保存系统日志
+        mySender.outputLogSend(sysLog);
+    }
+
+}
+

+ 24 - 0
triage-service/src/main/java/com/diagbot/client/AIServiceClient.java

@@ -0,0 +1,24 @@
+package com.diagbot.client;
+
+import com.diagbot.client.bean.Response;
+import com.diagbot.client.bean.ResponseData;
+import com.diagbot.client.bean.SearchData;
+import com.diagbot.client.hystrix.AIServiceHystrix;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @Description: 人工智能服务客服端
+ * @author: gaodm
+ * @time: 2018/10/25 9:56
+ */
+@FeignClient(name = "AI", url = "http://192.168.2.234:8080", fallback = AIServiceHystrix.class)
+public interface AIServiceClient {
+
+    @PostMapping(value = "/web/doc/algorithm/neural")
+    Response<ResponseData> bayesPageData(@RequestBody SearchData searchData);
+}
+
+
+

+ 53 - 0
triage-service/src/main/java/com/diagbot/client/bean/AlgorithmClassify.java

@@ -0,0 +1,53 @@
+package com.diagbot.client.bean;
+
+/**
+ * @Auther: fyeman
+ * @Date: 2018/7/19/019 10:37
+ * @Description:
+ */
+public enum AlgorithmClassify {
+    NEURAL("0"), BAYES("1"), EMERGENCY_NEURAL("2"), OUTPATIENT_NEURAL("3"),
+    NEURAL_SYMPTOM("11"),
+    NEURAL_DIAG("21"),
+    NEURAL_VITAL("31"),
+    NEURAL_LIS("41"),
+    NEURAL_PACS("51"),
+    NEURAL_DIAG_SYMPTOM("111"),
+    NEURAL_DIAG_VITAL("131"),
+    NEURAL_DIAG_LIS("141"),
+    NEURAL_DIAG_PACS("151");
+
+    private String value;
+
+    AlgorithmClassify(String value) {
+        this.value = value;
+    }
+
+    public String toString() {
+        return value;
+    }
+
+    public static AlgorithmClassify parse(String value) {
+        switch (value) {
+            case "11":
+                return AlgorithmClassify.NEURAL_SYMPTOM;
+            case "21":
+                return AlgorithmClassify.NEURAL_DIAG;
+            case "31":
+                return AlgorithmClassify.NEURAL_VITAL;
+            case "41":
+                return AlgorithmClassify.NEURAL_LIS;
+            case "51":
+                return AlgorithmClassify.NEURAL_PACS;
+            case "111":
+                return AlgorithmClassify.NEURAL_DIAG_SYMPTOM;
+            case "131":
+                return AlgorithmClassify.NEURAL_DIAG_VITAL;
+            case "141":
+                return AlgorithmClassify.NEURAL_DIAG_LIS;
+            case "151":
+                return AlgorithmClassify.NEURAL_DIAG_PACS;
+        }
+        return AlgorithmClassify.NEURAL_DIAG;
+    }
+}

+ 159 - 0
triage-service/src/main/java/com/diagbot/client/bean/Constants.java

@@ -0,0 +1,159 @@
+/**
+ * @Company: 杭州朗通信息技术有限公司
+ * @Department: 系统软件部
+ * @Description: 朗通智能辅助诊疗系统
+ * @Address: 浙江省杭州市西湖区西斗门路3号 天堂软件园D-7B
+ */
+package com.diagbot.client.bean;
+
+/**
+ * @Title: Constants.java
+ * @Package org.diagbot.public
+ * @Description: 通用常数接口定义
+ * @author 楼辉荣(Fyeman)
+ * @date 2015年4月23日 下午11:25:37
+ * @version V1.0
+ */
+public interface Constants {
+    /**
+     * 操作名称
+     */
+    String OP_NAME = "op";
+    /**
+     * 消息key
+     */
+    String MESSAGE = "message";
+    /**
+     * 错误key
+     */
+    String ERROR = "error";
+    /**
+     * 上个页面地址
+     */
+    String BACK_URL = "BackURL";
+    String IGNORE_BACK_URL = "ignoreBackURL";
+    /**
+     * 当前请求的地址 带参数
+     */
+    String CURRENT_URL = "currentURL";
+    /**
+     * 当前请求的地址 不带参数
+     */
+    String NO_QUERYSTRING_CURRENT_URL = "noQueryStringCurrentURL";
+    /**
+     * 上下文
+     */
+    String CONTEXT_PATH = "ctx";
+    /**
+     * 当前登录的用户
+     */
+    String CURRENT_APPLICATION = "c_app";
+    String CURRENT_USER = "c_user";
+    String CURRENT_USERNAME = "username";
+    String USER_MENUS = "menus";
+
+    /**
+     * 管理控制台应用ID=0
+     */
+    long ADMIN_APPLICATION = 0;
+    /**
+     * 一级菜单grade标识
+     */
+    int FIRST_MENU = 1;
+    /**
+     * 二级菜单grade标识
+     */
+    int SECOND_MENU = 2;
+    /**
+     * 操作按钮等级标识
+     */
+    int MENU_GRADE = 3;
+    /**
+     * 最高级资源grade标识
+     */
+    int TOP_REC = 0;
+    /**
+     * 编码方式
+     */
+    String ENCODING = "UTF-8";
+    /**
+     * 系统用户状态--启用
+     */
+    int USER_STATUS_UNLOCK = 1;
+    /**
+     * 系统用户状态--禁用
+     */
+    int USER_STATUS_LOCK = 0;
+    /**
+     * 通用值0
+     */
+    int COMMON_INT_0 = 0;
+    /**
+     * 通用值1
+     */
+    int COMMON_INT_1 = 1;
+    /**
+     * 通用值-1
+     */
+    int COMMON_INT_NEG_1 = -1;
+    /**
+     * 通用值0
+     */
+    long COMMON_LONG_0 = 0L;
+    /**
+     * 通用值1
+     */
+    long COMMON_LONG_1 = 1L;
+    /**
+     * 通用值-1
+     */
+    long COMMON_LONG_NEG_1 = -1L;
+    /**
+     * 通用值"0"
+     */
+    String COMMON_STRING_0 = "0";
+    /**
+     * 通用值"1"
+     */
+    String COMMON_STRING_1 = "1";
+    /**
+     * 通用值"-1"
+     */
+    String COMMON_STRING_NEG_1 = "-1";
+
+    /**
+     * 通用值"-1"
+     */
+    String COMMON_STRING_99 = "99";
+    /**
+     * 登录页面
+     */
+    String LOGIN_URL = "/login";
+    /**
+     * 上传文件夹
+     */
+    String UPLOAD_FOLDER_NAME = "upload";
+    /**
+     * 临时文件夹
+     */
+    String TEMP_FOLDER_NAME = "temp";
+    /**
+     * 地域标示
+     */
+    public static final String DEFAULT_LOCALE = "zh_CN";
+    /**
+     * 缺省字符集
+     */
+    public static final String DEFAULT_ENCODE = "UTF-8";
+    /**
+     * 以下为接口返回公共属性定义常量
+     */
+    public static final String MSG_SUCCESS = "操作成功";    //操作成功
+    public static final String MSG_FALURE = "操作失败";    //操作失败
+
+    public static final long INVALIDATE_VALUE = -1;        //起止时间定义
+    public static final int RET_SUCCESS = 0;            //成功
+    public static final int RET_FAIL = 1;                //失败
+    public static final int RET_ERROR_PARAM = -1;        //参数校验失败
+    public static final int RET_NO_TOKEN = -2;    //用户token丢失
+}

+ 202 - 0
triage-service/src/main/java/com/diagbot/client/bean/Feature.java

@@ -0,0 +1,202 @@
+package com.diagbot.client.bean;
+
+import java.io.Serializable;
+
+/**
+ * @Title: Feature.java
+ * @Package: com.zjlantone.nlp.web.doc.dao.model
+ * @Description: 数据库操作接口类
+ * @author: 楼辉荣
+ * @date: 2016年8月8日 下午17:16:23
+ * @version: V1.0
+ */
+
+@SuppressWarnings("serial")
+public class Feature implements Serializable {
+    /****/
+    private Long id;
+    /****/
+    private String rdn = "";
+    /****/
+    private String sex;
+    /****/
+    private int age;
+
+    private String partbody = "";
+
+    /****/
+    private String featureName = "";
+
+    /****/
+    private String featureType = "";
+
+    //是否推送
+    private String isPush = "0";
+
+    /**
+     * 特征顺序号
+     **/
+    private int sn;
+
+    /****/
+    private String negative = "";
+
+    private float duration;
+
+    private String property;
+
+    /****/
+    private Float threshold;
+
+    /****/
+    private String tfIdf;
+
+    /**
+     * 区分住院门诊
+     **/
+    private String resourceType;
+
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getId() {
+        return this.id;
+    }
+
+    public void setRdn(String rdn) {
+        this.rdn = rdn;
+    }
+
+    public String getRdn() {
+        return this.rdn;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getSex() {
+        return this.sex;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    public int getAge() {
+        return this.age;
+    }
+
+    public void setFeatureName(String featureName) {
+        this.featureName = featureName;
+    }
+
+    public String getFeatureName() {
+        return this.featureName;
+    }
+
+    public void setFeatureType(String featureType) {
+        this.featureType = featureType;
+    }
+
+    public String getFeatureType() {
+        return this.featureType;
+    }
+
+    public String getIsPush() {
+        return isPush;
+    }
+
+    public void setIsPush(String isPush) {
+        this.isPush = isPush;
+    }
+
+    public int getSn() {
+        return sn;
+    }
+
+    public void setSn(int sn) {
+        this.sn = sn;
+    }
+
+    public void setNegative(String negative) {
+        this.negative = negative;
+    }
+
+    public String getNegative() {
+        return this.negative;
+    }
+
+    public String getPartbody() {
+        return partbody;
+    }
+
+    public void setPartbody(String partbody) {
+        this.partbody = partbody;
+    }
+
+    public float getDuration() {
+        return duration;
+    }
+
+    public void setDuration(float duration) {
+        this.duration = duration;
+    }
+
+    public String getProperty() {
+        return property;
+    }
+
+    public void setProperty(String property) {
+        this.property = property;
+    }
+
+    public void setThreshold(Float threshold) {
+        this.threshold = threshold;
+    }
+
+    public Float getThreshold() {
+        return this.threshold;
+    }
+
+    public void setTfIdf(String tfIdf) {
+        this.tfIdf = tfIdf;
+    }
+
+    public String getTfIdf() {
+        return this.tfIdf;
+    }
+
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(String resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        Feature feature = (Feature) o;
+        if (id != feature.id) {
+            return false;
+        }
+        return rdn.equals(feature.rdn) && partbody.equals(feature.partbody) && featureName.equals(feature.featureName)
+                && featureType.equals(feature.featureType) && negative.equals(feature.negative);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = id.hashCode();
+        result = 31 * result + rdn.hashCode() + partbody.hashCode() + featureName.hashCode() + featureType.hashCode() + negative.hashCode();
+        return result;
+    }
+}

+ 34 - 0
triage-service/src/main/java/com/diagbot/client/bean/FeatureRate.java

@@ -0,0 +1,34 @@
+package com.diagbot.client.bean;
+
+/**
+ * Created by fyeman on 2018/1/17.
+ */
+public class FeatureRate {
+    private String featureName;
+    private String extraProperty;
+    private String rate;
+
+    public String getFeatureName() {
+        return featureName;
+    }
+
+    public void setFeatureName(String featureName) {
+        this.featureName = featureName;
+    }
+
+    public String getRate() {
+        return rate;
+    }
+
+    public void setRate(String rate) {
+        this.rate = rate;
+    }
+
+    public String getExtraProperty() {
+        return extraProperty;
+    }
+
+    public void setExtraProperty(String extraProperty) {
+        this.extraProperty = extraProperty;
+    }
+}

+ 190 - 0
triage-service/src/main/java/com/diagbot/client/bean/Response.java

@@ -0,0 +1,190 @@
+package com.diagbot.client.bean;
+
+/**
+ * ClassName: org.diagbot.pub.api.Response
+ * Function: API接口提供标准返回数据包, 数据包格式如下:
+ * {
+ * status:"OK",
+ * startTime:8206448610408,
+ * endTime:8206448610418,
+ * version:"1.0",
+ * msg:"操作成功",
+ * ret:"0",
+ * timeConsum:10,
+ * data:{
+ * ..。
+ * }
+ * }
+ * date: 2015年7月6日 下午1:36:58
+ *
+ * @author 楼辉荣(Fyeman)
+ * @version 1.0
+ * @since JDK 1.7
+ */
+public class Response<T> implements java.io.Serializable {
+    private static final long serialVersionUID = 8206448610408409499L;
+    private Status status = Status.PENDING;  //状态
+    private long startTime = Constants.INVALIDATE_VALUE;                                  //起始时间
+    private long endTime = Constants.INVALIDATE_VALUE;                                    //结束时间
+    private String version = "1.0";
+    private String msg = Constants.MSG_SUCCESS;                                  //消息
+    private T data = null;                                                                //序列化后的结果数据
+    // 返回结果标志,默认成功0,失败 1 参数错误 -1 token丢失-2
+    private int ret = Constants.RET_SUCCESS;
+
+    private String token;
+    //耗时
+    private long timeConsum;
+
+    public int getRet() {
+        return ret;
+    }
+
+    public void setRet(int ret) {
+        this.ret = ret;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public long getTimeConsum() {
+        return timeConsum;
+    }
+
+    public void setTimeConsum(long timeConsum) {
+        this.timeConsum = timeConsum;
+    }
+
+    public Response() {
+        super();
+    }
+
+    public Status getStatus() {
+        return status;
+    }
+
+    /**
+     * 在调用end()方法时,会自动设置状态,因此,如果调用了end()方法,就不要调用这个方法
+     *
+     * @param status
+     */
+    public Response<T> setStatus(Status status) {
+        this.status = status;
+        return this;
+    }
+
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public long getStartTime() {
+        return startTime;
+    }
+
+    public Response<T> setStartTime(long startTime) {
+        this.startTime = startTime;
+        return this;
+    }
+
+    public long getEndTime() {
+        return endTime;
+    }
+
+    public Response<T> setEndTime(long endTime) {
+        this.endTime = endTime;
+        return this;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    /**
+     * 设置状态和起始时间,表示操作正在进行
+     */
+    public Response<T> start() {
+        this.setStatus(Status.RUNNING);
+        this.setStartTime(System.currentTimeMillis());
+        return this;
+    }
+
+    /**
+     * 设置状态和时间,表示操作结束,没有失败
+     */
+    public Response<T> end() {
+        this.setEndTime(System.currentTimeMillis());
+        this.setTimeConsum(this.endTime - this.startTime);
+        this.setStatus(Status.OK);
+        return this;
+    }
+
+    /**
+     * 设置状态和时间,表示操作结束,并且失败
+     */
+    public Response<T> endAndFailed() {
+        this.setStatus(Status.FAIL);
+        this.setEndTime(System.currentTimeMillis());
+        return this;
+    }
+
+    /**
+     * 非参数错误通用失败信息
+     */
+    public Response<T> failure(String msg) {
+        this.msg = msg;
+        this.ret = Constants.RET_FAIL;
+        this.end();
+        return this;
+    }
+
+    /**
+     * 参数错误信息
+     */
+    public Response<T> paramFailure(String msg) {
+        this.msg = msg;
+        this.ret = Constants.RET_ERROR_PARAM;
+        this.end();
+        return this;
+    }
+
+    /**
+     * 用户信息丢失
+     */
+    public Response<T> tokenFailure(String msg) {
+        this.msg = msg;
+        this.ret = Constants.RET_NO_TOKEN;
+        this.end();
+        return this;
+    }
+
+    /**
+     * 通用成功
+     */
+    public Response<T> success() {
+        this.end();
+        return this;
+    }
+
+}

+ 77 - 0
triage-service/src/main/java/com/diagbot/client/bean/ResponseData.java

@@ -0,0 +1,77 @@
+package com.diagbot.client.bean;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by fyeman on 2018/2/2.
+ */
+public class ResponseData {
+    private String participleSymptom = "";
+
+    private List<FeatureRate> symptom = new ArrayList<>(10);
+    private List<FeatureRate> vitals = new ArrayList<>(10);
+    private List<FeatureRate> dis = new ArrayList<>(10);
+    private List<FeatureRate> labs = new ArrayList<>(10);
+    private List<FeatureRate> pacs = new ArrayList<>(10);
+
+    private Map<String, Map<String, String>> inputs = new HashMap<>(10, 0.5f);
+
+    public String getParticipleSymptom() {
+        return participleSymptom;
+    }
+
+    public void setParticipleSymptom(String participleSymptom) {
+        this.participleSymptom = participleSymptom;
+    }
+
+    public List<FeatureRate> getSymptom() {
+        return symptom;
+    }
+
+    public void setSymptom(List<FeatureRate> symptom) {
+        this.symptom = symptom;
+    }
+
+    public List<FeatureRate> getVitals() {
+        return vitals;
+    }
+
+    public void setVitals(List<FeatureRate> vitals) {
+        this.vitals = vitals;
+    }
+
+    public List<FeatureRate> getDis() {
+        return dis;
+    }
+
+    public void setDis(List<FeatureRate> dis) {
+        this.dis = dis;
+    }
+
+    public List<FeatureRate> getLabs() {
+        return labs;
+    }
+
+    public void setLabs(List<FeatureRate> labs) {
+        this.labs = labs;
+    }
+
+    public List<FeatureRate> getPacs() {
+        return pacs;
+    }
+
+    public void setPacs(List<FeatureRate> pacs) {
+        this.pacs = pacs;
+    }
+
+    public Map<String, Map<String, String>> getInputs() {
+        return inputs;
+    }
+
+    public void setInputs(Map<String, Map<String, String>> inputs) {
+        this.inputs = inputs;
+    }
+}

+ 259 - 0
triage-service/src/main/java/com/diagbot/client/bean/SearchData.java

@@ -0,0 +1,259 @@
+package com.diagbot.client.bean;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by fyeman on 2018/1/31.
+ */
+public class SearchData {
+    private int length = 10;
+    private int age_start = 0;
+    private int age_end = 200;
+    private int age = 0;
+    private String sex;
+    // 搜索结果的贝叶斯阈值
+    private String threshold = "0";
+
+    private String symptom = "";
+    private String vital = "";
+    private String lis = "";
+    private String pacs = "";
+    private String diag = "";
+    private String past = "";
+    private String other = "";
+
+    //特征类别
+    private String featureType;
+    //特征类别对","进行分割后数据
+    private String[] featureTypes;
+    //门诊 住院分类
+    private String resourceType;
+    //模型
+    private AlgorithmClassify algorithmClassify[];
+    //模型
+    private String algorithmClassifyValue;
+    //外部系统编码 用于返回映射数据,如果sysCode为空或null,则返回kl_standard_info标准名称
+    private String sysCode;
+
+    private Map<String, Map<String, String>> inputs = new HashMap<>(10, 0.8f);
+
+
+    private List<Feature> symptomFeatureList = new ArrayList<>();
+    private List<Feature> vitalFeatureList = new ArrayList<>();
+    private List<Feature> lisFeatureList = new ArrayList<>();
+    private List<Feature> pacsFeatureList = new ArrayList<>();
+    private List<Feature> diagFeatureList = new ArrayList<>();
+    private List<Feature> symptompropertyFeatureList = new ArrayList<>();
+
+    public int getLength() {
+        return length;
+    }
+
+    public void setLength(int length) {
+        this.length = length;
+    }
+
+    public int getAge_start() {
+        return age_start;
+    }
+
+    public void setAge_start(int age_start) {
+        this.age_start = age_start;
+    }
+
+    public int getAge_end() {
+        return age_end;
+    }
+
+    public void setAge_end(int age_end) {
+        this.age_end = age_end;
+    }
+
+    public int getAge() {
+        return age;
+    }
+
+    public void setAge(int age) {
+        this.age = age;
+    }
+
+    public String getSex() {
+        return sex;
+    }
+
+    public void setSex(String sex) {
+        this.sex = sex;
+    }
+
+    public String getSymptom() {
+        return symptom;
+    }
+
+    public void setSymptom(String symptom) {
+        this.symptom = symptom;
+    }
+
+    public String getVital() {
+        return vital;
+    }
+
+    public void setVital(String vital) {
+        this.vital = vital;
+    }
+
+    public String getLis() {
+        return lis;
+    }
+
+    public void setLis(String lis) {
+        this.lis = lis;
+    }
+
+    public String getPacs() {
+        return pacs;
+    }
+
+    public void setPacs(String pacs) {
+        this.pacs = pacs;
+    }
+
+    public String getDiag() {
+        return diag;
+    }
+
+    public void setDiag(String diag) {
+        this.diag = diag;
+    }
+
+    public String getPast() {
+        return past;
+    }
+
+    public void setPast(String past) {
+        this.past = past;
+    }
+
+    public String getOther() {
+        return other;
+    }
+
+    public void setOther(String other) {
+        this.other = other;
+    }
+
+    public String getFeatureType() {
+        return featureType;
+    }
+
+    public void setFeatureType(String featureType) {
+        this.featureType = featureType;
+    }
+
+    public String[] getFeatureTypes() {
+        return featureTypes;
+    }
+
+    public void setFeatureTypes(String[] featureTypes) {
+        this.featureTypes = featureTypes;
+    }
+
+    public String getResourceType() {
+        return resourceType;
+    }
+
+    public void setResourceType(String resourceType) {
+        this.resourceType = resourceType;
+    }
+
+    public String getSysCode() {
+        return sysCode;
+    }
+
+    public void setSysCode(String sysCode) {
+        this.sysCode = sysCode;
+    }
+
+    public void setThreshold(String threshold) {
+        this.threshold = threshold;
+    }
+
+    public float getThreshold() {
+        return Float.parseFloat(threshold);
+    }
+
+    public List<Feature> getSymptomFeatureList() {
+        return symptomFeatureList;
+    }
+
+    public void setSymptomFeatureList(List<Feature> symptomFeatureList) {
+        this.symptomFeatureList = symptomFeatureList;
+    }
+
+    public List<Feature> getVitalFeatureList() {
+        return vitalFeatureList;
+    }
+
+    public void setVitalFeatureList(List<Feature> vitalFeatureList) {
+        this.vitalFeatureList = vitalFeatureList;
+    }
+
+    public List<Feature> getLisFeatureList() {
+        return lisFeatureList;
+    }
+
+    public void setLisFeatureList(List<Feature> lisFeatureList) {
+        this.lisFeatureList = lisFeatureList;
+    }
+
+    public List<Feature> getPacsFeatureList() {
+        return pacsFeatureList;
+    }
+
+    public void setPacsFeatureList(List<Feature> pacsFeatureList) {
+        this.pacsFeatureList = pacsFeatureList;
+    }
+
+
+    public List<Feature> getSymptompropertyFeatureList() {
+        return symptompropertyFeatureList;
+    }
+
+    public void setSymptompropertyFeatureList(List<Feature> symptompropertyFeatureList) {
+        this.symptompropertyFeatureList = symptompropertyFeatureList;
+    }
+
+    public List<Feature> getDiagFeatureList() {
+        return diagFeatureList;
+    }
+
+    public void setDiagFeatureList(List<Feature> diagFeatureList) {
+        this.diagFeatureList = diagFeatureList;
+    }
+
+    public Map<String, Map<String, String>> getInputs() {
+        return inputs;
+    }
+
+    public void setInputs(Map<String, Map<String, String>> inputs) {
+        this.inputs = inputs;
+    }
+
+    public AlgorithmClassify[] getAlgorithmClassify() {
+        return algorithmClassify;
+    }
+
+    public void setAlgorithmClassify(AlgorithmClassify[] algorithmClassify) {
+        this.algorithmClassify = algorithmClassify;
+    }
+
+    public String getAlgorithmClassifyValue() {
+        return algorithmClassifyValue;
+    }
+
+    public void setAlgorithmClassifyValue(String algorithmClassifyValue) {
+        this.algorithmClassifyValue = algorithmClassifyValue;
+    }
+}

+ 132 - 0
triage-service/src/main/java/com/diagbot/client/bean/Status.java

@@ -0,0 +1,132 @@
+package com.diagbot.client.bean;
+
+public enum Status {
+    /**
+     * <code>PENDING = 1;</code>
+     *
+     * <pre>
+     * 操作尚未开始
+     * </pre>
+     */
+    PENDING(1),
+    /**
+     * <code>RUNNING = 2;</code>
+     *
+     * <pre>
+     * 操作开始
+     * </pre>
+     */
+    RUNNING(2),
+    /**
+     * <code>OK = 3;</code>
+     *
+     * <pre>
+     * 操作正常结束
+     * </pre>
+     */
+    OK(3),
+    /**
+     * <code>WARN = 4;</code>
+     *
+     * <pre>
+     * 有警告,但是正常结束
+     * </pre>
+     */
+    WARN(4),
+    /**
+     * <code>ERROR = 5;</code>
+     *
+     * <pre>
+     * 有错误,但是完整结束
+     * </pre>
+     */
+    ERROR(5),
+    /**
+     * <code>FAIL = 6;</code>
+     *
+     * <pre>
+     * 操作失败
+     * </pre>
+     */
+    FAIL(6),
+    ;
+
+    /**
+     * <code>PENDING = 1;</code>
+     *
+     * <pre>
+     * 操作尚未开始
+     * </pre>
+     */
+    public static final int PENDING_VALUE = 1;
+    /**
+     * <code>RUNNING = 2;</code>
+     *
+     * <pre>
+     * 操作开始
+     * </pre>
+     */
+    public static final int RUNNING_VALUE = 2;
+    /**
+     * <code>OK = 3;</code>
+     *
+     * <pre>
+     * 操作正常结束
+     * </pre>
+     */
+    public static final int OK_VALUE = 3;
+    /**
+     * <code>WARN = 4;</code>
+     *
+     * <pre>
+     * 有警告,但是正常结束
+     * </pre>
+     */
+    public static final int WARN_VALUE = 4;
+    /**
+     * <code>ERROR = 5;</code>
+     *
+     * <pre>
+     * 有错误,但是完整结束
+     * </pre>
+     */
+    public static final int ERROR_VALUE = 5;
+    /**
+     * <code>FAIL = 6;</code>
+     *
+     * <pre>
+     * 操作失败
+     * </pre>
+     */
+    public static final int FAIL_VALUE = 6;
+
+    public final int getNumber() {
+        return value;
+    }
+
+    public static Status valueOf(int value) {
+        switch (value) {
+            case 1:
+                return PENDING;
+            case 2:
+                return RUNNING;
+            case 3:
+                return OK;
+            case 4:
+                return WARN;
+            case 5:
+                return ERROR;
+            case 6:
+                return FAIL;
+            default:
+                return null;
+        }
+    }
+
+    private final int value;
+
+    private Status(int value) {
+        this.value = value;
+    }
+
+}

+ 24 - 0
triage-service/src/main/java/com/diagbot/client/hystrix/AIServiceHystrix.java

@@ -0,0 +1,24 @@
+package com.diagbot.client.hystrix;
+
+
+import com.diagbot.client.AIServiceClient;
+import com.diagbot.client.bean.Response;
+import com.diagbot.client.bean.ResponseData;
+import com.diagbot.client.bean.SearchData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 人工智能服务客服端 (请求失败熔断)
+ * @author: gaodm
+ * @time: 2018/10/25 9:56
+ */
+@Component
+@Slf4j
+public class AIServiceHystrix implements AIServiceClient {
+    @Override
+    public Response<ResponseData> bayesPageData(SearchData searchData) {
+        log.error("【hystrix】调用{}异常", "bayesPageData");
+        return null;
+    }
+}

+ 19 - 0
triage-service/src/main/java/com/diagbot/config/CustomAccessTokenConverter.java

@@ -0,0 +1,19 @@
+package com.diagbot.config;
+
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {
+
+    @Override
+    public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
+        OAuth2Authentication authentication = super.extractAuthentication(claims);
+        authentication.setDetails(claims);
+        return authentication;
+    }
+
+}

+ 15 - 0
triage-service/src/main/java/com/diagbot/config/GlobalMethodSecurityConfigurer.java

@@ -0,0 +1,15 @@
+package com.diagbot.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+
+/**
+ * @Description: 安全配置类
+ * @author: gaodm
+ * @time: 2018/8/2 13:38
+ */
+@Configuration
+@EnableGlobalMethodSecurity(prePostEnabled = true)
+public class GlobalMethodSecurityConfigurer {
+
+}

+ 48 - 0
triage-service/src/main/java/com/diagbot/config/JwtConfigurer.java

@@ -0,0 +1,48 @@
+package com.diagbot.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
+import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
+import org.springframework.util.FileCopyUtils;
+
+import java.io.IOException;
+
+/**
+ * @Description: JWT配置类
+ * @author: gaodm
+ * @time: 2018/8/2 13:38
+ */
+@Configuration
+public class JwtConfigurer {
+    @Autowired
+    private CustomAccessTokenConverter customAccessTokenConverter;
+
+    @Bean
+    @Qualifier("tokenStore")
+    public TokenStore tokenStore() {
+
+        System.out.println("Created JwtTokenStore");
+        return new JwtTokenStore(jwtTokenEnhancer());
+    }
+
+    @Bean
+    protected JwtAccessTokenConverter jwtTokenEnhancer() {
+        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
+        Resource resource = new ClassPathResource("public.cert");
+        String publicKey;
+        try {
+            publicKey = new String(FileCopyUtils.copyToByteArray(resource.getInputStream()));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        converter.setVerifierKey(publicKey);
+        converter.setAccessTokenConverter(customAccessTokenConverter);
+        return converter;
+    }
+}

+ 29 - 0
triage-service/src/main/java/com/diagbot/config/MybatisPlusConfigurer.java

@@ -0,0 +1,29 @@
+package com.diagbot.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * @Description: MybatisPlus配置类
+ * @author: gaodm
+ * @time: 2018/8/2 13:39
+ */
+@EnableTransactionManagement
+@Configuration
+@MapperScan("com.diagbot.mapper*")//这个注解,作用相当于下面的@Bean MapperScannerConfigurer,2者配置1份即可
+public class MybatisPlusConfigurer {
+
+    /**
+     * mybatis-plus分页插件<br>
+     * 文档:http://mp.baomidou.com<br>
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        return paginationInterceptor;
+    }
+
+}

+ 47 - 0
triage-service/src/main/java/com/diagbot/config/ResourceServerConfigurer.java

@@ -0,0 +1,47 @@
+package com.diagbot.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
+import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
+import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+
+/**
+ * @Description: 权限资源配置类
+ * @author: gaodm
+ * @time: 2018/8/2 14:21
+ */
+@Configuration
+@EnableResourceServer
+public class ResourceServerConfigurer extends ResourceServerConfigurerAdapter {
+    Logger log = LoggerFactory.getLogger(ResourceServerConfigurer.class);
+
+    @Override
+    public void configure(HttpSecurity http) throws Exception {
+        http
+                .csrf().disable()
+                .authorizeRequests()
+                .regexMatchers(".*swagger.*", ".*v2.*", ".*webjars.*", "/druid.*", "/actuator.*", "/hystrix.*").permitAll()
+                .antMatchers("/symptom/getUsual").permitAll()
+                .antMatchers("/symptom/search").permitAll()
+                .antMatchers("/part/getSymptomByPartIds").permitAll()
+                .antMatchers("/ai/pushSymptom").permitAll()
+                .antMatchers("/ai/pushDis").permitAll()
+                .antMatchers("/**").authenticated();
+        //        .antMatchers("/**").permitAll();
+    }
+
+
+    @Override
+    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
+        log.info("Configuring ResourceServerSecurityConfigurer ");
+        resources.resourceId("user-service").tokenStore(tokenStore);
+    }
+
+    @Autowired
+    TokenStore tokenStore;
+}

+ 69 - 0
triage-service/src/main/java/com/diagbot/config/SwaggerConfigurer.java

@@ -0,0 +1,69 @@
+package com.diagbot.config;
+
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @Description: Swagger配置类
+ * @author: gaodm
+ * @time: 2018/8/2 14:21
+ */
+@Configuration
+@ConditionalOnProperty(prefix = "swagger", value = { "enable" }, havingValue = "true")
+@EnableSwagger2
+public class SwaggerConfigurer {
+    /**
+     * 全局参数
+     *
+     * @return
+     */
+    private List<Parameter> parameter() {
+        List<Parameter> params = new ArrayList<>();
+        params.add(new ParameterBuilder().name("Authorization")
+                .description("Authorization Bearer token")
+                .modelRef(new ModelRef("string"))
+                .parameterType("header")
+                .required(false).build());
+        return params;
+    }
+
+
+    @Bean
+    public Docket sysApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.diagbot.web"))
+                .paths(PathSelectors.any())
+                .build().globalOperationParameters(parameter());
+        //.securitySchemes(newArrayList(oauth()))
+        // .securityContexts(newArrayList(securityContext()));
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title(" triage-service api ")
+                .description("triage-service 微服务")
+                .termsOfServiceUrl("")
+                .contact("diagbot")
+                .version("1.0")
+                .build();
+    }
+
+}

+ 86 - 0
triage-service/src/main/java/com/diagbot/config/security/UrlAccessDecisionManager.java

@@ -0,0 +1,86 @@
+package com.diagbot.config.security;
+
+import org.springframework.security.access.AccessDecisionManager;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.authentication.InsufficientAuthenticationException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collection;
+
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:46
+ */
+@Service
+public class UrlAccessDecisionManager implements AccessDecisionManager {
+    @Override
+    public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
+        HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
+        String url, method;
+        if (matchPermitAllUrl(request)) {
+            return;
+        }
+        if ("anonymousUser".equals(authentication.getPrincipal())) {
+            throw new AccessDeniedException("no right");
+        } else {
+            for (GrantedAuthority ga : authentication.getAuthorities()) {
+                String[] authority = ga.getAuthority().split(";");
+                url = authority[0];
+                method = authority[1];
+                if (matchers(url, request)) {
+                    if (method.equals(request.getMethod()) || "ALL".equals(method)) {
+                        return;
+                    }
+                }
+            }
+        }
+        throw new AccessDeniedException("no right");
+    }
+
+
+    @Override
+    public boolean supports(ConfigAttribute attribute) {
+        return true;
+    }
+
+    @Override
+    public boolean supports(Class<?> clazz) {
+        return true;
+    }
+
+    private Boolean matchPermitAllUrl(HttpServletRequest request){
+        if (matchers("/swagger/**", request)
+                || matchers("/v2/**", request)
+                || matchers("/swagger-ui.html/**", request)
+                || matchers("/swagger-resources/**", request)
+                || matchers("/webjars/**", request)
+                || matchers("/druid/**", request)
+                || matchers("/actuator/**", request)
+                || matchers("/hystrix/**", request)
+                || matchers("/symptom/getUsual", request)
+                || matchers("/symptom/search", request)
+                || matchers("/part/getSymptomByPartIds", request)
+                || matchers("/ai/pushSymptom", request)
+                || matchers("/ai/pushDis", request)
+                || matchers("/", request)) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean matchers(String url, HttpServletRequest request) {
+        AntPathRequestMatcher matcher = new AntPathRequestMatcher(url);
+        if (matcher.matches(request)) {
+            return true;
+        }
+        return false;
+    }
+}

+ 29 - 0
triage-service/src/main/java/com/diagbot/config/security/UrlConfigAttribute.java

@@ -0,0 +1,29 @@
+package com.diagbot.config.security;
+
+import org.springframework.security.access.ConfigAttribute;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+public class UrlConfigAttribute implements ConfigAttribute {
+
+    private final HttpServletRequest httpServletRequest;
+
+    public UrlConfigAttribute(HttpServletRequest httpServletRequest) {
+        this.httpServletRequest = httpServletRequest;
+    }
+
+
+    @Override
+    public String getAttribute() {
+        return null;
+    }
+
+    public HttpServletRequest getHttpServletRequest() {
+        return httpServletRequest;
+    }
+}

+ 79 - 0
triage-service/src/main/java/com/diagbot/config/security/UrlFilterSecurityInterceptor.java

@@ -0,0 +1,79 @@
+package com.diagbot.config.security;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.SecurityMetadataSource;
+import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
+import org.springframework.security.access.intercept.InterceptorStatusToken;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.io.IOException;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+@Service
+public class UrlFilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
+
+
+    @Autowired
+    private FilterInvocationSecurityMetadataSource securityMetadataSource;
+
+    @Autowired
+    public void setUrlAccessDecisionManager(UrlAccessDecisionManager urlAccessDecisionManager) {
+        super.setAccessDecisionManager(urlAccessDecisionManager);
+    }
+
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+
+        FilterInvocation fi = new FilterInvocation(request, response, chain);
+        invoke(fi);
+    }
+
+
+    public void invoke(FilterInvocation fi) throws IOException, ServletException {
+        //fi里面有一个被拦截的url
+        //里面调用UrlMetadataSource的getAttributes(Object object)这个方法获取fi对应的所有权限
+        //再调用UrlAccessDecisionManager的decide方法来校验用户的权限是否足够
+        InterceptorStatusToken token = super.beforeInvocation(fi);
+        try {
+            //执行下一个拦截器
+            fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
+        } finally {
+            super.afterInvocation(token, null);
+        }
+    }
+
+
+    @Override
+    public void destroy() {
+
+    }
+
+    @Override
+    public Class<?> getSecureObjectClass() {
+        return FilterInvocation.class;
+
+    }
+
+    @Override
+    public SecurityMetadataSource obtainSecurityMetadataSource() {
+        return this.securityMetadataSource;
+    }
+}

+ 40 - 0
triage-service/src/main/java/com/diagbot/config/security/UrlMetadataSourceService.java

@@ -0,0 +1,40 @@
+package com.diagbot.config.security;
+
+import org.springframework.security.access.ConfigAttribute;
+import org.springframework.security.web.FilterInvocation;
+import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @Description: 自定义权限拦截
+ * @author: gaodm
+ * @time: 2018/8/23 13:47
+ */
+@Service
+public class UrlMetadataSourceService implements
+        FilterInvocationSecurityMetadataSource {
+
+    @Override
+    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
+        final HttpServletRequest request = ((FilterInvocation) object).getRequest();
+        Set<ConfigAttribute> allAttributes = new HashSet<>();
+        ConfigAttribute configAttribute = new UrlConfigAttribute(request);
+        allAttributes.add(configAttribute);
+        return allAttributes;
+    }
+
+    @Override
+    public Collection<ConfigAttribute> getAllConfigAttributes() {
+        return null;
+    }
+
+    @Override
+    public boolean supports(Class<?> clazz) {
+        return true;
+    }
+}

+ 19 - 0
triage-service/src/main/java/com/diagbot/dto/AIDTO.java

@@ -0,0 +1,19 @@
+package com.diagbot.dto;
+
+import com.diagbot.client.bean.FeatureRate;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2018/10/25 10:15
+ */
+@Getter
+@Setter
+public class AIDTO {
+    private List<FeatureRate> items = new ArrayList<>();
+}

+ 23 - 0
triage-service/src/main/java/com/diagbot/dto/PartDTO.java

@@ -0,0 +1,23 @@
+package com.diagbot.dto;
+
+import com.diagbot.entity.SymptomWrapper;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 部位症状关联信息
+ * @Author: ztg
+ * @Date: 2018/10/24 16:11
+ */
+@Getter
+@Setter
+public class PartDTO {
+
+    private Long id;// 部位id
+    private String name;//部位名称
+    private Long parentId;// 上级id
+    private List<SymptomWrapper> symptomList = new ArrayList<>(); //症状列表
+}

+ 22 - 0
triage-service/src/main/java/com/diagbot/dto/PartSymptomDTO.java

@@ -0,0 +1,22 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 部位症状关联信息
+ * @Author: ztg
+ * @Date: 2018/10/24 16:11
+ */
+@Getter
+@Setter
+public class PartSymptomDTO {
+
+    private Long id;// 部位id
+    private String name;//部位名称
+    private Long parentId;// 上级id
+    private List<PartDTO> partDTO = new ArrayList<>(); //部位信息
+}

+ 20 - 0
triage-service/src/main/java/com/diagbot/dto/SymptomSearchDTO.java

@@ -0,0 +1,20 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description: 部位症状关联信息
+ * @Author: ztg
+ * @Date: 2018/10/24 16:11
+ */
+@Getter
+@Setter
+public class SymptomSearchDTO {
+
+    private Long id;// id
+    private String name;//症状名称
+    private String searchName;//检索名称
+    private Integer showType; //显示类型 1:本体,2:同义词
+    private String showTypeCn; //显示类型中文 1:本体,2:同义词
+}

+ 69 - 0
triage-service/src/main/java/com/diagbot/entity/Part.java

@@ -0,0 +1,69 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * @Description: 部位表
+ * @Author: ztg
+ * @Date: 2018/10/24 15:52
+ */
+@TableName("triage_part")
+@Getter
+@Setter
+public class Part implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除 N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 上级部位
+     */
+    private Long parentId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 80 - 0
triage-service/src/main/java/com/diagbot/entity/Symptom.java

@@ -0,0 +1,80 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 症状信息表
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2018-09-17
+ */
+@TableName("triage_symptom")
+@Getter
+@Setter
+public class Symptom implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除 N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 性别(1:男,2:女,3:共用)
+     */
+    private Integer sexType;
+
+    /**
+     * 最小年龄
+     */
+    private Integer ageBegin;
+
+    /**
+     * 最大年龄
+     */
+    private Integer ageEnd;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 85 - 0
triage-service/src/main/java/com/diagbot/entity/SymptomWrapper.java

@@ -0,0 +1,85 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 症状信息扩展表
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2018-09-17
+ */
+@TableName("triage_symptom")
+@Getter
+@Setter
+public class SymptomWrapper implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除 N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 性别(1:男,2:女,3:共用)
+     */
+    private Integer sexType;
+
+    /**
+     * 最小年龄
+     */
+    private Integer ageBegin;
+
+    /**
+     * 最大年龄
+     */
+    private Integer ageEnd;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 部位id
+     */
+    private Long partId;
+
+}

+ 196 - 0
triage-service/src/main/java/com/diagbot/entity/SysLog.java

@@ -0,0 +1,196 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 系统操作日志表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-09-14
+ */
+public class SysLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 日志ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 访问者的IP
+     */
+    private String ip;
+
+    /**
+     * 访问的系统类型 1:user-service,2:diagbotman-service,3:uaa-service,4:log-service,5:bi-service,6:knowledge-service,7:feedback-service,8:icss-web
+     */
+    private Integer sysType;
+
+    /**
+     * 方法
+     */
+    private String method;
+
+    /**
+     * 操作名
+     */
+    private String operation;
+
+    /**
+     * 参数
+     */
+    private String params;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public Integer getSysType() {
+        return sysType;
+    }
+
+    public void setSysType(Integer sysType) {
+        this.sysType = sysType;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public String getOperation() {
+        return operation;
+    }
+
+    public void setOperation(String operation) {
+        this.operation = operation;
+    }
+
+    public String getParams() {
+        return params;
+    }
+
+    public void setParams(String params) {
+        this.params = params;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    @Override
+    public String toString() {
+        return "SysLog{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", ip=" + ip +
+                ", sysType=" + sysType +
+                ", method=" + method +
+                ", operation=" + operation +
+                ", params=" + params +
+                ", username=" + username +
+                "}";
+    }
+}

+ 50 - 0
triage-service/src/main/java/com/diagbot/enums/ShowTypeEnum.java

@@ -0,0 +1,50 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @Description:检索显示类型枚举类
+ * @author: zhoutg
+ * @Date: 2018/10/26 10:35
+ */
+public enum ShowTypeEnum implements KeyedNamed {
+
+    ITSELF(1, "本体"),
+    SYNONYMS(2, "同义词");
+
+    @Setter
+    private Integer key;
+
+    @Setter
+    private String name;
+
+    ShowTypeEnum(Integer key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static ShowTypeEnum getEnum(Integer key) {
+        for (ShowTypeEnum item : ShowTypeEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(Integer key) {
+        ShowTypeEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}

+ 81 - 0
triage-service/src/main/java/com/diagbot/exception/CommonExceptionHandler.java

@@ -0,0 +1,81 @@
+package com.diagbot.exception;
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.util.GsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * @Description: 错误通用处理
+ * @author: gaodm
+ * @time: 2018/8/2 14:22
+ */
+@ControllerAdvice
+@ResponseBody
+@Slf4j
+public class CommonExceptionHandler {
+
+    @ExceptionHandler(Exception.class)
+    public ResponseEntity<RespDTO> handleException(Exception e) {
+        RespDTO resp = new RespDTO();
+        if (e instanceof BindException) {
+            BindException ex = (BindException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof MethodArgumentNotValidException) {
+            MethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            for (FieldError fieldError : ex.getBindingResult().getFieldErrors()) {
+                stringMap.put(fieldError.getField(), fieldError.getDefaultMessage());
+            }
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof MissingServletRequestParameterException) {
+            MissingServletRequestParameterException ex = (MissingServletRequestParameterException) e;
+            Map<String, String> stringMap = new HashMap<>();
+            stringMap.put(ex.getParameterName(), "不能为null");
+            String msg = GsonUtil.toJson(stringMap);
+            log.warn("【参数异常】:{}", msg);
+            resp.code = CommonErrorCode.PARAM_ERROR.getCode();
+            resp.msg = msg;
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        if (e instanceof CommonException) {
+            CommonException taiChiException = (CommonException) e;
+            resp.code = taiChiException.getCode();
+            resp.msg = e.getMessage();
+            log.error("【业务异常】:{}", e.getMessage());
+            return new ResponseEntity(resp, HttpStatus.OK);
+        }
+        resp.code = CommonErrorCode.FAIL.getCode();
+        resp.msg = e.getMessage();
+        log.error("【系统异常】:{}", e.getMessage());
+        e.printStackTrace();
+        return new ResponseEntity(resp, HttpStatus.OK);
+    }
+
+}

+ 69 - 0
triage-service/src/main/java/com/diagbot/facade/AIFacade.java

@@ -0,0 +1,69 @@
+package com.diagbot.facade;
+
+import com.diagbot.client.AIServiceClient;
+import com.diagbot.client.bean.Response;
+import com.diagbot.client.bean.ResponseData;
+import com.diagbot.client.bean.SearchData;
+import com.diagbot.dto.AIDTO;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.vo.AIVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 调用AI服务业务实现
+ * @author: gaodm
+ * @time: 2018/10/25 10:09
+ */
+@Component
+public class AIFacade {
+    @Autowired
+    private AIServiceClient aiServiceClient;
+
+    /**
+     * 调用ai接口业务逻辑
+     *
+     * @param aivo 搜索参数
+     * @return AI接口返回结果
+     */
+    public AIDTO push(AIVO aivo, String type) {
+        SearchData searchData = new SearchData();
+        searchData.setAge(aivo.getAge());
+        searchData.setSymptom(aivo.getSymptom());
+        switch (aivo.getSex()) {
+            case 1:
+                searchData.setSex("M");
+                break;
+            case 2:
+                searchData.setSex("F");
+                break;
+            default:
+                throw new CommonException(CommonErrorCode.PARAM_ERROR, "不能输入男女以外的性别");
+        }
+        searchData.setFeatureType(type);
+        searchData.setSysCode("1");
+        switch (type) {
+            case "1":
+                searchData.setLength(10);
+                break;
+            case "7":
+                searchData.setLength(2);
+                break;
+        }
+        Response<ResponseData> res = aiServiceClient.bayesPageData(searchData);
+        if (null == res || null == res.getData()) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "AI没有返回结果");
+        }
+        AIDTO aidto = new AIDTO();
+        switch (type) {
+            case "1":
+                aidto.setItems(res.getData().getSymptom());
+                break;
+            case "7":
+                aidto.setItems(res.getData().getDis());
+                break;
+        }
+        return aidto;
+    }
+}

+ 102 - 0
triage-service/src/main/java/com/diagbot/facade/PartFacade.java

@@ -0,0 +1,102 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.dto.PartDTO;
+import com.diagbot.dto.PartSymptomDTO;
+import com.diagbot.entity.Part;
+import com.diagbot.entity.SymptomWrapper;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.service.impl.PartServiceImpl;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.vo.PartSymptomVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 部位facade
+ * @Author: ztg
+ * @Date: 2018/10/23 16:33
+ */
+@Component
+public class PartFacade extends PartServiceImpl {
+
+    @Autowired
+    SymptomFacade symptomFacade;
+
+    /**
+     * 根据已选部位返回对应的症状
+     *
+     * @param partSymptomVO 参数
+     * @return 部位症状关联信息
+     */
+    public List<PartSymptomDTO> getSymptomByPartIds(PartSymptomVO partSymptomVO) {
+        List<Long> partIds = partSymptomVO.getPartIds();
+        if(ListUtil.isEmpty(partIds)) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
+                    "请选择部位");
+        }
+        if(partSymptomVO.getSexType() == null) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
+                    "请选择性别");
+        }
+        if(partSymptomVO.getAge() == null) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
+                    "请选择年龄");
+        }
+        if(partSymptomVO.getAge().intValue() < 0 || partSymptomVO.getAge().intValue() > 200) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR,
+                    "超出年龄范围【0 — 200】");
+        }
+        //添加默认部位-全身
+        QueryWrapper wrapper = new QueryWrapper();
+        wrapper.eq("name", "全身");
+        Part part = this.getOne(wrapper);
+        partIds.add(part.getId());
+        Map paramMap = new HashMap<>();
+        paramMap.put("ids", partIds);
+        List<PartSymptomDTO> res = this.getByPartId(paramMap);
+        List<PartDTO> partList = this.getByParentId(paramMap);
+
+        //添加二级部位信息
+        Map<Long, List<PartDTO>> keyMap = EntityUtil.makeEntityListMap(partList, "parentId");
+        for(PartSymptomDTO bean : res) {
+            bean.setPartDTO(keyMap.get(bean.getId()));
+        }
+
+        //添加部位和症状的关联信息
+        List<Long> idList = new ArrayList<>();
+        for(PartDTO bean : partList) {
+            idList.add(bean.getId());
+        }
+        Map paramMap1 = new HashMap<>();
+        paramMap1.put("ids", idList);
+        paramMap1.put("sexType", partSymptomVO.getSexType());
+        paramMap1.put("age", partSymptomVO.getAge());
+        List<SymptomWrapper> symptomList = symptomFacade.getByPartIdsFac(paramMap1);
+        Map<Long, List<SymptomWrapper>> partSymptomMap = EntityUtil.makeEntityListMap(symptomList, "partId");
+        for(PartDTO bean : partList) {
+            bean.setSymptomList(partSymptomMap.get(bean.getId()));
+        }
+
+        //如二级部位无关联的症状,删除二级部位
+//        for(int i = 0; i < res.size(); i++) {
+//            List<PartDTO> partDTO = res.get(i).getPartDTO();
+//            for(int j = 0; j < partDTO.size(); j++) {
+//                if(ListUtil.isEmpty(partDTO.get(j).getSymptomList())) {
+//                    partDTO.remove(j--);
+//                    break;
+//                }
+//            }
+//        }
+        return res;
+    }
+
+
+}

+ 83 - 0
triage-service/src/main/java/com/diagbot/facade/SymptomFacade.java

@@ -0,0 +1,83 @@
+package com.diagbot.facade;
+
+import com.diagbot.dto.SymptomSearchDTO;
+import com.diagbot.entity.Symptom;
+import com.diagbot.entity.SymptomWrapper;
+import com.diagbot.enums.ShowTypeEnum;
+import com.diagbot.service.impl.SymptomServiceImpl;
+import com.diagbot.vo.SymptomSearchVO;
+import com.diagbot.vo.SymptomUsualVO;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 症状
+ * @Author: ztg
+ * @Date: 2018/10/23 16:33
+ */
+@Component
+public class SymptomFacade extends SymptomServiceImpl{
+    /**
+     *  获取常用症状
+     *
+     * @return
+     */
+    public List<Symptom> getUsualFac(SymptomUsualVO symptomUsualVO) {
+        Map paramMap = new HashMap();
+        paramMap.put("sexType", symptomUsualVO.getSexType());
+        paramMap.put("age", symptomUsualVO.getAge());
+        return this.getUsual(paramMap);
+    }
+
+
+    /**
+     * 根据部位partIds获取症状信息
+     *
+     * @param map 参数
+     * @return
+     */
+    public List<SymptomWrapper> getByPartIdsFac(Map map) {
+        return this.getByPartIds(map);
+    }
+
+
+    /**
+     * 症状检索
+     *
+     * @param symptomSearchVO
+     * @return 检索的症状
+     */
+    public List<SymptomSearchDTO> searchFac(SymptomSearchVO symptomSearchVO) {
+        List<SymptomSearchDTO> res = new ArrayList<>();
+        Map paramMap = new HashMap();
+        paramMap.put("name", symptomSearchVO.getName());
+        paramMap.put("sexType", symptomSearchVO.getSexType());
+        paramMap.put("age", symptomSearchVO.getAge());
+        List<SymptomSearchDTO> symptomSearchDTOList = this.search(paramMap);
+        List<Long> ids = new ArrayList<>();
+        //获取所有的本体,添加返回结果,因为sql语句返回时同义词有可能排前面,而本体排后面
+        for(SymptomSearchDTO bean : symptomSearchDTOList) {
+            if(ShowTypeEnum.ITSELF.getKey() == bean.getShowType()) { //本体
+                ids.add(bean.getId());
+            }
+        }
+        for(SymptomSearchDTO bean : symptomSearchDTOList) {
+            //如果是本体,直接返回
+            if(ShowTypeEnum.ITSELF.getKey() == bean.getShowType()) {
+                res.add(bean);
+            } else {
+                //如果是同义词,判断是否已添加,有多个同义词任意取一个
+                if(!ids.contains(bean.getId())) {
+                    ids.add(bean.getId());
+                    res.add(bean);
+                }
+            }
+        }
+        return res;
+    }
+
+}

+ 31 - 0
triage-service/src/main/java/com/diagbot/mapper/PartMapper.java

@@ -0,0 +1,31 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.dto.PartDTO;
+import com.diagbot.dto.PartSymptomDTO;
+import com.diagbot.entity.Part;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: Mapper 接口
+ * @Author: ztg
+ * @Date: 2018/10/24 16:02
+ */
+public interface PartMapper extends BaseMapper<Part> {
+
+    /**
+     * 根据部位ids获取部位信息
+     * @param map
+     * @return
+     */
+    public List<PartSymptomDTO> getByPartId(Map map);
+
+    /**
+     * 根据部位parentIds获取部位信息
+     * @param map
+     * @return
+     */
+    public List<PartDTO> getByParentId(Map map);
+}

+ 39 - 0
triage-service/src/main/java/com/diagbot/mapper/SymptomMapper.java

@@ -0,0 +1,39 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.dto.SymptomSearchDTO;
+import com.diagbot.entity.Symptom;
+import com.diagbot.entity.SymptomWrapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 部位mapper
+ * @Author: ztg
+ * @Date: 2018/10/24 15:55
+ */
+public interface SymptomMapper extends BaseMapper<Symptom> {
+
+    /**
+     * 根据部位ids获取症状信息
+     * @param map
+     * @return
+     */
+    public List<SymptomWrapper> getByPartIds(Map map);
+
+
+    /**
+     * 获取常用症状
+     * @return 常用症状
+     */
+    public List<Symptom> getUsual(Map map);
+
+
+    /**
+     * 检索
+     * @param map
+     * @return
+     */
+    public List<SymptomSearchDTO> search(Map map);
+}

+ 16 - 0
triage-service/src/main/java/com/diagbot/mapper/SysLogMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.entity.SysLog;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+public interface SysLogMapper extends BaseMapper<SysLog> {
+
+}

+ 23 - 0
triage-service/src/main/java/com/diagbot/rabbit/MyProcessor.java

@@ -0,0 +1,23 @@
+package com.diagbot.rabbit;
+
+import org.springframework.cloud.stream.annotation.Input;
+import org.springframework.cloud.stream.annotation.Output;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.messaging.SubscribableChannel;
+
+/**
+ * @Description: 自定义Stream发布和消费对象
+ * @author: gaodm
+ * @time: 2018/8/29 13:39
+ */
+public interface MyProcessor {
+
+    String INPUT_LOG = "inputLog";
+    String OUTPUT_LOG = "outputLog";
+
+    @Input(INPUT_LOG)
+    SubscribableChannel inputLog();
+
+    @Output(OUTPUT_LOG)
+    MessageChannel outputLog();
+}

+ 27 - 0
triage-service/src/main/java/com/diagbot/rabbit/MySender.java

@@ -0,0 +1,27 @@
+package com.diagbot.rabbit;
+
+import com.diagbot.entity.SysLog;
+import com.diagbot.util.GsonUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.cloud.stream.annotation.EnableBinding;
+import org.springframework.integration.support.MessageBuilder;
+import org.springframework.messaging.MessageChannel;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description: 发布者
+ * @author: gaodm
+ * @time: 2018/8/29 13:41
+ */
+@Component
+@EnableBinding({ MyProcessor.class })
+public class MySender {
+    @Autowired
+    @Qualifier("outputLog")
+    MessageChannel outputLog;
+
+    public void outputLogSend(SysLog sysLog) {
+        outputLog.send(MessageBuilder.withPayload(GsonUtil.toJson(sysLog)).build());
+    }
+}

+ 34 - 0
triage-service/src/main/java/com/diagbot/service/PartService.java

@@ -0,0 +1,34 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.PartDTO;
+import com.diagbot.dto.PartSymptomDTO;
+import com.diagbot.entity.Part;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 服务类
+ * @Author: ztg
+ * @Date: 2018/10/24 16:03
+ */
+public interface PartService extends IService<Part> {
+
+    /**
+     * 根据部位ids获取部位信息
+     * @param map
+     * @return
+     */
+    public List<PartSymptomDTO> getByPartId(Map map);
+
+    /**
+     * 根据部位parentIds获取部位信息
+     * @param map
+     * @return
+     */
+    public List<PartDTO> getByParentId(Map map);
+
+
+
+}

+ 44 - 0
triage-service/src/main/java/com/diagbot/service/SymptomService.java

@@ -0,0 +1,44 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.SymptomSearchDTO;
+import com.diagbot.entity.Symptom;
+import com.diagbot.entity.SymptomWrapper;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+public interface SymptomService extends IService<Symptom> {
+
+
+    /**
+     * 根据部位ids获取症状信息
+     * @param map
+     * @return
+     */
+    public List<SymptomWrapper> getByPartIds(Map map);
+
+
+    /**
+     * 获取常用症状
+     * @return
+     */
+    public List<Symptom> getUsual(Map map);
+
+
+    /**
+     * 检索
+     * @param map
+     * @return 症状检索的信息
+     */
+    public List<SymptomSearchDTO> search(Map map);
+
+}

+ 15 - 0
triage-service/src/main/java/com/diagbot/service/SysLogService.java

@@ -0,0 +1,15 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.entity.SysLog;
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+public interface SysLogService extends IService<SysLog> {
+}

+ 31 - 0
triage-service/src/main/java/com/diagbot/service/impl/PartServiceImpl.java

@@ -0,0 +1,31 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.PartDTO;
+import com.diagbot.dto.PartSymptomDTO;
+import com.diagbot.entity.Part;
+import com.diagbot.mapper.PartMapper;
+import com.diagbot.service.PartService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 服务实现类
+ * @Author: ztg
+ * @Date: 2018/10/24 16:02
+ */
+@Service
+public class PartServiceImpl extends ServiceImpl<PartMapper, Part> implements PartService {
+
+    @Override
+    public List<PartSymptomDTO> getByPartId(Map map) {
+        return baseMapper.getByPartId(map);
+    }
+
+    @Override
+    public List<PartDTO> getByParentId(Map map) {
+        return baseMapper.getByParentId(map);
+    }
+}

+ 39 - 0
triage-service/src/main/java/com/diagbot/service/impl/SymptomServiceImpl.java

@@ -0,0 +1,39 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.SymptomSearchDTO;
+import com.diagbot.entity.Symptom;
+import com.diagbot.entity.SymptomWrapper;
+import com.diagbot.mapper.SymptomMapper;
+import com.diagbot.service.SymptomService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+@Service
+public class SymptomServiceImpl extends ServiceImpl<SymptomMapper, Symptom> implements SymptomService {
+
+    @Override
+    public List<SymptomWrapper> getByPartIds(Map map) {
+        return baseMapper.getByPartIds(map);
+    }
+
+    @Override
+    public List<Symptom> getUsual(Map map) {
+        return baseMapper.getUsual(map);
+    }
+
+    @Override
+    public List<SymptomSearchDTO> search(Map map) {
+        return baseMapper.search(map);
+    }
+}

+ 19 - 0
triage-service/src/main/java/com/diagbot/service/impl/SysLogServiceImpl.java

@@ -0,0 +1,19 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.entity.SysLog;
+import com.diagbot.mapper.SysLogMapper;
+import com.diagbot.service.SysLogService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2018-08-02
+ */
+@Service
+public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements SysLogService {
+}

+ 23 - 0
triage-service/src/main/java/com/diagbot/vo/AIVO.java

@@ -0,0 +1,23 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2018/10/25 10:14
+ */
+@Getter
+@Setter
+public class AIVO {
+    @NotNull(message = "请输入年龄")
+    private Integer age;
+    @NotNull(message = "请输入性别")
+    private Integer sex;
+    @NotBlank(message = "请输入症状")
+    private String symptom;
+}

+ 20 - 0
triage-service/src/main/java/com/diagbot/vo/PartSymptomVO.java

@@ -0,0 +1,20 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description: 部位症状参数
+ * @Author: ztg
+ * @Date: 2018/10/10 13:17
+ */
+@Getter
+@Setter
+public class PartSymptomVO {
+
+    private List<Long> partIds;
+    private Integer sexType;
+    private Integer age;
+}

+ 24 - 0
triage-service/src/main/java/com/diagbot/vo/SymptomSearchVO.java

@@ -0,0 +1,24 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 部位搜索参数
+ * @Author: ztg
+ * @Date: 2018/10/10 13:17
+ */
+@Getter
+@Setter
+public class SymptomSearchVO {
+
+    @NotBlank(message = "请输入检索内容")
+    private String name;
+    @NotNull(message = "请输入性别")
+    private Integer sexType;
+    @NotNull(message = "请输入年龄")
+    private Integer age;
+}

+ 21 - 0
triage-service/src/main/java/com/diagbot/vo/SymptomUsualVO.java

@@ -0,0 +1,21 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 部位搜索参数
+ * @Author: ztg
+ * @Date: 2018/10/10 13:17
+ */
+@Getter
+@Setter
+public class SymptomUsualVO {
+
+    @NotNull(message = "请输入性别")
+    private Integer sexType;
+    @NotNull(message = "请输入年龄")
+    private Integer age;
+}

+ 65 - 0
triage-service/src/main/java/com/diagbot/web/AIController.java

@@ -0,0 +1,65 @@
+package com.diagbot.web;
+
+
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.AIDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.AIFacade;
+import com.diagbot.vo.AIVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * @Description: AI服务控制层
+ * @author: gaodm
+ * @time: 2018/10/25 10:09
+ */
+@RestController
+@RequestMapping("/ai")
+@Api(value = "AIAPI", tags = { "AIAPI" })
+public class AIController {
+
+    @Autowired
+    AIFacade aiFacade;
+
+    /**
+     * 症状推理症状接口
+     *
+     * @param aivo ai输入参数
+     * @return 症状相关数据
+     */
+    @ApiOperation(value = "症状推理症状接口[by:gaodm]",
+            notes = "age: 年龄(必填)<br>" +
+                    "sex:性别,1:男,2:女(必填)<br>" +
+                    "symptom:症状自然文本描述(必填)")
+    @PostMapping("/pushSymptom")
+    @SysLogger("pushSymptom")
+    public RespDTO<AIDTO> pushSymptom(@RequestBody @Valid AIVO aivo) {
+        return RespDTO.onSuc(aiFacade.push(aivo, "1"));
+    }
+
+    /**
+     * 症状推理症状接口
+     *
+     * @param aivo ai输入参数
+     * @return 疾病相关数据
+     */
+    @ApiOperation(value = "症状推理疾病接口[by:gaodm]",
+            notes = "age: 年龄(必填)<br>" +
+                    "sex:性别,1:男,2:女(必填)<br>" +
+                    "symptom:症状自然文本描述(必填)")
+    @PostMapping("/pushDis")
+    @SysLogger("pushDis")
+    public RespDTO<AIDTO> pushDis(@RequestBody @Valid AIVO aivo) {
+        return RespDTO.onSuc(aiFacade.push(aivo, "7"));
+    }
+
+}
+

+ 40 - 0
triage-service/src/main/java/com/diagbot/web/PartController.java

@@ -0,0 +1,40 @@
+package com.diagbot.web;
+
+
+import com.diagbot.dto.PartSymptomDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.PartFacade;
+import com.diagbot.vo.PartSymptomVO;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @Description: 分诊部位Controller
+ * @Author: ztg
+ * @Date: 2018/10/23 15:09
+ */
+@RestController
+@RequestMapping("/part")
+public class PartController {
+
+    @Autowired
+    PartFacade partFacade;
+
+
+    @ApiOperation(value = "根据已选部位返回对应的症状[by:zhoutg]",
+            notes = "partIds: 部位的id,数组<br>" +
+                    "sexType:性别,1:男,2:女<br>" +
+                    "age:年龄")
+    @PostMapping("/getSymptomByPartIds")
+    public RespDTO<List<PartSymptomDTO>> getSymptomByPartIds(@RequestBody PartSymptomVO partSymptomVO) {
+        return RespDTO.onSuc(partFacade.getSymptomByPartIds(partSymptomVO));
+    }
+
+}
+

+ 52 - 0
triage-service/src/main/java/com/diagbot/web/SymptomController.java

@@ -0,0 +1,52 @@
+package com.diagbot.web;
+
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.SymptomSearchDTO;
+import com.diagbot.entity.Symptom;
+import com.diagbot.facade.SymptomFacade;
+import com.diagbot.vo.SymptomSearchVO;
+import com.diagbot.vo.SymptomUsualVO;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * @Description: 分诊症状Controller
+ * @Author: ztg
+ * @Date: 2018/10/23 15:09
+ */
+@RestController
+@RequestMapping("/symptom")
+public class SymptomController {
+
+    @Autowired
+    SymptomFacade symptomFacade;
+
+
+    @ApiOperation(value = "获取常用症状[by:zhoutg]",
+            notes = "sexType:性别,1:男,2:女<br>" +
+                    "age:年龄")
+    @PostMapping("/getUsual")
+    public RespDTO<List<Symptom>> getUsual(@RequestBody @Valid SymptomUsualVO symptomUsualVO) {
+        return RespDTO.onSuc(symptomFacade.getUsualFac(symptomUsualVO));
+    }
+
+
+    @ApiOperation(value = "搜索症状[by:zhoutg]",
+            notes = "name: 输入内容<br>" +
+                    "sexType:性别,1:男,2:女<br>" +
+                    "age:年龄")
+    @PostMapping("/search")
+    public RespDTO<List<SymptomSearchDTO>> search(@RequestBody @Valid SymptomSearchVO symptomSearchVO) {
+        return RespDTO.onSuc(symptomFacade.searchFac(symptomSearchVO));
+    }
+
+}
+

+ 19 - 0
triage-service/src/main/resources/bootstrap.yml

@@ -0,0 +1,19 @@
+spring:
+  application:
+    name: triage-service
+  cloud:
+    config:
+      #uri: http://${myuri}:8769
+      fail-fast: true
+      discovery:
+        enabled: true
+        serviceId: config-server
+  profiles:
+    active: local
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://${myuri}:8761/eureka/
+
+myuri: localhost

+ 280 - 0
triage-service/src/main/resources/logback-spring.xml

@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 项目名称 -->
+    <property name="APPDIR" value="triage-service"/>
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <property name="LOG_PATH" value="../logs"/>
+
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%logger){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+    <!--包名输出缩进对齐-->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+    <!--  日志记录器,日期滚动记录
+            ERROR 级别
+     -->
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_error.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/${APPDIR}-error-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>30</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-error-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件记录error级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            WARN  级别
+     -->
+    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_warn.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/${APPDIR}-warn-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-warn-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            INFO  级别
+    -->
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_info.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/${APPDIR}-info-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-info-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            DEBUG  级别
+    -->
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_debug.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/debug/${APPDIR}-debug-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-debug-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- ConsoleAppender 控制台输出日志 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!--encoder 默认配置为PatternLayoutEncoder-->
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level -&#45;&#45; [%thread] %logger Line:%-3L - %msg%n</pattern>-->
+            <charset>utf-8</charset>
+        </encoder>
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+    </appender>
+
+
+    <!--&lt;!&ndash;输出到mysql数据库的appender配置     &ndash;&gt;-->
+    <!--<appender name="db" class="ch.qos.logback.classic.db.DBAppender">-->
+    <!--<connectionSource-->
+    <!--class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
+    <!--<driverClass>com.mysql.jdbc.Driver</driverClass>-->
+    <!--<url>jdbc:mysql://120.77.222.42:3306/logback_member?characterEncoding=utf8</url>-->
+    <!--<user>root</user>-->
+    <!--<password>a123456789</password>-->
+    <!--</connectionSource>-->
+    <!--</appender>-->
+
+    <!-- FrameworkServlet日志-->
+    <logger name="org.springframework" level="WARN"/>
+
+    <!-- mybatis日志打印-->
+    <logger name="org.apache.ibatis" level="DEBUG"/>
+    <logger name="java.sql" level="DEBUG"/>
+
+    <!--  项目 mapper 路径
+            console控制台显示sql语句:STDOUT.filter.level -> debug级别
+    -->
+    <logger name="com.diagbot.mapper" level="DEBUG"/>
+
+    <appender name="LOGSTASHDEV" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.236:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"triage-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <appender name="LOGSTASHTEST" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.241:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"triage-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <!-- 本地环境下的日志配置 -->
+    <springProfile name="local">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <!-- 生产环境将请stdout去掉 -->
+            <appender-ref ref="STDOUT"/>
+        </root>
+    </springProfile>
+
+    <!-- 开发环境下的日志配置 -->
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <!-- 生产环境将请stdout去掉 -->
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHDEV"/>
+        </root>
+    </springProfile>
+
+    <!-- 测试环境下的日志配置 -->
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <!-- 生产环境将请stdout去掉 -->
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHTEST"/>
+        </root>
+    </springProfile>
+
+    <!-- 生产环境下的日志配置 -->
+    <springProfile name="prod">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <appender-ref ref="LOGSTASH"/>
+        </root>
+    </springProfile>
+</configuration>

+ 53 - 0
triage-service/src/main/resources/mapper/PartMapper.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.PartMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.Part">
+        <id column="id" property="id"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="gmt_create" property="gmtCreate"/>
+        <result column="gmt_modified" property="gmtModified"/>
+        <result column="creator" property="creator"/>
+        <result column="modifier" property="modifier"/>
+        <result column="name" property="name"/>
+        <result column="parent_id" property="parentId"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="PartSymptomDTO" type="com.diagbot.dto.PartSymptomDTO">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="parent_id" property="parentId"/>
+    </resultMap>
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="PartDTO" type="com.diagbot.dto.PartDTO">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="parent_id" property="parentId"/>
+    </resultMap>
+
+    <select id="getByPartId" parameterType="java.util.Map" resultMap="PartSymptomDTO">
+        SELECT * FROM `triage_part` where is_deleted = 'N'
+        and id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+             #{id}
+        </foreach>
+    </select>
+
+
+    <select id="getByParentId" parameterType="java.util.Map" resultMap="PartDTO">
+        SELECT * FROM `triage_part` where is_deleted = 'N'
+        and parent_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        order by parent_id, order_no
+    </select>
+
+
+
+</mapper>

+ 73 - 0
triage-service/src/main/resources/mapper/SymptomMapper.xml

@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.SymptomMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.Symptom">
+        <id column="id" property="id"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="gmt_create" property="gmtCreate"/>
+        <result column="gmt_modified" property="gmtModified"/>
+        <result column="creator" property="creator"/>
+        <result column="modifier" property="modifier"/>
+        <result column="name" property="name"/>
+        <result column="sex_type" property="sexType"/>
+        <result column="age_begin" property="ageBegin"/>
+        <result column="age_end" property="ageEnd"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+
+
+    <select id="getByPartIds" parameterType="java.util.Map" resultType="com.diagbot.entity.SymptomWrapper">
+        SELECT a.*, b.part_id FROM `triage_symptom` a, triage_part_symptom b where a.is_deleted = 'N' and b.is_deleted = 'N'
+        and b.symptom_id = a.id
+        and b.part_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        and a.sex_type in (3, #{sexType})
+        <if test="age != null">
+            <![CDATA[ and a.age_begin <= #{age} ]]>
+            <![CDATA[ and a.age_end >= #{age} ]]>
+        </if>
+        order by b.part_id, b.order_no
+    </select>
+
+    <select id="getUsual"  parameterType="java.util.Map" resultMap="BaseResultMap">
+        SELECT a.*  FROM `triage_symptom` a, triage_symptom_usual b where a.is_deleted = 'N' and b.is_deleted = 'N'
+        and b.symptom_id = a.id
+        and a.sex_type in (3, #{sexType})
+        <if test="age != null">
+            <![CDATA[ and a.age_begin <= #{age} ]]>
+            <![CDATA[ and a.age_end >= #{age} ]]>
+        </if>
+        order by b.order_no
+    </select>
+
+
+    <select id="search" parameterType="java.util.Map" resultType="com.diagbot.dto.SymptomSearchDTO">
+        select c.*,b.show_type,if(show_type=1, '本体', '同义词') show_type_cn,a.name search_name
+        from triage_retrieval a, triage_retrieval_mapping b, triage_symptom c
+        where a.is_deleted = 'N' and b.is_deleted = 'N' and c.is_deleted = 'N'
+        and a.id = b.retrieval_id and b.item_id = c.id
+        and (a.`name` = #{name} or a.spell = #{name})
+        and c.sex_type in (3, #{sexType})
+        <if test="age != null">
+            <![CDATA[ and c.age_begin <= #{age} ]]>
+            <![CDATA[ and c.age_end >= #{age} ]]>
+        </if>
+
+        union
+
+        select c.*,b.show_type,if(show_type=1, '本体', '同义词') show_type_cn, a.name search_name from triage_retrieval a, triage_retrieval_mapping b, triage_symptom c
+        where a.is_deleted = 'N' and b.is_deleted = 'N' and c.is_deleted = 'N'
+        and a.id = b.retrieval_id and b.item_id = c.id
+        and (a.`name` like concat('%',#{name} , '%') or a.spell like concat('%',#{name} , '%'))
+        and c.sex_type in (3, #{sexType})
+        <if test="age != null">
+            <![CDATA[ and c.age_begin <= #{age} ]]>
+            <![CDATA[ and c.age_end >= #{age} ]]>
+        </if>
+    </select>
+</mapper>

+ 22 - 0
triage-service/src/main/resources/mapper/SysLogMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.SysLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.SysLog">
+        <id column="id" property="id"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="gmt_create" property="gmtCreate"/>
+        <result column="gmt_modified" property="gmtModified"/>
+        <result column="creator" property="creator"/>
+        <result column="modifier" property="modifier"/>
+        <result column="ip" property="ip"/>
+        <result column="sys_type" property="sysType"/>
+        <result column="method" property="method"/>
+        <result column="operation" property="operation"/>
+        <result column="params" property="params"/>
+        <result column="username" property="username"/>
+    </resultMap>
+
+</mapper>

+ 9 - 0
triage-service/src/main/resources/public.cert

@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxXZWH/WgxW9eTT6AmPRo
+GFY3T5V1+F1458dcQFw0EZejjHuGwEeHvxcgl4059Me2B1xXTs3FDXTWQ5z19EtP
+3ITYtnFTo2cxhwxiwqN8ZqFdpq5Uac0mzjlYKcyGp8x6t+Nc2cv3D3Ul2VIbGvbP
+sQOeKvt3WxWwdpQ+q3RXjRUFQGiygSD7yuXHIUpcOsm4ZWDlUkjfwX1q4pjiwFfA
+Mq5xgkzPwolUKnI0NFnom3Th3i4oFXzUg2s6cEj7jL7YU35c2/9kE7WQPbeYhoSi
+XH2OwWgBk/2Ki6+Q0Yq/eAsXSBjp1jqh337vvKBk5ocPG1Imi8uTLIgYQCMwzvg+
+VQIDAQAB
+-----END PUBLIC KEY-----

+ 83 - 0
triage-service/src/test/java/com/diagbot/CodeGeneration.java

@@ -0,0 +1,83 @@
+package com.diagbot;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
+import com.baomidou.mybatisplus.generator.config.GlobalConfig;
+import com.baomidou.mybatisplus.generator.config.PackageConfig;
+import com.baomidou.mybatisplus.generator.config.StrategyConfig;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+
+/**
+ * @Description: 代码生成器
+ * @author: gaodm
+ * @time: 2018/8/2 10:15
+ */
+public class CodeGeneration {
+
+    /**
+     *
+     * @Title: main
+     * @Description: 生成
+     * @param args
+     */
+    public static void main(String[] args) {
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        gc.setOutputDir("E://code//triageservice");
+        gc.setFileOverride(true);
+        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false
+        gc.setEnableCache(false);// XML 二级缓存
+        gc.setBaseResultMap(true);// XML ResultMap
+        gc.setBaseColumnList(false);// XML columList
+        gc.setAuthor("zhoutg");// 作者
+
+        // 自定义文件命名,注意 %s 会自动填充表实体属性!
+        gc.setControllerName("%sController");
+        gc.setServiceName("%sService");
+        gc.setServiceImplName("%sServiceImpl");
+        gc.setMapperName("%sMapper");
+        gc.setXmlName("%sMapper");
+        mpg.setGlobalConfig(gc);
+
+        // 数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setDbType(DbType.MYSQL);
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("lantone");
+        dsc.setUrl("jdbc:mysql://192.168.2.236:3306/sys-triage?useUnicode=true&characterEncoding=utf-8&useSSL=false");
+        mpg.setDataSource(dsc);
+
+        // 策略配置
+        StrategyConfig strategy = new StrategyConfig();
+//        strategy.setTablePrefix(new String[] { "sys_" });// 此处可以修改为您的表前缀
+        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
+        strategy.setInclude(new String[] { "triage_symptom" }); // 需要生成的表
+
+        strategy.setSuperServiceClass(null);
+        strategy.setSuperServiceImplClass(null);
+        strategy.setSuperMapperClass(null);
+
+        mpg.setStrategy(strategy);
+
+        // 包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.diagbot");
+        pc.setController("web");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+        pc.setMapper("mapper");
+        pc.setEntity("entity");
+        pc.setXml("resources.mapper");
+        mpg.setPackageInfo(pc);
+
+        // 执行生成
+        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
+        mpg.execute();
+
+    }
+}

+ 6 - 0
user-service/src/main/java/com/diagbot/client/DiagbotmanClient.java

@@ -21,5 +21,11 @@ public interface DiagbotmanClient {
 	
 	@PostMapping(value = "/productOrder/getInformationAvailableAll")
 	RespDTO<List<UserAndProdutDTO>> getInformationAvailableAll(@RequestBody List<Long> userIds);
+	
+	@PostMapping(value = "/productOrder/getUserWaitingRenewal")
+	public RespDTO<Integer> getUserWaitingRenewal(Long userId);
+	
+	@PostMapping(value = "/productOrder/getOrderByUserToAudit")
+	public RespDTO<Integer> getOrderByUserToAudit(Long userId);
 
 }

+ 12 - 0
user-service/src/main/java/com/diagbot/client/hystrix/DiagbotmanServiceHystrix.java

@@ -26,4 +26,16 @@ public class DiagbotmanServiceHystrix implements DiagbotmanClient {
 	        return null;
 	}
 
+	@Override
+	public RespDTO<Integer> getUserWaitingRenewal(Long userId) {
+		log.error("【hystrix】调用{}异常","getInformationAvailableAll");
+		return null;
+	}
+
+	@Override
+	public RespDTO<Integer> getOrderByUserToAudit(Long userId) {
+		log.error("【hystrix】调用{}异常","getInformationAvailableAll");
+		return null;
+	}
+
 }

+ 51 - 51
user-service/src/main/java/com/diagbot/enums/StatusEnum.java

@@ -1,51 +1,51 @@
-package com.diagbot.enums;
-
-import com.diagbot.core.KeyedNamed;
-
-import lombok.Setter;
-/**
- * 
- * @author wangfeng
- * @Description: TODO
- * @date 2018年10月29日 下午7:07:18
- */
-public enum StatusEnum implements KeyedNamed {
-    Disable(0, "禁用"),
-    Enable(1, "启用");
-
-    @Setter
-    private Integer key;
-
-    @Setter
-    private String name;
-
-    StatusEnum(Integer key, String name) {
-        this.key = key;
-        this.name = name;
-    }
-
-    public static StatusEnum getEnum(Integer key) {
-        for (StatusEnum item : StatusEnum.values()) {
-            if (item.key == key) {
-                return item;
-            }
-        }
-        return null;
-    }
-
-    public static String getName(Integer key) {
-        StatusEnum item = getEnum(key);
-        return item != null ? item.name : null;
-    }
-
-    @Override
-    public int getKey() {
-        return key;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-}
-
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+
+import lombok.Setter;
+/**
+ * 
+ * @author wangfeng
+ * @Description: TODO
+ * @date 2018年10月29日 下午7:07:18
+ */
+public enum StatusEnum implements KeyedNamed {
+    Disable(0, "禁用"),
+    Enable(1, "启用");
+
+    @Setter
+    private Integer key;
+
+    @Setter
+    private String name;
+
+    StatusEnum(Integer key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static StatusEnum getEnum(Integer key) {
+        for (StatusEnum item : StatusEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(Integer key) {
+        StatusEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}
+

+ 12 - 0
user-service/src/main/java/com/diagbot/facade/UserFacade.java

@@ -952,6 +952,18 @@ public class UserFacade extends UserServiceImpl {
         map.put("userId", baseIdVO.getId());
         map.put("modifier", UserUtils.getCurrentPrincipleID());
         map.put("gmtModified", DateUtil.now());
+        //客户中心-查询用户续费数量
+        RespDTO<Integer> renewalSums = diagbotmanClient.getUserWaitingRenewal(baseIdVO.getId());
+        int renewalSum = renewalSums.data;
+        if(renewalSum>0){
+   		 return RespDTO.onError("该用户续费申请单,请先审核");
+      	}
+        //查询用户是否有待审核的产品数量
+        RespDTO<Integer> auditSums = diagbotmanClient.getOrderByUserToAudit(baseIdVO.getId());
+        int auditSum = renewalSums.data;
+        if(auditSum>0){
+   		 return RespDTO.onError("该用户产品申请单,请先审核");
+    	}
         List<Long> userIds = new ArrayList<>();
         userIds.add(baseIdVO.getId());
         RespDTO<List<UserAndProdutDTO>> InformationData = diagbotmanClient.getInformationAvailableAll(userIds);