123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- package com.persagy.proxy.migration.handler;
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.util.StrUtil;
- 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.digital.client.DigitalRelationFacade;
- import com.persagy.dmp.digital.entity.ObjectRelation;
- import com.persagy.dmp.rwd.migrate.entity.SyncData;
- import com.persagy.proxy.adm.request.AdmResponse;
- import com.persagy.proxy.common.entity.InstanceUrlParam;
- import com.persagy.proxy.migration.constant.MiGrationRelCode;
- import com.persagy.proxy.migration.constant.MigrationConstant;
- import com.persagy.proxy.migration.constant.MigrationTable;
- import com.persagy.proxy.migration.constant.MigrationType;
- import com.persagy.proxy.migration.model.DataMigrationExcel;
- import com.persagy.proxy.migration.model.DataMigrationResponse;
- import com.persagy.proxy.migration.model.MigrationInfo;
- import com.persagy.proxy.migration.service.Impl.MigrationAbstractServiceImpl;
- import lombok.extern.slf4j.Slf4j;
- import java.util.*;
- import java.util.stream.Collectors;
- /**
- * @author lvxianyun
- * @title: RelationMigration
- * @projectName adm-middleware
- * @description: 迁移adm交付的数据到现场,覆盖现场数据,提供增加、删除、修改 记录放入excel; dt_relation 数据迁移 adm -> target project
- * @date 2021/12/8 19:51
- */
- @Slf4j
- 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;
- }
- /**
- * 数据迁移
- *
- * @param context
- * @param migrationInfo
- * @return
- */
- @Override
- public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
- log.info("######################### dt_relation 数据迁移内容获取开始 #########################");
- long start = System.currentTimeMillis();
- List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
- 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;
- }
- @Override
- public AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo) {
- log.info("######################### dt_relation 同步开始 #########################");
- long start = System.currentTimeMillis();
- for (MiGrationRelCode miGrationRelCode: MiGrationRelCode.values()){
- log.info("######################### dt_relation "+miGrationRelCode.getCode()+"同步开始 #########################");
- QueryCriteria queryCriteria = getQueryCriteria(miGrationRelCode.getCode());
- List<SyncData> syncDataList = startMigrateForLog(context, migrationInfo, queryCriteria);
- log.info("######################### dt_relation "+miGrationRelCode.getCode()+"同步结束 共计:"+syncDataList.size()+"条 #########################");
- }
- long end = System.currentTimeMillis();
- log.info("######################### dt_relation 同步结束 "+(end-start)+"#########################");
- return AdmResponse.success();
- }
- private QueryCriteria getQueryCriteria(String typeCode){
- QueryCriteria queryCriteria = new QueryCriteria();
- ObjectNode criteria = JsonNodeFactory.instance.objectNode();
- criteria.put("valid", 1);
- criteria.put("relCode", typeCode);
- return queryCriteria;
- }
- private List<DataMigrationExcel> startMigrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria){
- List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
- List<ObjectRelation> admRelations = getAdmData(context, queryCriteria);
- String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
- List<ObjectRelation> projectRelations = getProjectData(queryCriteria, ObjectRelation.class, queryUrl);
- if(CollUtil.isEmpty(admRelations)){
- log.error(" ######################### dt_relation adm已交付:"+ ResponseCode.C0320.getDesc() +" 数据迁移内容获取结束 #########################");
- 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;
- }
- List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectRelations, null, null);
- Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectRelation.class);
- List<ObjectNode> objectNodeListAdm = JsonNodeUtils.toListNode(admRelations, null, null);
- Map<String,Object> admDefineMap = toEntityMap(objectNodeListAdm, ObjectRelation.class);
- //差集 新增
- Map<String,Object> doSubtractFromInsert = doSubtractAdd(admDefineMap, projectDefineMap);
- if(!CollUtil.isEmpty(doSubtractFromInsert)){
- List<ObjectRelation> insertData = toList(doSubtractFromInsert, admRelations);
- //DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectRelation.class, insertUrl);
- dataMigrationExcels.addAll(processDataForExcel(insertData, MigrationType.CREATE.getCode()));
- }
- //差集 删除
- Map<String,Object> doSubtractFromDelete = doSubtractDel(admDefineMap, projectDefineMap);
- 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()));
- }
- //交集更新
- 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);
- dataMigrationExcels.addAll(processDataForExcel(updateData, MigrationType.UPDATE.getCode()));
- }
- }
- return dataMigrationExcels;
- }
- private List<SyncData> startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria){
- List<SyncData> syncDataList = new ArrayList<>();
- List<ObjectRelation> admRelations = getAdmData(context, queryCriteria);
- String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
- List<ObjectRelation> projectRelations = getProjectData(queryCriteria, ObjectRelation.class, queryUrl);
- if(CollUtil.isEmpty(admRelations)){
- log.error(" ######################### dt_relation adm已交付:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
- }
- String insertUrl = requestUrl(context, migrationInfo, MigrationType.CREATE.getCode());
- if(CollUtil.isEmpty(projectRelations)){
- DataMigrationResponse dataMigrationResponse = insertBatch(admRelations, ObjectRelation.class, insertUrl);
- syncDataList = processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode());
- }
- List<ObjectNode> objectNodeListPro = JsonNodeUtils.toListNode(projectRelations, null, null);
- Map<String,Object> projectDefineMap = toEntityMap(objectNodeListPro, ObjectRelation.class);
- List<ObjectNode> objectNodeListAdm = JsonNodeUtils.toListNode(admRelations, null, null);
- Map<String,Object> admDefineMap = toEntityMap(objectNodeListAdm, ObjectRelation.class);
- //差集 新增
- Map<String,Object> doSubtractFromInsert = doSubtractAdd(admDefineMap, projectDefineMap);
- if(!CollUtil.isEmpty(doSubtractFromInsert)){
- List<ObjectRelation> insertData = toList(doSubtractFromInsert, admRelations);
- DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectRelation.class, insertUrl);
- syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode()));
- }
- //差集 删除
- Map<String,Object> doSubtractFromDelete = doSubtractDel(admDefineMap, projectDefineMap);
- if(!CollUtil.isEmpty(doSubtractFromDelete)){
- List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
- String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
- //处理删除的数据
- DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectRelation.class, delUrl);
- List<String> successIds = (List<String>) dataMigrationResponse.getData();
- List<ObjectRelation> delObjs = toListByIds(successIds, projectRelations);
- dataMigrationResponse.setData(delObjs);
- 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);
- }
- /**
- * 获取adm交付的数据,默认获取有效数据
- *
- * @param context
- * @return
- */
- @Override
- public List<ObjectRelation> getAdmData(InstanceUrlParam context, QueryCriteria queryCriteria) {
- List<ObjectRelation> relations = DigitalRelationFacade.query(context.getGroupCode(),context.getProjectId(),context.getUserId(),context.getUserId(),queryCriteria);
- return relations;
- }
- /**
- * 根据map转为需要处理的对象集合
- * 使用 MigrationConstant.spliter 作为拼接符
- * @param fromMap
- * @param fromList
- * @return
- */
- public List<ObjectRelation> toList(Map<String, Object> fromMap, List<ObjectRelation> fromList) {
- if(CollUtil.isEmpty(fromMap) || CollUtil.isEmpty(fromList)){
- return Collections.emptyList();
- }
- return toListByIds(fromMap.keySet(), fromList);
- }
- public List<ObjectRelation> toListByIds(Collection<String> ids, List<ObjectRelation> fromList) {
- if(CollUtil.isEmpty(ids) || CollUtil.isEmpty(fromList)){
- return Collections.emptyList();
- }
- List<ObjectRelation> results = new ArrayList<>(ids.size());
- Map<String, ObjectRelation> objectRelationMap = CollUtil.fieldValueMap(fromList, BaseEntity.PROP_ID);
- for(String key : ids){
- results.add(objectRelationMap.get(key));
- }
- return results;
- }
- /**
- * 拼接访问链接
- *
- * @param context
- * @param migrationInfo
- * @param type
- * @return
- */
- @Override
- public String requestUrl(InstanceUrlParam context, MigrationInfo migrationInfo, String type) {
- if(StrUtil.isBlank(migrationInfo.getTargetUrl())){
- return null;
- }
- StringBuilder url = new StringBuilder(migrationInfo.getTargetUrl());
- if(type.equals(MigrationType.QUERY.getCode())) {
- url.append(MigrationConstant.DT_RELATION);
- }else if(type.equals(MigrationType.CREATE.getCode())){
- url.append(MigrationConstant.DT_RELATION_INSERT);
- }else if(type.equals(MigrationType.UPDATE.getCode())){
- url.append(MigrationConstant.DT_RELATION_UPDATE);
- }else{
- url.append(MigrationConstant.DT_RELATION_DELETE);
- }
- return commonUrl(context, url.toString(), migrationInfo);
- }
- /**
- * 将目标集合处理成excel格式的集合 使用与insert/delete
- *
- * @param list
- * @return
- */
- @Override
- public List<DataMigrationExcel> processDataForExcel(Collection list, String type) {
- if(CollUtil.isEmpty(list)){
- return Collections.emptyList();
- }
- List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
- for(Object obj : list){
- if(obj == null){
- continue;
- }
- ObjectRelation objectRelation = (ObjectRelation) obj;
- DataMigrationExcel excel = new DataMigrationExcel();
- excel.setId(objectRelation.getId());
- excel.setName(String.join(StrUtil.DASHED, objectRelation.getRelCode(), objectRelation.getGraphCode()));
- excel.setObjFrom(objectRelation.getObjFrom());
- excel.setTargetProject(objectRelation.getObjTo());
- excel.setType(type);
- dataMigrationExcels.add(excel);
- }
- return dataMigrationExcels;
- }
- /**
- * 将目标集合处理成SyncData(日志)格式的集合 入库
- *
- * @param dataMigrationResponse
- * @param type insert/delete
- * @return
- */
- @Override
- public List<SyncData> processDataForLog(DataMigrationResponse dataMigrationResponse, String type) {
- if(CollUtil.isEmpty(dataMigrationResponse.getData()) && CollUtil.isEmpty(dataMigrationResponse.getErrorMsg())){
- return Collections.emptyList();
- }
- List<SyncData> syncDataList = new ArrayList<>();
- if(CollUtil.isNotEmpty(dataMigrationResponse.getData())){
- for(Object obj : dataMigrationResponse.getData()){
- ObjectRelation relation = (ObjectRelation) obj;
- SyncData syncData = new SyncData();
- syncData.setTableName(MigrationTable.DTRELATION.getCode());
- syncData.setType(type);//操作
- syncData.setTargetId(relation.getId());
- syncData.setName(String.join(StrUtil.DASHED, relation.getRelCode(), relation.getGraphCode()));
- syncData.setFromId(relation.getObjFrom());
- syncData.setToId(relation.getObjTo());
- syncDataList.add(syncData);
- }
- }
- if(CollUtil.isNotEmpty(dataMigrationResponse.getErrorMsg())){
- syncDataList.addAll(addErrorInfoForLog(dataMigrationResponse.getErrorMsg(),MigrationTable.DTRELATION.getCode()));
- }
- return syncDataList;
- }
- }
|