Quellcode durchsuchen

Merge branch 'dev-table' into dev

# Conflicts:
#	blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
lvy vor 1 Monat
Ursprung
Commit
cb91ae0694

+ 122 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/util/DataStructureFormatUtils.java

@@ -0,0 +1,122 @@
+package org.springblade.manager.util;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * key:value$$key:value$$key:value
+ * 简单数据结构转换工具类
+ */
+public class DataStructureFormatUtils {
+
+    /**
+     * 将Map转换为自定义字符串格式
+     * @param map 输入的键值对映射
+     * @return 格式化后的字符串
+     */
+    public static String buildData(Map<String, String> map) {
+        if (map == null || map.isEmpty()) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<String, String> entry : map.entrySet()) {
+            // 转义特殊字符以避免解析错误
+            String key = escapeSpecialChars(entry.getKey());
+            String value = escapeSpecialChars(entry.getValue());
+            sb.append(key).append(":").append(value).append("$$");
+        }
+        // 移除最后的分隔符
+        if (sb.length() > 0) {
+            sb.setLength(sb.length() - 2);
+        }
+        return sb.toString();
+    }
+
+    public static String buildDataObject(Map<String, Object> map) {
+        if (map == null || map.isEmpty()) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<String, Object> entry : map.entrySet()) {
+            // 转义特殊字符以避免解析错误
+            String key = escapeSpecialChars(entry.getKey());
+            String value = escapeSpecialChars(entry.getValue() + "");
+            sb.append(key).append(":").append(value).append("$$");
+        }
+        // 移除最后的分隔符
+        if (sb.length() > 0) {
+            sb.setLength(sb.length() - 2);
+        }
+        return sb.toString();
+    }
+    
+    /**
+     * 将自定义字符串格式解析为Map
+     * @param dataStr 格式化字符串
+     * @return 键值对映射
+     */
+    public static Map<String, String> parseDataByKey(String dataStr) {
+        Map<String, String> map = new HashMap<>();
+        if (dataStr == null || dataStr.isEmpty()) {
+            return map;
+        }
+        String[] pairs = dataStr.split("\\$\\$");
+        if (pairs.length == 1 && !pairs[0].contains(":")) {
+            map.put("key_201", pairs[0]);
+            return map;
+        }
+        for (String pair : pairs) {
+            int index = pair.indexOf(':');
+            if (index > 0) {
+                String key = unescapeSpecialChars(pair.substring(0, index));
+                String value = unescapeSpecialChars(pair.substring(index + 1));
+                map.put(key, value);
+            }
+        }
+        return map;
+    }
+
+
+    /**
+     * 解析Map中 key_201 的自定义字符串格式,添加到Map中,并移除原有的key_201
+     * @param map 输入的键值对映射
+     * @return 键值对映射
+     */
+    public static void parseDataByKey(Map<String, Object> map) {
+        if (map == null || map.isEmpty() || !map.containsKey("key_201")) {
+            return ;
+        }
+        Object obj = map.get("key_201");
+        if (obj instanceof String) {
+            Map<String, String> map1 = parseDataByKey((String) obj);
+            map.remove("key_201");
+            map.putAll(map1);
+        }
+    }
+
+    public static void parseDataByKey(List<Map<String, Object>> map) {
+        if (map == null || map.isEmpty()) {
+            return ;
+        }
+        for (Map<String, Object> map1 : map) {
+            parseDataByKey(map1);
+        }
+    }
+    
+    /**
+     * 转义特殊字符
+     */
+    private static String escapeSpecialChars(String str) {
+        if (str == null) return null;
+        return str.replace("\\", "\\\\").replace(":", "\\:").replace("$$", "\\$\\$");
+    }
+    
+    /**
+     * 恢复转义的字符
+     */
+    private static String unescapeSpecialChars(String str) {
+        if (str == null) return null;
+        return str.replace("\\$\\$", "$$").replace("\\:", ":").replace("\\\\", "\\");
+    }
+}

+ 26 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -62,6 +62,7 @@ import org.springblade.manager.dto.RangeInfo;
 import org.springblade.manager.dto.RangeJson;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.*;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.manager.vo.NameRuleVo;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.manager.vo.WbsTreeContractVO8;
