zhaoyk %!s(int64=3) %!d(string=hai) anos
pai
achega
2c343bcba5
Modificáronse 31 ficheiros con 871 adicións e 179 borrados
  1. 35 0
      docker/dockerfiles/adm-poc-backend/Dockerfile
  2. 3 0
      docker/dockerfiles/adm-poc-backend/entrypoint.sh
  3. 77 0
      docker/k8sfiles/adm-poc-backend.yml
  4. 1 1
      pom.xml
  5. 17 0
      src/main/java/com/persagy/bdtp/adm/client/ImageServiceClient.java
  6. 11 0
      src/main/java/com/persagy/bdtp/adm/client/RwdClient.java
  7. 10 0
      src/main/java/com/persagy/bdtp/adm/common/AdmConst.java
  8. 4 1
      src/main/java/com/persagy/bdtp/adm/common/AdmRequest.java
  9. 7 7
      src/main/java/com/persagy/bdtp/adm/config/AdmCommonConfig.java
  10. 26 7
      src/main/java/com/persagy/bdtp/adm/controller/AppController.java
  11. 10 0
      src/main/java/com/persagy/bdtp/adm/controller/ManageController.java
  12. 10 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmUploadJobMapper.java
  13. 14 1
      src/main/java/com/persagy/bdtp/adm/datatx/ObjectMapper4Tx.java
  14. 26 3
      src/main/java/com/persagy/bdtp/adm/entity/D2mMessage.java
  15. 2 0
      src/main/java/com/persagy/bdtp/adm/entity/DownLoadData.java
  16. 1 2
      src/main/java/com/persagy/bdtp/adm/entity/ProjectData.java
  17. 10 0
      src/main/java/com/persagy/bdtp/adm/entity/UploadRtn.java
  18. 2 0
      src/main/java/com/persagy/bdtp/adm/entity/db/AdmJobSpace.java
  19. 22 0
      src/main/java/com/persagy/bdtp/adm/entity/db/AdmUploadJob.java
  20. 9 2
      src/main/java/com/persagy/bdtp/adm/entity/db/AdmUploadLog.java
  21. 16 0
      src/main/java/com/persagy/bdtp/adm/entity/db/BaseAdmDataEntity.java
  22. 5 3
      src/main/java/com/persagy/bdtp/adm/service/ISyncApp.java
  23. 21 0
      src/main/java/com/persagy/bdtp/adm/service/ISyncSpace.java
  24. 18 2
      src/main/java/com/persagy/bdtp/adm/service/ServiceUtil.java
  25. 194 100
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl.java
  26. 8 18
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl0.java
  27. 1 1
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncOldAdmImpl.java
  28. 248 0
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncSpaceImpl.java
  29. 6 3
      src/main/java/com/persagy/bdtp/adm/util/DataExtrasUtil.java
  30. 29 0
      src/main/java/com/persagy/bdtp/adm/util/GeomUtil.java
  31. 28 28
      src/main/resources/bootstrap.yml

+ 35 - 0
docker/dockerfiles/adm-poc-backend/Dockerfile

@@ -0,0 +1,35 @@
+#构建此镜像的基础镜像
+FROM registry.persagy.com/base/centos:v-jdk1.8
+#指定作者名称
+MAINTAINER zhaoyk<zhaoyuankai@yushu.biz>
+
+#定义标签属性
+LABEL tier=backend
+LABEL product=adm
+LABEL project=adm-poc-backend
+LABEL name=adm-poc-backend
+
+#设置环境变量
+ENV JAVA_OPTS -Dfile.encoding=UTF-8 -Xms2048m -Xmx2048m
+ENV TZ Asia/Shanghai
+#ARG 可以接收docker build命令中以--build-arg 指定的参数
+ARG WORKER_HOME
+
+#执行的命令
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime	&& echo 'Asia/Shanghai' > /etc/timezone
+
+RUN mkdir -p $WORKER_HOME/config
+
+#复制文件到容器内
+COPY *.jar $WORKER_HOME/app.jar
+COPY entrypoint.sh $WORKER_HOME/
+COPY version.txt $WORKER_HOME/
+COPY config $WORKER_HOME/config
+#设置工作目录
+WORKDIR $WORKER_HOME
+
+#查看上述复制的文件,是否复制成功
+RUN ls
+
+#启动执行
+ENTRYPOINT ["sh","./entrypoint.sh"]

+ 3 - 0
docker/dockerfiles/adm-poc-backend/entrypoint.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+echo "entrypoint run..."
+java -jar $JAVA_OPTS -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Dserver.port=$SERVER_PORT app.jar

+ 77 - 0
docker/k8sfiles/adm-poc-backend.yml

@@ -0,0 +1,77 @@
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: adm-poc-backend
+  labels:
+    app: adm-poc-backend
+spec:
+  selector:
+    app: adm-poc-backend
+  ports:
+  - port: 8080
+    targetPort: 8080
+    name: server-port
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: adm-poc-backend
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: adm-poc-backend
+  template:
+    metadata:
+      labels:
+        app: adm-poc-backend
+    spec:
+      containers:
+      - name: adm-poc-backend
+        image: labisenlin.persagy.com/library/adm-poc-backend:latest
+        imagePullPolicy: Always
+        ports:
+        - containerPort: 8080
+          name: server-port
+        env:
+        - name: TZ
+          value: Asia/Shanghai
+        - name: SERVER_PORT
+          value: "8080"
+        - name: SPRING_CLOUD_CONFIG_URI
+          valueFrom:
+            configMapKeyRef:
+              name: adm-poc-backend
+              key: spring.cloud.config.uri
+        - name: SPRING_PROFILES_ACTIVE
+          valueFrom:
+            configMapKeyRef:
+              name: adm-poc-backend
+              key: spring.profiles.active
+        - name: SPRING_CLOUD_CONFIG_PROFILE
+          valueFrom:
+            configMapKeyRef:
+              name: adm-poc-backend
+              key: spring.cloud.config.profile
+        - name: EUREKA_CLIENT_FETCH_REGISTRY
+          valueFrom:
+            configMapKeyRef:
+              name: adm-poc-backend
+              key: eureka.client.fetch-registry
+        - name: EUREKA_CLIENT_REGISTER_WITH_EUREKA
+          valueFrom:
+            configMapKeyRef:
+              name: adm-poc-backend
+              key: eureka.client.register-with-eureka
+        - name: EUREKA_CLIENT_DEFAULT_ZONE
+          valueFrom:
+            configMapKeyRef:
+              name: adm-poc-backend
+              key: eureka.client.default.zone
+        - name: EUREKA_INSTANCE_IP_ADDRESS
+          valueFrom:
+            configMapKeyRef:
+              name: adm-poc-backend
+              key: eureka.instance.ip.address

+ 1 - 1
pom.xml

@@ -74,7 +74,7 @@
         </dependency>
         <dependency>
             <groupId>com.persagy</groupId>
-            <artifactId>dmp-file-minio-starter</artifactId>
+            <artifactId>dmp-file-starter</artifactId>
             <version>1.0.0</version>
         </dependency>
         <dependency>

+ 17 - 0
src/main/java/com/persagy/bdtp/adm/client/ImageServiceClient.java

@@ -0,0 +1,17 @@
+package com.persagy.bdtp.adm.client;
+
+import com.persagy.dmp.basic.config.DigitalFeignConfig;
+import feign.Response;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(name = "image-service", configuration = DigitalFeignConfig.class,
+		url = "http://api.sagacloud.cn/dp-auxiliary/image-service")
+public interface ImageServiceClient {
+
+	@GetMapping(value = "/common/file_get", consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	Response fileGet(@RequestParam String key, @RequestParam String systemId);
+
+}

+ 11 - 0
src/main/java/com/persagy/bdtp/adm/client/RwdClient.java

@@ -1,5 +1,6 @@
 package com.persagy.bdtp.adm.client;
 
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.bdtp.adm.entity.InfoDef;
 import com.persagy.bdtp.adm.entity.TypeDef;
 import com.persagy.dmp.basic.config.DigitalFeignConfig;
@@ -65,4 +66,14 @@ public interface RwdClient {
 														 @RequestParam("appId") String appId,
 														 @RequestParam("userId") String userId,
 														 @RequestBody QueryCriteria criteria);
+
+	/**
+	 * 查询关系
+	 */
+	@PostMapping({"/rwd/instance/relation/query"})
+	CommonResult<List<ObjectNode>> queryRelation(@RequestParam("groupCode") String groupCode,
+										 @RequestParam("projectId") String projectId,
+										 @RequestParam("appId") String appId,
+										 @RequestParam("userId") String userId,
+										 @RequestBody QueryCriteria criteria);
 }

