From 6258c2dda51e26e950e72cc2382262986a341881 Mon Sep 17 00:00:00 2001
From: yexb <553699424@qq.com>
Date: Thu, 30 Apr 2026 09:01:43 +0800
Subject: [PATCH] =?UTF-8?q?feat(tools):=20=E6=96=B0=E5=A2=9E=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E8=A1=A5=E5=BD=95=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 实现批量写入组件,支持 INSERT IGNORE 操作和降级逐行写入
- 添加表定义注册器,自动解析 SQL 元数据并注册 13 张补数表
- 集成异步任务执行器,支持后台补数任务提交和状态管理
- 创建数据补录控制器,提供预估、创建和查询任务状态接口
- 实现时间槽计算和数据生成逻辑,支持多相别数据补录
- 添加线程池配置和任务状态持有器,确保任务并发执行安全
- 创建预览功能,估算补数任务的规模和影响范围
---
AGENTS.md | 1 +
entrance/pom.xml | 5 +
tools/add-data/pom.xml | 41 ++
.../adddata/component/AddDataBatchWriter.java | 135 ++++
.../component/AddDataTableRegistry.java | 152 +++++
.../component/AddDataTaskExecutor.java | 310 ++++++++++
.../component/AddDataTaskStatusHolder.java | 240 ++++++++
.../component/AddDataTemplateRegistry.java | 97 +++
.../component/AddDataTimeSlotCalculator.java | 77 +++
.../component/AddDataValueGenerator.java | 579 ++++++++++++++++++
.../adddata/config/AddDataExecutorConfig.java | 37 ++
.../controller/AddDataTaskController.java | 90 +++
.../controller/AddDataTemplateController.java | 49 ++
.../pojo/bo/AddDataBatchWriteResult.java | 38 ++
.../pojo/bo/AddDataTableDefinition.java | 64 ++
.../adddata/pojo/bo/AddDataTaskCommand.java | 34 +
.../pojo/enums/AddDataTaskStatusEnum.java | 15 +
.../pojo/param/AddDataTaskRequestParam.java | 35 ++
.../pojo/vo/AddDataPreviewTableVO.java | 22 +
.../adddata/pojo/vo/AddDataPreviewVO.java | 25 +
.../adddata/pojo/vo/AddDataTaskCreateVO.java | 16 +
.../adddata/pojo/vo/AddDataTaskStatusVO.java | 46 ++
.../adddata/pojo/vo/AddDataTemplateVO.java | 46 ++
.../adddata/service/AddDataTaskService.java | 36 ++
.../service/AddDataTemplateService.java | 18 +
.../service/impl/AddDataTaskServiceImpl.java | 142 +++++
.../impl/AddDataTemplateServiceImpl.java | 25 +
.../adddata/util/AddDataDateTimeUtil.java | 51 ++
.../component/AddDataTableRegistryTest.java | 28 +
.../AddDataTaskStatusHolderTest.java | 33 +
.../AddDataTemplateRegistryTest.java | 33 +
.../AddDataTimeSlotCalculatorTest.java | 61 ++
.../component/AddDataValueGeneratorTest.java | 32 +
tools/pom.xml | 1 +
34 files changed, 2614 insertions(+)
create mode 100644 tools/add-data/pom.xml
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataBatchWriter.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataTableRegistry.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataTaskExecutor.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataTaskStatusHolder.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataTemplateRegistry.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataTimeSlotCalculator.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataValueGenerator.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/config/AddDataExecutorConfig.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/controller/AddDataTaskController.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/controller/AddDataTemplateController.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/bo/AddDataBatchWriteResult.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/bo/AddDataTableDefinition.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/bo/AddDataTaskCommand.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/enums/AddDataTaskStatusEnum.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/param/AddDataTaskRequestParam.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/vo/AddDataPreviewTableVO.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/vo/AddDataPreviewVO.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/vo/AddDataTaskCreateVO.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/vo/AddDataTaskStatusVO.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/pojo/vo/AddDataTemplateVO.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/service/AddDataTaskService.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/service/AddDataTemplateService.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/service/impl/AddDataTaskServiceImpl.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/service/impl/AddDataTemplateServiceImpl.java
create mode 100644 tools/add-data/src/main/java/com/njcn/gather/tool/adddata/util/AddDataDateTimeUtil.java
create mode 100644 tools/add-data/src/test/java/com/njcn/gather/tool/adddata/component/AddDataTableRegistryTest.java
create mode 100644 tools/add-data/src/test/java/com/njcn/gather/tool/adddata/component/AddDataTaskStatusHolderTest.java
create mode 100644 tools/add-data/src/test/java/com/njcn/gather/tool/adddata/component/AddDataTemplateRegistryTest.java
create mode 100644 tools/add-data/src/test/java/com/njcn/gather/tool/adddata/component/AddDataTimeSlotCalculatorTest.java
create mode 100644 tools/add-data/src/test/java/com/njcn/gather/tool/adddata/component/AddDataValueGeneratorTest.java
diff --git a/AGENTS.md b/AGENTS.md
index 1488a3c..709a9c5 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -33,6 +33,7 @@ Java 源码位于 `src/main/java`,配置文件位于 `src/main/resources`,My
## 代码风格与命名规范
保持现有 Java 风格:4 空格缩进、UTF-8 文件编码、基础包名使用 `com.njcn.gather`。命名沿用分层后缀,如 `*Controller`、`*Service`、`*ServiceImpl`、`*Mapper`、`*Param`、`*PO`、`*VO`。优先复用现有 Lombok 注解,如 `@Data`、`@RequiredArgsConstructor`、`@Slf4j`。Mapper XML 文件名应与接口名保持一致。业务代码中,关键流程、分支判断、状态流转或容易误解的节点需要补充简洁的中文注释,但不要添加无信息量的注释。
+- 参照 `user` 模块的组织方式,Controller 与 Service 都按职责拆分;不同职责的方法放到不同 `*Controller`、`*Service`、`*ServiceImpl` 中,同一模块后续新增方法也要沿既有职责边界归类,不再回退为单一大类承载全部接口。
## 数据与 SQL 约束
- 新增业务表的 DO 优先复用当前 `BaseDO` / 审计字段风格;除非表本身明确不需要逻辑删除,不要再引入另一套审计基类。
diff --git a/entrance/pom.xml b/entrance/pom.xml
index 24d6a1d..2a3e7b2 100644
--- a/entrance/pom.xml
+++ b/entrance/pom.xml
@@ -48,6 +48,11 @@
mms-mapping
1.0.0
+
+ com.njcn.gather
+ add-data
+ 1.0.0
+
diff --git a/tools/add-data/pom.xml b/tools/add-data/pom.xml
new file mode 100644
index 0000000..73e794f
--- /dev/null
+++ b/tools/add-data/pom.xml
@@ -0,0 +1,41 @@
+
+
+ 4.0.0
+
+ com.njcn.gather
+ tools
+ 1.0.0
+
+
+ add-data
+
+
+
+
+
+
+ com.njcn
+ njcn-common
+ 0.0.1
+
+
+
+ com.njcn
+ spingboot2.3.12
+ 2.3.12
+
+
+
+ org.springframework
+ spring-jdbc
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
diff --git a/tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataBatchWriter.java b/tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataBatchWriter.java
new file mode 100644
index 0000000..75a0118
--- /dev/null
+++ b/tools/add-data/src/main/java/com/njcn/gather/tool/adddata/component/AddDataBatchWriter.java
@@ -0,0 +1,135 @@
+package com.njcn.gather.tool.adddata.component;
+
+import com.njcn.gather.tool.adddata.pojo.bo.AddDataBatchWriteResult;
+import com.njcn.gather.tool.adddata.pojo.bo.AddDataTableDefinition;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 批量写入组件。
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class AddDataBatchWriter {
+
+ /** JDBC 模板。 */
+ private final JdbcTemplate jdbcTemplate;
+
+ /**
+ * 写入一个批次。
+ *
+ * @param definition 表定义
+ * @param rows 行数据
+ * @return 写入结果
+ */
+ public AddDataBatchWriteResult writeBatch(AddDataTableDefinition definition, List> rows) {
+ if (rows == null || rows.isEmpty()) {
+ return new AddDataBatchWriteResult(0L, 0L, 0L, null);
+ }
+ try {
+ return executeInsertIgnore(definition, rows);
+ } catch (DataAccessException ex) {
+ log.warn("批量写入失败,开始降级为逐行写入,table={}, batchSize={}, message={}",
+ definition.getTableName(), rows.size(), resolveErrorMessage(ex));
+ return fallbackWriteOneByOne(definition, rows, ex);
+ }
+ }
+
+ /**
+ * 执行批量 INSERT IGNORE。
+ *
+ * @param definition 表定义
+ * @param rows 行数据
+ * @return 写入结果
+ */
+ private AddDataBatchWriteResult executeInsertIgnore(AddDataTableDefinition definition, List> rows) {
+ String sql = buildInsertIgnoreSql(definition, rows.size());
+ List