From e50c4662dc4ebdd7f07d17187caa89e9addb9762 Mon Sep 17 00:00:00 2001 From: hekaiyu <13673834656@163.com> Date: Tue, 14 Oct 2025 15:57:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=97=A5=E5=BF=97=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/base/entity/StasSyncLog.java | 43 +++++++ .../modules/base/entity/StasSyncNum.java | 37 ++++++ .../modules/base/entity/StasSyncRecord.java | 51 ++++++++ .../base/mapper/StasSyncLogMapper.java | 14 +++ .../base/mapper/StasSyncNumMapper.java | 14 +++ .../base/mapper/StasSyncRecordMapper.java | 14 +++ .../base/mapper/xml/StasSyncLogMapper.xml | 5 + .../base/mapper/xml/StasSyncNumMapper.xml | 5 + .../base/mapper/xml/StasSyncRecordMapper.xml | 5 + .../controller/StasSyncLogController.java | 57 +++++++++ .../syncLog/service/IStasSyncLogService.java | 14 +++ .../service/impl/StasSyncLogServiceImpl.java | 21 ++++ .../controller/StasSyncNumController.java | 84 +++++++++++++ .../syncNum/service/IStasSyncNumService.java | 14 +++ .../service/impl/StasSyncNumServiceImpl.java | 19 +++ .../java/org/jeecg/syncNum/vo/PieChartVO.java | 13 ++ .../controller/StasSyncRecordController.java | 113 ++++++++++++++++++ .../service/IStasSyncRecordService.java | 14 +++ .../impl/StasSyncRecordServiceImpl.java | 19 +++ .../org/jeecg/syncRecord/vo/SyncRecordVO.java | 42 +++++++ .../org/jeecg/taskConfig/job/SyncDataJob.java | 75 ++++++++---- 21 files changed, 651 insertions(+), 22 deletions(-) create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncLog.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncNum.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncRecord.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncLogMapper.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncNumMapper.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncRecordMapper.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncNumMapper.xml create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncRecordMapper.xml create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncLog/controller/StasSyncLogController.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/IStasSyncLogService.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/impl/StasSyncLogServiceImpl.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncNum/controller/StasSyncNumController.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/IStasSyncNumService.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/impl/StasSyncNumServiceImpl.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncNum/vo/PieChartVO.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncRecord/controller/StasSyncRecordController.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/IStasSyncRecordService.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/impl/StasSyncRecordServiceImpl.java create mode 100644 jeecg-module-sync/src/main/java/org/jeecg/syncRecord/vo/SyncRecordVO.java diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncLog.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncLog.java new file mode 100644 index 0000000..a7b8bf8 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncLog.java @@ -0,0 +1,43 @@ +package org.jeecg.modules.base.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 同步日志信息 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Data +@TableName("stas_sync_log") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class StasSyncLog implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /**记录id*/ + @Excel(name = "记录id", width = 15) + private String recordId; + /**开始时间*/ + @Excel(name = "开始时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date startTime; + /**描述*/ + @Excel(name = "描述", width = 15) + private String description; +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncNum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncNum.java new file mode 100644 index 0000000..703bf10 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncNum.java @@ -0,0 +1,37 @@ +package org.jeecg.modules.base.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 同步数量 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Data +@TableName("stas_sync_num") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class StasSyncNum implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /**记录id*/ + @Excel(name = "记录id", width = 15) + private String recordId; + /**同步表名*/ + @Excel(name = "同步表名", width = 15) + private String tableName; + /**同步数据条数*/ + @Excel(name = "同步数据条数", width = 15) + private Integer syncNum; +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncRecord.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncRecord.java new file mode 100644 index 0000000..5846b32 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/StasSyncRecord.java @@ -0,0 +1,51 @@ +package org.jeecg.modules.base.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * @Description: 同步记录表 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Data +@TableName("stas_sync_record") +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = false) +public class StasSyncRecord implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + private String id; + /**任务id*/ + @Excel(name = "任务id", width = 15) + private String taskId; + /**源库id*/ + @Excel(name = "源库id", width = 15) + private String sourceId; + /**目标库id*/ + @Excel(name = "目标库id", width = 15) + private String targetId; + /**开始时间*/ + @Excel(name = "开始时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date startTime; + /**结束时间*/ + @Excel(name = "结束时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date endTime; +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncLogMapper.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncLogMapper.java new file mode 100644 index 0000000..f4f3dd3 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncLogMapper.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.base.mapper; + +import org.jeecg.modules.base.entity.StasSyncLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 同步日志信息 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +public interface StasSyncLogMapper extends BaseMapper { + +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncNumMapper.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncNumMapper.java new file mode 100644 index 0000000..088d1c5 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncNumMapper.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.base.mapper; + +import org.jeecg.modules.base.entity.StasSyncNum; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 同步数量 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +public interface StasSyncNumMapper extends BaseMapper { + +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncRecordMapper.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncRecordMapper.java new file mode 100644 index 0000000..25a907c --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/StasSyncRecordMapper.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.base.mapper; + +import org.jeecg.modules.base.entity.StasSyncRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * @Description: 同步记录表 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +public interface StasSyncRecordMapper extends BaseMapper { + +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml new file mode 100644 index 0000000..8927f33 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncLogMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncNumMapper.xml b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncNumMapper.xml new file mode 100644 index 0000000..20e019a --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncNumMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncRecordMapper.xml b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncRecordMapper.xml new file mode 100644 index 0000000..9aa7611 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/xml/StasSyncRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncLog/controller/StasSyncLogController.java b/jeecg-module-sync/src/main/java/org/jeecg/syncLog/controller/StasSyncLogController.java new file mode 100644 index 0000000..f7362c9 --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncLog/controller/StasSyncLogController.java @@ -0,0 +1,57 @@ +package org.jeecg.syncLog.controller; + +import jakarta.servlet.http.HttpServletRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.base.entity.StasSyncLog; +import org.jeecg.syncLog.service.IStasSyncLogService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + /** + * @Description: 同步日志信息 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Tag(name="同步日志信息") +@RestController +@RequestMapping("/stasSyncLog") +@Slf4j +public class StasSyncLogController extends JeecgController { + @Autowired + private IStasSyncLogService stasSyncLogService; + + /** + * 分页列表查询 + * + * @param stasSyncLog + * @param pageNo + * @param pageSize + * @param req + * @return + */ + @Operation(summary = "同步日志信息-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(StasSyncLog stasSyncLog, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(stasSyncLog, req.getParameterMap()); + queryWrapper.orderByAsc("start_time"); + Page page = new Page(pageNo, pageSize); + IPage pageList = stasSyncLogService.page(page, queryWrapper); + return Result.OK(pageList); + } + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/IStasSyncLogService.java b/jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/IStasSyncLogService.java new file mode 100644 index 0000000..8e66cc0 --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/IStasSyncLogService.java @@ -0,0 +1,14 @@ +package org.jeecg.syncLog.service; + +import org.jeecg.modules.base.entity.StasSyncLog; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 同步日志信息 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +public interface IStasSyncLogService extends IService { + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/impl/StasSyncLogServiceImpl.java b/jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/impl/StasSyncLogServiceImpl.java new file mode 100644 index 0000000..7c70990 --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncLog/service/impl/StasSyncLogServiceImpl.java @@ -0,0 +1,21 @@ +package org.jeecg.syncLog.service.impl; + +import org.jeecg.modules.base.entity.StasSyncLog; +import org.jeecg.modules.base.mapper.StasSyncLogMapper; +import org.jeecg.syncLog.service.IStasSyncLogService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 同步日志信息 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Service +public class StasSyncLogServiceImpl extends ServiceImpl implements IStasSyncLogService { + + + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncNum/controller/StasSyncNumController.java b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/controller/StasSyncNumController.java new file mode 100644 index 0000000..2cd7b3c --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/controller/StasSyncNumController.java @@ -0,0 +1,84 @@ +package org.jeecg.syncNum.controller; + +import jakarta.servlet.http.HttpServletRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.modules.base.entity.StasSyncNum; +import org.jeecg.syncNum.service.IStasSyncNumService; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.syncNum.vo.PieChartVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description: 同步数量 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Tag(name="同步数量") +@RestController +@RequestMapping("/stasSyncNum") +@Slf4j +public class StasSyncNumController extends JeecgController { + @Autowired + private IStasSyncNumService stasSyncNumService; + + /** + * 分页列表查询 + * + * @param stasSyncNum + * @param req + * @return + */ + //@AutoLog(value = "同步数量-分页列表查询") + @Operation(summary = "同步数量-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(StasSyncNum stasSyncNum, + HttpServletRequest req) { + // 构建查询条件 + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(stasSyncNum, req.getParameterMap()); + // 查询数据并按表名分组统计 + List records = stasSyncNumService.list(queryWrapper); + + // 按表名分组统计总同步量 + Map tableSyncMap = records.stream() + .collect(Collectors.groupingBy( + StasSyncNum::getTableName, + Collectors.summingInt(StasSyncNum::getSyncNum) + )); + + // 计算总同步量(用于计算百分比) + int total = tableSyncMap.values().stream().mapToInt(Integer::intValue).sum(); + + // 转换为饼图数据 + List pieData = tableSyncMap.entrySet().stream() + .map(entry -> { + PieChartVO vo = new PieChartVO(); + vo.setName(entry.getKey()); + vo.setValue(entry.getValue()); + if (total > 0) { + double percent = (entry.getValue() * 100.0) / total; + vo.setPercent(String.format("%.2f%%", percent)); + } + return vo; + }) + .collect(Collectors.toList()); + + return Result.OK(pieData); + } + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/IStasSyncNumService.java b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/IStasSyncNumService.java new file mode 100644 index 0000000..8c659a4 --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/IStasSyncNumService.java @@ -0,0 +1,14 @@ +package org.jeecg.syncNum.service; + +import org.jeecg.modules.base.entity.StasSyncNum; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 同步数量 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +public interface IStasSyncNumService extends IService { + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/impl/StasSyncNumServiceImpl.java b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/impl/StasSyncNumServiceImpl.java new file mode 100644 index 0000000..258b3e0 --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/service/impl/StasSyncNumServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.syncNum.service.impl; + +import org.jeecg.modules.base.entity.StasSyncNum; +import org.jeecg.modules.base.mapper.StasSyncNumMapper; +import org.jeecg.syncNum.service.IStasSyncNumService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 同步数量 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Service +public class StasSyncNumServiceImpl extends ServiceImpl implements IStasSyncNumService { + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncNum/vo/PieChartVO.java b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/vo/PieChartVO.java new file mode 100644 index 0000000..399214f --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncNum/vo/PieChartVO.java @@ -0,0 +1,13 @@ +package org.jeecg.syncNum.vo; + +import lombok.Data; + +@Data +public class PieChartVO { + // 表名(饼图的每块名称) + private String name; + // 同步数量(饼图的每块值) + private Integer value; + // 可选:百分比 + private String percent; +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/controller/StasSyncRecordController.java b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/controller/StasSyncRecordController.java new file mode 100644 index 0000000..00d12cc --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/controller/StasSyncRecordController.java @@ -0,0 +1,113 @@ +package org.jeecg.syncRecord.controller; + +import jakarta.servlet.http.HttpServletRequest; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.commons.lang3.StringUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.dataSource.service.IStasDataSourceService; +import org.jeecg.modules.base.entity.StasDataSource; +import org.jeecg.modules.base.entity.StasSyncRecord; +import org.jeecg.modules.base.entity.StasTaskConfig; +import org.jeecg.syncRecord.service.IStasSyncRecordService; +import org.jeecg.syncRecord.vo.SyncRecordVO; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; + +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.taskConfig.service.IStasTaskConfigService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description: 同步记录表 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Tag(name="同步记录表") +@RestController +@RequestMapping("/stasSyncRecord") +@Slf4j +public class StasSyncRecordController extends JeecgController { + @Autowired + private IStasSyncRecordService stasSyncRecordService; + @Autowired + private IStasDataSourceService stasDataSourceService; + @Autowired + private IStasTaskConfigService stasTaskConfigService; + + /** + * 分页列表查询 + * + * @param stasSyncRecord + * @param pageNo + * @param pageSize + * @param req + * @return + */ + //@AutoLog(value = "同步记录表-分页列表查询") + @Operation(summary = "同步记录表-分页列表查询") + @GetMapping(value = "/list") + public Result> queryPageList(StasSyncRecord stasSyncRecord, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, + HttpServletRequest req) { + stasSyncRecord.setStartTime(null); + stasSyncRecord.setEndTime(null); + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(stasSyncRecord, req.getParameterMap()); + + // 处理开始时间区间查询 + String beginStartTime = req.getParameter("startTime"); + String endStartTime = req.getParameter("endTime"); + if (StringUtils.isNotBlank(beginStartTime)) { + queryWrapper.ge("start_time", beginStartTime); + } + if (StringUtils.isNotBlank(endStartTime)) { + queryWrapper.le("start_time", endStartTime); + } + + queryWrapper.orderByAsc("start_time"); + Page page = new Page<>(pageNo, pageSize); + IPage pageList = stasSyncRecordService.page(page, queryWrapper); + List records = pageList.getRecords(); + + // 准备数据源和任务名称映射 + Map dataSourceMap = stasDataSourceService.list().stream() + .collect(Collectors.toMap(StasDataSource::getId, StasDataSource::getInstanceName)); + Map taskMap = stasTaskConfigService.list().stream() + .collect(Collectors.toMap(StasTaskConfig::getId, StasTaskConfig::getTaskName)); + + // 转换为VO列表 + List syncRecordVOS = records.stream().map(record -> { + SyncRecordVO vo = new SyncRecordVO(); + vo.setId(record.getId()); + vo.setTaskName(taskMap.get(record.getTaskId())); + vo.setSourceName(dataSourceMap.get(record.getSourceId())); + vo.setTargetName(dataSourceMap.get(record.getTargetId())); + vo.setStartTime(record.getStartTime()); + vo.setEndTime(record.getEndTime()); + return vo; + }).collect(Collectors.toList()); + + // 创建新的分页对象 + Page resultPage = new Page<>(); + BeanUtils.copyProperties(pageList, resultPage, "records"); + resultPage.setRecords(syncRecordVOS); + + return Result.OK(resultPage); + } + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/IStasSyncRecordService.java b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/IStasSyncRecordService.java new file mode 100644 index 0000000..339a067 --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/IStasSyncRecordService.java @@ -0,0 +1,14 @@ +package org.jeecg.syncRecord.service; + +import org.jeecg.modules.base.entity.StasSyncRecord; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @Description: 同步记录表 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +public interface IStasSyncRecordService extends IService { + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/impl/StasSyncRecordServiceImpl.java b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/impl/StasSyncRecordServiceImpl.java new file mode 100644 index 0000000..193927d --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/service/impl/StasSyncRecordServiceImpl.java @@ -0,0 +1,19 @@ +package org.jeecg.syncRecord.service.impl; + +import org.jeecg.modules.base.entity.StasSyncRecord; +import org.jeecg.modules.base.mapper.StasSyncRecordMapper; +import org.jeecg.syncRecord.service.IStasSyncRecordService; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +/** + * @Description: 同步记录表 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Service +public class StasSyncRecordServiceImpl extends ServiceImpl implements IStasSyncRecordService { + +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/vo/SyncRecordVO.java b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/vo/SyncRecordVO.java new file mode 100644 index 0000000..9becde4 --- /dev/null +++ b/jeecg-module-sync/src/main/java/org/jeecg/syncRecord/vo/SyncRecordVO.java @@ -0,0 +1,42 @@ +package org.jeecg.syncRecord.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * @Description: 同步记录表 + * @Author: jeecg-boot + * @Date: 2025-10-14 + * @Version: V1.0 + */ +@Data +public class SyncRecordVO implements Serializable { + private static final long serialVersionUID = 1L; + + /**任务名称*/ + private String id; + /**任务名称*/ + private String taskName; + /**源库名称*/ + private String sourceName; + /**目标库名称*/ + private String targetName; + /**开始时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date startTime; + /**结束时间*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date endTime; +} diff --git a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java index ea0bd57..6bc4570 100644 --- a/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java +++ b/jeecg-module-sync/src/main/java/org/jeecg/taskConfig/job/SyncDataJob.java @@ -7,12 +7,8 @@ import org.apache.commons.lang3.StringUtils; import org.jeecg.common.constant.enums.SourceDataTypeEnum; import org.jeecg.common.exception.JeecgBootException; import org.jeecg.common.util.DBUtil; -import org.jeecg.modules.base.entity.StasDataSource; -import org.jeecg.modules.base.entity.StasSyncStrategy; -import org.jeecg.modules.base.entity.StasTaskConfig; -import org.jeecg.modules.base.mapper.StasDataSourceMapper; -import org.jeecg.modules.base.mapper.StasSyncStrategyMapper; -import org.jeecg.modules.base.mapper.StasTaskConfigMapper; +import org.jeecg.modules.base.entity.*; +import org.jeecg.modules.base.mapper.*; import org.jeecg.vo.DateRangeVO; import org.jeecg.vo.IdRangeVO; import org.quartz.Job; @@ -37,6 +33,12 @@ public class SyncDataJob implements Job { private StasDataSourceMapper stasDataSourceMapper; @Resource private StasSyncStrategyMapper stasSyncStrategyMapper; + @Resource + private StasSyncRecordMapper stasSyncRecordMapper; + @Resource + private StasSyncLogMapper stasSyncLogMapper; + @Resource + private StasSyncNumMapper stasSyncNumMapper; private String parameter; @@ -61,6 +63,14 @@ public class SyncDataJob implements Job { StasDataSource sourceInfo = stasDataSourceMapper.selectById(stasTaskConfig.getSourceId()); StasDataSource targetInfo = stasDataSourceMapper.selectById(stasTaskConfig.getTargetId()); + StasSyncRecord stasSyncRecord = new StasSyncRecord(); + stasSyncRecord.setTaskId(taskId); + stasSyncRecord.setSourceId(stasTaskConfig.getSourceId()); + stasSyncRecord.setTargetId(stasTaskConfig.getTargetId()); + stasSyncRecord.setStartTime(new Date()); + stasSyncRecordMapper.insert(stasSyncRecord); + String recordId = stasSyncRecord.getId(); + String sourceUrl = DBUtil.getUrl(sourceInfo.getIpAddress(), sourceInfo.getPort(), sourceInfo.getServeId()); String targetUrl; if(SourceDataTypeEnum.ORACLE.getKey().equals(targetInfo.getType())){ @@ -79,27 +89,29 @@ public class SyncDataJob implements Job { .selectList(new LambdaQueryWrapper().eq(StasSyncStrategy::getTaskId, taskId)); for (StasSyncStrategy stasSyncStrategy : stasSyncStrategies) { - log.info("开始同步表: {} (依据字段: {})", stasSyncStrategy.getTableName(), stasSyncStrategy.getColumnName()); + saveSyncLog(recordId,String.format("开始同步表: %s (依据字段: %s)", stasSyncStrategy.getTableName(), stasSyncStrategy.getColumnName())); long startTime = System.currentTimeMillis(); try { if (isDateColumn(sourceConn, stasSyncStrategy, sourceInfo.getType())) { syncByDateRange(sourceConn, targetConn, stasSyncStrategy, - stasTaskConfig.getSyncDay(), sourceInfo.getType(), targetInfo.getType()); + stasTaskConfig.getSyncDay(), sourceInfo.getType(), targetInfo.getType(), recordId); } else { syncByIdRange(sourceConn, targetConn, stasSyncStrategy, - stasTaskConfig.getSyncCount(), sourceInfo.getType(), targetInfo.getType()); + stasTaskConfig.getSyncCount(), sourceInfo.getType(), targetInfo.getType(), recordId); } } catch (SQLException | ParseException e) { - log.error("同步表 {} 时出错: {}", stasSyncStrategy.getTableName(), e.getMessage()); + saveSyncLog(recordId,String.format("同步表 %s 时出错: %s", stasSyncStrategy.getTableName(), e.getMessage())); targetConn.rollback(); throw new JeecgBootException(e.getMessage()); } long endTime = System.currentTimeMillis(); - log.info("表 {} 同步耗时: {} 毫秒", stasSyncStrategy.getTableName(), (endTime - startTime)); + saveSyncLog(recordId,String.format("表 %s 同步耗时: %s 毫秒", stasSyncStrategy.getTableName(), (endTime - startTime))); } } + stasSyncRecord.setEndTime(new Date()); + stasSyncRecordMapper.updateById(stasSyncRecord); } /** @@ -136,10 +148,9 @@ public class SyncDataJob implements Job { */ public void syncByDateRange(Connection sourceConn, Connection targetConn, StasSyncStrategy stasSyncStrategy, Integer syncCount, - Integer sourceDbType, Integer targetDbType) throws SQLException, ParseException { + Integer sourceDbType, Integer targetDbType, String recordId) throws SQLException, ParseException { // 获取最小和最大日期 DateRangeVO dateRange = getDateRange(sourceConn, stasSyncStrategy, sourceDbType); - log.info("日期范围: {} 至 {}", dateRange.getMinDate(), dateRange.getMaxDate()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -164,18 +175,20 @@ public class SyncDataJob implements Job { "' AND TIMESTAMP '" + sdf.format(currentEnd) + "'"; } - log.info("同步日期范围: {} 至 {}", sdf.format(currentStart), sdf.format(currentEnd)); + saveSyncLog(recordId,String.format("%s表同步日期范围: %s 至 %s", stasSyncStrategy.getTableName(), sdf.format(currentStart), sdf.format(currentEnd))); int rowsSynced = syncDataBatch(sourceConn, targetConn, stasSyncStrategy.getSourceOwner(), stasSyncStrategy.getTargetOwner(), stasSyncStrategy.getTableName(), whereClause, sourceDbType, targetDbType); - log.info("已同步 {} 行数据", rowsSynced); + + saveSyncLog(recordId,String.format("%s表已同步 %s 行数据", stasSyncStrategy.getTableName(), rowsSynced)); + saveSyncNum(recordId, stasSyncStrategy.getTableName(), rowsSynced); // 更新同步位置 if (currentEnd != null) { stasSyncStrategy.setSyncOrigin(sdf.format(currentEnd)); stasSyncStrategyMapper.updateById(stasSyncStrategy); - log.info("最终同步位置已更新为: {}", sdf.format(currentEnd)); + saveSyncLog(recordId, String.format("%s表最终同步位置已更新为: %s", stasSyncStrategy.getTableName(), sdf.format(currentEnd))); } } @@ -184,10 +197,9 @@ public class SyncDataJob implements Job { */ public void syncByIdRange(Connection sourceConn, Connection targetConn, StasSyncStrategy stasSyncStrategy, Integer syncCount, - Integer sourceDbType, Integer targetDbType) throws SQLException { + Integer sourceDbType, Integer targetDbType, String recordId) throws SQLException { // 获取最小和最大ID IdRangeVO idRange = getIdRange(sourceConn, stasSyncStrategy, sourceDbType); - log.info("ID范围: {} 至 {}", idRange.getMinId(), idRange.getMaxId()); // 获取上次同步的位置 String syncOrigin = stasSyncStrategy.getSyncOrigin(); @@ -202,18 +214,20 @@ public class SyncDataJob implements Job { String whereClause = stasSyncStrategy.getColumnName() + " BETWEEN " + currentStart + " AND " + currentEnd; - log.info("同步ID范围: {} 至 {}", currentStart, currentEnd); + saveSyncLog(recordId,String.format("%s表同步ID范围: %s 至 %s", stasSyncStrategy.getTableName(), currentStart, currentEnd)); int rowsSynced = syncDataBatch(sourceConn, targetConn, stasSyncStrategy.getSourceOwner(), stasSyncStrategy.getTargetOwner(), stasSyncStrategy.getTableName(), whereClause, sourceDbType, targetDbType); - log.info("已同步 {} 行数据", rowsSynced); + + saveSyncLog(recordId,String.format("%s表已同步 %s 行数据", stasSyncStrategy.getTableName(), rowsSynced)); + saveSyncNum(recordId, stasSyncStrategy.getTableName(), rowsSynced); // 更新同步位置 if (currentEnd > 0) { stasSyncStrategy.setSyncOrigin(String.valueOf(currentEnd)); stasSyncStrategyMapper.updateById(stasSyncStrategy); - log.info("最终同步位置已更新为: {}", currentEnd); + saveSyncLog(recordId,String.format("%s表最终同步位置已更新为: %s", stasSyncStrategy.getTableName(), currentEnd)); } } @@ -346,10 +360,27 @@ public class SyncDataJob implements Job { return totalRows; } + + private void saveSyncLog(String recordId, String desc){ + StasSyncLog stasSyncLog = new StasSyncLog(); + stasSyncLog.setRecordId(recordId); + stasSyncLog.setStartTime(new Date()); + stasSyncLog.setDescription(desc); + stasSyncLogMapper.insert(stasSyncLog); + } + + private void saveSyncNum(String recordId, String tableName, Integer num){ + StasSyncNum stasSyncNum = new StasSyncNum(); + stasSyncNum.setRecordId(recordId); + stasSyncNum.setTableName(tableName); + stasSyncNum.setSyncNum(num); + stasSyncNumMapper.insert(stasSyncNum); + } + /** * 计算指定日期加上指定天数后的日期 */ - private static Date addDays(Date date, int days) { + private Date addDays(Date date, int days) { long time = date.getTime() + (long)days * 24 * 60 * 60 * 1000; return new Date(time); }