Browse Source

Merge branch 'master' into rpt

fengyanjie@sagacloud.cn 4 years ago
parent
commit
46d520edff
56 changed files with 1819 additions and 253 deletions
  1. 1 1
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/client/PhysicalWorldClient.java
  2. 1 1
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmItemService.java
  3. 4 0
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmRecordService.java
  4. 0 1
      dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/PhysicalWorldService.java
  5. 1 0
      dmp-model/src/main/java/com/persagy/dmp/rwd/model/RelationInstanceModel.java
  6. 75 0
      dmp-rwd-datautils/doc/config.sql
  7. 21 0
      dmp-rwd-datautils/pom.xml
  8. 8 2
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/TransApp.java
  9. 46 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/config/DmpMessageAspect.java
  10. 30 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/config/GraphMapping.java
  11. 18 2
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/controller/TransController.java
  12. 60 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/JmsConfig.java
  13. 14 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/MessageExecutor.java
  14. 76 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/MessageProcesser.java
  15. 35 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/executor/TransProjectDataExecutor.java
  16. 2 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjInfoService.java
  17. 1 1
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransRelationService.java
  18. 72 0
      dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransService.java
  19. 0 21
      dmp-rwd-datautils/src/main/resources/application.yml
  20. 7 0
      dmp-rwd-datautils/src/main/resources/bootstrap-dev.yml
  21. 9 0
      dmp-rwd-datautils/src/main/resources/bootstrap.yml
  22. 99 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForBR.java
  23. 107 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForGX.java
  24. 100 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForQH.java
  25. 14 3
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForWD.java
  26. 10 3
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForXG.java
  27. 13 5
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForZS.java
  28. 267 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportFuncid2.java
  29. 327 0
      dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportGroupProjectFuncid.java
  30. 1 1
      dmp-rwd-funcid-parser/src/main/java/com/persagy/dmp/rwd/funcid/parse/parser/ParserUtils.java
  31. 10 17
      dmp-rwd-funcid-parser/src/main/java/com/persagy/dmp/rwd/funcid/parse/parser/impl/AttachmentParser.java
  32. 23 0
      dmp-rwd-funcid-parser/src/main/java/com/persagy/dmp/rwd/funcid/parse/utils/ObjectNodeUtils.java
  33. 9 11
      dmp-rwd/doc/config.sql
  34. 1 6
      dmp-rwd/pom.xml
  35. 0 2
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/config/GlobalExceptionHandler.java
  36. 63 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/config/JpaSqlExecuteContext.java
  37. 6 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/config/WebConfig.java
  38. 3 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/entity/RelationInstance.java
  39. 6 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/BaseService.java
  40. 6 3
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ClassDefService.java
  41. 7 3
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/FuncidDefService.java
  42. 1 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/InitService.java
  43. 39 2
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ObjectInstanceCreateService.java
  44. 1 1
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ObjectInstanceQueryService.java
  45. 37 8
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ObjectInstanceUpdateService.java
  46. 22 2
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/RelationInstanceService.java
  47. 8 3
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/iot/CurrentIotService.java
  48. 12 2
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/iot/HistoryIotService.java
  49. 8 3
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/iot/SettingIotService.java
  50. 0 41
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/GroupProjectShardingAlgorithm.java
  51. 0 28
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/GroupShardingAlgorithm.java
  52. 86 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/JpaSqlStatementInspector.java
  53. 18 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/JsonDialect.java
  54. 19 0
      dmp-rwd/src/main/java/com/persagy/dmp/rwd/util/MeterUtils.java
  55. 8 80
      dmp-rwd/src/main/resources/application.yml
  56. 7 0
      dmp-rwd/src/main/resources/bootstrap-dev.yml

+ 1 - 1
dmp-alarm/src/main/java/com/persagy/dmp/alarm/client/PhysicalWorldClient.java

@@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestParam;
  * @since: 2020/10/20 5:04 下午
  * @version: V1.0
  **/
