Browse Source

准生产环境的交付数据,同步至客户生产环境

lvxianyun 3 years ago
parent
commit
35ddf9cfc0

+ 5 - 0
src/main/java/com/persagy/proxy/migration/constant/MigrationConstant.java

@@ -15,6 +15,11 @@ public class MigrationConstant {
     /** 数据拼接 用于map的key和value拼接成一个串 **/
     public final static String SPLITER_UNION = "@@";
 
+    /**   日志 接口 ***/
+    public final static String DT_LOG = "/dmp-rwd/rwd/log/migrate?";
+    public final static String DT_LOG_INSERT = "/dmp-rwd/rwd/log/migrate/create?";
+
+
     /**   对象类型定义 接口 ***/
     public final static String DEF_CLASS = "/dmp-rwd/rwd/def/class?";
     public final static String DEF_CLASS_INSERT = "/dmp-rwd/rwd/def/class/createBatch?";

+ 22 - 7
src/main/java/com/persagy/proxy/migration/controller/DataMigrationController.java

@@ -18,10 +18,7 @@ import com.persagy.proxy.object.model.AdmProject;
 import com.persagy.proxy.object.service.IAdmProjectService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletResponse;
 import java.net.URLEncoder;
@@ -52,8 +49,8 @@ public class DataMigrationController {
      *  targetGroupCode 现场集团编码
      *  targetProjectId 现场项目id
      */
-    @GetMapping
-    public void migrate(HttpServletResponse response, @RequestBody MigrationInfo migrationInfo) {
+    @GetMapping("/excel")
+    public void migrateForExcel(HttpServletResponse response, @RequestBody MigrationInfo migrationInfo) {
         //调用服务迁移数据,返回处理结果excel
         try {
             InstanceUrlParam context = AdmContextUtil.toDmpContext();
@@ -72,7 +69,7 @@ public class DataMigrationController {
                 migrationInfo.setTargetProjectId(context.getProjectId());
             }
 
-            Map<String,List<DataMigrationExcel>> results = dataMigrationHandler.handle(context, migrationInfo);
+            Map<String,List<DataMigrationExcel>> results = dataMigrationHandler.handleAndGetExcelList(context, migrationInfo);
 
             AdmQueryCriteria projectRequest = new AdmQueryCriteria();
             projectRequest.setName(AdmProject.OBJ_TYPE);
@@ -111,4 +108,22 @@ public class DataMigrationController {
         }
     }
 
+    @PostMapping("/log")
+    public AdmResponse migrateForLog(@RequestBody MigrationInfo migrationInfo) {
+        InstanceUrlParam context = AdmContextUtil.toDmpContext();
+        context.setGroupCode(migrationInfo.getTargetGroupCode());
+
+        if(migrationInfo == null || StrUtil.isBlank(migrationInfo.getTargetUrl())){
+            throw new BusinessException(ResponseCode.A0402.getCode(), ResponseCode.A0402.getDesc());
+        }
+        if(StrUtil.isBlank(migrationInfo.getTargetGroupCode())){
+            migrationInfo.setTargetGroupCode(context.getGroupCode());
+        }
+        if(StrUtil.isBlank(migrationInfo.getTargetProjectId())){
+            migrationInfo.setTargetProjectId(context.getProjectId());
+        }
+        dataMigrationHandler.handleAndSaveLog(context, migrationInfo);
+        return AdmResponse.success();
+    }
+
 }

+ 13 - 2
src/main/java/com/persagy/proxy/migration/handler/DataMigrationHandler.java

@@ -23,19 +23,30 @@ public class DataMigrationHandler {
 
     private static Map<String, IDataMigration> migrationMap = new HashMap<>(16);
 
-    public Map<String, List<DataMigrationExcel>> handle(InstanceUrlParam context, MigrationInfo migrationInfo){
+    public Map<String, List<DataMigrationExcel>> handleAndGetExcelList(InstanceUrlParam context, MigrationInfo migrationInfo){
         Map<String,List<DataMigrationExcel>> results = new HashMap<>(16);
         if(CollUtil.isNotEmpty(migrationMap)){
             for (MigrationTable migrationTable : MigrationTable.values()){
                 if(!migrationMap.containsKey(migrationTable.getCode())){
                     continue;
                 }
-                results.put(migrationTable.getCode(), migrationMap.get(migrationTable.getCode()).migrate(context, migrationInfo));
+                results.put(migrationTable.getCode(), migrationMap.get(migrationTable.getCode()).migrateForExcel(context, migrationInfo));
             }
         }
         return results;
     }
 
+    public void handleAndSaveLog(InstanceUrlParam context, MigrationInfo migrationInfo){
+        if(CollUtil.isNotEmpty(migrationMap)){
+            for (MigrationTable migrationTable : MigrationTable.values()){
+                if(!migrationMap.containsKey(migrationTable.getCode())){
+                    continue;
+                }
+                migrationMap.get(migrationTable.getCode()).migrateForLog(context, migrationInfo);
+            }
+        }
+    }
+
     public void addMap(String tableName, IDataMigration iDataMigration){
         migrationMap.put(tableName, iDataMigration);
     }

+ 136 - 13
src/main/java/com/persagy/proxy/migration/handler/DefineInfoMigration.java

@@ -10,8 +10,11 @@ import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.define.client.DigitalObjectInfoFacade;
 import com.persagy.dmp.define.entity.ObjectInfoDefine;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
+import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.constant.MigrationConstant;
+import com.persagy.proxy.migration.constant.MigrationTable;
 import com.persagy.proxy.migration.constant.MigrationType;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.DataMigrationResponse;
@@ -19,10 +22,7 @@ import com.persagy.proxy.migration.model.MigrationInfo;
 import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -60,7 +60,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
      * @return
      */
     @Override
-    public List<DataMigrationExcel> migrate(InstanceUrlParam context, MigrationInfo migrationInfo) {
+    public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
         log.info("######################### DefineInfo 同步开始 #########################");
         long start = System.currentTimeMillis();
         List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
@@ -95,7 +95,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
         if(CollUtil.isEmpty(projectDefineList)){
             log.info("######################### DefineInfo 批量插入数据 #########################");
             DataMigrationResponse response = insertBatch(admDefineList, ObjectInfoDefine.class, insertUrl);
-            dataMigrationExcels.addAll(processData(response, MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(response, MigrationType.INSERT.getDesc()));
             return dataMigrationExcels;
         }
         List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectDefineList, null, null);
@@ -109,7 +109,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
         Map<String,Object> subtractFromDel = doSubtractAdd(admDefineMap, projectDefineMap);
         if(!CollUtil.isEmpty(subtractFromDel)){
             List<ObjectInfoDefine> insertData = toList(subtractFromDel, admDefineList);
-            dataMigrationExcels.addAll(processData(insertBatch(insertData, ObjectInfoDefine.class, insertUrl), MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(insertBatch(insertData, ObjectInfoDefine.class, insertUrl), MigrationType.INSERT.getDesc()));
         }
 
         //差集 删除
@@ -119,7 +119,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
             List<String> deleteIds = subtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
             String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
             DataMigrationResponse response = deleteBatch(deleteIds, ObjectInfoDefine.class, delUrl);
-            dataMigrationExcels.addAll(processData(response, MigrationType.DELETE.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(response, MigrationType.DELETE.getDesc()));
         }
 
         //交集更新
@@ -132,7 +132,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
             if(CollUtil.isNotEmpty(compareData) && compareData.size() > 0){
                 List<ObjectInfoDefine> updateData = toList(compareData, admDefineList);
                 String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
-                dataMigrationExcels.addAll(processData(updateBatch(updateData, ObjectInfoDefine.class, updateUrl), MigrationType.UPDATE.getCode()));
+                dataMigrationExcels.addAll(processDataForExcel(updateBatch(updateData, ObjectInfoDefine.class, updateUrl), MigrationType.UPDATE.getCode()));
             }
         }
         long end = System.currentTimeMillis();
@@ -141,6 +141,89 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
         return dataMigrationExcels;
     }
 
+    @Override
+    public AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo) {
+        log.info("######################### DefineInfo 同步开始 #########################");
+        long start = System.currentTimeMillis();
+        List<SyncData> syncDataList = new ArrayList<>();
+        QueryCriteria queryCriteria = new QueryCriteria();
+        ObjectNode criteria = JsonNodeFactory.instance.objectNode();
+        criteria.put("valid", 1);
+
+        ObjectNode groupCode =  JsonNodeFactory.instance.objectNode();
+        groupCode.put("$ne", "0");
+
+        ObjectNode projectId =  JsonNodeFactory.instance.objectNode();
+        projectId.put("$ne", "0");
+
+        ObjectNode andOr = JsonNodeFactory.instance.objectNode();
+        andOr.putPOJO("groupCode", projectId);
+        andOr.putPOJO("projectId", groupCode);
+
+        criteria.putPOJO("$andOr", andOr);
+
+        queryCriteria.setCriteria(criteria);
+        queryCriteria.setSize(-1L);
+        List<ObjectInfoDefine> admDefineList = getAdmData(context, queryCriteria);
+        String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
+        List<ObjectInfoDefine> projectDefineList = getProjectData(queryCriteria, ObjectInfoDefine.class, queryUrl);
+
+        if(CollUtil.isEmpty(admDefineList)){
+            log.error(" ######################### DefineInfo adm已交付需要同步的数据:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
+        }
+        String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
+        if(CollUtil.isEmpty(projectDefineList)){
+            log.info("######################### DefineInfo 批量插入数据 #########################");
+            DataMigrationResponse response = insertBatch(admDefineList, ObjectInfoDefine.class, insertUrl);
+            syncDataList.addAll(processDataForLog(response, MigrationType.INSERT.getDesc()));
+        }
+        List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectDefineList, null, null);
+        Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectInfoDefine.class);
+        List<ObjectNode> objectNodeListAdm = JsonNodeUtils.toListNode(admDefineList, null, null);
+        Map<String,Object> admDefineMap = toEntityMap(objectNodeListAdm, ObjectInfoDefine.class);
+
+
+        //差集 新增
+        log.info("######################### DefineInfo 批量插入数据 #########################");
+        Map<String,Object> subtractFromDel = doSubtractAdd(admDefineMap, projectDefineMap);
+        if(!CollUtil.isEmpty(subtractFromDel)){
+            List<ObjectInfoDefine> insertData = toList(subtractFromDel, admDefineList);
+            syncDataList.addAll(processDataForLog(insertBatch(insertData, ObjectInfoDefine.class, insertUrl), MigrationType.INSERT.getDesc()));
+        }
+
+        //差集 删除
+        log.info("######################### DefineInfo 批量处理删除数据 #########################");
+        Map<String,Object> subtractFromDelete = doSubtractDel(admDefineMap, projectDefineMap);
+        if(!CollUtil.isEmpty(subtractFromDelete)){
+            List<String> deleteIds = subtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
+            String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
+            //处理删除的数据
+            DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectInfoDefine.class, delUrl);
+            List<String> successIds = (List<String>) dataMigrationResponse.getData();
+            List<ObjectInfoDefine> delObjs = toListByIds(successIds, admDefineList);
+            dataMigrationResponse.setData(delObjs);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.DELETE.getDesc()));
+        }
+
+        //交集更新
+        log.info("######################### DefineInfo 批量处理更新数据 #########################");
+        Map<String,Object> intersectionUpdateFrom = doIntersectionGetFrom(admDefineMap, projectDefineMap);
+        Map<String,Object> intersectionUpdateTo = doIntersectionGetTo(admDefineMap, projectDefineMap);
+
+        if(!CollUtil.isEmpty(intersectionUpdateFrom) && !CollUtil.isEmpty(intersectionUpdateTo)){
+            Map<String, Object> compareData = compareData(intersectionUpdateFrom, intersectionUpdateTo);
+            if(CollUtil.isNotEmpty(compareData) && compareData.size() > 0){
+                List<ObjectInfoDefine> updateData = toList(compareData, admDefineList);
+                String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
+                syncDataList.addAll(processDataForLog(updateBatch(updateData, ObjectInfoDefine.class, updateUrl), MigrationType.UPDATE.getCode()));
+            }
+        }
+        long end = System.currentTimeMillis();
+        log.info("######################### DefineInfo 数据迁移已结束 时间:"+(end-start)+" 共计:"+syncDataList.size()+"条 #########################");
+        super.addSynLog(context, syncDataList);
+        return AdmResponse.success();
+    }
+
     /**
      * 获取adm交付的数据,默认获取有效数据
      *
@@ -164,16 +247,24 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
 
     public List<ObjectInfoDefine> toList(Map<String, Object> fromMap, List<ObjectInfoDefine> fromList) {
         if(CollUtil.isEmpty(fromMap) || CollUtil.isEmpty(fromList)){
-            return null;
+            return Collections.emptyList();
+        }
+        return toListByIds(fromMap.keySet(), fromList);
+    }
+
+    public List<ObjectInfoDefine> toListByIds(Collection<String> ids, List<ObjectInfoDefine> fromList) {
+        if(CollUtil.isEmpty(ids) || CollUtil.isEmpty(fromList)){
+            return Collections.emptyList();
         }
-        List<ObjectInfoDefine> results = new ArrayList<>(fromMap.size());
+        List<ObjectInfoDefine> results = new ArrayList<>(ids.size());
         Map<String, ObjectInfoDefine> objectInfoDefineMap = CollUtil.fieldValueMap(fromList, BaseEntity.PROP_ID);
-        for(String key : fromMap.keySet()){
+        for(String key : ids){
             results.add(objectInfoDefineMap.get(key));
         }
         return results;
     }
 
+
     /**
      * 拼接访问链接
      *
@@ -207,7 +298,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
      * @return
      */
     @Override
-    public List<DataMigrationExcel> processData(DataMigrationResponse dataMigrationResponse, String type) {
+    public List<DataMigrationExcel> processDataForExcel(DataMigrationResponse dataMigrationResponse, String type) {
         if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
             return Collections.emptyList();
         }
@@ -235,4 +326,36 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
         }
         return dataMigrationExcels;
     }
+
+    /**
+     * 将目标集合处理成SyncData(日志)格式的集合  入库
+     *
+     * @param dataMigrationResponse
+     * @param type                  insert/delete
+     * @return
+     */
+    @Override
+    public List<SyncData> processDataForLog(DataMigrationResponse dataMigrationResponse, String type) {
+        if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
+            return Collections.emptyList();
+        }
+        List<SyncData> syncDataList = new ArrayList<>();
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getData())){
+            for(Object obj : dataMigrationResponse.getData()){
+                ObjectInfoDefine infoDefine = (ObjectInfoDefine) obj;
+                SyncData syncData = new SyncData();
+                syncData.setTableName(MigrationTable.DTDEFINEINFO.getCode());
+                syncData.setTargetId(infoDefine.getId());
+                syncData.setName(infoDefine.getName());
+                syncData.setCode(infoDefine.getCode());
+                syncData.setClassCode(infoDefine.getClassCode());
+                syncData.setOps(type);//操作
+                syncDataList.add(syncData);
+            }
+        }
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getErrorMsg())){
+            syncDataList.addAll(addErrorInfoForLog(dataMigrationResponse.getErrorMsg()));
+        }
+        return syncDataList;
+    }
 }

+ 138 - 13
src/main/java/com/persagy/proxy/migration/handler/DefineTypeMigration.java

@@ -10,8 +10,11 @@ import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.define.client.DigitalDefineFacade;
 import com.persagy.dmp.define.entity.ObjectTypeDefine;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
+import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.constant.MigrationConstant;
+import com.persagy.proxy.migration.constant.MigrationTable;
 import com.persagy.proxy.migration.constant.MigrationType;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.DataMigrationResponse;
@@ -19,10 +22,7 @@ import com.persagy.proxy.migration.model.MigrationInfo;
 import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -59,7 +59,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
      * @return
      */
     @Override
-    public List<DataMigrationExcel> migrate(InstanceUrlParam context, MigrationInfo migrationInfo) {
+    public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
         log.info("######################### DefineType 同步开始 #########################");
         long start = System.currentTimeMillis();
         List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
@@ -95,7 +95,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
         if(CollUtil.isEmpty(objectNodeList)){
             log.info("######################### DefineType 批量插入数据 #########################");
             DataMigrationResponse dataMigrationResponse = insertBatch(admDefineList, ObjectTypeDefine.class, insertUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.INSERT.getDesc()));
 
             return dataMigrationExcels;
         }
@@ -110,7 +110,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
         if(!CollUtil.isEmpty(doSubtractFromInsert)){
             List<ObjectTypeDefine> insertData = toList(doSubtractFromInsert, admDefineList);
             DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectTypeDefine.class, insertUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.INSERT.getDesc()));
         }
 
         //差集 删除
@@ -122,7 +122,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
 
             String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
             DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectTypeDefine.class, delUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.DELETE.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.DELETE.getDesc()));
         }
 
         //交集更新
@@ -136,7 +136,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
                 List<ObjectTypeDefine> updateData = toList(compareData, admDefineList);
                 String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
                 DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectTypeDefine.class, updateUrl);
-                dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
+                dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
             }
         }
         long end = System.currentTimeMillis();
@@ -144,6 +144,92 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
         return dataMigrationExcels;
     }
 
