Browse Source

2021-1112 对接bdtp

zhaoyk 3 years ago
parent
commit
da5414f8e7
70 changed files with 1341 additions and 478 deletions
  1. 6 0
      src/main/java/com/persagy/bdtp/adm/common/AdmConst.java
  2. 7 4
      src/main/java/com/persagy/bdtp/adm/common/AdmRequest.java
  3. 19 5
      src/main/java/com/persagy/bdtp/adm/controller/AppController.java
  4. 11 8
      src/main/java/com/persagy/bdtp/adm/controller/ToolController.java
  5. 10 0
      src/main/java/com/persagy/bdtp/adm/dao/AdmClientFlagMapper.java
  6. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmComponentMapper.java
  7. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmConfigMapper.java
  8. 1 2
      src/main/java/com/persagy/bdtp/adm/dao/AdmContainerConfigMapper.java
  9. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmFileMapper.java
  10. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmInfosConfigMapper.java
  11. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmJobSpaceMapper.java
  12. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmM2dEquipMapper.java
  13. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmObjectMapper.java
  14. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmPipeConfigMapper.java
  15. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmPipeMapper.java
  16. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmProblemArchMapper.java
  17. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmProblemEquipMapper.java
  18. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmQrCodeMapper.java
  19. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmRelationMapper.java
  20. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmRelsConfigMapper.java
  21. 1 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmServeAreaMapper.java
  22. 5 1
      src/main/java/com/persagy/bdtp/adm/dao/AdmUploadLogMapper.java
  23. 1 1
      src/main/java/com/persagy/bdtp/adm/datatx/ObjectMapper4Tx.java
  24. 0 38
      src/main/java/com/persagy/bdtp/adm/entity/AdmUploadLog.java
  25. 53 0
      src/main/java/com/persagy/bdtp/adm/entity/BuildingData.java
  26. 25 0
      src/main/java/com/persagy/bdtp/adm/entity/Dict.java
  27. 53 0
      src/main/java/com/persagy/bdtp/adm/entity/DownLoadData.java
  28. 23 0
      src/main/java/com/persagy/bdtp/adm/entity/ProjectData.java
  29. 0 32
      src/main/java/com/persagy/bdtp/adm/entity/SyncData.java
  30. 49 0
      src/main/java/com/persagy/bdtp/adm/entity/UploadData.java
  31. 23 0
      src/main/java/com/persagy/bdtp/adm/entity/db/AdmClientFlag.java
  32. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmComponent.java
  33. 1 2
      src/main/java/com/persagy/bdtp/adm/entity/AdmConfig.java
  34. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmContainerConfig.java
  35. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmFile.java
  36. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmInfosConfig.java
  37. 3 2
      src/main/java/com/persagy/bdtp/adm/entity/AdmJobSpace.java
  38. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmM2dEquip.java
  39. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmObject.java
  40. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmPipe.java
  41. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmPipeConfig.java
  42. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmProblemArch.java
  43. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmProblemEquip.java
  44. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmQrCode.java
  45. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmRelation.java
  46. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmRelsConfig.java
  47. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/AdmServeArea.java
  48. 67 0
      src/main/java/com/persagy/bdtp/adm/entity/db/AdmUploadLog.java
  49. 10 1
      src/main/java/com/persagy/bdtp/adm/entity/BaseAdmDataEntity.java
  50. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/BaseAdmEntity.java
  51. 1 1
      src/main/java/com/persagy/bdtp/adm/entity/BaseDeliveryEntity.java
  52. 1 1
      src/main/java/com/persagy/bdtp/adm/service/IAdmLogService.java
  53. 1 1
      src/main/java/com/persagy/bdtp/adm/service/IAdmObjectService.java
  54. 1 1
      src/main/java/com/persagy/bdtp/adm/service/IConfigService.java
  55. 9 6
      src/main/java/com/persagy/bdtp/adm/service/ISyncApp.java
  56. 20 11
      src/main/java/com/persagy/bdtp/adm/service/ServiceUtil.java
  57. 1 7
      src/main/java/com/persagy/bdtp/adm/service/impl/AdmLogServiceImpl.java
  58. 1 1
      src/main/java/com/persagy/bdtp/adm/service/impl/AdmObjectServiceImpl.java
  59. 1 1
      src/main/java/com/persagy/bdtp/adm/service/impl/ConfigServiceImpl.java
  60. 1 2
      src/main/java/com/persagy/bdtp/adm/service/impl/QueryFromOldAdmImpl.java
  61. 300 255
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl.java
  62. 508 0
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl0.java
  63. 2 23
      src/main/java/com/persagy/bdtp/adm/service/impl/SyncOldAdmImpl.java
  64. 15 1
      src/main/java/com/persagy/bdtp/adm/util/DataExtrasUtil.java
  65. 1 0
      src/main/resources/dict.json
  66. 1 1
      src/main/resources/mapper/AdmObjectMapper.xml.bak
  67. 77 37
      src/test/java/com/persagy/bdtp/adm/test/AdmApplicationTests.java
  68. 1 1
      src/test/java/com/persagy/bdtp/adm/test/data/InfosCfgs.java
  69. 1 1
      src/test/java/com/persagy/bdtp/adm/test/data/PipeCfgs.java
  70. 1 1
      src/test/java/com/persagy/bdtp/adm/test/data/RelCfgs.java

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

