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

## 项目概述

重庆机场安检分级质控系统管理端，基于若依（RuoYi）框架二次开发。系统涵盖考勤管理、查获物品、巡检管理、考试培训、大屏展示、绩效管理等核心业务模块。

- **项目名**: airport-web
- **版本**: 3.9.0
- **技术栈**: Vue 3 + Vite 6 + Element Plus + Pinia + Vue Router

## 开发环境

```bash
# 安装依赖
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`

## 开发约定

### API 接口

- 所有接口统一通过 `src/utils/request.js` 封装的 axios 实例调用
- 请求头携带 `Authorization: Bearer <token>`
- 统一返回结构：`{ code, msg, data }`，code=200 为成功

### 权限控制

- 使用 `v-hasPermi` 指令控制按钮级别权限
- 使用 `v-hasRole` 指令控制角色级别权限
- 动态路由从后端接口加载，存储在 Pinia `permission` store 中

### 字典使用

- 字典数据通过 `useDict()` hook 获取
- 字典值展示使用 `<dict-tag>` 组件

### 组件规范

- 页面组件放在 `views/` 对应业务目录下
- 公共组件放在 `components/` 目录下
- 采用 `<script setup>` 语法 + `unplugin-vue-setup-extend-plus`（支持 `defineOptions`）

### 样式

- 使用 Less / SCSS
- 全局样式在 `src/assets/styles/`
- Element Plus 主题在全局样式中覆盖

## 构建部署

```bash
# 构建后产物在 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` | 在线用户、操作日志、登录日志、缓存、服务器 |
| 审批流程 | - | 检查纠错审批流程 |

---

## 重庆需求分析（2026-04-23）

> 来源文件：`重庆需求资料/` 目录下的需求 Excel 文档。

---

### 一、新增页面总览（Step1 首期）

| 菜单位置 | 页面 | 说明 |
|----------|------|------|
| 台账管理 | 台账一键导入 | 单页面实现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）

**综合得分** = Σ（各维度得分 × 权重）

---

### 四、台账查询页面通用规范

所有台账查询页面遵循以下规范：
- **暂不提供增删改功能**（部门奖惩/请假/锦旗三个页面录入除外）
- 列表显示绿色关键字段，详情页显示全量字段
- 必须提供**导出**功能（全字段导出）
- 导入时保留原始台账全量字段，不做删减
- 附件字段显示为可点击的预览/下载链接

各台账查询条件参考（未特别说明的保持与海口一致）：
- 投诉情况：时间 / 航班号 / 旅客姓名 / 班组 / 责任人
- 航站楼加分：审核日期 / 姓名 / 班组
- 成绩收集：用户名称 / 小组 / 班组 / 部门 / 类别 / 期数

---

### 五、配分表体系维护页面

**功能要求：**
- 以树形结构展示 6 个维度 → 98 项指标（2~4级）
- 支持对每个节点：增删改查、启用/停用、备注编辑
- 维度级别：可调整权重百分比
- 指标级别：可调整分值（正/负）、类型（加分/扣分）
- 修改分值/权重后，跑分引擎重新计算时生效

---

### 六、配分事项录入页面

**核心字段（对应后端 `score_event` 表）：**

| 字段 | 说明 |
|------|------|
| 一级指标 | 六大维度之一 |
| 二级指标 | 对应维度下的二级分类 |
| 三级指标 | 末级指标（群团协作有四级） |
| 四级指标 | 仅群团协作维度使用 |
| 时间 | 事件发生时间 |
| 位置 | 区域/通道 |
| 责任人 | 关联员工 |
| 分值 | 正数=加分，负数=扣分 |
| 叠加分值 | 根据后果叠加的额外分值 |
| 事件描述 | 事件详情 |
| 备注 | 附加说明 |
| 数据来源 | 手动录入 / 台账同步 |

**功能要求：**
- 支持手动新增、导入（Excel）、导出
- 提供按员工/维度/时间范围的查询
- 台账同步数据与手动录入数据在同一列表展示，来源字段区分

---

### 七、组织架构四级层级说明

重庆特有四级结构（与其他机场不同），在部门树、权限配置、数据筛选等处均需支持：

```
安检站
  └── 部门（如：旅检三部）
        └── 队室/班组（如：安平班组）
              └── 小组/通道（如：陈行小组）
```

行政部门（安全中心/培训中心/服务中心/设备中心）与业务部门并列，不参与评分汇总。

---

### 八、Step2 规划（暂不开发，预留接口位置）

- 钉钉集成：组织架构同步 + 考勤接入 + OA审批流
- AI助手（13个场景）：员工画像/排班辅助/知识库/风险分析等
- 顾客投诉独立系统
- 设备中心（准入/运营/报废）
- 薪酬系统对接

---

## Phase 1 实现记录（台账导入，2026-04-24）