+    @Override
+    public AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo) {
+        log.info("######################### DefineType 同步开始 #########################");
+        long start = System.currentTimeMillis();
+        List<SyncData> syncDataList = new ArrayList<>();
+
+        QueryCriteria queryCriteria = new QueryCriteria();
+        ObjectNode criteria = JsonNodeFactory.instance.objectNode();
+        criteria.put("valid", 1);
+        ObjectNode groupCode =  JsonNodeFactory.instance.objectNode();
+        groupCode.put("$ne", "0");
+
+        ObjectNode projectId =  JsonNodeFactory.instance.objectNode();
+        projectId.put("$ne", "0");
+
+        ObjectNode andOr = JsonNodeFactory.instance.objectNode();
+        andOr.putPOJO("groupCode", projectId);
+        andOr.putPOJO("projectId", groupCode);
+
+        criteria.putPOJO("$andOr", andOr);
+
+        queryCriteria.setCriteria(criteria);
+        queryCriteria.setSize(-1L);
+
+        List<ObjectTypeDefine> admDefineList = getAdmData(context, queryCriteria);
+        String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
+        List<ObjectTypeDefine> projectDefineList = getProjectData(queryCriteria, ObjectTypeDefine.class, queryUrl);
+        List<ObjectNode> objectNodeList = JsonNodeUtils.toListNode(projectDefineList, null, null);
+        if(CollUtil.isEmpty(admDefineList)){
+            log.error(" ######################### DefineType adm已交付需要同步的数据:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
+        }
+
+        String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
+        if(CollUtil.isEmpty(objectNodeList)){
+            log.info("######################### DefineType 批量插入数据 #########################");
+            DataMigrationResponse dataMigrationResponse = insertBatch(admDefineList, ObjectTypeDefine.class, insertUrl);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+        }
+        List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(objectNodeList, null, null);
+        Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectTypeDefine.class);
+        List<ObjectNode> objectNodeListAdm = JsonNodeUtils.toListNode(admDefineList, null, null);
+        Map<String,Object> admDefineMap = toEntityMap(objectNodeListAdm, ObjectTypeDefine.class);
+
+        //差集 新增
+        log.info("######################### DefineType 批量处理新增数据 #########################");
+        Map<String,Object> doSubtractFromInsert = doSubtractAdd(admDefineMap, projectDefineMap);
+        if(!CollUtil.isEmpty(doSubtractFromInsert)){
+            List<ObjectTypeDefine> insertData = toList(doSubtractFromInsert, admDefineList);
+            DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectTypeDefine.class, insertUrl);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+        }
+
+        //差集 删除
+        log.info("######################### DefineType 批量处理删除数据 #########################");
+        Map<String,Object> doSubtractFromDelete = doSubtractDel(admDefineMap, projectDefineMap);
+        if(!CollUtil.isEmpty(doSubtractFromDelete)){
+            List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
+
+            String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
+            DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectTypeDefine.class, delUrl);
+            List<String> successIds = (List<String>) dataMigrationResponse.getData();
+            List<ObjectTypeDefine> delObjs = toListByIds(successIds, admDefineList);
+            dataMigrationResponse.setData(delObjs);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.DELETE.getDesc()));
+        }
+
+        //交集更新
+        log.info("######################### DefineType 批量处理更新数据 #########################");
+        Map<String,Object> intersectionUpdateFrom = doIntersectionGetFrom(admDefineMap, projectDefineMap);
+        Map<String,Object> intersectionUpdateTo = doIntersectionGetTo(admDefineMap, projectDefineMap);
+
+        if(!CollUtil.isEmpty(intersectionUpdateFrom) && !CollUtil.isEmpty(intersectionUpdateTo)){
+            Map<String, Object> compareData = compareData(intersectionUpdateFrom, intersectionUpdateTo);
+            if(CollUtil.isNotEmpty(compareData) && compareData.size() > 0){
+                List<ObjectTypeDefine> updateData = toList(compareData, admDefineList);
+                String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
+                DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectTypeDefine.class, updateUrl);
+                syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
+            }
+        }
+        long end = System.currentTimeMillis();
+        log.info("######################### DefineType 数据迁移已结束 时间:"+(end-start)+" 共计:"+syncDataList.size()+"条 #########################");
+        super.addSynLog(context, syncDataList);
+        return AdmResponse.success();
+    }
+
     /**
      * 获取adm交付的数据,默认获取有效数据
      *
@@ -167,11 +253,18 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
 
     public List<ObjectTypeDefine> toList(Map<String, Object> fromMap, List<ObjectTypeDefine> fromList) {
         if(CollUtil.isEmpty(fromMap) || CollUtil.isEmpty(fromList)){
-            return null;
+            return Collections.emptyList();
+        }
+        return toListByIds(fromMap.keySet(), fromList);
+    }
+
+    public List<ObjectTypeDefine> toListByIds(Collection<String> ids, List<ObjectTypeDefine> fromList) {
+        if(CollUtil.isEmpty(ids) || CollUtil.isEmpty(fromList)){
+            return Collections.emptyList();
         }
-        List<ObjectTypeDefine> results = new ArrayList<>(fromMap.size());
+        List<ObjectTypeDefine> results = new ArrayList<>(ids.size());
         Map<String, ObjectTypeDefine> objectTypeDefineMap = CollUtil.fieldValueMap(fromList, BaseEntity.PROP_ID);
-        for(String key : fromMap.keySet()){
+        for(String key : ids){
             results.add(objectTypeDefineMap.get(StrUtil.trim(key)));
         }
         return results;
@@ -211,7 +304,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
      * @return
      */
     @Override
-    public List<DataMigrationExcel> processData(DataMigrationResponse dataMigrationResponse, String type) {
+    public List<DataMigrationExcel> processDataForExcel(DataMigrationResponse dataMigrationResponse, String type) {
         if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
             return Collections.emptyList();
         }
@@ -240,4 +333,36 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
         return dataMigrationExcels;
     }
 
+    /**
+     * 将目标集合处理成SyncData(日志)格式的集合  入库
+     *
+     * @param dataMigrationResponse
+     * @param type                  insert/delete
+     * @return
+     */
+    @Override
+    public List<SyncData> processDataForLog(DataMigrationResponse dataMigrationResponse, String type) {
+        if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
+            return Collections.emptyList();
+        }
+        List<SyncData> syncDataList = new ArrayList<>();
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getData())){
+            for(Object obj : dataMigrationResponse.getData()){
+                ObjectTypeDefine objectTypeDefine = (ObjectTypeDefine) obj;
+                SyncData syncData = new SyncData();
+                syncData.setTableName(MigrationTable.DTDEFINETYPE.getCode());
+                syncData.setTargetId(objectTypeDefine.getId());
+                syncData.setName(objectTypeDefine.getName());
+                syncData.setCode(objectTypeDefine.getCode());
+                syncData.setObjType(objectTypeDefine.getObjType());
+                syncData.setOps(type);//操作
+                syncDataList.add(syncData);
+            }
+        }
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getErrorMsg())){
+            syncDataList.addAll(addErrorInfoForLog(dataMigrationResponse.getErrorMsg()));
+        }
+        return syncDataList;
+    }
+
 }

+ 3 - 1
src/main/java/com/persagy/proxy/migration/handler/IDataMigration.java

@@ -1,5 +1,6 @@
 package com.persagy.proxy.migration.handler;
 
+import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.MigrationInfo;
@@ -20,6 +21,7 @@ public interface IDataMigration{
      * @param context
      * @return
      */
-    List<DataMigrationExcel> migrate(InstanceUrlParam context, MigrationInfo migrationInfo);
+    List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo);
+    AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo);
 
 }

+ 11 - 1
src/main/java/com/persagy/proxy/migration/handler/IDataMigrationProcess.java

@@ -1,6 +1,7 @@
 package com.persagy.proxy.migration.handler;
 
 import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.DataMigrationResponse;
@@ -38,6 +39,15 @@ public interface IDataMigrationProcess<T> {
      * @param type insert/delete
      * @return
      */
-    List<DataMigrationExcel> processData(DataMigrationResponse dataMigrationResponse, String type);
+    List<DataMigrationExcel> processDataForExcel(DataMigrationResponse dataMigrationResponse, String type);
+
+    /**
+     * 将目标集合处理成SyncData(日志)格式的集合  入库
+     * @param dataMigrationResponse
+     * @param type insert/delete
+     * @return
+     */
+    List<SyncData> processDataForLog(DataMigrationResponse dataMigrationResponse, String type);
+
 
 }

