Преглед изворни кода

后管-wbs元素库-添加新元素时如果行数超过表最大行数会动态修改其他字段行数

LHB пре 2 месеци
родитељ
комит
1a053ea409

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.xml

@@ -170,7 +170,7 @@
         select column_name `key`,character_maximum_length length from INFORMATION_SCHEMA.COLUMNS  where table_name = #{initTableName}
     </select>
     <select id="selectFiledDataMaxLength" resultType="java.lang.Integer">
-        select MAX(CHAR_LENGTH(${key})) from ${tableName}
+        select IFNULL(MAX(CHAR_LENGTH(${key})),0) from ${tableName}
     </select>
     <select id="selectSumColumnLength" resultType="java.lang.Integer">
         SELECT

+ 91 - 51
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsFormElementServiceImpl.java

@@ -63,7 +63,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
     //实体表字段默认长度
     private static final String ELEMENT_LENGTH_ENTITY = "200";
     //数据库动态表总字段最大长度
-    private static final Integer MYSQL_MAX_COLUMN_LENGTH = 17453;
+    private static final Integer MYSQL_MAX_COLUMN_LENGTH = 16328;
 
     @Override
     public IPage<WbsFormElementVO> selectWbsFormElementPage(IPage<WbsFormElementVO> page, WbsFormElementVO wbsFormElement) {
@@ -142,6 +142,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 + "'";
@@ -161,9 +162,10 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
 
         //当前表总字段长度
-        int sumLength = baseMapper.selectSumColumnLength(jdbcTemplate.queryForObject("SELECT DATABASE()",String.class), tableName);
+        int sumLength = baseMapper.selectSumColumnLength(jdbcTemplate.queryForObject("SELECT DATABASE()", String.class), tableName);
         if (sumLength + wbsFormElement.getELength() > MYSQL_MAX_COLUMN_LENGTH) {
-            throw new ServiceException("无法添加字段,可用长度:" + (MYSQL_MAX_COLUMN_LENGTH - sumLength));
+            updateTableFieldLength(tableName);
+            throw new ServiceException("无法添加字段,可用长度:" + (MYSQL_MAX_COLUMN_LENGTH - sumLength) + ",已自动调整其他字段长度,请重新添加");
         }
         try {
             // 删除 元素和实体表不匹配的字段
@@ -201,6 +203,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     throw new ServiceException("请输入正确的长度,范围为10-1000");
                 } else {
                     //新增
+                    wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
                     baseMapper.insert(wbsFormElement);
 
                     //同步
@@ -217,6 +220,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     throw new ServiceException("请输入正确的长度,范围为10-255");
                 } else {
                     //新增
+                    wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
                     baseMapper.insert(wbsFormElement);
 
                     //同步
@@ -248,6 +252,7 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                     throw new ServiceException("请输入正确的长度,范围为0-50");
                 } else {
                     //新增
+                    wbsFormElement.setELength(DEFAULT_ELEMENT_LENGTH_VARCHAR);
                     baseMapper.insert(wbsFormElement);
 
                     //同步
@@ -313,8 +318,6 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
         wbsFormElementList.forEach(obj -> obj.setStatus(1));
         boolean b = this.updateBatchById(wbsFormElementList);
 
-        //字段级字段长度缓存
-        Map<String, Integer> lengthMap = new HashMap<>();
 
         //当前设置的字段总长度
         Integer nowTotalLength = 0;
@@ -322,21 +325,12 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
             nowTotalLength += wbsFormElement.getELength();
         }
         //当前表总字段长度
-        int sumLength = baseMapper.selectSumColumnLength(jdbcTemplate.queryForObject("SELECT DATABASE()",String.class), initTableName);
+        int sumLength = baseMapper.selectSumColumnLength(jdbcTemplate.queryForObject("SELECT DATABASE()", String.class), initTableName);
         if (nowTotalLength > MYSQL_MAX_COLUMN_LENGTH) {
             //修改元素字段长度
             throw new ServiceException("无法添加字段,可用长度:" + (MYSQL_MAX_COLUMN_LENGTH - sumLength));
         }
 
-        //查询当前表的所有字段级字段长度
-        List<Map<String, Object>> filedLengths = baseMapper.selectFiledLength(initTableName);
-        for (Map<String, Object> filedLength : filedLengths) {
-            BigInteger length = (BigInteger) filedLength.get("length");
-            if (length == null) {
-                continue;
-            }
-            lengthMap.put(filedLength.get("key").toString(), length.intValue());
-        }
 
         //修改实体表信息
         if (b) {
@@ -381,40 +375,9 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
                 int row1 = wbsTreeMapper.isThereAField(initTableName, eKey);
                 if (row1 > 0) {
                     try {
-                        //1、查询当前表当前字段
-
-                        //字段配置的长度
-                        Integer filedLength = lengthMap.get(eKey);
-                        if (filedLength == null) {
-                            throw new RuntimeException("字段不存在");
-                        }
-                        //获取当前字段数据的最长数据长度
-                        Integer maxLength = baseMapper.selectFiledDataMaxLength(initTableName, eKey);
-                        //初始长度
-                        int initLength = 250;
-                        //当前字段数据长度为null
-                        if (maxLength == null) {
-                            //设置初始长度
-                            baseMapper.updateFiledType(initTableName, eKey, "varchar", initLength);
-                            wbsFormElement.setELength(initLength);
-                            baseMapper.updateById(wbsFormElement);
-                        } else {
-                            //动态扩容 每次根据最大数据长度扩容100
-                            int newLength = maxLength + 100;
-                            //如果字段的长度与扩容后的值一致则不去修改字段
-                            if (filedLength == newLength) {
-                                continue;
-                            }
-                            //如果数据的最大长度 +100 都大于字段配置的长度  则重新设置字段的长度
-                            if (filedLength >= newLength) {
-                                baseMapper.updateFiledType(initTableName, eKey, "varchar", newLength);
-                                wbsFormElement.setELength(newLength);
-                                baseMapper.updateById(wbsFormElement);
-                                continue;
-                            }
-                            baseMapper.updateFiledType(initTableName, eKey, "varchar", eLength);
-                        }
+                        baseMapper.updateFiledType(initTableName, eKey, "varchar", eLength);
                     } catch (Exception e) {
+                        e.printStackTrace();
                         this.updateBatchById(beforeUpdateWbsFormElements);
                         throw new RuntimeException("字段长度范围超出总最大限制,请尝试缩小当前字段长度或其他字段长度");
                     }
@@ -987,9 +950,86 @@ public class WbsFormElementServiceImpl extends BaseServiceImpl<WbsFormElementMap
 
 
     /**
-     * 修改当前表所有字段的长度
-     *  1、字段数量超过80 表数据超过500条 把数据长度为0的旧字段长度改为50
-     *      超过:新字段的默认长度改为150,并且
+     * 修改当前表所有字段的长度 (只用于字段缩减)
+     * 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;
+                }
+            }
+            baseMapper.updateFiledType(tableName, eKey, "varchar", dataLength);
+            wbsFormElement.setELength(dataLength);
+            baseMapper.updateById(wbsFormElement);
+        }
+    }
 }