@@ -10,12 +10,18 @@ public interface AdmConst {
 
 	int JOB_STATE_FINISHED = 2;
 
+	String OBJ_TYPE_PROJECT = "project";
+
 	String OBJ_TYPE_BUILDING = "building";
 
 	String OBJ_TYPE_FLOOR = "floor";
 
 	String OBJ_TYPE_SPACE = "space";
 
+	String OBJ_TYPE_SHAFT = "shaft";
+
+	String OBJ_TYPE_SYSTEM = "system";
+
 	String OBJ_TYPE_EQUIPMENT = "equipment";
 
 	/** 数据创建者,数据同步服务 */

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

@@ -1,10 +1,8 @@
 package com.persagy.bdtp.adm.common;
 
-import com.persagy.bdtp.adm.entity.SyncData;
+import com.persagy.bdtp.adm.entity.UploadData;
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class AdmRequest {
 
@@ -20,8 +18,13 @@ public class AdmRequest {
 
 	private String uploadFlag;
 
+	/** 待废弃 */
 	private String lastDownloadTime;
 
-	private SyncData uploadData;
+	private Long bdtpDownloadTs;
+
+	private Long admDownloadTs;
+
+	private UploadData uploadData;
 
 }

+ 19 - 5
src/main/java/com/persagy/bdtp/adm/controller/AppController.java

@@ -1,14 +1,19 @@
 package com.persagy.bdtp.adm.controller;
 
+import cn.hutool.core.util.StrUtil;
 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.datatx.DataTxHandler;
-import com.persagy.bdtp.adm.entity.SyncData;
+import com.persagy.bdtp.adm.entity.Dict;
+import com.persagy.bdtp.adm.entity.DownLoadData;
 import com.persagy.bdtp.adm.entity.UploadRtn;
 import com.persagy.bdtp.adm.service.ISyncApp;
+import com.persagy.bdtp.adm.service.ServiceUtil;
+import com.persagy.bdtp.adm.service.impl.SyncAppImpl;
 import feign.Response;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
@@ -27,13 +32,14 @@ public class AppController {
 	private OldAdmClient admClient;
 
 	@Autowired
+	@Qualifier(ServiceUtil.SYNC_APP_IMPL)
 	private ISyncApp syncApp;
 
 	@Autowired
 	private DataTxHandler dataTxHandler;
 
 	@RequestMapping("/dict")
-	public AdmResult<Map<String, Object>> dict(@RequestBody AdmRequest req){
+	public AdmResult<Dict> dict(@RequestBody AdmRequest req){
 		return AdmResult.success(syncApp.downloadDict(req.getGroupCode(), req.getProjectId(), req.getUserId()));
 	}
 
@@ -81,8 +87,16 @@ public class AppController {
 	}
 
 	@RequestMapping("/download")
-	public AdmResult<SyncData> download(@RequestBody AdmRequest req){
-		return AdmResult.success(syncApp.downloadBuildingData(req.getProjectId(), req.getBuildingId(), req.getUploadFlag(), req.getLastDownloadTime()));
+	public AdmResult<DownLoadData> download(@RequestBody AdmRequest req){
+		DownLoadData data;
+		if(StrUtil.isBlank(req.getBuildingId())) {
+			if(syncApp instanceof SyncAppImpl) //临时兼容
+				data = syncApp.downloadBuildingData(req.getGroupCode(), req.getProjectId(), req.getUserId(), req.getUploadFlag(), req.getBuildingId(), req.getBdtpDownloadTs(), req.getAdmDownloadTs());
+			else
+				data = syncApp.downloadBuildingData(req.getProjectId(), req.getBuildingId(), req.getUploadFlag(), req.getLastDownloadTime());
+		} else
+			data = syncApp.downloadProjectData(req.getGroupCode(), req.getProjectId(), req.getUserId(), req.getUploadFlag(), req.getBdtpDownloadTs(), req.getAdmDownloadTs());
+		return AdmResult.success(data);
 	}
 
 //	@RequestMapping("/downloadFl")
@@ -119,7 +133,7 @@ public class AppController {
 	@RequestMapping("/upload")
 	public AdmResult<UploadRtn> upload(HttpServletRequest request){
 		AdmRequest admRequest = dataTxHandler.handleRequest(request);
-		return AdmResult.success(syncApp.uploadData(admRequest.getUploadData(), admRequest.getProjectId(), admRequest.getUploadFlag()));
+		return AdmResult.success(syncApp.uploadData(admRequest.getUploadData(), admRequest.getGroupCode(), admRequest.getProjectId(), admRequest.getUserId(), admRequest.getUploadFlag()));
 	}
 
 	@PostMapping("/uploadFile")

+ 11 - 8
src/main/java/com/persagy/bdtp/adm/controller/ToolController.java

@@ -14,6 +14,7 @@ import com.persagy.bdtp.adm.dao.AdmInfosConfigMapper;
 import com.persagy.bdtp.adm.dao.AdmPipeConfigMapper;
 import com.persagy.bdtp.adm.dao.AdmRelsConfigMapper;
 import com.persagy.bdtp.adm.entity.*;
+import com.persagy.bdtp.adm.entity.db.*;
 import com.persagy.bdtp.adm.service.IConfigService;
 import com.persagy.bdtp.adm.service.ISyncApp;
 import com.persagy.bdtp.adm.service.ServiceUtil;
@@ -23,6 +24,7 @@ import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.define.entity.GraphDefine;
 import com.persagy.dmp.define.entity.RelationDefine;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
@@ -37,6 +39,7 @@ public class ToolController {
 	private ObjectMapper objectMapper;
 
 	@Autowired
+	@Qualifier(ServiceUtil.SYNC_APP_IMPL)
 	private ISyncApp syncApp;
 
 	@Autowired
@@ -46,12 +49,12 @@ public class ToolController {
 	private IConfigService configService;
 
 	@RequestMapping("/dict")
-	public AdmResult<Object> dict(@RequestBody AdmRequest req, @RequestParam(required = false) String module){
-		Map<String,Object> map = syncApp.queryDict(req.getGroupCode(), req.getProjectId(), req.getUserId(), !"infos".equals(module), false);
+	public AdmResult<Dict> dict(@RequestBody AdmRequest req, @RequestParam(required = false) String module){
+		Dict map = syncApp.queryDict(req.getGroupCode(), req.getProjectId(), req.getUserId(), !"infos".equals(module), false);
 
-		List<Map<String, Object>> majorList = (List)map.get("major");
-		List<TypeDef> sysList = (List)map.get("system");
-		List<TypeDef> equipList = (List)map.get("equipment");
+		List<Map<String, Object>> majorList = map.getMajor();
+		List<TypeDef> sysList = map.getSystem();
+		List<TypeDef> equipList = map.getEquipment();
 		distinct(sysList);
 		distinct(equipList);
 
@@ -72,12 +75,12 @@ public class ToolController {
 				}
 			}
 		}
-		map.remove("system");
+		map.setSystem(null);
 
 		if("infos".equals(module)) { //信息点配置
 
 		} else { //关系、管道、无模型设备
-			List<RelationDefine> relDefs = (List<RelationDefine>)map.get("relation");
+			List<RelationDefine> relDefs = (List<RelationDefine>)map.getRelation();
 			List<GraphDefine> graph = ServiceUtil.call (() -> rwdClient.queryGraphDef(req.getGroupCode(), req.getProjectId(), AdmConst.APP_ID, req.getUserId(), new QueryCriteria()));
 			List<Map<String, Object>> rels = new ArrayList<>();
 			for(GraphDefine gd : graph){
@@ -94,7 +97,7 @@ public class ToolController {
 						chidren.add(relDef);
 				}
 			}
-			map.put("relation", rels);
+			map.setRelation(rels);
 		}
 
 		return AdmResult.success(map);

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

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

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

@@ -1,7 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmComponent;
+import com.persagy.bdtp.adm.entity.db.AdmComponent;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

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

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

+ 1 - 2
src/main/java/com/persagy/bdtp/adm/dao/AdmContainerConfigMapper.java

@@ -1,8 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmConfig;
-import com.persagy.bdtp.adm.entity.AdmContainerConfig;
+import com.persagy.bdtp.adm.entity.db.AdmContainerConfig;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

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

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

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

@@ -1,7 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmInfosConfig;
+import com.persagy.bdtp.adm.entity.db.AdmInfosConfig;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

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

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

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

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

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

@@ -1,7 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmObject;
+import com.persagy.bdtp.adm.entity.db.AdmObject;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

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

@@ -1,7 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmPipeConfig;
+import com.persagy.bdtp.adm.entity.db.AdmPipeConfig;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

+ 1 - 1
src/main/java/com/persagy/bdtp/adm/dao/AdmPipeMapper.java

@@ -1,7 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmPipe;
+import com.persagy.bdtp.adm.entity.db.AdmPipe;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

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

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

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

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

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

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

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

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

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

@@ -1,7 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmRelsConfig;
+import com.persagy.bdtp.adm.entity.db.AdmRelsConfig;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper

+ 1 - 1
src/main/java/com/persagy/bdtp/adm/dao/AdmServeAreaMapper.java

@@ -1,7 +1,7 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmServeArea;
+import com.persagy.bdtp.adm.entity.db.AdmServeArea;
 
 public interface AdmServeAreaMapper extends BaseMapper<AdmServeArea> {
 

+ 5 - 1
src/main/java/com/persagy/bdtp/adm/dao/AdmUploadLogMapper.java

@@ -1,10 +1,14 @@
 package com.persagy.bdtp.adm.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.bdtp.adm.entity.AdmUploadLog;
+import com.persagy.bdtp.adm.entity.db.AdmUploadLog;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
 public interface AdmUploadLogMapper extends BaseMapper<AdmUploadLog> {
 
+//	@Override
+//	@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+//	int insert(AdmUploadLog entity);
+
 }

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

@@ -3,7 +3,7 @@ package com.persagy.bdtp.adm.datatx;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.persagy.bdtp.adm.entity.AdmObject;
+import com.persagy.bdtp.adm.entity.db.AdmObject;
 import org.springframework.stereotype.Component;
 
 /**

+ 0 - 38
src/main/java/com/persagy/bdtp/adm/entity/AdmUploadLog.java

@@ -1,38 +0,0 @@
-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 lombok.Data;
-
-@Data
-@TableName(value = "adm_upload_log",autoResultMap = true)
-public class AdmUploadLog {
-
-	private String uploadFlag;
-
-	private String entityType;
-
-	private String uploadTime;
-
-	private String operation;
-
-	@TableField(
-			typeHandler = JacksonTypeHandler.class
-	)
-	private Object data;
-
-	public AdmUploadLog(String uploadFlag, String uploadTime, Object data) {
-		this.uploadFlag = uploadFlag;
-		this.entityType = getLogEntityType(data);
-		this.uploadTime = uploadTime;
-		this.data = data;
-	}
-
-	private String getLogEntityType(Object o){
-		if(o instanceof AdmObject)
-			return ((AdmObject) o).getObjType();
-		return o.getClass().getSimpleName();
-	}
-
-}

+ 53 - 0
src/main/java/com/persagy/bdtp/adm/entity/BuildingData.java

@@ -0,0 +1,53 @@
+package com.persagy.bdtp.adm.entity;
+
+import cn.hutool.core.collection.CollUtil;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.bdtp.adm.entity.db.*;
+import com.persagy.dmp.common.model.entity.BaseEntity;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 按建筑下载的数据结构
+ */
+@Data
+public class BuildingData extends DownLoadData {
+
+	private String buildingId;
+
+	private List objects;
+
+	/** 按建筑筛选关系比较困难,待定 */
+	private List relations;
+
+	private List<AdmPipe> pipes;
+
+	private List<AdmJobSpace> jobSpace;
+
+	private List<AdmProblemArch> problemArch;
+
+	private List<AdmProblemEquip> problemEquip;
+
+	private List<AdmFile> file;
+
+	private List<AdmQrCode> qrCode;
+
+	private List<AdmServeArea> serveArea;
+
+	/** 待废弃 */
+	private String timestamp;
+
+	@Override
+	public void buildDownloadTs() {
+		long ts = getMaxTs(objects, relations);
+		if(ts > 0)
+			bdtpDownloadTs = ts;
+
+		ts = getMaxTs(pipes, jobSpace, problemArch, problemEquip, file, qrCode, serveArea);
+		if(ts > 0)
+			admDownloadTs = ts;
+	}
+
+}

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

@@ -0,0 +1,25 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.persagy.dmp.define.entity.RelationDefine;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 下载数据字典
+ */
+@Data
+public class Dict {
+
+	private List<Map<String, Object>> major;
+
+	private List<TypeDef> system;
+
+	private List<TypeDef> equipment;
+
+	private List<? extends Object> relation;
+
+	private List<InfoDef> infos;
+
+}

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

@@ -0,0 +1,53 @@
+package com.persagy.bdtp.adm.entity;
+
+import cn.hutool.core.collection.CollUtil;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.bdtp.adm.entity.db.BaseAdmDataEntity;
+import com.persagy.dmp.common.model.entity.BaseEntity;
+import com.persagy.dmp.digital.entity.ObjectRelation;
+
+import java.util.List;
+
+/**
+ * 下载数据结构基类
+ */
+abstract public class DownLoadData {
+
+	/** bdtp数据库下载同步时间戳 */
+	protected Long bdtpDownloadTs;
+
+	/** adm数据库下载同步时间戳 */
+	protected Long admDownloadTs;
+
+	abstract public void buildDownloadTs();
+
+	private long max(List<?> list, long maxTs) {
+		if(CollUtil.isNotEmpty(list)) {
+			for (Object data : list) {
+				long ts = -1;
+				if(data instanceof BaseAdmDataEntity) {
+					if(((BaseAdmDataEntity) data).getTs() != null )
+						ts = ((BaseAdmDataEntity) data).getTs().getTime();
+				} else if(data instanceof ObjectNode){
+					if(((ObjectNode) data).get("ts") != null)
+						ts = ((ObjectNode) data).get("ts").asLong();
+				} else if(data instanceof BaseEntity) {
+					if(((ObjectRelation) data).getTs() != null)
+						ts = ((ObjectRelation) data).getTs().getTime();
+				}
+				if(ts > maxTs)
+					maxTs = ts;
+			}
+		}
+		return maxTs;
+	}
+
+	protected long getMaxTs(List<?>... lists) {
+		long maxTs = -1;
+		for(List<?> list : lists) {
+			maxTs = max(list, maxTs);
+		}
+		return maxTs;
+	}
+
+}

+ 23 - 0
src/main/java/com/persagy/bdtp/adm/entity/ProjectData.java

@@ -0,0 +1,23 @@
+package com.persagy.bdtp.adm.entity;
+
+import com.persagy.dmp.digital.entity.ObjectRelation;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 按项目下载的数据结构
+ */
+@Data
+public class ProjectData extends DownLoadData {
+
+	/** 项目下的关系数据 */
+	private List<ObjectRelation> relations;
+
+	public void buildDownloadTs() {
+		long ts = getMaxTs(relations);
+		if(ts > 0)
+			bdtpDownloadTs = ts;
+	}
+
+}

+ 0 - 32
src/main/java/com/persagy/bdtp/adm/entity/SyncData.java

@@ -1,32 +0,0 @@
-package com.persagy.bdtp.adm.entity;
-
-import lombok.Data;
-
-import java.util.List;
-
-@Data
-public class SyncData {
-
-	private String buildingId;
-
-	private List<AdmObject> objects;
-
-	private List<AdmRelation> relations;
-
-	private List<AdmPipe> pipes;
-
-	private List<AdmJobSpace> jobSpace;
-
-	private List<AdmProblemArch> problemArch;
-
-	private List<AdmProblemEquip> problemEquip;
-
-	private List<AdmFile> file;
-
-	private List<AdmQrCode> qrCode;
-
-	private List<AdmServeArea> serveArea;
-
-	private String timestamp;
-
-}

+ 49 - 0
src/main/java/com/persagy/bdtp/adm/entity/UploadData.java

@@ -0,0 +1,49 @@
+package com.persagy.bdtp.adm.entity;
+
+import cn.hutool.core.collection.CollUtil;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.bdtp.adm.entity.db.*;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 上传的数据结构
+ */
+@Data
+public class UploadData {
+
+	/** 上传任务id */
+	private String uploadJobId;
+
+	/** 待废弃 */
+	private String buildingId;
+
+	private List<ObjectNode> objects;
+
+	private List<ObjectNode> relations;
+
+	private List<AdmPipe> pipes;
+
+	private List<AdmJobSpace> jobSpace;
+
+	private List<AdmProblemArch> problemArch;
+
+	private List<AdmProblemEquip> problemEquip;
+
+	private List<AdmFile> file;
+
+	private List<AdmQrCode> qrCode;
+
+	private List<AdmServeArea> serveArea;
+
+	public boolean notEmpty() {
+		return CollUtil.isNotEmpty(objects) || CollUtil.isNotEmpty(relations)
+				|| CollUtil.isNotEmpty(pipes)
+				|| CollUtil.isNotEmpty(jobSpace)
+				|| CollUtil.isNotEmpty(problemArch) || CollUtil.isNotEmpty(problemEquip)
+				|| CollUtil.isNotEmpty(file) || CollUtil.isNotEmpty(qrCode)
+				|| CollUtil.isNotEmpty(serveArea);
+	}
+
+}

+ 23 - 0
src/main/java/com/persagy/bdtp/adm/entity/db/AdmClientFlag.java

@@ -0,0 +1,23 @@
+package com.persagy.bdtp.adm.entity.db;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+@Data
+@TableName(value = "adm_client_flag", autoResultMap = true)
+public class AdmClientFlag {
+
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+
+	private String clientFlag;
+
+	private String userId;
+
+	private Timestamp ts;
+
+}

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.common.helper.SpringHelper;
 import lombok.Data;
 

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.TableField;

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

@@ -1,9 +1,10 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -11,7 +12,6 @@ import com.persagy.dmp.common.helper.SpringHelper;
 import lombok.Data;
 
 import java.io.IOException;
-import java.util.List;
 
 @Data
 @TableName(value = "adm_job_space",autoResultMap = true)
@@ -29,6 +29,7 @@ public class AdmJobSpace extends BaseAdmDataEntity {
 
     private Integer equipState;
 
+    @JsonIgnore
     @TableField(
             typeHandler = JacksonTypeHandler.class
     )

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.TableField;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.TableField;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.TableField;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.annotation.TableField;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;

+ 67 - 0
src/main/java/com/persagy/bdtp/adm/entity/db/AdmUploadLog.java

@@ -0,0 +1,67 @@
+package com.persagy.bdtp.adm.entity.db;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+
+import java.sql.Timestamp;
+
+@Data
+@TableName(value = "adm_upload_log",autoResultMap = true)
+public class AdmUploadLog {
+
+	public static final String ADD = "add";
+
+	public static final String MODIFY = "modify";
+
+	public static final String REMOVE = "remove";
+
+	private String operator;
+
+	private String jobId;
+
+	private String entityType;
+
+	private String operation;
+
+	private String data; //数据库中json类型
+
+	private Timestamp ts;
+
+	private String uploadTime;
+
+	private String uploadFlag;
+
+	public AdmUploadLog(String jobId, String operator, String operation) {
+		this.jobId = jobId;
+		this.operator = operator;
+		this.operation = operation;
+	}
+
+	public AdmUploadLog(String uploadFlag, String uploadTime, Object data) {
+		this.uploadFlag = uploadFlag;
+		this.uploadTime = uploadTime;
+		setData(data, SpringUtil.getBean(ObjectMapper.class));
+	}
+
+	public void setData(Object data, ObjectMapper objectMapper){
+		this.entityType = getLogEntityType(data);
+		try {
+			this.data = objectMapper.writeValueAsString(data);
+		} catch (Exception e) {
+
+		}
+	}
+
+	private String getLogEntityType(Object o){
+		if(o instanceof AdmObject)
+			return ((AdmObject) o).getObjType();
+		return o.getClass().getSimpleName();
+	}
+
+}

+ 10 - 1
src/main/java/com/persagy/bdtp/adm/entity/BaseAdmDataEntity.java

@@ -1,7 +1,10 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 
+import java.sql.Timestamp;
+
 /**
  * 数据实体基类
  */
@@ -24,4 +27,10 @@ abstract public class BaseAdmDataEntity extends BaseAdmEntity {
 
 	protected String uploadFlag;
 
+	protected Timestamp ts;
+
+	/** APP端上传的数据状态,可以判断是否为新增数据 */
+	@TableField(exist = false)
+	protected Integer state;
+
 }

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import lombok.Data;
 

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

@@ -1,4 +1,4 @@
-package com.persagy.bdtp.adm.entity;
+package com.persagy.bdtp.adm.entity.db;
 
 import lombok.Data;
 

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

@@ -1,6 +1,6 @@
 package com.persagy.bdtp.adm.service;
 
-import com.persagy.bdtp.adm.entity.AdmUploadLog;
+import com.persagy.bdtp.adm.entity.db.AdmUploadLog;
 
 import java.util.List;
 

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

@@ -1,6 +1,6 @@
 package com.persagy.bdtp.adm.service;
 
-import com.persagy.bdtp.adm.entity.AdmObject;
+import com.persagy.bdtp.adm.entity.db.AdmObject;
 
 import java.util.List;
 

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

@@ -2,7 +2,7 @@ package com.persagy.bdtp.adm.service;
 
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.persagy.bdtp.adm.entity.*;
+import com.persagy.bdtp.adm.entity.db.*;
 
 import java.util.List;
 

+ 9 - 6
src/main/java/com/persagy/bdtp/adm/service/ISyncApp.java

@@ -1,7 +1,6 @@
 package com.persagy.bdtp.adm.service;
 
-import com.persagy.bdtp.adm.entity.SyncData;
-import com.persagy.bdtp.adm.entity.UploadRtn;
+import com.persagy.bdtp.adm.entity.*;
 
 import java.util.Map;
 
@@ -10,9 +9,9 @@ import java.util.Map;
  */
 public interface ISyncApp {
 
-	Map<String, Object> queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos);
+	Dict queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos);
 
-	Map<String, Object> downloadDict(String groupCode, String projectId, String userId);
+	Dict downloadDict(String groupCode, String projectId, String userId);
 
 	Map<String, Object> downloadConfig(String groupCode, String projectId, String userId);
 
@@ -20,8 +19,12 @@ public interface ISyncApp {
 
 	/*Map<String, Object> downloadFloorData(String projectId, String floorId, String uploadFlag, String lastDownloadTime);*/
 
-	SyncData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime);
+	BuildingData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime);
 
-	UploadRtn uploadData(SyncData uploadData, String projectId, String uploadFlag);
+	BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String uploadFlag, String buildingId, Long bdtpDownloadTs, Long admDownloadTs);
+
+	ProjectData downloadProjectData(String groupCode, String projectId, String userId, String uploadFlag, Long bdtpDownloadTs, Long admDownloadTs);
+
+	UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String uploadFlag);
 
 }

+ 20 - 11
src/main/java/com/persagy/bdtp/adm/service/ServiceUtil.java

@@ -1,6 +1,7 @@
 package com.persagy.bdtp.adm.service;
 
 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.AdmResult;
 import com.persagy.bdtp.adm.entity.Pagination;
@@ -12,8 +13,27 @@ import java.util.function.Supplier;
 
 public class ServiceUtil {
 
+	public static final String SYNC_APP_IMPL = "syncAppImpl0";
+
 	private static final String SUCCESS = "success";
 
+	public static QueryCriteria getQueryCriteria(ObjectMapper objectMapper, String... objType){
+		QueryCriteria queryCriteria = new QueryCriteria();
+
+		ObjectNode objectNode = objectMapper.createObjectNode();
+		if(objType.length  == 1)
+			objectNode.put("objType", objType[0]);
+		else if(objType.length > 1) {
+			ArrayNode arrayNode = objectNode.putArray("objType");
+			for(String type : objType) {
+				arrayNode.add(type);
+			}
+		}
+
+		queryCriteria.setCriteria(objectNode);
+		return queryCriteria;
+	}
+
 	public static <T> T call(Supplier<CommonResult<T>> action) {
 		return call(action, null);
 	}
@@ -42,15 +62,4 @@ public class ServiceUtil {
 		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;
-	}
-
 }

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

@@ -1,15 +1,9 @@
 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.dao.AdmUploadLogMapper;
-import com.persagy.bdtp.adm.entity.AdmObject;
-import com.persagy.bdtp.adm.entity.AdmUploadLog;
+import com.persagy.bdtp.adm.entity.db.AdmUploadLog;
 import com.persagy.bdtp.adm.service.IAdmLogService;
-import com.persagy.bdtp.adm.service.IAdmObjectService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;

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

@@ -5,7 +5,7 @@ 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.entity.db.AdmObject;
 import com.persagy.bdtp.adm.service.IAdmObjectService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;

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

@@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.bdtp.adm.dao.*;
-import com.persagy.bdtp.adm.entity.*;
+import com.persagy.bdtp.adm.entity.db.*;
 import com.persagy.bdtp.adm.service.IConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;

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

@@ -2,8 +2,7 @@ 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.db.AdmM2dEquip;
 import com.persagy.bdtp.adm.entity.Pagination;
 import com.persagy.bdtp.adm.entity.oldadm.*;
 import com.persagy.bdtp.adm.service.IConfigService;

+ 300 - 255
src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl.java

@@ -6,26 +6,23 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.fasterxml.jackson.core.type.TypeReference;
-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.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.entity.db.*;
 import com.persagy.bdtp.adm.service.*;
+import com.persagy.bdtp.adm.util.DataExtrasUtil;
 import com.persagy.dmp.basic.model.QueryCriteria;
-import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.constant.ValidEnum;
-import com.persagy.dmp.common.helper.SpringHelper;
 import com.persagy.dmp.common.model.response.CommonResult;
-import com.persagy.dmp.define.entity.ObjectInfoDefine;
 import com.persagy.dmp.define.entity.RelationDefine;
+import com.persagy.dmp.digital.client.DigitalObjectClient;
+import com.persagy.dmp.digital.client.DigitalRelationClient;
+import com.persagy.dmp.digital.entity.ObjectRelation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -37,26 +34,22 @@ import java.util.function.Supplier;
 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;
+	private DigitalObjectClient objectClient;
 
+	@Autowired
+	private DigitalRelationClient relationClient;
 
 	@Autowired
-	private AdmObjectMapper admObjMapper;
+	private AdmClientFlagMapper clientFlagMapper;
 
 	@Autowired
-	private AdmRelationMapper relationMapper;
+	private IConfigService configService;
 
 	@Autowired
 	private AdmPipeMapper pipeMapper;
@@ -88,108 +81,48 @@ public class SyncAppImpl implements ISyncApp {
 	@Autowired
 	private IAdmLogService logService;
 
-//	@Autowired
-//	ResourceLoader resourceLoader;
-
-
 	@Override
-	public Map<String, Object> downloadDict(String groupCode, String projectId, String userId) {
+	public Dict downloadDict(String groupCode, String projectId, String userId) {
 		return queryDict(groupCode, projectId, userId, true, true);
 	}
 
 	@Override
-	public Map<String, Object> downloadConfig(String groupCode, String projectId, String userId) {
-		//配置数据查询
-		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);
-		List<AdmContainerConfig> containerConfig = configService.queryContainerConfig(projectId);
-
-		HashMap<String, Object> data = new HashMap<>();
-		data.put("m2dTypes", m2dTypes);
-		data.put("infosConfig", serializeJsonProp(infosConfig));
-		data.put("relConfig", relConfig);
-		data.put("pipeConfig", pipeConfig);
-		data.put("config", serializeJsonProp(config));
-		data.put("component", component);
-		data.put("containerConfig", containerConfig);
-
-		return data;
-	}
-
-	@Override
-	public Map<String, Object> queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos){
-		boolean newDict = "JD".equalsIgnoreCase(groupCode);
-
+	public Dict queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos){
 		//从知识库服务获取专业分类
-		QueryCriteria majorCriteria = ServiceUtil.getQueryCriteria(null, objectMapper);
+		QueryCriteria majorCriteria = ServiceUtil.getQueryCriteria(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");
+		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
 		List<TypeDef> typeList = queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
 
-		//查询重命名设备类型
-		ObjectNode renameNode = !newDict ? configService.queryRenameEquipTypes(projectId) : null;
-
 		LinkedList<TypeDef> sysList = new LinkedList<>();
 		LinkedList<TypeDef> equipList = new LinkedList<>();
 		for(TypeDef def : typeList){
-			if(def.getObjType().equals("system"))
+			if(def.getObjType().equals(AdmConst.OBJ_TYPE_SYSTEM))
 				sysList.add(def);
-			else if(def.getObjType().equals("equipment")) {
-				if(!newDict) {
-					if (renameNode != null) { //设备类型重命名
-						JsonNode n = renameNode.get(def.getCode());
-						if(n != null)
-							def.setName(n.asText());
-					}
-				}
+			else if(def.getObjType().equals(AdmConst.OBJ_TYPE_EQUIPMENT))
 				equipList.add(def);
-			}
-		}
-
-		//加载新增的自定义设备类
-//		try{
-//			Resource resource = resourceLoader.getResource("classpath:equip.json");
-//			List<TypeDef> types = objectMapper.readValue(resource.getInputStream(), new TypeReference<List<TypeDef>>(){});
-//			equipList.addAll(types);
-//		}catch (Exception e) {
-//
-//		}
-		if(!newDict) {
-			ArrayNode arr = configService.queryNewEquipTypes(projectId);
-			if(arr != null) {
-				try{
-					List<TypeDef> types = objectMapper.readValue(objectMapper.writeValueAsString(arr), new TypeReference<List<TypeDef>>(){});
-					equipList.addAll(types);
-				}catch (Exception e) {
-
-				}
-			}
 		}
 
-		HashMap<String, Object> data = new HashMap<>();
-		data.put("major", majorList);
-		data.put("system", sysList);
-		data.put("equipment", equipList);
+		Dict data = new Dict();
+		data.setMajor(majorList);
+		data.setSystem(sysList);
+		data.setEquipment(equipList);
 
 		//查询关系定义
 		if(includeRel) {
 			List<RelationDefine> relList = ServiceUtil.call(() -> rwdClient.queryRelDef(groupCode, projectId, AdmConst.APP_ID, userId, new QueryCriteria()));
-			data.put("relation", relList);
+			data.setRelation(relList);
 		}
+
 		//查询信息点定义
 		if(includeInfos) {
 			QueryCriteria qc = new QueryCriteria();
 			qc.setCriteria(objectMapper.createObjectNode());
 			List<InfoDef> funcList = ServiceUtil.call(() -> rwdClient.queryFunc(groupCode, projectId, AdmConst.APP_ID, userId, qc));
-			data.put("infos", funcList);
+			data.setInfos(funcList);
 		}
 
 		return data;
@@ -210,211 +143,347 @@ public class SyncAppImpl implements ISyncApp {
 	}
 
 	@Override
+	public Map<String, Object> downloadConfig(String groupCode, String projectId, String userId) {
+		//配置数据查询
+		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);
+		List<AdmContainerConfig> containerConfig = configService.queryContainerConfig(projectId);
+
+		HashMap<String, Object> data = new HashMap<>();
+		data.put("m2dTypes", m2dTypes);
+		data.put("infosConfig", infosConfig);
+		data.put("relConfig", relConfig);
+		data.put("pipeConfig", pipeConfig);
+		data.put("config", config);
+		data.put("component", component);
+		data.put("containerConfig", containerConfig);
+
+		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);
+		//TODO 项目修改为从运维平台查询
+		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_PROJECT);
+		List<ObjectNode> prjList = ServiceUtil.call(() -> objectClient.query(groupCode, null, AdmConst.APP_ID, userId, criteria));
+		packInfos(prjList);
+
+		QueryCriteria criteria2 = ServiceUtil.getQueryCriteria(objectMapper, AdmConst.OBJ_TYPE_BUILDING, AdmConst.OBJ_TYPE_FLOOR);
+		List<ObjectNode> bdAndFl = ServiceUtil.call(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria2));
+		packInfos(bdAndFl);
 
 		HashMap<String, Object> data = new HashMap<>();
 		data.put("projects", prjList);
-		data.put("buildingsAndFloors", serializeJsonProp(bdAndFl));
+		data.put("buildingsAndFloors", bdAndFl);
+
 		return data;
 	}
 
+	private void packInfos(List<ObjectNode> dataList){
+		for(ObjectNode node : dataList) {
+			DataExtrasUtil.packObjExtras(node);
+		}
+	}
+
 	@Override
-	public SyncData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime) {
-		List<AdmObject> bdData = admObjMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmObject>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-		List<AdmRelation> bdRel = relationMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmRelation>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-		List<AdmPipe> pipes = pipeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmPipe>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+	public BuildingData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime) {
+		throw new RuntimeException("not supported");
+	}
+
+	@Override
+	public BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String uploadFlag, String buildingId, Long bdtpDownloadTs, Long admDownloadTs) {
+		String operator = getOperator(uploadFlag, userId);
+
+		//从bdtp下载对象(空间、竖井、设备)
+		QueryCriteria objCriteria = ServiceUtil.getQueryCriteria(objectMapper,
+				AdmConst.OBJ_TYPE_SPACE, AdmConst.OBJ_TYPE_SHAFT, AdmConst.OBJ_TYPE_SYSTEM, AdmConst.OBJ_TYPE_EQUIPMENT);
+		buildDownloadQueryCriteria(objCriteria, buildingId, operator, bdtpDownloadTs);
+		List<ObjectNode> objs = queryAllPage(() -> objectClient.query(groupCode, projectId, AdmConst.APP_ID, userId, objCriteria), objCriteria, new Pagination(500));
+		packInfos(objs);
+		test4Ts(objs);
+
+		//关系数据按项目下载,不在建筑数据中处理
+
+		//管道数据,实验方案
+		List<AdmPipe> pipes = pipeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmPipe>(), projectId, buildingId, operator, admDownloadTs));
 
 		//任务相关数据查询
-		List<AdmJobSpace> jobSpace = jobSpaceMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmJobSpace>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-		List<AdmProblemArch> problemArch = problemArchMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemArch>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-		List<AdmProblemEquip> problemEquip = problemEquipMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemEquip>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-		List<AdmFile> file = fileMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmFile>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-		List<AdmQrCode> qrCode = qrCodeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmQrCode>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-		List<AdmServeArea> serveArea = serveAreaMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmServeArea>(), projectId, buildingId, uploadFlag, lastDownloadTime));
-
-		SyncData data = new SyncData();
+		List<AdmJobSpace> jobSpace = jobSpaceMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmJobSpace>(), projectId, buildingId, operator, admDownloadTs));
+		List<AdmProblemArch> problemArch = problemArchMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemArch>(), projectId, buildingId, operator, admDownloadTs));
+		List<AdmProblemEquip> problemEquip = problemEquipMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemEquip>(), projectId, buildingId, operator, admDownloadTs));
+		List<AdmFile> file = fileMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmFile>(), projectId, buildingId, operator, admDownloadTs));
+		List<AdmQrCode> qrCode = qrCodeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmQrCode>(), projectId, buildingId, operator, admDownloadTs));
+		List<AdmServeArea> serveArea = serveAreaMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmServeArea>(), projectId, buildingId, operator, admDownloadTs));
+
+		BuildingData data = new BuildingData();
 		data.setBuildingId(buildingId);
 
