zhaoyk il y a 3 ans
commit
b7a52748c3
70 fichiers modifiés avec 3098 ajouts et 0 suppressions
  1. 144 0
      pom.xml
  2. 30 0
      src/main/java/com/persagy/bdtp/adm/aop/ExceptionAspect.java
  3. 35 0
      src/main/java/com/persagy/bdtp/adm/client/DicClient.java
  4. 60 0
      src/main/java/com/persagy/bdtp/adm/client/OldAdmClient.java
  5. 52 0
      src/main/java/com/persagy/bdtp/adm/client/RwdClient.java
  6. 21 0
      src/main/java/com/persagy/bdtp/adm/common/AdmConst.java
  7. 32 0
      src/main/java/com/persagy/bdtp/adm/common/AdmMessageConst.java
  8. 20 0
      src/main/java/com/persagy/bdtp/adm/common/AdmRequest.java
  9. 60 0
      src/main/java/com/persagy/bdtp/adm/common/AdmResult.java
  10. 46 0
      src/main/java/com/persagy/bdtp/adm/config/AdmRabbitConfig.java
  11. 27 0
      src/main/java/com/persagy/bdtp/adm/config/TestConfig.java
  12. 118 0
      src/main/java/com/persagy/bdtp/adm/controller/AppController.java
  13. 30 0
      src/main/java/com/persagy/bdtp/adm/controller/ManageController.java
  14. 33 0
      src/main/java/com/persagy/bdtp/adm/controller/TestController.java
  15. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmComponentMapper.java
  16. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmConfigMapper.java
  17. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmFileMapper.java
  18. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmInfosConfigMapper.java
  19. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmJobSpaceMapper.java
  20. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmM2dEquipMapper.java
  21. 10 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmObjectMapper.java
  22. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmPipeConfigMapper.java
  23. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmProblemArchMapper.java
  24. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmProblemEquipMapper.java
  25. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmQrCodeMapper.java
  26. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmRelationMapper.java
  27. 8 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmRelsConfigMapper.java
  28. 20 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmComponent.java
  29. 25 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmConfig.java
  30. 46 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmFile.java
  31. 30 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmInfosConfig.java
  32. 50 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmJobSpace.java
  33. 20 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmM2dEquip.java
  34. 39 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmObject.java
  35. 24 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmPipeConfig.java
  36. 48 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmProblemArch.java
  37. 37 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmProblemEquip.java
  38. 46 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmQrCode.java
  39. 25 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmRelation.java
  40. 24 0
      src/main/java/com/persagy/bdtp/adm/entity/AdmRelsConfig.java
  41. 12 0
      src/main/java/com/persagy/bdtp/adm/entity/D2mMessage.java
  42. 31 0
      src/main/java/com/persagy/bdtp/adm/entity/Pagination.java
  43. 25 0
      src/main/java/com/persagy/bdtp/adm/entity/TypeDef.java
  44. 27 0
      src/main/java/com/persagy/bdtp/adm/entity/oldadm/OBase.java
  45. 19 0
      src/main/java/com/persagy/bdtp/adm/entity/oldadm/OBuilding.java
  46. 99 0
      src/main/java/com/persagy/bdtp/adm/entity/oldadm/OEquip.java
  47. 51 0
      src/main/java/com/persagy/bdtp/adm/entity/oldadm/OFloor.java
  48. 17 0
      src/main/java/com/persagy/bdtp/adm/entity/oldadm/OProject.java
  49. 79 0
      src/main/java/com/persagy/bdtp/adm/entity/oldadm/OSpace.java
  50. 20 0
      src/main/java/com/persagy/bdtp/adm/entity/oldadm/OldAdmResult.java
  51. 35 0
      src/main/java/com/persagy/bdtp/adm/handler/M2DMessageHandler.java
  52. 17 0
      src/main/java/com/persagy/bdtp/adm/service/CallException.java
  53. 45 0
      src/main/java/com/persagy/bdtp/adm/service/IAdmObjectService.java
  54. 21 0
      src/main/java/com/persagy/bdtp/adm/service/IConfigService.java
  55. 29 0
      src/main/java/com/persagy/bdtp/adm/service/IQueryFromOldAdm.java
  56. 16 0
      src/main/java/com/persagy/bdtp/adm/service/ISyncApp.java
  57. 20 0
      src/main/java/com/persagy/bdtp/adm/service/ISyncModel.java
  58. 14 0
      src/main/java/com/persagy/bdtp/adm/service/ISyncOldAdm.java
  59. 49 0
      src/main/java/com/persagy/bdtp/adm/service/ServiceUtil.java
  60. 72 0
      src/main/java/com/persagy/bdtp/adm/service/impl/AdmObjectServiceImpl.java
  61. 61 0
      src/main/java/com/persagy/bdtp/adm/service/impl/ConfigServiceImpl.java
  62. 110 0
      src/main/java/com/persagy/bdtp/adm/service/impl/QueryFromOldAdmImpl.java
  63. 197 0
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl.java
  64. 32 0
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncModelImpl.java
  65. 506 0
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncOldAdmImpl.java
  66. 38 0
      src/main/java/com/persagy/bdtp/adm/util/AdmMessageHelper.java
  67. 26 0
      src/main/resources/bootstrap.yml
  68. 47 0
      src/main/resources/mapper/AdmObjectMapper.xml
  69. 87 0
      src/main/resources/mybatis-generator/generatorConfig.xml
  70. 48 0
      src/test/java/com/persagy/bdtp/adm/test/AdmApplicationTests.java

+ 144 - 0
pom.xml