### 新增文件结构

```
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
```

### 待完成（上线前）

1. 在数据库执行 `sql/ledger.sql`（后端）
2. 在**菜单管理**中配置"台账管理"父菜单及 15 个子菜单，路由路径对应各 `views/ledger/*/index.vue`
3. 在**角色权限**中分配 `ledger:*` 权限给相关角色
4. 台账导入 Excel 模板（字段顺序需与 `@Excel` 注解的 `name` 保持一致）

---

## Phase 2 实现记录（配分体系，2026-04-24）

### 新增文件结构

```
src/
├── api/score/
│   └── index.js              # 全部配分API（维度/指标/事项/推送配置）
└── views/score/
    ├── dimension/index.vue   # 配分表体系维护（左侧维度卡片 + 右侧指标树）
    ├── event/index.vue       # 配分事项录入（CRUD + 导入导出，指标三级联动选择）
    └── pushConfig/index.vue  # 推送配置（按维度分组展示，per维度per部门配置）
```

### 页面功能说明

**配分表体系维护 (`score/dimension`)**
- 左侧：6个维度卡片，点击切换，显示权重合计（实时校验是否=100%）
- 右侧：el-table 树形表格，展示指定维度下的指标树（默认全部展开）
- 指标操作：新增子级（按层级递增，最多4级）、修改、删除、状态开关
- 维度操作：新增、修改、删除

**配分事项录入 (`score/event`)**
- 列表含：维度/指标/责任人/部门/班组/基础分/叠加分/总分/来源标签
- 新增对话框：维度→二级→三级→四级 联动下拉（从指标树接口实时加载）
- 支持 Excel 导入（`/score/event/import`）和导出

**推送配置 (`score/pushConfig`)**
- 按维度分组展示所有推送规则
- 每条规则可设：适用部门（空=全局）、预警阈值（默认75分）、推送人员

### 权限标识

```
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
```

### 待完成（上线前）

1. 在数据库执行 `sql/score.sql`（建表+初始化6个维度）
2. 在系统菜单管理中配置"配分管理"父菜单及3个子菜单：
   - 配分表体系维护 → `/score/dimension`
   - 配分事项录入 → `/score/event`
   - 推送配置 → `/score/pushConfig`
3. 在角色权限中分配 `score:*` 权限
4. ~~后续需手动录入98条指标数据~~ → 已通过 SQL 初始化128条指标，直接执行 `score.sql` 中的三段 `INSERT INTO score_indicator` 即可

---

## Phase 3 实现记录（台账同步、雷达大屏、一键全量导入，2026-04-24）

### 新增/修改文件

```
后端（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`）**
- 上传「旅检三部"三三"数字管理平台.xlsx」（15个Sheet）
- 后端用 Apache POI 按列索引读取，完全对应 Python 脚本列映射
- 权限标识：`ledger:import:combined`
- 返回 Map<Sheet名, 导入结果>，前端逐条展示

**雷达图班组下拉**
- 从 `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']` |

### 配分指标体系（128条，2026-04-24 更新版）

| 维度 | 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

### 数据库更新步骤（测试服务器）

```sql
-- 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. 角色管理中分配新菜单权限
```

---

## Phase 4 实现记录（配分规则修正、雷达大屏优化，2026-04-25）

### 修改文件

```
后端（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         # 新增：清空所有台账原始数据脚本
```

### LedgerSyncServiceImpl 修正内容

**问题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加分）

### indicator_init.sql 重写

- 旧版ID（1001~1343）→ 新版ID（11~1522），与 score.sql 完全对齐
- 保留 `@dim` 变量方式（动态查询维度ID，不依赖AUTO_INCREMENT顺序）
- 补全全部128条指标，"暂无台账"项统一标注 remark
- **旧版文件作废，使用新版**

### 新增SQL脚本

| 文件 | 用途 |
|------|------|
| `sql/fix_sync_indicator_ids.sql` | 清除旧同步数据（`DELETE FROM score_event WHERE source_type='2'`），重建指标后重新同步 |
| `sql/truncate_ledger.sql` | 清空所有15张台账表 + 导入日志 + 同步事件，用于重新全量导入前 |

### ScoreRadarServiceImpl 修正内容

**问题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 层级不匹配导致事件全部被过滤**
- 根因：score_event 存储的是班组名（屹动班组），但大屏选择的是小组名，LIKE 查不到
- 修复：移除 `scoreEventMapper.selectList(eq.setTeamName(...))` 的 team_name 过滤，改为全量加载后在 Java 中按 `rosterNames.contains(name)` 过滤

**关键设计**：以 `sys_user.nick_name` 为准匹配 `score_event.person_name`，完全绕开 team_name 层级问题

### 重新同步步骤（测试服务器）

```sql
-- 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. 重启后端，在页面点击"同步台账"
```
