月票车超时配置功能
📋 功能概述
之前月票车超时配置数据存储在 violations
违规记录表中,这种设计不合理。现在创建了专门的配置表 monthly_ticket_timeout_config
来存储月票车超时配置。
🗄️ 数据库变更
新增表:monthly_ticket_timeout_config
-- 月票车超时配置表
CREATE TABLE `monthly_ticket_timeout_config` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`park_code` varchar(50) NOT NULL COMMENT '车场编码',`park_name` varchar(100) DEFAULT NULL COMMENT '车场名称',`timeout_minutes` int(11) NOT NULL DEFAULT 60 COMMENT '超时时间(分钟)',`max_violation_count` int(11) NOT NULL DEFAULT 5 COMMENT '最大违规次数',`is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用:1-启用,0-禁用',`description` varchar(255) DEFAULT NULL COMMENT '配置说明',`created_by` varchar(50) DEFAULT NULL COMMENT '创建人',`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_park_code` (`park_code`) COMMENT '车场编码唯一索引',KEY `idx_park_code_active` (`park_code`, `is_active`) COMMENT '车场编码和启用状态联合索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月票车超时配置表';
🏗️ 代码架构
新增类文件
- 实体类:
MonthlyTicketTimeoutConfig.java
- 定义配置表的实体结构
- Mapper接口:
MonthlyTicketTimeoutConfigMapper.java
- 数据访问层接口
- Service接口:
MonthlyTicketTimeoutConfigService.java
- 业务逻辑接口
- Service实现:
MonthlyTicketTimeoutConfigServiceImpl.java
- 业务逻辑实现
修改的类文件
- ViolationsServiceImpl.java
- 更新
saveMonthlyTicketTimeoutConfig()
方法,使用新的配置服务
- 更新
- 更新
getMonthlyTicketTimeoutConfig()
方法,从新的配置表读取数据
- 更新
🔧 部署步骤
- 执行建表SQL
# 连接到MySQL数据库
mysql -u root -p project_lzx# 执行建表SQL
source sql/monthly_ticket_timeout_config.sql
- 重启应用
- 重新编译并启动Spring Boot应用
✅ 功能验证
- 保存配置测试
POST /violations/saveMonthlyTicketTimeoutConfig
{"parkCode": "TEST001","timeoutMinutes": 30,"maxViolationCount": 5,"operatorId": "admin"
}
- 获取配置测试
GET /violations/getMonthlyTicketTimeoutConfig?parkCode=TEST001
📈 优势
- 数据隔离: 配置数据与违规记录数据分离,避免混乱
- 性能优化: 专门的索引设计,查询性能更好
- 易于维护: 专门的服务类,代码更清晰
- 扩展性强: 可以轻松添加新的配置字段
🔄 数据迁移
如果有现有的配置数据在 violations
表中,可以执行以下迁移脚本:
-- 迁移现有配置数据(如果需要)
INSERT INTO monthly_ticket_timeout_config (park_code, timeout_minutes, max_violation_count, description, created_by, created_at)
SELECT park_code,-- 从description字段解析timeoutCAST(SUBSTRING_INDEX(SUBSTRING_INDEX(description, 'timeout=', -1), '分', 1) AS UNSIGNED) as timeout_minutes,-- 从description字段解析maxCount CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(description, 'maxCount=', -1), '次', 1) AS UNSIGNED) as max_violation_count,description,created_by,created_at
FROM violations
WHERE violation_type = 'SYSTEM_CONFIG' AND plate_number LIKE 'CFG_%'
ON DUPLICATE KEY UPDATEtimeout_minutes = VALUES(timeout_minutes),max_violation_count = VALUES(max_violation_count),updated_at = NOW();