+ 10 - 0
src/main/java/com/persagy/bdtp/adm/common/AdmConst.java

@@ -10,6 +10,7 @@ public interface AdmConst {
 
 	int JOB_STATE_FINISHED = 2;
 
+
 	String OBJ_TYPE_PROJECT = "project";
 
 	String OBJ_TYPE_BUILDING = "building";
@@ -24,6 +25,7 @@ public interface AdmConst {
 
 	String OBJ_TYPE_EQUIPMENT = "equipment";
 
+
 	/** 数据创建者,数据同步服务 */
 	String CREATOR_SYNC = APP_ID + "_sync";
 
@@ -42,6 +44,14 @@ public interface AdmConst {
 	/** 数据创建者,模型服务 */
 	String CREATOR_M2D = APP_ID + "_m2d";
 
+
+	String UPLOAD_PROCESSING = "processing";
+
+	String UPLOAD_FINISHED = "finished";
+
+	String UPLOAD_ERROR = "error";
+
+
 	int PIPE_DIRECTION_NONE = 0;
 
 	int PIPE_DIRECTION_FORWARD = 1;

+ 4 - 1
src/main/java/com/persagy/bdtp/adm/common/AdmRequest.java

@@ -16,11 +16,14 @@ public class AdmRequest {
 
 	private String floorId;
 
-	private String uploadFlag;
+	private String clientId;
 
 	/** 待废弃 */
 	private String lastDownloadTime;
 
+	/** 待废弃 */
+	private String uploadFlag;
+
 	private Long bdtpDownloadTs;
 
 	private Long admDownloadTs;

+ 7 - 7
src/main/java/com/persagy/bdtp/adm/config/AdmCommonConfig.java

@@ -12,12 +12,12 @@ public class AdmCommonConfig {
 	/**
 	 *	ObjectMapper默认不输出null值字段
 	 */
-	@Bean(name = "objectMapper")
-	public ObjectMapper getObjectMapper(){
-		ObjectMapper mapper = new ObjectMapper();
-		mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
-		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-		return mapper;
-	}
+//	@Bean(name = "objectMapper")
+//	public ObjectMapper getObjectMapper(){
+//		ObjectMapper mapper = new ObjectMapper();
+//		mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+//		mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+//		return mapper;
+//	}
 
 }

+ 26 - 7
src/main/java/com/persagy/bdtp/adm/controller/AppController.java

@@ -1,6 +1,7 @@
 package com.persagy.bdtp.adm.controller;
 
 import cn.hutool.core.util.StrUtil;
+import com.persagy.bdtp.adm.client.ImageServiceClient;
 import com.persagy.bdtp.adm.client.OldAdmClient;
 import com.persagy.bdtp.adm.common.AdmRequest;
 import com.persagy.bdtp.adm.common.AdmResult;
@@ -10,7 +11,6 @@ import com.persagy.bdtp.adm.entity.DownLoadData;
 import com.persagy.bdtp.adm.entity.UploadRtn;
 import com.persagy.bdtp.adm.service.ISyncApp;
 import com.persagy.bdtp.adm.service.ServiceUtil;
-import com.persagy.bdtp.adm.service.impl.SyncAppImpl;
 import feign.Response;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -22,6 +22,7 @@ import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.HashMap;
 import java.util.Map;
 
 @RestController
@@ -29,6 +30,9 @@ import java.util.Map;
 public class AppController {
 
 	@Autowired
+	private ImageServiceClient imageServiceClient;
+
+	@Autowired
 	private OldAdmClient admClient;
 
 	@Autowired
@@ -38,6 +42,13 @@ public class AppController {
 	@Autowired
 	private DataTxHandler dataTxHandler;
 
+	@RequestMapping("/clientId")
+	public AdmResult<Map<String, Object>> clientId(@RequestBody AdmRequest req){
+		HashMap<String, Object> rtn = new HashMap<>();
+		rtn.put("clientId", syncApp.getClientId(req.getUserId()));
+		return AdmResult.success(rtn);
+	}
+
 	@RequestMapping("/dict")
 	public AdmResult<Dict> dict(@RequestBody AdmRequest req){
 		return AdmResult.success(syncApp.downloadDict(req.getGroupCode(), req.getProjectId(), req.getUserId()));
@@ -89,13 +100,13 @@ public class AppController {
 	@RequestMapping("/download")
 	public AdmResult<DownLoadData> download(@RequestBody AdmRequest req){
 		DownLoadData data;
-		if(StrUtil.isBlank(req.getBuildingId())) {
-			if(syncApp instanceof SyncAppImpl) //临时兼容
-				data = syncApp.downloadBuildingData(req.getGroupCode(), req.getProjectId(), req.getUserId(), req.getUploadFlag(), req.getBuildingId(), req.getBdtpDownloadTs(), req.getAdmDownloadTs());
+		if(StrUtil.isNotBlank(req.getBuildingId())) {
+			if(ServiceUtil.SYNC_APP_IMPL.equals("syncAppImpl")) //临时兼容
+				data = syncApp.downloadBuildingData(req.getGroupCode(), req.getProjectId(), req.getUserId(), req.getClientId(), req.getBuildingId(), req.getBdtpDownloadTs(), req.getAdmDownloadTs());
 			else
 				data = syncApp.downloadBuildingData(req.getProjectId(), req.getBuildingId(), req.getUploadFlag(), req.getLastDownloadTime());
 		} else
-			data = syncApp.downloadProjectData(req.getGroupCode(), req.getProjectId(), req.getUserId(), req.getUploadFlag(), req.getBdtpDownloadTs(), req.getAdmDownloadTs());
+			data = syncApp.downloadProjectData(req.getGroupCode(), req.getProjectId(), req.getUserId(), req.getClientId(), req.getBdtpDownloadTs(), req.getAdmDownloadTs());
 		return AdmResult.success(data);
 	}
 
@@ -108,7 +119,12 @@ public class AppController {
 	public void downloadMap(HttpServletRequest request, HttpServletResponse response, @RequestParam String key){
 		InputStream inputStream = null;
 		try {
-			Response serviceResponse = admClient.getFloorMap(key, "revit");
+			Response serviceResponse;
+			if(ServiceUtil.SYNC_APP_IMPL.equals("syncAppImpl")) //临时兼容
+				serviceResponse = imageServiceClient.fileGet(key, "revit");
+			else
+				serviceResponse = admClient.getFloorMap(key, "revit");
+
 			Response.Body body = serviceResponse.body();
 
 			inputStream = body.asInputStream();
@@ -133,7 +149,10 @@ public class AppController {
 	@RequestMapping("/upload")
 	public AdmResult<UploadRtn> upload(HttpServletRequest request){
 		AdmRequest admRequest = dataTxHandler.handleRequest(request);
-		return AdmResult.success(syncApp.uploadData(admRequest.getUploadData(), admRequest.getGroupCode(), admRequest.getProjectId(), admRequest.getUserId(), admRequest.getUploadFlag()));
+		if(ServiceUtil.SYNC_APP_IMPL.equals("syncAppImpl")) //临时兼容
+			return AdmResult.success(syncApp.uploadData(admRequest.getUploadData(), admRequest.getGroupCode(), admRequest.getProjectId(), admRequest.getUserId(), admRequest.getClientId()));
+		else
+			return AdmResult.success(syncApp.uploadData(admRequest.getUploadData(), admRequest.getGroupCode(), admRequest.getProjectId(), admRequest.getUserId(), admRequest.getUploadFlag()));
 	}
 
 	@PostMapping("/uploadFile")

+ 10 - 0
src/main/java/com/persagy/bdtp/adm/controller/ManageController.java

@@ -3,6 +3,7 @@ package com.persagy.bdtp.adm.controller;
 import com.persagy.bdtp.adm.common.AdmRequest;
 import com.persagy.bdtp.adm.common.AdmResult;
 import com.persagy.bdtp.adm.service.ISyncOldAdm;
+import com.persagy.bdtp.adm.service.ISyncSpace;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -19,6 +20,9 @@ public class ManageController {
 	@Autowired
 	private ISyncOldAdm syncOldAdm;
 
+	@Autowired
+	private ISyncSpace syncSpace;
+
 	@RequestMapping("/syncOldAdm")
 	public AdmResult<Object> syncOldAdm(@RequestBody AdmRequest req){
 		String groupCode = req.getGroupCode();
@@ -30,4 +34,10 @@ public class ManageController {
 		return AdmResult.success(syncResult);
 	}
 
+	@RequestMapping("/syncSpace")
+	public AdmResult<Object> syncSpace(@RequestBody AdmRequest req){
+		Map<String, Object> syncResult = syncSpace.sync(req.getGroupCode(), req.getProjectId(), req.getUserId(), req.getFloorId(), "GeneralZone");
+		return AdmResult.success(syncResult);
+	}
+
 }

+ 10 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmUploadJobMapper.java

@@ -0,0 +1,10 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.db.AdmUploadJob;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface AdmUploadJobMapper extends BaseMapper<AdmUploadJob> {
+
+}

+ 14 - 1
src/main/java/com/persagy/bdtp/adm/datatx/ObjectMapper4Tx.java

@@ -2,8 +2,10 @@ package com.persagy.bdtp.adm.datatx;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.persagy.bdtp.adm.entity.db.AdmObject;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
@@ -12,13 +14,24 @@ import org.springframework.stereotype.Component;
 @Component
 public class ObjectMapper4Tx {
 
+	private final ObjectMapper objectMapper;
+
 	private ObjectMapper mapper;
 
-	public ObjectMapper4Tx() {
+	@Autowired
+	public ObjectMapper4Tx(ObjectMapper objectMapper) {
+		this.objectMapper = objectMapper;
+		configCommonMapper();
+
 		this.mapper = new ObjectMapper();
 		configMapper();
 	}
 
+	private void configCommonMapper(){
+		objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+	}
+
 	private void configMapper(){
 		mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
 

+ 26 - 3
src/main/java/com/persagy/bdtp/adm/entity/D2mMessage.java

@@ -3,6 +3,7 @@ package com.persagy.bdtp.adm.entity;
 import cn.hutool.core.collection.CollUtil;
 import lombok.Data;
 
+import java.util.ArrayList;
 import java.util.List;
 
 @Data
@@ -10,11 +11,33 @@ public class D2mMessage {
 
 	private String itemType; //object|relation|pipe
 
-	private List<?> addItems;
+	private List<Object> addItems;
 
-	private List<?> modifyItems;
+	private List<Object> modifyItems;
 
-	private List<?> removeItems;
+	private List<Object> removeItems;
+
+	public D2mMessage(String itemType) {
+		this.itemType = itemType;
+	}
+
+	public void appendAddItem(Object item){
+		if (addItems == null)
+			addItems = new ArrayList<>();
+		addItems.add(item);
+	}
+
+	public void appendModifyItem(Object item){
+		if (modifyItems == null)
+			modifyItems = new ArrayList<>();
+		modifyItems.add(item);
+	}
+
+	public void appendRemoveItem(Object item){
+		if (removeItems == null)
+			removeItems = new ArrayList<>();
+		removeItems.add(item);
+	}
 
 	public boolean isNotEmpty(){
 		return CollUtil.isNotEmpty(addItems) || CollUtil.isNotEmpty(modifyItems) || CollUtil.isNotEmpty(removeItems);

+ 2 - 0
src/main/java/com/persagy/bdtp/adm/entity/DownLoadData.java

@@ -5,12 +5,14 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.bdtp.adm.entity.db.BaseAdmDataEntity;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.digital.entity.ObjectRelation;
+import lombok.Data;
 
 import java.util.List;
 
 /**
  * 下载数据结构基类
  */
+@Data
 abstract public class DownLoadData {
 
 	/** bdtp数据库下载同步时间戳 */

+ 1 - 2
src/main/java/com/persagy/bdtp/adm/entity/ProjectData.java

@@ -1,6 +1,5 @@
 package com.persagy.bdtp.adm.entity;
 
-import com.persagy.dmp.digital.entity.ObjectRelation;
 import lombok.Data;
 
 import java.util.List;
@@ -12,7 +11,7 @@ import java.util.List;
 public class ProjectData extends DownLoadData {
 
 	/** 项目下的关系数据 */
-	private List<ObjectRelation> relations;
+	private List<?> relations;
 
 	public void buildDownloadTs() {
 		long ts = getMaxTs(relations);

+ 10 - 0
src/main/java/com/persagy/bdtp/adm/entity/UploadRtn.java

@@ -29,4 +29,14 @@ public class UploadRtn {
 
 	private String buildingId;
 
+	private String status;
+
+	public UploadRtn() {
+
+	}
+
+	public UploadRtn(String status) {
+		this.status = status;
+	}
+
 }

+ 2 - 0
src/main/java/com/persagy/bdtp/adm/entity/db/AdmJobSpace.java

@@ -21,6 +21,8 @@ public class AdmJobSpace extends BaseAdmDataEntity {
 
     private String spaceId;
 
+    private String bimId;
+
     private String spaceType;
 
     private String parentSpaceId;

+ 22 - 0
src/main/java/com/persagy/bdtp/adm/entity/db/AdmUploadJob.java

@@ -0,0 +1,22 @@
+package com.persagy.bdtp.adm.entity.db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+@Data
+@TableName(value = "adm_upload_job", autoResultMap = true)
+public class AdmUploadJob extends BaseAdmEntity {
+
+	private String operator;
+
+	private String status;
+
+	private Timestamp startTime;
+
+	private Timestamp finishTime;
+
+}

+ 9 - 2
src/main/java/com/persagy/bdtp/adm/entity/db/AdmUploadLog.java

@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import lombok.Data;
 
 import java.sql.Timestamp;
@@ -59,8 +61,13 @@ public class AdmUploadLog {
 	}
 
 	private String getLogEntityType(Object o){
-		if(o instanceof AdmObject)
-			return ((AdmObject) o).getObjType();
+		if (o instanceof ObjectNode) {
+			JsonNode ot = ((ObjectNode) o).get("objType");
+			if(ot != null)
+				return ot.asText();
+			if(((ObjectNode) o).get("relCode") != null)
+				return "relation";
+		}
 		return o.getClass().getSimpleName();
 	}
 

+ 16 - 0
src/main/java/com/persagy/bdtp/adm/entity/db/BaseAdmDataEntity.java

@@ -1,9 +1,15 @@
 package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import lombok.Data;
 
+import java.io.IOException;
 import java.sql.Timestamp;
+import java.util.Date;
 
 /**
  * 数据实体基类
@@ -27,6 +33,7 @@ abstract public class BaseAdmDataEntity extends BaseAdmEntity {
 
 	protected String uploadFlag;
 
+	@JsonSerialize(using = DateToLongSerializer.class)
 	protected Timestamp ts;
 
 	/** APP端上传的数据状态,可以判断是否为新增数据 */
@@ -34,3 +41,12 @@ abstract public class BaseAdmDataEntity extends BaseAdmEntity {
 	protected Integer state;
 
 }
+
+class DateToLongSerializer extends JsonSerializer<Date> {
+
+	@Override
+	public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+		jsonGenerator.writeNumber(date.getTime());
+	}
+
+}

+ 5 - 3
src/main/java/com/persagy/bdtp/adm/service/ISyncApp.java

@@ -9,6 +9,8 @@ import java.util.Map;
  */
 public interface ISyncApp {
 
+	String getClientId(String userId);
+
 	Dict queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos);
 
 	Dict downloadDict(String groupCode, String projectId, String userId);
@@ -21,10 +23,10 @@ public interface ISyncApp {
 
 	BuildingData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime);
 
-	BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String uploadFlag, String buildingId, Long bdtpDownloadTs, Long admDownloadTs);
+	BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String clientId, String buildingId, Long bdtpDownloadTs, Long admDownloadTs);
 
-	ProjectData downloadProjectData(String groupCode, String projectId, String userId, String uploadFlag, Long bdtpDownloadTs, Long admDownloadTs);
+	ProjectData downloadProjectData(String groupCode, String projectId, String userId, String clientId, Long bdtpDownloadTs, Long admDownloadTs);
 
-	UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String uploadFlag);
+	UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String clientId);
 
 }

+ 21 - 0
src/main/java/com/persagy/bdtp/adm/service/ISyncSpace.java

@@ -0,0 +1,21 @@
+package com.persagy.bdtp.adm.service;
+
+import java.util.Map;
+
+/**
+ * 空间数据同步服务
+ * 数字化交付的工作空间(目前为物业分区)发生改变时,与任务空间进行同步操作
+ */
+public interface ISyncSpace {
+
+	/**
+	 * 按楼层同步
+	 */
+	Map<String, Object> sync(String groupCode, String projectId, String userId, String floorId, String zone);
+
+	/**
+	 * 按项目同步
+	 */
+	Map<String, Object> sync(String groupCode, String projectId, String userId, String zone);
+
+}

+ 18 - 2
src/main/java/com/persagy/bdtp/adm/service/ServiceUtil.java

@@ -9,11 +9,12 @@ import com.persagy.bdtp.adm.entity.oldadm.OldAdmResult;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.common.model.response.CommonResult;
 
+import java.util.List;
 import java.util.function.Supplier;
 
 public class ServiceUtil {
 
-	public static final String SYNC_APP_IMPL = "syncAppImpl0";
+	public static final String SYNC_APP_IMPL = "syncAppImpl";
 
 	private static final String SUCCESS = "success";
 
@@ -38,7 +39,7 @@ public class ServiceUtil {
 		return call(action, null);
 	}
 
-	public static <T> T call(Supplier<CommonResult<T>> action, Pagination pagination) {
+	private static <T> T call(Supplier<CommonResult<T>> action, Pagination pagination) {
 		CommonResult<T> result = action.get();
 		if(SUCCESS.equals(result.getResult())) {
 			if(pagination != null)
@@ -48,6 +49,21 @@ public class ServiceUtil {
 		throw new CallException(new AdmResult<>(result.getResult(), result.getMessage()));
 	}
 
+	public static <T> List<T> queryAllPage(Supplier<CommonResult<List<T>>> action, QueryCriteria criteria, Pagination pagination){
+		List<T> list = null;
+		while (pagination.isHasNext()){
+			criteria.setPage((long)pagination.getPageNum());
+			criteria.setSize((long)pagination.getPageSize());
+			if(list == null)
+				list = ServiceUtil.call(action, pagination);
+			else
+				list.addAll(ServiceUtil.call(action, pagination));
+			pagination.next();
+		}
+		return list;
+	}
+
+
 	public static <T> T callOldAdm(Supplier<OldAdmResult<T>> action, Pagination pagination) {
 		OldAdmResult<T> result = action.get();
 		if(SUCCESS.equals(result.getResult())) {

+ 194 - 100
src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl.java

@@ -12,13 +12,13 @@ import com.persagy.bdtp.adm.client.DicClient;
 import com.persagy.bdtp.adm.client.RwdClient;
 import com.persagy.bdtp.adm.common.AdmConst;
 import com.persagy.bdtp.adm.dao.*;
+import com.persagy.bdtp.adm.datatx.ObjectMapper4Tx;
 import com.persagy.bdtp.adm.entity.*;
 import com.persagy.bdtp.adm.entity.db.*;
 import com.persagy.bdtp.adm.service.*;
 import com.persagy.bdtp.adm.util.DataExtrasUtil;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.common.constant.ValidEnum;
-import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.define.entity.RelationDefine;
 import com.persagy.dmp.digital.client.DigitalObjectClient;
 import com.persagy.dmp.digital.client.DigitalRelationClient;
@@ -27,8 +27,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.sql.Timestamp;
 import java.util.*;
-import java.util.function.Supplier;
 
 @Service
 public class SyncAppImpl implements ISyncApp {
@@ -81,6 +81,24 @@ public class SyncAppImpl implements ISyncApp {
 	@Autowired
 	private IAdmLogService logService;
 
+	@Autowired
+	private AdmUploadJobMapper uploadJobMapper;
+
+	private final ObjectMapper4Tx mapper4Tx;
+
+	@Autowired
+	public SyncAppImpl(ObjectMapper4Tx mapper4Tx) {
+		this.mapper4Tx = mapper4Tx;
+	}
+
+	@Override
+	public String getClientId(String userId) {
+		AdmClientFlag flagEntity = new AdmClientFlag();
+		flagEntity.setUserId(userId);
+		clientFlagMapper.insert(flagEntity);
+		return String.valueOf(flagEntity.getId());
+	}
+
 	@Override
 	public Dict downloadDict(String groupCode, String projectId, String userId) {
 		return queryDict(groupCode, projectId, userId, true, true);
@@ -95,7 +113,7 @@ public class SyncAppImpl implements ISyncApp {
 
 		//查询系统和设备定义
 		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
-		List<TypeDef> typeList = queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+		List<TypeDef> typeList = ServiceUtil.queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
 
 		LinkedList<TypeDef> sysList = new LinkedList<>();
 		LinkedList<TypeDef> equipList = new LinkedList<>();
@@ -128,20 +146,6 @@ public class SyncAppImpl implements ISyncApp {
 		return data;
 	}
 
-	private <T> List<T> queryAllPage(Supplier<CommonResult<List<T>>> action, QueryCriteria criteria, Pagination pagination){
-		List<T> list = null;
-		while (pagination.isHasNext()){
-			criteria.setPage((long)pagination.getPageNum());
-			criteria.setSize((long)pagination.getPageSize());
-			if(list == null)
-				list = ServiceUtil.call(action, pagination);
-			else
-				list.addAll(ServiceUtil.call(action, pagination));
-			pagination.next();
-		}
-		return list;
-	}
-
 	@Override
 	public Map<String, Object> downloadConfig(String groupCode, String projectId, String userId) {
 		//配置数据查询
@@ -195,14 +199,37 @@ public class SyncAppImpl implements ISyncApp {
 	}
 
 	@Override
-	public BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String uploadFlag, String buildingId, Long bdtpDownloadTs, Long admDownloadTs) {
-		String operator = getOperator(uploadFlag, userId);
-
-		//从bdtp下载对象(空间、竖井、设备)
-		QueryCriteria objCriteria = ServiceUtil.getQueryCriteria(objectMapper,
-				AdmConst.OBJ_TYPE_SPACE, AdmConst.OBJ_TYPE_SHAFT, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
-		buildDownloadQueryCriteria(objCriteria, buildingId, operator, bdtpDownloadTs);
-		List<ObjectNode> objs = queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, objCriteria), objCriteria, new Pagination(500));
+	public BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String clientId, String buildingId, Long bdtpDownloadTs, Long admDownloadTs) {
+		String operator = getOperator(clientId, userId);
+
+//		//从bdtp下载对象(空间、竖井)
+//		QueryCriteria archCriteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SPACE, AdmConst.OBJ_TYPE_SHAFT);
+//		buildDownloadQueryCriteria(archCriteria, operator, bdtpDownloadTs);
+//		ObjectNode rt = archCriteria.getCriteria().putObject("relationTo");
+//		rt.put("graphCode", "ArchSubset");
+//		rt.put("objFrom", buildingId);
+//		List<ObjectNode> archList = ServiceUtil.queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, archCriteria), archCriteria, new Pagination(500));
+//		//系统、设备
+//		QueryCriteria eqCriteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
+//		buildDownloadQueryCriteria(eqCriteria, operator, bdtpDownloadTs);
+//		ObjectNode rf = eqCriteria.getCriteria().putObject("relationFrom");
+//		rf.put("graphCode", "MechInArch");
+//		rf.put("objTo", buildingId);
+//		List<ObjectNode> eqList = ServiceUtil.queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, eqCriteria), eqCriteria, new Pagination(500));
+//
+//		List<ObjectNode> objs = new ArrayList<>();
+//		if(archList != null)
+//			objs.addAll(archList);
+//		if(eqList != null)
+//			objs.addAll(eqList);
+
+		//从bdtp下载对象(空间、竖井、系统、设备)
+		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SPACE, AdmConst.OBJ_TYPE_SHAFT, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
+		buildDownloadQueryCriteria(criteria, operator, bdtpDownloadTs, buildingId);
+		List<ObjectNode> objs = ServiceUtil.queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+		if(objs == null)
+			objs = new ArrayList<>(0);
+
 		packInfos(objs);
 		test4Ts(objs);
 
@@ -237,15 +264,8 @@ public class SyncAppImpl implements ISyncApp {
 		return data;
 	}
 
-	private String getOperator(String uploadFlag, String userId){
-		AdmClientFlag clientFlag = clientFlagMapper.selectOne(new QueryWrapper<AdmClientFlag>().eq("client_flag", uploadFlag));
-		if(clientFlag == null) {
-			clientFlag = new AdmClientFlag();
-			clientFlag.setClientFlag(uploadFlag);
-			clientFlag.setUserId(userId);
-			clientFlagMapper.insert(clientFlag);
-		}
-		return userId + ':' + clientFlag.getId();
+	private String getOperator(String clientId, String userId){
+		return userId + ':' + clientId;
 	}
 
 	private <T> QueryWrapper<T> buildDownloadQueryWrapper(QueryWrapper<T> wrapper, String projectId, String buildingId, String operator, Long lastDownloadTime){
@@ -264,15 +284,13 @@ public class SyncAppImpl implements ISyncApp {
 		return wrapper;
 	}
 
-	private void buildDownloadQueryCriteria(QueryCriteria criteria, String buildingId, String operator, Long lastDownloadTime){
-		if(StrUtil.isNotBlank(buildingId)) {
-			//TODO 关联buildingId查询
-		}
-
+	private void buildDownloadQueryCriteria(QueryCriteria criteria, String operator, Long lastDownloadTime, String buildingId){
 		if (lastDownloadTime != null && lastDownloadTime > 0) {
 			criteria.getCriteria().putObject("ts").put("$gt", lastDownloadTime);
 			criteria.getCriteria().putObject("modifier").put("$ne", operator); //TODO 暂时只能处理modifier
 		}
+		if(StrUtil.isNotBlank(buildingId))
+			criteria.getCriteria().put("buildingId", buildingId);
 	}
 
 	//TODO debug 接口未返回ts时,添加一个
@@ -289,13 +307,17 @@ public class SyncAppImpl implements ISyncApp {
 	}
 
 	@Override
-	public ProjectData downloadProjectData(String groupCode, String projectId, String userId, String uploadFlag, Long bdtpDownloadTs, Long admDownloadTs) {
-		String operator = getOperator(uploadFlag, userId);
+	public ProjectData downloadProjectData(String groupCode, String projectId, String userId, String clientId, Long bdtpDownloadTs, Long admDownloadTs) {
+		String operator = getOperator(clientId, userId);
 
 		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper);
-		buildDownloadQueryCriteria(criteria, null, operator, bdtpDownloadTs);
+		buildDownloadQueryCriteria(criteria, operator, bdtpDownloadTs, null);
 
-		List<ObjectRelation> rels = queryAllPage(() -> relationClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+		//List<ObjectRelation> rels = ServiceUtil.queryAllPage(() -> relationClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+		//TODO debug 关系数据量过大,测试下载1000条
+		criteria.setPage(1L);
+		criteria.setSize(1000L);
+		List<ObjectNode> rels = ServiceUtil.call(() -> rwdClient.queryRelation(groupCode, projectId, AdmConst.APP_ID, userId, criteria));
 		test4Ts(rels);
 
 		ProjectData data = new ProjectData();
@@ -306,36 +328,76 @@ public class SyncAppImpl implements ISyncApp {
 	}
 
 	@Override
-	public UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String uploadFlag) {
+	public UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String clientId) {
 		if(!uploadData.notEmpty())
-			return new UploadRtn();
+			return new UploadRtn(AdmConst.UPLOAD_FINISHED);
 
-		String operator = getOperator(uploadFlag, userId);
-		String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
+		String operator = getOperator(clientId, userId);
 
-		UploadRtn rtn = new UploadRtn();
+		//检查上传任务状态
+		String status = checkUploadStatus(uploadData.getUploadJobId(), operator, projectId);
+		if(status != null)
+			return new UploadRtn(status);
+
+		String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
 		List<AdmUploadLog> logs = new ArrayList<>();
 
-		//上传bdtp数据
-		if (CollUtil.isNotEmpty(uploadData.getObjects())) {
-			List<ObjectNode>[] objData = prepareBdtpData(uploadData.getObjects(), operator, timestamp, uploadData.getUploadJobId(), logs);
-			uploadObjs(groupCode, projectId, userId, objData);
-		}
-		if (CollUtil.isNotEmpty(uploadData.getRelations())) {
-			List<ObjectNode>[] relData = prepareBdtpData(uploadData.getRelations(), operator, timestamp, uploadData.getUploadJobId(), logs);
-			uploadRels(groupCode, projectId, userId, relData);
+		//TODO 分布式事务管理
+		try {
+			//上传bdtp数据
+			if (CollUtil.isNotEmpty(uploadData.getObjects())) {
+				D2mMessage d2mMessage = new D2mMessage("object");
+				List<ObjectNode>[] objData = prepareBdtpData(uploadData.getObjects(), operator, timestamp, uploadData.getUploadJobId(), d2mMessage, logs);
+				uploadObjs(groupCode, projectId, userId, objData);
+
+				sendD2mMessage(d2mMessage);
+			}
+			if (CollUtil.isNotEmpty(uploadData.getRelations())) {
+				List<ObjectNode>[] relData = prepareBdtpData(uploadData.getRelations(), operator, timestamp, uploadData.getUploadJobId(), null, logs);
+				uploadRels(groupCode, projectId, userId, relData);
+			}
+
+			//上传adm数据
+			uploadAdmData(uploadData, operator, timestamp, logs);
+		} catch (Exception e) {
+			markStatus(uploadData.getUploadJobId(), AdmConst.UPLOAD_ERROR);
+
+			if(e instanceof RuntimeException)
+				throw (RuntimeException)e;
+			throw new RuntimeException(e);
 		}
 
-		//上传adm数据
-		uploadAdmData(uploadData, operator, timestamp, logs);
+		//标注上传任务状态
+		markStatus(uploadData.getUploadJobId(), AdmConst.UPLOAD_FINISHED);
 
 		//记录日志
 		logService.saveUploadLog(logs);
 
-		//TODO m2d, message & state
+		return new UploadRtn(AdmConst.UPLOAD_FINISHED);
+	}
+
+	private String checkUploadStatus(String uploadJobId, String operator, String projectId){
+		AdmUploadJob job = uploadJobMapper.selectOne(new QueryWrapper<AdmUploadJob>().eq("id", uploadJobId));
+		if(job != null) {
+			if(!AdmConst.UPLOAD_ERROR.equals(job.getStatus()))
+				return job.getStatus();
+		} else {
+			job = new AdmUploadJob();
+			job.setProjectId(projectId);
+			job.setOperator(operator);
+			job.setStatus(AdmConst.UPLOAD_PROCESSING);
+			job.setStartTime(new Timestamp(new Date().getTime()));
+			uploadJobMapper.insert(job);
+		}
+		return null;
+	}
 
-		rtn.setTimestamp(timestamp);
-		return rtn;
+	private void markStatus(String uploadJobId, String status) {
+		AdmUploadJob job = new AdmUploadJob();
+		job.setId(uploadJobId);
+		job.setStatus(status);
+		job.setFinishTime(new Timestamp(new Date().getTime()));
+		uploadJobMapper.updateById(job);
 	}
 
 	private void uploadObjs(String groupCode, String projectId, String userId, List<ObjectNode>[] data) {
@@ -352,12 +414,13 @@ public class SyncAppImpl implements ISyncApp {
 			ServiceUtil.call(() -> relationClient.update(groupCode, projectId, AdmConst.APP_ID, userId, data[1]));
 	}
 
-	private List<ObjectNode>[] prepareBdtpData(List<ObjectNode> list, String operator, String time, String jobId, List<AdmUploadLog> logs){
+	private List<ObjectNode>[] prepareBdtpData(List<ObjectNode> list, String operator, String time, String jobId, D2mMessage d2mMessage, List<AdmUploadLog> logs){
 		List<ObjectNode> updateList = new ArrayList<>();
 		Iterator<ObjectNode> iter = list.iterator();
 		while (iter.hasNext()) {
 			ObjectNode entity = iter.next();
 			DataExtrasUtil.unpackObjExtras(entity);
+			entity.remove("ts"); //调用bdtp接口前,删除ts字段
 
 			AdmUploadLog log;
 			if (entity.get("state").asInt() == 1) {
@@ -365,6 +428,15 @@ public class SyncAppImpl implements ISyncApp {
 				iter.remove();
 
 				boolean remove = entity.get("valid").asInt() == ValidEnum.FALSE.getType();
+
+				//设备数据上传时向模型服务发同步消息
+				if(d2mMessage != null && AdmConst.OBJ_TYPE_EQUIPMENT.equals(entity.get("objType"))) {
+					if(remove)
+						d2mMessage.appendRemoveItem(entity);
+					else
+						d2mMessage.appendModifyItem(entity);
+				}
+
 				log = new AdmUploadLog(jobId, operator, remove ? AdmUploadLog.REMOVE : AdmUploadLog.MODIFY);
 				log.setData(entity, objectMapper);
 
@@ -372,16 +444,26 @@ public class SyncAppImpl implements ISyncApp {
 				entity.put("modifier", operator);
 				entity.put("modifiedTime", time);
 
+				//修改空间信息点,轮廓不上传
+				if(AdmConst.OBJ_TYPE_SPACE.equals(entity.get("objType")))
+					entity.remove("outline");
+
 				//TODO 可能需要进行删除信息点操作
 
 			} else {
+				if(d2mMessage != null)
+					d2mMessage.appendAddItem(entity);
+
 				log = new AdmUploadLog(jobId, operator, AdmUploadLog.ADD);
 				log.setData(entity, objectMapper);
 
 				entity.put("createApp", AdmConst.CREATOR_APP);
 				entity.put("creator", operator);
 				entity.put("creationTime", time);
-				entity.put("modifiedTime", time); //TODO 临时处理,方便之后的增量查询
+
+				//TODO 临时处理,方便之后的增量查询
+				entity.put("modifier", operator);
+				entity.put("modifiedTime", time);
 			}
 			logs.add(log);
 		}
@@ -390,32 +472,32 @@ public class SyncAppImpl implements ISyncApp {
 	}
 
 	@Transactional(rollbackFor = Exception.class)
-	public void uploadAdmData(UploadData uploadData, String operator, String time, List<AdmUploadLog> logs){
+	public void uploadAdmData(UploadData uploadData, String operator, String time, List<AdmUploadLog> logs) {
 		if (CollUtil.isNotEmpty(uploadData.getPipes())) {
-			uploadAdmEntities(uploadData.getPipes(), operator, time, uploadData.getUploadJobId(), pipeMapper, logs, true);
+			uploadAdmEntities(uploadData.getPipes(), operator, time, uploadData.getUploadJobId(), pipeMapper, new D2mMessage("pipe"), logs, true);
 		}
 
 		if (CollUtil.isNotEmpty(uploadData.getJobSpace())) {
-			uploadAdmEntities(uploadData.getJobSpace(), operator, time, uploadData.getUploadJobId(), jobSpaceMapper, logs, false);
+			uploadAdmEntities(uploadData.getJobSpace(), operator, time, uploadData.getUploadJobId(), jobSpaceMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getProblemArch())) {
-			uploadAdmEntities(uploadData.getProblemArch(), operator, time, uploadData.getUploadJobId(), problemArchMapper, logs, false);
+			uploadAdmEntities(uploadData.getProblemArch(), operator, time, uploadData.getUploadJobId(), problemArchMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getProblemEquip())) {
-			uploadAdmEntities(uploadData.getProblemEquip(), operator, time, uploadData.getUploadJobId(), problemEquipMapper, logs, false);
+			uploadAdmEntities(uploadData.getProblemEquip(), operator, time, uploadData.getUploadJobId(), problemEquipMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getFile())) {
-			uploadAdmEntities(uploadData.getFile(), operator, time, uploadData.getUploadJobId(), fileMapper, logs, false);
+			uploadAdmEntities(uploadData.getFile(), operator, time, uploadData.getUploadJobId(), fileMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getQrCode())) {
-			uploadAdmEntities(uploadData.getQrCode(), operator, time, uploadData.getUploadJobId(), qrCodeMapper, logs, false);
+			uploadAdmEntities(uploadData.getQrCode(), operator, time, uploadData.getUploadJobId(), qrCodeMapper, null, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getServeArea())) {
-			uploadAdmEntities(uploadData.getServeArea(), operator, time, uploadData.getUploadJobId(), serveAreaMapper, logs, false);
+			uploadAdmEntities(uploadData.getServeArea(), operator, time, uploadData.getUploadJobId(), serveAreaMapper, null, logs, false);
 		}
 	}
 
-	private <T extends BaseAdmDataEntity> void uploadAdmEntities(List<T> list, String operator, String time, String jobId, BaseMapper<T> mapper, List<AdmUploadLog> logs, boolean merge) {
+	private <T extends BaseAdmDataEntity> void uploadAdmEntities(List<T> list, String operator, String time, String jobId, BaseMapper<T> mapper, D2mMessage d2mMessage, List<AdmUploadLog> logs, boolean merge) {
 		List<T> updateList = new ArrayList<>();
 		Iterator<T> iter = list.iterator();
 		while (iter.hasNext()) {
@@ -424,15 +506,32 @@ public class SyncAppImpl implements ISyncApp {
 			AdmUploadLog log;
 			if (entity.getState() == 1) {
 				updateList.add(entity);
-				iter.remove();;
+				iter.remove();
 
 				boolean remove = entity.getValid().intValue() == ValidEnum.FALSE.getType();
+
+				if(d2mMessage != null) {
+					if(remove)
+						d2mMessage.appendRemoveItem(entity);
+					else
+						d2mMessage.appendModifyItem(entity);
+				}
+
 				log = new AdmUploadLog(jobId, operator, remove ? AdmUploadLog.REMOVE : AdmUploadLog.MODIFY);
+
+				//任务空间不上传轮廓数据
+				if(entity instanceof AdmJobSpace)
+					((AdmJobSpace) entity).setOutline(null);
 			} else {
+				if(d2mMessage != null)
+					d2mMessage.appendAddItem(entity);
+
 				log = new AdmUploadLog(jobId, operator, AdmUploadLog.ADD);
 			}
 			log.setData(entity, objectMapper);
 			logs.add(log);
+
+			entity.setTs(null); //保存数据前,删除ts字段
 		}
 
 		//insert
@@ -467,6 +566,8 @@ public class SyncAppImpl implements ISyncApp {
 				mapper.updateById(entity);
 			}
 		}
+
+		sendD2mMessage(d2mMessage);
 	}
 
 	private <T extends BaseAdmDataEntity> T mergeEntity(T obj, T dbObj) {
@@ -486,36 +587,29 @@ public class SyncAppImpl implements ISyncApp {
 			return infos;
 	}
 
-	private void setDeliveryDataProps(BaseDeliveryEntity obj, BaseDeliveryEntity dbObj){
-		obj.setD2mState(ValidEnum.FALSE.getType());
-		obj.setDeliveryState(ValidEnum.FALSE.getType());
-
-		if(dbObj != null) {
-			obj.setClientId(dbObj.getClientId());
-			obj.setClientDevice(dbObj.getClientDevice());
+	private void sendD2mMessage(D2mMessage d2mMessage){
+		if (d2mMessage != null && d2mMessage.isNotEmpty()) {
+			if(d2mMessage.getAddItems() != null){
+				for(Object o : d2mMessage.getAddItems()) {
+					markM2dState(o);
+				}
+			}
+			if(d2mMessage.getModifyItems() != null){
+				for(Object o : d2mMessage.getModifyItems()) {
+					markM2dState(o);
+				}
+			}
+			if(d2mMessage.getRemoveItems() != null) {
+				for(Object o : d2mMessage.getRemoveItems()) {
+					markM2dState(o);
+				}
+			}
+			syncModel.sendMessageToModel(d2mMessage);
 		}
 	}
 
-	private void sendD2mMessage(String objectType, List<?> msgAdd, List<?> msgModify, List<?> msgRemove){
-		D2mMessage message = new D2mMessage();
-		message.setItemType(objectType);
-		message.setAddItems(msgAdd);
-		message.setModifyItems(msgModify);
-		message.setRemoveItems(msgRemove);
-
-		if(message.isNotEmpty())
-			syncModel.sendMessageToModel(message);
-	}
-
-	private List<String> buildExpiredIds(List<? extends BaseAdmDataEntity> expired){
-		if(expired.size() > 0) {
-			List<String> ids = new ArrayList<>();
-			for(BaseAdmDataEntity entity : expired) {
-				ids.add(entity.getId());
-			}
-			return ids;
-		}
-		return null;
+	private void markM2dState(Object item){
+		//TODO 标记数据同步状态
 	}
 
 }

+ 8 - 18
src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl0.java

@@ -3,6 +3,7 @@ package com.persagy.bdtp.adm.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -94,6 +95,10 @@ public class SyncAppImpl0 implements ISyncApp {
 	@Autowired
 	ResourceLoader resourceLoader;
 
+	@Override
+	public String getClientId(String userId) {
+		return IdUtil.fastSimpleUUID();
+	}
 
 	@Override
 	public Dict downloadDict(String groupCode, String projectId, String userId) {
@@ -142,7 +147,7 @@ public class SyncAppImpl0 implements ISyncApp {
 
 		//查询系统和设备定义
 		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, "system", "equipment");
-		List<TypeDef> typeList = queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+		List<TypeDef> typeList = ServiceUtil.queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
 
 		//查询重命名设备类型
 		ObjectNode renameNode = !newDict ? configService.queryRenameEquipTypes(projectId) : null;
@@ -205,20 +210,6 @@ public class SyncAppImpl0 implements ISyncApp {
 		return data;
 	}
 
-	private <T> List<T> queryAllPage(Supplier<CommonResult<List<T>>> action, QueryCriteria criteria, Pagination pagination){
-		List<T> list = null;
-		while (pagination.isHasNext()){
-			criteria.setPage((long)pagination.getPageNum());
-			criteria.setSize((long)pagination.getPageSize());
-			if(list == null)
-				list = ServiceUtil.call(action, pagination);
-			else
-				list.addAll(ServiceUtil.call(action, pagination));
-			pagination.next();
-		}
-		return list;
-	}
-
 	@Override
 	public Map<String, Object> downloadFrameData(String groupCode, String projectId, String userId) {
 		List<OProject> prjList = null;
@@ -468,9 +459,8 @@ public class SyncAppImpl0 implements ISyncApp {
 			return infos;
 	}
 
-	private void sendD2mMessage(String objectType, List<?> msgAdd, List<?> msgModify, List<?> msgRemove){
-		D2mMessage message = new D2mMessage();
-		message.setItemType(objectType);
+	private void sendD2mMessage(String objectType, List msgAdd, List msgModify, List msgRemove){
+		D2mMessage message = new D2mMessage(objectType);
 		message.setAddItems(msgAdd);
 		message.setModifyItems(msgModify);
 		message.setRemoveItems(msgRemove);

+ 1 - 1
src/main/java/com/persagy/bdtp/adm/service/impl/SyncOldAdmImpl.java

@@ -419,7 +419,7 @@ public class SyncOldAdmImpl implements ISyncOldAdm {
 
 				if (job == null) {
 					job = new AdmJobSpace();
-					job.setId(IdUtil.fastUUID());
+					job.setId(IdUtil.fastSimpleUUID());
 					job.setSpaceId(sp.getId());
 					job.setOutline((ArrayNode) sp.getInfo("outline"));
 					job.setArchState(AdmConst.JOB_STATE_PROCESSING);

+ 248 - 0
src/main/java/com/persagy/bdtp/adm/service/impl/SyncSpaceImpl.java

@@ -0,0 +1,248 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.databind.node.TextNode;
+import com.persagy.bdtp.adm.common.AdmConst;
+import com.persagy.bdtp.adm.dao.AdmJobSpaceMapper;
+import com.persagy.bdtp.adm.entity.Pagination;
+import com.persagy.bdtp.adm.entity.db.AdmJobSpace;
+import com.persagy.bdtp.adm.entity.db.AdmObject;
+import com.persagy.bdtp.adm.service.ISyncSpace;
+import com.persagy.bdtp.adm.service.ServiceUtil;
+import com.persagy.bdtp.adm.util.GeomUtil;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.constant.ValidEnum;
+import com.persagy.dmp.digital.client.DigitalObjectClient;
+import org.locationtech.jts.geom.Polygon;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.util.*;
+
+@Service
+public class SyncSpaceImpl implements ISyncSpace {
+
+	@Autowired
+	private ObjectMapper objectMapper;
+
+	@Autowired
+	private DigitalObjectClient objectClient;
+
+	@Autowired
+	private AdmJobSpaceMapper jobSpaceMapper;
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Map<String, Object> sync(String groupCode, String projectId, String userId, String floorId, String zone) {
+		if(StrUtil.isBlank(floorId))
+			floorId = null;
+
+		//查询bdtp的空间数据
+		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SPACE);
+		criteria.getCriteria().put("classCode", zone); //默认工作空间为物业分区
+		//按楼层查询
+		if (floorId != null) {
+			ObjectNode rt = criteria.getCriteria().putObject("relationTo");
+			rt.put("graphCode", "ArchSubset");
+			rt.put("relCode", "Fl2Sp");
+			rt.put("objFrom", floorId);
+		}
+		List<ObjectNode> spList = ServiceUtil.queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+
+		List<AdmJobSpace> toCreate = new ArrayList<>();
+		List<AdmJobSpace> toModify = new ArrayList<>();
+
+		if(floorId == null){
+			HashMap<String, List<ObjectNode>> floorMap = new HashMap<>();
+			for(ObjectNode sp : spList) {
+				JsonNode fId = sp.get("floorId");
+				if(fId != null) {
+					String flId = fId.asText();
+					List<ObjectNode> flSps = floorMap.get(flId);
+					if(flSps == null)
+						floorMap.put(flId, flSps = new ArrayList<>());
+					flSps.add(sp);
+				}
+			}
+
+			for (Map.Entry<String, List<ObjectNode>> entry : floorMap.entrySet()) {
+				syncByFloor(projectId, entry.getKey(), entry.getValue(), toCreate, toModify);
+			}
+		} else {
+			syncByFloor(projectId, floorId, spList, toCreate, toModify);
+		}
+
+		String time = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
+		for(AdmJobSpace job : toCreate) {
+			job.setCreationTime(time);
+			job.setCreator(AdmConst.CREATOR_SYNC);
+			jobSpaceMapper.insert(job);
+		}
+		for(AdmJobSpace job : toModify) {
+			job.setModifiedTime(time);
+			job.setModifier(AdmConst.CREATOR_SYNC);
+			jobSpaceMapper.updateById(job);
+		}
+
+		HashMap<String, Object> rtn = new HashMap<>();
+		rtn.put("syncSpaces", toCreate.size() + toModify.size());
+		return rtn;
+	}
+
+	private void syncByFloor(String projectId, String floorId, List<ObjectNode> spList, List<AdmJobSpace> toCreate, List<AdmJobSpace> toModify){
+		//查询任务空间数据
+		QueryWrapper<AdmJobSpace> wrapper = new QueryWrapper<>();
+		wrapper.eq("project_id", projectId).eq("floor_id", floorId).eq("valid", ValidEnum.TRUE.getType());
+		List<AdmJobSpace> jobSpaceList = jobSpaceMapper.selectList(wrapper);
+
+		HashMap<String, AdmJobSpace> jobMap = new HashMap<>(jobSpaceList.size());
+		jobSpaceList.forEach(job -> jobMap.put(job.getBimId() != null ? job.getBimId() : job.getSpaceId(), job));
+
+		//同步操作
+		for(ObjectNode sp : spList){
+			String spId = sp.get("id").asText();
+			String bimId = sp.get("bimId") != null ? sp.get("bimId").asText() : null;
+
+			ArrayNode spOutline = null;
+			Object o1 = sp.get("outline");
+			if(o1 instanceof TextNode) {
+				try {
+					spOutline = objectMapper.readValue(((TextNode) o1).asText().toLowerCase(), ArrayNode.class); //暂时toLowerCase()处理
+				} catch (IOException e) {
+
+				}
+			}
+			if(!GeomUtil.checkPolygon(spOutline))
+				continue;
+
+			AdmJobSpace job = jobMap.remove(bimId != null ? bimId : spId);
+			if(job != null) { //id匹配
+				boolean change = false;
+
+				//轮廓变化的空间,重置任务状态
+				if(!outlineMatch(job.getOutline(), spOutline)){
+					job.setArchState(AdmConst.JOB_STATE_PROCESSING);
+					job.setEquipState(AdmConst.JOB_STATE_PROCESSING);
+					job.setOutline(spOutline);
+					change = true;
+				}
+
+				//重置空间id
+				if(!Objects.equals(spId, job.getSpaceId()) || !Objects.equals(bimId, job.getBimId())) {
+					job.setBimId(bimId);
+					job.setSpaceId(spId);
+					change = true;
+				}
+
+				//轮廓和空间id都一致的,不需要做处理
+				if(change)
+					toModify.add(job);
+			} else { //bimId未匹配
+				job = matchByOutline(jobMap, sp);
+				if(job != null) { //轮廓完全一致的任务空间,重新设置bimId和spaceId
+					job.setBimId(bimId);
+
+					job.setSpaceId(spId);
+					toModify.add(job);
+				}
+			}
+
+			if (job == null) {
+				job = new AdmJobSpace();
+				job.setId(IdUtil.fastSimpleUUID());
+				job.setSpaceId(spId);
+				job.setBimId(bimId);
+				job.setOutline(spOutline);
+				job.setArchState(AdmConst.JOB_STATE_PROCESSING);
+				job.setEquipState(AdmConst.JOB_STATE_PROCESSING);
+				job.setProjectId(projectId);
+				job.setBuildingId(sp.get("buildingId").asText());
+				job.setFloorId(floorId != null ? floorId : sp.get("floorId").asText());
+				job.setValid(ValidEnum.TRUE.getType());
+
+				toCreate.add(job);
+			}
+		}
+
+		//未找到匹配关系的任务空间,删除
+		for(AdmJobSpace job : jobMap.values()){
+			job.setValid(ValidEnum.FALSE.getType());
+			toModify.add(job);
+		}
+	}
+
+	@Override
+	public Map<String, Object> sync(String groupCode, String projectId, String userId, String zone) {
+		return sync(groupCode, projectId, userId, null, zone);
+	}
+
+	private AdmJobSpace matchByOutline(HashMap<String, AdmJobSpace> jobMap, ObjectNode space){
+		if(jobMap.size() == 0)
+			return null;
+
+		ArrayNode o1 = (ArrayNode) space.get("outline");
+		if(!isValidOutline(o1))
+			return null;
+
+		Polygon[] ps = GeomUtil.getPolygon(o1);
+		Map.Entry<String, AdmJobSpace> target = null;
+		for(Map.Entry<String, AdmJobSpace> entry : jobMap.entrySet()){
+			ArrayNode o2 = entry.getValue().getOutline();
+			if(isValidOutline(o2) && polygonsMatch(ps, GeomUtil.getPolygon(o2))){
+				target = entry;
+				break;
+			}
+		}
+		if(target != null){
+			jobMap.remove(target.getKey());
+			return target.getValue();
+		}
+		return null;
+	}
+
+	/**
+	 * 判断空间轮廓是否变化
+	 * TODO 区分覆盖等情况
+	 */
+	private boolean outlineMatch(ArrayNode o1, ArrayNode o2){
+		return polygonsMatch(GeomUtil.getPolygon(o1), GeomUtil.getPolygon(o2));
+	}
+
+
+	/**
+	 * 轮廓匹配判断
+	 * TODO 暂不考虑顺序
+	 */
+	private boolean polygonsMatch(Polygon[] ps1, Polygon[] ps2){
+		if (ps1.length == ps2.length) {
+			for (int i = 0; i < ps2.length; i++) {
+				if (!ps1[i].equalsExact(ps2[i]))
+					return false;
+			}
+			return true;
+		}
+		return false;
+	}
+
+	private boolean isValidOutline(ArrayNode outline) {
+		if(outline != null && outline.size() > 0 && outline.get(0).isArray()) {
+			ArrayNode o1 = (ArrayNode) outline.get(0);
+			if (o1.size() > 0 && o1.get(0).isArray()) {
+				ArrayNode o2 = (ArrayNode) o1.get(0);
+				return o2.size() >= 3;
+			}
+		}
+		return false;
+	}
+
+}

+ 6 - 3
src/main/java/com/persagy/bdtp/adm/util/DataExtrasUtil.java

@@ -13,12 +13,12 @@ import java.util.Iterator;
 
 public class DataExtrasUtil {
 
-	private static HashSet<String> admObjFields = getEntityFields(ObjectDigital.class);
+	private static HashSet<String> admObjFields = getEntityFields(ObjectDigital.class, "building_id", "floor_id");
 
 	private static String objExtraCol = "infos";
 
-	private static HashSet<String> getEntityFields(Class<?> cls){
-		HashSet<String> set = new HashSet<String>();
+	private static HashSet<String> getEntityFields(Class<?> cls, String... extFields){
+		HashSet<String> set = new HashSet<>();
 		Field[] fields = ReflectUtil.getFields(cls);
 		for(Field field : fields) {
 			if(Modifier.isStatic(field.getModifiers()))
@@ -27,6 +27,9 @@ public class DataExtrasUtil {
 			if(tableField == null || tableField.exist())
 				set.add(field.getName());
 		}
+		for(String f : extFields) {
+			set.add(f);
+		}
 		return set;
 	}
 

+ 29 - 0
src/main/java/com/persagy/bdtp/adm/util/GeomUtil.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.CaseInsensitiveMap;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.GeometryFactory;
 import org.locationtech.jts.geom.LinearRing;
@@ -81,4 +82,32 @@ public class GeomUtil {
 		return coords;
 	}
 
+	public static boolean checkPolygon(ArrayNode outline){
+		if(outline == null || outline.size() == 0)
+			return false;
+
+		try {
+			Polygon[] ps = new Polygon[outline.size()];
+			for (int i = 0; i < ps.length; i++) {
+				ArrayNode space = (ArrayNode) outline.get(i);
+				if(space == null || space.size() == 0)
+					return false;
+
+				ArrayNode shellList = (ArrayNode) space.get(0);
+				LinearRing shell = geometryFactory.createLinearRing(buildCoords(shellList));
+				LinearRing[] holes = null;
+				if(space.size() > 1) {
+					holes = new LinearRing[space.size() - 1];
+					for (int n = 1; n < space.size(); n++) {
+						holes[n - 1] = geometryFactory.createLinearRing(buildCoords((ArrayNode) space.get(n)));
+					}
+				}
+				ps[i] = geometryFactory.createPolygon(shell, holes);
+			}
+		} catch (Exception e) {
+			return false;
+		}
+		return true;
+	}
+
 }

+ 28 - 28
src/main/resources/bootstrap.yml

@@ -6,7 +6,7 @@ server:
 spring:
   application:
     # 应用名称
-    name: adm
+    name: adm-poc-backend
   main:
     allow-bean-definition-overriding: true
   datasource:
@@ -14,45 +14,45 @@ spring:
       datasource:
         master:
           driver-class-name: com.mysql.cj.jdbc.Driver
-          username: adm
-          password: adm
-          url: jdbc:mysql://192.168.0.11/adm?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT
-#          username: yushudev
-#          password: yushu@2021
-#          url: jdbc:mysql://82.157.28.170:3306/adm_poc?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT
+#          username: adm
+#          password: adm
+#          url: jdbc:mysql://192.168.0.11/adm?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT
+          username: root
+          password: Bdtp@1qaz@WSX
+          url: jdbc:mysql://10.0.0.5:3306/adm-poc?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT
   rabbitmq:
-    host: 192.168.100.93
+#    host: 192.168.100.93
+#    port: 9936
+#    username: pbsage
+#    password: pbsage123
+#    virtualHost: /test
+    host: 82.156.204.212
     port: 9936
-    username: pbsage
-    password: pbsage123
+    username: admin
+    password: bdtp123456
     virtualHost: /test
-#    host: 10.10.0.46
-#    port: 9936
-#    username: dev
-#    password: dev@2021
-#    virtualHost: /dev
 persagy:
   common:
-    file:
-      storage: 0
-      url: http://192.168.100.102:31335/
-      accessKey: persagy
-      secretKey: persagy@2021
+#    file:
+#      storage: 0
+#      url: http://192.168.100.102:31335/
+#      accessKey: persagy
+#      secretKey: persagy@2021
     token:
       enabled: false
   adm:
     oldPlatformUrl: http://39.102.40.239
   bdtp:
     rwd:
-      service: http://develop.persagy.com/dmp-rwd
-#      service: http://82.157.159.41/dmp-rwd
+#      service: http://develop.persagy.com/dmp-rwd
+      service: http://82.157.151.123/dmp-rwd
     file:
-      service: http://develop.persagy.com/dmp-file
-#      service: http://82.157.159.41/dmp-file
+#      service: http://develop.persagy.com/dmp-file
+      service: http://82.157.151.123/dmp-file
     dic:
-      service: http://develop.persagy.com/dmp-dic
-#      service: http://82.157.159.41/dmp-dic
+#      service: http://develop.persagy.com/dmp-dic
+      service: http://82.157.151.123/dmp-dic
 mybatis-plus:
   type-handlers-package: com.persagy.**.typehandler
-  configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+#  configuration:
+#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl