Browse Source

需求:合并文件迁移的内容

lijie 3 years ago
parent
commit
8f0f18627c
15 changed files with 874 additions and 258 deletions
  1. 10 5
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/constant/MigrationConstant.java
  2. 52 33
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/controller/DataMigrationController.java
  3. 37 7
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/DataMigrationHandler.java
  4. 9 9
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/model/DataMigrationExcel.java
  5. 16 2
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/IDataMigration.java
  6. 1 1
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/IDataMigrationProcess.java
  7. 1 1
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/IDefineDataMigration.java
  8. 3 2
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/MigrationAbstractService.java
  9. 18 0
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/IMigrationLogService.java
  10. 116 37
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/DefineInfoMigration.java
  11. 86 28
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/DefineTypeMigration.java
  12. 63 35
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/Impl/MigrationAbstractServiceImpl.java
  13. 126 0
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/Impl/MigrationLogServiceImpl.java
  14. 111 31
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/ObjectDigitalMigration.java
  15. 225 67
      adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/ObjectRelationMigration.java

+ 10 - 5
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/constant/MigrationConstant.java

@@ -18,28 +18,29 @@ 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?";
     public final static String DEF_CLASS_DELETE = "/dmp-rwd/rwd/def/class/deleteBatch?";
     public final static String DEF_CLASS_UPDATE = "/dmp-rwd/rwd/def/class/updateBatch?";
+    /**   对象实例表 sql脚本 开头  ***/
+    public final static String DEF_CLASS_SQL_PRE = "REPLACE INTO `dt_define_type`(`id`, `code`, `name`, `alias_code`, `alias_name`, `obj_type`, `group_code`, `project_id`, `major_code`, `system_code`, `equipment_code`, `parent_code`, `version`, `source_from`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid`)  VALUES \n ";
+
 
     /**   信息点 接口 ***/
     public final static String DEF_FUNCID = "/dmp-rwd/rwd/def/funcid?";
     public final static String DEF_FUNCID_INSERT = "/dmp-rwd/rwd/def/funcid/createBatch?";
     public final static String DEF_FUNCID_DELETE = "/dmp-rwd/rwd/def/funcid/deleteBatch?";
     public final static String DEF_FUNCID_UPDATE = "/dmp-rwd/rwd/def/funcid/updateBatch?";
+    /**   对象实例表 sql脚本 开头  ***/
+    public final static String DEF_FUNCID_SQL_PRE = "REPLACE INTO `dt_define_info`(`id`, `code`, `name`, `alias_code`, `alias_name`, `class_code`, `group_code`, `project_id`, `category`, `first_tag`, `second_tag`, `priority`, `input_mode`, `unit`, `data_type`, `is_multiple`, `is_region`, `formater`, `data_source`, `remark`, `sub_flag`, `weak_point`, `show_order`, `version`, `source_from`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid`) VALUES\n";
 
     /**   图类型表 接口 需要提供批量 ***/
     public final static String DEF_GRAPH = "/dmp-rwd/rwd/def/graph/query?";
     public final static String DEF_GRAPH_INSERT = "/dmp-rwd/rwd/def/graph/create?";
     public final static String DEF_GRAPH_DELETE = "/dmp-rwd/rwd/def/graph/delete?";
     public final static String DEF_GRAPH_UPDATE = "/dmp-rwd/rwd/def/graph/update?";
+    public final static String DEF_GRAPH_UPDATE_SQL_PRE ="REPLACE INTO `dt_define_graph` ( `id`, `code`,`name`, `first_category`, `second_category`,`second_category_mes`, `remark`, `object_types`,`creator`, `creation_time` , `modifier`,`modified_time`,`valid` ) VALUES \n ";
 
     /**   边类型表 接口  ***/
     public final static String DEF_REL = "/dmp-rwd/rwd/def/rel/query?";
@@ -53,6 +54,8 @@ public class MigrationConstant {
     public final static String DT_OBJECT_INSERT = "/dmp-rwd/rwd/instance/object/create?";
     public final static String DT_OBJECT_DELETE = "/dmp-rwd/rwd/instance/object/delete?";
     public final static String DT_OBJECT_UPDATE = "/dmp-rwd/rwd/instance/object/update?";
+    /**   对象实例表 sql脚本 开头  ***/
+    public final static String DT_OBJECT_SQL_PRE = "REPLACE INTO `dt_object`(`id`, `name`, `local_id`, `local_name`, `group_code`, `project_id`, `obj_type`, `class_code`, `grouping`, `infos`, `virtual_codes`, `create_app`, `update_app`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid`) VALUES \n";
 
 
     /**   关系实例表 接口  ***/
@@ -60,4 +63,6 @@ public class MigrationConstant {
     public final static String DT_RELATION_INSERT = "/dmp-rwd/rwd/instance/relation/create?";
     public final static String DT_RELATION_DELETE = "/dmp-rwd/rwd/instance/relation/delete?";
     public final static String DT_RELATION_UPDATE = "/dmp-rwd/rwd/instance/relation/update?";
+    /**   对象实例表 sql脚本 开头  ***/
+    public final static String DT_RELATION_SQL_PRE = "REPLACE INTO `dt_relation`(`id`, `group_code`, `project_id`, `graph_id`, `graph_code`, `rel_code`, `rel_value`, `obj_from`, `obj_to`, `create_app`, `update_app`, `creator`, `creation_time`, `modifier`, `modified_time`, `valid` ) VALUES \n";
 }

+ 52 - 33
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/controller/DataMigrationController.java

@@ -14,12 +14,9 @@ import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.exception.BusinessException;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.JsonHelper;
-import com.persagy.dmp.migrate.client.DigitalMigrateLogFacade;
-import com.persagy.dmp.rwd.migrate.entity.SyncData;
 import com.persagy.proxy.adm.request.AdmQueryCriteria;
 import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.adm.utils.AdmContextUtil;
-import com.persagy.proxy.adm.utils.AdmQueryCriteriaHelper;
 import com.persagy.proxy.common.entity.DmpResult;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.constant.MigrationConstant;
@@ -27,17 +24,18 @@ import com.persagy.proxy.migration.constant.MigrationObjType;
 import com.persagy.proxy.migration.handler.DataMigrationHandler;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.MigrationInfo;
+import com.persagy.proxy.migration.service.IMigrationLogService;
 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.PostMapping;
-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.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedOutputStream;
 import java.io.IOException;
+import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -58,7 +56,7 @@ import java.util.Map;
 public class DataMigrationController {
     private final DataMigrationHandler dataMigrationHandler;
     private final IAdmProjectService projectService;
-
+    private final IMigrationLogService logService;
     /**
      * 导出待迁移的数据信息
      *
@@ -76,7 +74,7 @@ public class DataMigrationController {
         try {
 
             if (migrationInfo == null || StrUtil.isBlank(migrationInfo.getTargetUrl())) {
-                throw new BusinessException(ResponseCode.A0402.getCode(), ResponseCode.A0402.getDesc());
+                throw new BusinessException(ResponseCode.A0402.toString());
             }
             InstanceUrlParam context = AdmContextUtil.toDmpContext();
             //确定集团编码 和 项目id
@@ -148,12 +146,53 @@ public class DataMigrationController {
     }
 
     /**
-     * 迁移数据,执行脚本获取
+     * 迁移数据,获取执行脚本文件
      */
-    public void getMigrateSqlFile(){
+    @GetMapping("/getSqlFile")
+    public void getMigrateSqlFile(HttpServletResponse response){
+        InstanceUrlParam context = AdmContextUtil.toDmpContext();
+        StringBuffer dataMigrationSqls = dataMigrationHandler.handleAndGetSqlList(context);
+
+        response.setCharacterEncoding("utf-8");
+        //设置响应的内容类型
+        response.setContentType("text/plain");
+        //设置文件的名称和格式
+
+        String encode = StandardCharsets.UTF_8.name();
+        response.setCharacterEncoding(encode);
+        // 防止中文乱码
+        String fileName = context.getProjectId()+"_迁移sql";
+
+        try {
+            fileName = URLEncoder.encode(fileName, encode);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
 
+        response.addHeader("Content-Disposition","attachment;filename="
+                + fileName
+                + ".sql");
+
+        BufferedOutputStream buff = null;
+        ServletOutputStream outStr = null;
+        try {
+            outStr = response.getOutputStream();
+            buff = new BufferedOutputStream(outStr);
+            buff.write(dataMigrationSqls.toString().getBytes("UTF-8"));
+            buff.flush();
+            buff.close();
+        } catch (Exception e) {
+            log.error(String.format("导出文件文件出错:{}",e));
+        } finally {try {
+            buff.close();
+            outStr.close();
+        } catch (Exception e) {
+            log.error(String.format("关闭流对象出错 e:{}",e));
+        }
+        }
     }
 
+
     /**
      * 获取迁移数据日志
      *
@@ -169,28 +208,8 @@ public class DataMigrationController {
      */
     @PostMapping("/log")
     public AdmResponse queryMigrateForLog(@RequestBody AdmQueryCriteria request) {
-        QueryCriteria queryCriteria = AdmQueryCriteriaHelper.toDmpCriteria(request);
         InstanceUrlParam context = AdmContextUtil.toDmpContext();
-        CommonResult<List<SyncData>> result = DigitalMigrateLogFacade.query(context.getGroupCode(),context.getProjectId(),context.getAppId(), context.getUserId(),queryCriteria);
-        if(result.getResult().equals(DmpResult.SUCCESS)){
-            if(CollUtil.isEmpty(result.getData())){
-                return AdmResponse.success();
-            }
-            // 设置返回值
-            AdmResponse response = AdmResponse.success(result.getData());
-            Long total = result.getCount() == null ? null : result.getCount().longValue();
-            if(request.isOnlyCount()){
-                response.setTotal(null);
-                response.setCount(total);
-            }else {
-                response.setTotal(total);
-            }
-            response.setPageNumber(request.getPageNumber());
-            response.setPageSize(request.getPageSize());
-            return response;
-        } else {
-            return AdmResponse.failure(result.getMessage());
-        }
+        return logService.queryMigrationLog(context, request);
     }
 
 
@@ -282,7 +301,7 @@ public class DataMigrationController {
             Map<String, List<DataMigrationExcel>> validRes = dataMigrationHandler.handleDicData(context, migrationInfo);
             //字典验证失败
             try {
-                if(CollUtil.isNotEmpty(validRes) && CollUtil.isNotEmpty(validRes.keySet())){
+                if(CollUtil.isNotEmpty(validRes) && validRes.size()>0){
                     returnExcel(response, validRes);
                 }else{
                     Map<String, List<DataMigrationExcel>> results = dataMigrationHandler.handleAndGetExcelList(context, migrationInfo);

+ 37 - 7
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/DataMigrationHandler.java

@@ -7,6 +7,12 @@ import com.persagy.proxy.common.entity.InstanceUrlParam;
 import com.persagy.proxy.migration.constant.MigrationTable;
 import com.persagy.proxy.migration.model.DataMigrationExcel;
 import com.persagy.proxy.migration.model.MigrationInfo;
+import com.persagy.proxy.migration.service.*;
+import com.persagy.proxy.migration.service.Impl.DefineInfoMigration;
+import com.persagy.proxy.migration.service.Impl.DefineTypeMigration;
+import com.persagy.proxy.migration.service.Impl.ObjectDigitalMigration;
+import com.persagy.proxy.migration.service.Impl.ObjectRelationMigration;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
@@ -19,8 +25,13 @@ import java.util.*;
  * @date 2021/12/3 11:14
  */
 @Component
-
+@RequiredArgsConstructor
 public class DataMigrationHandler {
+    private final DefineTypeMigration typeMigration;
+    private final DefineInfoMigration infoMigration;
+
+    private final ObjectDigitalMigration objectDigitalMigration;
+    private final ObjectRelationMigration objectRelationMigration;
 
     private static Map<String, IDataMigration> migrationMap = new HashMap<>(16);
 
@@ -31,14 +42,14 @@ public class DataMigrationHandler {
      */
     public Map<String, List<DataMigrationExcel>> handleDicData(InstanceUrlParam context, MigrationInfo migrationInfo){
         Map<String,List<DataMigrationExcel>> results = new HashMap<>(2);
-        AdmResponse admResponseType = DefineTypeMigration.getInstance().compareByCount(context, migrationInfo);
+        AdmResponse admResponseType = typeMigration.compareByCount(context, migrationInfo);
 
         if(!admResponseType.getResult().equals(DmpResult.SUCCESS)){
             List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
             dataMigrationExcels.addAll((Collection<? extends DataMigrationExcel>) admResponseType.getContent());
             results.put(MigrationTable.DTDEFINETYPE.getCode(), dataMigrationExcels);
         }
-        AdmResponse admResponseInfo = DefineInfoMigration.getInstance().compareByCount(context, migrationInfo);
+        AdmResponse admResponseInfo = infoMigration.compareByCount(context, migrationInfo);
         if(!admResponseInfo.getResult().equals(DmpResult.SUCCESS)){
             List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
             dataMigrationExcels.addAll((Collection<? extends DataMigrationExcel>) admResponseInfo.getContent());
@@ -47,6 +58,25 @@ public class DataMigrationHandler {
         return results;
     }
 
+
+    /**
+     * 获取迁移脚本
+     * @param context
+     */
+    public StringBuffer handleAndGetSqlList(InstanceUrlParam context){
+        StringBuffer sqls = new StringBuffer("");
+        if(CollUtil.isNotEmpty(migrationMap)){
+            for (MigrationTable migrationTable : MigrationTable.values()){
+                if(!migrationMap.containsKey(migrationTable.getCode())){
+                    continue;
+                }
+                sqls.append(migrationMap.get(migrationTable.getCode()).migrateForSql(context));
+            }
+        }
+        return sqls;
+    }
+
+
     /**
      * 获取迁移数据信息
      * @param context
@@ -88,9 +118,9 @@ public class DataMigrationHandler {
 
     @PostConstruct
     private void initHandleService(){
-        addMap(MigrationTable.DTDEFINETYPE.getCode(), DefineTypeMigration.getInstance());
-        addMap(MigrationTable.DTDEFINEINFO.getCode(), DefineInfoMigration.getInstance());
-        addMap(MigrationTable.DTOBJECT.getCode(), ObjectDigitalMigration.getInstance());
-        addMap(MigrationTable.DTRELATION.getCode(), ObjectRelationMigration.getInstance());
+        addMap(MigrationTable.DTDEFINETYPE.getCode(), typeMigration);
+        addMap(MigrationTable.DTDEFINEINFO.getCode(), infoMigration);
+        addMap(MigrationTable.DTOBJECT.getCode(), objectDigitalMigration);
+        addMap(MigrationTable.DTRELATION.getCode(), objectRelationMigration);
     }
 }

+ 9 - 9
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/model/DataMigrationExcel.java

@@ -47,15 +47,15 @@ public class DataMigrationExcel {
     @ExcelProperty(value = "源(云端/现场)", index=6)
     private String directional = "adm-to-project";
 
-    @ColumnWidth(30)
-    @ExcelProperty(value = "from(adm)", index=7)
-    private String source;
-
-    @ColumnWidth(30)
-    @ExcelProperty(value = "to(project)", index=8)
-    private String targetProject;
-
     @ColumnWidth(50)
-    @ExcelProperty(value = "备注", index=9)
+    @ExcelProperty(value = "备注", index=7)
     private String mark;
+
+    @ColumnWidth(25)
+    @ExcelProperty(value = "创建时间", index=8)
+    private String createTime;
+
+    @ColumnWidth(25)
+    @ExcelProperty(value = "更新时间", index=9)
+    private String updateTime;
 }

+ 16 - 2
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/IDataMigration.java

@@ -1,4 +1,4 @@
-package com.persagy.proxy.migration.handler;
+package com.persagy.proxy.migration.service;
 
 import com.persagy.proxy.adm.request.AdmResponse;
 import com.persagy.proxy.common.entity.InstanceUrlParam;
@@ -19,9 +19,23 @@ public interface IDataMigration{
     /**
      * 数据迁移
      * @param context
-     * @return
+     * @return excel
      */
     List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo);
+
+    /**
+     * 数据迁移
+     * @param context
+     * @return log
+     */
     AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo);
 
+
+    /**
+     * 数据迁移
+     * @param context
+     * @return sql 文件
+     */
+    String migrateForSql(InstanceUrlParam context);
+
 }

+ 1 - 1
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/IDataMigrationProcess.java

@@ -1,4 +1,4 @@
-package com.persagy.proxy.migration.handler;
+package com.persagy.proxy.migration.service;
 
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.rwd.migrate.entity.SyncData;

+ 1 - 1
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/IDefineDataMigration.java

@@ -1,4 +1,4 @@
-package com.persagy.proxy.migration.handler;
+package com.persagy.proxy.migration.service;
 
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.proxy.common.entity.InstanceUrlParam;

+ 3 - 2
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/MigrationAbstractService.java

@@ -14,16 +14,17 @@ import java.util.Set;
 
 /**
  * @author lvxianyun
- * @title: MigrationAbstractService
+ * @title: IMigrationAbstractService
  * @projectName adm-middleware
  * @description: 提供基础的数据操作方法
  * @date 2021/12/3 10:42
  */
-public interface MigrationAbstractService<T> {
+public interface IMigrationAbstractService<T> {
 
     /**
      * adm交付数据(A) ∩ 现场数据(B)
      * (A∩B) A
+     *
      *  需要进一步对比的数据
      */
     Map<String,Object> doIntersectionGetFrom(Map<String,Object> from, Map<String,Object> to);

+ 18 - 0
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/IMigrationLogService.java

@@ -0,0 +1,18 @@
+package com.persagy.proxy.migration.service;
+
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.proxy.adm.request.AdmQueryCriteria;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+
+/**
+ * @author lvxianyun
+ * @title: MigrationLogService
+ * @projectName digital-delivery
+ * @description: 迁移日志服务
+ * @date 2022/1/5 17:21
+ */
+public interface IMigrationLogService {
+
+    AdmResponse queryMigrationLog(InstanceUrlParam context, AdmQueryCriteria request);
+}

+ 116 - 37
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/DefineInfoMigration.java

@@ -1,4 +1,4 @@
-package com.persagy.proxy.migration.handler;
+package com.persagy.proxy.migration.service.Impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
@@ -19,8 +19,12 @@ import com.persagy.proxy.migration.constant.MigrationType;
 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.IDataMigration;
+import com.persagy.proxy.migration.service.IDataMigrationProcess;
+import com.persagy.proxy.migration.service.IDefineDataMigration;
 import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -33,23 +37,8 @@ import java.util.stream.Collectors;
  * @date 2021/12/8 17:28
  */
 @Slf4j
+@Service
 public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfoDefine> implements IDataMigration, IDefineDataMigration<ObjectInfoDefine>, IDataMigrationProcess<ObjectInfoDefine> {
-    
-    private static DefineInfoMigration instance;
-
-    private DefineInfoMigration() {}
-
-    // 静态方法返回该实例
-    public static DefineInfoMigration getInstance() {
-        if(instance == null) {
-            synchronized (DefineInfoMigration.class) {
-                if (instance == null) {
-                    instance = new DefineInfoMigration();
-                }
-            }
-        }
-        return instance;
-    }
 
     /**
      * 数据迁移
@@ -61,7 +50,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
     @Override
     public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
         log.info("######################### ObjectInfoDefine 数据迁移内容获取开始 #########################");
-        QueryCriteria queryCriteria = getCustomQueryCriteria();
+        QueryCriteria queryCriteria = getCustomQueryCriteria(context);
         List<ObjectInfoDefine> admDefineList = getAdmData(context, queryCriteria);
         String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
         List<ObjectInfoDefine> projectDefineList = getProjectData(queryCriteria, ObjectInfoDefine.class, queryUrl);
@@ -76,7 +65,7 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
         long start = System.currentTimeMillis();
         List<SyncData> syncDataList = new ArrayList<>();
 
-        QueryCriteria queryCriteria = getCustomQueryCriteria();
+        QueryCriteria queryCriteria = getCustomQueryCriteria(context);
 
         List<ObjectInfoDefine> admDefineList = getAdmData(context, queryCriteria);
         String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
@@ -90,6 +79,8 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
             log.info("######################### DefineInfo 批量插入数据 #########################");
             DataMigrationResponse response = insertBatch(admDefineList, ObjectInfoDefine.class, insertUrl);
             syncDataList.addAll(processDataForLog(response, MigrationType.CREATE.getCode()));
+            super.addSynLog(context, syncDataList);
+            return AdmResponse.success(syncDataList);
         }
         List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectDefineList, null, null);
         Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectInfoDefine.class);
@@ -139,6 +130,103 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
     }
 
     /**
+     * 数据迁移
+     *
+     * @param context
+     * @return sql 文件
+     */
+    @Override
+    public String migrateForSql(InstanceUrlParam context) {
+        //获取自定义的信息点数据
+        QueryCriteria queryCriteria = getCustomQueryCriteria(context);
+        List<ObjectInfoDefine> admDefineList = getAdmData(context, queryCriteria);
+        if(CollUtil.isEmpty(admDefineList)){
+            return "";
+        }
+        StringBuffer sqls = new StringBuffer(" \n -- 数据迁移  dt_define_info ------ \n");
+        sqls.append(MigrationConstant.DEF_FUNCID_SQL_PRE);
+        admDefineList.forEach(infoDefine -> {
+            sqls.append("(");
+            sqls.append("'").append(infoDefine.getId()).append("',");
+            sqls.append("'").append(infoDefine.getCode()).append("',");
+            sqls.append("'").append(infoDefine.getName()).append("',");
+            sqls.append("'").append(infoDefine.getAliasCode()).append("',");
+            sqls.append("'").append(infoDefine.getAliasName()).append("',");
+            sqls.append("'").append(infoDefine.getClassCode()).append("',");
+            sqls.append("'").append(infoDefine.getGroupCode()).append("',");
+            sqls.append("'").append(infoDefine.getProjectId()).append("',");
+            sqls.append("'").append(infoDefine.getCategory()).append("',");
+            sqls.append("'").append(infoDefine.getFirstTag()).append("',");
+            if (infoDefine.getSecondTag() == null) {
+                sqls.append(infoDefine.getSecondTag()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getSecondTag()).append("',");
+            }
+
+            sqls.append("'").append(infoDefine.getPriority()).append("',");
+            sqls.append("'").append(infoDefine.getInputMode()).append("',");
+
+            if (infoDefine.getUnit() == null) {
+                sqls.append(infoDefine.getUnit()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getUnit()).append("',");
+            }
+
+            sqls.append("'").append(infoDefine.getDataType()).append("',");
+            sqls.append(infoDefine.getIsMultiple()?1:0).append(",");
+            sqls.append(infoDefine.getIsRegion()?1:0).append(",");
+
+            if (infoDefine.getFormater() == null) {
+                sqls.append(infoDefine.getFormater()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getFormater()).append("',");
+            }
+
+            if (infoDefine.getDataSource() == null) {
+                sqls.append(infoDefine.getDataSource()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getDataSource()).append("',");
+            }
+
+            if (infoDefine.getRemark() == null) {
+                sqls.append(infoDefine.getRemark()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getRemark()).append("',");
+            }
+            sqls.append(infoDefine.getSubFlag()?1:0).append(",");
+            sqls.append(infoDefine.getWeakPoint()?1:0).append(",");
+            sqls.append(infoDefine.getShowOrder()).append(",");
+
+            if (infoDefine.getVersion() == null) {
+                sqls.append(infoDefine.getVersion()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getVersion()).append("',");
+            }
+
+            sqls.append(infoDefine.getSourceFrom()).append(",");
+            sqls.append("'").append(infoDefine.getCreator()).append("',");
+            sqls.append("'").append(infoDefine.getCreationTime()).append("',");
+            if (infoDefine.getModifier() == null) {
+                sqls.append(infoDefine.getModifier()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getModifier()).append("',");
+            }
+
+            if (infoDefine.getModifiedTime() == null) {
+                sqls.append(infoDefine.getModifiedTime()).append(",");
+            } else {
+                sqls.append("'").append(infoDefine.getModifiedTime()).append("',");
+            }
+            sqls.append(infoDefine.getValid());
+            sqls.append(")\n ,");
+        });
+        String sql = sqls.toString();
+        sql = sql.substring(0, sql.lastIndexOf(","));
+        sql +=";";
+        return sql;
+    }
+
+    /**
      * 获取adm交付的数据,默认获取有效数据
      *
      * @param context
@@ -228,6 +316,8 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
             excel.setCode(define.getCode());
             excel.setName(define.getName());
             excel.setType(type);
+            excel.setCreateTime(define.getCreationTime() == null ? "" : define.getCreationTime().toString());
+            excel.setUpdateTime(define.getModifiedTime() == null ? "" : define.getModifiedTime().toString());
             dataMigrationExcels.add(excel);
         }
         return dataMigrationExcels;
@@ -341,8 +431,8 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
     public List<DataMigrationExcel> compareCriterionByData(InstanceUrlParam context, MigrationInfo migrationInfo, long totalCount) {
         log.info("######################### ObjectInfoDefine 数据迁移 标准字典验证 开始 #########################");
         QueryCriteria queryCriteria = getCriterionQueryCriteria();
-        queryCriteria.setSize(10000l);
-        long pages = 1l;
+        queryCriteria.setSize(10000L);
+        long pages = 1L;
         if(totalCount > 10000){
             pages = totalCount / 10000 + 1;
         }
@@ -369,10 +459,8 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
             log.error(" ######################### DefineInfo adm已交付需要同步的数据:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
             return dataMigrationExcels;
         }
-        //String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
         if(CollUtil.isEmpty(projectDefineList)){
             log.info("######################### DefineInfo 获取批量插入数据 #########################");
-            //DataMigrationResponse response = insertBatch(admDefineList, ObjectInfoDefine.class, insertUrl);
             dataMigrationExcels.addAll(processDataForExcel(admDefineList, MigrationType.CREATE.getCode()));
             return dataMigrationExcels;
         }
@@ -395,8 +483,6 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
         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 response = deleteBatch(deleteIds, ObjectInfoDefine.class, delUrl);
             List<ObjectInfoDefine> delData = toListByIds(deleteIds, projectDefineList);
             dataMigrationExcels.addAll(processDataForExcel(delData, MigrationType.DELETE.getCode()));
         }
@@ -411,8 +497,6 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
             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());
-                //updateBatch(updateData, ObjectInfoDefine.class, updateUrl)
                 dataMigrationExcels.addAll(processDataForExcel(updateData, MigrationType.UPDATE.getCode()));
             }
         }
@@ -425,19 +509,14 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
      * 项目级、集团级定义
      * @return
      */
-    private QueryCriteria getCustomQueryCriteria(){
+    private QueryCriteria getCustomQueryCriteria(InstanceUrlParam context){
         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);
+        andOr.put("groupCode", context.getGroupCode());
+        andOr.put("projectId", context.getProjectId());
 
         criteria.putPOJO("$andOr", andOr);
 
@@ -455,8 +534,8 @@ public class DefineInfoMigration extends MigrationAbstractServiceImpl<ObjectInfo
         QueryCriteria queryCriteria = new QueryCriteria();
         ObjectNode criteria = JsonNodeFactory.instance.objectNode();
         criteria.put("valid", 1);
-        criteria.put("groupCode", 0);
-        criteria.put("projectId", 0);
+        criteria.put("groupCode", "0");
+        criteria.put("projectId", "0");
         queryCriteria.setCriteria(criteria);
         queryCriteria.setSize(-1L);
         return queryCriteria;

+ 86 - 28
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/DefineTypeMigration.java

@@ -1,4 +1,4 @@
-package com.persagy.proxy.migration.handler;
+package com.persagy.proxy.migration.service.Impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
@@ -9,6 +9,7 @@ import com.persagy.dmp.basic.utils.JsonNodeUtils;
 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.ObjectInfoDefine;
 import com.persagy.dmp.define.entity.ObjectTypeDefine;
 import com.persagy.dmp.rwd.migrate.entity.SyncData;
 import com.persagy.proxy.adm.request.AdmResponse;
@@ -19,8 +20,12 @@ import com.persagy.proxy.migration.constant.MigrationType;
 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.IDataMigration;
+import com.persagy.proxy.migration.service.IDataMigrationProcess;
+import com.persagy.proxy.migration.service.IDefineDataMigration;
 import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -32,23 +37,9 @@ import java.util.stream.Collectors;
  * @date 2021/12/1 19:38
  */
 @Slf4j
+@Service
 public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectTypeDefine> implements IDataMigration, IDefineDataMigration<ObjectTypeDefine>, IDataMigrationProcess<ObjectTypeDefine> {
 
-    private static DefineTypeMigration instance;
-
-    private DefineTypeMigration() {}
-
-    // 静态方法返回该实例
-    public static DefineTypeMigration getInstance() {
-        if(instance == null) {
-            synchronized (DefineTypeMigration.class) {
-                if (instance == null) {
-                    instance = new DefineTypeMigration();
-                }
-            }
-        }
-        return instance;
-    }
     /**
      * 数据迁移 迁移项目级 集团级 字典信息
      *
@@ -59,7 +50,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
     @Override
     public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
         log.info("######################### DefineType 数据迁移内容获取开始 #########################");
-        QueryCriteria queryCriteria = getCustomQueryCriteria();
+        QueryCriteria queryCriteria = getCustomQueryCriteria(context);
 
         List<ObjectTypeDefine> admDefineList = getAdmData(context, queryCriteria);
         String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
@@ -75,7 +66,7 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
         long start = System.currentTimeMillis();
         List<SyncData> syncDataList = new ArrayList<>();
 
-        QueryCriteria queryCriteria = getCustomQueryCriteria();
+        QueryCriteria queryCriteria = getCustomQueryCriteria(context);
 
         List<ObjectTypeDefine> admDefineList = getAdmData(context, queryCriteria);
         String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
@@ -90,6 +81,8 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
             log.info("######################### DefineType 批量插入数据 #########################");
             DataMigrationResponse dataMigrationResponse = insertBatch(admDefineList, ObjectTypeDefine.class, insertUrl);
             syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode()));
+            super.addSynLog(context, syncDataList);
+            return AdmResponse.success(syncDataList);
         }
         List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(objectNodeList, null, null);
         Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectTypeDefine.class);
@@ -140,6 +133,74 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
     }
 
     /**
+     * 数据迁移
+     *
+     * @param context
+     * @return sql 文件
+     */
+    @Override
+    public String migrateForSql(InstanceUrlParam context) {
+        //获取自定义的类型数据
+        QueryCriteria queryCriteria = getCustomQueryCriteria(context);
+        List<ObjectTypeDefine> admDefineList = getAdmData(context, queryCriteria);
+        if(CollUtil.isEmpty(admDefineList)){
+            return "";
+        }
+        StringBuffer sqls = new StringBuffer(" \n -- 数据迁移  dt_define_type ------ \n");
+        sqls.append(MigrationConstant.DEF_CLASS_SQL_PRE);
+        admDefineList.forEach(typeDefine ->{
+            sqls.append("(");
+            sqls.append("'").append(typeDefine.getId()).append("',");
+            sqls.append("'").append(typeDefine.getCode()).append("',");
+            sqls.append("'").append(typeDefine.getName()).append("',");
+            sqls.append("'").append(typeDefine.getAliasCode()).append("',");
+            sqls.append("'").append(typeDefine.getAliasName()).append("',");
+            sqls.append("'").append(typeDefine.getObjType()).append("',");
+            sqls.append("'").append(typeDefine.getGroupCode()).append("',");
+            sqls.append("'").append(typeDefine.getProjectId()).append("',");
+
+            if (typeDefine.getMajorCode() == null) {
+                sqls.append(typeDefine.getMajorCode()).append(",");
+            } else {
+                sqls.append("'").append(typeDefine.getMajorCode()).append("',");
+            }
+
+            sqls.append("'").append(typeDefine.getSystemCode()).append("',");
+
+            if (typeDefine.getEquipmentCode() == null) {
+                sqls.append(typeDefine.getEquipmentCode()).append(",");
+            } else {
+                sqls.append("'").append(typeDefine.getEquipmentCode()).append("',");
+            }
+
+            sqls.append("'").append(typeDefine.getParentCode()).append("',");
+            sqls.append("'").append(typeDefine.getVersion()).append("',");
+            sqls.append(typeDefine.getSourceFrom()).append(",");
+            sqls.append("'").append(typeDefine.getCreator()).append("',");
+            sqls.append("'").append(typeDefine.getCreationTime()).append("',");
+
+            if (typeDefine.getModifier() == null) {
+                sqls.append(typeDefine.getModifier()).append(",");
+            } else {
+                sqls.append("'").append(typeDefine.getModifier()).append("',");
+            }
+
+            if (typeDefine.getModifiedTime() == null) {
+                sqls.append(typeDefine.getModifiedTime()).append(",");
+            } else {
+                sqls.append("'").append(typeDefine.getModifiedTime()).append("',");
+            }
+
+            sqls.append(typeDefine.getValid());
+            sqls.append(")\n ,");
+        });
+        String sql = sqls.toString();
+        sql = sql.substring(0, sql.lastIndexOf(","));
+        sql +=";";
+        return sql;
+    }
+
+    /**
      * 获取adm交付的数据,默认获取有效数据
      *
      * @param context
@@ -224,6 +285,8 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
             excel.setCode(objectTypeDefine.getCode());
             excel.setName(objectTypeDefine.getName());
             excel.setType(type);
+            excel.setCreateTime(objectTypeDefine.getCreationTime() == null ? "" : objectTypeDefine.getCreationTime().toString());
+            excel.setUpdateTime(objectTypeDefine.getModifiedTime() == null ? "" : objectTypeDefine.getModifiedTime().toString());
             if(objectTypeDefine.getGroupCode().equals("0") && objectTypeDefine.getProjectId().equals("0")){
                 excel.setMark("标准字典");
             }else{
@@ -411,19 +474,14 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
      * 项目级、集团级定义
      * @return
      */
-    private QueryCriteria getCustomQueryCriteria(){
+    private QueryCriteria getCustomQueryCriteria(InstanceUrlParam context){
         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);
+        andOr.put("groupCode", context.getGroupCode());
+        andOr.put("projectId", context.getProjectId());
 
         criteria.putPOJO("$andOr", andOr);
 
@@ -441,8 +499,8 @@ public class DefineTypeMigration extends MigrationAbstractServiceImpl<ObjectType
         QueryCriteria queryCriteria = new QueryCriteria();
         ObjectNode criteria = JsonNodeFactory.instance.objectNode();
         criteria.put("valid", 1);
-        criteria.put("groupCode", 0);
-        criteria.put("projectId", 0);
+        criteria.put("groupCode", "0");
+        criteria.put("projectId", "0");
         queryCriteria.setCriteria(criteria);
         queryCriteria.setSize(-1L);
         return queryCriteria;

+ 63 - 35
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/Impl/MigrationAbstractServiceImpl.java

@@ -7,7 +7,6 @@ import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.Sets;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.constant.ResponseCode;
@@ -23,7 +22,7 @@ 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.MigrationAbstractService;
+import com.persagy.proxy.migration.service.IMigrationAbstractService;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.IOException;
@@ -39,7 +38,7 @@ import java.util.stream.Collectors;
  * @date 2021/12/3 10:56
  */
 @Slf4j
-public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService<T> {
+public class MigrationAbstractServiceImpl<T> implements IMigrationAbstractService<T> {
 
     /**
      * adm交付数据(A) ∩ 现场数据(B)
@@ -56,7 +55,7 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
         if(CollUtil.isEmpty(from) || CollUtil.isEmpty(to)){
             return null;
         }
-        Sets.SetView<String> intersection = Sets.intersection(from.keySet(), to.keySet());
+        Set<String> intersection = CollUtil.intersectionDistinct(from.keySet(), to.keySet());
         if(CollUtil.isEmpty(intersection)){
             return null;
         }
@@ -75,13 +74,10 @@ 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)){
+        if(CollUtil.isEmpty(from) || CollUtil.isEmpty(to)){
             return null;
         }
-        Sets.SetView<String> intersection = Sets.intersection(from.keySet(), to.keySet());
+        Set<String> intersection = CollUtil.intersectionDistinct(from.keySet(), to.keySet());
         if(CollUtil.isEmpty(intersection)){
             return null;
         }
@@ -107,8 +103,8 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
         if(CollUtil.isEmpty(to)){
             return from;
         }
-        Sets.SetView<String> diffA = Sets.difference(from.keySet(), to.keySet());
-        return getValueForMapByKeys(diffA, from);
+        Set<String> diff = difference(from.keySet(), to.keySet());
+        return getValueForMapByKeys(diff, from);
     }
 
     /**
@@ -130,8 +126,28 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
         if(CollUtil.isEmpty(to)){
             return null;
         }
-        Sets.SetView<String> diffB = Sets.difference(to.keySet(), from.keySet());
-        return getValueForMapByKeys(diffB, to);
+        Set<String> diff = difference(from.keySet(), to.keySet());
+        return getValueForMapByKeys(diff, to);
+    }
+
+    /**
+     * 筛选出所有不同的元素
+     * @param from
+     * @param to
+     * @return
+     */
+    private Set<String> difference(Set<String> from, Set<String> to) {
+        if(CollUtil.isEmpty(from)){
+            return to;
+        }
+        if(CollUtil.isEmpty(to)){
+            return from;
+        }
+        Set<String> all = CollUtil.newHashSet(from);
+        all.addAll(to);
+        Set<String> intersection = CollUtil.intersectionDistinct(from, to);
+        Collection<String> diff = CollUtil.subtract(all, intersection);
+        return CollUtil.isEmpty(diff)?CollUtil.newHashSet():CollUtil.newHashSet(diff);
     }
 
     /**
@@ -226,6 +242,9 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
                         || fieldKey.equals(AuditableEntity.DO_PROP_MODIFIEDTIME)
                         || fieldKey.equals(AuditableEntity.PROP_MODIFIER)
                         || fieldKey.equals(BaseEntity.PROP_TS)
+                        || fieldKey.equals("createApp")
+                        || fieldKey.equals("updateApp")
+                        || fieldKey.equals(BaseEntity.PROP_TS)
                         || fieldKey.equals("dataSource")
                 ){
                     continue;
@@ -275,14 +294,11 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
     private DataMigrationResponse saveOrUpdateCommProcess(List vos,  Class<T> clazz, String url){
         DataMigrationResponse dataMigrationResponse = DataMigrationResponse.success();
         if(vos.size() <= MigrationConstant.BATCH_SUBMIT_DATA_COUNT){
-            DataMigrationResponse temp = processProjectData(vos,null, clazz, url);
-            if(CollUtil.isNotEmpty(temp.getData())){
-                dataMigrationResponse.addData(temp.getData());
-            }
+            dataMigrationResponse = processProjectData(vos,null, clazz, url);
         }else{
             int count= vos.size() / MigrationConstant.BATCH_SUBMIT_DATA_COUNT;
             for(int k = 0; k< count + 1 ;k++){
-                int end = (k+1)  * MigrationConstant.BATCH_SUBMIT_DATA_COUNT - 1;
+                int end = (k+1)  * MigrationConstant.BATCH_SUBMIT_DATA_COUNT;
                 if(end > vos.size()){
                     end = vos.size();
                 }
@@ -332,16 +348,10 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
         Set<String> formSets = from.entrySet().stream().map(en -> String.join(MigrationConstant.SPLITER_UNION,en.getKey(),en.getValue().toString())).collect(Collectors.toSet());
         Set<String> toSets = to.entrySet().stream().map(en -> String.join(MigrationConstant.SPLITER_UNION,en.getKey(),en.getValue().toString())).collect(Collectors.toSet());
 
-        Sets.SetView<String> difference = Sets.difference(formSets, toSets);
-
+        Set<String> difference = difference(formSets, toSets);
         if(CollUtil.isEmpty(difference)){
             return null;
         }
-        /*difference.forEach(set1 -> System.out.println(set1));
-        System.out.println("-------------------------------------------------------------------------");
-        Sets.SetView<String> difference2 = Sets.difference(toSets, formSets);
-        difference2.forEach(set2 -> System.out.println(set2));*/
-
         Set<String> diff = difference.stream().map(entity -> StrUtil.subBefore(entity, MigrationConstant.SPLITER_UNION, true)).collect(Collectors.toSet());
         Map<String, Object> results = getValueForMapByKeys(diff, from);
         return results;
@@ -373,27 +383,45 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
             syncData.setTableName(tableName);
             syncData.setTargetId("error");
             syncData.setError(msg);
-            syncData.setSign(1);
+            syncData.setSign(3);//异常
             syncDataList.add(syncData);
         }
         return syncDataList;
     }
 
+    /**
+     * 调用中台接口,保存迁移日志
+     * 日志量 > MigrationConstant.BATCH_SUBMIT_DATA_COUNT 使用分页插入
+     *
+     * @param context
+     * @param syncDataList
+     * @return
+     */
     @Override
     public List<SyncData> addSynLog(InstanceUrlParam context, List<SyncData> syncDataList) {
         if(CollUtil.isEmpty(syncDataList)){
             return Collections.emptyList();
         }
+        //List<SyncData> syncDatasResult = new ArrayList<>(syncDataList.size());
         // 调用中台新增
-        List<SyncData> syncDatas = DigitalMigrateLogFacade.create(context.getGroupCode(),context.getProjectId(),context.getAppId(), context.getUserId(), syncDataList);
-
-        if(CollUtil.isEmpty(syncDatas)) {
-            throw new RuntimeException("调用中台更新迁移日志出错");
+        if(syncDataList.size() - MigrationConstant.BATCH_SUBMIT_DATA_COUNT < 0){
+            DigitalMigrateLogFacade.create(context.getGroupCode(),context.getProjectId(),context.getAppId(), context.getUserId(), syncDataList);
+        }else{
+            int count= syncDataList.size() / MigrationConstant.BATCH_SUBMIT_DATA_COUNT;
+            for(int k = 0; k < count + 1 ;k++){
+                int end = (k+1)  * MigrationConstant.BATCH_SUBMIT_DATA_COUNT;
+                if(end > syncDataList.size()){
+                    end = syncDataList.size();
+                }
+                List syncData = syncDataList.subList(k * MigrationConstant.BATCH_SUBMIT_DATA_COUNT, end);
+                //syncDatasResult.addAll(DigitalMigrateLogFacade.create(context.getGroupCode(),context.getProjectId(),context.getAppId(), context.getUserId(), syncData));
+                DigitalMigrateLogFacade.create(context.getGroupCode(),context.getProjectId(),context.getAppId(), context.getUserId(), syncData);
+            }
         }
         return syncDataList;
     }
 
-    private DataMigrationResponse processProjectData(List vos, QueryCriteria queryCriteria, Class<T> clazz, String url){
+    public DataMigrationResponse processProjectData(List vos, QueryCriteria queryCriteria, Class<T> clazz, String url){
         //处理rwd 请求返回超时
         String body = null;
         try {
@@ -420,12 +448,12 @@ public class MigrationAbstractServiceImpl<T> implements MigrationAbstractService
                 }
                 return DataMigrationResponse.success(JsonNodeUtils.toEntity(arrayNode, clazz, null));
             }else {
-                log.error(commonResult.getMessage());
-                return DataMigrationResponse.error(commonResult.getMessage());
+                log.error(StrUtil.format("获取中台数据失败{}",commonResult.getMessage()));
+                return DataMigrationResponse.error(StrUtil.format("获取中台数据失败{}",commonResult.getMessage()));
             }
         }catch (Exception e){
-            log.error(e.getMessage());
-            return DataMigrationResponse.error(e.getMessage());
+            log.error(StrUtil.format("获取中台数据异常{}",e.getMessage()));
+            return DataMigrationResponse.error(StrUtil.format("获取中台数据异常{}",e.getMessage()));
         }
 
     }

+ 126 - 0
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/Impl/MigrationLogServiceImpl.java

@@ -0,0 +1,126 @@
+package com.persagy.proxy.migration.service.Impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.define.client.DigitalGraphDefineFacade;
+import com.persagy.dmp.define.client.DigitalRelationDefineFacade;
+import com.persagy.dmp.define.entity.GraphDefine;
+import com.persagy.dmp.define.entity.RelationDefine;
+import com.persagy.dmp.migrate.client.DigitalMigrateLogFacade;
+import com.persagy.dmp.rwd.migrate.entity.SyncData;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
+import com.persagy.proxy.adm.request.AdmQueryCriteria;
+import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.adm.utils.AdmQueryCriteriaHelper;
+import com.persagy.proxy.common.entity.DmpResult;
+import com.persagy.proxy.common.entity.InstanceUrlParam;
+import com.persagy.proxy.migration.constant.MigrationTable;
+import com.persagy.proxy.migration.service.IMigrationLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author lvxianyun
+ * @title: MigrationLogServiceImpl
+ * @projectName digital-delivery
+ * @description: 数据迁移日志服务
+ * @date 2022/1/5 17:22
+ */
+@Service
+@Slf4j
+public class MigrationLogServiceImpl implements IMigrationLogService {
+    @Override
+    public AdmResponse queryMigrationLog(InstanceUrlParam context, AdmQueryCriteria request) {
+        QueryCriteria queryCriteria = AdmQueryCriteriaHelper.toDmpCriteria(request);
+        String groupCode = context.getGroupCode();
+        String projectId = context.getProjectId();
+        CommonResult<List<SyncData>> result = DigitalMigrateLogFacade.query(groupCode, projectId, context.getAppId(), context.getUserId(),queryCriteria);
+        if(result.getResult().equals(DmpResult.SUCCESS)){
+            if(CollUtil.isEmpty(result.getData())){
+                return AdmResponse.success();
+            }
+            // 处理返回值
+            List<SyncData> syncDatas = result.getData();
+            processSynDatas(groupCode, projectId, syncDatas);
+            AdmResponse response = AdmResponse.success(syncDatas);
+            Long total = result.getCount() == null ? null : result.getCount().longValue();
+            if(request.isOnlyCount()){
+                response.setTotal(null);
+                response.setCount(total);
+            }else {
+                response.setTotal(total);
+            }
+            response.setPageNumber(request.getPageNumber());
+            response.setPageSize(request.getPageSize());
+            return response;
+        } else {
+            return AdmResponse.failure(result.getMessage());
+        }
+    }
+
+
+    /***
+     * Description: 查询所有关系类型
+
+     * @return : java.util.Map<java.lang.String,com.persagy.dmp.define.entity.RelationDefine>
+     * @author : lijie
+     * @date :2021/10/15 11:22
+     * Update By lijie 2021/10/15 11:22
+     */
+    private Map<String, RelationDefine> queryAllRelationDefineMap(String groupCode,String projectId) {
+        List<RelationDefine> relationDefines = DigitalRelationDefineFacade.query(groupCode, projectId,
+                AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, new QueryCriteria());
+        if (CollUtil.isEmpty(relationDefines)){
+            return new HashMap<>();
+        }
+        return relationDefines.stream()
+                .collect(Collectors.toMap(relationDefine ->
+                                relationDefine.getGraphCode() + StrUtil.DASHED + relationDefine.getCode(),
+                        relationDefine -> relationDefine, (k1, k2) -> k1));
+    }
+
+    /**
+     * 将同步日志中的relcode graphCode 翻译成name组合
+     * @param groupCode
+     * @param projectId
+     * @param syncDatas
+     */
+    private void processSynDatas(String groupCode, String projectId, List<SyncData> syncDatas){
+        // 1.获取所有的一级,二级图类型定义
+        QueryCriteria parentCriteria = new QueryCriteria();
+        List<GraphDefine> graphDefines = DigitalGraphDefineFacade.query(groupCode, projectId,
+                AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, parentCriteria);
+        if (!CollUtil.isEmpty(graphDefines)){
+            // 2.查询所有的边类型定义
+            Map<String, RelationDefine> relationDefineMap = queryAllRelationDefineMap(groupCode,projectId);
+            Map<String, GraphDefine> graphDefineMap = CollUtil.fieldValueMap(graphDefines, "code");
+            for(SyncData syncData : syncDatas){
+                if(!syncData.getTableName().equals(MigrationTable.DTRELATION.getCode())){
+                   continue;
+                }
+                String code = syncData.getCode();
+                if(StrUtil.isEmpty(code) || !code.contains(StrUtil.DASHED)){
+                    continue;
+                }
+                //excel.setCode(String.join(StrUtil.DASHED, objectRelation.getGraphCode(), objectRelation.getRelCode()));
+                String tempName = null;
+                String graphName = graphDefineMap.get(code.split(StrUtil.DASHED)[0]).getName();
+                String relName = relationDefineMap.get(code).getName();
+                if(StrUtil.isAllNotEmpty(graphName, relName)){
+                    tempName = String.join(StrUtil.DASHED, graphName, relName);
+                }
+                syncData.setName(tempName==null?"":tempName);
+            }
+
+        }
+
+    }
+}

+ 111 - 31
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/ObjectDigitalMigration.java

@@ -1,4 +1,4 @@
-package com.persagy.proxy.migration.handler;
+package com.persagy.proxy.migration.service.Impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
@@ -8,6 +8,9 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.model.entity.AuditableEntity;
+import com.persagy.dmp.common.model.entity.BaseEntity;
+import com.persagy.dmp.define.entity.ObjectTypeDefine;
 import com.persagy.dmp.digital.client.DigitalObjectFacade;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.rwd.migrate.entity.SyncData;
@@ -20,8 +23,11 @@ import com.persagy.proxy.migration.constant.MigrationType;
 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.IDataMigration;
+import com.persagy.proxy.migration.service.IDataMigrationProcess;
 import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -34,24 +40,9 @@ import java.util.stream.Collectors;
  * @date 2021/12/8 19:53
  */
 @Slf4j
+@Service
 public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectDigital> implements IDataMigration, IDataMigrationProcess<ObjectDigital> {
 
-   private static ObjectDigitalMigration instance;
-
-    private ObjectDigitalMigration() {}
-
-    // 静态方法返回该实例
-    public static ObjectDigitalMigration getInstance() {
-        if(instance == null) {
-            synchronized (ObjectDigitalMigration.class) {
-                if (instance == null) {
-                    instance = new ObjectDigitalMigration();
-                }
-            }
-        }
-        return instance;
-    }
-
     /**
      * 数据迁移前,数据对比信息 汇总
      *
@@ -93,15 +84,98 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             log.info("######################### dt_object "+objType.getCode()+"同步开始 #########################");
 
             QueryCriteria queryCriteria = getQueryCriteria(objType.getCode());
-            List<SyncData> syncDataList = startMigrateForLog(context,migrationInfo,queryCriteria);
+            startMigrateForLog(context,migrationInfo,queryCriteria);
 
-            log.info("######################### dt_object "+objType.getCode()+"同步结束 共计:"+syncDataList.size()+"条 #########################");
+            log.info("######################### dt_object "+objType.getCode()+"同步结束 #########################");
         }
         long end = System.currentTimeMillis();
         log.info("######################### dt_object 数据迁移已结束 时间:"+(end-start)+" #########################");
         return AdmResponse.success();
     }
 
+    /**
+     * 数据迁移
+     *
+     * @param context
+     * @return sql 文件
+     */
+    @Override
+    public String migrateForSql(InstanceUrlParam context) {
+        StringBuffer sqls = new StringBuffer(" \n -- 数据迁移  dt_object ------ \n");
+        //获取已经采集的数据
+        String sqls_temp = "";
+        for(MigrationObjType objType : MigrationObjType.values()){
+            QueryCriteria queryCriteria = getQueryCriteria(objType.getCode());
+            List<ObjectNode> admData = getAdmData(context,queryCriteria);
+            if(CollUtil.isEmpty(admData)){
+                continue;
+            }
+            sqls_temp += appendValues(admData).toString();
+        }
+        if(sqls_temp.length() == 0){
+            return "";
+        }
+        sqls.append(MigrationConstant.DT_OBJECT_SQL_PRE);
+        sqls.append(sqls_temp);
+        String sql = sqls.toString();
+        sql = sql.substring(0, sql.lastIndexOf(","));
+        sql += ";";
+        sql = sql.replaceAll("\"","\\\\\"");
+        return sql;
+    }
+
+    private StringBuffer appendValues(List<ObjectNode> admData){
+        StringBuffer sqls = new StringBuffer();
+        admData.forEach(obj -> {
+            ObjectDigital objectDigital = JsonNodeUtils.toEntity(obj, ObjectDigital.class, "infos");
+            sqls.append("(");
+            sqls.append("'").append(objectDigital.getId()).append("',");
+            if (objectDigital.getName() == null) {
+                sqls.append(objectDigital.getName()).append(",");
+            } else {
+                sqls.append("'").append(objectDigital.getName()).append("',");
+            }
+
+            if (objectDigital.getLocalId() == null) {
+                sqls.append(objectDigital.getLocalId()).append(",");
+            } else {
+                sqls.append("'").append(objectDigital.getLocalId()).append("',");
+            }
+            if (objectDigital.getLocalName() == null) {
+                sqls.append(objectDigital.getLocalName()).append(",");
+            } else {
+                sqls.append("'").append(objectDigital.getLocalName()).append("',");
+            }
+            sqls.append("'").append(objectDigital.getGroupCode()).append("',");
+            sqls.append("'").append(objectDigital.getProjectId()).append("',");
+            sqls.append("'").append(objectDigital.getObjType()).append("',");
+            sqls.append("'").append(objectDigital.getClassCode()).append("',");
+            sqls.append("'").append(objectDigital.getGrouping()).append("',");
+            sqls.append("'").append(objectDigital.getInfos()).append("',");
+            if (objectDigital.getVirtualCodes() == null) {
+                sqls.append(objectDigital.getVirtualCodes()).append(",");
+            } else {
+                sqls.append("'").append(objectDigital.getVirtualCodes()).append("',");
+            }
+            if (objectDigital.getCreateApp() == null) {
+                sqls.append(objectDigital.getCreateApp()).append(",");
+            } else {
+                sqls.append("'").append(objectDigital.getCreateApp()).append("',");
+            }
+            if (objectDigital.getUpdateApp() == null) {
+                sqls.append(objectDigital.getUpdateApp()).append(",");
+            } else {
+                sqls.append("'").append(objectDigital.getUpdateApp()).append("',");
+            }
+            sqls.append("'").append(objectDigital.getCreator()).append("',");
+            sqls.append("'").append(objectDigital.getCreationTime()).append("',");
+            sqls.append("'").append(objectDigital.getModifier()).append("',");
+            sqls.append("'").append(objectDigital.getModifiedTime()).append("',");
+            sqls.append(objectDigital.getValid());
+            sqls.append(")\n ,");
+        });
+        return sqls;
+    }
     private QueryCriteria getQueryCriteria(String typeCode){
         QueryCriteria queryCriteria = new QueryCriteria();
         queryCriteria.setSize(-1L);
@@ -116,7 +190,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
      * 迁移数据,记录日志
      *
      */
-    private List<SyncData> startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria) {
+    private void startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria) {
         List<SyncData> syncDataList = new ArrayList<>();
         List<ObjectNode> admData = getAdmData(context,queryCriteria);
 
@@ -128,10 +202,18 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             log.error(" ######################### dt_object adm已交付:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
         }
 
+        //因获取的数据均有主键 使用更新
         String insertUrl = requestUrl(context, migrationInfo, MigrationType.CREATE.getCode());
         if(CollUtil.isEmpty(projObjectNodeList)){
+            //调用中台验证待新增的数据
+            List<ObjectDigital> digitalList = validateInfoCode(admData, context);
+            //处理并保存日志
+            syncDataList.addAll(processDataForLog(DataMigrationResponse.success(digitalList), MigrationType.CREATE.getCode()));
+
             DataMigrationResponse dataMigrationResponse = insertBatch(admData, ObjectDigital.class, insertUrl);
-            syncDataList = processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode());
+            syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode()));
+            super.addSynLog(context, syncDataList);
+            return;
         }
         Map<String,Object> projectMap = toEntityMap(projObjectNodeList, ObjectDigital.class);
         Map<String,Object> admMap = toEntityMap(admData, ObjectDigital.class);
@@ -146,6 +228,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
 
             //插入数据
             DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectDigital.class, insertUrl);
+            //处理并保存日志
             syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode()));
         }
 
@@ -159,6 +242,7 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             List<String> successIds = (List<String>) dataMigrationResponse.getData();
             List<ObjectNode> delObjs = toListByIds(successIds, projObjectNodeList);
             dataMigrationResponse.setData(delObjs);
+            //处理并保存日志
             syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.DELETE.getCode()));
         }
 
@@ -172,16 +256,18 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
                 List<ObjectNode> updateData = toList(compareData, admData);
                 //调用中台验证待更新的数据
                 List<ObjectDigital> digitalList = validateInfoCode(updateData, context);
-                //将验证结果放到日志
+                //将验证结果放到日志并保存
                 syncDataList.addAll(processDataForLog(DataMigrationResponse.success(digitalList), MigrationType.UPDATE.getCode()));
 
                 //更新
                 String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
                 DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectDigital.class, updateUrl);
+                //处理并保存日志
                 syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.UPDATE.getCode()));
             }
         }
-       return super.addSynLog(context, syncDataList);
+        //处理并保存日志
+        super.addSynLog(context, syncDataList);
     }
 
     /**
@@ -197,13 +283,10 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
         List<ObjectNode> objectNodeList = JsonNodeUtils.toListNode(projectData, null, null);
 
         if(CollUtil.isEmpty(admData)){
-            log.error(" ######################### dt_object adm已交付:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
             return Collections.emptyList();
         }
 
-        //String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
         if(CollUtil.isEmpty(objectNodeList)){
-            //DataMigrationResponse dataMigrationResponse = insertBatch(admData, ObjectDigital.class, insertUrl);
             dataMigrationExcels.addAll(processDataForExcel(admData, MigrationType.CREATE.getCode()));
             return dataMigrationExcels;
         }
@@ -213,7 +296,6 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
         Map<String,Object> doSubtractFromInsert = doSubtractAdd(admMap, projectMap);
         if(!CollUtil.isEmpty(doSubtractFromInsert)){
             List<ObjectNode> insertData = toList(doSubtractFromInsert, admData);
-            //DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectDigital.class, insertUrl);
             dataMigrationExcels.addAll(processDataForExcel(insertData, MigrationType.CREATE.getCode()));
         }
 
@@ -223,8 +305,6 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
 
             List<ObjectNode> deleteData = toListByIds(deleteIds, objectNodeList);
-            //String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
-            //DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectDigital.class, delUrl);
             dataMigrationExcels.addAll(processDataForExcel(deleteData, MigrationType.DELETE.getCode()));
         }
 
@@ -236,8 +316,6 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             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);
                 dataMigrationExcels.addAll(processDataForExcel(updateData, MigrationType.UPDATE.getCode()));
             }
         }
@@ -351,6 +429,8 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             excel.setId(digital.getId());
             excel.setName(String.join(StrUtil.DASHED, digital.getLocalId() == null ? "" : digital.getLocalId(), digital.getLocalName() == null ? "" : digital.getLocalName()));
             excel.setType(type);
+            excel.setCreateTime(digital.getCreationTime() == null ? "" : digital.getCreationTime().toString());
+            excel.setUpdateTime(digital.getModifiedTime() == null ? "" :digital.getModifiedTime().toString());
             dataMigrationExcels.add(excel);
         }
         return dataMigrationExcels;

+ 225 - 67
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/handler/ObjectRelationMigration.java

@@ -1,27 +1,36 @@
-package com.persagy.proxy.migration.handler;
+package com.persagy.proxy.migration.service.Impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
 import com.persagy.dmp.basic.utils.JsonNodeUtils;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.model.entity.BaseEntity;
+import com.persagy.dmp.common.model.response.CommonResult;
+import com.persagy.dmp.define.client.DigitalGraphDefineFacade;
+import com.persagy.dmp.define.client.DigitalRelationDefineFacade;
+import com.persagy.dmp.define.entity.GraphDefine;
+import com.persagy.dmp.define.entity.RelationDefine;
 import com.persagy.dmp.digital.client.DigitalRelationFacade;
+import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.digital.entity.ObjectRelation;
 import com.persagy.dmp.rwd.migrate.entity.SyncData;
+import com.persagy.proxy.adm.constant.AdmCommonConstant;
 import com.persagy.proxy.adm.request.AdmResponse;
+import com.persagy.proxy.common.entity.DmpResult;
 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.constant.*;
 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.IDataMigration;
+import com.persagy.proxy.migration.service.IDataMigrationProcess;
 import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
 
 import java.util.*;
 import java.util.concurrent.*;
@@ -35,24 +44,9 @@ import java.util.stream.Collectors;
  * @date 2021/12/8 19:51
  */
 @Slf4j
+@Service
 public class ObjectRelationMigration extends MigrationAbstractServiceImpl<ObjectRelation> implements IDataMigration, IDataMigrationProcess<ObjectRelation> {
 
-    private static ObjectRelationMigration instance;
-
-    private ObjectRelationMigration() {}
-
-    // 静态方法返回该实例
-    public static ObjectRelationMigration getInstance() {
-        if(instance == null) {
-            synchronized (ObjectRelationMigration.class) {
-                if (instance == null) {
-                    instance = new ObjectRelationMigration();
-                }
-            }
-        }
-        return instance;
-    }
-
     /**
      * 数据迁移
      *
@@ -97,12 +91,6 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
                 log.error("######################### dt_relation 数据迁移内容获取失败"+e.getMessage());
             }
         }
-        /*for (MiGrationRelCode miGrationRelCode: MiGrationRelCode.values()){
-            //log.info("######################### dt_relation "+miGrationRelCode.getCode()+"数据迁移内容获取开始 #########################");
-            QueryCriteria queryCriteria = getQueryCriteria(miGrationRelCode.getCode());
-            dataMigrationExcels.addAll(startMigrateForExcel(context, migrationInfo, queryCriteria));
-            //log.info("######################### dt_relation "+miGrationRelCode.getCode()+"数据迁移内容获取结束 #########################");
-        }*/
         long end = System.currentTimeMillis();
         log.info("######################### dt_relation 数据迁移内容获取结束 "+(end-start)+"#########################");
         return dataMigrationExcels;
@@ -112,48 +100,151 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
     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()+"条 #########################");
-        }*/
         ExecutorService service = getExcecutor();
-        List<SyncData> syncDataList = new ArrayList<>();
-        List<Future<List<SyncData>>> list = new ArrayList<>();
 
         for (MiGrationRelCode miGrationRelCode: MiGrationRelCode.values()){
             log.info("######################### dt_relation "+miGrationRelCode.getCode()+"数据迁移开始 #########################");
 
-            Future<List<SyncData>> future = service.submit(new Callable<List<SyncData>>(){
+            service.submit(new Runnable() {
                 @Override
-                public List<SyncData> call() throws Exception {
-                    return startMigrateForLog(context, migrationInfo, miGrationRelCode.getCode());
+                public void run() {
+                    startMigrateForLog(context, migrationInfo, miGrationRelCode.getCode());
                 }
             });
-            list.add(future);
         }
         service.shutdown();
-        for (Future<List<SyncData>> future : list) {
+        long end = System.currentTimeMillis();
+        log.info("######################### dt_relation 同步结束 "+(end-start)+"#########################");
+        return AdmResponse.success();
+    }
+
+    /**
+     * 数据迁移 数据量超过1w 分页 多线程处理
+     *
+     * @param context
+     * @return sql 文件
+     */
+    @Override
+    public String migrateForSql(InstanceUrlParam context) {
+        StringBuffer sqls = new StringBuffer(" \n -- 数据迁移  dt_relation ------ \n");
+        //获取已经采集的数据
+        String sqls_temp = "";
+        ExecutorService service = getExcecutor();
+        List<Future<StringBuffer>> futureList = new ArrayList<>();
+        for (MiGrationRelCode miGrationRelCode: MiGrationRelCode.values()){
+            QueryCriteria queryCriteria = getQueryCriteria(miGrationRelCode.getCode());
+            queryCriteria.setSize(10000L);
+            CommonResult<List<ObjectRelation>> admDatas = getAdmDataPage(context,queryCriteria);
+            if (admDatas.getResult().equals(DmpResult.SUCCESS) && admDatas.getCount() > queryCriteria.getSize()) {
+                long pages = admDatas.getCount() / queryCriteria.getSize() + 1;
+                for(long i = 2;i < pages; i++){
+                    queryCriteria.setPage(i);
+                    List<ObjectRelation> admData = getAdmData(context,queryCriteria);
+                    appendValuesBefore(service,admData,futureList);
+                }
+            }else{
+                List<ObjectRelation> admData = admDatas.getData();
+                appendValuesBefore(service,admData,futureList);
+            }
+        }
+        service.shutdown();
+        for (Future<StringBuffer> future : futureList) {
             try {
-                List<SyncData> syncDatas = future.get();
-                if(CollUtil.isNotEmpty(syncDatas)){
-                    syncDataList.addAll(syncDatas);
+                StringBuffer stringBuffer = future.get();
+                if(StrUtil.isNotEmpty(stringBuffer)){
+                    sqls_temp += stringBuffer.toString();
                 }
-
             } catch (InterruptedException e) {
                 e.printStackTrace();
-                log.error("######################### dt_relation 数据迁移失败"+e.getMessage());
+                log.error("######################### dt_relation 数据迁移sql失败"+e.getMessage());
             } catch (ExecutionException e) {
                 e.printStackTrace();
-                log.error("######################### dt_relation 数据迁移失败"+e.getMessage());
+                log.error("######################### dt_relation 数据迁移sql失败"+e.getMessage());
             }
         }
-        long end = System.currentTimeMillis();
-        log.info("######################### dt_relation 同步结束 "+(end-start)+"#########################");
-        return AdmResponse.success();
+
+        if(sqls_temp.length() == 0){
+            return "";
+        }
+        sqls.append(MigrationConstant.DT_RELATION_SQL_PRE);
+        sqls.append(sqls_temp);
+        String sql = sqls.toString();
+        sql = sql.substring(0, sql.lastIndexOf(","));
+        sql +=";";
+        return sql;
+    }
+
+    private void appendValuesBefore(ExecutorService service, List<ObjectRelation> admData, List<Future<StringBuffer>> futureList){
+        if(CollUtil.isEmpty(admData)){
+            return;
+        }
+        StringBuffer sqls_temp = new StringBuffer();
+        Future<StringBuffer> future = service.submit(new Callable<StringBuffer>(){
+            @Override
+            public StringBuffer call() throws Exception {
+                return appendValues(admData, sqls_temp);
+            }
+        });
+        futureList.add(future);
     }
 
+    /**
+     * 拼接sql字符串
+     * @param admData
+     * @param sqls
+     * @return
+     */
+    private StringBuffer appendValues(List<ObjectRelation> admData, StringBuffer sqls){
+        admData.forEach(relation -> {
+            sqls.append("(");
+            sqls.append("'").append(relation.getId()).append("',");
+            sqls.append("'").append(relation.getGroupCode()).append("',");
+            sqls.append("'").append(relation.getProjectId()).append("',");
+            if (relation.getGraphId() == null) {
+                sqls.append(relation.getGraphId()).append(",");
+            } else {
+                sqls.append("'").append(relation.getGraphId()).append("',");
+            }
+            sqls.append("'").append(relation.getGraphCode()).append("',");
+            sqls.append("'").append(relation.getRelCode()).append("',");
+
+            if (relation.getRelValue() == null) {
+                sqls.append(relation.getRelValue()).append(",");
+            } else {
+                sqls.append("'").append(relation.getRelValue()).append("',");
+            }
+
+            if (relation.getObjFrom() == null) {
+                sqls.append(relation.getObjFrom()).append(",");
+            } else {
+                sqls.append("'").append(relation.getObjFrom()).append("',");
+            }
+
+            if (relation.getObjTo() == null) {
+                sqls.append(relation.getObjTo()).append(",");
+            } else {
+                sqls.append("'").append(relation.getObjTo()).append("',");
+            }
+
+            if (relation.getCreateApp() == null) {
+                sqls.append(relation.getCreateApp()).append(",");
+            } else {
+                sqls.append("'").append(relation.getCreateApp()).append("',");
+            }
+            if (relation.getUpdateApp() == null) {
+                sqls.append(relation.getUpdateApp()).append(",");
+            } else {
+                sqls.append("'").append(relation.getUpdateApp()).append("',");
+            }
+            sqls.append("'").append(relation.getCreator()).append("',");
+            sqls.append("'").append(relation.getCreationTime()).append("',");
+            sqls.append("'").append(relation.getModifier()).append("',");
+            sqls.append("'").append(relation.getModifiedTime()).append("',");
+            sqls.append(relation.getValid());
+            sqls.append(")\n ,");
+        });
+        return sqls;
+    }
     private ExecutorService getExcecutor(){
         ExecutorService service = new ThreadPoolExecutor(10, 15, 0L, TimeUnit.MILLISECONDS,
                 new LinkedBlockingQueue(), new ThreadFactory() {
@@ -188,9 +279,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
             return dataMigrationExcels;
         }
 
-        //String insertUrl = requestUrl(context, migrationInfo, MigrationType.INSERT.getCode());
         if(CollUtil.isEmpty(projectRelations)){
-            //DataMigrationResponse dataMigrationResponse = insertBatch(admRelations, ObjectRelation.class, insertUrl);
             dataMigrationExcels.addAll(processDataForExcel(admRelations, MigrationType.CREATE.getCode()));
             return dataMigrationExcels;
         }
@@ -203,7 +292,6 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         Map<String,Object> doSubtractFromInsert = doSubtractAdd(admDefineMap, projectDefineMap);
         if(!CollUtil.isEmpty(doSubtractFromInsert)){
             List<ObjectRelation> insertData = toList(doSubtractFromInsert, admRelations);
-            //DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectRelation.class, insertUrl);
             dataMigrationExcels.addAll(processDataForExcel(insertData, MigrationType.CREATE.getCode()));
         }
 
@@ -212,8 +300,6 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         if(!CollUtil.isEmpty(doSubtractFromDelete)){
             List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
             List<ObjectRelation> deleteData = toListByIds(deleteIds, projectRelations);
-//            String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
-//            DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectRelation.class, delUrl);
             dataMigrationExcels.addAll(processDataForExcel(deleteData, MigrationType.DELETE.getCode()));
         }
 
@@ -225,17 +311,16 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
             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);
                 dataMigrationExcels.addAll(processDataForExcel(updateData, MigrationType.UPDATE.getCode()));
             }
         }
+        processExcelDatas(context.getGroupCode(),context.getProjectId(), dataMigrationExcels);
         return dataMigrationExcels;
     }
 
-    private List<SyncData> startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, String code){
-        QueryCriteria queryCriteria = getQueryCriteria(code);
+    private void startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, String code){
         List<SyncData> syncDataList = new ArrayList<>();
+        QueryCriteria queryCriteria = getQueryCriteria(code);
         List<ObjectRelation> admRelations = getAdmData(context, queryCriteria);
 
         String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
@@ -248,6 +333,8 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         if(CollUtil.isEmpty(projectRelations)){
             DataMigrationResponse dataMigrationResponse = insertBatch(admRelations, ObjectRelation.class, insertUrl);
             syncDataList = processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode());
+            super.addSynLog(context, syncDataList);
+            return;
         }
         List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectRelations, null, null);
         Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectRelation.class);