-@FeignClient(name = "dmp-rwd", fallback = PhysicalWorldFallBackFactory.class)
+@FeignClient(name = "dmp-rwd", fallbackFactory = PhysicalWorldFallBackFactory.class)
 public interface PhysicalWorldClient {
 
     @PostMapping("rwd/instance/object/query")

+ 1 - 1
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmItemService.java

@@ -178,7 +178,7 @@ public class AlarmItemService extends AlarmBaseService {
 
     public AlarmItemModel getAlarmItemByItemCode(String itemCode, String projectId, String groupCode, String appId) {
         JacksonCriteria criteria = JacksonCriteria.newInstance();
-        criteria.add("itemCode", itemCode);
+        criteria.add("code", itemCode);
         if (StringUtils.isNotEmpty(projectId)) {
             criteria.add("projectId", projectId);
         }

+ 4 - 0
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/AlarmRecordService.java

@@ -225,6 +225,10 @@ public class AlarmRecordService extends AlarmBaseService {
         if (param.getSupplement() != null) {
             alarmRecord.setSupplement(param.getSupplement());
         }
+        // 报警等级
+        if (!StringUtils.isEmpty(param.getLevel())) {
+            alarmRecord.setLevel(param.getLevel());
+        }
         alarmRecord.setUpdateUser(alarmParam.userId);
         alarmRecord.setUpdateTime(new Date());
         alarmRecordRepository.save(alarmRecord);

+ 0 - 1
dmp-alarm/src/main/java/com/persagy/dmp/alarm/service/PhysicalWorldService.java

@@ -24,7 +24,6 @@ import java.util.*;
 public class PhysicalWorldService {
     @Autowired
     private PhysicalWorldClient physicalWorldClient;
-//    private PhysicalWorldClient physicalWorldClient = null;
 
     public Set<String> queryObjectIdListByClassCode(
             @NotNull String projectId,

+ 1 - 0
dmp-model/src/main/java/com/persagy/dmp/rwd/model/RelationInstanceModel.java

@@ -14,6 +14,7 @@ public class RelationInstanceModel {
 	private String graphId;
 	private String graphCode;
 	private String relCode;
+	private String relValue;
 	private String objFrom;
 	private String objTo;
 	private Integer status;

+ 75 - 0
dmp-rwd-datautils/doc/config.sql

@@ -0,0 +1,75 @@
+# rwd config
+delete from `integrated_config` where application = 'dmp-rwd-datautils';
+INSERT INTO `integrated_config`
+(`APPLICATION`,`PPROFILE`,`LABLE`,`BELONGTO`,`ISUPDATE`,`PKEY`,`PVALUE`,`DESCRIPTION`)
+VALUES
+('dmp-rwd-datautils','default','master','DMP',1,'spring.jackson.time-zone', 'Asia/Shanghai', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.jpa.show-sql', 'false', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.jpa.hibernate.ddl-auto', 'none', null),
+('dmp-rwd-datautils','default','master','DMP',1,'management.endpoints.web.exposure.include', '*', null),
+('dmp-rwd-datautils','default','master','DMP',1,'management.endpoint.health.show-details', 'ALWAYS', null),
+('dmp-rwd-datautils','default','master','DMP',1,'eureka.client.fetch-registry','true',null),
+('dmp-rwd-datautils','default','master','DMP',1,'eureka.client.register-with-eureka','true',null),
+('dmp-rwd-datautils','default','master','DMP',1,'eureka.instance.lease-renewal-interval-in-seconds','10',null),
+('dmp-rwd-datautils','default','master','DMP',1,'eureka.instance.lease-expiration-duration-in-seconds','30',null),
+('dmp-rwd-datautils','default','master','DMP',1,'eureka.instance.hostname','${spring.application.name}',null),
+('dmp-rwd-datautils','default','master','DMP',1,'eureka.instance.prefer-ip-address','true',null),
+('dmp-rwd-datautils','default','master','DMP',1,'eureka.instance.instance-id','${spring.cloud.client.ip-address}:${server.port}',null),
+
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.type', 'com.alibaba.druid.pool.DruidDataSource', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.driverClassName', 'com.mysql.cj.jdbc.Driver', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.url', 'jdbc:mysql://${persagy.mysql.host}:${persagy.mysql.port}/${persagy.mysql.database}?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.username', '${persagy.mysql.username}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.password', '${persagy.mysql.password}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.max-active', '${persagy.mysql.maxActive}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.max-idle', '20', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.datasource.min-idle', '10', null),
+
+('dmp-rwd-datautils','default','master','DMP',1,'spring.rabbitmq.host', '${persagy.rabbitmq.host}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.rabbitmq.port', '${persagy.rabbitmq.port}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.rabbitmq.username', '${persagy.rabbitmq.username}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.rabbitmq.password', '${persagy.rabbitmq.password}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.rabbitmq.virtual-host', '${persagy.rabbitmq.virtual-host}', null),
+
+('dmp-rwd-datautils','default','master','DMP',1,'spring.redis.host', '${persagy.redis.host}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.redis.port', '${persagy.redis.port}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.redis.password', '${persagy.redis.password}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.redis.database', '${persagy.redis.database}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.redis.pool.max-active', '${persagy.redis.max-active}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.redis.pool.max-idle', '${persagy.redis.max-idle}', null),
+('dmp-rwd-datautils','default','master','DMP',1,'spring.redis.pool.min-idle', '${persagy.redis.min-idle}', null),
+
+('dmp-rwd-datautils','default','master','DMP',1,'persagy.dmp.exchange', 'exchange-dmp', null),
+('dmp-rwd-datautils','default','master','DMP',1,'persagy.dmp.datautils.routingKey', 'routing-dmp-rwd-datautils', null),
+
+('dmp-rwd-datautils','dev','master','DMP',1,'server.port', '9001', null),
+
+('dmp-rwd-datautils','dev','master','DMP',1,'eureka.client.service-url.defaultZone','http://frame:123456@localhost:9931/eureka/','注册中心地址'),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.iot.data.server', 'http://localhost:9981', 'IOT数据查询服务'),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.iot.setting.server', 'http://localhost:9983', 'IOT控制服务'),
+
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.mysql.host', '192.168.64.15', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.mysql.port', '9934', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.mysql.database', 'dmp_test_rwd', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.mysql.username', 'root', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.mysql.password', 'brzj123456', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.mysql.initialSize', '10', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.mysql.maxActive', '100', null),
+
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.redis.host', '192.168.64.15', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.redis.port', '9944', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.redis.password', 'brzj123456', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.redis.database', '0', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.redis.max-active', '100', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.redis.max-idle', '50', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.redis.min-idle', '10', null),
+
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.rabbitmq.host', '192.168.64.15', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.rabbitmq.port', '9936', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.rabbitmq.username', 'admin', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.rabbitmq.password', 'brzj123456', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.rabbitmq.virtual-host', '/test', null),
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.dmp.datautils.queue', 'queue-dmp-datautils', null),
+
+('dmp-rwd-datautils','dev','master','DMP',1,'persagy.log.path', '.', '日志文件所在路径');
+

+ 21 - 0
dmp-rwd-datautils/pom.xml

@@ -44,5 +44,26 @@
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <!-- 配置中心 -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-config</artifactId>
+        </dependency>
+        <!-- rabbitmq -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+
+        <!-- feign -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 8 - 2
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/TransApp.java

@@ -1,6 +1,7 @@
 package com.persagy.dmp.rwd.datautils;
 
 import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.common.SpringUtils;
 import com.persagy.dmp.common.http.HttpUtils;
 import com.persagy.dmp.rwd.funcid.parse.parser.InfoCodeParserFactory;
 import lombok.extern.slf4j.Slf4j;
@@ -38,12 +39,17 @@ public class TransApp {
 	}
 
 	@Bean
+	public InfoCodeParserFactory infoCodeParserFactory() {
+		return new InfoCodeParserFactory();
+	}
+
+	@Bean
 	public HttpUtils httpUtils() {
 		return new HttpUtils();
 	}
 
 	@Bean
-	public InfoCodeParserFactory infoCodeParserFactory(){
-		return new InfoCodeParserFactory();
+	public SpringUtils springUtils() {
+		return new SpringUtils();
 	}
 }

+ 46 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/config/DmpMessageAspect.java

@@ -0,0 +1,46 @@
+package com.persagy.dmp.rwd.datautils.config;
+
+import com.persagy.common.web.BaseResponse;
+import com.persagy.dmp.rwd.datautils.jms.MessageProcesser;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Aspect
+@Component
+public class DmpMessageAspect {
+
+	@Autowired
+	private MessageProcesser messageProcesser;
+
+	@Pointcut("execution(public * com.persagy.dmp.rwd.datautils.controller.*.*(..))")
+	public void controllerPoint() {
+	}
+
+	@AfterReturning(returning = "ret", pointcut = "controllerPoint()")
+	public void doAfterReturning(Object ret) {
+		if (ret != null) {
+			if (ret instanceof BaseResponse) {
+				BaseResponse resp = (BaseResponse) ret;
+				if (resp.success()) {
+					List<DmpMessage> messageList = resp.getMessageList();
+					if (messageList != null && messageList.size() > 0) {
+						for (DmpMessage message : messageList) {
+							messageProcesser.convertAndSend(message);
+						}
+					}
+				}
+			}
+		}
+	}
+}

+ 30 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/config/GraphMapping.java

@@ -122,6 +122,30 @@ public class GraphMapping {
 		mappings.add(new Item("PropertyInArch", "Pe2Fl", "Pe2Fl", "1", "1"));
 		mappings.add(new Item("SubE", "Sub2Sub", "EnergyItemTree", "1", "1"));
 		mappings.add(new Item("EnergyMonitorStructure", "Mt2Br", "EnergyMonitorStructure", "1", "1"));
+
+		mappings.add(new Item("MechInArch", "Eq2Sp", "PowerSupplyZone", "EquipinSpace", "100", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "LightingZone", "EquipinSpace", "200", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "NetworkZone", "EquipinSpace", "300", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "AirConditioningZone", "EquipinSpace", "400", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "HeatingZone", "EquipinSpace", "500", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "CleanZone", "EquipinSpace", "600", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "DomesticWaterSupplyZone", "EquipinSpace", "700", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "FireZone", "EquipinSpace", "800", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "SecurityZone", "EquipinSpace", "900", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "TenantZone", "EquipinSpace", "1000", "1"));
+		mappings.add(new Item("MechInArch", "Eq2Sp", "FunctionZone", "EquipinSpace", "1100", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "PowerSupplyZone", "EquipforSpace", "100", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "LightingZone", "EquipforSpace", "200", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "NetworkZone", "EquipforSpace", "300", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "AirConditioningZone", "EquipforSpace", "400", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "HeatingZone", "EquipforSpace", "500", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "CleanZone", "EquipforSpace", "600", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "DomesticWaterSupplyZone", "EquipforSpace", "700", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "FireZone", "EquipforSpace", "800", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "SecurityZone", "EquipforSpace", "900", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "TenantZone", "EquipforSpace", "1000", "1"));
+		mappings.add(new Item("MechForArch", "Eq2Sp", "FunctionZone", "EquipforSpace", "1100", "1"));
+
 	}
 
 	public static Item getMapping(String graph, String relCode) {
@@ -138,13 +162,19 @@ public class GraphMapping {
 	public static class Item {
 		private String newGraph;
 		private String newRelcode;
+		private String newRelValue;
 		private String oldGraph;
 		private String oldRelcode;
 		private Boolean same;
 
 		public Item(String newGraph, String newRelcode, String oldGraph, String oldRelcode, String same) {
+			this(newGraph, newRelcode, null, oldGraph, oldRelcode, same);
+		}
+
+		public Item(String newGraph, String newRelcode, String newRelValue, String oldGraph, String oldRelcode, String same) {
 			this.newGraph = newGraph;
 			this.newRelcode = newRelcode;
+			this.newRelValue = newRelValue;
 			this.oldGraph = oldGraph;
 			this.oldRelcode = oldRelcode;
 			this.same = "1".equalsIgnoreCase(same);

+ 18 - 2
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/controller/TransController.java

@@ -1,19 +1,35 @@
 package com.persagy.dmp.rwd.datautils.controller;
 
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.rwd.datautils.service.TransService;
+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.Map;
+
 /**
  * @author: yaoll
  * @date: 2020-10-14
  * @verison: 1.0
  */
 @RestController
-@RequestMapping("/trans")
+@RequestMapping("/datautils")
 public class TransController {
 
+	@Autowired
+	private TransService transService;
 
+	@PostMapping("/import/data")
+	public MapResponse importData(@RequestBody Map<String, String> params){
+		return transService.importData(params);
+	}
 
-
+	@PostMapping("/import/info")
+	public MapResponse importInfo(@RequestBody Map<String, String> params){
+		return transService.importInfo(params);
+	}
 
 }

+ 60 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/JmsConfig.java

@@ -0,0 +1,60 @@
+package com.persagy.dmp.rwd.datautils.jms;
+
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Binding;
+import org.springframework.amqp.core.BindingBuilder;
+import org.springframework.amqp.core.Queue;
+import org.springframework.amqp.core.TopicExchange;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Slf4j
+@Configuration
+public class JmsConfig {
+
+
+	@Value("${persagy.dmp.exchange}")
+	private String exchange;
+
+	@Value("${persagy.dmp.datautils.routingKey}")
+	private String datautilsRoutingKey;
+
+	@Value("${persagy.dmp.datautils.queue}")
+	private String datautilsQueue;
+
+	@Autowired
+	private MessageProcesser messageProcesser;
+
+	@Bean
+	public TopicExchange exchage() {
+		return new TopicExchange(exchange);
+	}
+
+	@Bean
+	public Queue queue() {
+		return new Queue(datautilsQueue, true);
+	}
+
+	// datautils -> datautils
+	@Bean
+	public Binding rwdBinding() {
+		return BindingBuilder.bind(queue()).to(exchage()).with(datautilsRoutingKey);
+	}
+
+	@RabbitListener(queues = "${persagy.dmp.datautils.queue}")    //监听器监听指定的Queue
+	public void processC(DmpMessage message) {
+		log.info("============================== Receive {}: {}", datautilsQueue, JacksonMapper.toSimpleJson(message));
+		messageProcesser.listen(message);
+	}
+
+}

+ 14 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/MessageExecutor.java

@@ -0,0 +1,14 @@
+package com.persagy.dmp.rwd.datautils.jms;
+
+import com.persagy.dmp.rwd.model.DmpMessage;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+public interface MessageExecutor {
+
+	void execute(DmpMessage message);
+
+}

+ 76 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/MessageProcesser.java

@@ -0,0 +1,76 @@
+package com.persagy.dmp.rwd.datautils.jms;
+
+import com.persagy.common.date.DateUtils;
+import com.persagy.dmp.common.SpringUtils;
+import com.persagy.dmp.config.DmpParameterStorage;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-22
+ * @verison: 1.0
+ */
+@Slf4j
+@Component
+public class MessageProcesser {
+
+	@Value("${persagy.dmp.exchange}")
+	private String exchange;
+
+	@Value("${persagy.dmp.datautils.routingKey}")
+	private String datautilsRoutingKey;
+
+	@Autowired
+	private RabbitTemplate rabbitTemplate;
+
+	public void convertAndSend(DmpMessage message) {
+		if (message.getSendTime() == null) {
+			message.setSendTime(DateUtils.format(new Date()));
+		}
+		rabbitTemplate.convertAndSend(exchange, datautilsRoutingKey, message);
+	}
+
+	private static final Set<String> beanNames = new HashSet<>();
+
+	static {
+		beanNames.add("transProjectData");
+	}
+
+	public void listen(DmpMessage message) {
+		String type = message.getType();
+		if (!beanNames.contains(type)) {
+			return;
+		}
+
+		String executorName = type + "Executor";
+		MessageExecutor executor = SpringUtils.getBean(executorName, MessageExecutor.class);
+		if (executor == null) {
+			log.error("bean for [" + executorName + "] not exists");
+		}
+
+		try {
+			DmpParameterStorage.ParameterData data = new DmpParameterStorage.ParameterData();
+			data.setGroupCode(message.getGroupCode());
+			data.setProjectId(message.getProjectId());
+			data.setAppId(message.getAppId());
+
+			DmpParameterStorage.set(data);
+
+			executor.execute(message);
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			DmpParameterStorage.clear();
+		}
+	}
+
+}

+ 35 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/jms/executor/TransProjectDataExecutor.java

@@ -0,0 +1,35 @@
+package com.persagy.dmp.rwd.datautils.jms.executor;
+
+import com.persagy.dmp.rwd.datautils.jms.MessageExecutor;
+import com.persagy.dmp.rwd.datautils.service.TransService;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ *
+ * 迁移数据平台项目数据到数据中台
+ *
+ * @author: yaoll
+ * @date: 2020-12-18
+ * @verison: 1.0
+ */
+@Component
+public class TransProjectDataExecutor implements MessageExecutor {
+
+	@Autowired
+	private TransService transService;
+
+	@Override
+	public void execute(DmpMessage message) {
+
+		String groupCode = message.getGroupCode();
+		String projectId = message.getProjectId();
+		String server = message.getStr1();
+		String password = message.getStr2();
+
+
+		transService.trans(groupCode, projectId, server, password);
+
+	}
+}

+ 2 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransObjInfoService.java

@@ -217,7 +217,9 @@ public class TransObjInfoService {
 	private void initObjectClassCodeCache(TransContext ctx, Map<String, String> objectClassCodeCache) {
 		JacksonCriteria criteria = JacksonCriteria.newInstance();
 		criteria.add("projectId", ctx.getProjectId());
+//		criteria.add("id", "Eq44030700030f77c5713ecd492382f25959fdcce7bd"); // TODO for test
 		criteria.addWithColumn("classCode");
+
 		String url = rwdServer + "/rwd/instance/object/query?projectId=" + ctx.getProjectId() + "&groupCode=" + ctx.getGroupCode();
 		HttpUtils.HttpResult result = httpUtils.post(url, JacksonMapper.toSimpleJson(criteria), 1500000);
 		if (result.success()) {

+ 1 - 1
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransRelationService.java

@@ -118,7 +118,7 @@ public class TransRelationService {
 		reader.close();
 
 		if (objectArray.size() > 0) {
-			String url = rwdServer + "/rwd/instance/relation/create?projectId=" + ctx.getProjectId();
+			String url = rwdServer + "/rwd/instance/relation/create?groupCode=" + ctx.getGroupCode() + "&projectId=" + ctx.getProjectId();
 			HttpUtils.HttpResult response = httpUtils.post(url, JacksonMapper.toSimpleJson(data), 3600000);
 			System.out.println(response.getContent());
 		}

+ 72 - 0
dmp-rwd-datautils/src/main/java/com/persagy/dmp/rwd/datautils/service/TransService.java

@@ -0,0 +1,72 @@
+package com.persagy.dmp.rwd.datautils.service;
+
+import com.persagy.common.web.MapResponse;
+import com.persagy.dmp.rwd.model.DmpMessage;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-18
+ * @verison: 1.0
+ */
+@Service
+public class TransService {
+
+	@Autowired
+	private StringRedisTemplate redisTemplate;
+
+	private static final String KEN_TRANS_DOING = "datautils_trans_doing_";
+	private static final String KEN_TRANS_INFO = "datautils_trans_info_";
+
+	public MapResponse importData(Map<String, String> params) {
+		MapResponse resp = new MapResponse();
+		String groupCode = MapUtils.getString(params, "groupCode");
+		String projectId = MapUtils.getString(params, "projectId");
+		String server = MapUtils.getString(params, "server");
+		String password = MapUtils.getString(params, "password");
+
+		String key = KEN_TRANS_DOING + projectId;
+		Long increment = redisTemplate.opsForValue().increment(key, 1);
+		if (increment > 1) {
+			resp.setFail("当前项目正在处理中...");
+			return resp;
+		}
+		redisTemplate.expire(key, 3, TimeUnit.HOURS);
+
+		DmpMessage message = new DmpMessage("transProjectData", projectId);
+		message.setGroupCode(groupCode);
+		message.setProjectId(projectId);
+		message.setStr1(server);
+		message.setStr2(password);
+		resp.add(message);
+		return resp;
+	}
+
+	public MapResponse importInfo(Map<String, String> params) {
+		MapResponse resp = new MapResponse();
+
+		return resp;
+	}
+
+	/**
+	 * 从数据平台迁移数据到中台
+	 *
+	 * @param groupCode
+	 * @param projectId
+	 * @param server
+	 * @param password
+	 */
+	public void trans(String groupCode, String projectId, String server, String password) {
+
+		String doingKey = KEN_TRANS_DOING + projectId;
+
+
+		redisTemplate.delete(doingKey);
+	}
+}

+ 0 - 21
dmp-rwd-datautils/src/main/resources/application.yml

@@ -1,21 +0,0 @@
-server:
-  port: 9001
-spring:
-  application:
-    name: dmp-datautils
-  profiles:
-    active:
-      - dev
-#  datasource:
-#    driver-class-name: com.mysql.cj.jdbc.Driver
-#    url: jdbc:mysql://localhost:3306/persagy_dev?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false
-#    username: root
-#    password: 123456
-##    url: jdbc:mysql://192.168.3.200:3306/persagy_dmp_test?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false
-##    username: pbsage
-##    password: Mysql!123
-#    type: com.alibaba.druid.pool.DruidDataSource
-#  jpa:
-#    show-sql: false
-#    hibernate:
-#      ddl-auto: none

+ 7 - 0
dmp-rwd-datautils/src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,7 @@
+spring:
+  application:
+    name: dmp-rwd-datautils
+  cloud:
+    config:
+      profile: dev2
+      uri: http://192.168.64.18:9932

+ 9 - 0
dmp-rwd-datautils/src/main/resources/bootstrap.yml

@@ -0,0 +1,9 @@
+spring:
+  application:
+    name: dmp-rwd-datautils
+  profiles:
+    active: dev,log-dev
+  cloud:
+    config:
+      profile: dev2
+      uri: http://192.168.64.18:9932

+ 99 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForBR.java

@@ -0,0 +1,99 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.datautils.service.TransObjInfoService;
+import com.persagy.dmp.rwd.datautils.service.TransObjService;
+import com.persagy.dmp.rwd.datautils.service.TransObjectValidService;
+import com.persagy.dmp.rwd.datautils.service.TransRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class TestTransServiceForBR {
+
+	@Autowired
+	private TransObjInfoService transObjInfoService;
+
+	@Autowired
+	private TransObjService transObjervice;
+
+	@Autowired
+	private TransRelationService transRelationService;
+
+	@Autowired
+	private TransObjectValidService transObjectValidService;
+
+	private String groupCode = "BR";
+	private String projectId = "Pj1101080259";
+	private String basePath = "/Users/devsaga/trans/1101080259-20201213";
+
+	@Test
+	public void transObjects() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjervice.trans(ctx);
+	}
+
+	@Test
+	public void transObjInfos() throws Exception {
+
+		String fileName = "obj_infos.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transObjInfoService.trans(ctx);
+	}
+
+
+	/**
+	 * 导入前要清除掉关系数据
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transRelation() throws Exception {
+
+		String fileName = "rel_btw_objs.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transRelationService.trans(ctx);
+	}
+
+	/**
+	 * 清理失效对象
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transObjectValid() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjectValidService.trans(ctx);
+	}
+
+
+}

+ 107 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForGX.java

@@ -0,0 +1,107 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.datautils.service.TransObjInfoService;
+import com.persagy.dmp.rwd.datautils.service.TransObjService;
+import com.persagy.dmp.rwd.datautils.service.TransObjectValidService;
+import com.persagy.dmp.rwd.datautils.service.TransRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class TestTransServiceForGX {
+
+	@Autowired
+	private TransObjInfoService transObjInfoService;
+
+	@Autowired
+	private TransObjService transObjervice;
+
+	@Autowired
+	private TransRelationService transRelationService;
+
+	@Autowired
+	private TransObjectValidService transObjectValidService;
+
+	private String groupCode = "GX";
+	private String projectId = "Pj3702020002";
+	private String basePath = "/Users/devsaga/trans/3702020002-20201220";
+
+	@Test
+	public void all() throws Exception {
+		transObjects();
+		transObjInfos();
+		transRelation();
+		transObjectValid();
+	}
+
+	@Test
+	public void transObjects() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjervice.trans(ctx);
+	}
+
+	@Test
+	public void transObjInfos() throws Exception {
+
+		String fileName = "obj_infos.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transObjInfoService.trans(ctx);
+	}
+
+
+	/**
+	 * 导入前要清除掉关系数据
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transRelation() throws Exception {
+
+		String fileName = "rel_btw_objs.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transRelationService.trans(ctx);
+	}
+
+	/**
+	 * 清理失效对象
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transObjectValid() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjectValidService.trans(ctx);
+	}
+
+
+}

+ 100 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForQH.java

@@ -0,0 +1,100 @@
+package com.persagy.dmp.rwd.datautils;
+
+import com.persagy.dmp.rwd.datautils.model.TransContext;
+import com.persagy.dmp.rwd.datautils.service.TransObjInfoService;
+import com.persagy.dmp.rwd.datautils.service.TransObjService;
+import com.persagy.dmp.rwd.datautils.service.TransObjectValidService;
+import com.persagy.dmp.rwd.datautils.service.TransRelationService;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author: yaoll
+ * @date: 2020-10-14
+ * @verison: 1.0
+ */
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class TestTransServiceForQH {
+
+	@Autowired
+	private TransObjInfoService transObjInfoService;
+
+	@Autowired
+	private TransObjService transObjervice;
+
+	@Autowired
+	private TransRelationService transRelationService;
+
+	@Autowired
+	private TransObjectValidService transObjectValidService;
+
+	private String groupCode = "QH";
+	private String projectId = "Pj1101080252";
+	private String basePath = "/Users/devsaga/trans/清华双清-2020-12-11";
+
+	@Test
+	public void transObjects() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjervice.trans(ctx);
+	}
+
+	@Test
+	public void transObjInfos() throws Exception {
+
+		String fileName = "obj_infos.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		transObjInfoService.trans(ctx);
+	}
+
+
+	/**
+	 * 导入前要清除掉关系数据
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transRelation() throws Exception {
+
+		String fileName = "rel_btw_objs.json";
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile(fileName);
+		// 先导出为sql
+		transRelationService.trans(ctx);
+	}
+
+	/**
+	 * 清理失效对象
+	 *
+	 * @throws Exception
+	 */
+	@Test
+	public void transObjectValid() throws Exception {
+
+		TransContext ctx = new TransContext();
+		ctx.setGroupCode(groupCode);
+		ctx.setProjectId(projectId);
+		ctx.setBasePath(basePath);
+		ctx.setDataFile("objects.json");
+		transObjectValidService.trans(ctx);
+	}
+
+
+}

+ 14 - 3
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForWD.java

@@ -36,7 +36,17 @@ public class TestTransServiceForWD {
 
 	private String groupCode = "WD";
 	private String projectId = "Pj4403070003";
-	private String basePath = "/Users/devsaga/persagy/4403070003-1128龙岗万达";
+//	private String basePath = "/Users/devsaga/persagy/4403070003-1128龙岗万达";
+	private String basePath = "/Users/devsaga/trans/4403070003-20201220";
+
+
+	@Test
+	public void all() throws Exception {
+		transObjects();
+		transObjInfos();
+		transRelation();
+		transObjectValid();
+	}
 
 	@Test
 	public void transObjects() throws Exception {
@@ -52,8 +62,9 @@ public class TestTransServiceForWD {
 	@Test
 	public void transObjInfos() throws Exception {
 
-//		String fileName = "obj_infos.json";
-		String fileName = "obj_infos-change.json";
+		String fileName = "obj_infos.json";
+//		String fileName = "obj_infos3.json";
+//		String fileName = "obj_infos-change.json";
 		TransContext ctx = new TransContext();
 		ctx.setGroupCode(groupCode);
 		ctx.setProjectId(projectId);

+ 10 - 3
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForXG.java

@@ -36,7 +36,15 @@ public class TestTransServiceForXG {
 
 	private String groupCode = "XG";
 	private String projectId = "Pj5001120003";
-	private String basePath = "/Users/devsaga/persagy/5001120003";
+	private String basePath = "/Users/devsaga/trans/5001120003-20201221";
+
+	@Test
+	public void all() throws Exception {
+		transObjects();
+		transObjInfos();
+		transRelation();
+		transObjectValid();
+	}
 
 	@Test
 	public void transObjects() throws Exception {
@@ -76,8 +84,7 @@ public class TestTransServiceForXG {
 		ctx.setProjectId(projectId);
 		ctx.setBasePath(basePath);
 		ctx.setDataFile(fileName);
-		// 先导出为sql
-		transRelationService.transToSql(ctx);
+		transRelationService.trans(ctx);
 	}
 
 	/**

+ 13 - 5
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/datautils/TestTransServiceForZS.java

@@ -36,7 +36,17 @@ public class TestTransServiceForZS {
 
 	private String groupCode = "ZS";
 	private String projectId = "Pj4403050019";
-	private String basePath = "/Users/devsaga/persagy/4403050019-2020-11-30";
+	private String basePath = "/Users/devsaga/trans/4403050019-20201221";
+
+
+	@Test
+	public void all() throws Exception{
+
+		transObjects();
+		transObjInfos();
+		transRelation();
+		transObjectValid();
+	}
 
 	@Test
 	public void transObjects() throws Exception {
@@ -52,8 +62,7 @@ public class TestTransServiceForZS {
 	@Test
 	public void transObjInfos() throws Exception {
 
-//		String fileName = "obj_infos.json";
-		String fileName = "obj_infos-error1.json";
+		String fileName = "obj_infos.json";
 		TransContext ctx = new TransContext();
 		ctx.setGroupCode(groupCode);
 		ctx.setProjectId(projectId);
@@ -77,8 +86,7 @@ public class TestTransServiceForZS {
 		ctx.setProjectId(projectId);
 		ctx.setBasePath(basePath);
 		ctx.setDataFile(fileName);
-		// 先导出为sql
-		transRelationService.transToSql(ctx);
+		transRelationService.trans(ctx);
 	}
 
 	/**

+ 267 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportFuncid2.java

@@ -0,0 +1,267 @@
+package com.persagy.dmp.rwd.dic;
+
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.enums.FuncidDataType;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Test;
+
+import java.io.*;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+@Slf4j
+public class ImportFuncid2 {
+
+	private String basepath = "/Users/devsaga/trans";
+
+	private String outPath = "/Users/devsaga/trans/funcid-" + DateUtils.format(new Date()) + ".dml.sql";
+
+	@Test
+	public void importFuncidDef() throws IOException {
+		List<FuncidDefModel> funcids = new LinkedList<>();
+		importEquipment(funcids);
+
+		FileOutputStream fos = new FileOutputStream(outPath);
+		PrintWriter writer = new PrintWriter(new BufferedOutputStream(fos));
+		writer.println("commit;");
+		funcids.forEach(item -> {
+//			System.out.println(JacksonMapper.toSimpleJson(item));
+			writer.println(toSql(item));
+		});
+		writer.println("commit;");
+		writer.flush();
+		writer.close();
+	}
+
+	private String toSql(FuncidDefModel model) {
+		StringBuilder buff = new StringBuilder("");
+		buff.append("insert into rwd_def_funcid ");
+		buff.append("(id,code,orig_code,name,alias_code,alias_name,class_code,type,group_code,project_id,category,");
+		buff.append("first_tag,second_tag,priority,input_mode,unit,data_type,orig_data_type,is_multiple,is_region,formater,data_source,orig_data_source,note,sub_flag,weak_point) ");
+		buff.append("values (");
+		buff.append("'").append(UUID.randomUUID().toString().replace("-", "")).append("',"); // id
+		buff.append("'").append(model.getCode()).append("',"); // code
+		buff.append("'").append(model.getOrigCode()).append("',"); // orig_code
+		buff.append("'").append(model.getName()).append("',"); // name
+		buff.append("'").append(model.getAliasCode()).append("',"); // alias_code
+		buff.append("'").append(model.getAliasName()).append("',"); // alias_name
+		buff.append("'").append(model.getClassCode()).append("',"); // class_code
+		buff.append("'").append(model.getType()).append("',"); // type
+		buff.append("'").append(model.getGroupCode()).append("',"); // group_code
+		buff.append("'").append(model.getProjectId()).append("',"); // project_id
+		buff.append("'").append(model.getCategory().name()).append("',"); // category
+		if (model.getFirstTag() != null) {
+			buff.append("'").append(model.getFirstTag()).append("',"); // first_tag
+		} else {
+			buff.append("null,");
+		}
+		if (model.getSecondTag() != null) {
+			buff.append("'").append(model.getSecondTag()).append("',"); // second_tag
+		} else {
+			buff.append("null,");
+		}
+		if (model.getPriority() != null) {
+			buff.append("'").append(model.getPriority()).append("',"); // priority
+		} else {
+			buff.append("null,");
+		}
+		if (model.getInputMode() != null) {
+			buff.append("'").append(model.getInputMode()).append("',"); // input_mode
+		} else {
+			buff.append("null,");
+		}
+		if (model.getUnit() != null) {
+			buff.append("'").append(model.getUnit()).append("',"); // unit
+		} else {
+			buff.append("null,");
+		}
+
+		buff.append("'").append(model.getDataType().name()).append("',"); // data_type
+		buff.append("'").append(model.getOrigDataType()).append("',"); // orig_data_type
+		buff.append(model.getIsMultiple() ? 1 : 0).append(","); // is_multiple
+		buff.append(model.getIsRegion() ? 1 : 0).append(","); // is_region
+		if (model.getFormater() != null) {
+			buff.append("'").append(model.getFormater()).append("',"); // formater
+		} else {
+			buff.append("null,");
+		}
+		if (model.getDataSource() != null) {
+			buff.append("'").append(model.getDataSource().toString()).append("',"); // data_source
+		} else {
+			buff.append("null,");
+		}
+		if (model.getOrigDataSource() != null) { // orig_data_source
+			buff.append("'").append(model.getOrigDataSource()).append("',"); // data_source
+		} else {
+			buff.append("null,");
+		}
+		if (model.getNote() != null) {
+			buff.append("'").append(model.getNote()).append("',"); // note}
+		} else {
+			buff.append("null,");
+		}
+		buff.append(model.getSubFlag() ? 1 : 0).append(","); // sub_flag
+		buff.append(model.getWeakPoint() ? 1 : 0).append(","); // weak_point
+		buff.deleteCharAt(buff.length() - 1);
+		buff.append(");");
+		return buff.toString();
+	}
+
+	private FuncidDefModel toFuncidDefModel(CacheModel model) {
+		FuncidDefModel funcid = new FuncidDefModel();
+		funcid.setGroupCode("0");
+		funcid.setProjectId("0");
+		funcid.setType("common");
+		funcid.setClassCode(model.classCode);
+		funcid.setFirstTag(model.firstTag != null ? model.firstTag.replace("\n", "") : null);
+		funcid.setSecondTag(model.secondTag != null ? model.secondTag.replace("\n", "") : null);
+		funcid.setCode(model.origCode.substring(0, 1).toLowerCase() + model.origCode.substring(1));
+		funcid.setOrigCode(model.origCode);
+		funcid.setAliasCode(model.origCode);
+		if (model.name != null) {
+			funcid.setName(model.name.replace("\n", ""));
+			funcid.setAliasName(model.name.replace("\n", ""));
+		} else {
+			log.error("funcid name is null : {}", JacksonMapper.toSimpleJson(funcid));
+		}
+		funcid.setUnit(model.unit);
+		funcid.setPriority(model.priority);
+		funcid.setInputMode(model.inputMode);
+		funcid.setOrigDataType(model.origDataType);
+		funcid.setSubFlag(false);
+		funcid.setWeakPoint(false);
+		FuncidDefModel dataType = DataTypeMapping.getDataType(model.origDataType);
+		if (dataType != null) {
+			funcid.setCategory(dataType.getCategory());
+			funcid.setDataType(dataType.getDataType());
+			funcid.setIsMultiple(dataType.getIsMultiple());
+			funcid.setIsRegion(dataType.getIsRegion());
+		} else {
+			return null;
+		}
+		funcid.setSubFlag(false);
+		if (model.remark != null) {
+			funcid.setNote(model.remark.replace("\n", ""));
+		}
+
+		if (model.origDataSource != null) {
+			funcid.setOrigDataSource(model.origDataSource.replace("\n", "nn")); // 去掉换行符
+		}
+		if (funcid.getDataType() == FuncidDataType.ENUM || funcid.getDataType() == FuncidDataType.MENUM || funcid.getDataType() == FuncidDataType.BOOLEAN) {
+			funcid.setDataSource(FuncidUtils.transEnumDataSource(model.origDataSource)); // 解析datasource
+		}
+		return funcid;
+	}
+
+
+
+	private void importEquipment(List<FuncidDefModel> funcids) throws IOException {
+
+		funcids.addAll(readSheet("SELTLT", "/17-照明系统设备.xlsx", "LTLT照明灯具"));
+
+		funcids.addAll(readSheet("SELTCC", "/17-照明系统设备.xlsx", "LTCC照明回路"));
+		funcids.addAll(readSheet("SELTLG", "/17-照明系统设备.xlsx", "LTLG照明灯组"));
+
+		funcids.addAll(readSheet("SELTCU", "/17-照明系统设备.xlsx", "LTCU照明控制箱"));
+		funcids.addAll(readSheet("SELTCP", "/17-照明系统设备.xlsx", "LTCP照明控制面板"));
+
+
+	}
+
+
+
+	@Data
+	private static class CacheModel {
+		private String classCode;
+		private String firstTag;
+		private String secondTag;
+		private String origCode;
+		private String name;
+		private String unit;
+		private String origDataType;
+		private String priority; // 优先级
+		private String inputMode;
+		private String origDataSource; // 字典选择
+		private String remark; // 备注
+	}
+
+	private List<FuncidDefModel> readSheet(String classCode, String fileName, String sheetName) throws IOException {
+		List<FuncidDefModel> data = new LinkedList<>();
+		String classFile = basepath + fileName;
+		FileInputStream inputStream = new FileInputStream(classFile);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetName);
+		if (sheet == null) {
+			return data;
+		}
+
+		// 行号从0开始, 从第2行开始读数据
+		int startRowNum = 2;
+		int lastRowNum = sheet.getLastRowNum();
+		CacheModel cache = new CacheModel();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				log.info("file: {}, sheet: {}, row[{}] is null", fileName, sheetName, rowIndex);
+				continue;
+			}
+			// 0:firstTag, 1:secondTag, 2:name, 3:origCode, 4:unit, 5:origDataType, 6:priorite, 7:imputMode, 8:origDataSource, 9:remark
+			CacheModel target = new CacheModel();
+			target.classCode = classCode;
+			target.firstTag = (String) ExcelUtils.parseCell(row.getCell(0), "string");
+			target.secondTag = (String) ExcelUtils.parseCell(row.getCell(1), "string");
+			target.name = (String) ExcelUtils.parseCell(row.getCell(2), "string");
+			target.origCode = (String) ExcelUtils.parseCell(row.getCell(3), "string");
+			target.unit = (String) ExcelUtils.parseCell(row.getCell(4), "string");
+			target.origDataType = (String) ExcelUtils.parseCell(row.getCell(5), "string");
+			target.priority = (String) ExcelUtils.parseCell(row.getCell(6), "string");
+			target.inputMode = (String) ExcelUtils.parseCell(row.getCell(7), "string");
+			target.origDataSource = (String) ExcelUtils.parseCell(row.getCell(8), "string");
+			target.remark = (String) ExcelUtils.parseCell(row.getCell(9), "string");
+
+			if (target.origCode == null || "".equals(target.origCode) || "`".equals(target.origCode)) {
+				continue;
+			}
+			if (FuncidUtils.isBase(target.origCode)) {
+				continue;
+			}
+
+			// firstTag不为空
+			if (target.firstTag != null) {
+				cache.firstTag = target.firstTag;
+				cache.secondTag = null;
+			} else {
+				target.firstTag = cache.firstTag;
+			}
+
+			// secondTag
+			if (target.secondTag != null) {
+				cache.secondTag = target.secondTag;
+			} else {
+				target.secondTag = cache.secondTag;
+			}
+			FuncidDefModel funcidDefModel = toFuncidDefModel(target);
+			if (funcidDefModel == null) {
+				log.info("file: {}, sheet: {}, row: {} data type [{}] error", fileName, sheetName, rowIndex, target.origDataType);
+			} else {
+				data.add(funcidDefModel);
+			}
+		}
+		return data;
+	}
+
+}
+

+ 327 - 0
dmp-rwd-datautils/src/test/java/com/persagy/dmp/rwd/dic/ImportGroupProjectFuncid.java

@@ -0,0 +1,327 @@
+package com.persagy.dmp.rwd.dic;
+
+import com.persagy.common.date.DateUtils;
+import com.persagy.common.json.JacksonMapper;
+import com.persagy.dmp.rwd.enums.FuncidDataType;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.Test;
+
+import java.io.*;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author: yaoll
+ * @date: 2020-11-30
+ * @verison: 1.0
+ */
+@Slf4j
+public class ImportGroupProjectFuncid {
+
+	private String basepath = "/Users/devsaga/trans";
+
+	private String outPath = "/Users/devsaga/persagy/数据字典20201118/funcid-" + DateUtils.format(new Date()) + ".dml.sql";
+
+	@Test
+	public void test1() throws Exception{
+		String fileName = "/近期新增需求WD.xlsx";
+		String sheetName = "Sheet1";
+
+		String type = "group";
+		String groupCode = "WD";
+		String projectId = "0";
+
+		List<FuncidDefModel> funcids = new LinkedList<>();
+		String classFile = basepath + fileName;
+		FileInputStream inputStream = new FileInputStream(classFile);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetName);
+
+		int startRowNum = 1;
+		int lastRowNum = sheet.getLastRowNum();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				log.info("file: {}, sheet: {}, row[{}] is null", fileName, sheetName, rowIndex);
+				continue;
+			}
+			// 0:firstTag, 1:secondTag, 2:name, 3:origCode, 4:unit, 5:origDataType, 6:priorite, 7:imputMode, 8:origDataSource, 9:remark
+			// 0系统	1专业 2对象编码 3对象类型 4一级分级标签 5二级分级标签 6属性点 7属性点编码 8单位 9类型 10优先级 11字典选择 12备注
+			FuncidDefModel model = new FuncidDefModel();
+			model.setType(type);
+			model.setGroupCode(groupCode);
+			model.setProjectId(projectId);
+
+			String major = (String) ExcelUtils.parseCell(row.getCell(1), "string");
+			String classCode = (String) ExcelUtils.parseCell(row.getCell(2), "string");
+			model.setClassCode((major == null ? "" : major ) + classCode);
+
+			model.setFirstTag((String) ExcelUtils.parseCell(row.getCell(4), "string"));
+			model.setSecondTag((String) ExcelUtils.parseCell(row.getCell(5), "string"));
+
+			String name = (String) ExcelUtils.parseCell(row.getCell(6), "string");
+			String code = (String) ExcelUtils.parseCell(row.getCell(7), "string");
+			if (code == null) {
+				continue;
+			}
+			name = name.replace("\n", "");
+			model.setCode(code.substring(0, 1).toLowerCase() + code.substring(1));
+			model.setName(name);
+			model.setAliasCode(code);
+			model.setAliasName(name);
+			model.setOrigCode(code);
+
+			model.setUnit((String) ExcelUtils.parseCell(row.getCell(8), "string"));
+
+			String origDataType = (String) ExcelUtils.parseCell(row.getCell(9), "string");
+			model.setOrigDataType(origDataType);
+			FuncidDefModel param = DataTypeMapping.getDataType(origDataType);
+			if (param == null) {
+
+				System.out.println(JacksonMapper.toSimpleJson(model));
+				continue;
+			}
+
+			model.setOrigDataType(origDataType);
+			model.setCategory(param.getCategory());
+			model.setDataType(param.getDataType());
+			model.setIsMultiple(param.getIsMultiple());
+			model.setIsRegion(param.getIsRegion());
+			model.setPriority((String) ExcelUtils.parseCell(row.getCell(10), "string"));
+
+			String origDataSource = (String) ExcelUtils.parseCell(row.getCell(11), "string");
+			if (origDataSource != null) {
+				origDataSource = origDataSource.replace("\n", "");
+			}
+			model.setOrigDataSource(origDataSource);
+			if (model.getDataType() == FuncidDataType.ENUM || model.getDataType() == FuncidDataType.MENUM || model.getDataType() == FuncidDataType.BOOLEAN) {
+				model.setDataSource(FuncidUtils.transEnumDataSource(origDataSource)); // 解析datasource
+			}
+
+			String note = (String) ExcelUtils.parseCell(row.getCell(12), "string");
+			model.setNote("任晓欣-20201211添加:" + (note == null ? "" : note.replace("\n", "")));
+			model.setSubFlag(false);
+			model.setWeakPoint(false);
+			funcids.add(model);
+		}
+
+		for (FuncidDefModel funcid : funcids) {
+			String str = toSql(funcid, type, groupCode, projectId);
+			System.out.println(str);
+		}
+
+	}
+
+	private String toSql(FuncidDefModel model, String type, String groupCode, String projectId) {
+		StringBuilder buff = new StringBuilder("");
+		buff.append("insert into rwd_def_funcid ");
+		buff.append("(id,code,orig_code,name,alias_code,alias_name,class_code,type,group_code,project_id,category,");
+		buff.append("first_tag,second_tag,priority,input_mode,unit,data_type,orig_data_type,is_multiple,is_region,formater,data_source,orig_data_source,note,sub_flag,weak_point) ");
+		buff.append("values (");
+		buff.append("'").append(UUID.randomUUID().toString().replace("-", "")).append("',"); // id
+		buff.append("'").append(model.getCode()).append("',"); // code
+		buff.append("'").append(model.getOrigCode()).append("',"); // orig_code
+		buff.append("'").append(model.getName()).append("',"); // name
+		buff.append("'").append(model.getAliasCode()).append("',"); // alias_code
+		buff.append("'").append(model.getAliasName()).append("',"); // alias_name
+		buff.append("'").append(model.getClassCode()).append("',"); // class_code
+		buff.append("'").append(model.getType()).append("',"); // type
+		buff.append("'").append(model.getGroupCode()).append("',"); // group_code
+		buff.append("'").append(model.getProjectId()).append("',"); // project_id
+		buff.append("'").append(model.getCategory().name()).append("',"); // category
+		if (model.getFirstTag() != null) {
+			buff.append("'").append(model.getFirstTag()).append("',"); // first_tag
+		} else {
+			buff.append("null,");
+		}
+		if (model.getSecondTag() != null) {
+			buff.append("'").append(model.getSecondTag()).append("',"); // second_tag
+		} else {
+			buff.append("null,");
+		}
+		if (model.getPriority() != null) {
+			buff.append("'").append(model.getPriority()).append("',"); // priority
+		} else {
+			buff.append("null,");
+		}
+		if (model.getInputMode() != null) {
+			buff.append("'").append(model.getInputMode()).append("',"); // input_mode
+		} else {
+			buff.append("null,");
+		}
+		if (model.getUnit() != null) {
+			buff.append("'").append(model.getUnit()).append("',"); // unit
+		} else {
+			buff.append("null,");
+		}
+
+		buff.append("'").append(model.getDataType().name()).append("',"); // data_type
+		buff.append("'").append(model.getOrigDataType()).append("',"); // orig_data_type
+		buff.append(model.getIsMultiple() ? 1 : 0).append(","); // is_multiple
+		buff.append(model.getIsRegion() ? 1 : 0).append(","); // is_region
+		if (model.getFormater() != null) {
+			buff.append("'").append(model.getFormater()).append("',"); // formater
+		} else {
+			buff.append("null,");
+		}
+		if (model.getDataSource() != null) {
+			buff.append("'").append(model.getDataSource().toString()).append("',"); // data_source
+		} else {
+			buff.append("null,");
+		}
+		if (model.getOrigDataSource() != null) { // orig_data_source
+			buff.append("'").append(model.getOrigDataSource()).append("',"); // data_source
+		} else {
+			buff.append("null,");
+		}
+		if (model.getNote() != null) {
+			buff.append("'").append(model.getNote()).append("',"); // note}
+		} else {
+			buff.append("null,");
+		}
+		buff.append(model.getSubFlag() ? 1 : 0).append(","); // sub_flag
+		buff.append(model.getWeakPoint() ? 1 : 0).append(","); // weak_point
+		buff.deleteCharAt(buff.length() - 1);
+		buff.append(");");
+		return buff.toString();
+	}
+
+	private FuncidDefModel toFuncidDefModel(CacheModel model) {
+		FuncidDefModel funcid = new FuncidDefModel();
+		funcid.setGroupCode("0");
+		funcid.setProjectId("0");
+		funcid.setType("common");
+		funcid.setClassCode(model.classCode);
+		funcid.setFirstTag(model.firstTag != null ? model.firstTag.replace("\n", "") : null);
+		funcid.setSecondTag(model.secondTag != null ? model.secondTag.replace("\n", "") : null);
+		funcid.setCode(model.origCode.substring(0, 1).toLowerCase() + model.origCode.substring(1));
+		funcid.setOrigCode(model.origCode);
+		funcid.setAliasCode(model.origCode);
+		if (model.name != null) {
+			funcid.setName(model.name.replace("\n", ""));
+			funcid.setAliasName(model.name.replace("\n", ""));
+		} else {
+			log.error("funcid name is null : {}", JacksonMapper.toSimpleJson(funcid));
+		}
+		funcid.setUnit(model.unit);
+		funcid.setPriority(model.priority);
+		funcid.setInputMode(model.inputMode);
+		funcid.setOrigDataType(model.origDataType);
+		funcid.setSubFlag(false);
+		funcid.setWeakPoint(false);
+		FuncidDefModel dataType = DataTypeMapping.getDataType(model.origDataType);
+		if (dataType != null) {
+			funcid.setCategory(dataType.getCategory());
+			funcid.setDataType(dataType.getDataType());
+			funcid.setIsMultiple(dataType.getIsMultiple());
+			funcid.setIsRegion(dataType.getIsRegion());
+		} else {
+			return null;
+		}
+		funcid.setSubFlag(false);
+		if (model.remark != null) {
+			funcid.setNote(model.remark.replace("\n", ""));
+		}
+
+		if (model.origDataSource != null) {
+			funcid.setOrigDataSource(model.origDataSource.replace("\n", "nn")); // 去掉换行符
+		}
+		if (funcid.getDataType() == FuncidDataType.ENUM || funcid.getDataType() == FuncidDataType.MENUM || funcid.getDataType() == FuncidDataType.BOOLEAN) {
+			funcid.setDataSource(FuncidUtils.transEnumDataSource(model.origDataSource)); // 解析datasource
+		}
+		return funcid;
+	}
+
+	private void importSpace(List<FuncidDefModel> funcids) throws IOException {
+		funcids.addAll(readSheet("OtherZone", "/2.1-建筑空间类对象/2.1.5-空间.xlsx", "OTZ其他分区"));
+	}
+
+	@Data
+	private static class CacheModel {
+		private String classCode;
+		private String firstTag;
+		private String secondTag;
+		private String origCode;
+		private String name;
+		private String unit;
+		private String origDataType;
+		private String priority; // 优先级
+		private String inputMode;
+		private String origDataSource; // 字典选择
+		private String remark; // 备注
+	}
+
+	private List<FuncidDefModel> readSheet(String classCode, String fileName, String sheetName) throws IOException {
+		List<FuncidDefModel> data = new LinkedList<>();
+		String classFile = basepath + fileName;
+		FileInputStream inputStream = new FileInputStream(classFile);
+		Workbook workbook = new XSSFWorkbook(inputStream);
+		Sheet sheet = workbook.getSheet(sheetName);
+		if (sheet == null) {
+			return data;
+		}
+
+		// 行号从0开始, 从第2行开始读数据
+		int startRowNum = 2;
+		int lastRowNum = sheet.getLastRowNum();
+		CacheModel cache = new CacheModel();
+		for (int rowIndex = startRowNum; rowIndex <= lastRowNum; rowIndex++) {
+			Row row = sheet.getRow(rowIndex);
+			if (row == null) {
+				log.info("file: {}, sheet: {}, row[{}] is null", fileName, sheetName, rowIndex);
+				continue;
+			}
+			// 0:firstTag, 1:secondTag, 2:name, 3:origCode, 4:unit, 5:origDataType, 6:priorite, 7:imputMode, 8:origDataSource, 9:remark
+			CacheModel target = new CacheModel();
+			target.classCode = classCode;
+			target.firstTag = (String) ExcelUtils.parseCell(row.getCell(0), "string");
+			target.secondTag = (String) ExcelUtils.parseCell(row.getCell(1), "string");
+			target.name = (String) ExcelUtils.parseCell(row.getCell(2), "string");
+			target.origCode = (String) ExcelUtils.parseCell(row.getCell(3), "string");
+			target.unit = (String) ExcelUtils.parseCell(row.getCell(4), "string");
+			target.origDataType = (String) ExcelUtils.parseCell(row.getCell(5), "string");
+			target.priority = (String) ExcelUtils.parseCell(row.getCell(6), "string");
+			target.inputMode = (String) ExcelUtils.parseCell(row.getCell(7), "string");
+			target.origDataSource = (String) ExcelUtils.parseCell(row.getCell(8), "string");
+			target.remark = (String) ExcelUtils.parseCell(row.getCell(9), "string");
+
+			if (target.origCode == null || "".equals(target.origCode) || "`".equals(target.origCode)) {
+				continue;
+			}
+			if (FuncidUtils.isBase(target.origCode)) {
+				continue;
+			}
+
+			// firstTag不为空
+			if (target.firstTag != null) {
+				cache.firstTag = target.firstTag;
+				cache.secondTag = null;
+			} else {
+				target.firstTag = cache.firstTag;
+			}
+
+			// secondTag
+			if (target.secondTag != null) {
+				cache.secondTag = target.secondTag;
+			} else {
+				target.secondTag = cache.secondTag;
+			}
+			FuncidDefModel funcidDefModel = toFuncidDefModel(target);
+			if (funcidDefModel == null) {
+				log.info("file: {}, sheet: {}, row: {} data type [{}] error", fileName, sheetName, rowIndex, target.origDataType);
+			} else {
+				data.add(funcidDefModel);
+			}
+		}
+		return data;
+	}
+
+}
+

+ 1 - 1
dmp-rwd-funcid-parser/src/main/java/com/persagy/dmp/rwd/funcid/parse/parser/ParserUtils.java

@@ -37,7 +37,7 @@ public class ParserUtils {
 		} else if (type == FuncidDataType.MENUM) { // TODO
 			return ObjectNodeUtils.isString(node);
 		} else if (type == FuncidDataType.ATTACHMENT) { // TODO
-			return ObjectNodeUtils.isString(node);
+			return ObjectNodeUtils.isObject(node);
 		} else if (type == FuncidDataType.OBJECT) {
 			return ObjectNodeUtils.isString(node); // TODO
 		}

+ 10 - 17
dmp-rwd-funcid-parser/src/main/java/com/persagy/dmp/rwd/funcid/parse/parser/impl/AttachmentParser.java

@@ -1,6 +1,7 @@
 package com.persagy.dmp.rwd.funcid.parse.parser.impl;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.rwd.enums.FuncidDataType;
 import com.persagy.dmp.rwd.funcid.parse.parser.ParserContext;
 import com.persagy.dmp.rwd.funcid.parse.parser.ParserUtils;
@@ -13,7 +14,7 @@ import java.util.List;
  * @date: 2020-09-10
  * @verison: 1.0
  */
-public class AttachmentParser extends AbstractParser<String> {
+public class AttachmentParser extends AbstractParser<ObjectNode> {
 
 	@Override
 	public void checkDef(ParserContext context) {
@@ -21,7 +22,7 @@ public class AttachmentParser extends AbstractParser<String> {
 	}
 
 	@Override
-	public void checkValue(ParserContext<String> context) {
+	public void checkValue(ParserContext<ObjectNode> context) {
 		super.checkValue(context);
 		if (context.isHasError()) {
 			return;
@@ -36,39 +37,31 @@ public class AttachmentParser extends AbstractParser<String> {
 		Boolean isMultiple = def.getIsMultiple();
 		Boolean isRegion = def.getIsRegion();
 
-		if (isMultiple && isRegion) {
-			// 复数, 区间
-			context.addError("不支持[Attachment 复数 区间]");
+		if (isRegion) {
+			// 区间
+			context.addError("不支持[Attachment]区间");
 			return;
 		}
 
-		if (isMultiple && !isRegion) {
+		if (isMultiple) {
 			// 复数 非区间
 			if (!ParserUtils.isArray(source, dataType)) {
 				context.addError("值错误[" + sourceStr + "]");
 				return;
 			}
-			List<String> value = ParserUtils.parseToList(sourceStr, String.class);
+			List<ObjectNode> value = ParserUtils.parseToList(sourceStr, ObjectNode.class);
 			if (value == null || value.size() == 0) {
 				context.addError("值错误[" + sourceStr + "]");
 				return;
 			}
 			context.setArrayValue(value);
-		}
-
-		if (!isMultiple && isRegion) {
-			// 单数 区间
-			context.addError("不支持[Attachment 单数 区间]");
-			return;
-		}
-
-		if (!isMultiple && !isRegion) {
+		} else {
 			// 单数 非区间
 			if (!ParserUtils.is(source, dataType)) {
 				context.addError("值错误[" + sourceStr + "]");
 				return;
 			}
-			String value = ParserUtils.parse(sourceStr, String.class);
+			ObjectNode value = ParserUtils.parse(sourceStr, ObjectNode.class);
 			context.setValue(value);
 		}
 	}

+ 23 - 0
dmp-rwd-funcid-parser/src/main/java/com/persagy/dmp/rwd/funcid/parse/utils/ObjectNodeUtils.java

@@ -176,4 +176,27 @@ public class ObjectNodeUtils {
 		return null;
 	}
 
+
+	public static boolean isObject(JsonNode node) {
+		if (node == null) {
+			return false;
+		}
+		JsonNodeType nodeType = node.getNodeType();
+		if (nodeType == JsonNodeType.ARRAY) {
+			return false;
+		} else if(nodeType == JsonNodeType.OBJECT){
+			return true;
+		} else if(nodeType == JsonNodeType.POJO){
+			return true;
+		}
+		return true;
+	}
+
+	public static ObjectNode getObject(JsonNode node) {
+		if (node == null) {
+			return null;
+		}
+		return (ObjectNode) node;
+	}
+
 }

+ 9 - 11
dmp-rwd/doc/config.sql

@@ -16,16 +16,14 @@ VALUES
 ('dmp-rwd','default','master','DMP',1,'eureka.instance.prefer-ip-address','true',null),
 ('dmp-rwd','default','master','DMP',1,'eureka.instance.instance-id','${spring.cloud.client.ip-address}:${server.port}',null),
 
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.props.sql.show', 'false', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.names', 'ds0', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.ds0.type', 'com.alibaba.druid.pool.DruidDataSource', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.ds0.driverClassName', 'com.mysql.cj.jdbc.Driver', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.ds0.url', 'jdbc:mysql://${persagy.mysql.host}:${persagy.mysql.port}/${persagy.mysql.database}?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.ds0.username', '${persagy.mysql.username}', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.ds0.password', '${persagy.mysql.password}', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.ds0.initialSize', '${persagy.mysql.initialSize}', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.datasource.ds0.maxActive', '${persagy.mysql.maxActive}', null),
-('dmp-rwd','default','master','DMP',1,'spring.shardingsphere.sharding.default-data-source-name', 'ds0', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.type', 'com.alibaba.druid.pool.DruidDataSource', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.driverClassName', 'com.mysql.cj.jdbc.Driver', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.url', 'jdbc:mysql://${persagy.mysql.host}:${persagy.mysql.port}/${persagy.mysql.database}?useUnicode=true&characterEncoding=utf-8&mysqlEncoding=utf8&useSSL=false', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.username', '${persagy.mysql.username}', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.password', '${persagy.mysql.password}', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.max-active', '${persagy.mysql.maxActive}', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.max-idle', '20', null),
+('dmp-rwd','default','master','DMP',1,'spring.datasource.min-idle', '10', null),
 
 ('dmp-rwd','default','master','DMP',1,'spring.rabbitmq.host', '${persagy.rabbitmq.host}', null),
 ('dmp-rwd','default','master','DMP',1,'spring.rabbitmq.port', '${persagy.rabbitmq.port}', null),
@@ -51,7 +49,7 @@ VALUES
 ('dmp-rwd','dev','master','DMP',1,'server.port', '8080', null),
 
 ('dmp-rwd','dev','master','DMP',1,'eureka.client.service-url.defaultZone','http://frame:123456@localhost:9931/eureka/','注册中心地址'),
-('dmp-rwd','dev','master','DMP',1,'eureka.instance.ip-address','localhost',null),
+
 ('dmp-rwd','dev','master','DMP',1,'persagy.iot.data.server', 'http://localhost:9981', 'IOT数据查询服务'),
 ('dmp-rwd','dev','master','DMP',1,'persagy.iot.setting.server', 'http://localhost:9983', 'IOT控制服务'),
 

+ 1 - 6
dmp-rwd/pom.xml

@@ -71,12 +71,7 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
-        <!-- 分库分表 -->
-        <dependency>
-            <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
-            <version>4.1.1</version>
-        </dependency>
+
         <!-- 注册中心 -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>

+ 0 - 2
dmp-rwd/src/main/java/com/persagy/dmp/rwd/config/GlobalExceptionHandler.java

@@ -2,7 +2,6 @@ package com.persagy.dmp.rwd.config;
 
 import com.persagy.common.web.BaseResponse;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.sharding.route.engine.validator.impl.ShardingUpdateStatementValidator;
 import org.springframework.dao.DataAccessException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
@@ -23,7 +22,6 @@ public class GlobalExceptionHandler {
 		BaseResponse<String> resp = new BaseResponse<>();
 		resp.setFail("服务异常: " + ex.getMessage());
 		log.error("服务异常", ex);
-		ShardingUpdateStatementValidator va;
 		return resp;
 	}
 

+ 63 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/config/JpaSqlExecuteContext.java

@@ -0,0 +1,63 @@
+package com.persagy.dmp.rwd.config;
+
+import lombok.Data;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-20
+ * @verison: 1.0
+ */
+public class JpaSqlExecuteContext extends HandlerInterceptorAdapter {
+
+	private static final ThreadLocal<Param> param = new ThreadLocal();
+
+	@Override
+	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+		this.init(request.getParameter("groupCode"), request.getParameter("projectId"));
+		return true;
+	}
+
+	@Override
+	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+		this.clear();
+	}
+
+	@Override
+	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+		this.clear();
+	}
+
+
+	@Data
+	public static class Param {
+		private String groupCode;
+		private String projectId;
+	}
+
+	public static void init(String groupCode, String projectId) {
+		if (param.get() == null) {
+			param.set(new Param());
+		}
+		param.get().groupCode = groupCode;
+		param.get().projectId = projectId;
+	}
+
+	public static void clear() {
+		param.remove();
+		param.set(null);
+	}
+
+	public static String getGroupCode() {
+		return param.get().groupCode;
+	}
+
+	public static String getProjectId() {
+		return param.get().projectId;
+	}
+
+}

+ 6 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/config/WebConfig.java

@@ -24,10 +24,16 @@ public class WebConfig implements WebMvcConfigurer {
 		return new DmpParameterStorage();
 	}
 
+	@Bean
+	public JpaSqlExecuteContext jpaSqlExecuteContext() {
+		return new JpaSqlExecuteContext();
+	}
+
 	@Override
 	public void addInterceptors(InterceptorRegistry registry) {
 		// 设置拦截的路径、不拦截的路径、优先级等等
 		registry.addInterceptor(dmpParameterStorage()).addPathPatterns("/**");
+		registry.addInterceptor(jpaSqlExecuteContext()).addPathPatterns("/**");
 	}
 
 	@Bean

+ 3 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/entity/RelationInstance.java

@@ -28,6 +28,7 @@ public class RelationInstance {
 	private String graphCode;
 	@Column(updatable = false)
 	private String relCode;
+	private String relValue;
 	@Column(updatable = false)
 	private String objFrom;
 	@Column(updatable = false)
@@ -52,6 +53,7 @@ public class RelationInstance {
 		entity.setGraphId(model.getGraphId());
 		entity.setGraphCode(model.getGraphCode());
 		entity.setRelCode(model.getRelCode());
+		entity.setRelValue(model.getRelValue());
 		entity.setObjFrom(model.getObjFrom());
 		entity.setObjTo(model.getObjTo());
 		entity.setStatus(model.getStatus());
@@ -71,6 +73,7 @@ public class RelationInstance {
 		model.setGraphId(this.getGraphId());
 		model.setGraphCode(this.getGraphCode());
 		model.setRelCode(this.getRelCode());
+		model.setRelValue(this.getRelValue());
 		model.setObjFrom(this.getObjFrom());
 		model.setObjTo(this.getObjTo());
 		model.setStatus(this.getStatus());

+ 6 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/BaseService.java

@@ -4,6 +4,7 @@ import com.persagy.common.criteria.CriteriaUtils;
 import com.persagy.common.criteria.JpaUtils;
 import com.persagy.common.web.BaseResponse;
 import com.persagy.dmp.config.DmpParameterStorage;
+import com.persagy.dmp.rwd.config.JpaSqlExecuteContext;
 import com.persagy.dmp.rwd.config.RwdConstants;
 import com.persagy.dmp.rwd.repository.*;
 import com.querydsl.jpa.impl.JPAQueryFactory;
@@ -69,6 +70,11 @@ public class BaseService {
     @Autowired
     protected SchemaProjectRepository schemaProjectRepository;
 
+    protected void setSharding(String groupCode, String projectId){
+        JpaSqlExecuteContext.init(groupCode, projectId);
+    }
+
+
     protected static class OrgParam {
         String groupCode;
         String schemaId;

+ 6 - 3
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ClassDefService.java

@@ -77,6 +77,7 @@ public class ClassDefService extends BaseService {
 		jacksonCriteria.add("type", "common");
 		jacksonCriteria.add("groupCode", "0");
 		jacksonCriteria.setWithoutCount(true);
+		setSharding("0", "0"); // sharding
 		PagedResponse<ClassDefModel> queryResponse = query(jacksonCriteria);
 		for (ClassDefModel model : queryResponse.getData()) {
 			map.put(model.getCode(), model);
@@ -89,6 +90,7 @@ public class ClassDefService extends BaseService {
 			groupCriteria.add("type", "group");
 			groupCriteria.add("groupCode", orgParam.groupCode);
 			jacksonCriteria.setWithoutCount(true);
+			setSharding(orgParam.groupCode, "0"); // sharding
 			queryResponse = query(groupCriteria);
 			for (ClassDefModel model : queryResponse.getData()) {
 				map.put(model.getCode(), model);
@@ -103,6 +105,7 @@ public class ClassDefService extends BaseService {
 			jacksonCriteria.add("groupCode", orgParam.groupCode);
 			jacksonCriteria.add("projectId", orgParam.projectId);
 			jacksonCriteria.setWithoutCount(true);
+			setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 			queryResponse = query(jacksonCriteria);
 			for (ClassDefModel model : queryResponse.getData()) {
 				map.put(model.getCode(), model);
@@ -112,6 +115,7 @@ public class ClassDefService extends BaseService {
 		// 筛选方案订阅
 		if (orgParam.schemaId != null && !"0".equalsIgnoreCase(orgParam.schemaId)) {
 			QSchemaClass qsc = QSchemaClass.schemaClass;
+			setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 			Iterable<SchemaClass> all = schemaClassRepository.findAll(qsc.schemaId.eq(orgParam.schemaId).and(qsc.groupCode.eq(orgParam.groupCode)));
 			Set<String> classCodes = new HashSet<>();
 			for (SchemaClass item : all) {
@@ -133,6 +137,7 @@ public class ClassDefService extends BaseService {
 		// 筛选应用订阅部分
 		if (orgParam.appId != null && !"0".equalsIgnoreCase(orgParam.appId)) {
 			QAppClass qac = QAppClass.appClass;
+			setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 			Iterable<AppClass> all = appClassRepository.findAll(qac.appId.eq(appId).and(qac.groupCode.eq(orgParam.groupCode).and(qac.projectId.eq(orgParam.projectId))));
 			Set<String> classCodes = new HashSet<>();
 			for (AppClass item : all) {
@@ -156,8 +161,6 @@ public class ClassDefService extends BaseService {
 
 			//List<FuncidDataType> enumTypeList = Arrays.asList(FuncidDataType.ENUM);
 			List<String> classCodeList = map.values().stream().map(ClassDefModel::getCode).collect(Collectors.toList());
-			Map<String, FuncidDef> funcidCache = new HashMap<>();
-
 			JacksonCriteria funcidCriteria = JacksonCriteria.newInstance();
 			funcidCriteria.add("classCode").in(classCodeList);
 			funcidCriteria.add("dataType", FuncidDataType.ENUM);
@@ -181,7 +184,7 @@ public class ClassDefService extends BaseService {
 				}
 
 				for (JsonNode jsonNode : dataSource) {
-					com.fasterxml.jackson.databind.node.ObjectNode item = (com.fasterxml.jackson.databind.node.ObjectNode) jsonNode;
+					ObjectNode item = (ObjectNode) jsonNode;
 					ClassDefModel model = new ClassDefModel();
 					BeanUtils.copyProperties(classDefModel, model);
 					model.setCode(classDefModel.getCode() + "&" + funcid.getCode() + "=" + item.get("code").asText());

+ 7 - 3
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/FuncidDefService.java

@@ -79,6 +79,7 @@ public class FuncidDefService extends BaseService {
 				return resp;
 			}
 			QSchemaProject pqt = QSchemaProject.schemaProject;
+			setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 			Optional<SchemaProject> one = schemaProjectRepository.findOne(pqt.projectId.eq(orgParam.projectId).and(pqt.groupCode.eq(orgParam.groupCode)));
 			if (one.isPresent()) {
 				orgParam.schemaId = one.get().getSchemaId();
@@ -106,6 +107,7 @@ public class FuncidDefService extends BaseService {
 				String infoCode = funcid.getCode();
 				if (!classInfoCodeCache.containsKey(classCode)) {
 					QSchemaFuncid qsf = QSchemaFuncid.schemaFuncid;
+					setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 					Iterable<SchemaFuncid> all = schemaFuncidRepository.findAll(qsf.groupCode.eq(orgParam.groupCode).and(qsf.schemaId.eq(orgParam.schemaId).and(qsf.classCode.eq(classCode))));
 					Set<String> set = new HashSet<>();
 					for (SchemaFuncid schemaFuncid : all) {
@@ -130,6 +132,7 @@ public class FuncidDefService extends BaseService {
 				String infoCode = funcid.getCode();
 				if (!classInfoCodeCache.containsKey(classCode)) {
 					QAppFuncid qaf = QAppFuncid.appFuncid;
+					setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 					Iterable<AppFuncid> all = appFuncidRepository.findAll(qaf.appId.eq(orgParam.appId)
 							.and(qaf.groupCode.eq(orgParam.groupCode))
 							.and(qaf.projectId.eq(orgParam.projectId))
@@ -152,13 +155,10 @@ public class FuncidDefService extends BaseService {
 	}
 
 	private List<FuncidDefModel> queryWithClassCode(OrgParam orgParam, ListResponse<FuncidDefModel> resp, JacksonCriteria request) {
-		Map<String, FuncidDefModel> cache = new HashMap<>();
 		JsonNode classCode = request.getCriteria().get("classCode");
-
 		JacksonCriteria criteria = JacksonCriteria.newInstance();
 		criteria.getCriteria().set("code", classCode);
 		criteria.setWithoutCount(true);
-		System.out.println("query class " + JacksonMapper.toSimpleJson(criteria));
 		ListResponse<ClassDefModel> classDefModelListResponse = classDefService.queryClass(orgParam.groupCode, orgParam.schemaId, orgParam.projectId, orgParam.appId, false, criteria);
 		List<ClassDefModel> classDefModelList = classDefModelListResponse.getData();
 		List<FuncidDefModel> list = new LinkedList<>();
@@ -191,7 +191,9 @@ public class FuncidDefService extends BaseService {
 		criteria.add("type", "common");
 		criteria.add("groupCode", "0");
 		criteria.setWithoutCount(true);
+		setSharding("0", "0"); // sharding
 		PagedResponse<FuncidDefModel> queryResp = query(criteria);
+
 		queryResp.getData().forEach(model -> cache.put(model.getClassCode() + "-" + model.getCode(), model));
 
 		// 查询集团级
@@ -201,6 +203,7 @@ public class FuncidDefService extends BaseService {
 			criteria.add("type", "group");
 			criteria.add("groupCode", orgParam.groupCode);
 			criteria.setWithoutCount(true);
+			setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 			queryResp = query(criteria);
 			queryResp.getData().forEach(model -> cache.put(model.getClassCode() + "-" + model.getCode(), model));
 		}
@@ -212,6 +215,7 @@ public class FuncidDefService extends BaseService {
 			criteria.add("groupCode", orgParam.groupCode);
 			criteria.add("projectId", orgParam.projectId);
 			criteria.setWithoutCount(true);
+			setSharding(orgParam.groupCode, orgParam.projectId); // sharding
 			queryResp = query(criteria);
 			queryResp.getData().forEach(model -> cache.put(model.getClassCode() + "-" + model.getCode(), model));
 		}

+ 1 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/InitService.java

@@ -337,6 +337,7 @@ public class InitService extends BaseService {
 		sql.append("   `graph_id` varchar(40) DEFAULT NULL,                                 \n");
 		sql.append("   `graph_code` varchar(40) DEFAULT NULL,                               \n");
 		sql.append("   `rel_code` varchar(40) DEFAULT NULL,                                 \n");
+		sql.append("   `rel_value` varchar(45) DEFAULT NULL,                                \n");
 		sql.append("   `obj_from` varchar(100) DEFAULT NULL,                                \n");
 		sql.append("   `obj_to` varchar(100) DEFAULT NULL,                                  \n");
 		sql.append("   `status` int(11) NOT NULL DEFAULT '1',                               \n");

+ 39 - 2
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ObjectInstanceCreateService.java

@@ -171,8 +171,45 @@ public class ObjectInstanceCreateService extends BaseService {
 						InfoCodeParser parser = infoCodeParserFactory.getParser(funcidDefModel.getDataType());
 						ParserContext parserContext = new ParserContext(funcidDefModel, source);
 						parser.checkValue(parserContext);
-						Object value = parserContext.getValue();
-						values.putPOJO(code, value);
+						Boolean isMultiple = funcidDefModel.getIsMultiple();
+						Boolean isRegion = funcidDefModel.getIsRegion();
+						if (isMultiple && isRegion) {
+							// 复数区间
+							List value = parserContext.getRegionArray();
+							if (value != null) {
+								if (entity.getInfos() == null) {
+									entity.setInfos(JsonNodeFactory.instance.objectNode());
+								}
+								entity.getInfos().putPOJO(code, value);
+							}
+						} else if (isMultiple && !isRegion) {
+							// 复数非区间
+							List value = parserContext.getArrayValue();
+							if (value != null) {
+								if (entity.getInfos() == null) {
+									entity.setInfos(JsonNodeFactory.instance.objectNode());
+								}
+								entity.getInfos().putPOJO(code, value);
+							}
+						} else if (!isMultiple && isRegion) {
+							// 单数 区间
+							Object value = parserContext.getRegionValue();
+							if (value != null) {
+								if (entity.getInfos() == null) {
+									entity.setInfos(JsonNodeFactory.instance.objectNode());
+								}
+								entity.getInfos().putPOJO(code, value);
+							}
+						} else if (!isMultiple && !isRegion) {
+							// 单数 非区间
+							Object value = parserContext.getValue();
+							if (value != null) {
+								if (entity.getInfos() == null) {
+									entity.setInfos(JsonNodeFactory.instance.objectNode());
+								}
+								entity.getInfos().putPOJO(code, value);
+							}
+						}
 					} else {
 						// 动态值不需校验
 						values.set(code, source);

+ 1 - 1
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ObjectInstanceQueryService.java

@@ -101,7 +101,7 @@ public class ObjectInstanceQueryService extends BaseService {
 			if (RwdConstants.isBasicColumn(infoCode) || set.contains(infoCode)) {
 				continue;
 			}
-			String exp = "JSON_EXTRACT({0}, '$." + infoCode + "')";
+			String exp = "json_extract({0}, '$." + infoCode + "')";
 			JsonNode value = object.get(infoCode);
 			FuncidDataType funcidDataType = parseDataType(value);
 			if (funcidDataType == FuncidDataType.STRING) {

+ 37 - 8
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/ObjectInstanceUpdateService.java

@@ -85,9 +85,6 @@ public class ObjectInstanceUpdateService extends BaseService {
 				response.setFail("id is required");
 				return response;
 			}
-			if ("Eq44030500190026e03ce3554a66ad66269a85106482".equals(id)) {
-				log.info("id = {}", id);
-			}
 			String classCode = super.getInfoCodeValue(orgParam.groupCode, orgParam.projectId, id, RwdConstants.OBJECT_CLASSCODE);
 			if (classCode == null) {
 				response.setFail("object[" + id + "] not exists");
@@ -198,12 +195,44 @@ public class ObjectInstanceUpdateService extends BaseService {
 					InfoCodeParser parser = infoCodeParserFactory.getParser(funcidDefModel.getDataType());
 					ParserContext parserContext = new ParserContext(funcidDefModel, source);
 					parser.checkValue(parserContext);
-					Object value = parserContext.getValue();
-					if (value != null) {
-						if (entity.getInfos() == null) {
-							entity.setInfos(JsonNodeFactory.instance.objectNode());
+					Boolean isMultiple = funcidDefModel.getIsMultiple();
+					Boolean isRegion = funcidDefModel.getIsRegion();
+					if (isMultiple && isRegion) {
+						// 复数区间
+						List value = parserContext.getRegionArray();
+						if (value != null) {
+							if (entity.getInfos() == null) {
+								entity.setInfos(JsonNodeFactory.instance.objectNode());
+							}
+							entity.getInfos().putPOJO(code, value);
+						}
+					} else if (isMultiple && !isRegion) {
+						// 复数非区间
+						List value = parserContext.getArrayValue();
+						if (value != null) {
+							if (entity.getInfos() == null) {
+								entity.setInfos(JsonNodeFactory.instance.objectNode());
+							}
+							entity.getInfos().putPOJO(code, value);
+						}
+					} else if (!isMultiple && isRegion) {
+						// 单数 区间
+						Object value = parserContext.getRegionValue();
+						if (value != null) {
+							if (entity.getInfos() == null) {
+								entity.setInfos(JsonNodeFactory.instance.objectNode());
+							}
+							entity.getInfos().putPOJO(code, value);
+						}
+					} else if (!isMultiple && !isRegion) {
+						// 单数 非区间
+						Object value = parserContext.getValue();
+						if (value != null) {
+							if (entity.getInfos() == null) {
+								entity.setInfos(JsonNodeFactory.instance.objectNode());
+							}
+							entity.getInfos().putPOJO(code, value);
 						}
-						entity.getInfos().putPOJO(code, value);
 					}
 				} else {
 					// 动态点

+ 22 - 2
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/RelationInstanceService.java

@@ -91,12 +91,12 @@ public class RelationInstanceService extends BaseService {
 				return response;
 			}
 
+			QGraphInstance qt = QGraphInstance.graphInstance;
 			// 优先级: graphId > graphCode
 			if (param.getGraphId() != null) {
 				GraphInstance gi = graphInstanceRepository.getOne(entity.getGraphId());
 				entity.setGraphCode(gi.getGraphCode());
 			} else if (param.getGraphCode() != null) {
-				QGraphInstance qt = QGraphInstance.graphInstance;
 				Sort orders = Sort.by(new Sort.Order(Sort.Direction.ASC, "id"));
 				Iterable<GraphInstance> all = graphInstanceRepository.findAll(qt.groupCode.eq(groupCode).and(qt.projectId.eq(projectId).and(qt.graphCode.eq(entity.getGraphCode()))), orders);
 				GraphInstance next = all.iterator().next();
@@ -106,7 +106,25 @@ public class RelationInstanceService extends BaseService {
 			if (entity.getCreateApp() == null) {
 				entity.setCreateApp(DmpParameterStorage.getAppId());
 			}
-			list.add(entity);
+			// 判断是否已存在
+			QRelationInstance rt = QRelationInstance.relationInstance;
+			BooleanExpression exp = rt.groupCode.eq(entity.getGroupCode())
+					.and(rt.projectId.eq(entity.getProjectId()))
+					.and(rt.graphId.eq(entity.getGraphId()))
+					.and(rt.relCode.eq(entity.getRelCode()))
+					.and(rt.objFrom.eq(entity.getObjFrom()))
+					.and(rt.objTo.eq(entity.getObjTo()));
+			if (entity.getRelValue() != null) {
+				exp = exp.and(rt.relValue.eq(entity.getRelValue()));
+			} else {
+				exp = exp.and(rt.relValue.isNull());
+			}
+
+			long count = relationInstanceRepository.count(exp);
+			if (count == 0) {
+				// 数据不存在, 新增, 已存在时忽略
+				list.add(entity);
+			}
 		}
 		if (list.size() > 0) {
 			relationInstanceRepository.saveAll(list);
@@ -121,6 +139,7 @@ public class RelationInstanceService extends BaseService {
 				message.add("graphId", relation.getGraphId());
 				message.add("graphCode", relation.getGraphCode());
 				message.add("relCode", relation.getRelCode());
+				message.add("relValue", relation.getRelValue());
 				message.add("objFrom", relation.getObjFrom());
 				message.add("objTo", relation.getObjTo());
 				response.add(message);
@@ -210,5 +229,6 @@ public class RelationInstanceService extends BaseService {
 		response.setCount(query.getCount());
 		return response;
 	}
+
 }
 

+ 8 - 3
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/iot/CurrentIotService.java

@@ -10,6 +10,7 @@ import com.persagy.dmp.common.http.HttpUtils;
 import com.persagy.dmp.config.DmpParameterStorage;
 import com.persagy.dmp.rwd.config.RwdConstants;
 import com.persagy.dmp.rwd.model.iot.CurrentDataModel;
+import com.persagy.dmp.rwd.util.MeterUtils;
 import lombok.Getter;
 import lombok.Setter;
 import org.springframework.stereotype.Service;
@@ -67,12 +68,16 @@ public class CurrentIotService extends BaseIotService {
 //			}
 
 			String infoCodeValue = getInfoCodeValue(groupCode, projectId, model.getObjectId(), infoCode);
-			if (infoCodeValue == null) {
+			if (infoCodeValue == null || "".equals(infoCode.trim())) {
 				model.setError("value of infoCode[" + model.getObjectId() + ":" + infoCode + "] is null");
 				continue;
 			}
-
+			// 判断信息点的值是不是表号-功能号格式
 			model.setInfoValue(infoCodeValue);
+			if (!MeterUtils.matchFormat(infoCodeValue)) {
+				model.setError("value of infoCode[" + model.getObjectId() + ":" + infoCode + "][ " + infoCodeValue + "] 不是正确的表号功能号");
+				continue;
+			}
 			parameters.add(new PointParam(model.getMeter(), model.getFunction()));
 		}
 
@@ -99,7 +104,7 @@ public class CurrentIotService extends BaseIotService {
 			for (CurrentDataModel model : param) {
 				if (meter.equals(model.getMeter()) && function.equals(model.getFunction())) {
 					model.setData(item.get("data"));
-					model.setTime(JacksonMapper.getString(item, "time"));
+					model.setTime(JacksonMapper.getString(item, "receivetime"));
 				}
 			}
 		}

+ 12 - 2
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/iot/HistoryIotService.java

@@ -6,14 +6,18 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.common.json.JacksonMapper;
 import com.persagy.common.web.ListResponse;
-import com.persagy.dmp.config.DmpParameterStorage;
 import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.config.DmpParameterStorage;
 import com.persagy.dmp.rwd.config.RwdConstants;
 import com.persagy.dmp.rwd.model.iot.history.InfoCodeModel;
 import com.persagy.dmp.rwd.model.iot.history.RequestModel;
+import com.persagy.dmp.rwd.util.MeterUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 @Service
 public class HistoryIotService extends BaseIotService {
@@ -79,6 +83,12 @@ public class HistoryIotService extends BaseIotService {
 			param.setError("value of infoCode[" + objectId + ":" + infoCode + "] is null");
 			return;
 		}
+		// 判断信息点的值是不是表号-功能号格式
+		if (!MeterUtils.matchFormat(infoCodeValue)) {
+			param.setStatus("error");
+			param.setError("value of infoCode[" + objectId + ":" + infoCode + "][ " + infoCodeValue + "] 不是正确的表号功能号");
+			return;
+		}
 
 		int idx = infoCodeValue.lastIndexOf("-");
 		if (idx == -1) {

+ 8 - 3
dmp-rwd/src/main/java/com/persagy/dmp/rwd/service/iot/SettingIotService.java

@@ -6,10 +6,11 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.common.json.JacksonMapper;
 import com.persagy.common.web.ListResponse;
-import com.persagy.dmp.config.DmpParameterStorage;
 import com.persagy.dmp.common.http.HttpUtils;
+import com.persagy.dmp.config.DmpParameterStorage;
 import com.persagy.dmp.rwd.config.RwdConstants;
 import com.persagy.dmp.rwd.model.iot.SettingDataModel;
+import com.persagy.dmp.rwd.util.MeterUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -42,10 +43,14 @@ public class SettingIotService extends BaseIotService {
 				continue;
 			}
 
-			int idx = infoCodeValue.lastIndexOf("-");
-			if (idx == -1) {
+			// 判断信息点的值是不是表号-功能号格式
+			if (!MeterUtils.matchFormat(infoCodeValue)) {
+				model.setStatus("error");
+				model.setError("value of infoCode[" + objectId + ":" + infoCode + "][ " + infoCodeValue + "] 不是正确的表号功能号");
 				continue;
 			}
+
+			int idx = infoCodeValue.lastIndexOf("-");
 			String meter = infoCodeValue.substring(0, idx);
 			String function = infoCodeValue.substring(idx + 1);
 			model.setMeter(meter);

+ 0 - 41
dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/GroupProjectShardingAlgorithm.java

@@ -1,41 +0,0 @@
-package com.persagy.dmp.rwd.sharding;
-
-import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
-import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author: yaoll
- * @date: 2020-10-30
- * @verison: 1.0
- */
-public class GroupProjectShardingAlgorithm implements ComplexKeysShardingAlgorithm<String> {
-
-	@Override
-	public Collection<String> doSharding(Collection<String> availableTargetNames, ComplexKeysShardingValue<String> shardingValue) {
-		String logicTableName = shardingValue.getLogicTableName();
-		Map<String, Collection<String>> columnNameAndShardingValuesMap = shardingValue.getColumnNameAndShardingValuesMap();
-		Collection<String> groupCodes = columnNameAndShardingValuesMap.get("group_code");
-		Collection<String> projectIds = columnNameAndShardingValuesMap.get("project_id");
-		Set<String> result = new HashSet<>();
-		if (groupCodes == null || groupCodes.size() == 0 || projectIds == null || projectIds.size() == 0) {
-			result.add(logicTableName);
-		} else {
-			for (String groupCode : groupCodes) {
-				for (String projectId : projectIds) {
-					if ("0".equals(groupCode)) {
-						result.add(logicTableName);
-					} else {
-						result.add(logicTableName + "_" + groupCode.toLowerCase() + "_" + projectId.toLowerCase());
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-}

+ 0 - 28
dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/GroupShardingAlgorithm.java

@@ -1,28 +0,0 @@
-package com.persagy.dmp.rwd.sharding;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
-import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
-
-import java.util.Collection;
-
-/**
- * @author: yaoll
- * @date: 2020-10-28
- * @verison: 1.0
- */
-@Slf4j
-public class GroupShardingAlgorithm implements PreciseShardingAlgorithm<String> {
-
-	@Override
-	public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<String> shardingValue) {
-		String logicTableName = shardingValue.getLogicTableName();
-		String value = shardingValue.getValue();
-		if (value == null || "0".equals(value)) {
-			return logicTableName;
-		} else {
-			return logicTableName + "_" + value.toLowerCase();
-		}
-	}
-
-}

+ 86 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/JpaSqlStatementInspector.java

@@ -0,0 +1,86 @@
+package com.persagy.dmp.rwd.sharding;
+
+import com.persagy.dmp.rwd.config.JpaSqlExecuteContext;
+import lombok.extern.slf4j.Slf4j;
+import org.hibernate.resource.jdbc.spi.StatementInspector;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-20
+ * @verison: 1.0
+ */
+@Slf4j
+public class JpaSqlStatementInspector implements StatementInspector {
+
+	private final static String TABLE_DEF_CLASS = "rwd_def_class";
+	private final static String TABLE_DEF_FUNCID = "rwd_def_funcid";
+
+	private final static String TABLE_SCHEMA = "rwd_schema";
+	private final static String TABLE_SCHEMA_CLASS = "rwd_schema_class";
+	private final static String TABLE_SCHEMA_FUNCID = "rwd_schema_funcid";
+	private final static String TABLE_SCHEMA_PROJECT = "rwd_schema_project";
+
+	private final static String TABLE_APP_CLASS = "rwd_app_class";
+	private final static String TABLE_APP_FUNCID = "rwd_app_funcid";
+
+	private final static String TABLE_INSTANCE_GRAPH = "rwd_graph";
+	private final static String TABLE_INSTANCE_OBJEC = "rwd_object";
+	private final static String TABLE_INSTANCE_INSTANCE = "rwd_relation";
+
+
+	@Override
+	public String inspect(String sql) {
+		// 只拦截dml
+		if (sql.startsWith("select") || sql.startsWith("update") || sql.startsWith("delete") || sql.startsWith("insert")) {
+			log.info("sql inspector: {}", sql);
+
+			sql = execute(sql, TABLE_DEF_CLASS, groupTableStrategy);
+			sql = execute(sql, TABLE_DEF_FUNCID, groupTableStrategy);
+
+			sql = execute(sql, TABLE_SCHEMA, groupTableStrategy);
+			sql = execute(sql, TABLE_SCHEMA_CLASS, groupTableStrategy);
+			sql = execute(sql, TABLE_SCHEMA_FUNCID, groupTableStrategy);
+			sql = execute(sql, TABLE_SCHEMA_PROJECT, groupTableStrategy);
+
+			sql = execute(sql, TABLE_APP_CLASS, groupTableStrategy);
+			sql = execute(sql, TABLE_APP_FUNCID, groupTableStrategy);
+
+			sql = execute(sql, TABLE_INSTANCE_GRAPH, groupProjectTableStrategy);
+			sql = execute(sql, TABLE_INSTANCE_OBJEC, groupProjectTableStrategy);
+			sql = execute(sql, TABLE_INSTANCE_INSTANCE, groupProjectTableStrategy);
+		}
+		log.info("sql result: {}", sql);
+		return sql;
+	}
+
+	private String execute(String sql, String logicName, TableStrategy strategy) {
+		if (sql.indexOf(" " + logicName + " ") > -1) {
+			String actualName = strategy.strategy(logicName);
+			sql = sql.replaceAll(" " + logicName + " ", " " + actualName + " ");
+			log.info("sql actual table: {}", actualName);
+		}
+		return sql;
+	}
+
+	public interface TableStrategy {
+		String strategy(String logicName);
+	}
+
+	private TableStrategy groupTableStrategy = logicName -> {
+		String groupCode = JpaSqlExecuteContext.getGroupCode();
+		if (groupCode == null || "0".equals(groupCode)) {
+			return logicName;
+		}
+		return logicName + "_" + groupCode.toLowerCase().trim();
+	};
+
+	private TableStrategy groupProjectTableStrategy = logicName -> {
+		String groupCode = JpaSqlExecuteContext.getGroupCode();
+		String projectId = JpaSqlExecuteContext.getProjectId();
+		if (groupCode == null || projectId == null || "0".equals(groupCode) || "0".equals(projectId)) {
+			return logicName;
+		}
+		return logicName + "_" + groupCode.toLowerCase().trim() + "_" + projectId.toLowerCase().trim();
+	};
+
+}

+ 18 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/sharding/JsonDialect.java

@@ -0,0 +1,18 @@
+package com.persagy.dmp.rwd.sharding;
+
+import org.hibernate.dialect.MySQL57Dialect;
+import org.hibernate.dialect.function.StandardSQLFunction;
+import org.hibernate.type.StandardBasicTypes;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-20
+ * @verison: 1.0
+ */
+public class JsonDialect extends MySQL57Dialect {
+
+	public JsonDialect() {
+		this.registerFunction("json_extract", new StandardSQLFunction("json_extract", StandardBasicTypes.STRING));
+		this.registerFunction("json_unquote", new StandardSQLFunction("json_unquote", StandardBasicTypes.STRING));
+	}
+}

+ 19 - 0
dmp-rwd/src/main/java/com/persagy/dmp/rwd/util/MeterUtils.java

@@ -0,0 +1,19 @@
+package com.persagy.dmp.rwd.util;
+
+/**
+ * @author: yaoll
+ * @date: 2020-12-16
+ * @verison: 1.0
+ */
+public class MeterUtils {
+
+	public static boolean matchFormat(String infoCodeValue){
+		// 判断信息点的值是不是表号-功能号格式
+		// 包含中划线且中划线不在开头结尾
+		int idx = infoCodeValue.indexOf("-");
+		if (idx < 1 || idx == infoCodeValue.length() - 1) {
+			return false;
+		}
+		return true;
+	}
+}

+ 8 - 80
dmp-rwd/src/main/resources/application.yml

@@ -1,81 +1,9 @@
 spring:
-  shardingsphere:
-    sharding:
-      tables:
-        rwd_def_class:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_def_class
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_def_funcid:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_def_funcid
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_schema:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_schema
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_schema_class:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_shema_class
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_schema_funcid:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_schema_funcid
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_schema_project:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_schema_project
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_app_class:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_app_class
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_app_funcid:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_app_funcid
-          key-generator-column-name: id
-          tableStrategy:
-            standard:
-              sharding-column: group_code
-              precise-algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupShardingAlgorithm
-        rwd_object:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_object
-          key-generator-column-name: id
-          tableStrategy:
-            complex:
-              sharding-columns: group_code,project_id
-              algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupProjectShardingAlgorithm
-        rwd_graph:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_graph
-          key-generator-column-name: id
-          tableStrategy:
-            complex:
-              sharding-columns: group_code,project_id
-              algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupProjectShardingAlgorithm
-        rwd_relation:
-          actualDataNodes: ${spring.shardingsphere.sharding.default-data-source-name}.rwd_relation
-          key-generator-column-name: id
-          tableStrategy:
-            complex:
-              sharding-columns: group_code,project_id
-              algorithm-class-name: com.persagy.dmp.rwd.sharding.GroupProjectShardingAlgorithm
+  jpa:
+    properties:
+      hibernate:
+        dialect: com.persagy.dmp.rwd.sharding.JsonDialect
+        session_factory:
+          statement_inspector: com.persagy.dmp.rwd.sharding.JpaSqlStatementInspector
+    hibernate:
+      ddl-auto: none

+ 7 - 0
dmp-rwd/src/main/resources/bootstrap-dev.yml

@@ -0,0 +1,7 @@
+spring:
+  application:
+    name: dmp-rwd-yll
+  cloud:
+    config:
+      profile: dev2
+      uri: http://192.168.64.18:9932