+ 154 - 22
src/main/java/com/persagy/proxy/migration/handler/ObjectDigitalMigration.java

@@ -9,8 +9,12 @@ import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.digital.client.DigitalObjectFacade;
 import com.persagy.dmp.digital.entity.ObjectDigital;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
+import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.constant.MigrationConstant;
+import com.persagy.proxy.migration.constant.MigrationObjType;
+import com.persagy.proxy.migration.constant.MigrationTable;
 import com.persagy.proxy.migration.constant.MigrationType;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.DataMigrationResponse;
@@ -55,29 +59,111 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
      * @return
      */
     @Override
-    public List<DataMigrationExcel> migrate(InstanceUrlParam context, MigrationInfo migrationInfo) {
+    public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
         log.info("######################### dt_object 同步开始 #########################");
         long start = System.currentTimeMillis();
         List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
 
-        //for(MigrationObjType objType : MigrationObjType.values()){
-            //log.info("######################### dt_object "+objType.getCode()+"同步开始 #########################");
-            QueryCriteria queryCriteria = new QueryCriteria();
-            queryCriteria.setSize(-1L);
-            ObjectNode criteria = JsonNodeFactory.instance.objectNode();
-            criteria.put("valid", 1);
-            criteria.put("objType", "equipment");
-            //criteria.put("objType", objType.getCode());
-            queryCriteria.setCriteria(criteria);
-            dataMigrationExcels.addAll(startMigrate(context,migrationInfo,queryCriteria));
-            //log.info("######################### dt_object "+objType.getCode()+"同步结束 #########################");
-        //}
+        for(MigrationObjType objType : MigrationObjType.values()){
+            log.info("######################### dt_object "+objType.getCode()+"同步开始 #########################");
+
+            QueryCriteria queryCriteria = getQueryCriteria(objType.getCode());
+            dataMigrationExcels.addAll(startMigrateForExcel(context,migrationInfo,queryCriteria));
+
+            log.info("######################### dt_object "+objType.getCode()+"同步结束 #########################");
+        }
+
         long end = System.currentTimeMillis();
         log.info("######################### dt_object 数据迁移已结束 时间:"+(end-start)+" #########################");
         return dataMigrationExcels;
     }
 
-    private List<DataMigrationExcel> startMigrate(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria) {
+    @Override
+    public AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo) {
+        log.info("######################### dt_object 同步开始 #########################");
+        long start = System.currentTimeMillis();
+        for(MigrationObjType objType : MigrationObjType.values()){
+            log.info("######################### dt_object "+objType.getCode()+"同步开始 #########################");
+
+            QueryCriteria queryCriteria = getQueryCriteria(objType.getCode());
+            List<SyncData> syncDataList = startMigrateForLog(context,migrationInfo,queryCriteria);
+
+            log.info("######################### dt_object "+objType.getCode()+"同步结束 共计:"+syncDataList.size()+"条 #########################");
+        }
+        long end = System.currentTimeMillis();
+        log.info("######################### dt_object 数据迁移已结束 时间:"+(end-start)+" #########################");
+        return AdmResponse.success();
+    }
+
+    private QueryCriteria getQueryCriteria(String typeCode){
+        QueryCriteria queryCriteria = new QueryCriteria();
+        queryCriteria.setSize(-1L);
+        ObjectNode criteria = JsonNodeFactory.instance.objectNode();
+        criteria.put("valid", 1);
+        criteria.put("objType", typeCode);
+        queryCriteria.setCriteria(criteria);
+        return queryCriteria;
+    }
+
+    private List<SyncData> startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria) {
+        List<SyncData> syncDataList = new ArrayList<>();
+        List<ObjectNode> admData = getAdmData(context,queryCriteria);
+
+        String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
+        List<ObjectDigital> projectData = getProjectData(queryCriteria, ObjectDigital.class, queryUrl);
+        List<ObjectNode> objectNodeList = JsonNodeUtils.toListNode(projectData, null, null);
+
+        if(CollUtil.isEmpty(admData)){
+            log.error(" ######################### dt_object adm已交付:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
+        }
+
+        String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
+        if(CollUtil.isEmpty(objectNodeList)){
+            DataMigrationResponse dataMigrationResponse = insertBatch(admData, ObjectDigital.class, insertUrl);
+            syncDataList = processDataForLog(dataMigrationResponse, MigrationType.INSERT.getDesc());
+        }
+        Map<String,Object> projectMap = toEntityMap(objectNodeList, ObjectDigital.class);
+        Map<String,Object> admMap = toEntityMap(admData, ObjectDigital.class);
+        //差集 新增
+        Map<String,Object> doSubtractFromInsert = doSubtractAdd(admMap, projectMap);
+        if(!CollUtil.isEmpty(doSubtractFromInsert)){
+            List<ObjectNode> insertData = toList(doSubtractFromInsert, admData);
+            DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectDigital.class, insertUrl);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+        }
+
+        //差集 删除
+        Map<String,Object> doSubtractFromDelete = doSubtractDel(admMap, projectMap);
+        if(!CollUtil.isEmpty(doSubtractFromDelete)){
+            List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
+            String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
+            //处理删除的数据
+            DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectDigital.class, delUrl);
+            List<String> successIds = (List<String>) dataMigrationResponse.getData();
+            List<ObjectNode> delObjs = toListByIds(successIds, admData);
+            dataMigrationResponse.setData(delObjs);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.DELETE.getDesc()));
+        }
+
+        //交集更新
+        Map<String,Object> intersectionUpdateFrom = doIntersectionGetFrom(admMap, projectMap);
+        Map<String,Object> intersectionUpdateTo = doIntersectionGetTo(admMap, projectMap);
+
+        if(!CollUtil.isEmpty(intersectionUpdateFrom) && !CollUtil.isEmpty(intersectionUpdateTo)){
+            Map<String, Object> compareData = compareData(intersectionUpdateFrom, intersectionUpdateTo);
+            if(CollUtil.isNotEmpty(compareData) && compareData.size() > 0){
+                List<ObjectNode> updateData = toList(compareData, admData);
+                String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
+                DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectDigital.class, updateUrl);
+                syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
+            }
+        }
+       return super.addSynLog(context, syncDataList);
+    }
+
+
+
+    private List<DataMigrationExcel> startMigrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria) {
         List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
         List<ObjectNode> admData = getAdmData(context,queryCriteria);
 
@@ -93,7 +179,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
         String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
         if(CollUtil.isEmpty(objectNodeList)){
             DataMigrationResponse dataMigrationResponse = insertBatch(admData, ObjectDigital.class, insertUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.INSERT.getDesc()));
             return dataMigrationExcels;
         }
         Map<String,Object> projectMap = toEntityMap(objectNodeList, ObjectDigital.class);