@@ -2727,6 +2728,30 @@ private String reviseCols(Map<String, String> p2, String cols, Long pkeyId, Stri
                 Map<String, Object> origin = listMaps.get(0);
                 List<String> target = Arrays.stream(cols.split(",")).collect(Collectors.toList());
                 List<String> colsList = target.stream().filter(k -> k.startsWith("key")).collect(Collectors.toList());
+                Object key201 = origin.get("key_201");
+                if (key201 instanceof String) {
+                    Map<String, String> map = DataStructureFormatUtils.parseDataByKey(key201.toString());
+                    origin.remove("key_201");
+                    Map<String, Object> map1 = new HashMap<>();
+                    for (String k : colsList) {
+                        if (p2.containsKey(k)) {
+                            Object value = reviseValue(p2, k, map.get(k), pkeyId);
+                            if (value != null) {
+                                if (value.toString().contains("_^_")) {
+                                    map1.put(k, value);
+                                } else {
+                                    map1.put(k, StringPool.NULL);
+                                }
+                            }
+                        }
+                    }
+                    if (!map1.isEmpty()) {
+                        int i = target.indexOf("key_201");
+                        if (i >= 0) {
+                            target.set(i, DataStructureFormatUtils.buildDataObject(map1));
+                        }
+                    }
+                }
                 for (String k : colsList) {
                     if (p2.containsKey(k)) {
 //                        Object value = reviseValue(p2, k, origin.get(k));
@@ -2741,6 +2766,7 @@ private String reviseCols(Map<String, String> p2, String cols, Long pkeyId, Stri
                         }
                     }
                 }
+
                 cols = String.join(",", target);
             }
         }

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -60,6 +60,7 @@ import org.springblade.manager.mapper.ExcelTabMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.manager.utils.*;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.*;
@@ -2869,6 +2870,7 @@ public class ExcelTabController extends BladeController {
                 List<Map<String, Object>> businessDataMap = this.jdbcTemplate.queryForList(querySql);
 
                 if (businessDataMap.size() > 0) {
+                    DataStructureFormatUtils.parseDataByKey(businessDataMap);
                     // 匹配关联
                     try {
                         if (tableNode2.getHtmlUrl() != null) {
@@ -3239,6 +3241,7 @@ public class ExcelTabController extends BladeController {
             List<Map<String, Object>> businessDataMap = this.jdbcTemplate.queryForList(querySql);
             Map<String, Object> reData=new HashMap<>();
             if (businessDataMap.size() > 0){
+                DataStructureFormatUtils.parseDataByKey(businessDataMap);
                 try {
                     if (tableNode2.getHtmlUrl() != null){
                         InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(tableNode2.getHtmlUrl());
@@ -3545,7 +3548,7 @@ public class ExcelTabController extends BladeController {
                         for (Map<String, Object> mysqlData : businessDataMapList) {
                             //数据结果
                             Map<String, Object> reData = new HashMap<>();
-
+                            DataStructureFormatUtils.parseDataByKey(mysqlData);
                             for (String key : mysqlData.keySet()) {
                                 String tabVal = mysqlData.get(key) + "";
                                 // 时间段处理

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FirstController.java

@@ -33,6 +33,7 @@ import org.springblade.manager.service.*;
 import org.springblade.manager.service.impl.ContractInfoServiceImpl;
 import org.springblade.manager.service.impl.TableInfoServiceImpl;
 import org.springblade.manager.service.impl.WbsTreePrivateServiceImpl;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.feign.IOSSClient;
@@ -555,6 +556,7 @@ public class FirstController extends BladeController {
                             List<Map<String, Object>> businessDataMapList = this.jdbcTemplate.queryForList("SELECT * FROM " + tableId.getTabEnName() + " WHERE group_id = " + json.getString("id"));
                             if (businessDataMapList.size() > 0) {
                                 for (Map<String, Object> mysqlData : businessDataMapList) {
+                                    DataStructureFormatUtils.parseDataByKey(mysqlData);
                                     for (String key : mysqlData.keySet()) {
                                         String tabVal = mysqlData.get(key) + "";
                                         // 时间段处理
@@ -719,6 +721,7 @@ public class FirstController extends BladeController {
                             List<Map<String, Object>> businessDataMapList = this.jdbcTemplate.queryForList("SELECT * FROM " + tableId.getTabEnName() + " WHERE group_id = " + json.getString("id"));
                             if (businessDataMapList.size() > 0) {
                                 for (Map<String, Object> mysqlData : businessDataMapList) {
+                                    DataStructureFormatUtils.parseDataByKey(mysqlData);
                                     for (String key : mysqlData.keySet()) {
                                         String tabVal = mysqlData.get(key) + "";
                                         // 时间段处理

+ 2 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -12,8 +12,6 @@ import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.nodes.Node;
 import org.jsoup.select.Elements;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.springblade.business.dto.ReSigningEntrustDto;
 import org.springblade.business.dto.TrialSelfInspectionRecordDTO;
 import org.springblade.business.entity.ContractLog;
@@ -22,6 +20,7 @@ import org.springblade.business.feign.ContractLogClient;
 import org.springblade.business.feign.EntrustInfoServiceClient;
 import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.api.R;
@@ -38,7 +37,6 @@ import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.utils.ExcelInfoUtils;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.utils.RandomNumberHolder;
-import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springblade.manager.vo.TrialSelfDataRecordVO1;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
@@ -583,6 +581,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
                 List<Map<String, Object>> businessDataMap = this.jdbcTemplate.queryForList(querySql);
 
                 if (businessDataMap.size() > 0) {
+                    DataStructureFormatUtils.parseDataByKey(businessDataMap);
                     // 匹配关联
                     try {
                         if (tableNode2.getHtmlUrl()!=null) {

+ 148 - 103
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -18,7 +18,6 @@ import com.spire.xls.ExcelPicture;
 import com.spire.xls.FileFormat;
 import com.spire.xls.Worksheet;
 import com.spire.xls.collections.PicturesCollection;
-import io.swagger.models.auth.In;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -45,6 +44,7 @@ import org.springblade.business.feign.TrialSelfInspectionRecordClient;
 import org.springblade.business.vo.SaveContractLogVO;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.vo.DataVO;
 import org.springblade.core.log.exception.ServiceException;
@@ -54,7 +54,6 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
-import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.DateUtil;
@@ -75,12 +74,10 @@ import org.springblade.manager.vo.*;
 import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.dao.DataAccessException;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowCallbackHandler;
 import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -92,7 +89,6 @@ import org.springframework.transaction.support.DefaultTransactionDefinition;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.nio.file.Files;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -738,19 +734,20 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             String tabName = tableNode.getInitTableName();
 
             //拼接SQL
-            StringBuilder sql = new StringBuilder("INSERT INTO " + tabName),
-                    keySql = new StringBuilder("id, group_id"),
-                    valSql = new StringBuilder("" + tableInfo.getBusinessId() + ", " + tableInfo.getPkeyId());
+//            StringBuilder sql = new StringBuilder("INSERT INTO " + tabName),
+//                    keySql = new StringBuilder("id, group_id"),
+//                    valSql = new StringBuilder("" + tableInfo.getBusinessId() + ", " + tableInfo.getPkeyId());
 
             //参数
             LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
-            updateFieldLength(tabName, dataMap2);
-            for (String key : dataMap2.keySet()) {
-                keySql.append(", ").append(key);
-                valSql.append(", '").append(dataMap2.get(key)).append("'");
-            }
-
-            sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
+            dataMap2.remove("p_key_id");
+            StringBuilder sql = buildMTableInsertSql(tabName, dataMap2, tableInfo.getBusinessId(), tableInfo.getPkeyId(), null);
+//            for (String key : dataMap2.keySet()) {
+//                keySql.append(", ").append(key);
+//                valSql.append(", '").append(dataMap2.get(key)).append("'");
+//            }
+//
+//            sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
 
             //新增数据
             try {
@@ -1116,18 +1113,17 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         for (TableInfo tableInfo : tableInfoList) {
                             //获取字段信息
                             LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
-                            updateFieldLength(table.getTabEnName(),dataMap2);
-                            //拼接SQL
-                            StringBuilder sql = new StringBuilder("INSERT INTO " + table.getTabEnName()),
-                                    keySql = new StringBuilder("id, group_id"),
-                                    valSql = new StringBuilder("" + SnowFlakeUtil.getId() + ", " + firstId);
-
-                            for (String key : dataMap2.keySet()) {
-                                keySql.append(", ").append(key);
-                                valSql.append(", '").append(dataMap2.get(key)).append("'");
-                            }
-
-                            sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
+                            StringBuilder sql = buildMTableInsertSql(table.getTabEnName(), dataMap2, SnowFlakeUtil.getId(), firstId, null);
+//                            // 拼接SQL
+//                            StringBuilder sql = new StringBuilder("INSERT INTO " + table.getTabEnName()),
+//                                    keySql = new StringBuilder("id, group_id"),
+//                                    valSql = new StringBuilder("" + SnowFlakeUtil.getId() + ", " + firstId);
+//                            for (String key : dataMap2.keySet()) {
+//                                keySql.append(", ").append(key);
+//                                valSql.append(", '").append(dataMap2.get(key)).append("'");
+//                            }
+//
+//                            sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
 
                             //新增数据
                             try {
@@ -1244,21 +1240,21 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     String delSql = "delete from " + tabName + " where p_key_id=" + tableInfo.getPkeyId();
                     String sqlInfo = "";
                     LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
-                    updateFieldLength(tabName, dataMap2);
                     /*检查发现有p_key_id缺失的情况,导致表单数据丢失,所以强制覆盖*/
                     dataMap2.put("p_key_id", tableInfo.getPkeyId());
+                    sqlInfo = buildMTableInsertSql(tabName, dataMap2, SnowFlakeUtil.getId(), null, null).toString();
                     //统计保存的字段
 
-                    sqlInfo = "INSERT INTO " + tabName + " ( ";
-                    String keyStr = "id,";
-                    String valStr = SnowFlakeUtil.getId() + ",";
-                    for (String keys : dataMap2.keySet()) {
-                        keyStr += keys + ",";
-                        valStr += "'" + dataMap2.get(keys) + "',";
-                    }
-                    keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
-                    valStr = valStr.substring(0, valStr.lastIndexOf(","));
-                    sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
+//                    sqlInfo = "INSERT INTO " + tabName + " ( ";
+//                    String keyStr = "id,";
+//                    String valStr = SnowFlakeUtil.getId() + ",";
+//                    for (String keys : dataMap2.keySet()) {
+//                        keyStr += keys + ",";
+//                        valStr += "'" + dataMap2.get(keys) + "',";
+//                    }
+//                    keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
+//                    valStr = valStr.substring(0, valStr.lastIndexOf(","));
+//                    sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
 
                     WbsTreeContract wbsTreeContractByP = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                             .eq(WbsTreeContract::getId, wbsTreeContract.getParentId()).eq(WbsTreeContract::getContractId, tableInfo.getContractId()));
@@ -1354,60 +1350,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
        return R.data(tableInfoList2);
        // return R.success(fileName1);
     }
-
-    public void updateFieldLength(String tableName, Map<String, String> fieldNameAndLengthMap) {
-        if (fieldNameAndLengthMap == null || fieldNameAndLengthMap.isEmpty()) {
-            return;
-        }
-        String fields = fieldNameAndLengthMap.keySet().stream().filter(key -> !key.equals("id") && !key.equals("p_key_id") && !key.equals("group_id")).map(key -> "'" + key + "'").collect(Collectors.joining(","));
-        if (fields.isEmpty()) {
-            return;
-        }
-        List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tableName +
-                "' and COLUMN_NAME in (" + fields + ")");
-        Map<String, Integer> map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
-            try {
-                return Integer.parseInt(v.get("fieldLength") + "");
-            } catch (Exception e) {
-                return 0;
-            }
-        }, Math::max));
-
-        List<WbsFormElement> elementList = jdbcTemplate.query("SELECT id,e_key,e_length from m_wbs_form_element WHERE f_id = (SELECT id from m_table_info WHERE tab_en_name = '" + tableName
-                        +"' and is_deleted = 0  limit 1) and is_deleted = 0 and e_key in ( " +  fields + ")", new BeanPropertyRowMapper<>(WbsFormElement.class));
-        StringBuilder sql = new StringBuilder();
-        sql.append("alter table ").append(tableName);
-        elementList.forEach(element -> {
-            String data = fieldNameAndLengthMap.get(element.getEKey());
-            Integer fieldLength = map.get(element.getEKey());
-            if (data != null && element.getELength() != null && data.length() > fieldLength) {
-                int length = data.length();
-                // 取整
-                length = (length / 10 + 1) * 10;
-                if (length < element.getELength()) {
-                    length = element.getELength();
-                    element.setELength(null);
-                } else {
-                    element.setELength(length);
-                }
-                sql.append(" modify column ").append(element.getEKey()).append(" ").append("varchar").append("(").append(length).append("),");
-            }
-        });
-        if (sql.indexOf("modify") > 0) {
-            sql.deleteCharAt(sql.length() - 1);
-            TransactionStatus transactionStatus = this.beginTransaction(transactionManager1);
-            try {
-                jdbcTemplate.batchUpdate("update m_wbs_form_element set e_length = ? where id = ?", elementList.stream().filter(element -> element.getELength() != null).map(element -> new Object[]{element.getELength(), element.getId()}).collect(Collectors.toList()));
-                jdbcTemplate.execute(sql.toString());
-                transactionManager1.commit(transactionStatus);
-            } catch (Exception e) {
-                transactionManager1.rollback(transactionStatus);
-                log.error("更新字段长度失败, error: " + e.getMessage());
-                throw new ServiceException("字段长度超出限制, 系统无法进行扩容,请尝试缩小字段长度或者联系系统管理员处理");
-            }
-        }
-    }
-
     public String reason(String log) {
         /*保存的时候错误提示例如:字段过短提示 yangyj*/
         StringBuilder sb = new StringBuilder();
@@ -1428,6 +1370,103 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
         return sb.append("保存异常,请联系管理员").toString();
     }
+    public StringBuilder buildMTableInsertSql(String tabName, Map<String, String> dataMap2, Object id, Object groupId, Object pKeyId) {
+        if (dataMap2 == null || dataMap2.isEmpty() || tabName == null || tabName.isEmpty()) {
+            return new StringBuilder();
+        }
+        //拼接SQL
+        StringBuilder sql = new StringBuilder("INSERT INTO " + tabName),
+                keySql = new StringBuilder(),
+                valSql = new StringBuilder();
+        if (id == null) {
+            if (dataMap2.containsKey("id")) {
+                id = dataMap2.get("id");
+            }
+        }
+        keySql.append("id");
+        valSql.append(id == null ? SnowFlakeUtil.getId() : id);
+        if (groupId ==  null) {
+            groupId = dataMap2.get("group_id");
+        }
+        if (groupId != null) {
+            keySql.append(", group_id");
+            valSql.append(", ").append(groupId);
+        }
+        if (pKeyId == null) {
+            pKeyId = dataMap2.get("p_key_id");
+        }
+        if (pKeyId != null) {
+            keySql.append(", p_key_id");
+            valSql.append(", ").append(pKeyId);
+        }
+        //参数
+        Map<String, String> opsParamMap = new HashMap<>();
+        dataMap2.remove("id");
+        dataMap2.remove("group_id");
+        dataMap2.remove("p_key_id");
+        String fields = dataMap2.keySet().stream().map(key -> "'" + key + "'").collect(Collectors.joining(","));
+        Map<String, Integer> map = new HashMap<>();
+        if (!fields.isEmpty()) {
+            try {
+                fields = fields + ", 'key_201'";
+                List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tabName +
+                        "' and COLUMN_NAME in (" + fields + ")");
+                map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
+                    try {
+                        return Integer.parseInt(v.get("fieldLength") + "");
+                    } catch (Exception e) {
+                        return 0;
+                    }
+                }, Math::min));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        for (String key : dataMap2.keySet()) {
+            String[] split = key.split("_");
+            if (split.length > 1 && Integer.parseInt(split[1]) > 80) {
+                // 大于80则保留在扩展字段中
+                opsParamMap.put(key, dataMap2.get(key));
+            } else {
+                String value = dataMap2.get(key);
+                if (value != null) {
+                    Integer i = map.get(key);
+                    // 长度超过数据库长度也保留在扩展字段中
+                    if (i != null &&  value.length() > i) {
+                        opsParamMap.put(key, dataMap2.get(key));
+                        continue;
+                    }
+                }
+                keySql.append(", ").append(key);
+                valSql.append(", '").append(value).append("'");
+            }
+        }
+        if (!opsParamMap.isEmpty()) {
+            keySql.append(", key_201");
+            String data = DataStructureFormatUtils.buildData(opsParamMap);
+            try {
+                if (!map.containsKey( "key_201")) {
+                    jdbcTemplate.execute("alter table " + tabName + " add column key_201 text");
+                } else  {
+                    Integer i = map.get("key_201");
+                    if (data.length() > i) {
+                        if (i < 10000) {
+                            // 65535 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 text");
+                        }else {
+                            // 16777215 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 mediumtext");
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            valSql.append(", '").append(data).append("'");
+        }
+        sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
+        return sql;
+    }
 
     // 获取用户
     @Override
@@ -1690,6 +1729,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         if (dataIn != null && dataIn.size() >= 1) {
             Map<String, Object> mysqlData = dataIn.get(0);
+            DataStructureFormatUtils.parseDataByKey(mysqlData);
             for (String key : mysqlData.keySet()) {
                 String tabVal = mysqlData.get(key) + "";
                 // 时间段处理
@@ -1975,6 +2015,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         if (dataIn != null && dataIn.size() >= 1) {
             Map<String, Object> mysqlData = dataIn.get(0);
+            DataStructureFormatUtils.parseDataByKey(mysqlData);
             for (String key : mysqlData.keySet()) {
                 String tabVal = mysqlData.get(key) + "";
                 // 时间段处理
@@ -3083,6 +3124,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 reData1=new HashMap<>(reData);
                 if (dataIn.size() >= 1) {
                     Map<String, Object> mysqlData = dataIn.get(0);
+                    DataStructureFormatUtils.parseDataByKey(mysqlData);
                     for (String key : mysqlData.keySet()) {
                         String tabVal = mysqlData.get(key) + "";
 
@@ -3353,6 +3395,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         if (dataIn.size() >= 1) {
             Map<String, Object> mysqlData = dataIn.get(0);
+            DataStructureFormatUtils.parseDataByKey(mysqlData);
             for (String key : mysqlData.keySet()) {
                 String tabVal = mysqlData.get(key) + "";
 
@@ -4015,22 +4058,22 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 //新增SQL
                 String sqlInfo = "";
                 LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
-                updateFieldLength(wbsTreePrivate.getInitTableName() ,dataMap2);
                 if(!dataMap2.containsKey("p_key_id")){
                     if(tableInfo.getPkeyId()!=null&&!tableInfo.getPkeyId().equals("")){
                         dataMap2.put("p_key_id",tableInfo.getPkeyId());
                     }
                 }
-                sqlInfo = "INSERT INTO " + wbsTreePrivate.getInitTableName() + " ( ";
-                String keyStr = "id,group_id,";
-                String valStr = SnowFlakeUtil.getId() + "," + groupId + ",";
-                for (String keys : dataMap2.keySet()) {
-                    keyStr += keys + ",";
-                    valStr += "'" + dataMap2.get(keys) + "',";
-                }
-                keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
-                valStr = valStr.substring(0, valStr.lastIndexOf(","));
-                sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
+                sqlInfo = buildMTableInsertSql(wbsTreePrivate.getInitTableName(), dataMap2, SnowFlakeUtil.getId(), groupId, tableInfo.getPkeyId()).toString();
+//                sqlInfo = "INSERT INTO " + wbsTreePrivate.getInitTableName() + " ( ";
+//                String keyStr = "id,group_id,";
+//                String valStr = SnowFlakeUtil.getId() + "," + groupId + ",";
+//                for (String keys : dataMap2.keySet()) {
+//                    keyStr += keys + ",";
+//                    valStr += "'" + dataMap2.get(keys) + "',";
+//                }
+//                keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
+//                valStr = valStr.substring(0, valStr.lastIndexOf(","));
+//                sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
                 TransactionStatus transactionStatus = this.beginTransaction(transactionManager1);
                 try {
                     //删除
@@ -5283,6 +5326,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
             if (dataIn.size() >= 1) {
                 Map<String, Object> mysqlData = dataIn.get(0);
+                DataStructureFormatUtils.parseDataByKey(mysqlData);
                 for (String key : mysqlData.keySet()) {
                     String tabVal = mysqlData.get(key) + "";
                     // 时间段处理
@@ -5707,6 +5751,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
             if (dataIn.size() >= 1) {
                 Map<String, Object> mysqlData = dataIn.get(0);
+                DataStructureFormatUtils.parseDataByKey(mysqlData);
                 for (String key : mysqlData.keySet()) {
                     String tabVal = mysqlData.get(key) + "";
                     // 时间段处理

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -49,6 +49,7 @@ import org.springblade.manager.formula.*;
 import org.springblade.manager.formula.impl.*;
 import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.*;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.manager.utils.*;
 import org.springblade.manager.vo.*;
 import org.springblade.meter.entity.*;
@@ -2374,6 +2375,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     //不为空的元素
                     if (mapsList.size() > 0) {
                         for (Map<String, Object> stringObjectMap : mapsList) {
+                            DataStructureFormatUtils.parseDataByKey(stringObjectMap);
                             for (String s : stringObjectMap.keySet()) {
                                 if (ObjectUtil.isNotEmpty(stringObjectMap.get(s)) && !s.equals("id") && !s.equals("p_key_id")) {
                                     maps.put(s, stringObjectMap.get(s));
@@ -6233,6 +6235,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql);
         Map<String, String> remap = new HashMap<>();
         for (Map<String, Object> map : mapList) {
+            DataStructureFormatUtils.parseDataByKey(map);
             for (String key : map.keySet()) {
                 String[] keyData = (map.get(key)+"").split("☆");
                 if(keyData!=null && keyData.length>=1){
@@ -6531,6 +6534,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
         if (dataIn != null && dataIn.size() >= 1) {
             Map<String, Object> mysqlData = dataIn.get(0);
+            DataStructureFormatUtils.parseDataByKey(mysqlData);
             for (String key : mysqlData.keySet()) {
                 String tabVal = mysqlData.get(key) + "";
                 // 时间段处理

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ServicePlanServiceImpl.java

@@ -49,6 +49,7 @@ import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.ServicePlanDTO;
 import org.springblade.manager.dto.ServiceUserDto;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.ServicePlanVO;
 import org.springblade.manager.mapper.ServicePlanMapper;
@@ -518,6 +519,7 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
         try {
             if (dataIn.size() >= 1) {
                 Map<String, Object> mysqlData = dataIn.get(0);
+                DataStructureFormatUtils.parseDataByKey(mysqlData);
                 for (String key : mysqlData.keySet()) {
                     String tabVal = mysqlData.get(key) + "";
                     // 时间段处理
@@ -801,6 +803,7 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
             keyNames= getKeyNameList(doc);
                 if (dataIn.size() >= 1) {
                     Map<String, Object> mysqlData = dataIn.get(0);
+                    DataStructureFormatUtils.parseDataByKey(mysqlData);
                     for (String key : mysqlData.keySet()) {
                         String tabVal = mysqlData.get(key) + "";
                         // 时间段处理

+ 169 - 192
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -95,9 +95,21 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
     @Override
     public Boolean initTable(List<WbsFormElement> elementList, String tableName) {
-        String sql = createSQL(elementList);
+        List<WbsFormElement> collect = elementList.stream().filter(element -> {
+            String eKey = element.getEKey();
+            String[] split = eKey.split("_");
+            if (split.length > 1 && StringUtil.isNumeric(split[1])) {
+                int i = Integer.parseInt(split[1]);
+                return i <= 80;
+            }
+            return true;
+        }).collect(Collectors.toList());
+        String sql = createSQL(collect);
         try {
             boolean b = wbsFormElementMapper.createTable(sql, tableName) >= 0;
+            if (b) {
+                alterMTableOpsFiled(tableName);
+            }
             return b;
         } catch (Exception e) {
             return true;
@@ -147,6 +159,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public WbsFormElement saveAndSyn(WbsFormElement wbsFormElement, String tableName) {
 
         String isExitSql = "select * from information_schema.TABLES where TABLE_NAME='" + tableName + "'";
@@ -164,28 +177,19 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
             tableName = tableInfo.getTabEnName();
         }
 
-
-        //当前表总字段长度
-        int sumLength = baseMapper.selectSumColumnLength(jdbcTemplate.queryForObject("SELECT DATABASE()", String.class), tableName);
-        if (sumLength + wbsFormElement.getELength() > MYSQL_MAX_COLUMN_LENGTH) {
-            updateTableFieldLength(tableName);
-            throw new ServiceException("无法添加字段,可用长度:" + (MYSQL_MAX_COLUMN_LENGTH - sumLength) + ",已自动调整其他字段长度,请重新添加");
-        }
         try {
-            // 删除 元素和实体表不匹配的字段
-            //baseMapper.deleteElementByfId2();
-
             //获取当前表单下所有元素
             List<WbsFormElement> wbsFormElements = baseMapper.selectList(Wrappers.<WbsFormElement>query().lambda().eq(WbsFormElement::getFId, wbsFormElement.getFId()));
             String substring = "";
             List<String> eKeyNum = new ArrayList<>();
+            long newFiled = 0;
             if (wbsFormElements.size() > 0) {
                 for (WbsFormElement formElement : wbsFormElements) {
                     String eKey = formElement.getEKey();
                     substring = eKey.split("_")[1];
                 }
                 if (StringUtils.isNotEmpty(substring)) {
-                    long newFiled = Long.parseLong(substring) + 1;
+                    newFiled = Long.parseLong(substring) + 1;
                     String substring1 = "key_" + newFiled;
                     eKeyNum.add(substring1);
                     if (wbsFormElement.getEType() == 4) {
@@ -201,75 +205,67 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
             StringBuilder sbr1 = new StringBuilder();
             String fieldType = WbsElementUtil.getInitTableFiledType(wbsFormElement.getEType());
-
-            if ("varchar".equals(fieldType)) {
-                if (wbsFormElement.getELength() > 1000 || wbsFormElement.getELength() < 10) {
-                    throw new ServiceException("请输入正确的长度,范围为10-1000");
-                } else {
-                    //新增
-                    wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
-                    baseMapper.insert(wbsFormElement);
-
-                    //同步
-                    //sbr1.append(" ").append(fieldType).append("(").append(wbsFormElement.getELength()).append(")");
-
-                    sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
-                    String sql = newName + " " + sbr1;
-                    baseMapper.alterAddFiled(sql, tableName);
-                    return wbsFormElement;
-                }
-
-            } else if ("bigint".equals(fieldType)) {
-                if (wbsFormElement.getELength() > 255 || wbsFormElement.getELength() < 10) {
-                    throw new ServiceException("请输入正确的长度,范围为10-255");
-                } else {
-                    //新增
-                    wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
-                    baseMapper.insert(wbsFormElement);
-
-                    //同步
-                    //sbr1.append(" ").append(fieldType).append("(").append(wbsFormElement.getELength()).append(")");
-
-                    sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
-                    String sql = newName + " " + sbr1;
-                    baseMapper.alterAddFiled(sql, tableName);
-                    return wbsFormElement;
-                }
-
-            } else if ("decimal".equals(fieldType)) {
-                if (wbsFormElement.getELength() > 65 || wbsFormElement.getELength() < 10) {
-                    throw new ServiceException("请输入正确的长度,范围为10-65");
-                } else {
-                    //新增
-                    baseMapper.insert(wbsFormElement);
-
-                    //同步
-                    //sbr1.append(" ").append(fieldType).append("(").append(wbsFormElement.getELength()).append(")");
-
-                    sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
-                    String sql = newName + " " + sbr1;
-                    baseMapper.alterAddFiled(sql, tableName);
-                    return wbsFormElement;
-                }
-            } else if ("datetime".equals(fieldType)) {
-                if (wbsFormElement.getELength() > 100 || wbsFormElement.getELength() < 0) {
-                    throw new ServiceException("请输入正确的长度,范围为0-100");
-                } else {
-                    //新增
-                    wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
-                    baseMapper.insert(wbsFormElement);
-
-                    //同步
-                    //sbr1.append(" ").append(fieldType).append("(").append(0).append(")");
-
-                    sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
-                    String sql = newName + " " + sbr1;
-                    baseMapper.alterAddFiled(sql, tableName);
-                    return wbsFormElement;
+            if (newFiled > 80) {
+                alterMTableOpsFiled(tableName);
+                baseMapper.insert(wbsFormElement);
+            } else {
+                if ("varchar".equals(fieldType)) {
+                    if (wbsFormElement.getELength() > 1000 || wbsFormElement.getELength() < 10) {
+                        throw new ServiceException("请输入正确的长度,范围为10-1000");
+                    } else {
+                        //新增
+                        wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                        baseMapper.insert(wbsFormElement);
+                        sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
+                        String sql = newName + " " + sbr1;
+                        baseMapper.alterAddFiled(sql, tableName);
+                        return wbsFormElement;
+                    }
+                } else if ("bigint".equals(fieldType)) {
+                    if (wbsFormElement.getELength() > 255 || wbsFormElement.getELength() < 10) {
+                        throw new ServiceException("请输入正确的长度,范围为10-255");
+                    } else {
+                        //新增
+                        wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                        baseMapper.insert(wbsFormElement);
+                        sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
+                        String sql = newName + " " + sbr1;
+                        baseMapper.alterAddFiled(sql, tableName);
+                        return wbsFormElement;
+                    }
+                } else if ("decimal".equals(fieldType)) {
+                    if (wbsFormElement.getELength() > 65 || wbsFormElement.getELength() < 10) {
+                        throw new ServiceException("请输入正确的长度,范围为10-65");
+                    } else {
+                        //新增
+                        baseMapper.insert(wbsFormElement);
+                        sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
+                        String sql = newName + " " + sbr1;
+                        baseMapper.alterAddFiled(sql, tableName);
+                        return wbsFormElement;
+                    }
+                } else if ("datetime".equals(fieldType)) {
+                    if (wbsFormElement.getELength() > 100 || wbsFormElement.getELength() < 0) {
+                        throw new ServiceException("请输入正确的长度,范围为0-100");
+                    } else {
+                        //新增
+                        wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                        baseMapper.insert(wbsFormElement);
+                        sbr1.append(" ").append("varchar").append("(").append(DEFAULT_ELEMENT_LENGTH_VARCHAR).append(")");
+                        String sql = newName + " " + sbr1;
+                        baseMapper.alterAddFiled(sql, tableName);
+                        return wbsFormElement;
+                    }
                 }
             }
 
         } catch (Exception e) {
+            if (e.getMessage().contains("Duplicate column name")) {
+                return wbsFormElement;
+            }
+            if (e.getMessage().contains("Row size too large")) {
+                return wbsFormElement;
+            }
             baseMapper.deleteElement(wbsFormElement);
             throw new ServiceException("同步元素字段异常,操作失败:" + e.getMessage());
         }
@@ -360,6 +356,13 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 //                } else if (eLength >= 0 && eLength <= 65) {
 //                    eLength = DEFAULT_ELEMENT_LENGTH_NUMBER;
 //                }
+                String[] split = eKey.split("_");
+                if (split.length > 1 && StringUtil.isNumeric(split[1])) {
+                    long index = Long.parseLong(split[1]);
+                    if (index > 80) {
+                        continue;
+                    }
+                }
                 Integer length = eLengthMap.get(wbsFormElement.getId());
                 if (length == null || !length.equals(eLength)) {
                     //判断是否存在该Key字段
@@ -368,6 +371,9 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                         try {
                             baseMapper.updateFiledType(initTableName, eKey, "varchar", eLength);
                         } catch (Exception e) {
+                            if (e.getMessage().contains("Row size too large")) {
+                                continue;
+                            }
                             e.printStackTrace();
                             this.updateBatchById(beforeUpdateWbsFormElements);
                             return R.fail(eName + "长度范围超出总最大限制,请尝试缩小当前字段与其他字段长度或者联系系统管理员处理");
@@ -578,18 +584,29 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
                         //String eTypeFiled = getInitTableFiledType(wbsFormElementInfo.getEType());
                         //int eLengthFiled = Integer.parseInt(setDefaultElementLength(wbsFormElementInfo.getEType()));
-
-                        //判断是否存在该Key字段
-                        int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
-                        if (row1 == 0) {
-                            //追加字段到实体表中
-                            wbsTreeMapper.alterTableFiled(wbsTree.getInitTableName(), key, "varchar", DEFAULT_ELEMENT_LENGTH_VARCHAR);
-                            //判断是否追加成功
-                            int row2 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
-                            if (row2 != 1) {
-                                //追加失败,删除元素,跳过
-                                baseMapper.deleteElementByfId2(wbsFormElementInfo.getId());
-                                continue;
+                        if (newKeyNumber > 80) {
+                            //判断是否存在该Key字段
+                            int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), "key_201");
+                            if (row1 == 0) {
+                                try {
+                                    jdbcTemplate.execute("alter table " + wbsTree.getInitTableName() + " add key_201 text");
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                }
+                            }
+                        } else {
+                            //判断是否存在该Key字段
+                            int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
+                            if (row1 == 0) {
+                                //追加字段到实体表中
+                                wbsTreeMapper.alterTableFiled(wbsTree.getInitTableName(), key, "varchar", DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                                //判断是否追加成功
+                                int row2 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
+                                if (row2 != 1) {
+                                    //追加失败,删除元素,跳过
+                                    baseMapper.deleteElementByfId2(wbsFormElementInfo.getId());
+                                    continue;
+                                }
                             }
                         }
                         newKeyNumber++;
@@ -654,18 +671,29 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
                     //String eTypeFiled = getInitTableFiledType(wbsFormElementInfo.getEType());
                     //int eLengthFiled = Integer.parseInt(setDefaultElementLength(wbsFormElementInfo.getEType()));
-
-                    //判断是否存在该Key字段
-                    int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
-                    if (row1 == 0) {
-                        //追加字段到实体表中
-                        wbsTreeMapper.alterTableFiled(wbsTree.getInitTableName(), key, "varchar", DEFAULT_ELEMENT_LENGTH_VARCHAR);
-                        //判断是否追加成功
-                        int row2 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
-                        if (row2 != 1) {
-                            //追加失败,删除元素,跳过
-                            baseMapper.deleteElementByfId2(wbsFormElementInfo.getId());
-                            continue;
+                    if (newKeyNumber > 80) {
+                        //判断是否存在该Key字段
+                        int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), "key_201");
+                        if (row1 == 0) {
+                            try {
+                                jdbcTemplate.execute("alter table " + wbsTree.getInitTableName() + " add key_201 text");
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    } else {
+                        //判断是否存在该Key字段
+                        int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
+                        if (row1 == 0) {
+                            //追加字段到实体表中
+                            wbsTreeMapper.alterTableFiled(wbsTree.getInitTableName(), key, "varchar", DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                            //判断是否追加成功
+                            int row2 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
+                            if (row2 != 1) {
+                                //追加失败,删除元素,跳过
+                                baseMapper.deleteElementByfId2(wbsFormElementInfo.getId());
+                                continue;
+                            }
                         }
                     }
                     newKeyNumber++;
@@ -733,18 +761,29 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
                     //String eTypeFiled = getInitTableFiledType(wbsFormElementInfo.getEType());
                     //int eLengthFiled = Integer.parseInt(setDefaultElementLength(wbsFormElementInfo.getEType()));
-
-                    //判断是否存在该Key字段
-                    int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
-                    if (row1 == 0) {
-                        //追加字段到实体表中
-                        wbsTreeMapper.alterTableFiled(wbsTree.getInitTableName(), key, "varchar", DEFAULT_ELEMENT_LENGTH_VARCHAR);
-                        //判断是否追加成功
-                        int row2 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
-                        if (row2 == 0) {
-                            //追加失败,删除元素,跳过
-                            baseMapper.deleteElementByfId2(wbsFormElementInfo.getId());
-                            continue;
+                    if (newKeyNumber > 80) {
+                        //判断是否存在该Key字段
+                        int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), "key_201");
+                        if (row1 == 0) {
+                            try {
+                                jdbcTemplate.execute("alter table " + wbsTree.getInitTableName() + " add key_201 text");
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                            }
+                        }
+                    } else {
+                        //判断是否存在该Key字段
+                        int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
+                        if (row1 == 0) {
+                            //追加字段到实体表中
+                            wbsTreeMapper.alterTableFiled(wbsTree.getInitTableName(), key, "varchar", DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                            //判断是否追加成功
+                            int row2 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), key);
+                            if (row2 == 0) {
+                                //追加失败,删除元素,跳过
+                                baseMapper.deleteElementByfId2(wbsFormElementInfo.getId());
+                                continue;
+                            }
                         }
                     }
                     newKeyNumber++;
@@ -923,6 +962,14 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
             for (WbsFormElement listDatum : listData) {
                 // String initTableFiledType = getInitTableFiledType(listDatum.getEType());
                 // int elementLength = getElementLength(initTableFiledType);
+                String[] split = listDatum.getEKey().split("_");
+                if (split.length > 1 && StringUtil.isNumeric(split[1])) {
+                    long index = Long.parseLong(split[1]);
+                    if (index > 80)  {
+                        alterMTableOpsFiled(initTableName);
+                        continue;
+                    };
+                }
                 //同步
                 //判断是否存在该Key字段
                 int row1 = wbsTreeMapper.isThereAField(initTableName, listDatum.getEKey());
@@ -970,87 +1017,17 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
     }
 
 
-    /**
-     * 修改当前表所有字段的长度 (只用于字段缩减)
-     * 1、字段数量超过80 表数据超过500条 把数据长度为0的旧字段长度改为50
-     * 超过:新字段的默认长度改为150,并且
-     */
-    public void updateTableFieldLength(String tableName) {
-        TableInfo tableInfo = tableInfoMapper.selectOne(Wrappers.<TableInfo>lambdaQuery()
-                .eq(TableInfo::getTabEnName, tableName)
-                .last("limit 1"));
-
-        List<WbsFormElement> wbsFormElements = baseMapper.selectList(Wrappers.<WbsFormElement>lambdaQuery()
-                .eq(WbsFormElement::getFId, tableInfo.getId()));
-        //元素是否存在
-        if (CollectionUtil.isEmpty(wbsFormElements)) {
-            return;
-        }
-        //字段级字段长度缓存
-        Map<String, Integer> lengthMap = new HashMap<>();
-        //查询当前表的所有字段级字段长度
-        List<Map<String, Object>> filedLengths = baseMapper.selectFiledLength(tableName);
-        //表是否存在
-        if (CollectionUtil.isEmpty(filedLengths)) {
-            return;
-        }
-        for (Map<String, Object> filedLength : filedLengths) {
-            BigInteger length = (BigInteger) filedLength.get("length");
-            if (length == null) {
-                continue;
-            }
-            //记录字段与字段长度
-            lengthMap.put(filedLength.get("key").toString(), length.intValue());
-        }
-
-        //这张表是否拥有数据超过500条
-        Integer count = jdbcTemplate.queryForObject("select count(0) from " + tableName, Integer.class);
-
-
-        for (WbsFormElement wbsFormElement : wbsFormElements) {
-
-            String eKey = wbsFormElement.getEKey();
-            //字段不存在
-            if (lengthMap.get(eKey) == null) {
-                continue;
-            }
-            Integer dataLength = baseMapper.selectFiledDataMaxLength(tableName, eKey);
-
-            if (wbsFormElements.size() > 80 && count > 500) {
-                //数据长度
-                dataLength = dataLength == 0 ? 50 : lengthMap.get(eKey) + 100;
-                //如果当前需要设置的长度大于当前字段长度,则跳过
-                if (dataLength > wbsFormElement.getELength()) {
-                    continue;
-                }
-            } else if (wbsFormElements.size() > 80 && count < 500) {
-                //数据长度
-                dataLength = dataLength == 0 ? 100 : lengthMap.get(eKey) + 100;
-                //如果当前需要设置的长度大于当前字段长度,则跳过
-                if (dataLength > wbsFormElement.getELength()) {
-                    continue;
-                }
-            } else if (wbsFormElements.size() < 80 && count > 500) {
-                //数据长度
-                dataLength = dataLength == 0 ? 200 : lengthMap.get(eKey) + 100;
-                //如果当前需要设置的长度大于当前字段长度,则跳过
-                if (dataLength > wbsFormElement.getELength()) {
-                    continue;
-                }
-            } else {
-                //数据长度
-                dataLength = dataLength == 0 ? 200 : lengthMap.get(eKey) + 100;
-                //如果当前需要设置的长度大于当前字段长度,则跳过
-                if (dataLength > wbsFormElement.getELength()) {
-                    continue;
-                }
-                if (dataLength < 200) {
-                    dataLength = 200;
+    private void alterMTableOpsFiled(String initTableName) {
+        int row1 = wbsTreeMapper.isThereAField(initTableName, "key_201");
+        if (row1 == 0) {
+            //追加字段到实体表中
+            try {
+                jdbcTemplate.execute("ALTER TABLE " + initTableName + "  ADD COLUMN key_201 text");
+            } catch (Exception e) {
+                if (!e.getMessage().contains("Duplicate column name")) {
+                    log.error("新增字段异常:", e);
                 }
             }
-            baseMapper.updateFiledType(tableName, eKey, "varchar", dataLength);
-            wbsFormElement.setELength(dataLength);
-            baseMapper.updateById(wbsFormElement);
         }
     }
 }

+ 49 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -66,6 +66,7 @@ import org.springblade.manager.mapper.*;
 import org.springblade.manager.service.INodeBaseInfoService;
 import org.springblade.manager.service.ITableFileService;
 import org.springblade.manager.service.IWbsTreeContractService;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.manager.utils.CompositeKey;
 import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
@@ -912,32 +913,32 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     break;
                 }
             }
-
-            if (DataMap != null && DataMap.size() >= 1) {
-                String dataCol = "";
+            String dataCol = "";
+            for (int j = 0; j < dataSize; j++) {
+                if (j == dataSize - 1) {
+                    dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j];
+                } else {
+                    dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
+                }
+            }
+            boolean flag = isSaveKey201(info, wbsInfo, dataCol);
+            if (!DataMap.isEmpty()) {
                 String updateSql = "update " + wbsInfo.getInitTableName() + " set " + info.getKey() + "=";
-                for (int j = 0; j < dataSize; j++) {
-                    if (j == dataSize - 1) {
-                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j];
-                    } else {
-                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
-                    }
+                if (flag) {
+                    updateSql = "update " + wbsInfo.getInitTableName() + " set key_201 = concat(key_201,'$$'," + "'" + info.getKey() + ":" + dataCol + "') where p_key_id= " + wbsTreeContract.getPKeyId() + ";";
+                } else {
+                    updateSql = updateSql + "'" + dataCol + "' where p_key_id=" + wbsTreeContract.getPKeyId() + " ;";
                 }
-                updateSql = updateSql + "'" + dataCol + "' where p_key_id=" + wbsTreeContract.getPKeyId() + " ;";
                 moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
                 addSql.append(updateSql);
             } else {
                 long dataId = SnowFlakeUtil.getId();
                 String insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id," + info.getKey() + ") VALUES (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'";
-                String dataCol = "";
-                for (int j = 0; j < dataSize; j++) {
-                    if (j == dataSize - 1) {
-                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j];
-                    } else {
-                        dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
-                    }
+                if (flag) {
+                    insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + info.getKey() + ":" + dataCol + "');";
+                } else {
+                    insertSql = insertSql + dataCol + "');";
                 }
-                insertSql = insertSql + dataCol + "');";
                 moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
                 addSql.append(insertSql);
             }
@@ -1002,7 +1003,11 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                         dataCol = dataCol + moreData.get(j) + "_^_" + excLenght[j] + "☆";
                     }
                 }
-                insertSql = insertSql + dataCol + "');";
+                if (isSaveKey201(info, wbsInfo, dataCol)) {
+                    insertSql = "insert into " + wbsInfo.getInitTableName() + "(id,p_key_id,key_201) values (" + dataId + "," + wbsTreeContract.getPKeyId() + ",'" + info.getKey() + ":" + dataCol + "');";
+                } else {
+                    insertSql = insertSql + dataCol + "');";
+                }
                 moreData = moreData.stream().skip(excLenght.length).map(com.mixsmart.utils.StringUtils::handleNull).collect(Collectors.toList());
                 addSql.append(insertSql);
             }
@@ -1021,6 +1026,31 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return false;
     }
 
+    private boolean isSaveKey201(RangeInfo info, WbsTreeContract wbsInfo, String dataCol) {
+        boolean flag = false;
+        try {
+            String[] split = info.getKey().split("_");
+            flag = split.length > 1 && StringUtil.isNumeric(split[1]) && Integer.parseInt(split[1]) > 80;
+            if (!flag) {
+                List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + wbsInfo.getInitTableName() +
+                        "' and COLUMN_NAME in ('" + info.getKey() + "', 'key_201" + "')");
+                if (!fieldMap.isEmpty()) {
+                    Map<String, Object> map1 = fieldMap.stream().filter(map -> map.get("fieldName") != null).collect(Collectors.toMap(map -> map.get("fieldName") + "", map -> map.get("fieldLength")));
+                    Object length = map1.get(info.getKey());
+                    if (length != null && Integer.parseInt(length.toString()) > dataCol.length()) {
+                        flag = true;
+                        if (map1.get("key_201") == null) {
+                            jdbcTemplate.execute("alter table " + wbsInfo.getInitTableName() + " add column key_201 text ");
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
     @Override
     public void syncCurrentFormToAllContract(WbsTreePrivate wbsTreePrivate) {
         baseMapper.syncCurrentFormToAllContract(wbsTreePrivate);

+ 13 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -308,8 +308,19 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                             wbsFormElement.setRemark(map.get("备注"));
 
                             wbsFormElementService.save(wbsFormElement);
-
-                            baseMapper.alterTableFiled(initTableName, wbsFormElement.getEKey(), "varchar", WbsFormElementServiceImpl.DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                            if (keyNumb[0] > 80) {
+                                //判断是否存在该Key字段
+                                int row1 = wbsTreeMapper.isThereAField(wbsTree.getInitTableName(), "key_201");
+                                if (row1 == 0) {
+                                    try {
+                                        jdbcTemplate.execute("alter table " + wbsTree.getInitTableName() + " add key_201 text");
+                                    } catch (Exception e) {
+                                        e.printStackTrace();
+                                    }
+                                }
+                            } else {
+                                baseMapper.alterTableFiled(initTableName, wbsFormElement.getEKey(), "varchar", WbsFormElementServiceImpl.DEFAULT_ELEMENT_LENGTH_VARCHAR);
+                            }
                         }
 
                     });

+ 113 - 10
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -64,6 +64,7 @@ import org.springblade.evisa.vo.SealStrategyVO;
 import org.springblade.feign.ArchiveFileTaskClient;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.*;
+import org.springblade.manager.util.DataStructureFormatUtils;
 import org.springblade.manager.vo.ExecutionTime;
 import org.springblade.manager.vo.ReportMergeCellsConfig;
 import org.springblade.manager.vo.ReportResult;
@@ -113,6 +114,8 @@ import java.util.regex.Matcher;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import static java.util.stream.Collectors.toMap;
+
 @RestController
 @AllArgsConstructor
 @RequestMapping("/task")
@@ -3497,16 +3500,17 @@ public class TaskController extends BladeController {
                     }
                     /*检查发现有p_key_id缺失的情况,导致表单数据丢失,所以强制覆盖*/
                     dataMap.put("p_key_id", task.getId());
-                    sqlInfo = "INSERT INTO " + aPrivate.getInitTableName() + " ( ";
-                    String keyStr = "id,";
-                    String valStr = SnowFlakeUtil.getId() + ",";
-                    for (String keys : dataMap.keySet()) {
-                        keyStr += keys + ",";
-                        valStr += "'" + dataMap.get(keys) + "',";
-                    }
-                    keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
-                    valStr = valStr.substring(0, valStr.lastIndexOf(","));
-                    sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
+                    sqlInfo = buildMTableInsertSql(aPrivate.getInitTableName(), dataMap, SnowFlakeUtil.getId(), null, null).toString();
+//                    sqlInfo = "INSERT INTO " + aPrivate.getInitTableName() + " ( ";
+//                    String keyStr = "id,";
+//                    String valStr = SnowFlakeUtil.getId() + ",";
+//                    for (String keys : dataMap.keySet()) {
+//                        keyStr += keys + ",";
+//                        valStr += "'" + dataMap.get(keys) + "',";
+//                    }
+//                    keyStr = keyStr.substring(0, keyStr.lastIndexOf(","));
+//                    valStr = valStr.substring(0, valStr.lastIndexOf(","));
+//                    sqlInfo = sqlInfo + keyStr + ") VALUES (" + valStr + ")";
                     jdbcTemplate.execute(sqlInfo);
 
                     //如果为最后审计流程则判断是否当前流程已全部审批,已经全部审批则生成电签PDF,没有全部审批则只保存数据
@@ -3556,6 +3560,104 @@ public class TaskController extends BladeController {
         }
     }
 
+    public StringBuilder buildMTableInsertSql(String tabName, Map<String, Object> dataMap2, Object id, Object groupId, Object pKeyId) {
+        if (dataMap2 == null || dataMap2.isEmpty() || tabName == null || tabName.isEmpty()) {
+            return new StringBuilder();
+        }
+        //拼接SQL
+        StringBuilder sql = new StringBuilder("INSERT INTO " + tabName),
+                keySql = new StringBuilder(),
+                valSql = new StringBuilder();
+        if (id == null) {
+            if (dataMap2.containsKey("id")) {
+                id = dataMap2.get("id");
+            }
+        }
+        keySql.append("id");
+        valSql.append(id == null ? SnowFlakeUtil.getId() : id);
+        if (groupId ==  null) {
+            groupId = dataMap2.get("group_id");
+        }
+        if (groupId != null) {
+            keySql.append(", group_id");
+            valSql.append(", ").append(groupId);
+        }
+        if (pKeyId == null) {
+            pKeyId = dataMap2.get("p_key_id");
+        }
+        if (pKeyId != null) {
+            keySql.append(", p_key_id");
+            valSql.append(", ").append(pKeyId);
+        }
+        //参数
+        Map<String, String> opsParamMap = new HashMap<>();
+        dataMap2.remove("id");
+        dataMap2.remove("group_id");
+        dataMap2.remove("p_key_id");
+        String fields = dataMap2.keySet().stream().map(key -> "'" + key + "'").collect(Collectors.joining(","));
+        Map<String, Integer> map = new HashMap<>();
+        if (!fields.isEmpty()) {
+            try {
+                fields = fields + ", 'key_201'";
+                List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tabName +
+                        "' and COLUMN_NAME in (" + fields + ")");
+                map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
+                    try {
+                        return Integer.parseInt(v.get("fieldLength") + "");
+                    } catch (Exception e) {
+                        return 0;
+                    }
+                }, Math::min));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        for (String key : dataMap2.keySet()) {
+            String[] split = key.split("_");
+            if (split.length > 1 && Integer.parseInt(split[1]) > 80) {
+                // 大于80则保留在扩展字段中
+                opsParamMap.put(key, dataMap2.get(key) == null ? "" : dataMap2.get(key) + "");
+            } else {
+                String value = dataMap2.get(key) == null ? null : dataMap2.get(key) + "";
+                if (value != null) {
+                    Integer i = map.get(key);
+                    // 长度超过数据库长度也保留在扩展字段中
+                    if (i != null &&  value.length() > i) {
+                        opsParamMap.put(key, value);
+                        continue;
+                    }
+                }
+                keySql.append(", ").append(key);
+                valSql.append(", '").append(value).append("'");
+            }
+        }
+        if (!opsParamMap.isEmpty()) {
+            keySql.append(", key_201");
+            String data = DataStructureFormatUtils.buildData(opsParamMap);
+            try {
+                if (!map.containsKey( "key_201")) {
+                    jdbcTemplate.execute("alter table " + tabName + " add column key_201 text");
+                } else  {
+                    Integer i = map.get("key_201");
+                    if (data.length() > i) {
+                        if (i < 10000) {
+                            // 65535 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 text");
+                        }else {
+                            // 16777215 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 mediumtext");
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            valSql.append(", '").append(data).append("'");
+        }
+        sql.append("(").append(keySql).append(")").append(" values(").append(valSql).append(")");
+        return sql;
+    }
+
     public void addYuan(String key, Map<String, Object> tableData) {
         Object object2 = tableData.get(key);
         if (object2 != null) {
@@ -5475,6 +5577,7 @@ public class TaskController extends BladeController {
 
         if (dataIn != null && dataIn.size() >= 1) {
             Map<String, Object> mysqlData = dataIn.get(0);
+            DataStructureFormatUtils.parseDataByKey(mysqlData);
             for (String key : mysqlData.keySet()) {
                 String tabVal = mysqlData.get(key) + "";
                 // 时间段处理