CLAUDE.md 45 KB

重庆机场安检分级质控系统 - 后端

项目概述

重庆机场安检分级质控系统服务端,基于若依(RuoYi)框架二次开发的 Spring Boot 多模块 Maven 项目。提供考勤管理、查获物品、巡检管理、考试培训、大屏数据、绩效管理等 REST API。

  • GroupId: com.sundot.airport
  • 版本: 3.9.0
  • 运行端口: 8088
  • 主类: com.sundot.airport.Application

开发环境要求

  • Java: 1.8
  • Maven: 3.x
  • MySQL: 5.7(数据库名:chongqing
  • Redis: 任意版本(默认 db 5)

启动配置

数据库

host: 127.0.0.1:3306
database: chongqing
username: root
password: Samsundot@123!

数据库初始化脚本:sql/chongqing-test.sql

Redis

host: 127.0.0.1
port: 6379
database: 5
password: Qwer+1234

构建运行

# 编译打包(在项目根目录)
mvn clean package -DskipTests

# 运行(airport-admin 模块为启动入口)
java -jar airport-admin/target/airport-admin-3.9.0.jar

模块结构

chongqing-server/
├── airport-admin/        # 启动模块 & 所有 Controller(Web 层入口)
├── airport-framework/    # 框架核心(Spring Security、AOP、数据源、过滤器等)
├── airport-system/       # 系统业务(用户、角色、菜单、部门、审批流程等)
├── airport-common/       # 公共工具(常量、工具类、基础域对象、异常处理)
├── airport-attendance/   # 考勤模块(考勤记录、班组、区域管理)
├── airport-check/        # 巡检模块(巡检任务、记录、纠错审批)
├── airport-item/         # 查获物品模块(查获记录、物品类别、绩效)
├── airport-exam/         # 考试培训模块(题库、试卷、日考、能力画像)
├── airport-quartz/       # 定时任务模块(Quartz 调度)
├── airport-generator/    # 代码生成模块
└── sql/                  # 数据库脚本
    └── chongqing-test.sql

技术栈

技术 版本 用途
Spring Boot 2.5.15 基础框架
Spring Security 5.7.12 安全认证
MyBatis - ORM(XML Mapper)
MyBatis Plus - ORM 增强
PageHelper 1.4.7 分页插件
Druid 1.2.23 数据库连接池
Redis (Lettuce) - 缓存
JWT (jjwt 0.9.1) - Token 认证
Swagger 3 3.0.0 API 文档(/swagger-ui/)
Undertow - Web 服务器
Quartz - 定时任务
EasyExcel 4.0.3 Excel 导入导出
Apache POI 4.1.2 Excel 操作
Fastjson2 2.0.57 JSON 序列化
Lombok 1.18.30 代码简化
阿里云 SMS - 短信登录

Controller 层结构(airport-admin)

所有 Controller 位于 airport-admin/src/main/java/com/sundot/airport/web/controller/

说明
system/ 用户、角色、菜单、部门、字典、岗位、配置、审批
attendance/ 考勤记录、班组、区域、考勤检查记录
check/ 巡检任务、记录、纠错、大屏数据
item/ 查获记录、物品类别、绩效维度、消息推送
exam/ 题库、试卷、日考、考试记录、弱项分析
home/ 首页统计、查获排名、考勤统计
portrait/ 用户能力画像、考勤统计、物品排名
quality/ 质量统计(物品分类、资质等级、简化考勤)
monitor/ 系统监控(在线用户、操作日志、缓存、服务器)
daily/ 日常任务配置、部门档案、站点档案
approval/ 审批流程管理
common/ 公共接口(验证码、文件上传、数据配置)

数据库表分类

数据库名:chongqing

前缀 模块 主要表
sys_ 系统 用户、角色、菜单、部门、字典、配置、日志
attendance_ 考勤 考勤记录、班组记录、岗位记录、例行检查记录
base_ 基础数据 岗位、项目、检查点、查获类别/物品、默认选项、附件
check_ 巡检 巡检任务、记录、项目项、检查员、纠错、文件
edu_cs_ 考试教育 题目、题目分类、试卷、考试记录、日考任务
item_ 查获物品 查获记录、物品、绩效指标/维度/度量
approval_ 审批 工作流定义、实例、任务、节点、历史、抄送
performance_ 绩效 绩效相关统计

开发约定

分层架构

标准 MVC 分层(每个业务模块独立):

Controller → Service (Interface + Impl) → Mapper (Interface + XML)
  • Domain: 实体类,继承 BaseEntity(含 createBy/createTime/updateBy/updateTime/remark)
  • Mapper XML: 位于各模块 src/main/resources/mapper/
  • DTO: 用于入参封装,放在 dto/ 包下

接口规范

  • 统一返回 AjaxResult{ code, msg, data }
  • 分页使用 PageHelper.startPage() + TableDataInfo 返回
  • 权限注解:@PreAuthorize("@ss.hasPermi('模块:功能:操作')")
  • 操作日志:@Log(title = "...", businessType = BusinessType.XXX)
  • 数据权限:@DataScope(deptAlias = "d", userAlias = "u")

安全认证

  • 登录接口:POST /login,返回 JWT Token
  • Token 放在请求头:Authorization: Bearer <token>
  • Token 有效期:30 分钟(Redis 缓存,支持自动续期)
  • 支持短信验证码登录(阿里云 SMS)
  • 密码最大错误 5 次,锁定 10 分钟

MyBatis 配置

  • XML Mapper 路径:classpath*:mapper/**/*Mapper.xml
  • 类型别名包:com.sundot.airport.**.domain
  • 同时支持 MyBatis 和 MyBatis Plus(两者 Mapper 均有使用)

Redis 使用

  • 缓存 Token、验证码、字典数据、权限数据
  • 工具类:com.sundot.airport.common.core.redis.RedisCache
  • 统计数据缓存:StatisticsCacheController 提供手动刷新接口

日志

  • 使用 Logback,配置文件:airport-admin/src/main/resources/logback.xml
  • 业务操作日志记录到数据库 sys_oper_log
  • 登录日志记录到 sys_logininfor

API 文档

启动后访问:http://localhost:8088/swagger-ui/index.html

Druid 监控:http://localhost:8088/druid/index.html(用户名 ruoyi,密码 123456)

业务模块说明

考勤模块(airport-attendance)

  • 记录安检员的上下班打卡、班组排班、岗位分配
  • 支持考勤区域管理和例行检查记录
  • 提供考勤统计、趋势分析、画像指标

巡检模块(airport-check)

  • 安检督导巡检任务的创建、分配、执行、记录
  • 发现问题后的纠错流程(含审批)
  • 大屏数据:巡检计划、问题趋势、纠错统计

查获物品模块(airport-item)

  • 安检查获违禁品的录入和分类统计
  • 绩效维度/指标/度量配置(支持分级质控评分)
  • 大屏展示:查获排名、趋势、TOP 物品

考试培训模块(airport-exam)

  • 题库管理(题目、分类、模块、选项)
  • 试卷管理(手动组卷、随机组卷)
  • 日考任务配置和作答记录
  • "十八条" 专项考试逻辑
  • 弱项分析、准确率分析

审批流程(airport-system)

  • 自研轻量审批引擎(非 Activiti/Flowable)
  • 支持工作流定义、多节点审批、驳回、抄送
  • 当前用于巡检纠错审批(check_correction

大屏数据

  • 综合大屏:考勤人数、查获统计、巡检执行情况
  • 考勤大屏:实时在岗人数、区域分布
  • 能力画像:个人考试成绩、考勤工时、绩效得分
  • 考题统计:答题准确率、薄弱知识点分析

重庆需求分析(2026-04-23)

来源文件:重庆需求资料/ 目录下的 Excel 需求文档,包括组织架构差异、需求要点整理、配分表分析、台账导入分析、系统功能一览,以及六大维度的台账及配分表。


一、组织架构(四级,与其他机场不同)

重庆与成都(三级)、海口(四级但结构不同)存在差异,需重点适配:

安检站(站长)
  └── 部门(部门经理,每部门约6个班组)
        └── 队室/班组(队长,含3个小组)
              └── 小组/通道(组长,14~18人)
                    └── 员工(安检员,约1000人)
行政部门(并列于业务部门):安全中心 / 培训中心 / 服务中心 / 设备中心

影响:组织架构树、数据权限、分值汇总逻辑均需支持四层业务层级 + 行政部门并列结构。


二、六大维度评分体系

总体规则

维度 权重 基础分 指标体系
安全防控能力 40% 80 三级
服务响应能力 20% 80 三级
业务实操能力 15% 80 三级
作风践行能力 10% 80 三级
群团协作能力 10% 80 四级(唯一)
身心调节能力 5% 80 三级(探索中)

等级与预警

等级 分值 字体颜色 预警动作
较差 < 75 红色 启动预警,推送至管理人员
良好 75~85 正常
优秀 > 85 绿色
已推送 黄色 已推送标识,纳入重点关注

推送机制

  • 每个维度可单独配置推送阈值(按部门调整)
  • 支持定向推送:将单/多个指标数据推送至指定管理人员
  • 推送完成后对应数据字体变为黄色

附加分标签

  • 特定岗位(部门教员、部门质控员、通道组长等)或突出表现可获专属标签
  • 每个标签对应 +1 附加分,不设上限

三、六大维度配分表详细规则(共98条指标)

1. 安全防控能力(40%,基础分80)

减分项:

NO 二级指标 三级指标(细则) 扣分 可叠加后果
1 员工规范化操作【部门监察问题记录表】 站层级质控 1 返航/二次清舱-10、航班延误-8、旅客滞留-5、产生舆论-2、通报批评站-2/公司-3/局方-10、外部通报扭转-1
2 部门层级质控 0.8
3 上级领导巡查发现问题 1.2
4 后台实时质控拦截【部门实时质控拦截情况记录表】 站层级 1
5 部门层级 0.8
6 不安全事件【不安全事件】 未经安检旅客进隔离区/爆炸物/枪支弹药 10
7 枪支零部件/管制器具 8
8 危险液体固体气体/毒害品/放射性/仿真枪 5
9 漏检证件/弹壳/烟花(D类除外) 3
10 禁带锐器/火种/锂电池等 2
11 安保测试未通过【安保测试记录表(部门)】 局方层级 0.5
12 公司层级 0.5
13 站层级 0.5

加分项:

NO 二级指标 三级指标(细则) 加分 可叠加
14 典型案例查获【小额奖励审批单】 一类 1 通报表扬站+1/公司+3/局方+5/讲评会+0.5
15 二类 0.5
16 特殊物品(实时拦截数) 0.15/个
17 风险隐患 发现安全隐患及时上报处置 1
18 通过自愿报告系统上报采纳 1
19 部门层级内部建议采纳 0.5

2. 服务响应能力(20%,基础分80)

减分项:

NO 二级指标 三级指标 扣分 叠加
20 旅客服务投诉【投诉情况】(确认有责) 未按服务质量手册执行 2 航班延误-10、旅客滞留-5、人员受伤-5、金额赔付-2、产生舆论-2、通报批评站-2/公司-3/局方-10
21 服务监察【服务巡查】 航站楼及以上层级 1.2
22 站层级 1
23 部门层级 0.8

加分项:

NO 二级指标 三级指标 加分
24 典型服务案例【航站楼加分】【锦旗及感谢信】 表扬信 0.7
25 帮扶类 0.5
26 锦旗 1
27 讲评会点名表扬 0.5
28 风险隐患 发现服务隐患及时上报处置 1
29 自愿报告系统上报采纳 1
30 部门层级建议采纳 0.5

3. 业务实操能力(15%,基础分80)

减分项:

NO 二级指标 细则 扣分
31 站层级及以上考核【成绩收集】 补考阶梯递增:第1次-2,第2次-4,第3次-6,后续每次再+2 累加
32 队室及部门层级考核 未通过 1
33 技能保持 未完成培训,每超1天 0.2
34 岗位技能不匹配 中级证满3年未放开机 0.5
35 返岗员工未按期放单号位 0.5
36 新员工未按期放单号位 0.5

加分项:

NO 二级指标 细则 加/扣分
37 考试成绩【成绩收集】 季度理论考试≥98分 +5
38 季度开机员考核≥98分 +5
39 导师带徒 初级(验证/人身):学员通过放单 +1
40 初级:学员每次不通过 -0.2
41 中级开机:学员通过放单 +5
42 中级开机:学员每次不通过 -0.2

4. 作风践行能力(10%,基础分80)

减分项:

NO 二级指标 三级指标 扣分
41 诚信记录 徇私舞弊/考试作弊被通报 10
42 信息报送真实度 弄虚作假/迟报/瞒报/谎报 2(可叠加通报)
43 出勤情况 迟到/早退 1
44 中途离岗 5
45 旷工 10
46 形象维护 私拿旅客物品 2
47 占用公司财务 5
48 着制服外出 1
49 纪委监察 2
50 打架斗殴 10
51 勤务执行力 接通知10分钟内未到岗 2

加分项:

NO 二级指标 三级指标 加分
52 形象维护 正确处置旅客无理取闹(站内审批) 2
53 经部门研究讨论认定 0.5
54 全勤 季度内无迟到/早退/任何请假 5
55 志愿者服务 参与安检站/航站楼志愿服务 0.5

5. 群团协作能力(10%,基础分80,纯加分,唯一四级体系)

NO 二级 三级 四级 加分
56~58 活动参与度 部门/站/站及以上层级 0.5/1/2
59~67 团队荣誉 部门/站/站及以上 一/二/三等奖 1~7
68~76 个人荣誉 部门/站/站及以上 一/二/三等奖 2~8
77~91 新闻 站(CQ安小检)/公司/局方层级 新闻发表/诗歌绘画/视频脚本/制作/参演 0.5~1
92~95 自主活动筹备 部门/站层级 策划筹备/辅助推进 1~6

6. 身心调节能力(5%,基础分80,探索中)

NO 二级指标 细则 处理
96 病假 不做扣分处理 仅记录
97 工作8小时外不良生活记录 酗酒/熬夜等影响勤务 仅记录推送管理人员
98 活动打卡 休息日运动打卡(徒步/健身/爬山) +0.5

四、台账体系与处理方式

总计22个台账,对应12个细分指标;其余86项指标通过【配分事项录入页面】手动录入。

NO 台账名称 计分 导入 页面录入 说明
1 部门监察问题记录表
2 队室三级质控巡查记录表 暂未计分
3 部门实时质控拦截情况记录表 对应现有查获功能
4 服务巡查
5 投诉情况
6 日常培训记录 已实现(2026-05-10,Phase 5)
7 安保测试记录表(部门)
8 旅检三部人员信息表 已实现(2026-04-22已导入测试环境)
9 通道过检率 暂未计分
10 不安全事件
11 部门奖惩记录表 字段简单,改为页面录入
12 请、休假记录表(特殊) 同上
13 锦旗及感谢信 同上
14 2026查获违规品统计 暂未计分
15 航站楼加分
16 组长履职情况记录表 已实现(2026-05-10,Phase 5)
17 健康锐兵 已实现(2026-05-10,Phase 5)
18 宿舍消防安全专项自查表 已实现(2026-05-10,Phase 5)
19 成绩收集
20 培训台账问题通报 已实现(2026-05-10,Phase 5)
21 小额奖励审批单 通过钉钉OA接入(已简化为9字段版本)
22 考勤台账 不涉及计分,暂不同步

台账导入规则(通用)

  • 按客户原始台账全量字段导入,暂不提供增删改(用户管理除外)
  • 绿色字段:列表页展示;灰色字段:详情页展示
  • 导入时不做字段删减,保留客户多年运营的台账结构

各台账关键字段

部门监察问题记录表(25字段) 时间 / 区域 / 工作点 / 岗位 / 责任人 / 问题描述 / 问题类型 / 整改措施 / 依据 / 问题层级 / 班组 / 队室质控员 / 质控推送队室负责人 / 附件 / 整改情况 / 佐证材料 / 本月内发生问题次数 / 上月质控问题超过三次人员 / 检查人员 / 分管质控经理 / 录入时间 / 部门培训教员 / 队室内勤 / 发送至相关人员 / 队室负责人

部门实时质控拦截情况记录表(30字段) 时间 / 区域 / 工作点 / 岗位 / 责任人 / 实时质控拦截物品 / 个数 / 问题类型 / 整改措施 / 问题层级 / 班组 / 附件 / 问题类别 / 个人复盘 / 队室复盘 / 队室质控员 / 质控推送队室负责人 / 开机年限 / 责任人开机年龄 / 发送至相关人员 / 本月内发生问题次数 / 上月发生次数 / 实时图像漏检难易度 / 检查人员 / 部门培训教员 / 分管质控经理 / 队室内勤 / 备注 / 队室负责人

不安全事件(11字段) 时间 / 事件描述 / 航班号 / 责任人 / 涉及班组 / 涉及物品 / 岗位 / 区域 / 通道号 / 图像 / 队室内勤

安保测试记录表(部门)(19字段) 开展时间 / 测试区域 / 测试通道 / 测试项目 / 被测试人员 / 被测试岗位 / 测试物品 / 图片或视频 / 是否通过 / 层级 / 整改措施 / 复查地点及时间 / 整改材料 / 班组 / 推送队室质控员 / 推送质控队长 / 队室内勤 / 推送按钮 / 队室负责人

小额奖励审批单(简化版9字段,2026-04-21客户修改后) 员工编码 / 姓名 / 查获(事件)时间 / 奖励类别 / 查获物品 / 类别(一类/二类) / 奖励事由(安全) / 人员类别 / 主要事由简述

投诉情况(13字段) 时间 / 航班号 / 旅客姓名 / 班组 / 责任人 / 投诉情况 / 旅客诉求 / 类别 / 渠道来源 / 是否有责 / 处理进度 / 责任队长 / 队室内勤

服务巡查(22字段) 时间 / 区域 / 工作点 / 岗位 / 责任人 / 问题描述 / 问题类型 / 整改措施 / 班组 / 问题层级 / 队室服务联络人 / 服务推送队室负责人 / 附件 / 整改情况 / 佐证材料 / 本月内发生问题次数 / 检查人员 / 分管服务经理 / 发送至相关人员 / 队室内勤 / 队室负责人

成绩收集(9字段) 类别 / 期数 / 考试人员 / 理论成绩 / 图像成绩 / 班组 / 分类 / 备注(补考分数)/ 队室教员

航站楼加分(7字段) 审核日期 / 姓名 / 班组 / 加分分数 / 队室内勤 / 总加分数 / 队室负责人

配分事项录入页面(通用字段) 一级指标 / 二级指标 / 三级指标 / 四级指标 / 时间 / 位置 / 责任人 / 分值(正/负)/ 事件描述 / 备注


五、新增功能模块(开发任务)

优先级 Step1(首期上线)

功能 类型 说明
台账一键导入主页面 新增页面 单页面实现20个台账的Excel导入(两列10行布局),每台账对应独立DB表
各台账查询页面(NO.1~5,7,9~15,19,21) 新增页面×14 导入后查询,全字段显示,支持导出
配分表体系维护 新增页面 6维度98项指标的增删改查,支持权重/分值/启停/备注配置
配分事项录入页面 新增页面 针对个人手动录入加/扣分事项,含导入导出,覆盖86项无台账指标及叠加情况
台账数据→配分事项同步 后台处理 台账导入时/定时将计分相关台账数据转换汇总为跑分原始记录
配分表计算(跑分引擎) 后台处理 按98项规则计算员工各维度得分,预存结果供大屏快速展示
大屏:六维度雷达图画像 改造大屏 员工→小组→队室→部门→站 四级汇总,含等级预警色标
预警推送机制 后台+配置 <75红色预警推送,>85绿色,已推送黄色,支持分维度阈值配置
附加分标签系统 新增功能 为特定岗位/突出表现员工设置标签,每标签+1分不设上限

优先级 Step2(二期)

功能 类型 说明
钉钉组织架构同步 集成 自动抓取钉钉组织架构数据
钉钉考勤数据接入 集成 钉钉导出考勤台账接入系统
钉钉OA审批流对接 集成 小额奖励审批单已在钉钉运行,对接接入
AI助手(13个场景) 新增 员工画像/评价/人员筛选/排班辅助/知识库/风险分析等
顾客投诉系统 新增 远期建设独立安检站客诉系统
设备中心 新增 设备准入/运营管理(定检巡检保修)/退出报废
薪酬接入 集成 远期接入人事薪酬系统,KPI自动计算

六、数据库新增表设计需求

# 台账对应表(14个,按台账编号)
ledger_supervision_problem         -- 部门监察问题记录表
ledger_patrol_inspection           -- 队室三级质控巡查记录表
ledger_realtime_interception       -- 部门实时质控拦截情况记录表
ledger_service_patrol              -- 服务巡查
ledger_complaint                   -- 投诉情况
ledger_security_test               -- 安保测试记录表(部门)
ledger_channel_pass_rate           -- 通道过检率
ledger_unsafe_event                -- 不安全事件
ledger_reward_penalty              -- 部门奖惩记录表
ledger_leave_special               -- 请、休假记录表(特殊)
ledger_banner_letter               -- 锦旗及感谢信
ledger_seizure_stats               -- 2026查获违规品统计
ledger_terminal_bonus              -- 航站楼加分
ledger_exam_score                  -- 成绩收集
ledger_reward_approval             -- 小额奖励审批单

# 配分体系表
score_dimension                    -- 一级维度(6个维度+权重)
score_indicator                    -- 二/三/四级指标(98条,含类型/分值/启停)

# 跑分原始数据表
score_event                        -- 配分事项录入表(手动录入+台账同步)

# 计算结果缓存表(可选)
score_result                       -- 预计算结果(员工×维度×周期)

七、AI助手需求场景(Step2,共13个)

NO 场景 描述
1 员工画像 输入姓名生成综合画像(班组/岗位资质/开机年限/综合评分),支持通道批量查询,支持个性化标签
2 员工评价 客观AI评价,多维度对比,快速锁定风险人员
3 人员筛选 按近三月无违规/高查获率/零投诉/考核优秀等条件精准匹配
4 考勤及薪酬 自动计算休假期间节假日加班
5 培训提醒 危险品复训提醒、高级证书到期提醒
6 漏检漏查 按人员/时间段查询漏检漏查情况
7 制度法规知识库 AI问答查找法规细则
8 风险分析 AI定位风险点,生成管控措施,支持分级管理
9 智能排班 自动校验在岗状态/漏排错排,一键推送排班通知
10 辅助排班 最大化人员分配,计算可开放最大通道数
11 新建通道计算 利用休息人员快速计算可组建的新通道
12 宏观数据比对 全国机场旅客吞吐量/Capes服务评测排名查询
13 航班量预测 预测勤务运行效率,辅助通道开放决策

Phase 1 实现记录(台账导入,2026-04-24)

新增模块 airport-ledger

位置:airport-ledger/,已注册到父 pom.xmlairport-admin/pom.xml

包结构com.sundot.airport.ledger.{domain / mapper / service / service.impl}

Domain(15个实体类)

类名 表名 类型
LedgerSupervisionProblem ledger_supervision_problem 导入
LedgerPatrolInspection ledger_patrol_inspection 导入
LedgerRealtimeInterception ledger_realtime_interception 导入
LedgerServicePatrol ledger_service_patrol 导入
LedgerComplaint ledger_complaint 导入
LedgerSecurityTest ledger_security_test 导入
LedgerChannelPassRate ledger_channel_pass_rate 导入
LedgerUnsafeEvent ledger_unsafe_event 导入
LedgerSeizureStats ledger_seizure_stats 导入
LedgerTerminalBonus ledger_terminal_bonus 导入
LedgerExamScore ledger_exam_score 导入
LedgerRewardApproval ledger_reward_approval 导入
LedgerRewardPenalty ledger_reward_penalty 页面录入(含CRUD)
LedgerLeaveSpecial ledger_leave_special 页面录入(含CRUD)
LedgerBannerLetter ledger_banner_letter 页面录入(含CRUD)

所有实体类遵循现有约定:继承 BaseEntity@TableName@TableId(type = IdType.AUTO)@Excel 注解、手动 getter/setter(不用 Lombok)

Mapper / XML

  • 15 个 Mapper 接口(extends BaseMapper<T>),含 selectList(T query) 自定义查询
  • 15 个 XML 文件位于 airport-ledger/src/main/resources/mapper/ledger/
  • 路径符合 classpath*:mapper/**/*Mapper.xml,无需改配置
  • 包路径符合 @MapperScan("com.sundot.airport.**.mapper"),无需改配置

Service / ServiceImpl

  • 12个导入类型服务含 batchInsert(List<T>)(调用 MyBatis Plus saveBatch
  • 3个页面录入服务仅含 selectList,CRUD 直接用 IServicesave/updateById/removeById

Controller(airport-admin)

位置:airport-admin/src/main/java/com/sundot/airport/web/controller/ledger/

文件 路由前缀 说明
LedgerImportController /ledger/import 12个导入接口,用 EasyExcel 读取 MultipartFile
LedgerSupervisionProblemController /ledger/supervisionProblem list + export + getById
LedgerPatrolInspectionController /ledger/patrolInspection 同上
LedgerRealtimeInterceptionController /ledger/realtimeInterception 同上
LedgerServicePatrolController /ledger/servicePatrol 同上
LedgerComplaintController /ledger/complaint 同上
LedgerSecurityTestController /ledger/securityTest 同上
LedgerChannelPassRateController /ledger/channelPassRate 同上
LedgerUnsafeEventController /ledger/unsafeEvent 同上
LedgerSeizureStatsController /ledger/seizureStats 同上
LedgerTerminalBonusController /ledger/terminalBonus 同上
LedgerExamScoreController /ledger/examScore 同上
LedgerRewardApprovalController /ledger/rewardApproval 同上
LedgerRewardPenaltyController /ledger/rewardPenalty list + export + 增删改查
LedgerLeaveSpecialController /ledger/leaveSpecial list + export + 增删改查
LedgerBannerLetterController /ledger/bannerLetter list + export + 增删改查

权限标识规则

ledger:import:{台账key}          # 导入
ledger:{台账key}:list            # 查询列表
ledger:{台账key}:export          # 导出
ledger:{台账key}:add/edit/remove # 仅3个页面录入类

SQL 脚本

sql/ledger.sql:15张台账表 + 1张 ledger_import_log(导入记录日志)。

待执行:在目标数据库运行该脚本后后端才可正常启动。


Phase 2 实现记录(配分体系,2026-04-24)

新增 SQL 脚本

sql/score.sql:4张表 + 6个维度初始数据

表名 说明
score_dimension 评分维度(6条初始数据:安全防控/服务响应/业务实操/作风践行/群团协作/身心调节)
score_indicator 评分指标(二/三/四级,parent_id=0为直属维度下的二级;dimension_id冗余到每行)
score_event 配分事项(手动录入+台账同步,含total_score=score_value+cascade_score)
score_push_config 推送配置(per维度per部门,warn_threshold默认75)

新增 Java 文件(airport-ledger 模块)

Domaincom.sundot.airport.ledger.domain):

类名 说明
ScoreDimension 维度,含weight/baseScore/sortOrder/status
ScoreIndicator 指标,含parentId/level/type/scoreValue/cascadeRule,children字段 @TableField(exist=false)
ScoreEvent 配分事项,含level2/3/4Name冗余、scoreValue/cascadeScore/totalScore
ScorePushConfig 推送配置,含warnThreshold/pushUserIds/pushUserNames

Mapper/XML/Service/Impl:各4套,路径与Phase 1相同。

IScoreIndicatorService.selectTree(dimensionId) — 递归buildTree,返回嵌套children列表。

IScoreEventService.batchInsert() — 自动计算 totalScore = scoreValue + cascadeScore。

新增 Controller(airport-admin)

位置:airport-admin/src/main/java/com/sundot/airport/web/controller/score/

文件 路由 说明
ScoreDimensionController /score/dimension CRUD + /all(不分页全量,供前端下拉)
ScoreIndicatorController /score/indicator CRUD + /tree?dimensionId= 返回指标树
ScoreEventController /score/event CRUD + /import(EasyExcel导入) + /export
ScorePushConfigController /score/pushConfig CRUD

权限标识规则

score:dimension:list/add/edit/remove/export
score:indicator:list/add/edit/remove/export
score:event:list/add/edit/remove/export/import
score:pushConfig:list/add/edit/remove

Phase 5 实现记录(5个新台账导入、MySQL严格模式修复,2026-05-10)

新增5个台账全栈实现

原来标注"暂不做"的5个台账现已全部实现导入+查询页面。

新增 Domain(airport-ledger)

类名 表名 关键字段
LedgerDailyTraining ledger_daily_training recordDate / teamName / responsibleTeacher / responsibleLeader / hours / projectName / trainingContent / trainer / trainingLocation / participantCount / isCompleted / remark
LedgerLeaderDuty ledger_leader_duty classComment / problemHandling / workTip / submitter / teamLeader / qualityOfficer
LedgerHealthSoldier ledger_health_soldier submitter / submitTime / teamName / teamLeader / subHealthStatus(列表显示)+ 另外16个详情字段
LedgerDormFireSafety ledger_dorm_fire_safety checkDate / dormLocation / dormNo / checkItems / riskStatus / foundRisk / photos / rectifyPerson / rectifyTime / submitTime / submitter
LedgerTrainingIssue ledger_training_issue recordDate / ledgerContent / specificProblem / handler / teamName / recheckProblem / isRectified

特殊规则:健康锐兵列表页只显示 B/R/S/T/U 列(submitter / submitTime / teamName / teamLeader / subHealthStatus),其余字段存库但仅在详情页展示。

新增 Mapper / XML / Service / Controller

  • 5 个 Mapper XML,位于 airport-ledger/src/main/resources/mapper/ledger/
  • 5 个 Service + Impl,均继承 ServiceImpl,含 selectListbatchInsert
  • 5 个 Controller,位于 airport-admin/.../controller/ledger/
文件 路由前缀
LedgerDailyTrainingController /ledger/dailyTraining
LedgerLeaderDutyController /ledger/leaderDuty
LedgerHealthSoldierController /ledger/healthSoldier
LedgerDormFireSafetyController /ledger/dormFireSafety
LedgerTrainingIssueController /ledger/trainingIssue

修改 LedgerImportController

新增5个 @PostMapping(单类型导入端点,使用 EasyExcel headRowNumber(2) 处理双行表头):

POST /ledger/import/dailyTraining
POST /ledger/import/leaderDuty
POST /ledger/import/healthSoldier
POST /ledger/import/dormFireSafety
POST /ledger/import/trainingIssue

修改 LedgerCombinedImportServiceImpl

新增5个 SHEET_ROUTE 入口 + 5个 do*() 列索引映射方法:

Sheet名(Excel中) 方法 列范围
日常培训记录 doDailyTraining cols 0-11
组长履职情况记录表 doLeaderDuty cols 0-5
健康锐兵(2026_3) doHealthSoldier cols 0-20(21列)
宿舍消防安全专项自查表 doDormFireSafety cols 0-10
培训台账问题通报 doTrainingIssue cols 0-6

注意:所有5个Sheet均有双行表头(第1行为说明,第2行为列名),数据从第3行起。dataRows(sheet, 2) 方法负责跳过前2行。

新增菜单 SQL

sql/menu_ledger_new5.sql(已在数据库执行,2026-05-10):

menu_id 说明
2502-2504 日常培训记录菜单 + 导出/查询按钮
2505-2507 组长履职情况记录菜单 + 导出/查询按钮
2508-2510 健康锐兵菜单 + 导出/查询按钮
2511-2513 宿舍消防安全自查菜单 + 导出/查询按钮
2514-2516 培训台账问题通报菜单 + 导出/查询按钮
2517-2521 台账一键导入页(parent 2301)下的5个导入按钮权限

执行菜单SQL后需清除 Redis 缓存(退出重登录或系统监控→缓存监控→清理全部),并执行:

INSERT INTO sys_role_menu (role_id, menu_id)
SELECT <role_id>, menu_id FROM sys_menu WHERE menu_id BETWEEN 2502 AND 2521;

新增建表 SQL

sql/ledger_new5.sql:5张新台账表(ledger_daily_training / ledger_leader_duty / ledger_health_soldier / ledger_dorm_fire_safety / ledger_training_issue)。


Bug修复:AttendancePostRecordMapper.xml DATETIME 严格模式报错

错误Incorrect DATETIME value: ''(MySQL error 1525)

位置airport-attendance/src/main/resources/mapper/attendance/AttendancePostRecordMapper.xml

根因:MySQL 8 严格模式下,DATETIME 列不能与空字符串 '' 做等值比较。XML 中有6处此类条件,出现在 selectAttendancePostRecordListselectLocationsByTimeAndChannelNameselectCheckOutTimeByShiftCodesselectKezhangRecordCountqueryKeIdsselectTeamOnList 查询中。

修复:将所有 OR check_out_time = ''AND check_out_time != '' 删除,保留 IS NULL= '2000-01-01 00:00:00' 两个有效判断条件(check_out_time 列只存 NULL 或有效日期值,空字符串条件永远不会命中任何行)。


Phase 6 实现记录(台账数据清理功能,2026-05-10)

功能概述

在台账一键导入页新增"按导入时间范围清理"功能,支持选择日期范围后删除20张台账表中对应时间段的数据,同时清除由台账同步生成的配分事项(source_type='2'),手动录入的配分事项不受影响。

后端修改

ILedgerCombinedImportService(新增方法):

Map<String, Integer> clearByCreateTime(String beginTime, String endTime);

LedgerCombinedImportServiceImpl

  • 新增 @Autowired IScoreEventService scoreEventService
  • 新增 clearByCreateTime 实现:遍历20张台账表,每张调用 clearOne 私有方法,最后调用 clearScoreEvents 清理台账同步配分事项
  • 私有方法 clearOne(IService, begin, end):先 countremove,使用原始类型 QueryWrapper 避免泛型问题
    • 注意new QueryWrapper() 原始类型的链式方法返回 Object(泛型擦除),必须分两行写:先 new QueryWrapper qw = new QueryWrapper(),再单独调 qw.between(...)
  • 私有方法 clearScoreEvents(begin, end):额外加 .eq("source_type", "2") 条件

LedgerImportController(新增端点):

DELETE /ledger/import/clear?beginTime=yyyy-MM-dd&endTime=yyyy-MM-dd
权限:ledger:clear:all
日志:台账数据清理 / BusinessType.CLEAN
返回:{ msg: "清理完成,共删除N条记录", data: { 表说明: 删除条数, ... } }

sql/truncate_ledger.sql:同步新增5张表(共20张),注释从"15张"改为"20张"。

菜单权限 SQL(按需执行)

-- 按钮权限节点(挂在台账一键导入页 2301 下)
INSERT INTO `sys_menu` (`menu_id`,`menu_name`,`parent_id`,`order_num`,`path`,`component`,`query`,`route_name`,`is_frame`,`is_cache`,`menu_type`,`visible`,`status`,`perms`,`icon`,`create_by`,`create_time`,`update_by`,`update_time`,`remark`)
VALUES (2522,'清理台账数据',2301,18,NULL,NULL,NULL,'',1,0,'F','0','0','ledger:clear:all','#','admin',NOW(),'',NULL,NULL);

-- 分配给角色(admin 超管默认跳过权限校验,可不执行)
INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2522;

admin 账号登录时 RuoYi 跳过 @PreAuthorize 校验,无需执行菜单SQL即可使用。

编译注意

clearOne 使用原始类型 @SuppressWarnings({"unchecked", "rawtypes"}),编译会有 unchecked 警告,属于预期行为,不影响运行。


Phase 7 实现记录(台账细节修复与查询增强,2026-05-11)

一、成绩收集双字段修复(ledger_exam_score)

问题:原导入只读取了理论成绩(col 3),图像成绩(col 4)丢失;域对象只有单个 score 字段。

修改文件

文件 变更
LedgerExamScore.java score → 拆分为 theoryScore(理论成绩)+ imageScore(图像成绩),@Excel 注解对应更新
LedgerExamScoreMapper.xml resultMap 和 selectVo 中 scoretheory_score, image_score
LedgerCombinedImportServiceImpl.java doExamScore:新增 o.setImageScore(decimal(c, 4))
LedgerSyncServiceImpl.java getScore()getTheoryScore()
examScore/index.vue(前端) 单列"成绩"→ 两列"理论成绩"、"图像成绩"

DB 迁移 SQL(需在目标库执行一次):

ALTER TABLE ledger_exam_score CHANGE score theory_score DECIMAL(5,2) COMMENT '理论成绩';
ALTER TABLE ledger_exam_score ADD COLUMN image_score DECIMAL(5,2) COMMENT '图像成绩' AFTER theory_score;

二、部门奖惩"分值变动"改为"罚款金额"

影响范围

文件 变更
LedgerRewardPenalty.java @Excel(name = "分值变动")@Excel(name = "罚款金额")
LedgerTemplateController.java rewardPenalty 列名 "扣罚金额""罚款金额"
rewardPenalty/index.vue(前端) 列表列头、表单标签均改为"罚款金额"

三、8个台账页面追加人员查询条件

每个页面在查询表单中新增一个人员姓名输入框,后端 Mapper XML 对应新增模糊查询条件。

台账 新增查询字段 前端 prop DB 列
实时质控拦截 查获人 inspectorName inspector_name
服务巡查 被查人 inspectedName inspected_name
安保测试记录 被测人 testedName tested_name
不安全事件 责任人 responsibleName responsible_name
小额奖励审批单 姓名 personName person_name
部门奖惩 姓名 personName person_name
请休假记录 姓名 personName person_name
锦旗及感谢信 姓名 personName person_name

后端涉及 Mapper XML(各新增一行 <if> 条件,位于 teamName 条件之后): LedgerRealtimeInterceptionMapper.xml / LedgerServicePatrolMapper.xml / LedgerSecurityTestMapper.xml / LedgerUnsafeEventMapper.xml / LedgerRewardApprovalMapper.xml / LedgerRewardPenaltyMapper.xml / LedgerLeaveSpecialMapper.xml / LedgerBannerLetterMapper.xml


四、模板下载功能(Phase 7 补充)

新增 LedgerTemplateController.java,提供 Excel 导入模板下载:

GET /ledger/template          # 下载包含全部20个台账 Sheet 的合并模板
GET /ledger/template?type=xxx # 下载单台账模板
  • 使用 Apache POI XSSFWorkbook 生成,保留客户原始 Sheet 名和列名
  • 双行表头台账(headRows=2):第1行为灰色合并标题行,第2行为浅蓝列头行
  • 单行表头台账(headRows=1):仅 rewardApproval(小额奖励审批单)
  • 列宽自适应:Math.min(Math.max(charLen + 4, 16), 50) * 256

前端import/index.vue):每个台账卡片"下载模板"按钮 + 顶部"下载合并模板"按钮,使用 Blob 下载模式。


Phase 8 实现记录(员工画像接口增强与前端样式还原,2026-05-12)

一、后端:EmployeePortraitVO 字段扩充

修改文件airport-ledger/.../domain/vo/EmployeePortraitVO.java

新增字段:

字段 说明
birthday 出生日期,从18位身份证第7~14位提取(格式 yyyy-MM-dd)
major 专业(sys_user 新增列,需执行迁移 SQL)
roleNames 职务(来自 sys_role,逗号分隔)
postNames 岗位(来自 sys_post,逗号分隔)
qualityControlCount 查获违规品次数(来自 ledger_seizure_stats)
scoreDetails 配分明细列表(List<ScoreDetail>)

内部类变更

  • AwardRecord:字段改为 level2Name / level3Name / level4Name / score(与 score_event 列名一致)
  • ScoreDetail(新增):dimensionName / level2Name / level3Name / totalScore

DB 迁移 SQL(major 字段,按需执行):

ALTER TABLE sys_user ADD COLUMN major VARCHAR(100) COMMENT '专业' AFTER schooling;

二、后端:EmployeePortraitServiceImpl 逻辑增强

修改文件airport-ledger/.../service/impl/EmployeePortraitServiceImpl.java

新增 Autowire:SysRoleMapperSysPostMapperLedgerSeizureStatsMapper

方法 变更说明
fillUserInfo 从身份证提取出生日期;调用 selectRolesByUserName 填充 roleNames;调用 selectPostsByUserName 填充 postNames
fillAwards 改为查询 score_event WHERE dimension_id = 5,精确匹配 person_name(支持逗号多人字段)
fillScoreDetails(新增) 查询员工时间范围内所有 score_event,构建加减分明细列表
getPortrait 新增调用 fillScoreDetailsledgerSeizureStatsMapper.countByInspectorAndDateRange

三、后端:LedgerSeizureStatsMapper 新增查询方法

修改文件LedgerSeizureStatsMapper.java + LedgerSeizureStatsMapper.xml

int countByInspectorAndDateRange(@Param("inspectorName") String inspectorName,
                                 @Param("beginTime")     String beginTime,
                                 @Param("endTime")       String endTime);

SQL:SELECT count(*) FROM ledger_seizure_stats WHERE del_flag='0' AND inspector_name=#{inspectorName} + 日期范围条件。


四、前端:员工画像页面样式全面还原(employeeScreen 分支)

修改文件src/views/portraitManagement/employeeProfile/index.vuesrc/assets/styles/index.scss

各区块 CSS 按设计稿原型图(51108~51142)精确还原:

区块 关键 CSS
ep-root background: linear-gradient(180deg, #C5DDFF 0%, #E4FBF0 100%)
basic-card flex:3; background:#eef7ff
score-card flex:1; background:rgb(239,246,254)
left-mid-card width:604px; background:rgb(243,250,252)
radar-card flex:1; background:rgb(242,249,253)
姓名 / 标题 font-size:64px; YSBiaoTiHei-bold; color:rgba(31,135,232,1)
综合评价数字框 320×126px; border-radius:30px; background:rgba(118,220,198,1); color:rgba(247,89,54,1); font-size:72px
工作履历内容 background:rgba(236,220,220,1); border-radius:30px; font-size:20px; PingFang SC
获奖记录区 background:rgba(169,209,250,1); border-radius:20px
补充信息背景 background:rgba(254,233,232,1);数值背景:#FEE9E8
业务岗位背景 background:rgba(254,233,232,1)
培训情况背景 background:#CEF8E4;数值单元格背景:#CEF8E4
质控情况背景 background:#D5E7FD

雷达图颜色规则:< 75 红色,≥ 90 绿色,其余黑色线条 + 黄色填充。

工作履历显示格式:2020.1.1入职 | 司龄6年 | 开机年限5年 | 现任职班组长,字段为空时显示 0(暂无数据)


五、注意事项

score_event 直接 INSERT 时 del_flag 必须填 '0',不能是空字符串。ScoreEventMapper.xml 的查询条件为 WHERE del_flag = '0'del_flag = '' 的记录查不出来。

修复已有问题数据:

UPDATE score_event SET del_flag = '0' WHERE del_flag = '' AND dimension_id = 5;