@@ -103,7 +189,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
         if(!CollUtil.isEmpty(doSubtractFromInsert)){
             List<ObjectNode> insertData = toList(doSubtractFromInsert, admData);
             DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectDigital.class, insertUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.INSERT.getDesc()));
         }
 
         //差集 删除
@@ -112,7 +198,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
             String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
             DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectDigital.class, delUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.DELETE.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.DELETE.getDesc()));
         }
 
         //交集更新
@@ -125,7 +211,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
                 List<ObjectNode> updateData = toList(compareData, admData);
                 String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
                 DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectDigital.class, updateUrl);
-                dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
+                dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
             }
         }
 
@@ -156,9 +242,17 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
      */
     public List<ObjectNode> toList(Map<String, Object> fromMap, List<ObjectNode> fromList) {
         if(CollUtil.isEmpty(fromMap) || CollUtil.isEmpty(fromList)){
-            return null;
+            return Collections.emptyList();
         }
-        List<ObjectNode> results = new ArrayList<>(fromMap.size());
+        return toListByIds(fromMap.keySet(), fromList);
+    }
+
+
+    public List<ObjectNode> toListByIds(Collection<String> ids, List<ObjectNode> fromList) {
+        if(CollUtil.isEmpty(ids) || CollUtil.isEmpty(fromList)){
+            return Collections.emptyList();
+        }
+        List<ObjectNode> results = new ArrayList<>(ids.size());
 
         Map<String, ObjectNode> objectDigitalMap =  new HashMap<>(fromList.size());
         for(ObjectNode node :  fromList){
@@ -168,12 +262,14 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             objectDigitalMap.put(node.get("id").asText(), node);
         }
 
-        for(String key : fromMap.keySet()){
+        for(String key : ids){
             results.add(objectDigitalMap.get(key));
         }
         return results;
     }
 
+
+
     /**
      * 拼接访问链接
      *
@@ -207,7 +303,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
      * @return
      */
     @Override
-    public List<DataMigrationExcel> processData(DataMigrationResponse dataMigrationResponse, String type) {
+    public List<DataMigrationExcel> processDataForExcel(DataMigrationResponse dataMigrationResponse, String type) {
         if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
             return Collections.emptyList();
         }
@@ -234,4 +330,40 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
         }
         return dataMigrationExcels;
     }
+
+    /**
+     * 将目标集合处理成SyncData(日志)格式的集合  入库
+     *
+     * @param dataMigrationResponse
+     * @param type    insert/delete
+     * @return
+     */
+    @Override
+    public List<SyncData> processDataForLog(DataMigrationResponse dataMigrationResponse, String type) {
+        if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
+            return Collections.emptyList();
+        }
+        List<SyncData> syncDataList = new ArrayList<>();
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getData())){
+            for(Object obj : dataMigrationResponse.getData()){
+                ObjectDigital digital = (ObjectDigital) obj;
+                SyncData syncData = new SyncData();
+                syncData.setTableName(MigrationTable.DTOBJECT.getCode());
+                syncData.setName(digital.getName());
+                syncData.setObjType(digital.getObjType());
+                syncData.setType(digital.getObjType());
+                syncData.setClassCode(digital.getClassCode());
+                syncData.setTargetId(digital.getId());
+                syncData.setLocalId(digital.getLocalId());
+                syncData.setLocalName(digital.getLocalName());
+                syncData.setOps(type);//操作
+                syncDataList.add(syncData);
+            }
+        }
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getErrorMsg())){
+            syncDataList.addAll(addErrorInfoForLog(dataMigrationResponse.getErrorMsg()));
+        }
+        return syncDataList;
+    }
+
 }

+ 134 - 19
src/main/java/com/persagy/proxy/migration/handler/ObjectRelationMigration.java

@@ -10,9 +10,12 @@ import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.digital.client.DigitalRelationFacade;
 import com.persagy.dmp.digital.entity.ObjectRelation;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
+import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.constant.MiGrationRelCode;
 import com.persagy.proxy.migration.constant.MigrationConstant;
+import com.persagy.proxy.migration.constant.MigrationTable;
 import com.persagy.proxy.migration.constant.MigrationType;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.DataMigrationResponse;
@@ -20,10 +23,7 @@ import com.persagy.proxy.migration.model.MigrationInfo;
 import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -60,7 +60,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
      * @return
      */
     @Override
-    public List<DataMigrationExcel> migrate(InstanceUrlParam context, MigrationInfo migrationInfo) {
+    public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
         log.info("######################### dt_relation 同步开始 #########################");
         long start = System.currentTimeMillis();
         List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
@@ -68,11 +68,8 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         for (MiGrationRelCode miGrationRelCode: MiGrationRelCode.values()){
             log.info("######################### dt_relation "+miGrationRelCode.getCode()+"同步开始 #########################");
 
-            QueryCriteria queryCriteria = new QueryCriteria();
-            ObjectNode criteria = JsonNodeFactory.instance.objectNode();
-            criteria.put("valid", 1);
-            criteria.put("relCode", miGrationRelCode.getCode());
-            dataMigrationExcels.addAll(startMigrate(context, migrationInfo, queryCriteria));
+            QueryCriteria queryCriteria = getQueryCriteria(miGrationRelCode.getCode());
+            dataMigrationExcels.addAll(startMigrateForExcel(context, migrationInfo, queryCriteria));
 
             log.info("######################### dt_relation "+miGrationRelCode.getCode()+"同步结束 #########################");
         }
@@ -81,7 +78,30 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         return dataMigrationExcels;
     }
 
