123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- 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.digital.client.DigitalObjectFacade;
- import com.persagy.dmp.digital.entity.ObjectDigital;
- import com.persagy.dmp.rwd.migrate.entity.SyncData;
- import com.persagy.proxy.adm.request.AdmResponse;
- import com.persagy.proxy.common.entity.InstanceUrlParam;
- import com.persagy.proxy.migration.constant.MigrationConstant;
- import com.persagy.proxy.migration.constant.MigrationObjType;
- import com.persagy.proxy.migration.constant.MigrationTable;
- import com.persagy.proxy.migration.constant.MigrationType;
- import com.persagy.proxy.migration.model.DataMigrationExcel;
- import com.persagy.proxy.migration.model.DataMigrationResponse;
- 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: ObjectMigration
- * @projectName adm-middleware
- * @description: 迁移adm交付的数据到现场,覆盖现场数据,提供增加、删除、修改 记录放入excel; dt_object 数据迁移 adm -> target project
- * @date 2021/12/8 19:53
- */
- @Slf4j
- 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;
- }
- /**
- * 数据迁移前,数据对比信息 汇总
- *
- * @param context
- * @param migrationInfo
- * @return List<DataMigrationExcel>
- */
- @Override
- public List<DataMigrationExcel> migrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo) {
- log.info("######################### dt_object 数据迁移内容获取开始 #########################");
- long start = System.currentTimeMillis();
- List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
- for(MigrationObjType objType : MigrationObjType.values()){
- log.info("######################### dt_object "+objType.getCode()+"数据迁移内容获取开始 #########################");
- QueryCriteria queryCriteria = getQueryCriteria(objType.getCode());
- dataMigrationExcels.addAll(startMigrateForExcel(context,migrationInfo,queryCriteria));
- log.info("######################### dt_object "+objType.getCode()+"数据迁移内容获取结束 #########################");
- }
- long end = System.currentTimeMillis();
- log.info("######################### dt_object 数数据迁移内容获取已结束 时间:"+(end-start)+" #########################");
- return dataMigrationExcels;
- }
- /**
- * 迁移数据,汇总记录日志
- * @param context
- * @param migrationInfo
- * @return
- */
- @Override
- public AdmResponse migrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo) {
- log.info("######################### dt_object 同步开始 #########################");
- long start = System.currentTimeMillis();
- for(MigrationObjType objType : MigrationObjType.values()){
- log.info("######################### dt_object "+objType.getCode()+"同步开始 #########################");
- QueryCriteria queryCriteria = getQueryCriteria(objType.getCode());
- List<SyncData> syncDataList = startMigrateForLog(context,migrationInfo,queryCriteria);
- log.info("######################### dt_object "+objType.getCode()+"同步结束 共计:"+syncDataList.size()+"条 #########################");
- }
- long end = System.currentTimeMillis();
- log.info("######################### dt_object 数据迁移已结束 时间:"+(end-start)+" #########################");
- return AdmResponse.success();
- }
- private QueryCriteria getQueryCriteria(String typeCode){
- QueryCriteria queryCriteria = new QueryCriteria();
- queryCriteria.setSize(-1L);
- ObjectNode criteria = JsonNodeFactory.instance.objectNode();
- criteria.put("valid", 1);
- criteria.put("objType", typeCode);
- queryCriteria.setCriteria(criteria);
- return queryCriteria;
- }
- /**
- * 迁移数据,记录日志
- *
- */
- private List<SyncData> startMigrateForLog(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria) {
- List<SyncData> syncDataList = new ArrayList<>();
- List<ObjectNode> admData = getAdmData(context,queryCriteria);
- String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
- List<ObjectDigital> projectData = getProjectData(queryCriteria, ObjectDigital.class, queryUrl);
- List<ObjectNode> objectNodeList = JsonNodeUtils.toListNode(projectData, null, null);
- if(CollUtil.isEmpty(admData)){
- log.error(" ######################### dt_object adm已交付:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
- }
- String insertUrl = requestUrl(context, migrationInfo, MigrationType.CREATE.getCode());
- if(CollUtil.isEmpty(objectNodeList)){
- DataMigrationResponse dataMigrationResponse = insertBatch(admData, ObjectDigital.class, insertUrl);
- syncDataList = processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode());
- }
- Map<String,Object> projectMap = toEntityMap(objectNodeList, ObjectDigital.class);
- Map<String,Object> admMap = toEntityMap(admData, ObjectDigital.class);
- //差集 新增
- Map<String,Object> doSubtractFromInsert = doSubtractAdd(admMap, projectMap);
- if(!CollUtil.isEmpty(doSubtractFromInsert)){
- List<ObjectNode> insertData = toList(doSubtractFromInsert, admData);
- DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectDigital.class, insertUrl);
- syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.CREATE.getCode()));
- }
- //差集 删除
- Map<String,Object> doSubtractFromDelete = doSubtractDel(admMap, projectMap);
- if(!CollUtil.isEmpty(doSubtractFromDelete)){
- List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
- String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
- //处理删除的数据
- DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectDigital.class, delUrl);
- List<String> successIds = (List<String>) dataMigrationResponse.getData();
- List<ObjectNode> delObjs = toListByIds(successIds, admData);
- dataMigrationResponse.setData(delObjs);
- syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.DELETE.getCode()));
- }
- //交集更新
- Map<String,Object> intersectionUpdateFrom = doIntersectionGetFrom(admMap, projectMap);
- Map<String,Object> intersectionUpdateTo = doIntersectionGetTo(admMap, projectMap);
- if(!CollUtil.isEmpty(intersectionUpdateFrom) && !CollUtil.isEmpty(intersectionUpdateTo)){
- Map<String, Object> compareData = compareData(intersectionUpdateFrom, intersectionUpdateTo);
- if(CollUtil.isNotEmpty(compareData) && compareData.size() > 0){
- List<ObjectNode> updateData = toList(compareData, admData);
- String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
- DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectDigital.class, updateUrl);
- syncDataList.addAll(processDataForLog(dataMigrationResponse, MigrationType.UPDATE.getCode()));
- }
- }
- return super.addSynLog(context, syncDataList);
- }
- /**
- * 迁移数据,记录excel数据
- *
- */
- private List<DataMigrationExcel> startMigrateForExcel(InstanceUrlParam context, MigrationInfo migrationInfo, QueryCriteria queryCriteria) {
- List<DataMigrationExcel> dataMigrationExcels = new ArrayList<>();
- List<ObjectNode> admData = getAdmData(context,queryCriteria);
- String queryUrl = requestUrl(context, migrationInfo, MigrationType.QUERY.getCode());
- List<ObjectDigital> projectData = getProjectData(queryCriteria, ObjectDigital.class, queryUrl);
- List<ObjectNode> objectNodeList = JsonNodeUtils.toListNode(projectData, null, null);
- if(CollUtil.isEmpty(admData)){
- log.error(" ######################### dt_object adm已交付:"+ ResponseCode.C0320.getDesc() +" 同步结束 #########################");
- 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;
- }
- Map<String,Object> projectMap = toEntityMap(objectNodeList, ObjectDigital.class);
- Map<String,Object> admMap = toEntityMap(admData, ObjectDigital.class);
- //差集 新增
- Map<String,Object> doSubtractFromInsert = doSubtractAdd(admMap, projectMap);
- if(!CollUtil.isEmpty(doSubtractFromInsert)){
- List<ObjectNode> insertData = toList(doSubtractFromInsert, admData);
- //DataMigrationResponse dataMigrationResponse = insertBatch(insertData, ObjectDigital.class, insertUrl);
- dataMigrationExcels.addAll(processDataForExcel(insertData, MigrationType.CREATE.getCode()));
- }
- //差集 删除
- Map<String,Object> doSubtractFromDelete = doSubtractDel(admMap, projectMap);
- if(!CollUtil.isEmpty(doSubtractFromDelete)){
- List<String> deleteIds = doSubtractFromDelete.entrySet().stream().map(en -> en.getKey()).collect(Collectors.toList());
- List<ObjectNode> deleteData = toListByIds(deleteIds, admData);
- //String delUrl = requestUrl(context, migrationInfo, MigrationType.DELETE.getCode());
- //DataMigrationResponse dataMigrationResponse = deleteBatch(deleteIds, ObjectDigital.class, delUrl);
- dataMigrationExcels.addAll(processDataForExcel(deleteData, MigrationType.DELETE.getCode()));
- }
- //交集更新
- Map<String,Object> intersectionUpdateFrom = doIntersectionGetFrom(admMap, projectMap);
- Map<String,Object> intersectionUpdateTo = doIntersectionGetTo(admMap, projectMap);
- if(!CollUtil.isEmpty(intersectionUpdateFrom) && !CollUtil.isEmpty(intersectionUpdateTo)){
- Map<String, Object> compareData = compareData(intersectionUpdateFrom, intersectionUpdateTo);
- if(CollUtil.isNotEmpty(compareData) && compareData.size() > 0){
- List<ObjectNode> updateData = toList(compareData, admData);
- //String updateUrl = requestUrl(context, migrationInfo, MigrationType.UPDATE.getCode());
- //DataMigrationResponse dataMigrationResponse = updateBatch(updateData, ObjectDigital.class, updateUrl);
- dataMigrationExcels.addAll(processDataForExcel(updateData, MigrationType.UPDATE.getCode()));
- }
- }
- return dataMigrationExcels;
- }
- /**
- * 获取adm交付的数据,默认获取有效数据
- *
- * @param context
- * @return
- */
- @Override
- public List<ObjectNode> getAdmData(InstanceUrlParam context, QueryCriteria queryCriteria) {
- List<ObjectNode> digitalList = DigitalObjectFacade.query(context.getGroupCode(),context.getProjectId(),context.getUserId(),context.getUserId(),queryCriteria);
- if(CollUtil.isEmpty(digitalList)){
- return Collections.emptyList();
- }
- return digitalList;
- }
- /**
- * 根据map转为需要处理的对象集合
- * @param fromMap
- * @param fromList
- * @return
- */
- public List<ObjectNode> toList(Map<String, Object> fromMap, List<ObjectNode> fromList) {
- if(CollUtil.isEmpty(fromMap) || CollUtil.isEmpty(fromList)){
- return Collections.emptyList();
- }
- return toListByIds(fromMap.keySet(), fromList);
- }
- /**
- * 根据对象ids转为需要处理的对象集合
- * @param ids
- * @param fromList
- * @return
- */
- public List<ObjectNode> toListByIds(Collection<String> ids, List<ObjectNode> fromList) {
- if(CollUtil.isEmpty(ids) || CollUtil.isEmpty(fromList)){
- return Collections.emptyList();
- }
- List<ObjectNode> results = new ArrayList<>(ids.size());
- Map<String, ObjectNode> objectDigitalMap = new HashMap<>(fromList.size());
- for(ObjectNode node : fromList){
- if(!node.get("id").isTextual()){
- continue;
- }
- objectDigitalMap.put(node.get("id").asText(), node);
- }
- for(String key : ids){
- results.add(objectDigitalMap.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_OBJECT);
- }else if(type.equals(MigrationType.CREATE.getCode())){
- url.append(MigrationConstant.DT_OBJECT_INSERT);
- }else if(type.equals(MigrationType.UPDATE.getCode())){
- url.append(MigrationConstant.DT_OBJECT_UPDATE);
- }else{
- url.append(MigrationConstant.DT_OBJECT_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){
- ObjectDigital digital = JsonNodeUtils.toEntity((ObjectNode) obj, ObjectDigital.class, null);
- DataMigrationExcel excel = new DataMigrationExcel();
- excel.setId(digital.getId());
- excel.setName(String.join(StrUtil.DASHED, digital.getLocalId(), digital.getLocalName()));
- 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()){
- ObjectDigital digital = (ObjectDigital) obj;
- SyncData syncData = new SyncData();
- syncData.setTableName(MigrationTable.DTOBJECT.getCode());
- syncData.setName(digital.getName());
- syncData.setObjectType(digital.getObjType());
- syncData.setType(type);//操作
- syncData.setClassCode(digital.getClassCode());
- syncData.setTargetId(digital.getId());
- syncData.setLocalId(digital.getLocalId());
- syncData.setLocalName(digital.getLocalName());
- syncDataList.add(syncData);
- }
- }
- if(CollUtil.isNotEmpty(dataMigrationResponse.getErrorMsg())){
- syncDataList.addAll(addErrorInfoForLog(dataMigrationResponse.getErrorMsg(), MigrationTable.DTOBJECT.getCode()));
- }
- return syncDataList;
- }
- }
|