重庆机场安检分级质控系统服务端,基于若依(RuoYi)框架二次开发的 Spring Boot 多模块 Maven 项目。提供考勤管理、查获物品、巡检管理、考试培训、大屏数据、绩效管理等 REST API。
com.sundot.airport.Applicationchongqing)host: 127.0.0.1:3306
database: chongqing
username: root
password: Samsundot@123!
数据库初始化脚本:sql/chongqing-test.sql
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/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)
BaseEntity(含 createBy/createTime/updateBy/updateTime/remark)src/main/resources/mapper/ 下dto/ 包下AjaxResult({ code, msg, data })PageHelper.startPage() + TableDataInfo 返回@PreAuthorize("@ss.hasPermi('模块:功能:操作')")@Log(title = "...", businessType = BusinessType.XXX)@DataScope(deptAlias = "d", userAlias = "u")POST /login,返回 JWT TokenAuthorization: Bearer <token>classpath*:mapper/**/*Mapper.xmlcom.sundot.airport.**.domaincom.sundot.airport.common.core.redis.RedisCacheStatisticsCacheController 提供手动刷新接口airport-admin/src/main/resources/logback.xmlsys_oper_log 表sys_logininfor 表启动后访问:http://localhost:8088/swagger-ui/index.html
Druid 监控:http://localhost:8088/druid/index.html(用户名 ruoyi,密码 123456)
check_correction)来源文件:
重庆需求资料/目录下的 Excel 需求文档,包括组织架构差异、需求要点整理、配分表分析、台账导入分析、系统功能一览,以及六大维度的台账及配分表。
重庆与成都(三级)、海口(四级但结构不同)存在差异,需重点适配:
安检站(站长)
└── 部门(部门经理,每部门约6个班组)
└── 队室/班组(队长,含3个小组)
└── 小组/通道(组长,14~18人)
└── 员工(安检员,约1000人)
行政部门(并列于业务部门):安全中心 / 培训中心 / 服务中心 / 设备中心
影响:组织架构树、数据权限、分值汇总逻辑均需支持四层业务层级 + 行政部门并列结构。
| 维度 | 权重 | 基础分 | 指标体系 |
|---|---|---|---|
| 安全防控能力 | 40% | 80 | 三级 |
| 服务响应能力 | 20% | 80 | 三级 |
| 业务实操能力 | 15% | 80 | 三级 |
| 作风践行能力 | 10% | 80 | 三级 |
| 群团协作能力 | 10% | 80 | 四级(唯一) |
| 身心调节能力 | 5% | 80 | 三级(探索中) |
| 等级 | 分值 | 字体颜色 | 预警动作 |
|---|---|---|---|
| 较差 | < 75 | 红色 | 启动预警,推送至管理人员 |
| 良好 | 75~85 | 正常 | 无 |
| 优秀 | > 85 | 绿色 | 无 |
| 已推送 | — | 黄色 | 已推送标识,纳入重点关注 |
减分项:
| 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 |
减分项:
| 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 |
减分项:
| 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 |
减分项:
| 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 |
| 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 |
| 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字段)
审核日期 / 姓名 / 班组 / 加分分数 / 队室内勤 / 总加分数 / 队室负责人
配分事项录入页面(通用字段)
一级指标 / 二级指标 / 三级指标 / 四级指标 / 时间 / 位置 / 责任人 / 分值(正/负)/ 事件描述 / 备注
| 功能 | 类型 | 说明 |
|---|---|---|
| 台账一键导入主页面 | 新增页面 | 单页面实现20个台账的Excel导入(两列10行布局),每台账对应独立DB表 |
| 各台账查询页面(NO.1~5,7,9~15,19,21) | 新增页面×14 | 导入后查询,全字段显示,支持导出 |
| 配分表体系维护 | 新增页面 | 6维度98项指标的增删改查,支持权重/分值/启停/备注配置 |
| 配分事项录入页面 | 新增页面 | 针对个人手动录入加/扣分事项,含导入导出,覆盖86项无台账指标及叠加情况 |
| 台账数据→配分事项同步 | 后台处理 | 台账导入时/定时将计分相关台账数据转换汇总为跑分原始记录 |
| 配分表计算(跑分引擎) | 后台处理 | 按98项规则计算员工各维度得分,预存结果供大屏快速展示 |
| 大屏:六维度雷达图画像 | 改造大屏 | 员工→小组→队室→部门→站 四级汇总,含等级预警色标 |
| 预警推送机制 | 后台+配置 | <75红色预警推送,>85绿色,已推送黄色,支持分维度阈值配置 |
| 附加分标签系统 | 新增功能 | 为特定岗位/突出表现员工设置标签,每标签+1分不设上限 |
| 功能 | 类型 | 说明 |
|---|---|---|
| 钉钉组织架构同步 | 集成 | 自动抓取钉钉组织架构数据 |
| 钉钉考勤数据接入 | 集成 | 钉钉导出考勤台账接入系统 |
| 钉钉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 -- 预计算结果(员工×维度×周期)
| NO | 场景 | 描述 |
|---|---|---|
| 1 | 员工画像 | 输入姓名生成综合画像(班组/岗位资质/开机年限/综合评分),支持通道批量查询,支持个性化标签 |
| 2 | 员工评价 | 客观AI评价,多维度对比,快速锁定风险人员 |
| 3 | 人员筛选 | 按近三月无违规/高查获率/零投诉/考核优秀等条件精准匹配 |
| 4 | 考勤及薪酬 | 自动计算休假期间节假日加班 |
| 5 | 培训提醒 | 危险品复训提醒、高级证书到期提醒 |
| 6 | 漏检漏查 | 按人员/时间段查询漏检漏查情况 |
| 7 | 制度法规知识库 | AI问答查找法规细则 |
| 8 | 风险分析 | AI定位风险点,生成管控措施,支持分级管理 |
| 9 | 智能排班 | 自动校验在岗状态/漏排错排,一键推送排班通知 |
| 10 | 辅助排班 | 最大化人员分配,计算可开放最大通道数 |
| 11 | 新建通道计算 | 利用休息人员快速计算可组建的新通道 |
| 12 | 宏观数据比对 | 全国机场旅客吞吐量/Capes服务评测排名查询 |
| 13 | 航班量预测 | 预测勤务运行效率,辅助通道开放决策 |
airport-ledger位置:airport-ledger/,已注册到父 pom.xml 和 airport-admin/pom.xml。
包结构:com.sundot.airport.ledger.{domain / mapper / service / service.impl}
| 类名 | 表名 | 类型 |
|---|---|---|
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)。
extends BaseMapper<T>),含 selectList(T query) 自定义查询airport-ledger/src/main/resources/mapper/ledger/classpath*:mapper/**/*Mapper.xml,无需改配置@MapperScan("com.sundot.airport.**.mapper"),无需改配置batchInsert(List<T>)(调用 MyBatis Plus saveBatch)selectList,CRUD 直接用 IService 的 save/updateById/removeById位置: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/ledger.sql:15张台账表 + 1张 ledger_import_log(导入记录日志)。
待执行:在目标数据库运行该脚本后后端才可正常启动。
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) |
Domain(com.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。
位置: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
原来标注"暂不做"的5个台账现已全部实现导入+查询页面。
| 类名 | 表名 | 关键字段 |
|---|---|---|
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),其余字段存库但仅在详情页展示。
airport-ledger/src/main/resources/mapper/ledger/ServiceImpl,含 selectList 和 batchInsertairport-admin/.../controller/ledger/:| 文件 | 路由前缀 |
|---|---|
LedgerDailyTrainingController |
/ledger/dailyTraining |
LedgerLeaderDutyController |
/ledger/leaderDuty |
LedgerHealthSoldierController |
/ledger/healthSoldier |
LedgerDormFireSafetyController |
/ledger/dormFireSafety |
LedgerTrainingIssueController |
/ledger/trainingIssue |
新增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
新增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/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/ledger_new5.sql:5张新台账表(ledger_daily_training / ledger_leader_duty / ledger_health_soldier / ledger_dorm_fire_safety / ledger_training_issue)。
错误:Incorrect DATETIME value: ''(MySQL error 1525)
位置:airport-attendance/src/main/resources/mapper/attendance/AttendancePostRecordMapper.xml
根因:MySQL 8 严格模式下,DATETIME 列不能与空字符串 '' 做等值比较。XML 中有6处此类条件,出现在 selectAttendancePostRecordList、selectLocationsByTimeAndChannelName、selectCheckOutTimeByShiftCodes、selectKezhangRecordCount、queryKeIds、selectTeamOnList 查询中。
修复:将所有 OR check_out_time = '' 和 AND check_out_time != '' 删除,保留 IS NULL 和 = '2000-01-01 00:00:00' 两个有效判断条件(check_out_time 列只存 NULL 或有效日期值,空字符串条件永远不会命中任何行)。
在台账一键导入页新增"按导入时间范围清理"功能,支持选择日期范围后删除20张台账表中对应时间段的数据,同时清除由台账同步生成的配分事项(source_type='2'),手动录入的配分事项不受影响。
ILedgerCombinedImportService(新增方法):
Map<String, Integer> clearByCreateTime(String beginTime, String endTime);
LedgerCombinedImportServiceImpl:
@Autowired IScoreEventService scoreEventServiceclearByCreateTime 实现:遍历20张台账表,每张调用 clearOne 私有方法,最后调用 clearScoreEvents 清理台账同步配分事项clearOne(IService, begin, end):先 count 后 remove,使用原始类型 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张"。
-- 按钮权限节点(挂在台账一键导入页 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 警告,属于预期行为,不影响运行。
问题:原导入只读取了理论成绩(col 3),图像成绩(col 4)丢失;域对象只有单个 score 字段。
修改文件:
| 文件 | 变更 |
|---|---|
LedgerExamScore.java |
score → 拆分为 theoryScore(理论成绩)+ imageScore(图像成绩),@Excel 注解对应更新 |
LedgerExamScoreMapper.xml |
resultMap 和 selectVo 中 score → theory_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(前端) |
列表列头、表单标签均改为"罚款金额" |
每个页面在查询表单中新增一个人员姓名输入框,后端 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
新增 LedgerTemplateController.java,提供 Excel 导入模板下载:
GET /ledger/template # 下载包含全部20个台账 Sheet 的合并模板
GET /ledger/template?type=xxx # 下载单台账模板
XSSFWorkbook 生成,保留客户原始 Sheet 名和列名headRows=2):第1行为灰色合并标题行,第2行为浅蓝列头行headRows=1):仅 rewardApproval(小额奖励审批单)Math.min(Math.max(charLen + 4, 16), 50) * 256前端(import/index.vue):每个台账卡片"下载模板"按钮 + 顶部"下载合并模板"按钮,使用 Blob 下载模式。
修改文件: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 / totalScoreDB 迁移 SQL(major 字段,按需执行):
ALTER TABLE sys_user ADD COLUMN major VARCHAR(100) COMMENT '专业' AFTER schooling;
修改文件:airport-ledger/.../service/impl/EmployeePortraitServiceImpl.java
新增 Autowire:SysRoleMapper、SysPostMapper、LedgerSeizureStatsMapper
| 方法 | 变更说明 |
|---|---|
fillUserInfo |
从身份证提取出生日期;调用 selectRolesByUserName 填充 roleNames;调用 selectPostsByUserName 填充 postNames |
fillAwards |
改为查询 score_event WHERE dimension_id = 5,精确匹配 person_name(支持逗号多人字段) |
fillScoreDetails(新增) |
查询员工时间范围内所有 score_event,构建加减分明细列表 |
getPortrait |
新增调用 fillScoreDetails 和 ledgerSeizureStatsMapper.countByInspectorAndDateRange |
修改文件: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} + 日期范围条件。
修改文件:src/views/portraitManagement/employeeProfile/index.vue、src/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;