-    private List<DataMigrationExcel> startMigrate(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria){
+    @Override
+    public AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo) {
+        log.info("######################### dt_relation 同步开始 #########################");
+        long start = System.currentTimeMillis();
+        for (MiGrationRelCode miGrationRelCode: MiGrationRelCode.values()){
+            log.info("######################### dt_relation "+miGrationRelCode.getCode()+"同步开始 #########################");
+            QueryCriteria queryCriteria = getQueryCriteria(miGrationRelCode.getCode());
+            List<SyncData> syncDataList = startMigrateForLog(context, migrationInfo, queryCriteria);
+            log.info("######################### dt_relation "+miGrationRelCode.getCode()+"同步结束 共计:"+syncDataList.size()+"条 #########################");
+        }
+        long end = System.currentTimeMillis();
+        log.info("######################### dt_relation 同步结束 "+(end-start)+"#########################");
+        return AdmResponse.success();
+    }
+
+    private QueryCriteria getQueryCriteria(String typeCode){
+        QueryCriteria queryCriteria = new QueryCriteria();
+        ObjectNode criteria = JsonNodeFactory.instance.objectNode();
+        criteria.put("valid", 1);
+        criteria.put("relCode", typeCode);
+        return queryCriteria;
+    }
+
+    private List<DataMigrationExcel> startMigrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria){
         List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
         List<ObjectRelation> admRelations = getAdmData(context, queryCriteria);
 
@@ -95,7 +115,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
         if(CollUtil.isEmpty(projectRelations)){
             DataMigrationResponse dataMigrationResponse = insertBatch(admRelations, ObjectRelation.class, insertUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.INSERT.getDesc()));
             return dataMigrationExcels;
         }
         List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectRelations, null, null);
@@ -108,7 +128,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         if(!CollUtil.isEmpty(doSubtractFromInsert)){
             List<ObjectRelation> insertData = toList(doSubtractFromInsert, admRelations);
             DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectRelation.class, insertUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.INSERT.getDesc()));
         }
 
         //差集 删除
@@ -117,7 +137,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
             List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
             String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
             DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectRelation.class, delUrl);
-            dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.DELETE.getDesc()));
+            dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.DELETE.getDesc()));
         }
 
         //交集更新
@@ -130,13 +150,69 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
                 List<ObjectRelation> updateData = toList(compareData, admRelations);
                 String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
                 DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectRelation.class, updateUrl);
-                dataMigrationExcels.addAll(processData(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
+                dataMigrationExcels.addAll(processDataForExcel(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
             }
         }
         return dataMigrationExcels;
     }
 
+    private List<SyncData> startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria){
+        List<SyncData> syncDataList = new ArrayList<>();
+        List<ObjectRelation> admRelations = getAdmData(context, queryCriteria);
+
+        String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
+        List<ObjectRelation> projectRelations = getProjectData(queryCriteria, ObjectRelation.class, queryUrl);
+        if(CollUtil.isEmpty(admRelations)){
+            log.error(" ######################### dt_relation adm已交付:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
+        }
+
+        String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
+        if(CollUtil.isEmpty(projectRelations)){
+            DataMigrationResponse dataMigrationResponse = insertBatch(admRelations, ObjectRelation.class, insertUrl);
+            syncDataList = processDataForLog(dataMigrationResponse, MigrationType.INSERT.getDesc());
+        }
+        List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectRelations, null, null);
+        Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectRelation.class);
+        List<ObjectNode> objectNodeListAdm = JsonNodeUtils.toListNode(admRelations, null, null);
+        Map<String,Object> admDefineMap = toEntityMap(objectNodeListAdm, ObjectRelation.class);
+
+        //差集 新增
+        Map<String,Object> doSubtractFromInsert = doSubtractAdd(admDefineMap, projectDefineMap);
+        if(!CollUtil.isEmpty(doSubtractFromInsert)){
+            List<ObjectRelation> insertData = toList(doSubtractFromInsert, admRelations);
+            DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectRelation.class, insertUrl);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.INSERT.getDesc()));
+        }
+
+        //差集 删除
+        Map<String,Object> doSubtractFromDelete = doSubtractDel(admDefineMap, projectDefineMap);
+        if(!CollUtil.isEmpty(doSubtractFromDelete)){
+            List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
+            String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
+
+            //处理删除的数据
+            DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectRelation.class, delUrl);
+            List<String> successIds = (List<String>) dataMigrationResponse.getData();
+            List<ObjectRelation> delObjs = toListByIds(successIds, admRelations);
+            dataMigrationResponse.setData(delObjs);
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.DELETE.getDesc()));
+        }
+
+        //交集更新
+        Map<String,Object> intersectionUpdateFrom = doIntersectionGetFrom(admDefineMap, projectDefineMap);
+        Map<String,Object> intersectionUpdateTo = doIntersectionGetTo(admDefineMap, projectDefineMap);
 
+        if(!CollUtil.isEmpty(intersectionUpdateFrom) && !CollUtil.isEmpty(intersectionUpdateTo)){
+            Map<String, Object> compareData = compareData(intersectionUpdateFrom, intersectionUpdateTo);
+            if(CollUtil.isNotEmpty(compareData) && compareData.size() > 0){
+                List<ObjectRelation> updateData = toList(compareData, admRelations);
+                String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
+                DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectRelation.class, updateUrl);
+                syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.UPDATE.getDesc()));
+            }
+        }
+        return super.addSynLog(context, syncDataList);
+    }
 
 
     /**
@@ -160,11 +236,18 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
      */
     public List<ObjectRelation> toList(Map<String, Object> fromMap, List<ObjectRelation> fromList) {
         if(CollUtil.isEmpty(fromMap) || CollUtil.isEmpty(fromList)){
-            return null;
+            return Collections.emptyList();
+        }
+        return toListByIds(fromMap.keySet(), fromList);
+    }
+
+    public List<ObjectRelation> toListByIds(Collection<String> ids, List<ObjectRelation> fromList) {
+        if(CollUtil.isEmpty(ids) || CollUtil.isEmpty(fromList)){
+            return Collections.emptyList();
         }
-        List<ObjectRelation> results = new ArrayList<>(fromMap.size());
+        List<ObjectRelation> results = new ArrayList<>(ids.size());
         Map<String, ObjectRelation> objectRelationMap = CollUtil.fieldValueMap(fromList, BaseEntity.PROP_ID);
-        for(String key : fromMap.keySet()){
+        for(String key : ids){
             results.add(objectRelationMap.get(key));
         }
         return results;
@@ -204,7 +287,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
      * @return
      */
     @Override
-    public List<DataMigrationExcel> processData(DataMigrationResponse dataMigrationResponse, String type) {
+    public List<DataMigrationExcel> processDataForExcel(DataMigrationResponse dataMigrationResponse, String type) {
         if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
             return Collections.emptyList();
         }
@@ -232,4 +315,36 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         }
         return dataMigrationExcels;
     }
+
+    /**
+     * 将目标集合处理成SyncData(日志)格式的集合  入库
+     *
+     * @param dataMigrationResponse
+     * @param type                  insert/delete
+     * @return
+     */
+    @Override
+    public List<SyncData> processDataForLog(DataMigrationResponse dataMigrationResponse, String type) {
+        if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
+            return Collections.emptyList();
+        }
+        List<SyncData> syncDataList = new ArrayList<>();
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getData())){
+            for(Object obj : dataMigrationResponse.getData()){
+                ObjectRelation relation = (ObjectRelation) obj;
+                SyncData syncData = new SyncData();
+                syncData.setTableName(MigrationTable.DTRALATION.getCode());
+                syncData.setType(String.join(StrUtil.DASHED,relation.getRelCode(), relation.getGroupCode()));
+                syncData.setTargetId(relation.getId());
+                syncData.setFromId(relation.getObjFrom());
+                syncData.setToId(relation.getObjTo());
+                syncData.setOps(type);//操作
+                syncDataList.add(syncData);
+            }
+        }
+        if(CollUtil.isNotEmpty(dataMigrationResponse.getErrorMsg())){
+            syncDataList.addAll(addErrorInfoForLog(dataMigrationResponse.getErrorMsg()));
+        }
+        return syncDataList;
+    }
 }

