update 重构 增强代码生成器各项功能

update 自动类型判断可根据不同数据库精确识别 对应的java类型
update 优化java字段名与数据库名不匹配则增加别名注解
update 增加 是否导出 是否状态切换 是否组合唯一校验 是否排序调整 和树结构相关字段等功能选择
update 优化自定义路径导出 导出全部代码
update 删除无用主子表相关代码
This commit is contained in:
疯狂的狮子Li
2026-04-17 18:24:04 +08:00
parent 983b393d3e
commit c17948510c
15 changed files with 1137 additions and 85 deletions
@@ -45,6 +45,56 @@ public interface GenConstants {
*/
String PARENT_MENU_NAME = "parentMenuName";
/**
* 是否启用导出能力
*/
String ENABLE_EXPORT = "enableExport";
/**
* 是否启用状态切换能力
*/
String ENABLE_STATUS = "enableStatus";
/**
* 状态字段
*/
String STATUS_FIELD = "statusField";
/**
* 是否启用组合唯一校验
*/
String ENABLE_UNIQUE = "enableUnique";
/**
* 组合唯一字段
*/
String UNIQUE_FIELDS = "uniqueFields";
/**
* 是否启用排序调整能力
*/
String ENABLE_SORT = "enableSort";
/**
* 排序字段
*/
String SORT_FIELD = "sortField";
/**
* 树根节点值
*/
String TREE_ROOT_VALUE = "treeRootValue";
/**
* 树祖级字段
*/
String TREE_ANCESTORS = "treeAncestors";
/**
* 树排序字段
*/
String TREE_ORDER_FIELD = "treeOrderField";
/**
* 数据库字符串类型
*/
@@ -128,6 +178,16 @@ public interface GenConstants {
*/
String HTML_DATETIME = "datetime";
/**
* 开关控件
*/
String HTML_SWITCH = "switch";
/**
* 数字输入控件
*/
String HTML_INPUT_NUMBER = "inputNumber";
/**
* 图片上传控件
*/
@@ -168,6 +228,11 @@ public interface GenConstants {
*/
String TYPE_BIGDECIMAL = "BigDecimal";
/**
* 布尔类型
*/
String TYPE_BOOLEAN = "Boolean";
/**
* 时间类型
*/
@@ -55,19 +55,17 @@ public class GenController extends BaseController {
* 修改代码生成业务
*
* @param tableId 表ID
* @return 表字段与可选业务表信息
* @return 表字段信息
*/
@RepeatSubmit()
@SaCheckPermission("tool:gen:query")
@GetMapping(value = "/{tableId}")
public R<Map<String, Object>> getInfo(@PathVariable Long tableId) {
GenTable table = genTableService.selectGenTableById(tableId);
List<GenTable> tables = genTableService.selectGenTableAll();
List<GenTableColumn> list = genTableService.selectGenTableColumnListByTableId(tableId);
Map<String, Object> map = new HashMap<>(3);
Map<String, Object> map = new HashMap<>(2);
map.put("info", table);
map.put("rows", list);
map.put("tables", tables);
return R.ok(map);
}
@@ -51,16 +51,6 @@ public class GenTable extends BaseEntity {
@NotBlank(message = "表描述不能为空")
private String tableComment;
/**
* 关联父表的表名
*/
private String subTableName;
/**
* 本表关联父表的外键名
*/
private String subTableFkName;
/**
* 实体类名称(首字母大写)
*/
@@ -68,7 +58,7 @@ public class GenTable extends BaseEntity {
private String className;
/**
* 使用的模板(crud单表操作 tree树表操作 sub主子表操作
* 使用的模板(crud单表操作 tree树表操作)
*/
private String tplCategory;
@@ -172,6 +162,66 @@ public class GenTable extends BaseEntity {
@TableField(exist = false)
private String parentMenuName;
/**
* 是否启用导出
*/
@TableField(exist = false)
private Boolean enableExport;
/**
* 是否启用状态切换
*/
@TableField(exist = false)
private Boolean enableStatus;
/**
* 状态字段
*/
@TableField(exist = false)
private String statusField;
/**
* 是否启用组合唯一校验
*/
@TableField(exist = false)
private Boolean enableUnique;
/**
* 组合唯一字段
*/
@TableField(exist = false)
private List<String> uniqueFields;
/**
* 是否启用排序调整
*/
@TableField(exist = false)
private Boolean enableSort;
/**
* 排序字段
*/
@TableField(exist = false)
private String sortField;
/**
* 树根节点值
*/
@TableField(exist = false)
private String treeRootValue;
/**
* 树祖级字段
*/
@TableField(exist = false)
private String treeAncestorsField;
/**
* 树排序字段
*/
@TableField(exist = false)
private String treeOrderField;
/**
* 请求参数
*/
@@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode;
import org.apache.ibatis.type.JdbcType;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.gen.constant.GenConstants;
/**
* 代码生成业务字段表 gen_table_column
@@ -307,6 +308,31 @@ public class GenTableColumn extends BaseEntity {
return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
}
/**
* 判断当前列是否需要显式声明 MP 字段映射。
*
* @return 字段名与下划线列名不一致时返回 {@code true}
*/
public boolean isNeedTableField() {
if (StringUtils.isAnyBlank(this.columnName, this.javaField)) {
return false;
}
return !StringUtils.equalsIgnoreCase(this.columnName, StringUtils.toUnderScoreCase(this.javaField));
}
/**
* 判断当前列是否属于字典控件列。
*
* @return 仅当已配置字典类型且显示类型支持字典时返回 {@code true}
*/
public boolean isDictColumn() {
return StringUtils.isNotBlank(this.dictType) && StringUtils.equalsAny(this.htmlType,
GenConstants.HTML_SELECT,
GenConstants.HTML_RADIO,
GenConstants.HTML_CHECKBOX,
GenConstants.HTML_SWITCH);
}
/**
* 从字段注释中解析字典读转换表达式。
*
@@ -1,6 +1,7 @@
package org.dromara.gen.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Dict;
@@ -220,17 +221,6 @@ public class GenTableServiceImpl implements IGenTableService {
}).toList();
}
/**
* 查询所有表信息
*
* @return 表信息集合
*/
@Override
public List<GenTable> selectGenTableAll() {
return fillTableColumns(baseMapper.selectList(new LambdaQueryWrapper<GenTable>()
.orderByAsc(GenTable::getTableId)));
}
/**
* 修改业务
*
@@ -239,6 +229,7 @@ public class GenTableServiceImpl implements IGenTableService {
@Transactional(rollbackFor = Exception.class)
@Override
public void updateGenTable(GenTable genTable) {
normalizeColumnOptions(genTable.getColumns());
String options = JsonUtils.toJsonString(genTable.getParams());
genTable.setOptions(options);
int row = baseMapper.updateById(genTable);
@@ -372,16 +363,13 @@ public class GenTableServiceImpl implements IGenTableService {
List<PathNamedTemplate> templates = TemplateEngineUtils.getTemplateList(table.getTplCategory(), table.getDataName());
for (PathNamedTemplate template : templates) {
String pathName = template.getPathName();
// 渲染模板
if (!StringUtils.containsAny(pathName, "sql.vm", "api.ts.vm", "types.ts.vm", "index.vue.vm", "index-tree.vue.vm")) {
// 渲染模板
try {
String render = template.render(context);
String path = getGenPath(table, pathName);
FileUtils.writeUtf8String(render, path);
} catch (Exception e) {
throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
}
try {
String render = template.render(context);
String path = getGenPath(table, pathName);
FileUtils.writeUtf8String(render, path);
} catch (Exception e) {
log.error("渲染模板失败,表名:{},模板:{}", table.getTableName(), pathName, e);
throw new ServiceException("渲染模板失败,表名:" + table.getTableName() + ",模板:" + pathName);
}
}
}
@@ -426,6 +414,7 @@ public class GenTableServiceImpl implements IGenTableService {
saveColumns.add(column);
});
if (CollUtil.isNotEmpty(saveColumns)) {
normalizeColumnOptions(saveColumns);
genTableColumnMapper.insertOrUpdateBatch(saveColumns);
}
List<GenTableColumn> delColumns = StreamUtils.filter(tableColumns, column -> !dbTableColumnNames.contains(column.getColumnName()));
@@ -506,6 +495,7 @@ public class GenTableServiceImpl implements IGenTableService {
*/
@Override
public void validateEdit(GenTable genTable) {
validateOptionColumns(genTable);
if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) {
String options = JsonUtils.toJsonString(genTable.getParams());
Dict paramsObj = JsonUtils.parseMap(options);
@@ -519,6 +509,52 @@ public class GenTableServiceImpl implements IGenTableService {
}
}
private void validateOptionColumns(GenTable genTable) {
Map<String, Object> params = genTable.getParams();
if (CollUtil.isEmpty(params) || CollUtil.isEmpty(genTable.getColumns())) {
return;
}
Set<String> validFields = new HashSet<>();
genTable.getColumns().forEach(column -> {
validFields.add(column.getColumnName());
validFields.add(column.getJavaField());
});
validateOptionField(validFields, params.get(GenConstants.STATUS_FIELD), "状态字段");
validateOptionField(validFields, params.get(GenConstants.SORT_FIELD), "排序字段");
validateOptionField(validFields, params.get(GenConstants.TREE_ANCESTORS), "树祖级字段");
validateOptionField(validFields, params.get(GenConstants.TREE_ORDER_FIELD), "树排序字段");
Object uniqueFields = params.get(GenConstants.UNIQUE_FIELDS);
if (uniqueFields instanceof Collection<?> collection) {
for (Object field : collection) {
validateOptionField(validFields, field, "组合唯一字段");
}
}
}
private void validateOptionField(Set<String> validFields, Object field, String label) {
if (ObjectUtil.isNull(field)) {
return;
}
String fieldValue = Convert.toStr(field);
if (StringUtils.isBlank(fieldValue)) {
return;
}
if (!validFields.contains(fieldValue)) {
throw new ServiceException(label + "不存在,请刷新字段后重试");
}
}
private void normalizeColumnOptions(List<GenTableColumn> columns) {
if (CollUtil.isEmpty(columns)) {
return;
}
for (GenTableColumn column : columns) {
if (!column.isDictColumn()) {
column.setDictType(StringUtils.EMPTY);
}
}
}
/**
* 查询业务表并补齐其列信息。
*
@@ -588,12 +624,32 @@ public class GenTableServiceImpl implements IGenTableService {
String treeName = paramsObj.getStr(GenConstants.TREE_NAME);
Long parentMenuId = paramsObj.getLong(GenConstants.PARENT_MENU_ID);
String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME);
Boolean enableExport = Convert.toBool(paramsObj.get(GenConstants.ENABLE_EXPORT), true);
Boolean enableStatus = Convert.toBool(paramsObj.get(GenConstants.ENABLE_STATUS), false);
String statusField = paramsObj.getStr(GenConstants.STATUS_FIELD);
Boolean enableUnique = Convert.toBool(paramsObj.get(GenConstants.ENABLE_UNIQUE), false);
List<String> uniqueFields = Convert.toList(String.class, paramsObj.get(GenConstants.UNIQUE_FIELDS));
Boolean enableSort = Convert.toBool(paramsObj.get(GenConstants.ENABLE_SORT), false);
String sortField = paramsObj.getStr(GenConstants.SORT_FIELD);
String treeRootValue = paramsObj.getStr(GenConstants.TREE_ROOT_VALUE);
String treeAncestorsField = paramsObj.getStr(GenConstants.TREE_ANCESTORS);
String treeOrderField = paramsObj.getStr(GenConstants.TREE_ORDER_FIELD);
genTable.setTreeCode(treeCode);
genTable.setTreeParentCode(treeParentCode);
genTable.setTreeName(treeName);
genTable.setParentMenuId(parentMenuId);
genTable.setParentMenuName(parentMenuName);
genTable.setEnableExport(enableExport);
genTable.setEnableStatus(enableStatus);
genTable.setStatusField(statusField);
genTable.setEnableUnique(enableUnique);
genTable.setUniqueFields(uniqueFields);
genTable.setEnableSort(enableSort);
genTable.setSortField(sortField);
genTable.setTreeRootValue(treeRootValue);
genTable.setTreeAncestorsField(treeAncestorsField);
genTable.setTreeOrderField(treeOrderField);
}
}
@@ -605,11 +661,12 @@ public class GenTableServiceImpl implements IGenTableService {
* @return 生成地址
*/
public static String getGenPath(GenTable table, String template) {
String relativePath = StringUtils.replace(TemplateEngineUtils.getFileName(template, table), "/", File.separator);
String genPath = table.getGenPath();
if (StringUtils.equals(genPath, "/")) {
return System.getProperty("user.dir") + File.separator + "src" + File.separator + TemplateEngineUtils.getFileName(template, table);
return System.getProperty("user.dir") + File.separator + "src" + File.separator + relativePath;
}
return genPath + File.separator + TemplateEngineUtils.getFileName(template, table);
return genPath + File.separator + relativePath;
}
}
@@ -50,13 +50,6 @@ public interface IGenTableService {
*/
List<GenTable> selectDbTableListByNames(String[] tableNames, String dataName);
/**
* 查询所有表信息
*
* @return 表信息集合
*/
List<GenTable> selectGenTableAll();
/**
* 查询业务信息
*
@@ -45,9 +45,11 @@ public class GenUtils {
* @param table 所属业务表对象
*/
public static void initColumnField(GenTableColumn column, GenTable table) {
String dataType = getDbType(column.getColumnType());
String dataType = getDbType(column.getColumnType()).toLowerCase();
// 统一转小写 避免有些数据库默认大写问题 如果需要特别书写方式 请在实体类增加注解标注别名
String columnName = column.getColumnName().toLowerCase();
Integer columnLength = getColumnLength(column.getColumnType());
Integer columnScale = getColumnScale(column.getColumnType());
column.setTableId(table.getTableId());
column.setCreateTime(null);
column.setUpdateTime(null);
@@ -59,17 +61,18 @@ public class GenUtils {
if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) {
// 字符串长度超过500设置为文本域
Integer columnLength = getColumnLength(column.getColumnType());
String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
if (isBooleanColumn(dataType, columnLength, columnScale, columnName)) {
column.setJavaType(GenConstants.TYPE_BOOLEAN);
htmlType = GenConstants.HTML_SWITCH;
}
column.setHtmlType(htmlType);
} else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) {
column.setJavaType(GenConstants.TYPE_DATE);
column.setHtmlType(GenConstants.HTML_DATETIME);
} else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) {
column.setHtmlType(GenConstants.HTML_INPUT);
// 数据库的数字字段与java不匹配 且很多数据库的数字字段很模糊 例如oracle只有number没有细分
// 所以默认数字类型全为Long可在界面上自行编辑想要的类型 有什么特殊需求也可以在这里特殊处理
column.setJavaType(GenConstants.TYPE_LONG);
column.setJavaType(resolveNumberJavaType(dataType, columnLength, columnScale, columnName));
column.setHtmlType(GenConstants.TYPE_BOOLEAN.equals(column.getJavaType()) ? GenConstants.HTML_SWITCH : GenConstants.HTML_INPUT_NUMBER);
}
// BO对象 默认插入勾选
@@ -93,29 +96,102 @@ public class GenUtils {
if (StringUtils.endsWithIgnoreCase(columnName, "name")) {
column.setQueryType(GenConstants.QUERY_LIKE);
}
if (GenConstants.HTML_DATETIME.equals(column.getHtmlType()) && column.isQuery()) {
column.setQueryType(GenConstants.QUERY_BETWEEN);
}
// 状态字段设置单选框
if (isSwitchColumn(columnName) || GenConstants.TYPE_BOOLEAN.equals(column.getJavaType())) {
column.setHtmlType(GenConstants.HTML_SWITCH);
}
// 状态字段设置单选框/开关
if (StringUtils.endsWithIgnoreCase(columnName, "status")) {
column.setHtmlType(GenConstants.HTML_RADIO);
column.setHtmlType(GenConstants.TYPE_BOOLEAN.equals(column.getJavaType()) ? GenConstants.HTML_SWITCH : GenConstants.HTML_RADIO);
}
// 类型&性别字段设置下拉框
else if (StringUtils.endsWithIgnoreCase(columnName, "type")
|| StringUtils.endsWithIgnoreCase(columnName, "sex")) {
column.setHtmlType(GenConstants.HTML_SELECT);
}
// 排序字段设置数字输入控件
else if (isSortColumn(columnName)) {
column.setHtmlType(GenConstants.HTML_INPUT_NUMBER);
}
// 图片字段设置图片上传控件
else if (StringUtils.endsWithIgnoreCase(columnName, "image")) {
else if (StringUtils.endsWithAny(columnName, "image", "avatar", "logo", "picture")) {
column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD);
}
// 文件字段设置文件上传控件
else if (StringUtils.endsWithIgnoreCase(columnName, "file")) {
else if (StringUtils.endsWithAny(columnName, "file", "attachment")) {
column.setHtmlType(GenConstants.HTML_FILE_UPLOAD);
}
// 备注描述类字段设置文本域
else if (StringUtils.endsWithAny(columnName, "remark", "description", "desc", "note")) {
column.setHtmlType(GenConstants.HTML_TEXTAREA);
}
// 内容字段设置富文本控件
else if (StringUtils.endsWithIgnoreCase(columnName, "content")) {
else if (StringUtils.endsWithAny(columnName, "content", "html", "body")) {
column.setHtmlType(GenConstants.HTML_EDITOR);
}
}
private static String resolveNumberJavaType(String dataType, Integer columnLength, Integer columnScale, String columnName) {
if (isBooleanColumn(dataType, columnLength, columnScale, columnName)) {
return GenConstants.TYPE_BOOLEAN;
}
if (arraysContains(new String[]{"decimal", "numeric", "money", "smallmoney"}, dataType)) {
return columnScale > 0 ? GenConstants.TYPE_BIGDECIMAL : resolveIntegerJavaType(columnLength);
}
if (arraysContains(new String[]{"float", "float4", "float8", "double", "real", "double precision"}, dataType)) {
return GenConstants.TYPE_DOUBLE;
}
if (arraysContains(new String[]{"bigint", "int8", "bigserial"}, dataType)) {
return GenConstants.TYPE_LONG;
}
if (arraysContains(new String[]{"smallint", "mediumint", "int", "int2", "int4", "integer", "smallserial", "serial"}, dataType)) {
return GenConstants.TYPE_INTEGER;
}
if (StringUtils.equals(dataType, "number")) {
if (columnScale > 0) {
return GenConstants.TYPE_BIGDECIMAL;
}
return resolveIntegerJavaType(columnLength);
}
return GenConstants.TYPE_LONG;
}
private static String resolveIntegerJavaType(Integer columnLength) {
if (columnLength > 0 && columnLength <= 9) {
return GenConstants.TYPE_INTEGER;
}
return GenConstants.TYPE_LONG;
}
private static boolean isBooleanColumn(String dataType, Integer columnLength, Integer columnScale, String columnName) {
if (columnScale > 0) {
return false;
}
if (StringUtils.equalsAny(dataType, "bit", "boolean", "bool")) {
return true;
}
if (StringUtils.equalsAny(dataType, "tinyint", "number", "numeric", "decimal", "char", "nchar")
&& columnLength == 1 && isSwitchColumn(columnName)) {
return true;
}
return false;
}
private static boolean isSwitchColumn(String columnName) {
return StringUtils.endsWithAny(columnName, "status", "flag", "enabled", "disabled", "available", "visible")
|| columnName.startsWith("is_")
|| columnName.startsWith("has_")
|| columnName.startsWith("enable_")
|| columnName.startsWith("disable_");
}
private static boolean isSortColumn(String columnName) {
return StringUtils.endsWithAny(columnName, "sort", "order_num", "order", "rank", "seq", "sequence");
}
/**
* 校验数组是否包含指定值
*
@@ -219,14 +295,30 @@ public class GenUtils {
*/
public static Integer getColumnLength(String columnType) {
if (StringUtils.indexOf(columnType, "(") > 0) {
String length = StringUtils.substringBetween(columnType, "(", ")");
String length = StringUtils.substringBetween(columnType, "(", ")").trim();
// 处理 decimal(10,2) 这类带精度的类型,只取长度部分
if (length.contains(",")) {
length = StringUtils.substringBefore(length, ",");
length = StringUtils.substringBefore(length, ",").trim();
}
return Integer.valueOf(length);
} else {
return 0;
}
}
/**
* 获取字段精度
*
* @param columnType 列类型
* @return 字段精度,未声明精度时返回 0
*/
public static Integer getColumnScale(String columnType) {
if (StringUtils.indexOf(columnType, "(") > 0) {
String length = StringUtils.substringBetween(columnType, "(", ")").trim();
if (length.contains(",")) {
return Integer.valueOf(StringUtils.substringAfter(length, ",").trim());
}
}
return 0;
}
}
@@ -3,6 +3,7 @@ package org.dromara.gen.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.template.TemplateEngine;
import cn.hutool.extra.template.TemplateUtil;
import lombok.AccessLevel;
@@ -108,6 +109,22 @@ public class TemplateEngineUtils {
Dict paramsObj = JsonUtils.parseMap(options);
String parentMenuId = getParentMenuId(paramsObj);
context.put("parentMenuId", parentMenuId);
boolean enableExport = getBooleanOption(paramsObj, GenConstants.ENABLE_EXPORT, true);
boolean enableStatus = getBooleanOption(paramsObj, GenConstants.ENABLE_STATUS, false);
boolean enableUnique = getBooleanOption(paramsObj, GenConstants.ENABLE_UNIQUE, false);
boolean enableSort = getBooleanOption(paramsObj, GenConstants.ENABLE_SORT, false);
GenTableColumn statusColumn = getColumn(genTable, paramsObj.getStr(GenConstants.STATUS_FIELD));
GenTableColumn sortColumn = getColumn(genTable, paramsObj.getStr(GenConstants.SORT_FIELD));
List<GenTableColumn> uniqueColumns = getColumns(genTable, paramsObj.get(GenConstants.UNIQUE_FIELDS));
context.put("enableExport", enableExport);
context.put("enableStatus", enableStatus && ObjectUtil.isNotNull(statusColumn));
context.put("statusColumn", statusColumn);
context.put("statusField", ObjectUtil.isNotNull(statusColumn) ? statusColumn.getJavaField() : StringUtils.EMPTY);
context.put("enableUnique", enableUnique && CollUtil.isNotEmpty(uniqueColumns));
context.put("uniqueColumns", uniqueColumns);
context.put("enableSort", enableSort && ObjectUtil.isNotNull(sortColumn));
context.put("sortColumn", sortColumn);
context.put("sortField", ObjectUtil.isNotNull(sortColumn) ? sortColumn.getJavaField() : StringUtils.EMPTY);
// 向树形模板上下文写入树字段相关变量
if (GenConstants.TPL_TREE.equals(tplCategory)) {
@@ -128,10 +145,21 @@ public class TemplateEngineUtils {
String treeCode = getTreeCode(paramsObj);
String treeParentCode = getTreeParentCode(paramsObj);
String treeName = getTreeName(paramsObj);
GenTableColumn treeParentColumn = getColumn(genTable, paramsObj.getStr(GenConstants.TREE_PARENT_CODE));
GenTableColumn treeAncestorsColumn = getColumn(genTable, paramsObj.getStr(GenConstants.TREE_ANCESTORS));
GenTableColumn treeOrderColumn = getColumn(genTable, paramsObj.getStr(GenConstants.TREE_ORDER_FIELD));
String treeRootValue = getTreeRootValue(paramsObj, treeParentColumn);
context.put("treeCode", treeCode);
context.put("treeParentCode", treeParentCode);
context.put("treeName", treeName);
context.put("treeParentColumn", treeParentColumn);
context.put("treeAncestorsField", ObjectUtil.isNotNull(treeAncestorsColumn) ? treeAncestorsColumn.getJavaField() : StringUtils.EMPTY);
context.put("treeOrderField", ObjectUtil.isNotNull(treeOrderColumn) ? treeOrderColumn.getJavaField() : StringUtils.EMPTY);
context.put("treeOrderColumn", treeOrderColumn);
context.put("treeRootValue", treeRootValue);
context.put("treeRootValueJavaLiteral", getJavaLiteral(treeParentColumn, treeRootValue));
context.put("treeRootValueTsLiteral", getTsLiteral(treeParentColumn, treeRootValue));
String expandTreeName = paramsObj.getStr(GenConstants.TREE_NAME);
int expandColumn = 0;
for (GenTableColumn column : genTable.getColumns()) {
@@ -307,7 +335,7 @@ public class TemplateEngineUtils {
for (GenTableColumn column : columns) {
if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny(
column.getHtmlType(),
new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX })) {
new String[] { GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX, GenConstants.HTML_SWITCH })) {
dicts.add("'" + column.getDictType() + "'");
}
}
@@ -376,4 +404,81 @@ public class TemplateEngineUtils {
}
return StringUtils.EMPTY;
}
/**
* 获取树根节点值。
*
* @param paramsObj 其他选项
* @param treeParentColumn 父节点字段
* @return 树根节点值
*/
public static String getTreeRootValue(Dict paramsObj, GenTableColumn treeParentColumn) {
String defaultValue = "0";
if (ObjectUtil.isNotNull(treeParentColumn) && StringUtils.equals(treeParentColumn.getJavaType(), GenConstants.TYPE_STRING)) {
defaultValue = "0";
}
if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.TREE_ROOT_VALUE)) {
return StringUtils.blankToDefault(paramsObj.getStr(GenConstants.TREE_ROOT_VALUE), defaultValue);
}
return defaultValue;
}
private static boolean getBooleanOption(Dict paramsObj, String key, boolean defaultValue) {
if (CollUtil.isEmpty(paramsObj) || !paramsObj.containsKey(key)) {
return defaultValue;
}
return Convert.toBool(paramsObj.get(key), defaultValue);
}
private static GenTableColumn getColumn(GenTable genTable, String field) {
if (StringUtils.isBlank(field) || CollUtil.isEmpty(genTable.getColumns())) {
return null;
}
for (GenTableColumn column : genTable.getColumns()) {
if (StringUtils.equalsAny(field, column.getColumnName(), column.getJavaField())) {
return column;
}
}
return null;
}
private static List<GenTableColumn> getColumns(GenTable genTable, Object fieldValues) {
List<String> fields = new ArrayList<>();
if (fieldValues instanceof Collection<?> collection) {
collection.stream().map(Convert::toStr).forEach(fields::add);
} else if (ObjectUtil.isNotNull(fieldValues)) {
fields.addAll(StringUtils.str2List(Convert.toStr(fieldValues), StringUtils.SEPARATOR, true, true));
}
List<GenTableColumn> columns = new ArrayList<>();
for (String field : fields) {
GenTableColumn column = getColumn(genTable, field);
if (ObjectUtil.isNotNull(column)) {
columns.add(column);
}
}
return columns;
}
private static String getJavaLiteral(GenTableColumn column, String value) {
if (ObjectUtil.isNull(column) || StringUtils.isBlank(value)) {
return "null";
}
if (StringUtils.equals(column.getJavaType(), GenConstants.TYPE_LONG)) {
return value + "L";
}
if (StringUtils.equalsAny(column.getJavaType(), GenConstants.TYPE_INTEGER, GenConstants.TYPE_DOUBLE, GenConstants.TYPE_BIGDECIMAL)) {
return value;
}
return "\"" + value + "\"";
}
private static String getTsLiteral(GenTableColumn column, String value) {
if (ObjectUtil.isNull(column) || StringUtils.isBlank(value)) {
return "undefined";
}
if (StringUtils.equalsAny(column.getJavaType(), GenConstants.TYPE_LONG, GenConstants.TYPE_INTEGER, GenConstants.TYPE_DOUBLE, GenConstants.TYPE_BIGDECIMAL)) {
return value;
}
return "'" + value + "'";
}
}