فهرست منبع

fix 数据迁移 导出sql脚本,特殊字符处理,导致sql执行失败

lvxianyun 3 سال پیش
والد
کامیت
12f38bae1d

+ 50 - 13
adm-business/adm-middleware/src/main/java/com/persagy/proxy/migration/service/Impl/ObjectDigitalMigration.java

@@ -8,6 +8,7 @@ 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.response.CommonResult;
 import com.persagy.dmp.digital.client.DigitalObjectFacade;
 import com.persagy.dmp.digital.entity.ObjectDigital;
 import com.persagy.dmp.rwd.migrate.entity.SyncData;
@@ -97,33 +98,56 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
      */
     @Override
     public String migrateForSql(InstanceUrlParam context) {
-        StringBuffer sqls = new StringBuffer(" \n -- 数据迁移  dt_object ------ \n");
         //获取已经采集的数据
-        String sqls_temp = "";
+        String sqls_temp = "\n -- 数据迁移  dt_object ------ \n  ";
         List<String> objTypes = getObjTypes(context);
+        //List<String> objTypes = Arrays.asList("equipment");
         for(String objType : objTypes){
             QueryCriteria queryCriteria = getQueryCriteria(objType);
-            List<ObjectNode> admData = getAdmData(context,queryCriteria);
+            queryCriteria.setSize(1000L);
+            CommonResult<List<ObjectNode>> result = getAdmDataPage(context,queryCriteria);
+            if(result == null){
+                continue;
+            }
+            List<ObjectNode> admData = result.getData();
             if(CollUtil.isEmpty(admData)){
                 continue;
             }
-            sqls_temp += appendValues(admData).toString();
+            sqls_temp += processSqlStr(appendValues(admData).toString());
+
+            if(result.getCount() > 1000){
+                long page = result.getCount() / 1000 + 1;
+                for(long i = 2; i<=page; i++){
+                    queryCriteria.setPage(i);
+                    result = getAdmDataPage(context,queryCriteria);
+                    admData = result.getData();
+                    if(CollUtil.isEmpty(admData)){
+                        continue;
+                    }
+                    sqls_temp += processSqlStr(appendValues(admData).toString());
+                }
+            }
         }
         if(sqls_temp.length() == 0){
             return "";
         }
-        sqls.append(MigrationConstant.DT_OBJECT_SQL_PRE);
-        sqls.append(sqls_temp);
-        String sql = sqls.toString();
+        return sqls_temp;
+    }
+
+    private String processSqlStr(String sql){
         sql = sql.substring(0, sql.lastIndexOf(","));
         sql += ";";
         sql = sql.replaceAll("\"","\\\\\"");
-        return sql;
+        sql = sql.replaceAll("\\\\r","\\\\\\\\\\r");
+        StringBuffer sqls = new StringBuffer("\r");
+        sqls.append(MigrationConstant.DT_OBJECT_SQL_PRE);
+        sqls.append(sql);
+        return  sqls.toString();
     }
-
     private StringBuffer appendValues(List<ObjectNode> admData){
-        StringBuffer sqls = new StringBuffer();
+        StringBuffer sqlsAll = new StringBuffer();
         admData.forEach(obj -> {
+            StringBuffer sqls = new StringBuffer();
             ObjectDigital objectDigital = JsonNodeUtils.toEntity(obj, ObjectDigital.class, "infos");
             sqls.append("(");
             sqls.append("'").append(objectDigital.getId()).append("',");
@@ -148,7 +172,11 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             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.getObjType().equals("space") && !objectDigital.getObjType().equals("ispace") && objectDigital.getInfos() != null && objectDigital.getInfos().size() > 0){
+                sqls.append("'").append(objectDigital.getInfos().toString().replaceAll("\\\\\\\\","\\\\\\\\\\\\\\\\")).append("',");
+            }else{
+                sqls.append("'").append(objectDigital.getInfos()).append("',");
+            }
             if (objectDigital.getVirtualCodes() == null) {
                 sqls.append(objectDigital.getVirtualCodes()).append(",");
             } else {
@@ -171,9 +199,10 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
             sqls.append("'").append(objectDigital.getModifier()).append("',");
             sqls.append("'").append(objectDigital.getModifiedTime()).append("',");
             sqls.append(objectDigital.getValid());
-            sqls.append(")\n ,");
+            String sql = sqls.toString().replaceAll("\\\\n","\\\\\\\\n");
+            sqlsAll.append(sql).append(")\n ,");
         });
-        return sqls;
+        return sqlsAll;
     }
     private QueryCriteria getQueryCriteria(String typeCode){
         QueryCriteria queryCriteria = new QueryCriteria();
@@ -336,6 +365,14 @@ public class ObjectDigitalMigration extends MigrationAbstractServiceImpl<ObjectD
         return digitalList;
     }
 
+    public CommonResult<List<ObjectNode>> getAdmDataPage(InstanceUrlParam context, QueryCriteria queryCriteria) {
+        CommonResult<List<ObjectNode>> digitalList = DigitalObjectFacade.queryPrototype(context.getGroupCode(),context.getProjectId(),context.getUserId(),context.getUserId(),queryCriteria);
+        if(CollUtil.isEmpty(digitalList.getData())){
+            return null;
+        }
+        return digitalList;
+    }
+
     /**
      * 根据map转为需要处理的对象集合
      * @param fromMap