+ 64 - 5
src/main/java/com/persagy/proxy/migration/service/Impl/MigrationAbstractServiceImpl.java

@@ -15,14 +15,17 @@ import com.persagy.dmp.common.model.entity.AuditableEntity;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.JsonHelper;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
 import com.persagy.proxy.common.entity.DmpResult;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.constant.MigrationConstant;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.DataMigrationResponse;
 import com.persagy.proxy.migration.model.MigrationInfo;
+import com.persagy.proxy.migration.service.ISyncDataService;
 import com.persagy.proxy.migration.service.MigrationAbstractService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.IOException;
 import java.lang.reflect.Field;
@@ -39,9 +42,13 @@ import java.util.stream.Collectors;
 @Slf4j
 public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService<T> {
 
+    @Autowired
+    private ISyncDataService syncDataService;
     /**
      * adm交付数据(A) ∩ 现场数据(B)
      * (A∩B) A
+     * (null ∩ B) null
+     * (A ∩ null) null
      * 需要进一步对比的数据
      *
      * @param from
@@ -49,6 +56,9 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
      */
     @Override
     public Map<String, Object> doIntersectionGetFrom(Map<String, Object> from, Map<String, Object> to) {
+        if(CollUtil.isEmpty(from) || CollUtil.isEmpty(to)){
+            return null;
+        }
         Sets.SetView<String> intersection = Sets.intersection(from.keySet(), to.keySet());
         if(CollUtil.isEmpty(intersection)){
             return null;
@@ -58,7 +68,9 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
 
     /**
      * adm交付数据(A) ∩ 现场数据(B)
-     * (A∩B) B
+     * (A ∩ B) return B 子集
+     * (null ∩ B) return null
+     * (A ∩ null) return null
      * 需要进一步对比的数据
      *
      * @param from
@@ -66,6 +78,12 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
      */
     @Override
     public Map<String, Object> doIntersectionGetTo(Map<String, Object> from, Map<String, Object> to) {
+        if(CollUtil.isEmpty(from)){
+            return null;
+        }
+        if(CollUtil.isEmpty(to)){
+            return null;
+        }
         Sets.SetView<String> intersection = Sets.intersection(from.keySet(), to.keySet());
         if(CollUtil.isEmpty(intersection)){
             return null;
@@ -75,7 +93,10 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
 
     /**
      * adm交付数据(From) 与 现场数据(to) 差集  返回adm数据
-     * (From - to)
+     * (From - to) 返回 From 子集
+     * (null - to) 返回 null
+     * (From - null) 返回 From
+     *
      * 新增
      *
      * @param from
@@ -83,20 +104,35 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
      */
     @Override
     public Map<String, Object> doSubtractAdd(Map<String, Object> from, Map<String, Object> to) {
+        if(CollUtil.isEmpty(from)){
+            return null;
+        }
+        if(CollUtil.isEmpty(to)){
+            return from;
+        }
         Sets.SetView<String> diffA = Sets.difference(from.keySet(), to.keySet());
         return getValueForMapByKeys(diffA, from);
     }
 
     /**
-     * adm交付数据(From) 与 现场数据(to ) 差集  现场数据
-     * (to - From )
-     * 删除
+     * adm交付数据(From) 与 现场数据(to ) 差集
+     * (to - From )返回 to 子集
+     * (to - null )返回 to
+     * (null - From )返回 null
+     *
+     *  return 删除数据
      *
      * @param from
      * @param to
      */
     @Override
     public Map<String, Object> doSubtractDel(Map<String, Object> from, Map<String, Object> to) {
+        if(CollUtil.isEmpty(from)){
+            return to;
+        }
+        if(CollUtil.isEmpty(to)){
+            return null;
+        }
         Sets.SetView<String> diffB = Sets.difference(to.keySet(), from.keySet());
         return getValueForMapByKeys(diffB, to);
     }
@@ -289,6 +325,29 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
         return dataMigrationExcels;
     }
 
+    @Override
+    public List<SyncData> addErrorInfoForLog(List<String> errorMsg) {
+        if(CollUtil.isEmpty(errorMsg)){
+            return Collections.emptyList();
+        }
+        List<SyncData> syncDataList = new ArrayList<>(errorMsg.size());
+        for(String msg : errorMsg){
+            SyncData syncData = new SyncData();
+            syncData.setTargetId("error");
+            syncData.setError(msg);
+            syncDataList.add(syncData);
+        }
+        return syncDataList;
+    }
+
+    @Override
+    public List<SyncData> addSynLog(InstanceUrlParam context, List<SyncData> syncDataList) {
+        if(CollUtil.isEmpty(syncDataList)){
+            return Collections.emptyList();
+        }
+        return syncDataService.doInsert(context, syncDataList);
+    }
+
     private DataMigrationResponse processProjectData(List vos, QueryCriteria queryCriteria, Class<T> clazz, String url){
         //处理rwd 请求返回超时
         String body = null;

+ 3 - 0
src/main/java/com/persagy/proxy/migration/service/MigrationAbstractService.java

@@ -2,6 +2,7 @@ package com.persagy.proxy.migration.service;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.DataMigrationResponse;
@@ -93,5 +94,7 @@ public interface MigrationAbstractService<T> {
     Map<String, Object> compareData(Map<String,Object> from, Map<String,Object> to);
 
     List<DataMigrationExcel> addErrorInfo(List<String> errorMsg);
+    List<SyncData> addErrorInfoForLog(List<String> errorMsg);
+    List<SyncData> addSynLog(InstanceUrlParam context, List<SyncData> syncDataList);
 
 }