-		data.setObjects(serializeJsonProp(bdData));
-		data.setRelations(bdRel);
-		data.setPipes(serializeJsonProp(pipes));
+		data.setObjects(objs);
+
+		data.setPipes(pipes);
 
-		data.setJobSpace(serializeJsonProp(jobSpace));
-		data.setProblemArch(serializeJsonProp(problemArch));
+		data.setJobSpace(jobSpace);
+		data.setProblemArch(problemArch);
 		data.setProblemEquip(problemEquip);
 		data.setFile(file);
-		data.setQrCode(serializeJsonProp(qrCode));
+		data.setQrCode(qrCode);
 		data.setServeArea(serveArea);
-		data.setTimestamp(DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN));
 
+		data.buildDownloadTs();
 		return data;
 	}
 
-	private <T> QueryWrapper<T> buildDownloadQueryWrapper(QueryWrapper<T> wrapper, String projectId, String buildingId, String uploadFlag, String lastDownloadTime){
-		wrapper.eq("project_id", projectId).eq("building_id", buildingId);
-		applyUploadFlag(wrapper, uploadFlag,lastDownloadTime);
-		return wrapper;
+	private String getOperator(String uploadFlag, String userId){
+		AdmClientFlag clientFlag = clientFlagMapper.selectOne(new QueryWrapper<AdmClientFlag>().eq("client_flag", uploadFlag));
+		if(clientFlag == null) {
+			clientFlag = new AdmClientFlag();
+			clientFlag.setClientFlag(uploadFlag);
+			clientFlag.setUserId(userId);
+			clientFlagMapper.insert(clientFlag);
+		}
+		return userId + ':' + clientFlag.getId();
 	}
 
-	private void applyUploadFlag(QueryWrapper<?> wrapper, String uploadFlag, String lastDownloadTime){
-		if (StrUtil.isNotBlank(lastDownloadTime)) { //非初始化下载
-			if (StrUtil.isNotBlank(uploadFlag))
-				wrapper.and(w -> w.isNull("upload_flag").or().ne("upload_flag", uploadFlag));
+	private <T> QueryWrapper<T> buildDownloadQueryWrapper(QueryWrapper<T> wrapper, String projectId, String buildingId, String operator, Long lastDownloadTime){
+		wrapper.eq("project_id", projectId).eq("building_id", buildingId);
+
+		if (lastDownloadTime != null && lastDownloadTime > 0) { //非初始化下载
+			wrapper.gt("ts", lastDownloadTime);
 
 			wrapper.and(
-					w -> w.isNotNull("modified_time").gt("modified_time", lastDownloadTime)
+					w -> w.isNotNull("modifier").ne("modifier", operator)
 							.or()
-							.isNull("modified_time").gt("creation_time", lastDownloadTime)
+							.isNull("modifier").ne("creator", operator)
 			);
 		}
+
+		return wrapper;
+	}
+
+	private void buildDownloadQueryCriteria(QueryCriteria criteria, String buildingId, String operator, Long lastDownloadTime){
+		if(StrUtil.isNotBlank(buildingId)) {
+			//TODO 关联buildingId查询
+		}
+
+		if (lastDownloadTime != null && lastDownloadTime > 0) {
+			criteria.getCriteria().putObject("ts").put("$gt", lastDownloadTime);
+			criteria.getCriteria().putObject("modifier").put("$ne", operator); //TODO 暂时只能处理modifier
+		}
+	}
+
+	//TODO debug 接口未返回ts时,添加一个
+	private void test4Ts(List<?> dataList){
+		for(Object data : dataList) {
+			if(data instanceof ObjectNode) {
+				if (((ObjectNode) data).get("ts") == null)
+					((ObjectNode) data).put("ts", System.currentTimeMillis());
+			} else if(data instanceof ObjectRelation){
+				if(((ObjectRelation) data).getTs() == null)
+					((ObjectRelation) data).setTs(new Date());
+			}
+		}
 	}
 
 	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public UploadRtn uploadData(SyncData uploadData, String projectId, String uploadFlag) {
-		UploadRtn rtn = new UploadRtn();
+	public ProjectData downloadProjectData(String groupCode, String projectId, String userId, String uploadFlag, Long bdtpDownloadTs, Long admDownloadTs) {
+		String operator = getOperator(uploadFlag, userId);
+
+		QueryCriteria criteria = ServiceUtil.getQueryCriteria(objectMapper);
+		buildDownloadQueryCriteria(criteria, null, operator, bdtpDownloadTs);
+
+		List<ObjectRelation> rels = queryAllPage(() -> relationClient.query(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+		test4Ts(rels);
+
+		ProjectData data = new ProjectData();
+		data.setRelations(rels);
+
+		data.buildDownloadTs();
+		return data;
+	}
+
+	@Override
+	public UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String uploadFlag) {
+		if(!uploadData.notEmpty())
+			return new UploadRtn();
+
+		String operator = getOperator(uploadFlag, userId);
 		String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
 
+		UploadRtn rtn = new UploadRtn();
+		List<AdmUploadLog> logs = new ArrayList<>();
+
+		//上传bdtp数据
 		if (CollUtil.isNotEmpty(uploadData.getObjects())) {
-			List<AdmObject> dbObjs = admObjMapper.selectList(new QueryWrapper<AdmObject>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmObject> expired = uploadAdmData(deserializeJsonProp(uploadData.getObjects()), dbObjs, uploadFlag, timestamp, admObjMapper, "object");
-			rtn.setExpiredObjectIds(buildExpiredIds(expired));
+			List<ObjectNode>[] objData = prepareBdtpData(uploadData.getObjects(), operator, timestamp, uploadData.getUploadJobId(), logs);
+			uploadObjs(groupCode, projectId, userId, objData);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getRelations())) {
-			List<AdmRelation> dbObjs = relationMapper.selectList(new QueryWrapper<AdmRelation>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmRelation> expired = uploadAdmData(uploadData.getRelations(), dbObjs, uploadFlag, timestamp, relationMapper, "relation");
-			rtn.setExpiredRelationIds(buildExpiredIds(expired));
+			List<ObjectNode>[] relData = prepareBdtpData(uploadData.getRelations(), operator, timestamp, uploadData.getUploadJobId(), logs);
+			uploadRels(groupCode, projectId, userId, relData);
+		}
+
+		//上传adm数据
+		uploadAdmData(uploadData, operator, timestamp, logs);
+
+		//记录日志
+		logService.saveUploadLog(logs);
+
+		//TODO m2d, message & state
+
+		rtn.setTimestamp(timestamp);
+		return rtn;
+	}
+
+	private void uploadObjs(String groupCode, String projectId, String userId, List<ObjectNode>[] data) {
+		if(data[0].size() > 0)
+			ServiceUtil.call(() -> objectClient.create(groupCode, projectId, AdmConst.APP_ID, userId, data[0]));
+		if (data[1].size() > 0)
+			ServiceUtil.call(() -> objectClient.update(groupCode, projectId, AdmConst.APP_ID, userId, data[1]));
+	}
+
+	private void uploadRels(String groupCode, String projectId, String userId, List<ObjectNode>[] data) {
+		if(data[0].size() > 0)
+			ServiceUtil.call(() -> relationClient.create(groupCode, projectId, AdmConst.APP_ID, userId, data[0]));
+		if (data[1].size() > 0)
+			ServiceUtil.call(() -> relationClient.update(groupCode, projectId, AdmConst.APP_ID, userId, data[1]));
+	}
+
+	private List<ObjectNode>[] prepareBdtpData(List<ObjectNode> list, String operator, String time, String jobId, List<AdmUploadLog> logs){
+		List<ObjectNode> updateList = new ArrayList<>();
+		Iterator<ObjectNode> iter = list.iterator();
+		while (iter.hasNext()) {
+			ObjectNode entity = iter.next();
+			DataExtrasUtil.unpackObjExtras(entity);
+
+			AdmUploadLog log;
+			if (entity.get("state").asInt() == 1) {
+				updateList.add(entity);
+				iter.remove();
+
+				boolean remove = entity.get("valid").asInt() == ValidEnum.FALSE.getType();
+				log = new AdmUploadLog(jobId, operator, remove ? AdmUploadLog.REMOVE : AdmUploadLog.MODIFY);
+				log.setData(entity, objectMapper);
+
+				entity.put("updateApp", AdmConst.CREATOR_APP);
+				entity.put("modifier", operator);
+				entity.put("modifiedTime", time);
+
+				//TODO 可能需要进行删除信息点操作
+
+			} else {
+				log = new AdmUploadLog(jobId, operator, AdmUploadLog.ADD);
+				log.setData(entity, objectMapper);
+
+				entity.put("createApp", AdmConst.CREATOR_APP);
+				entity.put("creator", operator);
+				entity.put("creationTime", time);
+				entity.put("modifiedTime", time); //TODO 临时处理,方便之后的增量查询
+			}
+			logs.add(log);
 		}
 
+		return new List[] {list, updateList};
+	}
+
+	@Transactional(rollbackFor = Exception.class)
+	public void uploadAdmData(UploadData uploadData, String operator, String time, List<AdmUploadLog> logs){
 		if (CollUtil.isNotEmpty(uploadData.getPipes())) {
-			List<AdmPipe> dbObjs = pipeMapper.selectList(new QueryWrapper<AdmPipe>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmPipe> expired = uploadAdmData(deserializeJsonProp(uploadData.getPipes()), dbObjs, uploadFlag, timestamp, pipeMapper, "pipe");
-			rtn.setExpiredPipeIds(buildExpiredIds(expired));
+			uploadAdmEntities(uploadData.getPipes(), operator, time, uploadData.getUploadJobId(), pipeMapper, logs, true);
 		}
 
 		if (CollUtil.isNotEmpty(uploadData.getJobSpace())) {
-			List<AdmJobSpace> dbObjs = jobSpaceMapper.selectList(new QueryWrapper<AdmJobSpace>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmJobSpace> expired = uploadAdmData(deserializeJsonProp(uploadData.getJobSpace()), dbObjs, uploadFlag, timestamp, jobSpaceMapper, null);
-			rtn.setExpiredJobSpaceIds(buildExpiredIds(expired));
+			uploadAdmEntities(uploadData.getJobSpace(), operator, time, uploadData.getUploadJobId(), jobSpaceMapper, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getProblemArch())) {
-			List<AdmProblemArch> dbObjs = problemArchMapper.selectList(new QueryWrapper<AdmProblemArch>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmProblemArch> expired = uploadAdmData(deserializeJsonProp(uploadData.getProblemArch()), dbObjs, uploadFlag, timestamp, problemArchMapper, null);
-			rtn.setExpiredProblemArchIds(buildExpiredIds(expired));
+			uploadAdmEntities(uploadData.getProblemArch(), operator, time, uploadData.getUploadJobId(), problemArchMapper, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getProblemEquip())) {
-			List<AdmProblemEquip> dbObjs = problemEquipMapper.selectList(new QueryWrapper<AdmProblemEquip>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmProblemEquip> expired = uploadAdmData(uploadData.getProblemEquip(), dbObjs, uploadFlag, timestamp, problemEquipMapper, null);
-			rtn.setExpiredProblemEquipIds(buildExpiredIds(expired));
+			uploadAdmEntities(uploadData.getProblemEquip(), operator, time, uploadData.getUploadJobId(), problemEquipMapper, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getFile())) {
-			List<AdmFile> dbObjs = fileMapper.selectList(new QueryWrapper<AdmFile>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmFile> expired = uploadAdmData(uploadData.getFile(), dbObjs, uploadFlag, timestamp, fileMapper, null);
-			rtn.setExpiredFileIds(buildExpiredIds(expired));
+			uploadAdmEntities(uploadData.getFile(), operator, time, uploadData.getUploadJobId(), fileMapper, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getQrCode())) {
-			List<AdmQrCode> dbObjs = qrCodeMapper.selectList(new QueryWrapper<AdmQrCode>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmQrCode> expired = uploadAdmData(deserializeJsonProp(uploadData.getQrCode()), dbObjs, uploadFlag, timestamp, qrCodeMapper, null);
-			rtn.setExpiredQrCodeIds(buildExpiredIds(expired));
+			uploadAdmEntities(uploadData.getQrCode(), operator, time, uploadData.getUploadJobId(), qrCodeMapper, logs, false);
 		}
 		if (CollUtil.isNotEmpty(uploadData.getServeArea())) {
-			List<AdmServeArea> dbObjs = serveAreaMapper.selectList(new QueryWrapper<AdmServeArea>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
-			List<AdmServeArea> expired = uploadAdmData(uploadData.getServeArea(), dbObjs, uploadFlag, timestamp, serveAreaMapper, null);
-			rtn.setExpiredServeAreaIds(buildExpiredIds(expired));
+			uploadAdmEntities(uploadData.getServeArea(), operator, time, uploadData.getUploadJobId(), serveAreaMapper, logs, false);
 		}
-
-		rtn.setTimestamp(timestamp);
-		rtn.setBuildingId(uploadData.getBuildingId());
-		return rtn;
 	}
 
-	private <T extends BaseAdmDataEntity> List<T> uploadAdmData(List<T> objs, List<T> dbObjs, String uploadFlag, String timestamp, BaseMapper<T> mapper, String d2mType){
-		List<T> expired = new ArrayList<>();
-		HashMap<String, T> dbMap = new HashMap<>(dbObjs.size());
-		for(T dbObj : dbObjs) {
-			dbMap.put(dbObj.getId(), dbObj);
-		}
-
-		List<T> msgAdd = new ArrayList<>();
-		List<T> msgModify = new ArrayList<>();
-		List<T> msgRemove = new ArrayList<>();
-		for (T obj : objs) {
-			if(obj == null)
-				continue;
+	private <T extends BaseAdmDataEntity> void uploadAdmEntities(List<T> list, String operator, String time, String jobId, BaseMapper<T> mapper, List<AdmUploadLog> logs, boolean merge) {
+		List<T> updateList = new ArrayList<>();
+		Iterator<T> iter = list.iterator();
+		while (iter.hasNext()) {
+			T entity = iter.next();
 
-			logService.saveUploadLog(new AdmUploadLog(uploadFlag, timestamp, obj));
+			AdmUploadLog log;
+			if (entity.getState() == 1) {
+				updateList.add(entity);
+				iter.remove();;
 
-			T dbObj = dbMap.get(obj.getId());
-			if (dbObj == null) {
-				if(obj.getValid().intValue() == ValidEnum.FALSE.getType())
-					continue;
+				boolean remove = entity.getValid().intValue() == ValidEnum.FALSE.getType();
+				log = new AdmUploadLog(jobId, operator, remove ? AdmUploadLog.REMOVE : AdmUploadLog.MODIFY);
+			} else {
+				log = new AdmUploadLog(jobId, operator, AdmUploadLog.ADD);
+			}
+			log.setData(entity, objectMapper);
+			logs.add(log);
+		}
 
-				obj.setCreationTime(timestamp);
-				obj.setCreator(AdmConst.CREATOR_APP);
-				obj.setUploadFlag(uploadFlag);
+		//insert
+		if(list.size() > 0) {
+			for(T entity : list) {
+				entity.setCreator(operator);
+				entity.setCreationTime(time);
+				mapper.insert(entity);
+			}
+		}
 
-				if(d2mType != null)
-					setDeliveryDataProps((BaseDeliveryEntity) obj, null);
+		//update
+		if (updateList.size() > 0) {
+			Map<String, T> dbObjsMap = null;
+			if(merge) {
+				ArrayList<String> updateIds = new ArrayList<>(updateList.size());
+				updateList.forEach(entity -> updateIds.add(entity.getId()));
+				List<T> dbList = mapper.selectBatchIds(updateIds);
+
+				dbObjsMap = new HashMap<>(dbList.size());
+				for(T dbObj : dbList) {
+					dbObjsMap.put(dbObj.getId(), dbObj);
+				}
+			}
 
-				mapper.insert(obj);
+			for(T entity : updateList) {
+				if(merge)
+					entity = mergeEntity(entity, dbObjsMap.get(entity.getId()));
 
-				if(d2mType != null)
-					msgAdd.add(obj);
-			} else {
-//				String dbTs;
-//				String ts;
-//				if(dbObj.getModifiedTime() != null){
-//					dbTs = dbObj.getModifiedTime();
-//					ts = obj.getModifiedTime();
-//				} else {
-//					dbTs = dbObj.getCreationTime();
-//					ts = obj.getCreationTime();
-//				}
-//				if (!dbTs.equals(ts)) {
-//					//TODO 时间戳不一致,离线数据无效,暂时跳过处理
-//					expired.add(obj);
-//				} else {
-					obj.setModifiedTime(timestamp);
-					obj.setModifier(AdmConst.CREATOR_APP);
-					obj.setUploadFlag(uploadFlag);
-
-					if(d2mType != null)
-						setDeliveryDataProps((BaseDeliveryEntity) obj, null);
-
-					//合并信息点
-					if(dbObj instanceof AdmObject && obj instanceof AdmObject)
-						((AdmObject) obj).setInfos(mergeInfos(((AdmObject) obj).getInfos(), ((AdmObject) dbObj).getInfos()));
-					else if(dbObj instanceof AdmPipe && obj instanceof AdmPipe)
-						((AdmPipe) obj).setInfos(mergeInfos(((AdmPipe) obj).getInfos(), ((AdmPipe) dbObj).getInfos()));
-
-					mapper.updateById(obj);
-
-					if(d2mType != null) {
-						if(obj.getValid().intValue() == ValidEnum.FALSE.getType())
-							msgRemove.add(obj);
-						else
-							msgModify.add(obj);
-					}
-//				}
+				entity.setModifier(operator);
+				entity.setModifiedTime(time);
+				mapper.updateById(entity);
 			}
 		}
+	}
 
-		if(d2mType != null)
-			sendD2mMessage(d2mType, msgAdd, msgModify, msgRemove);
+	private <T extends BaseAdmDataEntity> T mergeEntity(T obj, T dbObj) {
+		if (dbObj != null) {
+			if(dbObj instanceof AdmPipe)
+				((AdmPipe)obj).setInfos(mergeInfos(((AdmPipe) obj).getInfos(), ((AdmPipe) dbObj).getInfos()));
+		}
+		return obj;
+	}
 
-		return expired;
+	private ObjectNode mergeInfos(ObjectNode infos, ObjectNode dbInfos){
+		if (dbInfos != null) {
+			if(infos != null)
+				dbInfos.setAll(infos);
+			return dbInfos;
+		} else
+			return infos;
 	}
 
 	private void setDeliveryDataProps(BaseDeliveryEntity obj, BaseDeliveryEntity dbObj){
@@ -427,15 +496,6 @@ public class SyncAppImpl implements ISyncApp {
 		}
 	}
 
-	private ObjectNode mergeInfos(ObjectNode infos, ObjectNode dbInfos){
-		if(dbInfos != null) {
-			if(infos != null)
-				dbInfos.setAll(infos);
-			return dbInfos;
-		} else
-			return infos;
-	}
-
 	private void sendD2mMessage(String objectType, List<?> msgAdd, List<?> msgModify, List<?> msgRemove){
 		D2mMessage message = new D2mMessage();
 		message.setItemType(objectType);
@@ -458,19 +518,4 @@ public class SyncAppImpl implements ISyncApp {
 		return null;
 	}
 
-	private <T extends BaseAdmEntity> List<T> serializeJsonProp(List<T> list){
-		//app端完善,不需要做tostr处理了
-//		for(BaseAdmEntity entity : list) {
-//			entity.serializeJsonProp();
-//		}
-		return list;
-	}
-
-	private <T extends BaseAdmEntity> List<T> deserializeJsonProp(List<T> list){
-		for(BaseAdmEntity entity : list) {
-			entity.deserializeJsonProp();
-		}
-		return list;
-	}
-
 }

+ 508 - 0
src/main/java/com/persagy/bdtp/adm/service/impl/SyncAppImpl0.java

@@ -0,0 +1,508 @@
+package com.persagy.bdtp.adm.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fasterxml.jackson.core.type.TypeReference;
+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.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.db.*;
+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.constant.ValidEnum;
+import com.persagy.dmp.common.exception.BusinessException;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.define.entity.RelationDefine;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.function.Supplier;
+
+@Service
+public class SyncAppImpl0 implements ISyncApp {
+
+	@Autowired
+	private IAdmObjectService objectService;
+
+	@Autowired
+	private IQueryFromOldAdm queryOldAdm;
+
+	@Autowired
+	private RwdClient rwdClient;
+
+	@Autowired
+	private DicClient dicClient;
+
+	@Autowired
+	private IConfigService configService;
+
+
+	@Autowired
+	private AdmObjectMapper admObjMapper;
+
+	@Autowired
+	private AdmRelationMapper relationMapper;
+
+	@Autowired
+	private AdmPipeMapper pipeMapper;
+
+	@Autowired
+	private AdmJobSpaceMapper jobSpaceMapper;
+
+	@Autowired
+	private AdmProblemArchMapper problemArchMapper;
+
+	@Autowired
+	private AdmProblemEquipMapper problemEquipMapper;
+
+	@Autowired
+	private AdmFileMapper fileMapper;
+
+	@Autowired
+	private AdmQrCodeMapper qrCodeMapper;
+
+	@Autowired
+	private AdmServeAreaMapper serveAreaMapper;
+
+	@Autowired
+	private ISyncModel syncModel;
+
+	@Autowired
+	private ObjectMapper objectMapper;
+
+	@Autowired
+	private IAdmLogService logService;
+
+	@Autowired
+	ResourceLoader resourceLoader;
+
+
+	@Override
+	public Dict downloadDict(String groupCode, String projectId, String userId) {
+		//临时方案,腾讯云生产环境没有数据字典4.0,从本地文件加载
+		try{
+			Resource resource = resourceLoader.getResource("classpath:dict.json");
+			return objectMapper.readValue(resource.getInputStream(), Dict.class);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+		return queryDict(groupCode, projectId, userId, true, true);
+	}
+
+	@Override
+	public Map<String, Object> downloadConfig(String groupCode, String projectId, String userId) {
+		//配置数据查询
+		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);
+		List<AdmContainerConfig> containerConfig = configService.queryContainerConfig(projectId);
+
+		HashMap<String, Object> data = new HashMap<>();
+		data.put("m2dTypes", m2dTypes);
+		data.put("infosConfig", serializeJsonProp(infosConfig));
+		data.put("relConfig", relConfig);
+		data.put("pipeConfig", pipeConfig);
+		data.put("config", serializeJsonProp(config));
+		data.put("component", component);
+		data.put("containerConfig", containerConfig);
+
+		return data;
+	}
+
+	@Override
+	public Dict queryDict(String groupCode, String projectId, String userId, boolean includeRel, boolean includeInfos){
+		boolean newDict = "JD".equalsIgnoreCase(groupCode);
+
+		//从知识库服务获取专业分类
+		QueryCriteria majorCriteria = ServiceUtil.getQueryCriteria(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(objectMapper, "system", "equipment");
+		List<TypeDef> typeList = queryAllPage(() -> rwdClient.queryObjectType(groupCode, projectId, AdmConst.APP_ID, userId, criteria), criteria, new Pagination(500));
+
+		//查询重命名设备类型
+		ObjectNode renameNode = !newDict ? configService.queryRenameEquipTypes(projectId) : null;
+
+		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")) {
+				if(!newDict) {
+					if (renameNode != null) { //设备类型重命名
+						JsonNode n = renameNode.get(def.getCode());
+						if(n != null)
+							def.setName(n.asText());
+					}
+				}
+				equipList.add(def);
+			}
+		}
+
+		//加载新增的自定义设备类
+//		try{
+//			Resource resource = resourceLoader.getResource("classpath:equip.json");
+//			List<TypeDef> types = objectMapper.readValue(resource.getInputStream(), new TypeReference<List<TypeDef>>(){});
+//			equipList.addAll(types);
+//		}catch (Exception e) {
+//
+//		}
+		if(!newDict) {
+			ArrayNode arr = configService.queryNewEquipTypes(projectId);
+			if(arr != null) {
+				try{
+					List<TypeDef> types = objectMapper.readValue(objectMapper.writeValueAsString(arr), new TypeReference<List<TypeDef>>(){});
+					equipList.addAll(types);
+				}catch (Exception e) {
+
+				}
+			}
+		}
+
+		Dict data = new Dict();
+		data.setMajor(majorList);
+		data.setSystem(sysList);
+		data.setEquipment(equipList);
+
+		//查询关系定义
+		if(includeRel) {
+			List<RelationDefine> relList = ServiceUtil.call(() -> rwdClient.queryRelDef(groupCode, projectId, AdmConst.APP_ID, userId, new QueryCriteria()));
+			data.setRelation(relList);
+		}
+		//查询信息点定义
+		if(includeInfos) {
+			QueryCriteria qc = new QueryCriteria();
+			qc.setCriteria(objectMapper.createObjectNode());
+			List<InfoDef> funcList = ServiceUtil.call(() -> rwdClient.queryFunc(groupCode, projectId, AdmConst.APP_ID, userId, qc));
+			data.setInfos(funcList);
+		}
+
+		return data;
+	}
+
+	private <T> List<T> queryAllPage(Supplier<CommonResult<List<T>>> action, QueryCriteria criteria, Pagination pagination){
+		List<T> list = null;
+		while (pagination.isHasNext()){
+			criteria.setPage((long)pagination.getPageNum());
+			criteria.setSize((long)pagination.getPageSize());
+			if(list == null)
+				list = ServiceUtil.call(action, pagination);
+			else
+				list.addAll(ServiceUtil.call(action, pagination));
+			pagination.next();
+		}
+		return list;
+	}
+
+	@Override
+	public Map<String, Object> downloadFrameData(String groupCode, String projectId, String userId) {
+		List<OProject> prjList = null;
+		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", serializeJsonProp(bdAndFl));
+		return data;
+	}
+
+	@Override
+	public BuildingData downloadBuildingData(String projectId, String buildingId, String uploadFlag, String lastDownloadTime) {
+		List<AdmObject> bdData = admObjMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmObject>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+		List<AdmRelation> bdRel = relationMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmRelation>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+		List<AdmPipe> pipes = pipeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmPipe>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+
+		//任务相关数据查询
+		List<AdmJobSpace> jobSpace = jobSpaceMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmJobSpace>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+		List<AdmProblemArch> problemArch = problemArchMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemArch>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+		List<AdmProblemEquip> problemEquip = problemEquipMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmProblemEquip>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+		List<AdmFile> file = fileMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmFile>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+		List<AdmQrCode> qrCode = qrCodeMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmQrCode>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+		List<AdmServeArea> serveArea = serveAreaMapper.selectList(buildDownloadQueryWrapper(new QueryWrapper<AdmServeArea>(), projectId, buildingId, uploadFlag, lastDownloadTime));
+
+		BuildingData data = new BuildingData();
+		data.setBuildingId(buildingId);
+
+		data.setObjects(serializeJsonProp(bdData));
+		data.setRelations(bdRel);
+		data.setPipes(serializeJsonProp(pipes));
+
+		data.setJobSpace(serializeJsonProp(jobSpace));
+		data.setProblemArch(serializeJsonProp(problemArch));
+		data.setProblemEquip(problemEquip);
+		data.setFile(file);
+		data.setQrCode(serializeJsonProp(qrCode));
+		data.setServeArea(serveArea);
+		data.setTimestamp(DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN));
+
+		return data;
+	}
+
+	private <T> QueryWrapper<T> buildDownloadQueryWrapper(QueryWrapper<T> wrapper, String projectId, String buildingId, String uploadFlag, String lastDownloadTime){
+		wrapper.eq("project_id", projectId).eq("building_id", buildingId);
+		applyUploadFlag(wrapper, uploadFlag,lastDownloadTime);
+		return wrapper;
+	}
+
+	private void applyUploadFlag(QueryWrapper<?> wrapper, String uploadFlag, String lastDownloadTime){
+		if (StrUtil.isNotBlank(lastDownloadTime)) { //非初始化下载
+			if (StrUtil.isNotBlank(uploadFlag))
+				wrapper.and(w -> w.isNull("upload_flag").or().ne("upload_flag", uploadFlag));
+
+			wrapper.and(
+					w -> w.isNotNull("modified_time").gt("modified_time", lastDownloadTime)
+							.or()
+							.isNull("modified_time").gt("creation_time", lastDownloadTime)
+			);
+		}
+	}
+
+	@Override
+	public BuildingData downloadBuildingData(String groupCode, String projectId, String userId, String uploadFlag, String buildingId, Long bdtpDownloadTs, Long admDownloadTs) {
+		throw new RuntimeException("not supported");
+	}
+
+	@Override
+	public ProjectData downloadProjectData(String groupCode, String projectId, String userId, String uploadFlag, Long bdtpDownloadTs, Long admDownloadTs) {
+		throw new RuntimeException("not supported");
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public UploadRtn uploadData(UploadData uploadData, String groupCode, String projectId, String userId, String uploadFlag) {
+		UploadRtn rtn = new UploadRtn();
+		String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
+
+		if (CollUtil.isNotEmpty(uploadData.getObjects())) {
+			List<AdmObject> dbObjs = admObjMapper.selectList(new QueryWrapper<AdmObject>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmObject> expired = uploadAdmData(deserializeJsonProp(toEntities(uploadData.getObjects(), AdmObject.class)), dbObjs, uploadFlag, timestamp, admObjMapper, "object");
+			rtn.setExpiredObjectIds(buildExpiredIds(expired));
+		}
+		if (CollUtil.isNotEmpty(uploadData.getRelations())) {
+			List<AdmRelation> dbObjs = relationMapper.selectList(new QueryWrapper<AdmRelation>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmRelation> expired = uploadAdmData(toEntities(uploadData.getRelations(), AdmRelation.class), dbObjs, uploadFlag, timestamp, relationMapper, "relation");
+			rtn.setExpiredRelationIds(buildExpiredIds(expired));
+		}
+
+		if (CollUtil.isNotEmpty(uploadData.getPipes())) {
+			List<AdmPipe> dbObjs = pipeMapper.selectList(new QueryWrapper<AdmPipe>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmPipe> expired = uploadAdmData(deserializeJsonProp(uploadData.getPipes()), dbObjs, uploadFlag, timestamp, pipeMapper, "pipe");
+			rtn.setExpiredPipeIds(buildExpiredIds(expired));
+		}
+
+		if (CollUtil.isNotEmpty(uploadData.getJobSpace())) {
+			List<AdmJobSpace> dbObjs = jobSpaceMapper.selectList(new QueryWrapper<AdmJobSpace>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmJobSpace> expired = uploadAdmData(deserializeJsonProp(uploadData.getJobSpace()), dbObjs, uploadFlag, timestamp, jobSpaceMapper, null);
+			rtn.setExpiredJobSpaceIds(buildExpiredIds(expired));
+		}
+		if (CollUtil.isNotEmpty(uploadData.getProblemArch())) {
+			List<AdmProblemArch> dbObjs = problemArchMapper.selectList(new QueryWrapper<AdmProblemArch>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmProblemArch> expired = uploadAdmData(deserializeJsonProp(uploadData.getProblemArch()), dbObjs, uploadFlag, timestamp, problemArchMapper, null);
+			rtn.setExpiredProblemArchIds(buildExpiredIds(expired));
+		}
+		if (CollUtil.isNotEmpty(uploadData.getProblemEquip())) {
+			List<AdmProblemEquip> dbObjs = problemEquipMapper.selectList(new QueryWrapper<AdmProblemEquip>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmProblemEquip> expired = uploadAdmData(uploadData.getProblemEquip(), dbObjs, uploadFlag, timestamp, problemEquipMapper, null);
+			rtn.setExpiredProblemEquipIds(buildExpiredIds(expired));
+		}
+		if (CollUtil.isNotEmpty(uploadData.getFile())) {
+			List<AdmFile> dbObjs = fileMapper.selectList(new QueryWrapper<AdmFile>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmFile> expired = uploadAdmData(uploadData.getFile(), dbObjs, uploadFlag, timestamp, fileMapper, null);
+			rtn.setExpiredFileIds(buildExpiredIds(expired));
+		}
+		if (CollUtil.isNotEmpty(uploadData.getQrCode())) {
+			List<AdmQrCode> dbObjs = qrCodeMapper.selectList(new QueryWrapper<AdmQrCode>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmQrCode> expired = uploadAdmData(deserializeJsonProp(uploadData.getQrCode()), dbObjs, uploadFlag, timestamp, qrCodeMapper, null);
+			rtn.setExpiredQrCodeIds(buildExpiredIds(expired));
+		}
+		if (CollUtil.isNotEmpty(uploadData.getServeArea())) {
+			List<AdmServeArea> dbObjs = serveAreaMapper.selectList(new QueryWrapper<AdmServeArea>().eq("building_id", uploadData.getBuildingId()).eq("valid", ValidEnum.TRUE.getType()));
+			List<AdmServeArea> expired = uploadAdmData(uploadData.getServeArea(), dbObjs, uploadFlag, timestamp, serveAreaMapper, null);
+			rtn.setExpiredServeAreaIds(buildExpiredIds(expired));
+		}
+
+		rtn.setTimestamp(timestamp);
+		rtn.setBuildingId(uploadData.getBuildingId());
+		return rtn;
+	}
+
+	private <T extends BaseAdmDataEntity> List<T> toEntities(List<ObjectNode> list, Class<T> cls){
+		List<T> entities = new ArrayList<>(list.size());
+		try {
+			for(ObjectNode node : list) {
+				entities.add(objectMapper.readValue(node.toString(), cls));
+			}
+		} catch (IOException e) {
+			throw new BusinessException(ResponseCode.A0427.getCode(), ResponseCode.A0427.getDesc());
+		}
+		return entities;
+	}
+
+	private <T extends BaseAdmDataEntity> List<T> uploadAdmData(List<T> objs, List<T> dbObjs, String uploadFlag, String timestamp, BaseMapper<T> mapper, String d2mType){
+		List<T> expired = new ArrayList<>();
+		HashMap<String, T> dbMap = new HashMap<>(dbObjs.size());
+		for(T dbObj : dbObjs) {
+			dbMap.put(dbObj.getId(), dbObj);
+		}
+
+		List<T> msgAdd = new ArrayList<>();
+		List<T> msgModify = new ArrayList<>();
+		List<T> msgRemove = new ArrayList<>();
+		for (T obj : objs) {
+			if(obj == null)
+				continue;
+
+			logService.saveUploadLog(new AdmUploadLog(uploadFlag, timestamp, obj));
+
+			T dbObj = dbMap.get(obj.getId());
+			if (dbObj == null) {
+				if(obj.getValid().intValue() == ValidEnum.FALSE.getType())
+					continue;
+
+				obj.setCreationTime(timestamp);
+				obj.setCreator(AdmConst.CREATOR_APP);
+				obj.setUploadFlag(uploadFlag);
+
+				if(d2mType != null)
+					setDeliveryDataProps((BaseDeliveryEntity) obj, null);
+
+				mapper.insert(obj);
+
+				if(d2mType != null)
+					msgAdd.add(obj);
+			} else {
+//				String dbTs;
+//				String ts;
+//				if(dbObj.getModifiedTime() != null){
+//					dbTs = dbObj.getModifiedTime();
+//					ts = obj.getModifiedTime();
+//				} else {
+//					dbTs = dbObj.getCreationTime();
+//					ts = obj.getCreationTime();
+//				}
+//				if (!dbTs.equals(ts)) {
+//					//TODO 时间戳不一致,离线数据无效,暂时跳过处理
+//					expired.add(obj);
+//				} else {
+					obj.setModifiedTime(timestamp);
+					obj.setModifier(AdmConst.CREATOR_APP);
+					obj.setUploadFlag(uploadFlag);
+
+					if(d2mType != null)
+						setDeliveryDataProps((BaseDeliveryEntity) obj, null);
+
+					//合并信息点
+					if(dbObj instanceof AdmObject && obj instanceof AdmObject)
+						((AdmObject) obj).setInfos(mergeInfos(((AdmObject) obj).getInfos(), ((AdmObject) dbObj).getInfos()));
+					else if(dbObj instanceof AdmPipe && obj instanceof AdmPipe)
+						((AdmPipe) obj).setInfos(mergeInfos(((AdmPipe) obj).getInfos(), ((AdmPipe) dbObj).getInfos()));
+
+					mapper.updateById(obj);
+
+					if(d2mType != null) {
+						if(obj.getValid().intValue() == ValidEnum.FALSE.getType())
+							msgRemove.add(obj);
+						else
+							msgModify.add(obj);
+					}
+//				}
+			}
+		}
+
+		if(d2mType != null)
+			sendD2mMessage(d2mType, msgAdd, msgModify, msgRemove);
+
+		return expired;
+	}
+
+	private void setDeliveryDataProps(BaseDeliveryEntity obj, BaseDeliveryEntity dbObj){
+		obj.setD2mState(ValidEnum.FALSE.getType());
+		obj.setDeliveryState(ValidEnum.FALSE.getType());
+
+		if(dbObj != null) {
+			obj.setClientId(dbObj.getClientId());
+			obj.setClientDevice(dbObj.getClientDevice());
+		}
+	}
+
+	private ObjectNode mergeInfos(ObjectNode infos, ObjectNode dbInfos){
+		if(dbInfos != null) {
+			if(infos != null)
+				dbInfos.setAll(infos);
+			return dbInfos;
+		} else
+			return infos;
+	}
+
+	private void sendD2mMessage(String objectType, List<?> msgAdd, List<?> msgModify, List<?> msgRemove){
+		D2mMessage message = new D2mMessage();
+		message.setItemType(objectType);
+		message.setAddItems(msgAdd);
+		message.setModifyItems(msgModify);
+		message.setRemoveItems(msgRemove);
+
+		if(message.isNotEmpty())
+			syncModel.sendMessageToModel(message);
+	}
+
+	private List<String> buildExpiredIds(List<? extends BaseAdmDataEntity> expired){
+		if(expired.size() > 0) {
+			List<String> ids = new ArrayList<>();
+			for(BaseAdmDataEntity entity : expired) {
+				ids.add(entity.getId());
+			}
+			return ids;
+		}
+		return null;
+	}
+
+	private <T extends BaseAdmEntity> List<T> serializeJsonProp(List<T> list){
+		//app端完善,不需要做tostr处理了
+//		for(BaseAdmEntity entity : list) {
+//			entity.serializeJsonProp();
+//		}
+		return list;
+	}
+
+	private <T extends BaseAdmEntity> List<T> deserializeJsonProp(List<T> list){
+		for(BaseAdmEntity entity : list) {
+			entity.deserializeJsonProp();
+		}
+		return list;
+	}
+
+}

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

@@ -16,8 +16,8 @@ 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.db.AdmJobSpace;
+import com.persagy.bdtp.adm.entity.db.AdmObject;
 import com.persagy.bdtp.adm.entity.oldadm.*;
 import com.persagy.bdtp.adm.service.CallException;
 import com.persagy.bdtp.adm.service.IAdmObjectService;
@@ -212,27 +212,6 @@ public class SyncOldAdmImpl implements ISyncOldAdm {
 		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) {

+ 15 - 1
src/main/java/com/persagy/bdtp/adm/util/DataExtrasUtil.java

@@ -2,6 +2,7 @@ package com.persagy.bdtp.adm.util;
 
 import cn.hutool.core.util.ReflectUtil;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 
@@ -29,7 +30,7 @@ public class DataExtrasUtil {
 		return set;
 	}
 
-	public static void collectObjExtras(ObjectNode objNode){
+	public static void packObjExtras(ObjectNode objNode){
 		ObjectNode extraNode = objNode.putObject(objExtraCol);
 		Iterator<String> iter = objNode.fieldNames();
 
@@ -44,4 +45,17 @@ public class DataExtrasUtil {
 		}
 	}
 
+	public static void unpackObjExtras(ObjectNode objNode){
+		JsonNode extraNode = objNode.remove(objExtraCol);
+		if(extraNode instanceof ObjectNode) {
+			ObjectNode infos = (ObjectNode) extraNode;
+
+			Iterator<String> iter = infos.fieldNames();
+			while(iter.hasNext()) {
+				String fieldName = iter.next();
+				objNode.set(fieldName, infos.get(fieldName));
+			}
+		}
+	}
+
 }

File diff suppressed because it is too large
+ 1 - 0
src/main/resources/dict.json


+ 1 - 1
src/main/resources/mapper/AdmObjectMapper.xml.bak

@@ -5,7 +5,7 @@
 
 <mapper namespace="com.persagy.bdtp.adm.dao.AdmObjectMapper">
 
-    <resultMap id="BaseResultMap" type="com.persagy.bdtp.adm.entity.AdmObject">
+    <resultMap id="BaseResultMap" type="com.persagy.bdtp.adm.entity.db.AdmObject">
         <id property="id" column="id" jdbcType="VARCHAR"/>
         <result property="name" column="name" jdbcType="VARCHAR"/>
         <result property="localId" column="local_id" jdbcType="VARCHAR"/>

+ 77 - 37
src/test/java/com/persagy/bdtp/adm/test/AdmApplicationTests.java

@@ -5,30 +5,27 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.persagy.bdtp.adm.common.AdmConst;
-import com.persagy.bdtp.adm.dao.AdmComponentMapper;
-import com.persagy.bdtp.adm.dao.AdmInfosConfigMapper;
-import com.persagy.bdtp.adm.dao.AdmPipeConfigMapper;
-import com.persagy.bdtp.adm.dao.AdmRelsConfigMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.bdtp.adm.dao.*;
 import com.persagy.bdtp.adm.entity.*;
+import com.persagy.bdtp.adm.entity.db.*;
 import com.persagy.bdtp.adm.service.IAdmObjectService;
+import com.persagy.bdtp.adm.service.ISyncApp;
 import com.persagy.bdtp.adm.service.ISyncOldAdm;
 import com.persagy.bdtp.adm.test.data.InfosCfgs;
 import com.persagy.bdtp.adm.test.data.PipeCfgs;
 import com.persagy.bdtp.adm.test.data.RelCfgs;
-import com.persagy.dmp.storage.utils.FileStorageHelper;
+//import com.persagy.dmp.storage.utils.FileStorageHelper;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -63,29 +60,29 @@ public class AdmApplicationTests {
 	@Autowired
 	private IAdmObjectService objectService;
 
-	@Test
-	public void testDownloadFloorMap(){
-		List<AdmObject> floors = objectService.queryM2dByObjType("Pj0002220011", AdmConst.OBJ_TYPE_FLOOR);
-		for(AdmObject floor : floors) {
-			if(floor.getInfos() != null && floor.getInfos().get("floorMapId") != null) {
-				try {
-					InputStream inputStream = FileStorageHelper.downloadStream(floor.getInfos().get("floorMapId").asText());
-					BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("D:\\work_area\\images-minio\\" + floor.getInfos().get("floorMap").asText()));
-					int length = 0;
-					byte[] temp = new byte[1024 * 10];
-					while ((length = inputStream.read(temp)) != -1) {
-						bufferedOutputStream.write(temp, 0, length);
-					}
-					bufferedOutputStream.flush();
-					bufferedOutputStream.close();
-					inputStream.close();
-				}catch (Exception e) {
-					e.printStackTrace();
-				}
-				break;
-			}
-		}
-	}
+//	@Test
+//	public void testDownloadFloorMap(){
+//		List<AdmObject> floors = objectService.queryM2dByObjType("Pj0002220011", AdmConst.OBJ_TYPE_FLOOR);
+//		for(AdmObject floor : floors) {
+//			if(floor.getInfos() != null && floor.getInfos().get("floorMapId") != null) {
+//				try {
+//					InputStream inputStream = FileStorageHelper.downloadStream(floor.getInfos().get("floorMapId").asText());
+//					BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("D:\\work_area\\images-minio\\" + floor.getInfos().get("floorMap").asText()));
+//					int length = 0;
+//					byte[] temp = new byte[1024 * 10];
+//					while ((length = inputStream.read(temp)) != -1) {
+//						bufferedOutputStream.write(temp, 0, length);
+//					}
+//					bufferedOutputStream.flush();
+//					bufferedOutputStream.close();
+//					inputStream.close();
+//				}catch (Exception e) {
+//					e.printStackTrace();
+//				}
+//				break;
+//			}
+//		}
+//	}
 
 	@Autowired
 	private AdmInfosConfigMapper infosConfigMapper;
@@ -285,11 +282,54 @@ public class AdmApplicationTests {
 	}
 
 	@Test
-	public void testMyBatis(){
-		AdmComponent comp = componentMapper.selectList(null).get(0);
-		comp.setCompCode(null);
-		comp.setClassCode(null);
-		componentMapper.updateById(comp);
+	public void testInfoCode(){
+		List<AdmInfosConfig> list = infosConfigMapper.selectList(null);
+		for(AdmInfosConfig cfg : list) {
+			if(cfg.getInfos() != null){
+				for(Object o : cfg.getInfos()) {
+					if(o instanceof Map) {
+						Map<String, Object> map = (Map) o;
+						map.remove("name");
+						map.remove("unit");
+						map.remove("options");
+						map.remove("dataType");
+						String code = (String) map.remove("code");
+						map.put("code", StrUtil.lowerFirst(code));
+					}
+				}
+				infosConfigMapper.updateById(cfg);
+			}
+		}
+	}
+
+	@Autowired
+	@Qualifier("syncAppImpl")
+	private ISyncApp syncApp;
+
+	@Test
+	public void testBdtpObj() throws Exception{
+		Object o = syncApp.downloadFrameData("HR", "Pj4501030001", "bdtp");
+		System.out.println();
+		System.out.println(objectMapper.writeValueAsString(o));
+	}
+
+	@Autowired
+	private AdmUploadLogMapper logMapper;
+	@Autowired
+	private AdmClientFlagMapper clientFlagMapper;
+	@Test
+	public void testAutoInc(){
+//		AdmUploadLog log = new AdmUploadLog("flag", "202111111111", "add");
+//		ObjectNode data = objectMapper.createObjectNode();
+//		data.put("id", 11111);
+//		log.setData(data, objectMapper);
+//		logMapper.insert(log);
+
+		AdmClientFlag flag = new AdmClientFlag();
+		flag.setClientFlag("flag");
+		flag.setUserId("bdtp");
+		clientFlagMapper.insert(flag);
+		System.out.println(flag.getId());
 	}
 
 }

+ 1 - 1
src/test/java/com/persagy/bdtp/adm/test/data/InfosCfgs.java

@@ -3,7 +3,7 @@ package com.persagy.bdtp.adm.test.data;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.persagy.bdtp.adm.entity.AdmInfosConfig;
+import com.persagy.bdtp.adm.entity.db.AdmInfosConfig;
 import lombok.Data;
 
 import java.io.BufferedReader;

+ 1 - 1
src/test/java/com/persagy/bdtp/adm/test/data/PipeCfgs.java

@@ -4,7 +4,7 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.persagy.bdtp.adm.common.AdmConst;
-import com.persagy.bdtp.adm.entity.AdmPipeConfig;
+import com.persagy.bdtp.adm.entity.db.AdmPipeConfig;
 
 import java.io.BufferedReader;
 import java.io.FileReader;

+ 1 - 1
src/test/java/com/persagy/bdtp/adm/test/data/RelCfgs.java

@@ -3,7 +3,7 @@ package com.persagy.bdtp.adm.test.data;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.persagy.bdtp.adm.entity.AdmRelsConfig;
+import com.persagy.bdtp.adm.entity.db.AdmRelsConfig;
 
 import java.io.BufferedReader;
 import java.io.File;