@@ -259,6 +346,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         if(!CollUtil.isEmpty(doSubtractFromInsert)){
             List<ObjectRelation> insertData = toList(doSubtractFromInsert, admRelations);
             DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectRelation.class, insertUrl);
+            //处理并保存日志
             syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode()));
         }
 
@@ -267,29 +355,27 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         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, projectRelations);
-            dataMigrationResponse.setData(delObjs);
+            DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, delUrl);
+            //处理并保存日志
             syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.DELETE.getCode()));
         }
 
         //交集更新
         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.getCode()));
             }
         }
-        return super.addSynLog(context, syncDataList);
+        //处理并保存日志
+        super.addSynLog(context,syncDataList);
     }
 
 
@@ -305,6 +391,11 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         return relations;
     }
 
+    public CommonResult<List<ObjectRelation>> getAdmDataPage(InstanceUrlParam context, QueryCriteria queryCriteria) {
+        CommonResult<List<ObjectRelation>> relations = DigitalRelationFacade.queryPrototype(context.getGroupCode(),context.getProjectId(),context.getUserId(),context.getUserId(),queryCriteria);
+        return relations;
+    }
+
     /**
      * 根据map转为需要处理的对象集合
      * 使用 MigrationConstant.spliter 作为拼接符
@@ -377,10 +468,12 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
             ObjectRelation objectRelation = (ObjectRelation) obj;
             DataMigrationExcel excel = new DataMigrationExcel();
             excel.setId(objectRelation.getId());
-            excel.setCode(String.join(StrUtil.DASHED, objectRelation.getRelCode(), objectRelation.getGraphCode()));
+            excel.setCode(String.join(StrUtil.DASHED, objectRelation.getGraphCode(), objectRelation.getRelCode()));
             excel.setObjFrom(objectRelation.getObjFrom());
             excel.setObjTo(objectRelation.getObjTo());
             excel.setType(type);
+            excel.setCreateTime(objectRelation.getCreationTime() == null ? "" : objectRelation.getCreationTime().toString());
+            excel.setUpdateTime(objectRelation.getModifiedTime() == null ? "" :objectRelation.getModifiedTime().toString());
             dataMigrationExcels.add(excel);
         }
         return dataMigrationExcels;
@@ -406,7 +499,7 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
                 syncData.setTableName(MigrationTable.DTRELATION.getCode());
                 syncData.setType(type);//操作
                 syncData.setTargetId(relation.getId());
-                syncData.setName(String.join(StrUtil.DASHED, relation.getRelCode(), relation.getGraphCode()));
+                syncData.setCode(String.join(StrUtil.DASHED, relation.getGraphCode(), relation.getRelCode()));
                 syncData.setFromId(relation.getObjFrom());
                 syncData.setToId(relation.getObjTo());
                 syncDataList.add(syncData);
@@ -417,4 +510,69 @@ public class ObjectRelationMigration extends MigrationAbstractServiceImpl<Object
         }
         return syncDataList;
     }
+
+
+    /***
+     * Description: 查询所有关系类型
+
+     * @return : java.util.Map<java.lang.String,com.persagy.dmp.define.entity.RelationDefine>
+     * @author : lijie
+     * @date :2021/10/15 11:22
+     * Update By lijie 2021/10/15 11:22
+     */
+    private Map<String, RelationDefine> queryAllRelationDefineMap(String groupCode, String projectId) {
+        List<RelationDefine> relationDefines = DigitalRelationDefineFacade.query(groupCode, projectId,
+                AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, new QueryCriteria());
+        if (CollUtil.isEmpty(relationDefines)){
+            return new HashMap<>();
+        }
+        return relationDefines.stream()
+                .collect(Collectors.toMap(relationDefine ->
+                                relationDefine.getGraphCode() + StrUtil.DASHED + relationDefine.getCode(),
+                        relationDefine -> relationDefine, (k1, k2) -> k1));
+    }
+
+    /**
+     * 将excel中的relcode graphCode 翻译成name组合
+     * @param groupCode
+     * @param projectId
+     * @param excelList
+     */
+    private void processExcelDatas(String groupCode, String projectId, List<DataMigrationExcel> excelList){
+        // 1.获取所有的一级,二级图类型定义
+        QueryCriteria parentCriteria = new QueryCriteria();
+        List<GraphDefine> graphDefines = DigitalGraphDefineFacade.query(groupCode, projectId,
+                AdmCommonConstant.APP_ID, AdmCommonConstant.USER_ID, parentCriteria);
+        if (!CollUtil.isEmpty(graphDefines)){
+            // 2.查询所有的边类型定义
+            Map<String, RelationDefine> relationDefineMap = queryAllRelationDefineMap(groupCode,projectId);
+            Map<String, GraphDefine> graphDefineMap = CollUtil.fieldValueMap(graphDefines, "code");
+            for(DataMigrationExcel excel : excelList){
+                String code = excel.getCode();
+                if(StrUtil.isEmpty(code) || !code.contains(StrUtil.DASHED)){
+                    continue;
+                }
+                //excel.setCode(String.join(StrUtil.DASHED, objectRelation.getGraphCode(), objectRelation.getRelCode()));
+                String tempName = null;
+                String graphName = graphDefineMap.get(code.split(StrUtil.DASHED)[0]).getName();
+                String relName = relationDefineMap.get(code).getName();
+                if(StrUtil.isAllNotEmpty(graphName, relName)){
+                    tempName = String.join(StrUtil.DASHED, graphName, relName);
+                }
+                excel.setName(tempName==null?"":tempName);
+            }
+
+        }
+    }
+
+    //删除关系,手动拼接删除条件
+    public DataMigrationResponse deleteBatch(List<String> ids, String url) {
+        QueryCriteria criteria = new QueryCriteria();
+        ObjectNode node = JsonNodeFactory.instance.objectNode();
+        //删除关系 然后重建
+        ArrayNode arrayNode = node.putArray("id");
+        ids.forEach(id -> arrayNode.add(id));
+        criteria.setCriteria(node);
+        return processProjectData(null, criteria, ObjectRelation.class, url);
+    }
 }