重庆机场安检分级质控系统管理端,基于若依(RuoYi)框架二次开发。系统涵盖考勤管理、查获物品、巡检管理、考试培训、大屏展示、绩效管理等核心业务模块。
# 安装依赖
npm install
# 启动开发服务器(端口 8111)
npm run dev
# 生产构建
npm run build:prod
# 预发构建
npm run build:stage
| 技术 | 版本 | 用途 |
|---|---|---|
| Vue 3 | 3.5.16 | 核心框架 |
| Vite | 6.3.5 | 构建工具 |
| Element Plus | 2.9.9 | UI 组件库 |
| Pinia | 3.0.2 | 状态管理 |
| Vue Router | 4.5.1 | 路由管理 |
| Axios | 1.9.0 | HTTP 请求 |
| ECharts | 5.6.0 | 图表可视化 |
| js-cookie | 3.0.5 | Cookie 管理 |
| jsencrypt | 3.3.2 | RSA 加密(密码登录) |
| nprogress | 0.2.0 | 页面加载进度条 |
| vuedraggable | 4.1.0 | 拖拽排序 |
| vue-cropper | 1.1.1 | 图片裁剪 |
| html2canvas / jspdf | - | 导出 PDF |
| docx | 9.5.1 | 导出 Word |
| codemirror | - | SQL 编辑器 |
| moment | - | 日期处理 |
src/
├── api/ # 接口请求层(按业务模块分类)
│ ├── system/ # 系统管理接口
│ ├── attendance/ # 考勤接口
│ ├── check/ # 巡检接口
│ ├── item/ # 查获物品接口
│ ├── examManage/ # 考试管理接口
│ ├── largeScreen/ # 大屏接口
│ ├── performance/ # 绩效接口
│ └── monitor/ # 监控接口
├── assets/ # 静态资源(图片、SVG图标、样式)
├── components/ # 公共组件
│ ├── FileUpload/ # 文件上传
│ ├── ImageUpload/ # 图片上传
│ ├── Editor/ # 富文本编辑器(Quill)
│ ├── Pagination/ # 分页组件
│ ├── DictTag/ # 字典标签
│ ├── UserSelect/ # 用户选择器
│ └── sqlEdit/ # SQL 编辑器
├── directive/ # 自定义指令(权限、防重复点击等)
├── hooks/ # 组合式函数
├── layout/ # 布局组件(侧边栏、顶栏、标签页)
├── plugins/ # Vue 插件注册
├── router/ # 路由配置(含动态路由)
├── store/ # Pinia 状态管理
│ └── modules/ # 各模块 store(user、app、permission、settings等)
├── utils/ # 工具函数(request、auth、dict 等)
└── views/ # 页面视图
├── system/ # 系统管理(用户、角色、菜单、部门、字典等)
├── attendance/ # 考勤管理
├── check/ # 巡检管理
├── item/ # 查获物品管理
├── examManage/ # 考试培训管理
├── dataBigScreen/ # 数据大屏
│ ├── dashboard/ # 综合大屏
│ ├── attendance/ # 考勤大屏
│ ├── abilityPortrait/ # 能力画像大屏
│ └── examQuestionStatistics/ # 考题统计大屏
├── performanceManage/# 绩效管理
├── monitor/ # 系统监控
└── tool/ # 开发工具
| 环境 | 配置文件 | API 前缀 |
|---|---|---|
| 开发 | .env.development |
/dev-api |
| 预发 | .env.staging |
- |
| 生产 | .env.production |
- |
开发环境代理(vite.config.js):
/dev-api → http://airport.samsundot.com:9024/prod-api(生产后端,可改为本地)http://192.168.3.221:8088(注释中有配置)切换本地后端:在 vite.config.js 中将 baseUrl 改为 http://127.0.0.1:8088
src/utils/request.js 封装的 axios 实例调用Authorization: Bearer <token>{ code, msg, data },code=200 为成功v-hasPermi 指令控制按钮级别权限v-hasRole 指令控制角色级别权限permission store 中useDict() hook 获取<dict-tag> 组件views/ 对应业务目录下components/ 目录下<script setup> 语法 + unplugin-vue-setup-extend-plus(支持 defineOptions)src/assets/styles/# 构建后产物在 dist/ 目录
# 静态资源输出到 dist/static/{js,css,img}/
npm run build:prod
# 通过 SSH 部署到服务器(需配置 script/deploy.mjs)
npm run deploy # 部署到开发环境
npm run deploy:prod # 部署到生产环境
| 模块 | 路径 | 说明 |
|---|---|---|
| 系统管理 | /system |
用户、角色、菜单、部门、岗位、字典、参数配置 |
| 考勤管理 | /attendance |
考勤记录、班组记录、岗位记录、考勤区域 |
| 巡检管理 | /check |
巡检任务、巡检记录、纠错管理 |
| 查获物品 | /item |
查获记录、物品类别管理 |
| 考试培训 | /examManage |
题库、试卷、日考、考试记录 |
| 大屏展示 | /dataBigScreen |
综合大屏、考勤大屏、能力画像、考题统计 |
| 绩效管理 | /performanceManage |
绩效配置、绩效查询 |
| 系统监控 | /monitor |
在线用户、操作日志、登录日志、缓存、服务器 |
| 审批流程 | - | 检查纠错审批流程 |
来源文件:
重庆需求资料/目录下的需求 Excel 文档。
| 菜单位置 | 页面 | 说明 |
|---|---|---|
| 台账管理 | 台账一键导入 | 单页面实现20个台账的Excel上传导入(两列10行布局) |
| 台账管理 | 部门监察问题记录 | 导入后查询,含查询筛选+列表+导出 |
| 台账管理 | 队室三级质控巡查记录 | 同上(暂未计分) |
| 台账管理 | 部门实时质控拦截记录 | 同上(对应现有查获功能,部分字段不同) |
| 台账管理 | 服务巡查 | 同上 |
| 台账管理 | 投诉情况 | 同上 |
| 台账管理 | 安保测试记录(部门) | 同上 |
| 台账管理 | 通道过检率 | 同上(暂未计分) |
| 台账管理 | 不安全事件 | 同上 |
| 台账管理 | 2026查获违规品统计 | 同上(暂未计分) |
| 台账管理 | 航站楼加分 | 同上,查询条件:审核日期/姓名/班组 |
| 台账管理 | 成绩收集 | 同上,查询条件:用户名称/小组/班组/部门/类别/期数 |
| 台账管理 | 小额奖励审批单 | 同上(钉钉OA接入) |
| 台账管理 | 部门奖惩记录 | 页面录入(非导入),含增删改查 |
| 台账管理 | 请休假记录(特殊) | 页面录入,含增删改查 |
| 台账管理 | 锦旗及感谢信 | 页面录入,含增删改查 |
| 配分管理 | 配分表体系维护 | 6维度98项指标树形结构,支持权重/分值/启停配置 |
| 配分管理 | 配分事项录入 | 针对个人手动录入加/扣分事项,含导入导出 |
| 配分管理 | 推送配置 | 各维度推送阈值配置,支持定向推送设置 |
| 大屏展示 | 六维度能力画像大屏 | 雷达图(员工→小组→队室→部门→站),含等级预警色标 |
全系统统一使用以下颜色标识,不可混用:
| 等级 | 分值 | 颜色 | 触发动作 |
|---|---|---|---|
| 较差 | < 75 | 红色 #F56C6C |
启动预警,推送管理人员 |
| 良好 | 75~85 | 正常(默认色) | 无 |
| 优秀 | > 85 | 绿色 #67C23A |
无 |
| 已推送 | — | 黄色 #E6A23C |
已推送标识 |
雷达图需在 员工 / 小组 / 队室 / 部门 / 站 五个层级分别展示,逐级汇总:
| 维度轴 | 权重 | 基础分 |
|---|---|---|
| 安全防控能力 | 40% | 80 |
| 服务响应能力 | 20% | 80 |
| 业务实操能力 | 10% | 80 |
| 作风践行能力 | 10% | 80 |
| 群团协作能力 | 15% | 80 |
| 身心调节能力 | 5% | 80 |
2026-04-24 更新:业务实操能力 15%→10%,群团协作能力 10%→15%(来源:04.配分表分析.xlsx)
综合得分 = Σ(各维度得分 × 权重)
所有台账查询页面遵循以下规范:
各台账查询条件参考(未特别说明的保持与海口一致):
功能要求:
核心字段(对应后端 score_event 表):
| 字段 | 说明 |
|---|---|
| 一级指标 | 六大维度之一 |
| 二级指标 | 对应维度下的二级分类 |
| 三级指标 | 末级指标(群团协作有四级) |
| 四级指标 | 仅群团协作维度使用 |
| 时间 | 事件发生时间 |
| 位置 | 区域/通道 |
| 责任人 | 关联员工 |
| 分值 | 正数=加分,负数=扣分 |
| 叠加分值 | 根据后果叠加的额外分值 |
| 事件描述 | 事件详情 |
| 备注 | 附加说明 |
| 数据来源 | 手动录入 / 台账同步 |
功能要求:
重庆特有四级结构(与其他机场不同),在部门树、权限配置、数据筛选等处均需支持:
安检站
└── 部门(如:旅检三部)
└── 队室/班组(如:安平班组)
└── 小组/通道(如:陈行小组)
行政部门(安全中心/培训中心/服务中心/设备中心)与业务部门并列,不参与评分汇总。
src/
├── api/ledger/
│ └── index.js # 全部台账 API(12个导入 + 15个列表/导出 + 3个CRUD)
└── views/ledger/
├── import/index.vue # 台账一键导入主页(2列×6行网格卡片布局)
├── supervisionProblem/ # 部门监察问题记录(查询+导出)
├── patrolInspection/ # 队室三级质控巡查记录(查询+导出)
├── realtimeInterception/ # 实时质控拦截记录(查询+导出)
├── servicePatrol/ # 服务巡查记录(查询+导出)
├── complaint/ # 投诉情况(查询+导出,含航班号/旅客/责任人筛选)
├── securityTest/ # 安保测试记录(查询+导出)
├── channelPassRate/ # 通道过检率(查询+导出)
├── unsafeEvent/ # 不安全事件(查询+导出)
├── seizureStats/ # 查获违规品统计(查询+导出)
├── terminalBonus/ # 航站楼加分(查询+导出,含姓名筛选)
├── examScore/ # 成绩收集(查询+导出,含姓名/类别/期数筛选)
├── rewardApproval/ # 小额奖励审批单(查询+导出)
├── rewardPenalty/ # 部门奖惩记录(完整增删改查)
├── leaveSpecial/ # 请休假记录特殊(完整增删改查)
└── bannerLetter/ # 锦旗及感谢信(完整增删改查)
| 台账 | 导入 URL | 列表 URL |
|---|---|---|
| 部门监察问题记录 | POST /ledger/import/supervisionProblem |
GET /ledger/supervisionProblem/list |
| 队室三级质控巡查 | POST /ledger/import/patrolInspection |
GET /ledger/patrolInspection/list |
| 实时质控拦截 | POST /ledger/import/realtimeInterception |
GET /ledger/realtimeInterception/list |
| 服务巡查 | POST /ledger/import/servicePatrol |
GET /ledger/servicePatrol/list |
| 投诉情况 | POST /ledger/import/complaint |
GET /ledger/complaint/list |
| 安保测试 | POST /ledger/import/securityTest |
GET /ledger/securityTest/list |
| 通道过检率 | POST /ledger/import/channelPassRate |
GET /ledger/channelPassRate/list |
| 不安全事件 | POST /ledger/import/unsafeEvent |
GET /ledger/unsafeEvent/list |
| 查获违规品统计 | POST /ledger/import/seizureStats |
GET /ledger/seizureStats/list |
| 航站楼加分 | POST /ledger/import/terminalBonus |
GET /ledger/terminalBonus/list |
| 成绩收集 | POST /ledger/import/examScore |
GET /ledger/examScore/list |
| 小额奖励审批单 | POST /ledger/import/rewardApproval |
GET /ledger/rewardApproval/list |
| 部门奖惩记录 | 无(页面录入) | GET /ledger/rewardPenalty/list |
| 请休假记录特殊 | 无(页面录入) | GET /ledger/leaveSpecial/list |
| 锦旗及感谢信 | 无(页面录入) | GET /ledger/bannerLetter/list |
ledger:import:{台账key} # 导入权限
ledger:{台账key}:list # 列表权限
ledger:{台账key}:export # 导出权限
ledger:{台账key}:add/edit/remove # 仅 rewardPenalty / leaveSpecial / bannerLetter
sql/ledger.sql(后端)views/ledger/*/index.vueledger:* 权限给相关角色@Excel 注解的 name 保持一致)src/
├── api/score/
│ └── index.js # 全部配分API(维度/指标/事项/推送配置)
└── views/score/
├── dimension/index.vue # 配分表体系维护(左侧维度卡片 + 右侧指标树)
├── event/index.vue # 配分事项录入(CRUD + 导入导出,指标三级联动选择)
└── pushConfig/index.vue # 推送配置(按维度分组展示,per维度per部门配置)
配分表体系维护 (score/dimension)
配分事项录入 (score/event)
/score/event/import)和导出推送配置 (score/pushConfig)
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
sql/score.sql(建表+初始化6个维度)/score/dimension/score/event/score/pushConfigscore:* 权限score.sql 中的三段 INSERT INTO score_indicator 即可后端(chongqing-server):
├── airport-ledger/.../service/impl/LedgerSyncServiceImpl.java # 台账→配分事项同步逻辑
├── airport-ledger/.../service/impl/ScoreRadarServiceImpl.java # 雷达图:班组从sys_dept读取
├── airport-ledger/.../service/impl/LedgerCombinedImportServiceImpl.java # 多Sheet合并导入(POI)
├── airport-ledger/.../service/ILedgerCombinedImportService.java
└── airport-admin/.../controller/ledger/LedgerSyncController.java # POST /ledger/sync/all|{type}
前端(chongqing-web):
├── src/api/score/index.js # 新增 syncLedgerAll / syncLedgerByType
├── src/api/ledger/index.js # 新增 importCombinedLedger
├── src/views/score/radar/index.vue # 新增"同步台账"按钮
├── src/views/ledger/import/index.vue # 顶部新增"一键全量导入"卡片
└── src/utils/request.js # 修复 FormData 上传 Content-Type 问题
台账同步(/ledger/sync/all)
score_event 记录ledger:sync:all{ inserted: N, skipped: N, detail: {...} }import_batch + source_ledger + 原始字段 去重跳过一键全量导入(POST /ledger/import/combined)
ledger:import:combined雷达图班组下拉
sys_dept 表读取 dept_type='MANAGER' 的记录作为班组列表| 问题 | 原因 | 解决方式 |
|---|---|---|
selectList is ambiguous |
Mapper XML 定义了同名 selectList(Domain) 方法,与 MyBatis Plus selectList(Wrapper) 冲突 |
所有调用改传空 Domain 对象(如 new LedgerSupervisionProblem()) |
Parameter 'name' not found |
同上,LambdaQueryWrapper 被路由到 XML 方法 | 同上 |
| 雷达图班组下拉为空 | selectTeamList() 从空的 score_event 表读取 |
改为查 sys_dept where dept_type='MANAGER' |
| 文件上传报"not a multipart request" | axios.defaults.headers['Content-Type']='application/json' 全局覆盖了 FormData 的 multipart 类型 |
在请求拦截器中检测 FormData 时 delete config.headers['Content-Type'] |
| 维度 | L2 | L3 | L4 | 叶子节点有分值的示例 |
|---|---|---|---|---|
| 安全防控 | 6 | 19 | — | 站层级质控-1,不安全事件一类-10,典型查获一类+1 |
| 服务响应 | 4 | 8 | — | 旅客服务投诉-2,服务监察航站楼-1.2 |
| 业务实操 | 6 | 10 | — | 季度考试补考-2(阶梯),考试成绩≥98+5 |
| 作风践行 | 7 | 10 | — | 全勤+5,旷工-10,打架斗殴-10 |
| 群团协作 | 5 | 14 | 37 | 个人荣誉站层级一等奖+6,新闻发表+1 |
| 身心调节 | 2 | — | — | 规则待定 |
SQL 见
sql/score.sql,指标 ID 规则:L2=11~62,L3=111~552,L4=1211~1522
-- 1. 执行 sql/ledger.sql 建15张台账表
-- 2. 执行 sql/ledger_alter_columns.sql 扩展列长度
-- 3. 更新维度权重(已有数据时)
UPDATE score_dimension SET weight=10.00 WHERE name='业务实操能力';
UPDATE score_dimension SET weight=15.00 WHERE name='群团协作能力';
-- 4. 清空并重建指标
DELETE FROM score_indicator;
-- 推荐执行 sql/indicator_init.sql(使用@dim变量,比score.sql更安全)
-- 5. 执行 sql/menu_ledger_score.sql
-- 6. 执行 sql/menu_radar.sql
-- 7. 角色管理中分配新菜单权限
后端(chongqing-server):
├── airport-ledger/.../service/impl/LedgerSyncServiceImpl.java # 全面修正(见下)
├── airport-ledger/.../service/impl/ScoreRadarServiceImpl.java # 雷达大屏修正(见下)
├── sql/indicator_init.sql # 完整重写,与score.sql ID对齐(11~1522)
├── sql/score.sql # 添加注释,推荐使用indicator_init.sql
├── sql/fix_sync_indicator_ids.sql # 新增:同步数据修复脚本
└── sql/truncate_ledger.sql # 新增:清空所有台账原始数据脚本
问题1:指标ID方案完全错误
indicator_init.sql 旧版ID(1001/1102/1110...)score.sql 实际写入的是新版ID(11/12/111/121...)indicator_id 无效修复:所有常量更新为新ID:
| 常量 | 旧值 | 新值 | 含义 |
|---|---|---|---|
| IND_SUPERVISION_L2 | 1001 | 11 | 员工规范化操作 |
| IND_SUPERVISION_L3 | 1101 | 111/112/113 | 按层级路由 |
| IND_INTERCEPT_L2 | 1002 | 12 | 实时质控拦截 |
| IND_UNSAFE_L2 | 1003 | 13 | 不安全事件 |
| IND_SECTEST_L2 | 1004 | 14 | 安保测试 |
| IND_SEIZURE_L2 | 1005 | 15 | 典型案例查获 |
| IND_COMPLAINT_L2 | 1010 | 21 | 旅客投诉(叶子,无L3) |
| IND_SVCPATROL_L2 | 1011 | 22 | 服务监察 |
| IND_TYPCASE_L2 | 1012 | 23 | 典型服务案例 |
| IND_EXAM_L2 | 1024 | 35 | 考试成绩 |
| IND_EXAM_L3_THEORY | 1146 | 351 | 理论≥98 |
| IND_EXAM_L3_MACHINE | 1147 | 352 | 图像≥98 |
问题2:三类台账按最新配分表(配分表分析.csv)停止同步
| 台账 | 原因 |
|---|---|
reward_penalty(部门奖惩) |
作风践行能力全部"暂无台账" |
leave_special(请休假) |
身心调节能力全部"暂无台账" |
banner_letter(锦旗感谢信) |
CSV明确不作为计分来源 |
问题3:按字段动态路由L3指标(替代固定L3)
| 方法 | 字段 | 路由逻辑 |
|---|---|---|
| syncSupervisionProblem | problemType |
上级→113,部门→112,默认→111 |
| syncRealtimeInterception | 无层级字段 | 固定用站层级121 |
| syncSecurityTest | testType |
局方→141,公司→142,站→143 |
| syncUnsafeEvent | eventType |
一类→131...五类→135 |
| syncServicePatrol | serviceType |
航站楼→221,站层级→222,部门→223 |
| syncExamScore | examCategory |
含"图像/开机"→352,其余→351 |
问题4:补考扣分逻辑移除(暂无台账,只保留≥98加分)
@dim 变量方式(动态查询维度ID,不依赖AUTO_INCREMENT顺序)| 文件 | 用途 |
|---|---|
sql/fix_sync_indicator_ids.sql |
清除旧同步数据(DELETE FROM score_event WHERE source_type='2'),重建指标后重新同步 |
sql/truncate_ledger.sql |
清空所有15张台账表 + 导入日志 + 同步事件,用于重新全量导入前 |
问题1:逗号合并多人名显示为一张卡片
person_name = "彭秋菊,刘莹,王青" 直接当一个人处理rawName.split("[,,]") 拆分后每人单独计分,各自显示独立雷达卡问题2:无加减分记录的成员不出现在大屏
score_event 取 personName,没有事件的人不会出现sys_user(按 dept_id 关联 sys_dept)取完整花名册,无事件成员显示纯基础分(79.6分)问题3:大屏下拉从班组级别改为小组级别
dept_type 从 'MANAGER'(班组)改为 'TEAMS'(小组)问题4:team_name 层级不匹配导致事件全部被过滤
scoreEventMapper.selectList(eq.setTeamName(...)) 的 team_name 过滤,改为全量加载后在 Java 中按 rosterNames.contains(name) 过滤关键设计:以 sys_user.nick_name 为准匹配 score_event.person_name,完全绕开 team_name 层级问题
-- 1. 清除旧同步数据(或执行 sql/truncate_ledger.sql 全清)
DELETE FROM score_event WHERE source_type = '2';
-- 2. 确认指标是新版ID(MAX应为1522)
SELECT MAX(id) FROM score_indicator;
-- 如果不是,执行:DELETE FROM score_indicator; 然后执行 indicator_init.sql
-- 3. 重启后端,在页面点击"同步台账"