|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|