From e30929f6f74c0dbf778db7f89b984e007b0dc8de Mon Sep 17 00:00:00 2001 From: junzhangfm Date: Mon, 16 Mar 2026 17:07:55 +0800 Subject: [PATCH] =?UTF-8?q?2026-03-16=E6=8F=90=E4=BA=A4=EF=BC=9A=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=AF=BC=E5=85=A5=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++ .../power/grid/config/AsyncConfig.java | 28 ++++++ .../power/grid/controller/DnerController.java | 27 +++--- .../power/grid/dao/DataExcelMapper.java | 18 ---- .../power/grid/dao/ImportTaskMapper.java | 16 ++++ .../grid/entity/DailyPowerOutageEventVO.java | 10 +- .../power/grid/entity/ImportTask.java | 34 +++++++ .../grid/enums/ImportTaskStatusEnum.java | 36 +++++++ .../grid/listener/DataExcelListener.java | 94 ++++++++++++------- .../grid/service/IImportTaskService.java | 16 ++++ .../service/impl/AsyncImportServiceImpl.java | 56 +++++++++++ .../DnerDailyPowerOutageEventServiceImpl.java | 10 +- .../service/impl/ImportTaskServiceImpl.java | 67 +++++++++++++ src/main/resources/mapper/DataExcelMapper.xml | 10 -- src/main/resources/sql/20260313-001.sql | 15 +++ 15 files changed, 366 insertions(+), 78 deletions(-) create mode 100644 src/main/java/com/southern/power/grid/config/AsyncConfig.java delete mode 100644 src/main/java/com/southern/power/grid/dao/DataExcelMapper.java create mode 100644 src/main/java/com/southern/power/grid/dao/ImportTaskMapper.java create mode 100644 src/main/java/com/southern/power/grid/entity/ImportTask.java create mode 100644 src/main/java/com/southern/power/grid/enums/ImportTaskStatusEnum.java create mode 100644 src/main/java/com/southern/power/grid/service/IImportTaskService.java create mode 100644 src/main/java/com/southern/power/grid/service/impl/AsyncImportServiceImpl.java create mode 100644 src/main/java/com/southern/power/grid/service/impl/ImportTaskServiceImpl.java delete mode 100644 src/main/resources/mapper/DataExcelMapper.xml diff --git a/pom.xml b/pom.xml index 1cfa029..0cbb550 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,13 @@ 3.3.2 + + + cn.hutool + hutool-all + 5.8.25 + + org.springframework.boot diff --git a/src/main/java/com/southern/power/grid/config/AsyncConfig.java b/src/main/java/com/southern/power/grid/config/AsyncConfig.java new file mode 100644 index 0000000..a17cd37 --- /dev/null +++ b/src/main/java/com/southern/power/grid/config/AsyncConfig.java @@ -0,0 +1,28 @@ +package com.southern.power.grid.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * 异步配置 + * + * @author: junzhangfm + * @date: 2026/3/16 + **/ +@Configuration +public class AsyncConfig { + @Bean + public Executor asyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + // 核心线程数 + executor.setCorePoolSize(5); + executor.setMaxPoolSize(10); + executor.setQueueCapacity(100); + executor.setThreadNamePrefix("async-import-"); + executor.initialize(); + return executor; + } +} diff --git a/src/main/java/com/southern/power/grid/controller/DnerController.java b/src/main/java/com/southern/power/grid/controller/DnerController.java index 832ed0d..8b8f016 100644 --- a/src/main/java/com/southern/power/grid/controller/DnerController.java +++ b/src/main/java/com/southern/power/grid/controller/DnerController.java @@ -1,17 +1,16 @@ package com.southern.power.grid.controller; -import com.alibaba.excel.EasyExcel; import com.southern.power.grid.common.Result; import com.southern.power.grid.entity.*; -import com.southern.power.grid.listener.DataExcelListener; import com.southern.power.grid.service.IDnerDailyPowerOutageEventService; import com.southern.power.grid.service.IDnerHourlyPowerOutageEventService; import com.southern.power.grid.service.IDnerSiteAreaConfigurationService; +import com.southern.power.grid.service.IImportTaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.InputStream; import java.util.List; /** @@ -25,7 +24,7 @@ import java.util.List; @Slf4j public class DnerController { @Autowired - private DataExcelListener dataExcelListener; + private IImportTaskService importTaskService; @Autowired private IDnerHourlyPowerOutageEventService dnerHourlyPowerOutageEventService; @@ -74,17 +73,21 @@ public class DnerController { } /** - * 通过easyexcel流式读取导入数据 + * 通过easyexcel流式读取导入数据 -- 异步导入 * - * @param inputStream 文件流 + * @param file 文件 * @return 返回结果 */ @PostMapping("/excel/import") - public Result importExcel(@RequestParam("file") InputStream inputStream) { - // 采用easyExcel流式读取,一行一行读,不加载整个excel文件,防止OOM - EasyExcel.read(inputStream, DataExcelEntity.class, dataExcelListener) - .sheet() - .doRead(); - return Result.success(Boolean.TRUE); + public Result importExcel(@RequestParam("file") MultipartFile file) { + String taskNo = importTaskService.importExcel(file); + return Result.success(taskNo); + } + + // 2. 查询导入进度 + @GetMapping("/progress/{taskNo}") + public Result getProgress(@PathVariable String taskNo) { + ImportTask task = importTaskService.getProgress(taskNo); + return Result.success(task); } } diff --git a/src/main/java/com/southern/power/grid/dao/DataExcelMapper.java b/src/main/java/com/southern/power/grid/dao/DataExcelMapper.java deleted file mode 100644 index fb90719..0000000 --- a/src/main/java/com/southern/power/grid/dao/DataExcelMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.southern.power.grid.dao; - -import com.southern.power.grid.entity.DataExcelEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * excel数据-mapper类 - * - * @author: junzhangfm - * @date: 2026/3/13 - **/ -@Mapper -public interface DataExcelMapper { - void batchInsert(@Param("list") List list); -} diff --git a/src/main/java/com/southern/power/grid/dao/ImportTaskMapper.java b/src/main/java/com/southern/power/grid/dao/ImportTaskMapper.java new file mode 100644 index 0000000..5e5a1b1 --- /dev/null +++ b/src/main/java/com/southern/power/grid/dao/ImportTaskMapper.java @@ -0,0 +1,16 @@ +package com.southern.power.grid.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.southern.power.grid.entity.ImportTask; +import org.apache.ibatis.annotations.Mapper; + +/** + * 导入任务Mapper类 + * + * @author: junzhangfm + * @date: 2026/3/16 + **/ +@Mapper +public interface ImportTaskMapper extends BaseMapper { + +} diff --git a/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java b/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java index 3dc5457..bb50e67 100644 --- a/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java +++ b/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java @@ -17,6 +17,11 @@ public class DailyPowerOutageEventVO { */ private List fullDates; + /** + * 日累计停电影响数 + */ + private List userCounts; + /** * K线数组,每一项包含起始值、结束值、最低、最高 */ @@ -55,5 +60,8 @@ public class DailyPowerOutageEventVO { */ private List minTemp; - + /** + * 风速 + */ + private List windSpeed; } diff --git a/src/main/java/com/southern/power/grid/entity/ImportTask.java b/src/main/java/com/southern/power/grid/entity/ImportTask.java new file mode 100644 index 0000000..389c691 --- /dev/null +++ b/src/main/java/com/southern/power/grid/entity/ImportTask.java @@ -0,0 +1,34 @@ +package com.southern.power.grid.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +/** + * 导入任务 -- 实体类 + * + * @author: junzhangfm + * @date: 2026/3/16 + **/ +@Data +@TableName("import_task") +public class ImportTask { + private Long id; + + private String taskNo; + + private Integer total; + + private Integer successCount; + + private Integer failCount; + + private String status; + + private String failMsg; + + private Date createTime; + + private Date updateTime; +} diff --git a/src/main/java/com/southern/power/grid/enums/ImportTaskStatusEnum.java b/src/main/java/com/southern/power/grid/enums/ImportTaskStatusEnum.java new file mode 100644 index 0000000..f9a419f --- /dev/null +++ b/src/main/java/com/southern/power/grid/enums/ImportTaskStatusEnum.java @@ -0,0 +1,36 @@ +package com.southern.power.grid.enums; + +/** + * 导入任务状态枚举 + * + * @author: junzhangfm + * @date: 2026/3/16 + **/ +public enum ImportTaskStatusEnum { + // 定义 5 个状态:编码 + 描述 + WAITING("WAITING", "等待执行"), + PROCESSING("PROCESSING", "正在导入"), + PART_SUCCESS("PART_SUCCESS", "部分成功"), + SUCCESS("SUCCESS", "全部成功"), + FAILED("FAILED", "导入失败"); + + // 状态值(存入数据库的值) + private final String code; + // 状态描述 + private final String desc; + + ImportTaskStatusEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + // 获取状态值(你要的就是这个) + public String getCode() { + return code; + } + + // 获取描述 + public String getDesc() { + return desc; + } +} diff --git a/src/main/java/com/southern/power/grid/listener/DataExcelListener.java b/src/main/java/com/southern/power/grid/listener/DataExcelListener.java index fa3958b..373de2c 100644 --- a/src/main/java/com/southern/power/grid/listener/DataExcelListener.java +++ b/src/main/java/com/southern/power/grid/listener/DataExcelListener.java @@ -2,18 +2,20 @@ package com.southern.power.grid.listener; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; -import com.southern.power.grid.dao.DataExcelMapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.southern.power.grid.dao.ImportTaskMapper; import com.southern.power.grid.entity.DataExcelEntity; +import com.southern.power.grid.entity.ImportTask; +import com.southern.power.grid.enums.ImportTaskStatusEnum; import com.southern.power.grid.service.impl.HourlyOutageExcelProcessService; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.support.DefaultTransactionDefinition; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * 数据导入逻辑 -- easyexcel事件监听器 @@ -21,6 +23,7 @@ import java.util.List; * @author: junzhangfm * @date: 2026/3/13 **/ +@Slf4j @Component public class DataExcelListener extends AnalysisEventListener { @@ -28,33 +31,32 @@ public class DataExcelListener extends AnalysisEventListener { private static final int BATCH_SIZE = 500; // 缓存数据 - private List cacheList = new ArrayList<>(BATCH_SIZE); + private final List cacheList = new ArrayList<>(BATCH_SIZE); @Autowired - // 注入 Mapper - private final DataExcelMapper dataExcelMapper; + private ImportTaskMapper importTaskMapper; @Autowired - // 手动事务管理器 - private final PlatformTransactionManager transactionManager; - - @Resource private HourlyOutageExcelProcessService hourlyOutageExcelProcessService; - // 构造方法 -- 交给spring容器创建 - public DataExcelListener(DataExcelMapper dataExcelMapper, PlatformTransactionManager transactionManager) { - this.dataExcelMapper = dataExcelMapper; - this.transactionManager = transactionManager; - } + // 注入任务 + @Setter + private ImportTask task; + + private int success = 0; + + private int fail = 0; // 逐行读取(不会OOM) @Override public void invoke(DataExcelEntity data, AnalysisContext context) { - //TODO 待完善 等志明拿到具体数据再导入到数据库中 - cacheList.add(data); - // 达到批次数量 → 插入数据库 - if (cacheList.size() >= BATCH_SIZE) { - batchInsert(); + if (!Objects.isNull(data)) { + //TODO 待完善 等志明拿到具体数据再导入到数据库中 + cacheList.add(data); + // 达到批次数量 → 插入数据库 + if (cacheList.size() >= BATCH_SIZE) { + batchInsert(); + } } } @@ -64,28 +66,48 @@ public class DataExcelListener extends AnalysisEventListener { if (!cacheList.isEmpty()) { batchInsert(); } + // 更新任务状态 + if (fail == 0) { + task.setStatus(ImportTaskStatusEnum.SUCCESS.getCode()); // 全部成功,没有失败的 + } else { + if (success > 0) { + task.setStatus(ImportTaskStatusEnum.PART_SUCCESS.getCode()); // 部分成功,含成功和失败的 + } else { + task.setStatus(ImportTaskStatusEnum.FAILED.getCode()); // 部分成功,含成功和失败的 + } + + } + importTaskMapper.update(null, new LambdaUpdateWrapper() + .set(ImportTask::getStatus, task.getStatus()) // 任务状态 + .eq(ImportTask::getTaskNo, task.getTaskNo())); + // bean在单例模式下要初始化值 + success = 0; + fail = 0; + task = null; } // ==================== 核心:分批插入 + 手动事务 ==================== private void batchInsert() { - // 开启事务 - DefaultTransactionDefinition def = new DefaultTransactionDefinition(); - TransactionStatus status = transactionManager.getTransaction(def); - try { // 批量插入(500条) hourlyOutageExcelProcessService.process(cacheList); - - // 提交事务 - transactionManager.commit(status); - - // 清空缓存(极其重要!防OOM) - cacheList.clear(); - + success += cacheList.size(); } catch (Exception e) { - // 回滚 - transactionManager.rollback(status); - throw new RuntimeException("导入失败,已回滚:" + e.getMessage()); + fail += cacheList.size(); + log.error("导入失败", e); + } finally { + // 更新进度 + updateProgress(); + cacheList.clear(); // 清空缓存(极其重要!防OOM) } } + + // 更新任务进度 + private void updateProgress() { + importTaskMapper.update(null, new LambdaUpdateWrapper() + .set(ImportTask::getSuccessCount, success) // 成功数 + .set(ImportTask::getFailCount, fail) // 失败数 + .set(ImportTask::getTotal, success + fail) // 总数据量 + .eq(ImportTask::getTaskNo, task.getTaskNo())); + } } diff --git a/src/main/java/com/southern/power/grid/service/IImportTaskService.java b/src/main/java/com/southern/power/grid/service/IImportTaskService.java new file mode 100644 index 0000000..15699d6 --- /dev/null +++ b/src/main/java/com/southern/power/grid/service/IImportTaskService.java @@ -0,0 +1,16 @@ +package com.southern.power.grid.service; + +import com.southern.power.grid.entity.ImportTask; +import org.springframework.web.multipart.MultipartFile; + +/** + * 导入任务Service类 + * + * @author: junzhangfm + * @date: 2026/3/16 + **/ +public interface IImportTaskService { + String importExcel(MultipartFile file); + + ImportTask getProgress(String taskNo); +} diff --git a/src/main/java/com/southern/power/grid/service/impl/AsyncImportServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/AsyncImportServiceImpl.java new file mode 100644 index 0000000..da3e841 --- /dev/null +++ b/src/main/java/com/southern/power/grid/service/impl/AsyncImportServiceImpl.java @@ -0,0 +1,56 @@ +package com.southern.power.grid.service.impl; + +import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.southern.power.grid.dao.ImportTaskMapper; +import com.southern.power.grid.entity.DataExcelEntity; +import com.southern.power.grid.entity.ImportTask; +import com.southern.power.grid.enums.ImportTaskStatusEnum; +import com.southern.power.grid.listener.DataExcelListener; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; + +/** + * 异步导入实现类 + * + * @author: junzhangfm + * @date: 2026/3/16 + **/ +@Service +@Slf4j +public class AsyncImportServiceImpl { + @Autowired + private ImportTaskMapper importTaskMapper; + + @Autowired + private DataExcelListener dataExcelListener; + + @Async("asyncExecutor") + public void doAsyncImport(InputStream inputStream, ImportTask task) { + try { + // 更新为导入中 + importTaskMapper.update(null, new LambdaUpdateWrapper() + .set(ImportTask::getStatus, ImportTaskStatusEnum.PROCESSING.getCode()) + .eq(ImportTask::getTaskNo, task.getTaskNo())); + + // 注入任务 + dataExcelListener.setTask(task); + // 采用easyExcel流式读取,一行一行读,不加载整个excel文件,防止OOM + EasyExcel.read(inputStream, DataExcelEntity.class, dataExcelListener) + .sheet() + .doRead(); + + } catch (Exception e) { + importTaskMapper.update(null, new LambdaUpdateWrapper() + .set(ImportTask::getStatus, ImportTaskStatusEnum.FAILED.getCode()) // 失败状态 + .set(ImportTask::getFailMsg, e.getMessage()) // 更新原因 + .eq(ImportTask::getTaskNo, task.getTaskNo())); + log.error("导入异常", e); + } + } +} diff --git a/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventServiceImpl.java index 8104746..7ccd0a2 100644 --- a/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventServiceImpl.java +++ b/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventServiceImpl.java @@ -35,11 +35,13 @@ public class DnerDailyPowerOutageEventServiceImpl Map dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap( DnerDailyPowerOutageEvent::getDataTime, Function.identity(), (k1, k2) -> k1)); List> kline = new ArrayList<>(); + List userCounts = new ArrayList<>(); List cumulativeRain = new ArrayList<>(); List avgRain = new ArrayList<>(); List avgTemp = new ArrayList<>(); List maxTemp = new ArrayList<>(); List minTemp = new ArrayList<>(); + List windSpeed = new ArrayList<>(); List ma5List = new ArrayList<>(); List ma10List = new ArrayList<>(); List ma20List = new ArrayList<>(); @@ -59,6 +61,8 @@ public class DnerDailyPowerOutageEventServiceImpl ma10List.add(0); ma20List.add(0); ma30List.add(0); + windSpeed.add(0.0); + userCounts.add(0); } else { List klineE = Arrays.asList(event.getStarUserCount(), event.getEndUserCount(), event.getMinUserCount(), event.getMaxUserCount()); @@ -72,6 +76,8 @@ public class DnerDailyPowerOutageEventServiceImpl ma10List.add(getMa(event, dateTimeAndEntityMap, 10)); ma20List.add(getMa(event, dateTimeAndEntityMap, 20)); ma30List.add(getMa(event, dateTimeAndEntityMap, 30)); + windSpeed.add(Double.valueOf(event.getExtremeWindSpeedHourly())); + userCounts.add(event.getUserCount()); } }); DailyPowerOutageEventVO result = new DailyPowerOutageEventVO(); @@ -86,6 +92,8 @@ public class DnerDailyPowerOutageEventServiceImpl result.setMa10(ma10List); result.setMa20(ma20List); result.setMa30(ma30List); + result.setWindSpeed(windSpeed); + result.setUserCounts(userCounts); return result; } @@ -98,7 +106,7 @@ public class DnerDailyPowerOutageEventServiceImpl for (String date : maDateList) { DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date); if (!Objects.isNull(outageEvent)) { - userCount += outageEvent.getUserCount(); + userCount += outageEvent.getEndUserCount(); } } return userCount/maNum; diff --git a/src/main/java/com/southern/power/grid/service/impl/ImportTaskServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/ImportTaskServiceImpl.java new file mode 100644 index 0000000..00308e3 --- /dev/null +++ b/src/main/java/com/southern/power/grid/service/impl/ImportTaskServiceImpl.java @@ -0,0 +1,67 @@ +package com.southern.power.grid.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.southern.power.grid.dao.ImportTaskMapper; +import com.southern.power.grid.entity.ImportTask; +import com.southern.power.grid.enums.ImportTaskStatusEnum; +import com.southern.power.grid.service.IImportTaskService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * 导入任务 -- service实现类 + * + * @author: junzhangfm + * @date: 2026/3/16 + **/ +@Service +@Slf4j +public class ImportTaskServiceImpl extends ServiceImpl + implements IImportTaskService { + @Autowired + private ImportTaskMapper importTaskMapper; + + @Autowired + private AsyncImportServiceImpl asyncImportService; + + @Override + public String importExcel(MultipartFile file) { + // 通过hutool工具类生成唯一任务号 + String taskNo = IdUtil.fastSimpleUUID(); + + // 创建任务 + ImportTask task = new ImportTask(); + task.setTaskNo(taskNo); + task.setStatus(ImportTaskStatusEnum.WAITING.getCode()); + task.setTotal(0); + importTaskMapper.insert(task); + + // 异步执行导入 + // 把上传的文件流转成 **字节数组输入流**,保存到内存,避免Tomcat删除 + InputStream inputStream; + try { + inputStream = new ByteArrayInputStream(file.getBytes()); + } catch (IOException e) { + log.error("file exception!"); + throw new RuntimeException(e); + } + asyncImportService.doAsyncImport(inputStream, task); + + // 立即返回任务ID给前端 + return taskNo; + } + + + @Override + public ImportTask getProgress(String taskNo) { + return importTaskMapper.selectOne(new LambdaQueryWrapper().eq(ImportTask::getTaskNo, taskNo)); + } +} diff --git a/src/main/resources/mapper/DataExcelMapper.xml b/src/main/resources/mapper/DataExcelMapper.xml deleted file mode 100644 index e33125a..0000000 --- a/src/main/resources/mapper/DataExcelMapper.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/sql/20260313-001.sql b/src/main/resources/sql/20260313-001.sql index beda655..2001d15 100644 --- a/src/main/resources/sql/20260313-001.sql +++ b/src/main/resources/sql/20260313-001.sql @@ -1,3 +1,18 @@ +-- 导入任务表 +CREATE TABLE import_task +( + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '任务ID', + task_no VARCHAR(64) NOT NULL UNIQUE COMMENT '任务唯一编号', + total INT DEFAULT 0 COMMENT '总数据量', + success_count INT DEFAULT 0 COMMENT '成功数量', + fail_count INT DEFAULT 0 COMMENT '失败数量', + status VARCHAR(20) DEFAULT 'WAITING' COMMENT 'WAITING/PROCESSING/SUCCESS/FAILED/COMPLETED', + fail_msg TEXT COMMENT '失败原因', + create_time DATETIME DEFAULT CURRENT_TIMESTAMP, + update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT '导入任务表'; + -- 行政区划配置表 CREATE TABLE `dner_site_area_configuration` (