From a50dbd89ced3253720a7b3bbc34b3a77a4210577 Mon Sep 17 00:00:00 2001
From: wangna0328 <3402195679@qq.com>
Date: Mon, 4 Aug 2025 17:24:13 +0800
Subject: [PATCH 1/5] =?UTF-8?q?=E5=88=B6=E5=BA=A6=E6=A8=A1=E5=9D=97?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../domain/dto/RegulationTypeRequest.java | 27 +++++++++
.../domain/entity/RegulationTypeEntity.java | 59 +++++++++++++++++++
.../resources/mapper/RegulationTypeMapper.xml | 32 ++++++++++
pom.xml | 1 -
4 files changed, 118 insertions(+), 1 deletion(-)
create mode 100644 core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java
create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java
create mode 100644 core/src/main/resources/mapper/RegulationTypeMapper.xml
diff --git a/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java b/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java
new file mode 100644
index 0000000..0c99771
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/dto/RegulationTypeRequest.java
@@ -0,0 +1,27 @@
+package com.dite.znpt.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author wangna
+ * @date 2025/07/29
+ * @Description: 制度类型请求DTO
+ */
+@Data
+@ApiModel(value = "RegulationTypeRequest", description = "制度类型请求")
+public class RegulationTypeRequest {
+
+ @ApiModelProperty("类型名称")
+ private String typeName;
+
+ @ApiModelProperty("排序顺序")
+ private Integer sortOrder;
+
+ @ApiModelProperty("是否启用")
+ private String isEnabled;
+
+ @ApiModelProperty("备注")
+ private String remark;
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java
new file mode 100644
index 0000000..1057ff8
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java
@@ -0,0 +1,59 @@
+package com.dite.znpt.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.dite.znpt.domain.AuditableEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.alibaba.excel.annotation.ExcelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @author wangna
+ * @date 2025/07/29
+ * @Description: 制度类型实体类
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("regulation_type")
+@ApiModel(value="RegulationTypeEntity对象", description="制度类型")
+public class RegulationTypeEntity extends AuditableEntity implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ExcelProperty("类型ID")
+ @ApiModelProperty("类型ID")
+ @TableId(value = "type_id", type = IdType.ASSIGN_UUID)
+ private String typeId;
+
+ @ExcelProperty("类型名称")
+ @ApiModelProperty("类型名称")
+ @TableField("type_name")
+ private String typeName;
+
+ @ExcelProperty("状态")
+ @ApiModelProperty("状态:ENABLED-启用,DISABLED-禁用")
+ @TableField("status")
+ private String status;
+
+ @ExcelProperty("排序顺序")
+ @ApiModelProperty("排序顺序")
+ @TableField("sort_order")
+ private Integer sortOrder;
+
+ @ExcelProperty("备注")
+ @ApiModelProperty("备注")
+ @TableField("remark")
+ private String remark;
+
+ @ExcelProperty("删除标志(0代表存在,1代表删除)")
+ @ApiModelProperty("删除标志(0代表存在,1代表删除)")
+ @TableField("del_flag")
+ private String delFlag;
+
+ @TableField(exist = false)
+ @ApiModelProperty("创建人姓名")
+ private String createByName;
+}
\ No newline at end of file
diff --git a/core/src/main/resources/mapper/RegulationTypeMapper.xml b/core/src/main/resources/mapper/RegulationTypeMapper.xml
new file mode 100644
index 0000000..7ce5f6b
--- /dev/null
+++ b/core/src/main/resources/mapper/RegulationTypeMapper.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+ rt.type_id, rt.type_name, rt.status, rt.sort_order, rt.remark, rt.del_flag,
+ rt.create_by, rt.create_time, rt.update_by, rt.update_time
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index fcdc462..4991235 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,6 @@
core
- sip
web
flowable
From 6ceda40d18a749e09c1c676a1c9d22fe40fe7c13 Mon Sep 17 00:00:00 2001
From: wangna0328 <3402195679@qq.com>
Date: Mon, 4 Aug 2025 19:32:38 +0800
Subject: [PATCH 2/5] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=A6=82=E5=88=9D?=
=?UTF-8?q?=EF=BC=8C=E4=BD=86=E5=8F=91=E7=8E=B0=E5=85=B6=E4=BB=96bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../znpt/domain/entity/RegulationEntity.java | 6 +++-
.../domain/entity/RegulationTypeEntity.java | 10 +++---
.../znpt/service/RegulationTypeService.java | 2 +-
.../service/impl/RegulationServiceImpl.java | 5 +++
.../impl/RegulationTypeServiceImpl.java | 2 +-
.../resources/mapper/RegulationMapper.xml | 32 +++++++++++++++++++
.../resources/mapper/RegulationTypeMapper.xml | 10 +++---
7 files changed, 54 insertions(+), 13 deletions(-)
create mode 100644 core/src/main/resources/mapper/RegulationMapper.xml
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java
index 25f144f..6dd36f1 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationEntity.java
@@ -42,7 +42,7 @@ public class RegulationEntity extends AuditableEntity implements Serializable {
@ExcelProperty("制度类型")
@ApiModelProperty("制度类型")
@TableField("regulation_type")
- private String regulationType;
+ private String type;
@ExcelProperty("制度状态")
@ApiModelProperty("制度状态:DRAFT-草案,APPROVED-已公示,PUBLISHED-已发布,ARCHIVED-已归档")
@@ -96,4 +96,8 @@ public class RegulationEntity extends AuditableEntity implements Serializable {
@TableField(exist = false)
@ApiModelProperty("创建人姓名")
private String createByName;
+
+ @TableField(exist = false)
+ @ApiModelProperty("制度类型")
+ private String regulationType;
}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java
index 1057ff8..eb8154c 100644
--- a/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java
+++ b/core/src/main/java/com/dite/znpt/domain/entity/RegulationTypeEntity.java
@@ -33,10 +33,10 @@ public class RegulationTypeEntity extends AuditableEntity implements Serializabl
@TableField("type_name")
private String typeName;
- @ExcelProperty("状态")
- @ApiModelProperty("状态:ENABLED-启用,DISABLED-禁用")
- @TableField("status")
- private String status;
+ @ExcelProperty("是否启用")
+ @ApiModelProperty("是否启用(1-启用,0-禁用)")
+ @TableField("is_enabled")
+ private String isEnabled;
@ExcelProperty("排序顺序")
@ApiModelProperty("排序顺序")
@@ -55,5 +55,5 @@ public class RegulationTypeEntity extends AuditableEntity implements Serializabl
@TableField(exist = false)
@ApiModelProperty("创建人姓名")
- private String createByName;
+ private String createrName;
}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java
index c5b8715..e221f60 100644
--- a/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java
+++ b/core/src/main/java/com/dite/znpt/service/RegulationTypeService.java
@@ -16,7 +16,7 @@ public interface RegulationTypeService extends IService {
* @param page 页码
* @param size 页大小
* @param typeName 类型名称
- * @param status 状态
+ * @param status 是否启用(1-启用,0-禁用)
* @param remark 备注
* @return 结果
*/
diff --git a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java
index cf52e5f..f0cb608 100644
--- a/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java
+++ b/core/src/main/java/com/dite/znpt/service/impl/RegulationServiceImpl.java
@@ -203,6 +203,11 @@ public class RegulationServiceImpl extends ServiceImpl()
- .eq(RegulationEntity::getRegulationType, typeName)
+ .eq(RegulationEntity::getType, typeName)
.eq(RegulationEntity::getDelFlag, "0")
);
// 如果有制度使用此类型,则不允许删除
diff --git a/core/src/main/resources/mapper/RegulationMapper.xml b/core/src/main/resources/mapper/RegulationMapper.xml
new file mode 100644
index 0000000..d3b6177
--- /dev/null
+++ b/core/src/main/resources/mapper/RegulationMapper.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/src/main/resources/mapper/RegulationTypeMapper.xml b/core/src/main/resources/mapper/RegulationTypeMapper.xml
index 7ce5f6b..53211ec 100644
--- a/core/src/main/resources/mapper/RegulationTypeMapper.xml
+++ b/core/src/main/resources/mapper/RegulationTypeMapper.xml
@@ -3,24 +3,24 @@
- rt.type_id, rt.type_name, rt.status, rt.sort_order, rt.remark, rt.del_flag,
+ rt.type_id, rt.type_name, rt.is_enabled, rt.sort_order, rt.remark, rt.del_flag,
rt.create_by, rt.create_time, rt.update_by, rt.update_time
diff --git a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java
index c27dc10..19e770b 100644
--- a/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java
+++ b/web/src/main/java/com/dite/znpt/web/controller/RegulationController.java
@@ -28,8 +28,9 @@ public class RegulationController {
@RequestParam(required = false) String status,
@RequestParam(required = false) String type,
@RequestParam(required = false) String title,
- @RequestParam(required = false) String proposer) {
- return regulationService.getRegulationList(page, size, status, type, title, proposer);
+ @RequestParam(required = false) String proposer,
+ @RequestParam(required = false) String confirmStatus) {
+ return regulationService.getRegulationList(page, size, status, type, title, proposer, confirmStatus);
}
@ApiOperation(value = "创建制度提案", httpMethod = "POST")
From ec5cca1dabf65f09b66721c6ec9680e1e92098cb Mon Sep 17 00:00:00 2001
From: wangna0328 <3402195679@qq.com>
Date: Tue, 5 Aug 2025 11:00:08 +0800
Subject: [PATCH 4/5] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A3=80=E6=B5=8B?=
=?UTF-8?q?=E5=88=9D=E6=AD=A5=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=BF=98=E6=9C=AA?=
=?UTF-8?q?=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/dite/znpt/config/Schedule.java | 14 +
.../com/dite/znpt/config/WebMvcConfig.java | 12 +
.../entity/AutoExpirationConfigEntity.java | 84 +++++
.../domain/entity/ExpirationResultEntity.java | 85 +++++
.../mapper/AutoExpirationConfigMapper.java | 14 +
.../znpt/mapper/ExpirationResultMapper.java | 14 +
.../znpt/service/AutoExpirationService.java | 61 ++++
.../impl/AutoExpirationServiceImpl.java | 341 ++++++++++++++++++
.../service/job/AutoExpirationJobService.java | 14 +
.../impl/AutoExpirationJobServiceImpl.java | 31 ++
doc/auto_expiration_readme.md | 138 +++++++
doc/auto_expiration_tables.sql | 51 +++
web/pom.xml | 10 +-
.../controller/AutoExpirationController.java | 178 +++++++++
.../web/controller/EquipmentController.java | 1 +
web/src/main/resources/application.yml | 1 +
web/src/main/resources/logback.xml | 8 +-
17 files changed, 1048 insertions(+), 9 deletions(-)
create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java
create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java
create mode 100644 core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java
create mode 100644 core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java
create mode 100644 core/src/main/java/com/dite/znpt/service/AutoExpirationService.java
create mode 100644 core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java
create mode 100644 core/src/main/java/com/dite/znpt/service/job/AutoExpirationJobService.java
create mode 100644 core/src/main/java/com/dite/znpt/service/job/impl/AutoExpirationJobServiceImpl.java
create mode 100644 doc/auto_expiration_readme.md
create mode 100644 doc/auto_expiration_tables.sql
create mode 100644 web/src/main/java/com/dite/znpt/web/controller/AutoExpirationController.java
diff --git a/core/src/main/java/com/dite/znpt/config/Schedule.java b/core/src/main/java/com/dite/znpt/config/Schedule.java
index 6e38623..6b3c65a 100644
--- a/core/src/main/java/com/dite/znpt/config/Schedule.java
+++ b/core/src/main/java/com/dite/znpt/config/Schedule.java
@@ -7,6 +7,7 @@ import com.dite.znpt.domain.vo.PartResp;
import com.dite.znpt.enums.FilePathEnum;
import com.dite.znpt.service.ImageService;
import com.dite.znpt.service.PartService;
+import com.dite.znpt.service.job.AutoExpirationJobService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
@@ -26,6 +27,7 @@ public class Schedule {
private final ImageService imageService;
private final PartService partService;
private final ExtUtilConfig extUtilConfig;
+ private final AutoExpirationJobService autoExpirationJobService;
/**
* 功能描述:图像预处理,持续运行
@@ -67,4 +69,16 @@ public class Schedule {
}
imageService.updateBatchById(successList);
}
+
+ /**
+ * 功能描述:自动到期检测,每天凌晨2点执行
+ *
+ * @author System
+ * @date 2025/1/1
+ **/
+ @Scheduled(cron = "0 0 2 * * ?")
+ public void autoExpirationCheck() {
+ log.info("开始执行自动到期检测定时任务...");
+ autoExpirationJobService.executeAutoExpirationJob();
+ }
}
diff --git a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java
index c09ff82..718f7ff 100644
--- a/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java
+++ b/core/src/main/java/com/dite/znpt/config/WebMvcConfig.java
@@ -2,10 +2,14 @@ package com.dite.znpt.config;
import cn.hutool.core.collection.ListUtil;
import com.dite.znpt.enums.FilePathEnum;
+import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@@ -28,6 +32,14 @@ public class WebMvcConfig implements WebMvcConfigurer {
}
}
+ /**
+ * 配置HTTP消息转换器,确保UTF-8编码
+ */
+ @Override
+ public void configureMessageConverters(List> converters) {
+ converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
+ }
+
// @Override
// public void addInterceptors(InterceptorRegistry registry) {
// // 注册 Sa-Token 拦截器,定义详细认证规则
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java
new file mode 100644
index 0000000..7d9f608
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/AutoExpirationConfigEntity.java
@@ -0,0 +1,84 @@
+package com.dite.znpt.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dite.znpt.domain.AuditableEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author System
+ * @date 2025/1/1
+ * @description 自动到期检测配置实体
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("auto_expiration_config")
+@ApiModel(value="AutoExpirationConfigEntity对象", description="自动到期检测配置")
+public class AutoExpirationConfigEntity extends AuditableEntity implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("配置ID")
+ @TableId(value = "config_id", type = IdType.ASSIGN_UUID)
+ private String configId;
+
+ @ApiModelProperty("表名")
+ @TableField("table_name")
+ private String tableName;
+
+ @ApiModelProperty("表描述")
+ @TableField("table_desc")
+ private String tableDesc;
+
+ @ApiModelProperty("主键字段")
+ @TableField("primary_key_field")
+ private String primaryKeyField;
+
+ @ApiModelProperty("到期时间字段")
+ @TableField("expire_date_field")
+ private String expireDateField;
+
+ @ApiModelProperty("关联用户字段")
+ @TableField("user_id_field")
+ private String userIdField;
+
+ @ApiModelProperty("用户姓名字段")
+ @TableField("user_name_field")
+ private String userNameField;
+
+ @ApiModelProperty("业务名称字段")
+ @TableField("business_name_field")
+ private String businessNameField;
+
+ @ApiModelProperty("提前提醒天数")
+ @TableField("remind_days")
+ private Integer remindDays;
+
+ @ApiModelProperty("是否启用(0-禁用,1-启用)")
+ @TableField("enabled")
+ private String enabled;
+
+ @ApiModelProperty("备注")
+ @TableField("remark")
+ private String remark;
+
+ @ApiModelProperty("删除标志(0代表存在,1代表删除)")
+ @TableField("del_flag")
+ private String delFlag;
+
+ /**
+ * 保存前处理
+ */
+ public void preSave() {
+ // 可以在这里添加保存前的逻辑处理
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java
new file mode 100644
index 0000000..fb2fc23
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/domain/entity/ExpirationResultEntity.java
@@ -0,0 +1,85 @@
+package com.dite.znpt.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dite.znpt.domain.AuditableEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * @author System
+ * @date 2025/1/1
+ * @description 到期检测结果实体
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("expiration_result")
+@ApiModel(value="ExpirationResultEntity对象", description="到期检测结果")
+public class ExpirationResultEntity extends AuditableEntity implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("结果ID")
+ @TableId(value = "result_id", type = IdType.ASSIGN_UUID)
+ private String resultId;
+
+ @ApiModelProperty("配置ID")
+ @TableField("config_id")
+ private String configId;
+
+ @ApiModelProperty("表名")
+ @TableField("table_name")
+ private String tableName;
+
+ @ApiModelProperty("业务ID")
+ @TableField("business_id")
+ private String businessId;
+
+ @ApiModelProperty("业务名称")
+ @TableField("business_name")
+ private String businessName;
+
+ @ApiModelProperty("关联用户ID")
+ @TableField("user_id")
+ private String userId;
+
+ @ApiModelProperty("关联用户姓名")
+ @TableField("user_name")
+ private String userName;
+
+ @ApiModelProperty("到期日期")
+ @TableField("expire_date")
+ private LocalDate expireDate;
+
+ @ApiModelProperty("剩余天数")
+ @TableField("remaining_days")
+ private Integer remainingDays;
+
+ @ApiModelProperty("状态(0-正常,1-即将到期,2-已到期)")
+ @TableField("status")
+ private String status;
+
+ @ApiModelProperty("检测时间")
+ @TableField("check_time")
+ private java.time.LocalDateTime checkTime;
+
+ @ApiModelProperty("删除标志(0代表存在,1代表删除)")
+ @TableField("del_flag")
+ private String delFlag;
+
+ /**
+ * 保存前处理
+ */
+ public void preSave() {
+ // 可以在这里添加保存前的逻辑处理
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java b/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java
new file mode 100644
index 0000000..5ea8531
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/mapper/AutoExpirationConfigMapper.java
@@ -0,0 +1,14 @@
+package com.dite.znpt.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dite.znpt.domain.entity.AutoExpirationConfigEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author System
+ * @date 2025/1/1
+ * @description 自动到期检测配置Mapper
+ */
+@Mapper
+public interface AutoExpirationConfigMapper extends BaseMapper {
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java b/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java
new file mode 100644
index 0000000..b6d3991
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/mapper/ExpirationResultMapper.java
@@ -0,0 +1,14 @@
+package com.dite.znpt.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dite.znpt.domain.entity.ExpirationResultEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author System
+ * @date 2025/1/1
+ * @description 到期检测结果Mapper
+ */
+@Mapper
+public interface ExpirationResultMapper extends BaseMapper {
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java b/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java
new file mode 100644
index 0000000..35d2b76
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/AutoExpirationService.java
@@ -0,0 +1,61 @@
+package com.dite.znpt.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dite.znpt.domain.entity.AutoExpirationConfigEntity;
+import com.dite.znpt.domain.entity.ExpirationResultEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author System
+ * @date 2025/1/1
+ * @description 自动到期检测服务接口
+ */
+public interface AutoExpirationService extends IService {
+
+ /**
+ * 执行自动到期检测
+ */
+ void executeAutoExpirationCheck();
+
+ /**
+ * 获取到期检测结果
+ * @param status 状态筛选
+ * @return 检测结果列表
+ */
+ List getExpirationResults(String status);
+
+ /**
+ * 获取统计信息
+ * @return 统计信息
+ */
+ Map getStatistics();
+
+ /**
+ * 手动检测指定表
+ * @param tableName 表名
+ */
+ void checkTableExpiration(String tableName);
+
+ /**
+ * 检查表是否已配置到期检测
+ * @param tableName 表名
+ * @return 配置信息,如果未配置返回null
+ */
+ AutoExpirationConfigEntity getTableConfig(String tableName);
+
+ /**
+ * 批量检查多个表的配置状态
+ * @param tableNames 表名列表
+ * @return 配置状态映射
+ */
+ Map getTablesConfigStatus(List tableNames);
+
+ /**
+ * 智能配置表检测
+ * @param tableName 表名
+ * @return 配置结果
+ */
+ AutoExpirationConfigEntity autoConfigureTable(String tableName);
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java
new file mode 100644
index 0000000..ffa2ba7
--- /dev/null
+++ b/core/src/main/java/com/dite/znpt/service/impl/AutoExpirationServiceImpl.java
@@ -0,0 +1,341 @@
+package com.dite.znpt.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dite.znpt.domain.entity.AutoExpirationConfigEntity;
+import com.dite.znpt.domain.entity.ExpirationResultEntity;
+import com.dite.znpt.mapper.AutoExpirationConfigMapper;
+import com.dite.znpt.mapper.ExpirationResultMapper;
+import com.dite.znpt.service.AutoExpirationService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author System
+ * @date 2025/1/1
+ * @description 自动到期检测服务实现类
+ */
+@Slf4j
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class AutoExpirationServiceImpl extends ServiceImpl implements AutoExpirationService {
+
+ @Autowired
+ private ExpirationResultMapper expirationResultMapper;
+
+ @Autowired
+ private JdbcTemplate jdbcTemplate;
+
+ @Override
+ public void executeAutoExpirationCheck() {
+ log.info("开始执行自动到期检测...");
+
+ // 获取所有启用的配置
+ List configs = lambdaQuery()
+ .eq(AutoExpirationConfigEntity::getEnabled, "1")
+ .eq(AutoExpirationConfigEntity::getDelFlag, "0")
+ .list();
+
+ if (CollUtil.isEmpty(configs)) {
+ log.info("没有找到启用的到期检测配置");
+ return;
+ }
+
+ // 清空之前的检测结果
+ expirationResultMapper.delete(null);
+
+ // 逐个检测每个配置的表
+ for (AutoExpirationConfigEntity config : configs) {
+ try {
+ checkTableExpiration(config);
+ } catch (Exception e) {
+ log.error("检测表 {} 时发生错误: {}", config.getTableName(), e.getMessage(), e);
+ }
+ }
+
+ log.info("自动到期检测完成,共检测 {} 个表", configs.size());
+ }
+
+ @Override
+ public List getExpirationResults(String status) {
+ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
+ wrapper.eq(ExpirationResultEntity::getDelFlag, "0");
+
+ if (StrUtil.isNotBlank(status)) {
+ wrapper.eq(ExpirationResultEntity::getStatus, status);
+ }
+
+ wrapper.orderByDesc(ExpirationResultEntity::getExpireDate);
+
+ return expirationResultMapper.selectList(wrapper);
+ }
+
+ @Override
+ public Map getStatistics() {
+ Map statistics = new HashMap<>();
+
+ // 统计各状态的数量
+ List allResults = expirationResultMapper.selectList(null);
+
+ long normalCount = allResults.stream()
+ .filter(r -> "0".equals(r.getStatus()))
+ .count();
+ long expiringCount = allResults.stream()
+ .filter(r -> "1".equals(r.getStatus()))
+ .count();
+ long expiredCount = allResults.stream()
+ .filter(r -> "2".equals(r.getStatus()))
+ .count();
+
+ statistics.put("total", allResults.size());
+ statistics.put("normal", normalCount);
+ statistics.put("expiring", expiringCount);
+ statistics.put("expired", expiredCount);
+
+ return statistics;
+ }
+
+ @Override
+ public void checkTableExpiration(String tableName) {
+ AutoExpirationConfigEntity config = lambdaQuery()
+ .eq(AutoExpirationConfigEntity::getTableName, tableName)
+ .eq(AutoExpirationConfigEntity::getEnabled, "1")
+ .one();
+
+ if (config == null) {
+ throw new RuntimeException("未找到表 " + tableName + " 的配置信息");
+ }
+
+ checkTableExpiration(config);
+ }
+
+ /**
+ * 检测指定配置的表
+ */
+ private void checkTableExpiration(AutoExpirationConfigEntity config) {
+ log.info("开始检测表: {}", config.getTableName());
+
+ // 构建查询SQL
+ String sql = buildQuerySql(config);
+
+ try {
+ List