From 220d3589284be09c9cd254cfc7b50476d03c1f62 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Tue, 2 Dec 2025 23:09:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jeesite/modules/app/Job/dataJob.java | 74 +++++ .../com/jeesite/modules/app/Job/hostJob.java | 2 - .../modules/app/dao/DataTableField.java | 76 ----- .../modules/app/dao/DataTableInfo.java | 81 ------ .../jeesite/modules/app/dao/TableTree.java | 8 +- .../jeesite/modules/app/utils/MysqlUtils.java | 42 +-- .../jeesite/modules/app/utils/SqlUtils.java | 12 +- .../modules/biz/dao/BizTableFieldDao.java | 15 + .../modules/biz/entity/BizDbConfig.java | 2 +- .../modules/biz/entity/BizTableField.java | 130 +++++++++ .../modules/biz/entity/BizTableInfo.java | 7 +- .../biz/service/BizTableFieldService.java | 134 +++++++++ .../biz/web/BizTableFieldController.java | 150 ++++++++++ .../mappings/modules/biz/BizTableFieldDao.xml | 15 + web-vue/packages/biz/api/biz/tableField.ts | 58 ++++ .../packages/biz/views/biz/company/list.vue | 6 +- .../packages/biz/views/biz/dbConfig/list.vue | 6 +- .../packages/biz/views/biz/listItem/list.vue | 6 +- .../views/biz/projectRequirements/list.vue | 6 +- .../biz/views/biz/quickLogin/list.vue | 6 +- .../biz/views/biz/tableField/formImport.vue | 103 +++++++ .../biz/views/biz/tableField/list.vue | 271 ++++++++++++++++++ .../packages/biz/views/biz/tableInfo/list.vue | 6 +- .../biz/views/biz/websiteStorage/list.vue | 4 +- 24 files changed, 1007 insertions(+), 213 deletions(-) create mode 100644 web-api/src/main/java/com/jeesite/modules/app/Job/dataJob.java delete mode 100644 web-api/src/main/java/com/jeesite/modules/app/dao/DataTableField.java delete mode 100644 web-api/src/main/java/com/jeesite/modules/app/dao/DataTableInfo.java create mode 100644 web-api/src/main/java/com/jeesite/modules/biz/dao/BizTableFieldDao.java create mode 100644 web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableField.java create mode 100644 web-api/src/main/java/com/jeesite/modules/biz/service/BizTableFieldService.java create mode 100644 web-api/src/main/java/com/jeesite/modules/biz/web/BizTableFieldController.java create mode 100644 web-api/src/main/resources/mappings/modules/biz/BizTableFieldDao.xml create mode 100644 web-vue/packages/biz/api/biz/tableField.ts create mode 100644 web-vue/packages/biz/views/biz/tableField/formImport.vue create mode 100644 web-vue/packages/biz/views/biz/tableField/list.vue diff --git a/web-api/src/main/java/com/jeesite/modules/app/Job/dataJob.java b/web-api/src/main/java/com/jeesite/modules/app/Job/dataJob.java new file mode 100644 index 00000000..d2ced8b8 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/Job/dataJob.java @@ -0,0 +1,74 @@ +package com.jeesite.modules.app.Job; + +import com.jeesite.modules.app.dao.TableTree; +import com.jeesite.modules.app.utils.LoggerUtils; +import com.jeesite.modules.app.utils.MysqlUtils; +import com.jeesite.modules.biz.entity.BizDbConfig; +import com.jeesite.modules.biz.entity.BizTableField; +import com.jeesite.modules.biz.entity.BizTableInfo; +import com.jeesite.modules.biz.service.BizDbConfigService; +import com.jeesite.modules.biz.service.BizTableFieldService; +import com.jeesite.modules.biz.service.BizTableInfoService; +import jakarta.annotation.Resource; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Controller; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +@Controller +public class dataJob { + + + @Resource + private BizDbConfigService dbConfigService; + @Resource + private BizTableInfoService tableInfoService; + @Resource + private BizTableFieldService tableFieldService; + + + @Resource(name = "hostMonitorExecutor") + private ThreadPoolTaskExecutor hostMonitorExecutor; + + + private static final LoggerUtils logger = LoggerUtils.getInstance(); + + /** + * 数据字典更新 + */ + @Scheduled(cron = "10 30 2 * * ?") + public void getDataManager() { + BizDbConfig dbConfig = new BizDbConfig(); + dbConfig.setIsEnabled("1"); + List configList = dbConfigService.findList(dbConfig); + List> futures = new ArrayList<>(configList.size()); + for (BizDbConfig config : configList) { + CompletableFuture future = CompletableFuture.runAsync(() -> { + try { + List tableTrees = MysqlUtils.getTableTrees(config); + for (TableTree tableTree : tableTrees) { + BizTableInfo tableInfo = tableTree.getTableInfo(); + tableInfoService.insert(tableInfo); + List tableFields = tableTree.getTableFields(); + for (BizTableField tableField : tableFields) { + tableFieldService.insert(tableField); + } + } + } catch (Exception e) { + logger.error(e.getMessage()); + } + }, hostMonitorExecutor); // 指定使用配置的线程池 + futures.add(future); + } + try { + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .get(30, TimeUnit.SECONDS); + } catch (Exception e) { + logger.error(e.getMessage()); + } + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/app/Job/hostJob.java b/web-api/src/main/java/com/jeesite/modules/app/Job/hostJob.java index c239a847..1e75d4a4 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/Job/hostJob.java +++ b/web-api/src/main/java/com/jeesite/modules/app/Job/hostJob.java @@ -16,7 +16,6 @@ import com.jeesite.modules.app.utils.LoggerUtils; import com.jeesite.modules.app.utils.NetworkUtils; import com.jeesite.modules.biz.service.BizServerInfoService; import jakarta.annotation.Resource; -import org.apache.commons.collections.CollectionUtils; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Controller; @@ -24,7 +23,6 @@ import org.springframework.stereotype.Controller; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; @Controller public class hostJob { diff --git a/web-api/src/main/java/com/jeesite/modules/app/dao/DataTableField.java b/web-api/src/main/java/com/jeesite/modules/app/dao/DataTableField.java deleted file mode 100644 index 3c068e56..00000000 --- a/web-api/src/main/java/com/jeesite/modules/app/dao/DataTableField.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.jeesite.modules.app.dao; - - -import java.io.Serializable; -import java.time.LocalDateTime; - -import lombok.Data; - -/** - *

- * 数据表字段信息表 - *

- * - * @author gaoxq - * @since 2025-11-17 - */ -@Data -public class DataTableField implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 字段唯一标识(主键) - */ - private String fieldId; - - /** - * 关联的数据表ID(外键,关联data_table_info.table_id) - */ - private String tableId; - - /** - * 数据来源 - */ - private String dataSource; - - /** - * 数据表名称 - */ - private String dataName; - - /** - * 字段序号(表示字段在表中的顺序) - */ - private Integer fieldOrder; - - /** - * 字段类型(如:int、varchar、datetime等) - */ - private String fieldType; - - /** - * 字段名称 - */ - private String fieldName; - - /** - * 字段长度(如varchar(50)中的50,数值型可表示精度) - */ - private Long fieldLength; - - /** - * 字段说明 - */ - private String fieldRemark; - - /** - * 分区日期 - */ - private String ds; -} diff --git a/web-api/src/main/java/com/jeesite/modules/app/dao/DataTableInfo.java b/web-api/src/main/java/com/jeesite/modules/app/dao/DataTableInfo.java deleted file mode 100644 index 86e71d5f..00000000 --- a/web-api/src/main/java/com/jeesite/modules/app/dao/DataTableInfo.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.jeesite.modules.app.dao; - - -import lombok.Data; - -import java.io.Serializable; -import java.math.BigDecimal; - -/** - *

- * 数据表基础信息表 - *

- * - * @author gaoxq - * @since 2025-11-17 - */ -@Data -public class DataTableInfo implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 创建时间 - */ - private String createTime; - - /** - * 数据表唯一标识(主键) - */ - private String tableId; - - /** - * 数据表名称 - */ - private String dataName; - - /** - * 数据表描述 - */ - private String tableComment; - - /** - * 数据表大小(单位:MB) - */ - private BigDecimal tableSize; - - /** - * 数据来源(如:业务系统、文件导入等) - */ - private String dataSource; - - /** - * 创建人 - */ - private String creator; - - /** - * 记录条数 - */ - private Long dataRows; - - /** - * 更新时间 - */ - private String updateTime; - - /** - * 备注信息 - */ - private String remarks; - - /** - * 数据标识 - */ - private String dbId; - - /** - * 分区日期 - */ - private String ds; -} diff --git a/web-api/src/main/java/com/jeesite/modules/app/dao/TableTree.java b/web-api/src/main/java/com/jeesite/modules/app/dao/TableTree.java index c4775fac..8656d385 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/dao/TableTree.java +++ b/web-api/src/main/java/com/jeesite/modules/app/dao/TableTree.java @@ -1,6 +1,8 @@ package com.jeesite.modules.app.dao; +import com.jeesite.modules.biz.entity.BizTableField; +import com.jeesite.modules.biz.entity.BizTableInfo; import lombok.Data; import java.io.Serializable; @@ -9,14 +11,14 @@ import java.util.List; @Data public class TableTree implements Serializable { - DataTableInfo tableInfo; + BizTableInfo tableInfo; - List tableFields; + List tableFields; public TableTree() { } - public TableTree(DataTableInfo tableInfo, List tableFields) { + public TableTree(BizTableInfo tableInfo, List tableFields) { this.tableInfo = tableInfo; this.tableFields = tableFields; } diff --git a/web-api/src/main/java/com/jeesite/modules/app/utils/MysqlUtils.java b/web-api/src/main/java/com/jeesite/modules/app/utils/MysqlUtils.java index 732121b9..b1b03b6c 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/utils/MysqlUtils.java +++ b/web-api/src/main/java/com/jeesite/modules/app/utils/MysqlUtils.java @@ -1,16 +1,16 @@ package com.jeesite.modules.app.utils; -import com.jeesite.modules.app.dao.DataTableField; -import com.jeesite.modules.app.dao.DataTableInfo; import com.jeesite.modules.app.dao.TableTree; import com.jeesite.modules.biz.entity.BizDbConfig; +import com.jeesite.modules.biz.entity.BizTableField; +import com.jeesite.modules.biz.entity.BizTableInfo; import java.math.BigDecimal; import java.math.RoundingMode; import java.sql.*; -import java.time.LocalDateTime; import java.util.*; +import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -45,14 +45,14 @@ public class MysqlUtils { * @return 数据库名 -> 表信息列表(包含字段)的映射 * @throws Exception 连接或查询异常 */ - public static Map> getMysqlSchemaInfo(Connection conn) throws Exception { - Map> result = new HashMap<>(); + public static Map> getMysqlSchemaInfo(Connection conn) throws Exception { + Map> result = new HashMap<>(); // 1. 获取所有非系统数据库 List databases = getNonSystemDatabases(conn); logger.info("获取到非系统数据库数量:", databases.size()); // 2. 遍历数据库,获取表和字段信息 for (String dbName : databases) { - List tableInfos = getTablesByDatabase(conn, dbName); + List tableInfos = getTablesByDatabase(conn, dbName); result.put(dbName, tableInfos); } return result; @@ -81,8 +81,8 @@ public class MysqlUtils { /** * 获取指定数据库下的所有表信息(包含字段) */ - private static List getTablesByDatabase(Connection conn, String dbName) throws SQLException { - List tableInfos = new ArrayList<>(); + private static List getTablesByDatabase(Connection conn, String dbName) throws SQLException { + List tableInfos = new ArrayList<>(); String tableSql = "SELECT " + "TABLE_NAME, TABLE_COMMENT, CREATE_TIME, UPDATE_TIME, " + "DATA_LENGTH, INDEX_LENGTH, TABLE_ROWS " + @@ -91,8 +91,8 @@ public class MysqlUtils { tablePs.setString(1, dbName); try (ResultSet tableRs = tablePs.executeQuery()) { while (tableRs.next()) { - DataTableInfo tableInfo = buildDataTableInfo(tableRs, dbName); - List fields = getFieldsByTable(conn, dbName, tableInfo.getDataName()); + BizTableInfo tableInfo = buildDataTableInfo(tableRs, dbName); + List fields = getFieldsByTable(conn, dbName, tableInfo.getDataName()); fields.forEach(field -> field.setTableId(tableInfo.getTableId())); tableInfos.add(tableInfo); } @@ -104,8 +104,8 @@ public class MysqlUtils { /** * 构建DataTableInfo实体 */ - private static DataTableInfo buildDataTableInfo(ResultSet tableRs, String dbName) throws SQLException { - DataTableInfo tableInfo = new DataTableInfo(); + private static BizTableInfo buildDataTableInfo(ResultSet tableRs, String dbName) throws SQLException { + BizTableInfo tableInfo = new BizTableInfo(); tableInfo.setTableId(vId.getUid()); tableInfo.setDataName(tableRs.getString("TABLE_NAME")); tableInfo.setTableComment(tableRs.getString("TABLE_COMMENT")); @@ -127,8 +127,8 @@ public class MysqlUtils { /** * 获取指定表的字段信息 */ - private static List getFieldsByTable(Connection conn, String dbName, String tableName) throws SQLException { - List fields = new ArrayList<>(); + private static List getFieldsByTable(Connection conn, String dbName, String tableName) throws SQLException { + List fields = new ArrayList<>(); String fieldSql = "SELECT " + "TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,DATA_TYPE, COLUMN_TYPE, COLUMN_COMMENT, " + "ORDINAL_POSITION, CHARACTER_MAXIMUM_LENGTH " + @@ -149,8 +149,8 @@ public class MysqlUtils { /** * 构建DataTableField实体 */ - private static DataTableField buildDataTableField(ResultSet fieldRs) throws SQLException { - DataTableField field = new DataTableField(); + private static BizTableField buildDataTableField(ResultSet fieldRs) throws SQLException { + BizTableField field = new BizTableField(); field.setFieldId(vId.getUid()); field.setDataSource(fieldRs.getString("TABLE_SCHEMA")); field.setDataName(fieldRs.getString("TABLE_NAME")); @@ -163,7 +163,7 @@ public class MysqlUtils { length = extractLengthFromType(fieldRs.getString("COLUMN_TYPE")); } field.setFieldLength(length); - field.setCreateTime(LocalDateTime.now()); + field.setCreateTime(new Date()); field.setDs(vDate.dsValue()); return field; } @@ -188,11 +188,11 @@ public class MysqlUtils { List tableTrees = new ArrayList<>(); try { Connection conn = getConnection(dbConfig.getDbIp(), dbConfig.getDbPort(), dbConfig.getDbUsername(), dbConfig.getDbPassword()); - Map> schemaInfo = MysqlUtils.getMysqlSchemaInfo(conn); - for (Map.Entry> entry : schemaInfo.entrySet()) { - for (DataTableInfo tableInfo : entry.getValue()) { + Map> schemaInfo = MysqlUtils.getMysqlSchemaInfo(conn); + for (Map.Entry> entry : schemaInfo.entrySet()) { + for (BizTableInfo tableInfo : entry.getValue()) { tableInfo.setDbId(dbConfig.getId()); - List dataTableFields = getFieldsByTable(conn, entry.getKey(), tableInfo.getDataName()); + List dataTableFields = getFieldsByTable(conn, entry.getKey(), tableInfo.getDataName()); dataTableFields.stream().forEach(tableField -> tableField.setTableId(tableInfo.getTableId())); tableTrees.add(new TableTree(tableInfo, dataTableFields)); } diff --git a/web-api/src/main/java/com/jeesite/modules/app/utils/SqlUtils.java b/web-api/src/main/java/com/jeesite/modules/app/utils/SqlUtils.java index 03f3a1fc..97dbe9e5 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/utils/SqlUtils.java +++ b/web-api/src/main/java/com/jeesite/modules/app/utils/SqlUtils.java @@ -1,8 +1,8 @@ package com.jeesite.modules.app.utils; -import com.jeesite.modules.app.dao.DataTableField; -import com.jeesite.modules.app.dao.DataTableInfo; +import com.jeesite.modules.biz.entity.BizTableField; +import com.jeesite.modules.biz.entity.BizTableInfo; import java.util.List; @@ -16,13 +16,13 @@ public class SqlUtils { * @param fieldList 字段列表 * @return CREATE TABLE语句 */ - public static String CreateTableSql(DataTableInfo tableInfo, List fieldList) { + public static String CreateTableSql(BizTableInfo tableInfo, List fieldList) { StringBuilder sb = new StringBuilder(); // 表定义开始 sb.append("CREATE TABLE ").append(tableInfo.getDataName()).append(" (\n"); // 拼接字段定义 for (int i = 0; i < fieldList.size(); i++) { - DataTableField field = fieldList.get(i); + BizTableField field = fieldList.get(i); sb.append(" ").append(field.getFieldName()).append(" "); // 处理字段类型和长度 if (field.getFieldLength() != null && field.getFieldLength() > 0) { @@ -66,7 +66,7 @@ public class SqlUtils { * @param fieldList 字段列表 * @return 带注释的SELECT语句 */ - public static String SelectSqlComments(DataTableInfo tableInfo, List fieldList) { + public static String SelectSqlComments(BizTableInfo tableInfo, List fieldList) { StringBuilder sb = new StringBuilder(); // 表注释 sb.append("-- 表名:").append(tableInfo.getDataName()).append("\n"); @@ -76,7 +76,7 @@ public class SqlUtils { sb.append("SELECT\n"); // 拼接字段(带注释) for (int i = 0; i < fieldList.size(); i++) { - DataTableField field = fieldList.get(i); + BizTableField field = fieldList.get(i); // 拼接字段名 sb.append(" ").append(field.getFieldName()); // 非最后一个字段加逗号(先处理逗号) diff --git a/web-api/src/main/java/com/jeesite/modules/biz/dao/BizTableFieldDao.java b/web-api/src/main/java/com/jeesite/modules/biz/dao/BizTableFieldDao.java new file mode 100644 index 00000000..4418750b --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/biz/dao/BizTableFieldDao.java @@ -0,0 +1,15 @@ +package com.jeesite.modules.biz.dao; + +import com.jeesite.common.dao.CrudDao; +import com.jeesite.common.mybatis.annotation.MyBatisDao; +import com.jeesite.modules.biz.entity.BizTableField; + +/** + * 字段信息DAO接口 + * @author gaoxq + * @version 2025-12-02 + */ +@MyBatisDao(dataSourceName="work") +public interface BizTableFieldDao extends CrudDao { + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizDbConfig.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizDbConfig.java index 21d97ce5..0c67d6c8 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizDbConfig.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizDbConfig.java @@ -46,7 +46,7 @@ import java.io.Serial; @Column(name = "f_flow_id", attrName = "fflowId", label = "流程id", isUpdate = false, isQuery = false), @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "流程任务主键", isUpdate = false, isQuery = false), @Column(name = "f_flow_state", attrName = "fflowState", label = "流程任务状态", isUpdate = false, isQuery = false, isUpdateForce = true), -}, orderBy = "a.id DESC" +}, orderBy = "a.create_time DESC" ) @Data public class BizDbConfig extends DataEntity implements Serializable { diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableField.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableField.java new file mode 100644 index 00000000..29cd3919 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableField.java @@ -0,0 +1,130 @@ +package com.jeesite.modules.biz.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.jeesite.common.mybatis.annotation.JoinTable; +import com.jeesite.common.mybatis.annotation.JoinTable.Type; +import com.fasterxml.jackson.annotation.JsonFormat; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import jakarta.validation.constraints.NotNull; + +import com.jeesite.common.entity.DataEntity; +import com.jeesite.common.mybatis.annotation.Column; +import com.jeesite.common.mybatis.annotation.Table; +import com.jeesite.common.mybatis.mapper.query.QueryType; +import com.jeesite.common.utils.excel.annotation.ExcelField; +import com.jeesite.common.utils.excel.annotation.ExcelField.Align; +import com.jeesite.common.utils.excel.annotation.ExcelFields; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 字段信息Entity + * + * @author gaoxq + * @version 2025-12-02 + */ +@EqualsAndHashCode(callSuper = true) +@Table(name = "biz_table_field", alias = "a", label = "字段信息信息", columns = { + @Column(name = "create_time", attrName = "createTime", label = "创建时间", isUpdate = false, isUpdateForce = true), + @Column(name = "field_id", attrName = "fieldId", label = "唯一标识", isPK = true), + @Column(name = "table_id", attrName = "tableId", label = "数据标识"), + @Column(name = "data_source", attrName = "dataSource", label = "数据来源"), + @Column(name = "data_name", attrName = "dataName", label = "数据表名称", queryType = QueryType.LIKE), + @Column(name = "field_order", attrName = "fieldOrder", label = "字段序号", isQuery = false), + @Column(name = "field_type", attrName = "fieldType", label = "字段类型", isQuery = false), + @Column(name = "field_name", attrName = "fieldName", label = "字段名称", queryType = QueryType.LIKE), + @Column(name = "field_length", attrName = "fieldLength", label = "字段长度", isQuery = false), + @Column(name = "field_remark", attrName = "fieldRemark", label = "字段说明"), + @Column(name = "ds", attrName = "ds", label = "分区日期"), + @Column(name = "f_tenant_id", attrName = "ftenantId", label = "租户id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_id", attrName = "fflowId", label = "流程id", isUpdate = false, isQuery = false), + @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "流程任务主键", isUpdate = false, isQuery = false), + @Column(name = "f_flow_state", attrName = "fflowState", label = "流程任务状态", isUpdate = false, isQuery = false, isUpdateForce = true), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = BizTableInfo.class, attrName = "this", alias = "b", + on = "a.table_id = b.table_id AND a.ds = b.ds", + columns = { + @Column(name = "table_comment", attrName = "tableComment", label = "数据表描述"), + @Column(name = "db_id", attrName = "dbId", label = "数据标识"), + }), + @JoinTable(type = Type.LEFT_JOIN, entity = BizDbConfig.class, attrName = "this", alias = "c", + on = "b.db_id = c.id", + columns = { + @Column(name = "db_type", attrName = "dbType", label = "数据库类型"), + @Column(name = "db_name", attrName = "dbName", label = "数据库名称"), + @Column(name = "db_ip", attrName = "dbIp", label = "数据库IP"), + + }), +}, orderBy = "a.create_time DESC" +) +@Data +public class BizTableField extends DataEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + private Date createTime; // 创建时间 + private String fieldId; // 唯一标识 + private String tableId; // 数据标识 + private String dataSource; // 数据来源 + private String dataName; // 数据表名称 + private Integer fieldOrder; // 字段序号 + private String fieldType; // 字段类型 + private String fieldName; // 字段名称 + private Long fieldLength; // 字段长度 + private String fieldRemark; // 字段说明 + private String ds; // 分区日期 + private String ftenantId; // 租户id + private String fflowId; // 流程id + private String fflowTaskId; // 流程任务主键 + private Integer fflowState; // 流程任务状态 + + private String dbId; + private String tableComment; + + private String dbType; + private String dbName; + private String dbIp; + + @ExcelFields({ + @ExcelField(title = "创建时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), + @ExcelField(title = "唯一标识", attrName = "fieldId", align = Align.CENTER, sort = 20), + @ExcelField(title = "数据标识", attrName = "dbName", align = Align.CENTER, sort = 30), + @ExcelField(title = "数据来源", attrName = "dataSource", align = Align.CENTER, sort = 40), + @ExcelField(title = "数据表名称", attrName = "dataName", align = Align.CENTER, sort = 50), + @ExcelField(title = "字段序号", attrName = "fieldOrder", align = Align.CENTER, sort = 60), + @ExcelField(title = "字段类型", attrName = "fieldType", align = Align.CENTER, sort = 70), + @ExcelField(title = "字段名称", attrName = "fieldName", align = Align.CENTER, sort = 80), + @ExcelField(title = "字段长度", attrName = "fieldLength", align = Align.CENTER, sort = 90), + @ExcelField(title = "字段说明", attrName = "fieldRemark", align = Align.CENTER, sort = 100), + @ExcelField(title = "分区日期", attrName = "ds", align = Align.CENTER, sort = 110), + }) + public BizTableField() { + this(null); + } + + public BizTableField(String id) { + super(id); + } + + public Date getCreateTime_gte() { + return sqlMap.getWhere().getValue("create_time", QueryType.GTE); + } + + public void setCreateTime_gte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.GTE, createTime); + } + + public Date getCreateTime_lte() { + return sqlMap.getWhere().getValue("create_time", QueryType.LTE); + } + + public void setCreateTime_lte(Date createTime) { + sqlMap.getWhere().and("create_time", QueryType.LTE, createTime); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableInfo.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableInfo.java index 42d6ccfa..39574ec9 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableInfo.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizTableInfo.java @@ -1,6 +1,7 @@ package com.jeesite.modules.biz.entity; import java.io.Serializable; +import java.math.BigDecimal; import java.util.Date; import com.jeesite.common.mybatis.annotation.JoinTable; @@ -58,15 +59,15 @@ public class BizTableInfo extends DataEntity implements Serializab @Serial private static final long serialVersionUID = 1L; - private Date createTime; // 创建时间 + private String createTime; // 创建时间 private String tableId; // 唯一标识 private String dataName; // 数据表名称 private String tableComment; // 数据表描述 - private Double tableSize; // 数据表大小 + private BigDecimal tableSize; // 数据表大小 private String dataSource; // 数据来源 private String creator; // 创建人员 private Long dataRows; // 记录条数 - private Date updateTime; // 更新时间 + private String updateTime; // 更新时间 private String dbId; // 数据标识 private String ds; // 分区日期 private String ftenantId; // 租户id diff --git a/web-api/src/main/java/com/jeesite/modules/biz/service/BizTableFieldService.java b/web-api/src/main/java/com/jeesite/modules/biz/service/BizTableFieldService.java new file mode 100644 index 00000000..c746b3a8 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/biz/service/BizTableFieldService.java @@ -0,0 +1,134 @@ +package com.jeesite.modules.biz.service; + +import java.util.List; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.jeesite.common.entity.Page; +import com.jeesite.common.service.CrudService; +import com.jeesite.modules.biz.entity.BizTableField; +import com.jeesite.modules.biz.dao.BizTableFieldDao; +import com.jeesite.common.service.ServiceException; +import com.jeesite.common.config.Global; +import com.jeesite.common.validator.ValidatorUtils; +import com.jeesite.common.utils.excel.ExcelImport; +import org.springframework.web.multipart.MultipartFile; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; + +/** + * 字段信息Service + * @author gaoxq + * @version 2025-12-02 + */ +@Service +public class BizTableFieldService extends CrudService { + + /** + * 获取单条数据 + * @param bizTableField 主键 + */ + @Override + public BizTableField get(BizTableField bizTableField) { + return super.get(bizTableField); + } + + /** + * 查询分页数据 + * @param bizTableField 查询条件 + * @param bizTableField page 分页对象 + */ + @Override + public Page findPage(BizTableField bizTableField) { + return super.findPage(bizTableField); + } + + /** + * 查询列表数据 + * @param bizTableField 查询条件 + */ + @Override + public List findList(BizTableField bizTableField) { + return super.findList(bizTableField); + } + + /** + * 保存数据(插入或更新) + * @param bizTableField 数据对象 + */ + @Override + @Transactional + public void save(BizTableField bizTableField) { + super.save(bizTableField); + } + + /** + * 导入数据 + * @param file 导入的数据文件 + */ + @Transactional + public String importData(MultipartFile file) { + if (file == null){ + throw new ServiceException(text("请选择导入的数据文件!")); + } + int successNum = 0; int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + try(ExcelImport ei = new ExcelImport(file, 2, 0)){ + List list = ei.getDataList(BizTableField.class); + for (BizTableField bizTableField : list) { + try{ + ValidatorUtils.validateWithException(bizTableField); + this.save(bizTableField); + successNum++; + successMsg.append("
" + successNum + "、编号 " + bizTableField.getId() + " 导入成功"); + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、编号 " + bizTableField.getId() + " 导入失败:"; + if (e instanceof ConstraintViolationException){ + ConstraintViolationException cve = (ConstraintViolationException)e; + for (ConstraintViolation violation : cve.getConstraintViolations()) { + msg += Global.getText(violation.getMessage()) + " ("+violation.getPropertyPath()+")"; + } + }else{ + msg += e.getMessage(); + } + failureMsg.append(msg); + logger.error(msg, e); + } + } + } catch (Exception e) { + logger.error(e.getMessage(), e); + failureMsg.append(e.getMessage()); + return failureMsg.toString(); + } + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + }else{ + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + /** + * 更新状态 + * @param bizTableField 数据对象 + */ + @Override + @Transactional + public void updateStatus(BizTableField bizTableField) { + super.updateStatus(bizTableField); + } + + /** + * 删除数据 + * @param bizTableField 数据对象 + */ + @Override + @Transactional + public void delete(BizTableField bizTableField) { + super.delete(bizTableField); + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizTableFieldController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizTableFieldController.java new file mode 100644 index 00000000..0043516c --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizTableFieldController.java @@ -0,0 +1,150 @@ +package com.jeesite.modules.biz.web; + +import java.util.List; + +import com.jeesite.modules.app.utils.vDate; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.jeesite.common.config.Global; +import com.jeesite.common.collect.ListUtils; +import com.jeesite.common.entity.Page; +import com.jeesite.common.lang.DateUtils; +import com.jeesite.common.utils.excel.ExcelExport; +import com.jeesite.common.utils.excel.annotation.ExcelField.Type; +import org.springframework.web.multipart.MultipartFile; +import com.jeesite.common.web.BaseController; +import com.jeesite.modules.biz.entity.BizTableField; +import com.jeesite.modules.biz.service.BizTableFieldService; + +/** + * 字段信息Controller + * + * @author gaoxq + * @version 2025-12-02 + */ +@Controller +@RequestMapping(value = "${adminPath}/biz/tableField") +public class BizTableFieldController extends BaseController { + + private final BizTableFieldService bizTableFieldService; + + public BizTableFieldController(BizTableFieldService bizTableFieldService) { + this.bizTableFieldService = bizTableFieldService; + } + + /** + * 获取数据 + */ + @ModelAttribute + public BizTableField get(String fieldId, boolean isNewRecord) { + return bizTableFieldService.get(fieldId, isNewRecord); + } + + /** + * 查询列表 + */ + @RequiresPermissions("biz:tableField:view") + @RequestMapping(value = {"list", ""}) + public String list(BizTableField bizTableField, Model model) { + model.addAttribute("bizTableField", bizTableField); + return "modules/biz/bizTableFieldList"; + } + + /** + * 查询列表数据 + */ + @RequiresPermissions("biz:tableField:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(BizTableField bizTableField, HttpServletRequest request, HttpServletResponse response) { + bizTableField.setDs(vDate.dsValue()); + bizTableField.setPage(new Page<>(request, response)); + Page page = bizTableFieldService.findPage(bizTableField); + return page; + } + + /** + * 查看编辑表单 + */ + @RequiresPermissions("biz:tableField:view") + @RequestMapping(value = "form") + public String form(BizTableField bizTableField, Model model) { + model.addAttribute("bizTableField", bizTableField); + return "modules/biz/bizTableFieldForm"; + } + + /** + * 保存数据 + */ + @RequiresPermissions("biz:tableField:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated BizTableField bizTableField) { + bizTableFieldService.save(bizTableField); + return renderResult(Global.TRUE, text("保存字段信息成功!")); + } + + /** + * 导出数据 + */ + @RequiresPermissions("biz:tableField:view") + @RequestMapping(value = "exportData") + public void exportData(BizTableField bizTableField, HttpServletResponse response) { + List list = bizTableFieldService.findList(bizTableField); + String fileName = "字段信息" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("字段信息", BizTableField.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载模板 + */ + @RequiresPermissions("biz:tableField:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + BizTableField bizTableField = new BizTableField(); + List list = ListUtils.newArrayList(bizTableField); + String fileName = "字段信息模板.xlsx"; + try (ExcelExport ee = new ExcelExport("字段信息", BizTableField.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入数据 + */ + @ResponseBody + @RequiresPermissions("biz:tableField:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = bizTableFieldService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 删除数据 + */ + @RequiresPermissions("biz:tableField:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(BizTableField bizTableField) { + bizTableFieldService.delete(bizTableField); + return renderResult(Global.TRUE, text("删除字段信息成功!")); + } + +} \ No newline at end of file diff --git a/web-api/src/main/resources/mappings/modules/biz/BizTableFieldDao.xml b/web-api/src/main/resources/mappings/modules/biz/BizTableFieldDao.xml new file mode 100644 index 00000000..a2ded9ae --- /dev/null +++ b/web-api/src/main/resources/mappings/modules/biz/BizTableFieldDao.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/web-vue/packages/biz/api/biz/tableField.ts b/web-vue/packages/biz/api/biz/tableField.ts new file mode 100644 index 00000000..980e65e8 --- /dev/null +++ b/web-vue/packages/biz/api/biz/tableField.ts @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2013-Now http://jeesite.com All rights reserved. + * No deletion without permission, or be held responsible to law. + * @author gaoxq + */ +import { defHttp } from '@jeesite/core/utils/http/axios'; +import { useGlobSetting } from '@jeesite/core/hooks/setting'; +import { BasicModel, Page } from '@jeesite/core/api/model/baseModel'; +import { UploadApiResult } from '@jeesite/core/api/sys/upload'; +import { UploadFileParams } from '@jeesite/types/axios'; +import { AxiosProgressEvent } from 'axios'; + +const { ctxPath, adminPath } = useGlobSetting(); + +export interface BizTableField extends BasicModel { + createTime?: string; // 创建时间 + fieldId?: string; // 唯一标识 + tableId: string; // 数据标识 + dataSource?: string; // 数据来源 + dataName?: string; // 数据表名称 + fieldOrder: number; // 字段序号 + fieldType: string; // 字段类型 + fieldName: string; // 字段名称 + fieldLength?: string; // 字段长度 + fieldRemark?: string; // 字段说明 + ds?: string; // 分区日期 + ftenantId?: string; // 租户id + fflowId?: string; // 流程id + fflowTaskId?: string; // 流程任务主键 + fflowState?: number; // 流程任务状态 +} + +export const bizTableFieldList = (params?: BizTableField | any) => + defHttp.get({ url: adminPath + '/biz/tableField/list', params }); + +export const bizTableFieldListData = (params?: BizTableField | any) => + defHttp.post>({ url: adminPath + '/biz/tableField/listData', params }); + +export const bizTableFieldForm = (params?: BizTableField | any) => + defHttp.get({ url: adminPath + '/biz/tableField/form', params }); + +export const bizTableFieldSave = (params?: any, data?: BizTableField | any) => + defHttp.postJson({ url: adminPath + '/biz/tableField/save', params, data }); + +export const bizTableFieldImportData = ( + params: UploadFileParams, + onUploadProgress: (progressEvent: AxiosProgressEvent) => void, +) => + defHttp.uploadFile( + { + url: ctxPath + adminPath + '/biz/tableField/importData', + onUploadProgress, + }, + params, + ); + +export const bizTableFieldDelete = (params?: BizTableField | any) => + defHttp.get({ url: adminPath + '/biz/tableField/delete', params }); diff --git a/web-vue/packages/biz/views/biz/company/list.vue b/web-vue/packages/biz/views/biz/company/list.vue index 2375a40f..b02103ec 100644 --- a/web-vue/packages/biz/views/biz/company/list.vue +++ b/web-vue/packages/biz/views/biz/company/list.vue @@ -61,7 +61,7 @@ labelWidth: 90, schemas: [ { - label: t('记录日期起'), + label: t('记录时间起'), field: 'createTime_gte', component: 'DatePicker', componentProps: { @@ -70,7 +70,7 @@ }, }, { - label: t('记录日期止'), + label: t('记录时间止'), field: 'createTime_lte', component: 'DatePicker', componentProps: { @@ -112,7 +112,7 @@ const tableColumns: BasicColumn[] = [ { - title: t('记录日期'), + title: t('记录时间'), dataIndex: 'createTime', key: 'a.create_time', sorter: true, diff --git a/web-vue/packages/biz/views/biz/dbConfig/list.vue b/web-vue/packages/biz/views/biz/dbConfig/list.vue index a5edfc1f..83f0e7b7 100644 --- a/web-vue/packages/biz/views/biz/dbConfig/list.vue +++ b/web-vue/packages/biz/views/biz/dbConfig/list.vue @@ -61,7 +61,7 @@ labelWidth: 90, schemas: [ { - label: t('创建时间起'), + label: t('记录时间起'), field: 'createTime_gte', component: 'DatePicker', componentProps: { @@ -70,7 +70,7 @@ }, }, { - label: t('创建时间止'), + label: t('记录时间止'), field: 'createTime_lte', component: 'DatePicker', componentProps: { @@ -116,7 +116,7 @@ const tableColumns: BasicColumn[] = [ { - title: t('创建时间'), + title: t('记录时间'), dataIndex: 'createTime', key: 'a.create_time', sorter: true, diff --git a/web-vue/packages/biz/views/biz/listItem/list.vue b/web-vue/packages/biz/views/biz/listItem/list.vue index 36cb87a8..08bb07f1 100644 --- a/web-vue/packages/biz/views/biz/listItem/list.vue +++ b/web-vue/packages/biz/views/biz/listItem/list.vue @@ -64,7 +64,7 @@ labelWidth: 90, schemas: [ { - label: t('创建时间起'), + label: t('记录时间起'), field: 'createTime_gte', component: 'DatePicker', componentProps: { @@ -73,7 +73,7 @@ }, }, { - label: t('创建时间止'), + label: t('记录时间止'), field: 'createTime_lte', component: 'DatePicker', componentProps: { @@ -123,7 +123,7 @@ const tableColumns: BasicColumn[] = [ { - title: t('创建时间'), + title: t('记录时间'), dataIndex: 'createTime', key: 'a.create_time', sorter: true, diff --git a/web-vue/packages/biz/views/biz/projectRequirements/list.vue b/web-vue/packages/biz/views/biz/projectRequirements/list.vue index 7090a88c..31778046 100644 --- a/web-vue/packages/biz/views/biz/projectRequirements/list.vue +++ b/web-vue/packages/biz/views/biz/projectRequirements/list.vue @@ -61,7 +61,7 @@ labelWidth: 90, schemas: [ { - label: t('记录日期起'), + label: t('记录时间起'), field: 'createTime_gte', component: 'DatePicker', componentProps: { @@ -70,7 +70,7 @@ }, }, { - label: t('记录日期止'), + label: t('记录时间止'), field: 'createTime_lte', component: 'DatePicker', componentProps: { @@ -148,7 +148,7 @@ const tableColumns: BasicColumn[] = [ { - title: t('记录日期'), + title: t('记录时间'), dataIndex: 'createTime', key: 'a.create_time', sorter: true, diff --git a/web-vue/packages/biz/views/biz/quickLogin/list.vue b/web-vue/packages/biz/views/biz/quickLogin/list.vue index f2705e1e..017514cf 100644 --- a/web-vue/packages/biz/views/biz/quickLogin/list.vue +++ b/web-vue/packages/biz/views/biz/quickLogin/list.vue @@ -52,7 +52,7 @@ labelWidth: 90, schemas: [ { - label: t('创建时间起'), + label: t('记录时间起'), field: 'createTime_gte', component: 'DatePicker', componentProps: { @@ -61,7 +61,7 @@ }, }, { - label: t('创建时间止'), + label: t('记录时间止'), field: 'createTime_lte', component: 'DatePicker', componentProps: { @@ -79,7 +79,7 @@ const tableColumns: BasicColumn[] = [ { - title: t('创建时间'), + title: t('记录时间'), dataIndex: 'createTime', key: 'a.create_time', sorter: true, diff --git a/web-vue/packages/biz/views/biz/tableField/formImport.vue b/web-vue/packages/biz/views/biz/tableField/formImport.vue new file mode 100644 index 00000000..97ee9800 --- /dev/null +++ b/web-vue/packages/biz/views/biz/tableField/formImport.vue @@ -0,0 +1,103 @@ + + + diff --git a/web-vue/packages/biz/views/biz/tableField/list.vue b/web-vue/packages/biz/views/biz/tableField/list.vue new file mode 100644 index 00000000..057b364f --- /dev/null +++ b/web-vue/packages/biz/views/biz/tableField/list.vue @@ -0,0 +1,271 @@ + + + diff --git a/web-vue/packages/biz/views/biz/tableInfo/list.vue b/web-vue/packages/biz/views/biz/tableInfo/list.vue index 53fff2ac..f8544cd3 100644 --- a/web-vue/packages/biz/views/biz/tableInfo/list.vue +++ b/web-vue/packages/biz/views/biz/tableInfo/list.vue @@ -51,7 +51,7 @@ labelWidth: 90, schemas: [ { - label: t('创建时间起'), + label: t('记录时间起'), field: 'createTime_gte', component: 'DatePicker', componentProps: { @@ -60,7 +60,7 @@ }, }, { - label: t('创建时间止'), + label: t('记录时间止'), field: 'createTime_lte', component: 'DatePicker', componentProps: { @@ -102,7 +102,7 @@ const tableColumns: BasicColumn[] = [ { - title: t('创建时间'), + title: t('记录时间'), dataIndex: 'createTime', key: 'a.create_time', sorter: true, diff --git a/web-vue/packages/biz/views/biz/websiteStorage/list.vue b/web-vue/packages/biz/views/biz/websiteStorage/list.vue index 2ee72b5a..dab5460a 100644 --- a/web-vue/packages/biz/views/biz/websiteStorage/list.vue +++ b/web-vue/packages/biz/views/biz/websiteStorage/list.vue @@ -61,7 +61,7 @@ labelWidth: 90, schemas: [ { - label: t('记录日期起'), + label: t('记录时间起'), field: 'createTime_gte', component: 'DatePicker', componentProps: { @@ -70,7 +70,7 @@ }, }, { - label: t('记录日期止'), + label: t('记录时间止'), field: 'createTime_lte', component: 'DatePicker', componentProps: {