@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>dmp-package</artifactId>
+        <groupId>com.persagy</groupId>
+        <version>1.0.0</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <groupId>com.persagy</groupId>
+    <artifactId>adm</artifactId>
+    <packaging>jar</packaging>
+    <version>1.0.0</version>
+    <name>adm</name>
+    <description>数字化交付工具服务端</description>
+
+    <repositories>
+        <repository>
+            <id>Persagy</id>
+            <name>persagy</name>
+            <url>http://47.93.132.139:8081/nexus/content/groups/public/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+        <repository>
+            <id>persagy</id>
+            <name>releases Repository</name>
+            <url>http://47.93.132.139:8081/nexus/content/repositories/persagy/</url>
+            <layout>default</layout>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+        </repository>
+
+        <repository>
+            <id>osgeo</id>
+            <name>Open Source Geospatial Foundation Repository</name>
+            <url>https://repo.osgeo.org/repository/release/</url>
+        </repository>
+    </repositories>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <easyexcel.version>2.2.8</easyexcel.version>
+    </properties>
+
+    <dependencies>
+        <!-- 配置中心(包含注册中心) -->
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>integrated-config-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-amqp-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-digital-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-server</artifactId>
+        </dependency>
+        <!--<dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-file-starter</artifactId>
+            <version>1.0.0</version>
+        </dependency>-->
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>dmp-mybatis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.locationtech.jts</groupId>
+            <artifactId>jts-core</artifactId>
+            <version>1.16.1</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>jsr311-api</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>${easyexcel.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.mybatis.generator</groupId>
+                <artifactId>mybatis-generator-maven-plugin</artifactId>
+                <version>1.3.2</version>
+                <configuration>
+                    <configurationFile>src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>
+                    <verbose>true</verbose>
+                    <overwrite>true</overwrite>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>Generate MyBatis Artifacts</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <dependencies>
+                    <dependency>
+                        <groupId>mysql</groupId>
+                        <artifactId>mysql-connector-java</artifactId>
+                        <version>8.0.15</version>
+                    </dependency>
+                    <dependency>
+                        <groupId>org.mybatis.generator</groupId>
+                        <artifactId>mybatis-generator-core</artifactId>
+                        <version>1.3.2</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 30 - 0
src/main/java/com/persagy/bdtp/adm/aop/ExceptionAspect.java

@@ -0,0 +1,30 @@
+package com.persagy.bdtp.adm.aop;
+
+import com.persagy.bdtp.adm.service.CallException;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+@Component
+@Aspect
+@Slf4j
+public class ExceptionAspect {
+
+    @Pointcut("execution(public * com.persagy.bdtp.adm.controller.AppController.*(..))")
+    public void handle(){
+
+    }
+
+    @Around("handle()")
+    public Object aroundInvoke(ProceedingJoinPoint point) throws Throwable {
+        try{
+            return point.proceed(point.getArgs());
+        } catch (CallException e) {
+            return e.getErrorResult();
+        }
+    }
+
+}

+ 35 - 0
src/main/java/com/persagy/bdtp/adm/client/DicClient.java

@@ -0,0 +1,35 @@
+package com.persagy.bdtp.adm.client;
+
+import com.persagy.dmp.basic.config.DigitalFeignConfig;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.model.response.CommonResult;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(name = "dmp-dic", configuration = DigitalFeignConfig.class,
+		url = "${persagy.bdtp.rwd.service:}")
+public interface DicClient {
+
+	/**
+	 * 查询类型定义
+	 * @param groupCode 集团编码
+	 * @param projectId 项目ID
+	 * @param appId 应用ID
+	 * @param userId 用户ID
+	 * @param criteria 查询条件
+	 * @return 类型定义
+	 */
+	@PostMapping("/dic/dt/data/query")
+	CommonResult<List<Map<String, Object>>> dataQuery(
+			@RequestParam("groupCode") String groupCode,
+			@RequestParam("projectId") String projectId,
+			@RequestParam("appId") String appId,
+			@RequestParam("userId") String userId,
+			@RequestBody QueryCriteria criteria);
+
+}

+ 60 - 0
src/main/java/com/persagy/bdtp/adm/client/OldAdmClient.java

@@ -0,0 +1,60 @@
+package com.persagy.bdtp.adm.client;
+
+import com.persagy.bdtp.adm.entity.oldadm.*;
+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.*;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(name = "amd-old", configuration = DigitalFeignConfig.class,
+		url = "${persagy.adm.oldPlatformUrl}")
+public interface OldAdmClient {
+
+	@PostMapping("/persagy-sso-server/users/login")
+	Map<String, Object> login(
+			@RequestBody Map<String, Object> params);
+
+	@PostMapping("/datacenter/object/project/query")
+	OldAdmResult<List<OProject>> queryProject(
+			@RequestHeader("groupCode") String groupCode,
+			@RequestHeader("projectId") String projectId,
+			@RequestHeader("appId") String appId,
+			@RequestHeader("userId") String userId,
+			@RequestHeader("token") String token,
+			@RequestBody Map<String, Object> params);
+
+	@PostMapping("/datacenter/object/building/query")
+	OldAdmResult<List<OBuilding>> queryBuilding(
+			@RequestHeader("groupCode") String groupCode,
+			@RequestHeader("projectId") String projectId,
+			@RequestHeader("appId") String appId,
+			@RequestHeader("userId") String userId,
+			@RequestHeader("token") String token,
+			@RequestBody Map<String, Object> params);
+
+	@PostMapping("/datacenter/object/zone/query")
+	OldAdmResult<List<OSpace>> querySpace(
+			@RequestHeader("groupCode") String groupCode,
+			@RequestHeader("projectId") String projectId,
+			@RequestHeader("appId") String appId,
+			@RequestHeader("userId") String userId,
+			@RequestHeader("token") String token,
+			@RequestBody Map<String, Object> params);
+
+	@PostMapping("/datacenter/object/equip/query")
+	OldAdmResult<List<OEquip>> queryEquip(
+			@RequestHeader("groupCode") String groupCode,
+			@RequestHeader("projectId") String projectId,
+			@RequestHeader("appId") String appId,
+			@RequestHeader("userId") String userId,
+			@RequestHeader("token") String token,
+			@RequestBody Map<String, Object> params);
+
+	@GetMapping(value = "/image-service/common/file_get",consumes = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+	Response getFloorMap(@RequestParam String key, @RequestParam String systemId);
+
+}

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

@@ -0,0 +1,52 @@
+package com.persagy.bdtp.adm.client;
+
+import com.persagy.bdtp.adm.entity.TypeDef;
+import com.persagy.dmp.basic.config.DigitalFeignConfig;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.define.entity.RelationDefine;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+@FeignClient(name = "dmp-rwd", configuration = DigitalFeignConfig.class,
+		url = "${persagy.bdtp.rwd.service:}")
+public interface RwdClient {
+
+	/**
+	 * 查询类型定义
+	 * @param groupCode 集团编码
+	 * @param projectId 项目ID
+	 * @param appId 应用ID
+	 * @param userId 用户ID
+	 * @param criteria 查询条件
+	 * @return 类型定义
+	 */
+	@PostMapping("/rwd/def/class")
+	CommonResult<List<TypeDef>> queryObjectType(
+			@RequestParam("groupCode") String groupCode,
+			@RequestParam("projectId") String projectId,
+			@RequestParam("appId") String appId,
+			@RequestParam("userId") String userId,
+			@RequestBody QueryCriteria criteria);
+
+	/**
+	 * 查询边类型
+	 * @param groupCode: 集团编码
+	 * @param projectId: 项目ID
+	 * @param appId: 应用ID
+	 * @param userId: 用户ID
+	 * @param criteria: 查询条件
+	 * @return 边类型数组
+	 */
+	@PostMapping("/rwd/def/rel/query")
+	CommonResult<List<RelationDefine>> queryRelDef(@RequestParam("groupCode") String groupCode,
+											 @RequestParam("projectId") String projectId,
+											 @RequestParam("appId") String appId,
+											 @RequestParam("userId") String userId,
+											 @RequestBody QueryCriteria criteria);
+
+}

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

@@ -0,0 +1,21 @@
+package com.persagy.bdtp.adm.common;
+
+public interface AdmConst {
+
+	String APP_ID = "adm";
+
+	int JOB_STATE_TODO = 0;
+
+	int JOB_STATE_PROCESSING = 1;
+
+	int JOB_STATE_FINISHED = 2;
+
+	String OBJ_TYPE_BUILDING = "building";
+
+	String OBJ_TYPE_FLOOR = "floor";
+
+	String OBJ_TYPE_SPACE = "space";
+
+	String OBJ_TYPE_EQUIPMENT = "equipment";
+
+}

+ 32 - 0
src/main/java/com/persagy/bdtp/adm/common/AdmMessageConst.java

@@ -0,0 +1,32 @@
+package com.persagy.bdtp.adm.common;
+
+public interface AdmMessageConst {
+
+    /** 消息-exchange */
+    String ADM_EXCHANGE = "bdtp.adm.topic";
+    /** 消息-路由Key 数据->模型 */
+    String ADM_D2M_ROUTING = "bdtp.adm.d2m.routing";
+    /** 队列 数据->模型 */
+    String ADM_D2M_QUEUE = "bdtp.adm.d2m.queue";
+
+    /** 消息-exchange 模型->数据 */
+    String M2D_EXCHANGE = "bdtp.adm.m2d.topic";
+    /** 消息-路由Key 模型->数据 */
+    String M2D_ROUTING = "bdtp.adm.m2d.routing";
+
+    String M2D_QUEUE = "bdtp.adm.m2d.queue";
+
+    /** 新增前 */
+    String OPERATE_BEFORE_INSERT = "BeforeInsert";
+    /** 修改前 */
+    String OPERATE_BEFORE_UPDATE = "BeforeUpdate";
+    /** 删除前 */
+    String OPERATE_BEFORE_DELETE = "BeforeDelete";
+    /** 新增后 */
+    String OPERATE_AFTER_INSERT = "AfterInsert";
+    /** 修改后 */
+    String OPERATE_AFTER_UPDATE = "AfterUpdate";
+    /** 删除后 */
+    String OPERATE_AFTER_DELETE = "AfterDelete";
+
+}

+ 20 - 0
src/main/java/com/persagy/bdtp/adm/common/AdmRequest.java

@@ -0,0 +1,20 @@
+package com.persagy.bdtp.adm.common;
+
+import lombok.Data;
+
+@Data
+public class AdmRequest {
+
+	private String userId;
+
+	private String projectId;
+
+	private String groupCode;
+
+	private String floorId;
+
+	private String uploadFlag;
+
+	private String lastDownloadTime;
+
+}

+ 60 - 0
src/main/java/com/persagy/bdtp/adm/common/AdmResult.java

@@ -0,0 +1,60 @@
+package com.persagy.bdtp.adm.common;
+
+import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.model.response.CommonResult;
+import lombok.Data;
+
+@Data
+public class AdmResult<T> {
+
+	private String code;
+
+	private String message;
+
+	private T data;
+
+	public AdmResult(String code, String message) {
+		this(code, message, null);
+	}
+
+	public AdmResult(String code, String message, T data) {
+		this.code = code;
+		this.message = message;
+		this.data = data;
+	}
+
+	public AdmResult(CommonResult<T> commonResult) {
+		this.code = commonResult.getResult();
+		this.message = commonResult.getMessage();
+		this.data = commonResult.getData();
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+	public void setMessage(String message) {
+		this.message = message;
+	}
+
+	public T getData() {
+		return data;
+	}
+
+	public void setData(T data) {
+		this.data = data;
+	}
+
+	public static <T> AdmResult<T> success(T data){
+		return new AdmResult<>(ResponseCode.A00000.getCode(), null, data);
+	}
+
+}

+ 46 - 0
src/main/java/com/persagy/bdtp/adm/config/AdmRabbitConfig.java

@@ -0,0 +1,46 @@
+package com.persagy.bdtp.adm.config;
+
+import com.persagy.bdtp.adm.common.AdmMessageConst;
+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.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Slf4j
+@Configuration
+public class AdmRabbitConfig {
+
+    @Bean
+    public TopicExchange m2dExchange() {
+        return new TopicExchange(AdmMessageConst.M2D_EXCHANGE);
+    }
+
+    @Bean
+    public Queue m2dQueue(){
+        return new Queue(AdmMessageConst.M2D_QUEUE);
+    }
+
+    @Bean
+    public Binding m2dBinding() {
+        return BindingBuilder.bind(m2dQueue()).to(m2dExchange()).with(AdmMessageConst.M2D_ROUTING);
+    }
+
+    @Bean
+    public TopicExchange admExchange() {
+        return new TopicExchange(AdmMessageConst.ADM_EXCHANGE);
+    }
+
+    @Bean
+    public Queue admD2mQueue(){
+        return new Queue(AdmMessageConst.ADM_D2M_QUEUE);
+    }
+
+    @Bean
+    public Binding admD2mBinding() {
+        return BindingBuilder.bind(admD2mQueue()).to(admExchange()).with(AdmMessageConst.ADM_D2M_ROUTING);
+    }
+
+}

+ 27 - 0
src/main/java/com/persagy/bdtp/adm/config/TestConfig.java

@@ -0,0 +1,27 @@
+package com.persagy.bdtp.adm.config;
+
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.util.Map;
+
+@Configuration
+@AutoConfigureAfter({DataSourceAutoConfiguration.class})
+public class TestConfig {
+
+	@Bean
+	public String test(ApplicationContext ctx){
+		try {
+			Map map = ctx.getBeansOfType(DataSource.class);
+			System.out.println(map);
+		} catch (Exception var4) {
+
+		}
+		return "";
+	}
+
+}

+ 118 - 0
src/main/java/com/persagy/bdtp/adm/controller/AppController.java

@@ -0,0 +1,118 @@
+package com.persagy.bdtp.adm.controller;
+
+import com.persagy.bdtp.adm.client.OldAdmClient;
+import com.persagy.bdtp.adm.common.AdmRequest;
+import com.persagy.bdtp.adm.common.AdmResult;
+import com.persagy.bdtp.adm.service.ISyncApp;
+import feign.Response;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/adm")
+public class AppController {
+
+	@Autowired
+	private OldAdmClient admClient;
+
+	@Autowired
+	private ISyncApp syncApp;
+
+	@RequestMapping("/frame")
+	public AdmResult<Map<String, Object>> frame(@RequestBody AdmRequest req){
+//		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+//
+//		List<ObjectNode> prjList = ServiceUtil.call(() -> objClient.query(req.getGroupCode(), req.getProjectId(), AdmConst.APP_ID, req.getUserId(), getQueryCriteria("project", objectMapper)));
+//
+//		//建筑和楼层,暂时从dbtp获取
+//		List<ObjectNode> bdList = ServiceUtil.call(() -> objClient.query(req.getGroupCode(), req.getProjectId(), AdmConst.APP_ID, req.getUserId(), getQueryCriteria("building", objectMapper)));
+//
+//		QueryCriteria flCriteria = getQueryCriteria("floor", objectMapper);
+//		flCriteria.getCriteria().putObject("relationTo").put("graphCode", "ArchSubset").put("relCode", "Bd2Fl");
+//		List<ObjectNode> flList = ServiceUtil.call(() -> objClient.query(req.getGroupCode(), req.getProjectId(), AdmConst.APP_ID, req.getUserId(), flCriteria));
+//
+//		QueryCriteria relCriteria = getQueryCriteria(null, objectMapper);
+//		relCriteria.getCriteria().put("graphCode", "ArchSubset").put("relCode", "Bd2Fl");
+//		List<ObjectRelation> relList = ServiceUtil.call(() -> relationClient.query(req.getGroupCode(), req.getProjectId(), AdmConst.APP_ID, req.getUserId(), relCriteria));
+//
+//		//为楼层数据设置buildingId
+//		for(ObjectNode n : flList){
+//			String flId = n.get("id").asText();
+//			for(ObjectRelation r : relList){
+//				if(r.getObjTo().equals(flId)){
+//					n.put("buildingId", r.getObjFrom());
+//					relList.remove(r);
+//					break;
+//				}
+//			}
+//		}
+//
+//		HashMap<String, Object> data = new HashMap<>();
+//		data.put("projects", prjList);
+//		data.put("buildings", bdList);
+//		data.put("floors", flList);
+//		return AdmResult.success(data);
+
+		return AdmResult.success(syncApp.downloadFrameData(req.getGroupCode(), req.getProjectId(), req.getUserId()));
+	}
+
+	@RequestMapping("/dict")
+	public AdmResult<Map<String, Object>> dict(@RequestBody AdmRequest req){
+		return AdmResult.success(syncApp.downloadDictAndConfig(req.getGroupCode(), req.getProjectId(), req.getUserId()));
+	}
+
+	@RequestMapping("/download")
+	public AdmResult<Map<String, Object>> download(@RequestBody AdmRequest req){
+		return AdmResult.success(syncApp.downloadFloorData(req.getProjectId(), req.getFloorId()));
+	}
+
+	@RequestMapping("/downloadMap")
+	public void downloadMap(HttpServletRequest request, HttpServletResponse response, @RequestParam String key){
+		InputStream inputStream = null;
+		try {
+			Response serviceResponse = admClient.getFloorMap(key, "revit");
+			Response.Body body = serviceResponse.body();
+
+			inputStream = body.asInputStream();
+			BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
+			Object o = serviceResponse.headers().get("Content-Disposition");
+			String contentDisposition = o != null ? o.toString().replace("[","").replace("]","") : "attachment;filename=map.jsonz";
+			response.setHeader("Content-Disposition", contentDisposition);
+			BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
+			int length = 0;
+			byte[] temp = new byte[1024 * 10];
+			while ((length = bufferedInputStream.read(temp)) != -1) {
+				bufferedOutputStream.write(temp, 0, length);
+			}
+			bufferedOutputStream.flush();
+			bufferedOutputStream.close();
+			bufferedInputStream.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@RequestMapping("/upload")
+	public AdmResult upload(){
+		//任务状态数据
+		//核查问题数据
+		//设备数据
+		//关系数据
+		return null;
+	}
+
+	@PostMapping("/uploadFile")
+	public AdmResult uploadFile(){
+		//TODO
+		return null;
+	}
+
+}

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

@@ -0,0 +1,30 @@
+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 org.springframework.beans.factory.annotation.Autowired;
+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;
+
+@RestController
+@RequestMapping("/manage")
+public class ManageController {
+
+	@Autowired
+	private ISyncOldAdm syncOldAdm;
+
+	@RequestMapping("/syncOldAdm")
+	public AdmResult<Object> syncOldAdm(@RequestBody AdmRequest req){
+		String groupCode = req.getGroupCode();
+		String projectId = req.getProjectId();
+
+		Map<String, Object> syncResult = syncOldAdm.syncData(groupCode, projectId);
+		syncOldAdm.handleJobSpace(projectId);
+		return AdmResult.success(syncResult);
+	}
+
+}

+ 33 - 0
src/main/java/com/persagy/bdtp/adm/controller/TestController.java

@@ -0,0 +1,33 @@
+package com.persagy.bdtp.adm.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.persagy.bdtp.adm.common.AdmRequest;
+import com.persagy.bdtp.adm.common.AdmResult;
+import com.persagy.bdtp.adm.dao.AdmObjectMapper;
+import com.persagy.bdtp.adm.entity.AdmObject;
+import com.persagy.bdtp.adm.entity.Pagination;
+import com.persagy.bdtp.adm.service.ISyncModel;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+
+	@Autowired
+	private ISyncModel syncModel;
+
+	@Autowired
+	private AdmObjectMapper admObjectMapper;
+
+	@RequestMapping("/testMq")
+	public AdmResult<Object> testMq(@RequestBody AdmRequest req){
+		AdmObject obj = admObjectMapper.selectOne(new QueryWrapper<AdmObject>().eq("id", "Eq00022200023a8d5a59a7fb49a89dfa6ae746518bc2"));
+		obj.getInfos().put("comp_type", "FFFAAL-声光报警器");
+		syncModel.sendMessageToModel(ISyncModel.OPERATOR_ADD, obj);
+		return AdmResult.success(null);
+	}
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmComponentMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmComponent;
+
+public interface AdmComponentMapper extends BaseMapper<AdmComponent> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmConfigMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmConfig;
+
+public interface AdmConfigMapper extends BaseMapper<AdmConfig> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmFileMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmFile;
+
+public interface AdmFileMapper extends BaseMapper<AdmFile> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmInfosConfigMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmInfosConfig;
+
+public interface AdmInfosConfigMapper extends BaseMapper<AdmInfosConfig> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmJobSpaceMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmJobSpace;
+
+public interface AdmJobSpaceMapper extends BaseMapper<AdmJobSpace> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmM2dEquipMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmM2dEquip;
+
+public interface AdmM2dEquipMapper extends BaseMapper<AdmM2dEquip> {
+
+}

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

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

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmPipeConfigMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmPipeConfig;
+
+public interface AdmPipeConfigMapper extends BaseMapper<AdmPipeConfig> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmProblemArchMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmProblemArch;
+
+public interface AdmProblemArchMapper extends BaseMapper<AdmProblemArch> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmProblemEquipMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmProblemEquip;
+
+public interface AdmProblemEquipMapper extends BaseMapper<AdmProblemEquip> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmQrCodeMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmQrCode;
+
+public interface AdmQrCodeMapper extends BaseMapper<AdmQrCode> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmRelationMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmRelation;
+
+public interface AdmRelationMapper extends BaseMapper<AdmRelation> {
+
+}

+ 8 - 0
src/main/java/com/persagy/bdtp/adm/dao/AdmRelsConfigMapper.java

@@ -0,0 +1,8 @@
+package com.persagy.bdtp.adm.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.persagy.bdtp.adm.entity.AdmRelsConfig;
+
+public interface AdmRelsConfigMapper extends BaseMapper<AdmRelsConfig> {
+
+}

+ 20 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmComponent.java

@@ -0,0 +1,20 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_component",autoResultMap = true)
+public class AdmComponent {
+
+	private String id;
+
+	private String compCode;
+
+	private String compName;
+
+	private String systemCode;
+
+	private String classCode;
+
+}

+ 25 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmConfig.java

@@ -0,0 +1,25 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_config",autoResultMap = true)
+public class AdmConfig {
+
+	private String id;
+
+	private String name;
+
+	private String code;
+
+	@TableField(
+			typeHandler = JacksonTypeHandler.class
+	)
+	private JsonNode data;
+
+}

+ 46 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmFile.java

@@ -0,0 +1,46 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_file",autoResultMap = true)
+public class AdmFile {
+
+    private String id;
+
+    private String fileType;
+
+    private String bizType;
+
+    private String filePath;
+
+    private String clientPath;
+
+    private String refObjId;
+
+    private String refInfoCode;
+
+    private String remark;
+
+    private Integer orderNum;
+
+    private String projectId;
+
+    private String floorId;
+
+    private String buildingId;
+
+    private String creator;
+
+    private String creationTime;
+
+    private String modifier;
+
+    private String modifiedTime;
+
+    private Integer valid;
+
+    private String uploadFlag;
+
+}

+ 30 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmInfosConfig.java

@@ -0,0 +1,30 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_infos_config",autoResultMap = true)
+public class AdmInfosConfig {
+
+    private String id;
+
+    private String objType;
+
+    private String name;
+
+    private String classCode;
+
+    private String majorCode;
+
+    private String systemCode;
+
+    @TableField(
+            typeHandler = JacksonTypeHandler.class
+    )
+    private ObjectNode infos;
+
+}

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

@@ -0,0 +1,50 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_job_space",autoResultMap = true)
+public class AdmJobSpace {
+
+    private String id;
+
+    private String workId;
+
+    private String spaceId;
+
+    private String spaceType;
+
+    private String parentSpaceId;
+
+    private Integer archState;
+
+    private Integer equipState;
+
+    private String projectId;
+
+    private String buildingId;
+
+    private String floorId;
+
+    private String creator;
+
+    private String creationTime;
+
+    private String modifier;
+
+    private String modifiedTime;
+
+    private Integer valid;
+
+    @TableField(
+            typeHandler = JacksonTypeHandler.class
+    )
+    private ArrayNode outline;
+
+    private String uploadFlag;
+
+}

+ 20 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmM2dEquip.java

@@ -0,0 +1,20 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_m2d_equip",autoResultMap = true)
+public class AdmM2dEquip {
+
+    private String id;
+
+    private String name;
+
+    private String majorCode;
+
+    private String systemCode;
+
+    private String classCode;
+
+}

+ 39 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmObject.java

@@ -0,0 +1,39 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.digital.entity.ObjectDigital;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_object",autoResultMap = true)
+public class AdmObject extends ObjectDigital {
+
+	/** 创建对象的本地设备(移动端) */
+	private String clientDevice;
+
+	/** 由本地设备生成的对象id */
+	private String clientId;
+
+	/**  数模同步状态:0未同步, 1已同步 */
+	private Integer d2mState;
+
+	/** 交付BDTP状态:1已交付,0待交付 */
+	private Integer deliveryState;
+
+	private String buildingId;
+
+	private String floorId;
+
+	/** app端上传数据标记 */
+	private String uploadFlag;
+
+	public JsonNode getInfo(String infoCode){
+		ObjectNode node = getInfos();
+		if(node != null)
+			return node.get(infoCode);
+		return null;
+	}
+
+}

+ 24 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmPipeConfig.java

@@ -0,0 +1,24 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_pipe_config",autoResultMap = true)
+public class AdmPipeConfig {
+
+    private String id;
+
+    private String classCodeFrom;
+
+    private String pipeType;
+
+    private String pipeSubType;
+
+    private Integer pipeDirection;
+
+    private String pipeDescription;
+
+    private String classCodeTo;
+
+}

+ 48 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmProblemArch.java

@@ -0,0 +1,48 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@TableName(value = "adm_problem_arch",autoResultMap = true)
+public class AdmProblemArch {
+
+    private String id;
+
+    private String workId;
+
+    private String floorId;
+
+    private String projectId;
+
+    private String buildingId;
+
+    private String geomType;
+
+    private String problemType;
+
+    private String message;
+
+    private Integer problemState;
+
+    private String creator;
+
+    private String creationTime;
+
+    private String modifier;
+
+    private String modifiedTime;
+
+    private String uploadFlag;
+
+    @TableField(
+            typeHandler = JacksonTypeHandler.class
+    )
+    private List<ObjectNode> geom;
+
+}

+ 37 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmProblemEquip.java

@@ -0,0 +1,37 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_problem_equip",autoResultMap = true)
+public class AdmProblemEquip {
+    private String id;
+
+    private String workId;
+
+    private String floorId;
+
+    private String projectId;
+
+    private String buildingId;
+
+    private String equipId;
+
+    private String problemType;
+
+    private String message;
+
+    private Integer problemState;
+
+    private String creator;
+
+    private String creationTime;
+
+    private String modifier;
+
+    private String modifiedTime;
+
+    private String uploadFlag;
+
+}

+ 46 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmQrCode.java

@@ -0,0 +1,46 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@TableName(value = "adm_qr_code",autoResultMap = true)
+public class AdmQrCode {
+
+    private String id;
+
+    private String qrCode;
+
+    private String objId;
+
+    private String floorId;
+
+    @TableField(
+            typeHandler = JacksonTypeHandler.class
+    )
+    private ObjectNode location;
+
+    private String remark;
+
+    private String projectId;
+
+    private String buildingId;
+
+    private String creator;
+
+    private String creationTime;
+
+    private String modifier;
+
+    private String modifiedTime;
+
+    private Integer valid;
+
+    private String uploadFlag;
+
+}

+ 25 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmRelation.java

@@ -0,0 +1,25 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_relation",autoResultMap = true)
+public class AdmRelation extends ObjectRelation {
+
+    private String clientDevice;
+
+    private String clientId;
+
+    private Integer d2mState;
+
+    private Integer deliveryState;
+
+    private String buildingId;
+
+    private String floorId;
+
+    private String uploadFlag;
+
+}

+ 24 - 0
src/main/java/com/persagy/bdtp/adm/entity/AdmRelsConfig.java

@@ -0,0 +1,24 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName(value = "adm_rels_config",autoResultMap = true)
+public class AdmRelsConfig {
+
+    private String id;
+
+    private String objTypeFrom;
+
+    private String classCodeFrom;
+
+    private String graphCode;
+
+    private String relCode;
+
+    private String objTypeTo;
+
+    private String classCodeTo;
+
+}

+ 12 - 0
src/main/java/com/persagy/bdtp/adm/entity/D2mMessage.java

@@ -0,0 +1,12 @@
+package com.persagy.bdtp.adm.entity;
+
+import lombok.Data;
+
+@Data
+public class D2mMessage {
+
+	private String operation;
+
+	private Object objs;
+
+}

+ 31 - 0
src/main/java/com/persagy/bdtp/adm/entity/Pagination.java

@@ -0,0 +1,31 @@
+package com.persagy.bdtp.adm.entity;
+
+import lombok.Data;
+
+/**
+ * 调用服务时记录分页信息
+ */
+@Data
+public class Pagination {
+
+	private int pageNum = 1;
+
+	private int pageSize;
+
+	private int total = -1;
+
+	private boolean hasNext = true;
+
+	public Pagination(int pageSize) {
+		this.pageSize = pageSize;
+	}
+
+	public void next() {
+		pageNum++;
+		if ((pageNum - 1) * pageSize >= total)
+			hasNext = false;
+		else
+			hasNext = true;
+	}
+
+}

+ 25 - 0
src/main/java/com/persagy/bdtp/adm/entity/TypeDef.java

@@ -0,0 +1,25 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.persagy.dmp.define.entity.ObjectTypeDefine;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 类型定义,封装children操作,支持树形结构
+ */
+public class TypeDef extends ObjectTypeDefine {
+
+	private List<TypeDef> children;
+
+	public void addChild(TypeDef child){
+		if(children == null)
+			children = new LinkedList<>();
+		children.add(child);
+	}
+
+	public List<? extends TypeDef> getChildren() {
+		return children;
+	}
+
+}

+ 27 - 0
src/main/java/com/persagy/bdtp/adm/entity/oldadm/OBase.java

@@ -0,0 +1,27 @@
+package com.persagy.bdtp.adm.entity.oldadm;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.Map;
+
+@Data
+abstract public class OBase {
+
+	private String id;
+
+	private String name;
+
+	private String localId;
+
+	private String localName;
+
+	private String objectType;
+
+	private Map<String, Object> infos;
+
+	private Date createTime;
+
+	private Date lastUpdate;
+
+}

+ 19 - 0
src/main/java/com/persagy/bdtp/adm/entity/oldadm/OBuilding.java

@@ -0,0 +1,19 @@
+package com.persagy.bdtp.adm.entity.oldadm;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OBuilding extends OBase {
+
+	/** 项目ID */
+	private String projectId;
+	/** 平台默认二维码 */
+	private String defaultQRCode;
+	/** 建筑二维码图片 */
+	private String buildQRCode;
+
+	private List<OFloor> floor;
+
+}

+ 99 - 0
src/main/java/com/persagy/bdtp/adm/entity/oldadm/OEquip.java

@@ -0,0 +1,99 @@
+package com.persagy.bdtp.adm.entity.oldadm;
+
+import com.fasterxml.jackson.annotation.JsonAlias;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class OEquip extends OBase {
+
+	/** 二维码内容 */
+	private String defaultQRCode;
+	/** 设计图纸中编码 */
+	private String cadId;
+	/** RFID标识 */
+	private String rfId;
+
+
+	/** BIM模型中编码 */
+	private String bimId;
+	/** BIM构建编码 */
+	private String bimTypeId;
+	/** BIM模型中坐标 */
+	private String bimLocation;
+	/** 坐标对象数据 */
+	@JsonProperty("location")
+	@JsonAlias("locationJson")
+	private Map<String, Double> location;
+	/** 现场发现人员 */
+	private String findPeople;
+
+	/** 项目ID */
+	private String projectId;
+	/** 设备类型code */
+	private String classCode;
+	/** 设备所在建筑ID */
+	private String buildingId;
+	/** 设备所在楼层id */
+	private String floorId;
+	/** 设备关联的资产id */
+	private String propertyId;
+
+	/** 参见 EquipmentProSy **/
+	/** 品牌型号id */
+	private String dpManufacturerId;
+
+	/** 供应商信息id */
+	private String dpSupplierId;
+
+	/** 维修商信息id */
+	private String dpMaintainerId;
+
+	/** 保险公司信息id */
+	private String dpInsurerId;
+
+	/** 设备型号id */
+	private String dpSpecificationId;
+
+	/** 品牌id */
+	private String dpBrandId;
+
+	/** Revit族 */
+	private String bimFamilyName;
+	/** Revit族类型 */
+	private String bimFamilySymbol;
+	/** 设备序号 */
+	private Double equipSerial;
+
+	/** 部件关联设备的id */
+	private String parentId;
+	/** 系统id集合 */
+	private List<String> systemList;
+	/** 项目自定义类型 */
+	private String customCategory;
+	/** 任务状态 */
+	private Integer taskState;
+	/** 模型id */
+	private String modelId;
+	/** 贴码状态 */
+	private Integer codeType;
+	/** 备注 */
+	private String note;
+
+	/** 客户端id */
+	private String appId;
+	/** 方案id */
+	private String schemeId;
+
+	/** 系统编码 */
+	private String systemCode;
+	/** 系统名称 */
+	private String systemName;
+	/** 二维码图片 */
+	private String qrcodePic;
+
+}

+ 51 - 0
src/main/java/com/persagy/bdtp/adm/entity/oldadm/OFloor.java

@@ -0,0 +1,51 @@
+package com.persagy.bdtp.adm.entity.oldadm;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class OFloor extends OBase {
+
+	/** 平台默认二维码 */
+	private String defaultQRCode;
+	/** 项目ID */
+	private String projectId;
+	/** 建筑ID */
+	private String buildingId;
+	/** 坐标 */
+	private String bimLocation;
+	/** BIM模型中编码 */
+	private String bimId;
+	/** BIMID前缀 */
+	private String bimIdPre;
+	/** 楼层顺序号 */
+	private Integer floorSequenceID;
+	/** 楼层常驻人数 */
+	private Integer permanentPeopleNum;
+	/** 楼层编码 */
+	private String floorIdentity;
+
+	/** 模型文件id */
+	private String modelId;
+
+	/** 楼层选定区域轮廓线 */
+	private List<ObjectNode> outline;
+
+	/** 数量 */
+	private String count;
+
+	/** 自定义信息点 */
+	private Map<String, Object> properties;
+
+	/** 二维码图片 */
+	private String qrcodePic;
+
+	public String getFloorMap(){
+		Map<String, Object> infos = getInfos();
+		return infos != null ? (String) infos.get("floorMap") : null;
+	}
+
+}

+ 17 - 0
src/main/java/com/persagy/bdtp/adm/entity/oldadm/OProject.java

@@ -0,0 +1,17 @@
+package com.persagy.bdtp.adm.entity.oldadm;
+
+import lombok.Data;
+
+@Data
+public class OProject extends OBase {
+
+	/** 项目介绍 */
+	private String introduction;
+	/** 集团编码 */
+	private String groupCode;
+	/** 商业层数 */
+	private String businessFloorNum;
+	/** 办公层数 */
+	private String officeFloorNum;
+
+}

+ 79 - 0
src/main/java/com/persagy/bdtp/adm/entity/oldadm/OSpace.java

@@ -0,0 +1,79 @@
+package com.persagy.bdtp.adm.entity.oldadm;
+
+import cn.hutool.core.map.CaseInsensitiveMap;
+import lombok.Data;
+
+import java.util.ArrayList;
+
+@Data
+public class OSpace extends OBase {
+
+	/** 项目ID */
+	private String projectId;
+	/** 建筑ID */
+	private String buildingId;
+	/** 楼层ID */
+	private String floorId;
+	/** 平台二维码 */
+	private String defaultQRCode;
+	/** BIM模型中编码 */
+	private String bimId;
+
+	/** 楼层选定区域轮廓线 */
+	private ArrayList<ArrayList<ArrayList<CaseInsensitiveMap>>> outline;
+	/** 轮廓线2 未使用*/
+	private ArrayList<ArrayList<ArrayList<CaseInsensitiveMap>>> outline2;
+//	/** 图片 */
+//	private ArrayList<AdmTaskPic> pic;
+	/** 空间是否受影响 */
+	private String state;
+	/** 空间常驻人数 */
+	private Integer permanentPeopleNum;
+
+	/** 井深 */
+	private Float depth;
+	/** 面宽 */
+	private Float width;
+	/** 建筑面积 */
+	private Float buildArea;
+	/** 使用面积 */
+	private Float netArea;
+	/** 高 */
+	private Float height;
+	/** 备注文字 */
+	private String intro;
+	/** 设计供冷功率 */
+	private Float ratedCoolingp;
+	/** 设计供热功率 */
+	private Float ratedHeatingp;
+	/** 空调形式 */
+	private String acType;
+	/** 空间朝向 */
+	private String zoneOrientation;
+	/** 空间功能区类型 */
+	private String roomFuncType;
+
+	/** 空间序号 */
+	private Float roomSerial;
+	/** 项目空间功能区类型 */
+	private String projRoomFuncType;
+	/** 设计照明功率 */
+	private Float ratedLightp;
+	/** 内外区分类 */
+	private String zoneType;
+	/** 租赁业态类型 */
+	private Integer tenantType;
+	/** 所属租户 */
+	private String tenant;
+	/** 配电容量 */
+	private Float elecCap;
+	/** 污染等级 */
+	private String pollutionDegree;
+
+	/** 对象类型code */
+	private String classCode;
+
+	/** 二维码图片 */
+	private String qrcodePic;
+
+}

+ 20 - 0
src/main/java/com/persagy/bdtp/adm/entity/oldadm/OldAdmResult.java

@@ -0,0 +1,20 @@
+package com.persagy.bdtp.adm.entity.oldadm;
+
+import lombok.Data;
+
+@Data
+public class OldAdmResult<T> {
+
+	private String result;
+
+	private String Message;
+
+	private T content;
+
+	private int pageNumber;
+
+	private int pageSize;
+
+	private int total;
+
+}

+ 35 - 0
src/main/java/com/persagy/bdtp/adm/handler/M2DMessageHandler.java

@@ -0,0 +1,35 @@
+package com.persagy.bdtp.adm.handler;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.persagy.bdtp.adm.common.AdmMessageConst;
+import com.persagy.dmp.amqp.handler.AbstractRabbitHandlerTemplate;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Slf4j
+@Component
+@RabbitListener(queues = AdmMessageConst.M2D_QUEUE)
+public class M2DMessageHandler extends AbstractRabbitHandlerTemplate {
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    /**
+     * 消费
+     * @param message 消息体字符串
+     * @param channel 通道对象
+     * @param vo     消息对象
+     */
+    @Override
+    protected void handler(String message, Channel channel, Message vo) {
+        //objectMapper.readValue(message, ProjectMessageVO.class);
+        System.out.println(new Date() + ": " + message);
+    }
+
+}

+ 17 - 0
src/main/java/com/persagy/bdtp/adm/service/CallException.java

@@ -0,0 +1,17 @@
+package com.persagy.bdtp.adm.service;
+
+import com.persagy.bdtp.adm.common.AdmResult;
+
+public class CallException extends RuntimeException {
+
+	private AdmResult<Object> errorResult;
+
+	public CallException(AdmResult<Object> errorResult) {
+		this.errorResult = errorResult;
+	}
+
+	public AdmResult<Object> getErrorResult() {
+		return errorResult;
+	}
+
+}

+ 45 - 0
src/main/java/com/persagy/bdtp/adm/service/IAdmObjectService.java

@@ -0,0 +1,45 @@
+package com.persagy.bdtp.adm.service;
+
+import com.persagy.bdtp.adm.entity.AdmObject;
+
+import java.util.List;
+
+/**
+ * 操作对象实体的服务
+ */
+public interface IAdmObjectService {
+
+	/**
+	 * 批量新增对象
+	 */
+	List<AdmObject> insert(List<AdmObject> voList);
+
+	/**
+	 * 批量更新对象
+	 */
+	List<AdmObject> update(List<AdmObject> voList);
+
+	/**
+	 * 查询建筑和楼层数据
+	 * @param projectIds 项目id
+	 * @return
+	 */
+	List<AdmObject> queryBdAndFl(String... projectIds);
+
+	/**
+	 * 查询楼层下的数据(空间、设备)
+	 * @param projectId 项目id
+	 * @param floorId 楼层id
+	 * @return
+	 */
+	List<AdmObject> queryByFloor(String projectId, String floorId);
+
+	/**
+	 * 按类型查询正向交付的实体对象
+	 * @param projectId 项目id
+	 * @param objType 对象类型
+	 * @return
+	 */
+	List<AdmObject> queryM2dByObjType(String projectId, String objType);
+
+}

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

@@ -0,0 +1,21 @@
+package com.persagy.bdtp.adm.service;
+
+import com.persagy.bdtp.adm.entity.*;
+
+import java.util.List;
+
+public interface IConfigService {
+
+	List<AdmM2dEquip> queryM2dEquip(String projectId);
+
+	List<AdmInfosConfig> queryInfosConfig(String projectId);
+
+	List<AdmRelsConfig> queryRelsConfig(String projectId);
+
+	List<AdmPipeConfig> queryPipeConfig(String projectId);
+
+	List<AdmConfig> queryCommonConfig(String projectId);
+
+	List<AdmComponent> queryComponent(String projectId);
+
+}

+ 29 - 0
src/main/java/com/persagy/bdtp/adm/service/IQueryFromOldAdm.java

@@ -0,0 +1,29 @@
+package com.persagy.bdtp.adm.service;
+
+import com.persagy.bdtp.adm.entity.oldadm.OBuilding;
+import com.persagy.bdtp.adm.entity.oldadm.OEquip;
+import com.persagy.bdtp.adm.entity.oldadm.OProject;
+import com.persagy.bdtp.adm.entity.oldadm.OSpace;
+
+import java.util.List;
+
+/**
+ * 从老adm查询数据
+ */
+public interface IQueryFromOldAdm {
+
+	/**
+	 * 登录系统
+	 * @return token
+	 */
+	String login();
+
+	List<OProject> queryProject(String token, String groupCode, String projectId);
+
+	List<OBuilding> queryBdAnFl(String token, String groupCode, String projectId);
+
+	List<OSpace> querySpace(String token, String groupCode, String projectId);
+
+	List<OEquip> queryEquip(String token, String groupCode, String projectId);
+
+}

+ 16 - 0
src/main/java/com/persagy/bdtp/adm/service/ISyncApp.java

@@ -0,0 +1,16 @@
+package com.persagy.bdtp.adm.service;
+
+import java.util.Map;
+
+/**
+ * 与APP端进行数据同步的服务
+ */
+public interface ISyncApp {
+
+	Map<String, Object> downloadDictAndConfig(String groupCode, String projectId, String userId);
+
+	Map<String, Object> downloadFrameData(String groupCode, String projectId, String userId);
+
+	Map<String, Object> downloadFloorData(String projectId, String floorId);
+
+}

+ 20 - 0
src/main/java/com/persagy/bdtp/adm/service/ISyncModel.java

@@ -0,0 +1,20 @@
+package com.persagy.bdtp.adm.service;
+
+import org.springframework.amqp.core.Message;
+
+/**
+ * 与模型服务端进行数据同步的服务
+ */
+public interface ISyncModel {
+
+	String OPERATOR_ADD = "add";
+
+	String OPERATOR_MODIFY = "modify";
+
+	String OPERATOR_REMOVE = "remove";
+
+	void sendMessageToModel(String operation, Object entity);
+
+	void handleModelMessage(String message, Message vo);
+
+}

+ 14 - 0
src/main/java/com/persagy/bdtp/adm/service/ISyncOldAdm.java

@@ -0,0 +1,14 @@
+package com.persagy.bdtp.adm.service;
+
+import java.util.Map;
+
+/**
+ * 从老adm同步正向交付数据和建筑楼层等初始化数据
+ */
+public interface ISyncOldAdm {
+
+	Map<String, Object> syncData(String groupCode, String projectId);
+
+	void handleJobSpace(String projectId);
+
+}

+ 49 - 0
src/main/java/com/persagy/bdtp/adm/service/ServiceUtil.java

@@ -0,0 +1,49 @@
+package com.persagy.bdtp.adm.service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.bdtp.adm.common.AdmResult;
+import com.persagy.bdtp.adm.entity.Pagination;
+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.function.Supplier;
+
+public class ServiceUtil {
+
+	private static final String SUCCESS = "success";
+
+	public static <T> T call(Supplier<CommonResult<T>> action) {
+		CommonResult<T> result = action.get();
+		if(SUCCESS.equals(result.getResult()))
+			return result.getData();
+		throw new CallException(new AdmResult<>(result.getResult(), result.getMessage()));
+	}
+
+	public static <T> T callOldAdm(Supplier<OldAdmResult<T>> action, Pagination pagination) {
+		OldAdmResult<T> result = action.get();
+		if(SUCCESS.equals(result.getResult())) {
+			if(pagination != null)
+				pagination.setTotal(result.getTotal());
+			return result.getContent();
+		}
+		throw new CallException(new AdmResult<>(result.getResult(), result.getMessage()));
+	}
+
+	public static <T> T callOldAdm(Supplier<OldAdmResult<T>> action) {
+		return callOldAdm(action, null);
+	}
+
+	public static QueryCriteria getQueryCriteria(String objType, ObjectMapper objectMapper){
+		QueryCriteria queryCriteria = new QueryCriteria();
+
+		ObjectNode objectNode = objectMapper.createObjectNode();
+		if(objType != null)
+			objectNode.put("objType", objType);
+
+		queryCriteria.setCriteria(objectNode);
+		return queryCriteria;
+	}
+
+}

+ 72 - 0
src/main/java/com/persagy/bdtp/adm/service/impl/AdmObjectServiceImpl.java

@@ -0,0 +1,72 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.persagy.bdtp.adm.common.AdmConst;
+import com.persagy.bdtp.adm.dao.AdmObjectMapper;
+import com.persagy.bdtp.adm.entity.AdmObject;
+import com.persagy.bdtp.adm.service.IAdmObjectService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+@Transactional(rollbackFor = Exception.class)
+@RequiredArgsConstructor
+public class AdmObjectServiceImpl extends ServiceImpl<AdmObjectMapper, AdmObject> implements IAdmObjectService {
+
+	private final AdmObjectMapper objectMapper;
+
+	@Override
+	public List<AdmObject> insert(List<AdmObject> voList) {
+		if(CollUtil.isEmpty(voList))
+			return null;
+
+		for(AdmObject obj : voList) {
+			objectMapper.insert(obj);
+			// 新增后消息
+			//messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_INSERT, null, vo, false);
+		}
+
+		return voList;
+	}
+
+	@Override
+	public List<AdmObject> update(List<AdmObject> voList) {
+		if(CollUtil.isEmpty(voList))
+			return null;
+
+		for(AdmObject obj : voList) {
+			objectMapper.updateById(obj);
+			// 更新后消息
+			//messageSender.sendMessage(DigitalMessageConstant.OPERATE_AFTER_INSERT, null, vo, false);
+		}
+
+		return voList;
+	}
+
+	@Override
+	public List<AdmObject> queryBdAndFl(String... projectIds) {
+		QueryWrapper<AdmObject> queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("project_id", projectIds).in("obj_type", AdmConst.OBJ_TYPE_BUILDING, AdmConst.OBJ_TYPE_FLOOR);
+		return objectMapper.selectList(queryWrapper);
+	}
+
+	@Override
+	public List<AdmObject> queryByFloor(String projectId, String floorId) {
+		QueryWrapper<AdmObject> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("project_id", projectId).eq("floor_id", floorId);
+		return objectMapper.selectList(queryWrapper);
+	}
+
+	@Override
+	public List<AdmObject> queryM2dByObjType(String projectId, String objType) {
+		QueryWrapper<AdmObject> queryWrapper = new QueryWrapper<>();
+		queryWrapper.in("project_id", projectId).eq("obj_type", objType).isNull("client_id");
+		return objectMapper.selectList(queryWrapper);
+	}
+
+}

+ 61 - 0
src/main/java/com/persagy/bdtp/adm/service/impl/ConfigServiceImpl.java

@@ -0,0 +1,61 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import com.persagy.bdtp.adm.dao.*;
+import com.persagy.bdtp.adm.entity.*;
+import com.persagy.bdtp.adm.service.IConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ConfigServiceImpl implements IConfigService {
+
+	@Autowired
+	private AdmM2dEquipMapper m2dEquipMapper;
+
+	@Autowired
+	private AdmInfosConfigMapper infosConfigMapper;
+
+	@Autowired
+	private AdmRelsConfigMapper relsConfigMapper;
+
+	@Autowired
+	private AdmPipeConfigMapper pipeConfigMapper;
+
+	@Autowired
+	private AdmConfigMapper commonConfigMapper;
+
+	@Autowired
+	private AdmComponentMapper componentMapper;
+
+	@Override
+	public List<AdmM2dEquip> queryM2dEquip(String projectId) {
+		return m2dEquipMapper.selectList(null);
+	}
+
+	@Override
+	public List<AdmInfosConfig> queryInfosConfig(String projectId) {
+		return infosConfigMapper.selectList(null);
+	}
+
+	@Override
+	public List<AdmRelsConfig> queryRelsConfig(String projectId) {
+		return relsConfigMapper.selectList(null);
+	}
+
+	@Override
+	public List<AdmPipeConfig> queryPipeConfig(String projectId) {
+		return pipeConfigMapper.selectList(null);
+	}
+
+	@Override
+	public List<AdmConfig> queryCommonConfig(String projectId) {
+		return commonConfigMapper.selectList(null);
+	}
+
+	@Override
+	public List<AdmComponent> queryComponent(String projectId) {
+		return componentMapper.selectList(null);
+	}
+}

+ 110 - 0
src/main/java/com/persagy/bdtp/adm/service/impl/QueryFromOldAdmImpl.java

@@ -0,0 +1,110 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.persagy.bdtp.adm.client.OldAdmClient;
+import com.persagy.bdtp.adm.dao.AdmM2dEquipMapper;
+import com.persagy.bdtp.adm.entity.AdmM2dEquip;
+import com.persagy.bdtp.adm.entity.Pagination;
+import com.persagy.bdtp.adm.entity.oldadm.*;
+import com.persagy.bdtp.adm.service.IConfigService;
+import com.persagy.bdtp.adm.service.IQueryFromOldAdm;
+import com.persagy.bdtp.adm.service.ServiceUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.function.Supplier;
+
+@Service
+public class QueryFromOldAdmImpl implements IQueryFromOldAdm {
+
+	private static String user = "bdtp";
+
+	private static String password = "123456";
+
+	private static String appId = "adm";
+
+	@Autowired
+	private OldAdmClient admClient;
+
+	@Autowired
+	private IConfigService configService;
+
+	@Autowired
+	private ObjectMapper objectMapper;
+
+	@Override
+	public String login() {
+		HashMap<String, Object> params = new HashMap<>();
+		params.put("name", user);
+		params.put("password", password);
+		Map<String, Object> longinInfo = admClient.login(params);
+		if("Success".equals(longinInfo.get("code"))){
+			Map data = (Map)longinInfo.get("data");
+			return (String) data.get("token");
+		}
+		return null;
+	}
+
+	@Override
+	public List<OProject> queryProject(String token, String groupCode, String projectId) {
+		return ServiceUtil.callOldAdm(() -> admClient.queryProject(groupCode, projectId, appId, user, token, new HashMap<>()));
+	}
+
+	@Override
+	public List<OBuilding> queryBdAnFl(String token, String groupCode, String projectId) {
+		HashMap<String,Object> params = new HashMap<>();
+		HashMap<String, Object> cascade = new HashMap<>();
+		cascade.put("name", "floor");
+		cascade.put("orders", "floorSequenceID asc");
+		params.put("cascade", Arrays.asList(cascade));
+		return ServiceUtil.callOldAdm(() -> admClient.queryBuilding(groupCode, projectId, appId, user, token, params));
+	}
+
+	@Override
+	public List<OSpace> querySpace(String token, String groupCode, String projectId) {
+		HashMap<String,Object> params = new HashMap<>();
+		params.put("zoneTypeList", Arrays.asList("GeneralZone", "OtherZone"));
+		//params.put("zoneType", "GeneralZone");
+
+		Pagination pagination = new Pagination(1000);
+		return queryAllPage(() -> admClient.querySpace(groupCode, projectId, appId, user, token, params), params, pagination);
+	}
+
+	private <T> List<T> queryAllPage(Supplier<OldAdmResult<List<T>>> action, Map<String,Object> params, Pagination pagination){
+		List<T> list = null;
+		while (pagination.isHasNext()){
+			params.put("pageNumber", pagination.getPageNum());
+			params.put("pageSize", pagination.getPageSize());
+			if(list == null)
+				list = ServiceUtil.callOldAdm(action, pagination);
+			else
+				list.addAll(ServiceUtil.callOldAdm(action, pagination));
+			pagination.next();
+		}
+		return list;
+	}
+
+	@Override
+	public List<OEquip> queryEquip(String token, String groupCode, String projectId) {
+		HashMap<String,Object> params = new HashMap<>();
+		Pagination pagination = new Pagination(1000);
+
+		//TODO 暂时仅同步正向交付的设备,按设备类过滤
+		List<AdmM2dEquip> equips = configService.queryM2dEquip(projectId);
+		List<String> classCodeList = new ArrayList<>(equips.size());
+		for (AdmM2dEquip equip : equips) {
+			classCodeList.add(equip.getClassCode());
+		}
+		try {
+			String filter = "classCode in " + objectMapper.writeValueAsString(classCodeList);
+			params.put("filters", filter);
+		} catch (IOException e) {
+
+		}
+
+		return queryAllPage(() -> admClient.queryEquip(groupCode, projectId, appId, user, token, params), params, pagination);
+	}
+
+}

+ 197 - 0
src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl.java

@@ -0,0 +1,197 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+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.common.AdmResult;
+import com.persagy.bdtp.adm.dao.*;
+import com.persagy.bdtp.adm.entity.*;
+import com.persagy.bdtp.adm.entity.oldadm.OProject;
+import com.persagy.bdtp.adm.service.*;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.helper.SpringHelper;
+import com.persagy.dmp.define.entity.RelationDefine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Service
+public class SyncAppImpl implements ISyncApp {
+
+	@Autowired
+	private IAdmObjectService objectService;
+
+	@Autowired
+	private IQueryFromOldAdm queryOldAdm;
+
+	@Autowired
+	private RwdClient rwdClient;
+
+	@Autowired
+	private DicClient dicClient;
+
+	@Autowired
+	private IConfigService configService;
+
+	@Autowired
+	private AdmJobSpaceMapper jobSpaceMapper;
+
+	@Autowired
+	private AdmProblemArchMapper problemArchMapper;
+
+	@Autowired
+	private AdmProblemEquipMapper problemEquipMapper;
+
+	@Autowired
+	private AdmRelationMapper relationMapper;
+
+	@Autowired
+	private AdmFileMapper fileMapper;
+
+	@Autowired
+	private AdmQrCodeMapper qrCodeMapper;
+
+	@Override
+	public Map<String, Object> downloadDictAndConfig(String groupCode, String projectId, String userId) {
+		Map<String, Object> dict = queryDict(groupCode, projectId, userId);
+
+		//TODO 配置数据查询
+		List<AdmM2dEquip> m2dTypes = configService.queryM2dEquip(projectId);
+		List<AdmInfosConfig> infosConfig = configService.queryInfosConfig(projectId);
+		List<AdmRelsConfig> relConfig = configService.queryRelsConfig(projectId);
+		List<AdmPipeConfig> pipeConfig = configService.queryPipeConfig(projectId);
+		List<AdmConfig> config = configService.queryCommonConfig(projectId);
+		List<AdmComponent> component = configService.queryComponent(projectId);
+
+		HashMap<String, Object> data = new HashMap<>();
+		data.put("dict", dict);
+		data.put("m2dTypes", m2dTypes);
+		data.put("infosConfig", infosConfig);
+		data.put("relConfig", relConfig);
+		data.put("pipeConfig", pipeConfig);
+		data.put("config", config);
+		data.put("component", component);
+
+		return data;
+	}
+
+	private Map<String, Object> queryDict(String groupCode, String projectId, String userId){
+		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+
+		//从知识库服务获取专业分类
+		QueryCriteria majorCriteria = ServiceUtil.getQueryCriteria(null, objectMapper);
+		majorCriteria.getCriteria().put("type", "major");
+		List<Map<String, Object>> majorList = ServiceUtil.call (() -> dicClient.dataQuery(groupCode, projectId, AdmConst.APP_ID, userId, majorCriteria));
+
+		//查询系统和设备定义
+		QueryCriteria criteria = ServiceUtil.getQueryCriteria(null, objectMapper);
+		criteria.getCriteria().putArray("objType").add("system").add("equipment");
+		List<TypeDef> typeList = ServiceUtil.call(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria));
+
+		//查询关系定义
+		List<RelationDefine> relList = ServiceUtil.call(() -> rwdClient.queryRelDef(groupCode, projectId, AdmConst.APP_ID, userId, new QueryCriteria()));
+
+		LinkedList<TypeDef> sysList = new LinkedList<>();
+		LinkedList<TypeDef> equipList = new LinkedList<>();
+		for(TypeDef def : typeList){
+			if(def.getObjType().equals("system"))
+				sysList.add(def);
+			else if(def.getObjType().equals("equipment"))
+				equipList.add(def);
+		}
+
+		//组织树形结构
+//		for(Map<String, Object> major : majorList){
+//			ArrayList<TypeDef> childrenSys = new ArrayList<>();
+//			major.put("children", childrenSys);
+//			String majorCode = (String) major.get("code");
+//			for(Iterator<TypeDef> sysIter = sysList.iterator();sysIter.hasNext();){
+//				TypeDef sysDef = sysIter.next();
+//				if(sysDef.getMajorCode() != null && sysDef.getMajorCode().equals(majorCode)){
+//					childrenSys.add(sysDef);
+//
+//					for(Iterator<TypeDef> equipIter = equipList.iterator();equipIter.hasNext();){
+//						TypeDef equipDef = equipIter.next();
+//						if(equipDef.getSystemCode() != null && equipDef.getSystemCode().equals(sysDef.getCode())){
+//							sysDef.addChild(equipDef);
+//							equipIter.remove();
+//						}
+//					}
+//
+//					sysIter.remove();
+//					break;
+//				}
+//			}
+//		}
+
+		HashMap<String, Object> data = new HashMap<>();
+		data.put("major", majorList);
+		data.put("system", sysList);
+		data.put("equipment", equipList);
+		data.put("relation", relList);
+		return data;
+	}
+
+	@Override
+	public Map<String, Object> downloadFrameData(String groupCode, String projectId, String userId) {
+		List<OProject> prjList = null;
+		String token = queryOldAdm.login();
+		if(StrUtil.isNotBlank(token))
+			prjList = queryOldAdm.queryProject(token, groupCode, projectId);
+		else
+			throw new CallException(new AdmResult(ResponseCode.A0220.getCode(), "ADM platform: " + ResponseCode.A0220.getDesc()));
+
+		String[] prjIds = new String[prjList.size()];
+		for (int i = 0; i < prjIds.length; i++) {
+			prjIds[i] = prjList.get(i).getId();
+		}
+		List<AdmObject> bdAndFl = objectService.queryBdAndFl(prjIds);
+
+		HashMap<String, Object> data = new HashMap<>();
+		data.put("projects", prjList);
+		data.put("buildingsAndFloors", bdAndFl);
+		return data;
+	}
+
+	@Override
+	public Map<String, Object> downloadFloorData(String projectId, String floorId) {
+		List<AdmObject> floorData = objectService.queryByFloor(projectId, floorId);
+		List<AdmRelation> floorRel = relationMapper.selectList(buildQueryWrapperForFloor(new QueryWrapper<AdmRelation>(), projectId, floorId, true));
+
+		//TODO 任务相关数据查询
+		List<AdmJobSpace> jobSpace = jobSpaceMapper.selectList(buildQueryWrapperForFloor(new QueryWrapper<AdmJobSpace>(), projectId, floorId, false));
+		List<AdmProblemArch> problemArch = problemArchMapper.selectList(buildQueryWrapperForFloor(new QueryWrapper<AdmProblemArch>(), projectId, floorId, false));
+		List<AdmProblemEquip> problemEquip = problemEquipMapper.selectList(buildQueryWrapperForFloor(new QueryWrapper<AdmProblemEquip>(), projectId, floorId, false));
+		List<AdmFile> file = fileMapper.selectList(buildQueryWrapperForFloor(new QueryWrapper<AdmFile>(), projectId, floorId, false));
+		List<AdmQrCode> qrCode = qrCodeMapper.selectList(buildQueryWrapperForFloor(new QueryWrapper<AdmQrCode>(), projectId, floorId, false));
+
+		HashMap<String, Object> data = new HashMap<>();
+		data.put("floorId", floorId);
+
+		data.put("objects", floorData);
+		data.put("relations", floorRel);
+
+		data.put("jobSpace", jobSpace);
+		data.put("problemArch", problemArch);
+		data.put("problemEquip", problemEquip);
+		data.put("file", file);
+		data.put("qrCode", qrCode);
+
+		return data;
+	}
+
+	private <T> QueryWrapper<T> buildQueryWrapperForFloor(QueryWrapper<T> wrapper, String projectId, String floorId, boolean floorIdNull){
+		wrapper.eq("project_id", projectId);
+		if(!floorIdNull)
+			wrapper.eq("floor_id", floorId);
+		else
+			wrapper.and(w -> w.eq("floor_id", floorId).or().isNull("floor_id"));
+		return wrapper;
+	}
+
+}

+ 32 - 0
src/main/java/com/persagy/bdtp/adm/service/impl/SyncModelImpl.java

@@ -0,0 +1,32 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import com.persagy.bdtp.adm.common.AdmMessageConst;
+import com.persagy.bdtp.adm.entity.D2mMessage;
+import com.persagy.bdtp.adm.service.ISyncModel;
+import com.persagy.bdtp.adm.util.AdmMessageHelper;
+import org.springframework.amqp.core.Message;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+
+@Service
+public class SyncModelImpl implements ISyncModel {
+
+	@Autowired
+	private AdmMessageHelper messageHelper;
+
+	@Override
+	public void sendMessageToModel(String operation, Object entity) {
+		D2mMessage message = new D2mMessage();
+		message.setObjs(Arrays.asList(entity));
+		message.setOperation(operation);
+		messageHelper.sendMessage(message, AdmMessageConst.ADM_D2M_ROUTING, false);
+	}
+
+	@Override
+	public void handleModelMessage(String message, Message vo) {
+
+	}
+
+}

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

@@ -0,0 +1,506 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ReflectUtil;
+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.persagy.bdtp.adm.common.AdmConst;
+import com.persagy.bdtp.adm.common.AdmResult;
+import com.persagy.bdtp.adm.dao.AdmJobSpaceMapper;
+import com.persagy.bdtp.adm.dao.AdmObjectMapper;
+import com.persagy.bdtp.adm.entity.AdmJobSpace;
+import com.persagy.bdtp.adm.entity.AdmObject;
+import com.persagy.bdtp.adm.entity.oldadm.*;
+import com.persagy.bdtp.adm.service.CallException;
+import com.persagy.bdtp.adm.service.IAdmObjectService;
+import com.persagy.bdtp.adm.service.IQueryFromOldAdm;
+import com.persagy.bdtp.adm.service.ISyncOldAdm;
+import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.constant.ValidEnum;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.helper.SpringHelper;
+import com.persagy.dmp.common.lang.PsDateTime;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.LinearRing;
+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.lang.reflect.Field;
+import java.util.*;
+import java.util.List;
+
+@Service
+public class SyncOldAdmImpl implements ISyncOldAdm {
+
+	@Autowired
+	private IQueryFromOldAdm queryOldAdm;
+
+	@Autowired
+	private IAdmObjectService objectService;
+
+	@Autowired
+	private AdmObjectMapper objectMapper;
+
+	@Autowired
+	private AdmJobSpaceMapper jobSpaceMapper;
+
+	private static GeometryFactory geometryFactory = new GeometryFactory();
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Map<String, Object> syncData(String groupCode, String projectId) {
+		String token = queryOldAdm.login();
+		if(StrUtil.isNotBlank(token)){
+			List<OBuilding> bdList = queryOldAdm.queryBdAnFl(token, groupCode, projectId);
+			List<OSpace> spList = queryOldAdm.querySpace(token, groupCode, projectId);
+			List<OEquip> eqList  = queryOldAdm.queryEquip(token, groupCode, projectId);
+
+			List<AdmObject> bdObjs = new ArrayList<>(bdList.size());
+			List<AdmObject> flObjs = new ArrayList<>();
+			List<AdmObject> spObjs = new ArrayList<>(spList.size());
+			List<AdmObject> eqObjs = new ArrayList<>(eqList.size());
+
+			transEntities(bdObjs, bdList, (bdObj, oBd) -> {
+				setBdData(bdObj, (OBuilding) oBd);
+				if(((OBuilding) oBd).getFloor() != null)
+					transEntities(flObjs, ((OBuilding) oBd).getFloor(), (flObj, oFl) -> setFlData(flObj, (OFloor) oFl));
+			});
+
+			transEntities(spObjs, spList, (spObj, oSp) -> setSpData(spObj, (OSpace) oSp));
+			transEntities(eqObjs, eqList, (eqObj, oEq) -> setEqData(eqObj, (OEquip) oEq));
+
+			List<AdmObject> dbBds = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_BUILDING);
+			List<AdmObject> dbFls = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_FLOOR);
+			List<AdmObject> dbSps = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_SPACE);
+			List<AdmObject> dbEqs = objectService.queryM2dByObjType(projectId, AdmConst.OBJ_TYPE_EQUIPMENT);
+
+			List<AdmObject>[] operations = new List[]{new ArrayList<>(), new ArrayList<>()};
+
+			syncObjs(bdObjs, dbBds, operations, 1);
+			syncObjs(flObjs, dbFls, operations, 2);
+			syncObjs(spObjs, dbSps, operations, 3);
+			syncObjs(eqObjs, dbEqs, operations, 4);
+
+			objectService.insert(operations[0]);
+			objectService.update(operations[1]);
+
+			/*uploadFloorMap(flObjs, groupCode, projectId);*/
+			HashMap<String, Object> rtn = new HashMap<>();
+			rtn.put(AdmConst.OBJ_TYPE_BUILDING, bdObjs.size());
+			rtn.put(AdmConst.OBJ_TYPE_FLOOR, flObjs.size());
+			rtn.put(AdmConst.OBJ_TYPE_SPACE, spObjs.size());
+			rtn.put(AdmConst.OBJ_TYPE_EQUIPMENT, eqObjs.size());
+
+			return rtn;
+		}
+		throw new CallException(new AdmResult(ResponseCode.A0220.getCode(), "ADM platform: " + ResponseCode.A0220.getDesc()));
+	}
+
+	//TODO 设备同步时,按正逆向规则过滤
+	private void syncObjs(List<AdmObject> objs, List<AdmObject> dbItems, List<AdmObject>[] operations, int objMark){
+		HashMap<String, AdmObject> dbMap = new HashMap<>();
+		for (AdmObject dbItem : dbItems){
+			dbMap.put(dbItem.getId(), dbItem); //localId?
+		}
+
+		for(AdmObject obj : objs) {
+			AdmObject dbItem = dbMap.remove(obj.getId()); //localId?
+			if(dbItem == null)
+				operations[0].add(obj); //add
+			else {
+				AdmObject updateItem = mergeObj(obj, dbItem, objMark);
+				if(updateItem != null)
+					operations[1].add(updateItem); //modify
+			}
+		}
+
+		if (dbMap.size() > 0) { //remove
+			for(AdmObject obj : dbMap.values()){
+				obj.setValid(ValidEnum.FALSE.getType());
+				//obj.setModifiedTime(new PsDateTime(System.currentTimeMillis()));
+				operations[1].add(obj);
+			}
+		}
+	}
+
+	private AdmObject mergeObj(AdmObject obj, AdmObject dbItem, int objMark){
+		if(objNotChange(obj, dbItem))
+			return null;
+
+		//TODO 按交付规则,合并属性和信息点
+		if(objMark == 3) {//space
+
+		} else if(objMark == 4) {//equipment
+
+		}
+		return obj;
+	}
+
+	private boolean objNotChange(AdmObject obj, AdmObject dbItem){
+		//TODO 数据无变化判断
+		return false;
+	}
+
+	/* 暂时使用image-service
+	private void uploadFloorMap(ArrayList<AdmObject> flObjs, String groupCode, String projectId){
+		for(AdmObject obj : flObjs) {
+			JsonNode node = obj.getInfo("floorMap");
+			if(node != null){
+				String map = node.asText();
+				if(StrUtil.isNotBlank(map)) {
+					Response serviceResponse = admClient.getFloorMap(map, "revit");
+					Response.Body body = serviceResponse.body();
+					FileInfo fileInfo = FileInfoCreator.of(groupCode, projectId + "_floorMap", "adm", map);
+					try {
+						FileStorageHelper.uploadFile(fileInfo, body.asInputStream());
+					} catch (IOException e) {
+
+					}
+				}
+			}
+		}
+	}
+	*/
+
+	private <T extends OBase> void transEntities(List<AdmObject> targetList, List<T> list, SetDataAction setDataAction){
+		if(list != null && list.size() > 0) {
+			for(T item : list) {
+				AdmObject obj = buildAdmObject(item);
+				setDataAction.setData(obj, item);
+				targetList.add(obj);
+			}
+		}
+	}
+
+	private AdmObject buildAdmObject(OBase base){
+		AdmObject obj = new AdmObject();
+		obj.setId(base.getId());
+		obj.setLocalId(base.getLocalId());
+		obj.setName(base.getName());
+		obj.setLocalName(base.getLocalName());
+		obj.setObjType(base.getObjectType());
+
+		if (base.getInfos() != null)
+			obj.setInfos(mapToNode(base.getInfos()));
+
+		if(base.getCreateTime() != null)
+			obj.setCreationTime(new PsDateTime(base.getCreateTime()));
+		if(base.getLastUpdate() != null)
+			obj.setModifiedTime(new PsDateTime(base.getLastUpdate()));
+
+		obj.setValid(ValidEnum.TRUE.getType());
+
+		return obj;
+	}
+
+	private void setBdData(AdmObject obj, OBuilding bd){
+		obj.setProjectId(bd.getProjectId());
+		obj.setClassCode(bd.getObjectType());
+		//obj.setBuildingId(bd.getId());
+
+		if(bd.getDefaultQRCode() != null)
+			getInfos(obj).put("defaultQRCode", bd.getDefaultQRCode());
+		if(bd.getBuildQRCode() != null)
+			getInfos(obj).put("buildQRCode", bd.getBuildQRCode());
+	}
+
+	private void setFlData(AdmObject obj, OFloor fl){
+		obj.setProjectId(fl.getProjectId());
+		obj.setBuildingId(fl.getBuildingId());
+		//obj.setFloorId(fl.getId());
+		obj.setClassCode(fl.getObjectType());
+
+		setInfos(obj, fl, "projectId", "buildingId", "floorId");
+	}
+
+	private void setSpData(AdmObject obj, OSpace sp) {
+		obj.setProjectId(sp.getProjectId());
+		obj.setBuildingId(sp.getBuildingId());
+		obj.setFloorId(sp.getFloorId());
+		obj.setClassCode(sp.getClassCode());
+		obj.setObjType(AdmConst.OBJ_TYPE_SPACE);
+
+		setInfos(obj, sp, "projectId", "buildingId", "floorId", "classCode");
+	}
+
+	private void setEqData(AdmObject obj, OEquip eq) {
+		obj.setProjectId(eq.getProjectId());
+		obj.setBuildingId(eq.getBuildingId());
+		obj.setFloorId(eq.getFloorId());
+		obj.setClassCode(eq.getClassCode());
+
+		setInfos(obj, eq, "projectId", "buildingId", "floorId", "propertyId", "classCode");
+	}
+
+	private void setInfos(AdmObject obj, OBase oEntity, String... ignoreFields){
+		Field[] fields = oEntity.getClass().getDeclaredFields();
+		for (Field field : fields) {
+			if(ignoreFields.length == 0 || !ArrayUtil.contains(ignoreFields, field.getName())) {
+				Object val = ReflectUtil.getFieldValue(oEntity, field);
+				if(val != null) {
+					ObjectNode infos = getInfos(obj);
+					if(val instanceof String)
+						infos.put(field.getName(), (String)val);
+					else if(val instanceof Integer)
+						infos.put(field.getName(), (Integer)val);
+					else if(val instanceof Float)
+						infos.put(field.getName(), (Float)val);
+					else if(val instanceof Double)
+						infos.put(field.getName(), (Double)val);
+					else if(val instanceof List)
+						infos.putArray(field.getName()).addAll(listToNode((List)val));
+					else if(val instanceof Map)
+						infos.putObject(field.getName()).setAll(mapToNode((Map)val));
+				}
+			}
+		}
+	}
+
+	private ObjectNode getInfos(AdmObject obj) {
+		ObjectNode objectNode = obj.getInfos();
+		if(objectNode == null){
+			ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+			objectNode = objectMapper.createObjectNode();
+			obj.setInfos(objectNode);
+		}
+		return objectNode;
+	}
+
+	private ObjectNode mapToNode(Map<String, Object> map){
+		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+		try {
+			String json = objectMapper.writeValueAsString(map);
+			return objectMapper.readValue(json, ObjectNode.class);
+		} catch (IOException e) {
+			throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
+		}
+	}
+
+	private ArrayNode listToNode(List<Object> list){
+		ObjectMapper objectMapper = SpringHelper.getBean(ObjectMapper.class);
+		try {
+			String json = objectMapper.writeValueAsString(list);
+			return objectMapper.readValue(json, ArrayNode.class);
+		} catch (IOException e) {
+			throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
+		}
+	}
+
+	interface SetDataAction {
+		void setData(AdmObject obj, OBase oldAdmEntity);
+	}
+
+	/**
+	 * 创建/合并任务空间数据
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void handleJobSpace(String projectId){
+		QueryWrapper<AdmObject> queryWrapper = new QueryWrapper<>();
+		queryWrapper.eq("project_id", projectId).eq("obj_type", AdmConst.OBJ_TYPE_SPACE).eq("valid", ValidEnum.TRUE.getType()).orderByAsc("floor_id");
+		List<AdmObject> spaceList = objectMapper.selectList(queryWrapper);
+
+		QueryWrapper<AdmJobSpace> wrapper = new QueryWrapper<>();
+		wrapper.eq("project_id", projectId).eq("valid", ValidEnum.TRUE.getType());
+		List<AdmJobSpace> jobSpaceList = jobSpaceMapper.selectList(wrapper);
+
+		//空间按层分组,优先使用OtherZone,缺省GeneralZone
+		LinkedHashMap<String, List<AdmObject>> map = new LinkedHashMap<>();
+		String floorId = null;
+		List<AdmObject> generalList = null;
+		List<AdmObject> otherList = null;
+		for(AdmObject sp : spaceList){
+			if(floorId == null || !floorId.equals(sp.getFloorId())) {
+				if(floorId != null)
+					map.put(floorId, otherList.size() > 0 ? otherList : generalList);
+
+				floorId = sp.getFloorId();
+				generalList = new ArrayList<>();
+				otherList = new ArrayList<>();
+			}
+
+			String zone = sp.getClassCode();
+			if("GeneralZone".equals(zone))
+				generalList.add(sp);
+			else if("OtherZone".equals(zone))
+				otherList.add(sp);
+		}
+		map.put(floorId, otherList.size() > 0 ? otherList : generalList);
+
+		List<AdmJobSpace> toCreate = new ArrayList<>();
+		List<AdmJobSpace> toModify = new ArrayList<>();
+
+		String time = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
+
+		//按楼层进行空间匹配操作
+		for (Map.Entry<String, List<AdmObject>> entry : map.entrySet()) {
+			floorId = entry.getKey();
+
+			HashMap<String, AdmJobSpace> jobMap = new HashMap<>();
+			for (int i = 0; i < jobSpaceList.size(); i++) {
+				AdmJobSpace jobSpace = jobSpaceList.get(i);
+				if(jobSpace.getFloorId().equals(floorId)){
+					jobMap.put(jobSpace.getSpaceId(), jobSpace);
+
+					jobSpaceList.remove(i);
+					i--;
+				}
+			}
+
+			List<AdmObject> sps = entry.getValue();
+			for(AdmObject sp : sps){
+				ArrayNode spOutline = (ArrayNode) sp.getInfo("outline");
+				AdmJobSpace job = jobMap.remove(sp.getId());
+				if(job != null) {
+					//id匹配,轮廓变化的空间,重置任务状态
+					if(!outlineMatch(job.getOutline(), spOutline)){
+						job.setArchState(AdmConst.JOB_STATE_TODO);
+						job.setEquipState(AdmConst.JOB_STATE_TODO);
+						job.setModifiedTime(time);
+						job.setModifier(AdmConst.APP_ID);
+						toModify.add(job);
+					} // else id和轮廓都匹配,不做处理
+				} else {
+					//id未匹配,轮廓完全一致的任务空间,重新设置spaceId
+					job = matchByOutline(jobMap, sp);
+					if(job != null) {
+						job.setSpaceId(sp.getId());
+						toModify.add(job);
+					}
+				}
+
+				if (job == null) {
+					job = new AdmJobSpace();
+					job.setId(IdUtil.fastUUID());
+					job.setSpaceId(sp.getId());
+					job.setOutline((ArrayNode) sp.getInfo("outline"));
+					job.setArchState(AdmConst.JOB_STATE_TODO);
+					job.setEquipState(AdmConst.JOB_STATE_TODO);
+					job.setProjectId(projectId);
+					job.setBuildingId(sp.getBuildingId());
+					job.setFloorId(sp.getFloorId());
+					job.setCreationTime(time);
+					job.setCreator(AdmConst.APP_ID);
+					job.setValid(ValidEnum.TRUE.getType());
+
+					toCreate.add(job);
+				}
+			}
+
+			//楼层中未找到匹配关系的任务空间
+			for(AdmJobSpace job : jobMap.values()){
+				job.setValid(ValidEnum.FALSE.getType());
+				job.setModifiedTime(time);
+				toModify.add(job);
+			}
+		}
+
+		//项目下未找到匹配关系的任务空间
+		for(AdmJobSpace job : jobSpaceList){
+			job.setValid(ValidEnum.FALSE.getType());
+			job.setModifiedTime(time);
+			toModify.add(job);
+		}
+
+		for(AdmJobSpace job : toCreate) {
+			jobSpaceMapper.insert(job);
+		}
+		for(AdmJobSpace job : toModify) {
+			jobSpaceMapper.updateById(job);
+		}
+	}
+
+	private AdmJobSpace matchByOutline(HashMap<String, AdmJobSpace> jobMap, AdmObject space){
+		ArrayNode o1 = (ArrayNode) space.getInfo("outline");
+		if(!isValidOutline(o1))
+			return null;
+
+		Polygon[] ps = 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, 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(getPolygon(o1), getPolygon(o2));
+	}
+
+	private Polygon[] getPolygon(ArrayNode arrayNode){
+		Polygon[] ps = new Polygon[arrayNode.size()];
+		for (int i = 0; i < ps.length; i++) {
+			ArrayNode arr = (ArrayNode) arrayNode.get(i);
+			ArrayNode shellArrNode = (ArrayNode) arr.get(0);
+			LinearRing shell = geometryFactory.createLinearRing(buildCoords(shellArrNode));
+			LinearRing[] holes = null;
+			if(arr.size() > 1) {
+				holes = new LinearRing[arr.size() - 1];
+				for (int n = 1; n < arr.size(); n++) {
+					holes[n - 1] = geometryFactory.createLinearRing(buildCoords((ArrayNode) arr.get(n)));
+				}
+			}
+			ps[i] = geometryFactory.createPolygon(shell, holes);
+		}
+		return ps;
+	}
+
+	private Coordinate[] buildCoords(ArrayNode arrayNode){
+		Coordinate[] coords = new Coordinate[arrayNode.size()];
+		for (int i = 0; i < arrayNode.size(); i++) {
+			JsonNode pointNode = arrayNode.get(i);
+			coords[i] = new Coordinate(pointNode.get("x").asDouble(), pointNode.get("y").asDouble());
+		}
+		return coords;
+	}
+
+	/**
+	 * 轮廓匹配判断
+	 * 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;
+	}
+
+}

+ 38 - 0
src/main/java/com/persagy/bdtp/adm/util/AdmMessageHelper.java

@@ -0,0 +1,38 @@
+package com.persagy.bdtp.adm.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.persagy.bdtp.adm.common.AdmMessageConst;
+import com.persagy.dmp.amqp.handler.RabbitMessageSender;
+import com.persagy.dmp.common.exception.BusinessException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+public class AdmMessageHelper {
+
+    @Autowired
+    private RabbitMessageSender messageSender;
+
+    @Autowired
+    private ObjectMapper objectMapper;
+
+    public void sendMessage(Object messageData, String routing, boolean syncFlag) {
+        // 同步消息
+        try {
+            String msg = objectMapper.writeValueAsString(messageData);
+            if(syncFlag) {
+                messageSender.sendAndReceive(AdmMessageConst.ADM_EXCHANGE, routing, msg);
+            } else {
+                // 异步消息
+                messageSender.send(AdmMessageConst.ADM_EXCHANGE, routing, msg);
+            }
+        } catch (JsonProcessingException e) {
+            log.error(e.getMessage(), e);
+            throw new BusinessException("消息格式有误!");
+        }
+    }
+
+}

+ 26 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,26 @@
+server:
+  port: 8876
+spring:
+  application:
+    # 应用名称
+    name: adm
+  datasource:
+    dynamic:
+      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
+persagy:
+  common:
+    file:
+      storage: 0
+      url: http://192.168.25.129:9000/
+      accessKey: admin
+      secretKey: 12345678
+  adm:
+    oldPlatformUrl: http://39.102.40.239
+# typeHandler扫描
+mybatis-plus:
+  typeHandlersPackage: com.persagy.**.typehandler

+ 47 - 0
src/main/resources/mapper/AdmObjectMapper.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.persagy.bdtp.adm.dao.AdmObjectMapper">
+
+    <resultMap id="BaseResultMap" type="com.persagy.bdtp.adm.entity.AdmObject">
+        <id property="id" column="id" jdbcType="VARCHAR"/>
+        <result property="name" column="name" jdbcType="VARCHAR"/>
+        <result property="localId" column="local_id" jdbcType="VARCHAR"/>
+        <result property="localName" column="local_name" jdbcType="VARCHAR"/>
+        <result property="groupCode" column="group_code" jdbcType="VARCHAR"/>
+        <result property="projectId" column="project_id" jdbcType="VARCHAR"/>
+        <result property="objType" column="obj_type" jdbcType="VARCHAR"/>
+        <result property="classCode" column="class_code" jdbcType="VARCHAR"/>
+        <result property="grouping" column="grouping" jdbcType="INTEGER"/>
+        <result property="infos" column="infos" jdbcType="VARCHAR"
+                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result property="virtualCodes" column="virtual_codes" jdbcType="VARCHAR"
+                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result property="createApp" column="create_app" jdbcType="VARCHAR"/>
+        <result property="updateApp" column="update_app" jdbcType="VARCHAR"/>
+        <result property="creator" column="creator" jdbcType="VARCHAR"/>
+        <result property="creationTime" column="creation_time" jdbcType="CHAR"/>
+        <result property="modifier" column="modifier" jdbcType="VARCHAR"/>
+        <result property="modifiedTime" column="modified_time" jdbcType="CHAR"/>
+        <result property="valid" column="valid" jdbcType="TINYINT"/>
+        <result property="ts" column="ts" jdbcType="TIMESTAMP"/>
+        <result property="objFromIds" column="objFromIds" jdbcType="VARCHAR"
+                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result property="objToIds" column="objToIds" jdbcType="VARCHAR"
+                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result property="relObjs" column="relObjs" jdbcType="VARCHAR"
+                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result property="bimLocation" column="bimLocation" jdbcType="VARCHAR"
+                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result property="outLines" column="outLines" jdbcType="VARCHAR"
+                typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <!--<result property="relObjs" column="relObjs" jdbcType="VARCHAR"  typeHandler="com.persagy.dmp.basic.typehandler.RelObjsHandler"/>-->
+    </resultMap>
+    <!--<resultMap id="count" type="com.persagy.dmp.digital.entity.ObjectDigital">
+        <result property="totalCount" column="totalCount" jdbcType="INTEGER"/>
+    </resultMap>-->
+
+
+</mapper>

+ 87 - 0
src/main/resources/mybatis-generator/generatorConfig.xml

@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE generatorConfiguration
+        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
+        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
+
+<generatorConfiguration>
+    <context id="my" targetRuntime="MyBatis3">
+        <commentGenerator>
+            <property name="suppressDate" value="false"/>
+            <property name="suppressAllComments" value="true"/>
+        </commentGenerator>
+
+        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
+                        connectionURL="jdbc:mysql://192.168.0.11/adm?characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull&amp;useSSL=false&amp;serverTimezone=GMT"
+                        userId="adm"
+                        password="adm"/>
+
+        <javaModelGenerator targetPackage="com.persagy.bdtp.adm.entity"
+                            targetProject="D:/IdeaProjects/adm/src/main/java">
+            <property name="enableSubPackages" value="true"/>
+            <property name="trimStrings" value="true"/>
+        </javaModelGenerator>
+
+        <!--<sqlMapGenerator targetPackage=""
+                         targetProject="D:/IdeaProjects/adm/src/main/resources">
+            <property name="enableSubPackages" value="true"/>
+        </sqlMapGenerator>
+
+        <javaClientGenerator targetPackage="com.persagy.bdtp.adm.dao"
+                             targetProject="D:/IdeaProjects/adm/src/main/java" type="XMLMAPPER">
+            <property name="enableSubPackages" value="true"/>
+        </javaClientGenerator>-->
+
+        <table tableName="adm_rels_config" domainObjectName="AdmRelsConfig"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+            <!--<columnRenamingRule searchString="^D_"
+                                replaceString=""/>-->
+        </table>
+        <table tableName="adm_relation" domainObjectName="AdmRelation"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_problem_equip" domainObjectName="AdmProblemEquip"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_problem_arch" domainObjectName="AdmProblemArch"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_pipe_config" domainObjectName="AdmPipeConfig"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_m2d_equip" domainObjectName="AdmM2dEquip"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_job_space" domainObjectName="AdmJobSpace"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_infos_config" domainObjectName="AdmInfosConfig"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_file" domainObjectName="AdmFile"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+        <table tableName="adm_config" domainObjectName="AdmConfig"
+               enableCountByExample="false" enableUpdateByExample="false"
+               enableDeleteByExample="false" enableSelectByExample="false"
+               selectByExampleQueryId="false">
+        </table>
+    </context>
+</generatorConfiguration>

+ 48 - 0
src/test/java/com/persagy/bdtp/adm/test/AdmApplicationTests.java

@@ -0,0 +1,48 @@
+package com.persagy.bdtp.adm.test;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.persagy.bdtp.adm.dao.AdmObjectMapper;
+import com.persagy.bdtp.adm.entity.AdmObject;
+import com.persagy.bdtp.adm.service.ISyncModel;
+import com.persagy.bdtp.adm.service.ISyncOldAdm;
+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;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class AdmApplicationTests {
+
+	@Test
+	public void contextLoads() {
+	}
+
+	@Autowired
+	private ISyncOldAdm syncOldAdm;
+
+	@Test
+	public void testHandleJobSpace(){
+		syncOldAdm.handleJobSpace("Pj0002220002");
+	}
+
+	@Test
+	public void testSyncOldAdm() {
+		syncOldAdm.syncData("BR", "Pj0002220002");
+	}
+
+	@Autowired
+	private ISyncModel syncModel;
+
+	@Autowired
+	private AdmObjectMapper admObjectMapper;
+
+	@Test
+	public void testMq(){
+		AdmObject obj = admObjectMapper.selectOne(new QueryWrapper<AdmObject>().eq("id", "Eq00022200023a8d5a59a7fb49a89dfa6ae746518bc2"));
+		obj.getInfos().put("comp_type", "FFFAAL-声光报警器");
+		syncModel.sendMessageToModel(ISyncModel.OPERATOR_ADD, obj);
+	}
+
+}