浏览代码

feat: Phase 4 雷达大屏前端优化与文档更新

- radar/index.vue: 小组成员雷达图展示优化
- CLAUDE.md: 补充 Phase 4 实现记录(配分规则修正、雷达大屏问题修复)
- vite.config.js: 配置更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
simonlll 1 月之前
父节点
当前提交
75acb0e4d0
共有 3 个文件被更改,包括 109 次插入2 次删除
  1. 106 0
      CLAUDE.md
  2. 1 0
      src/views/score/radar/index.vue
  3. 2 2
      vite.config.js

+ 106 - 0
CLAUDE.md

@@ -494,8 +494,113 @@ UPDATE score_dimension SET weight=10.00 WHERE name='业务实操能力';
494 494
 UPDATE score_dimension SET weight=15.00 WHERE name='群团协作能力';
495 495
 -- 4. 清空并重建指标
496 496
 DELETE FROM score_indicator;
497
+-- 推荐执行 sql/indicator_init.sql(使用@dim变量,比score.sql更安全)
497 498
 -- 5. 执行 sql/menu_ledger_score.sql
498 499
 -- 6. 执行 sql/menu_radar.sql
499 500
 -- 7. 角色管理中分配新菜单权限
500 501
 ```
502
+
503
+---
504
+
505
+## Phase 4 实现记录(配分规则修正、雷达大屏优化,2026-04-25)
506
+
507
+### 修改文件
508
+
509
+```
510
+后端(chongqing-server):
511
+├── airport-ledger/.../service/impl/LedgerSyncServiceImpl.java   # 全面修正(见下)
512
+├── airport-ledger/.../service/impl/ScoreRadarServiceImpl.java   # 雷达大屏修正(见下)
513
+├── sql/indicator_init.sql       # 完整重写,与score.sql ID对齐(11~1522)
514
+├── sql/score.sql                # 添加注释,推荐使用indicator_init.sql
515
+├── sql/fix_sync_indicator_ids.sql  # 新增:同步数据修复脚本
516
+└── sql/truncate_ledger.sql         # 新增:清空所有台账原始数据脚本
517
+```
518
+
519
+### LedgerSyncServiceImpl 修正内容
520
+
521
+**问题1:指标ID方案完全错误**
522
+- 旧代码使用 `indicator_init.sql` 旧版ID(1001/1102/1110...)
523
+- `score.sql` 实际写入的是新版ID(11/12/111/121...)
524
+- 导致所有同步记录的 `indicator_id` 无效
525
+
526
+**修复**:所有常量更新为新ID:
527
+
528
+| 常量 | 旧值 | 新值 | 含义 |
529
+|------|------|------|------|
530
+| IND_SUPERVISION_L2 | 1001 | 11 | 员工规范化操作 |
531
+| IND_SUPERVISION_L3 | 1101 | 111/112/113 | 按层级路由 |
532
+| IND_INTERCEPT_L2 | 1002 | 12 | 实时质控拦截 |
533
+| IND_UNSAFE_L2 | 1003 | 13 | 不安全事件 |
534
+| IND_SECTEST_L2 | 1004 | 14 | 安保测试 |
535
+| IND_SEIZURE_L2 | 1005 | 15 | 典型案例查获 |
536
+| IND_COMPLAINT_L2 | 1010 | 21 | 旅客投诉(叶子,无L3)|
537
+| IND_SVCPATROL_L2 | 1011 | 22 | 服务监察 |
538
+| IND_TYPCASE_L2 | 1012 | 23 | 典型服务案例 |
539
+| IND_EXAM_L2 | 1024 | 35 | 考试成绩 |
540
+| IND_EXAM_L3_THEORY | 1146 | 351 | 理论≥98 |
541
+| IND_EXAM_L3_MACHINE | 1147 | 352 | 图像≥98 |
542
+
543
+**问题2:三类台账按最新配分表(配分表分析.csv)停止同步**
544
+
545
+| 台账 | 原因 |
546
+|------|------|
547
+| `reward_penalty`(部门奖惩) | 作风践行能力全部"暂无台账" |
548
+| `leave_special`(请休假) | 身心调节能力全部"暂无台账" |
549
+| `banner_letter`(锦旗感谢信) | CSV明确不作为计分来源 |
550
+
551
+**问题3:按字段动态路由L3指标**(替代固定L3)
552
+
553
+| 方法 | 字段 | 路由逻辑 |
554
+|------|------|----------|
555
+| syncSupervisionProblem | `problemType` | 上级→113,部门→112,默认→111 |
556
+| syncRealtimeInterception | 无层级字段 | 固定用站层级121 |
557
+| syncSecurityTest | `testType` | 局方→141,公司→142,站→143 |
558
+| syncUnsafeEvent | `eventType` | 一类→131...五类→135 |
559
+| syncServicePatrol | `serviceType` | 航站楼→221,站层级→222,部门→223 |
560
+| syncExamScore | `examCategory` | 含"图像/开机"→352,其余→351 |
561
+
562
+**问题4:补考扣分逻辑移除**(暂无台账,只保留≥98加分)
563
+
564
+### indicator_init.sql 重写
565
+
566
+- 旧版ID(1001~1343)→ 新版ID(11~1522),与 score.sql 完全对齐
567
+- 保留 `@dim` 变量方式(动态查询维度ID,不依赖AUTO_INCREMENT顺序)
568
+- 补全全部128条指标,"暂无台账"项统一标注 remark
569
+- **旧版文件作废,使用新版**
570
+
571
+### 新增SQL脚本
572
+
573
+| 文件 | 用途 |
574
+|------|------|
575
+| `sql/fix_sync_indicator_ids.sql` | 清除旧同步数据(`DELETE FROM score_event WHERE source_type='2'`),重建指标后重新同步 |
576
+| `sql/truncate_ledger.sql` | 清空所有15张台账表 + 导入日志 + 同步事件,用于重新全量导入前 |
577
+
578
+### ScoreRadarServiceImpl 修正内容
579
+
580
+**问题1:逗号合并多人名显示为一张卡片**
581
+- 原因:`person_name = "彭秋菊,刘莹,王青"` 直接当一个人处理
582
+- 修复:`rawName.split("[,,]")` 拆分后每人单独计分,各自显示独立雷达卡
583
+
584
+**问题2:无加减分记录的成员不出现在大屏**
585
+- 原因:只从 `score_event` 取 personName,没有事件的人不会出现
586
+- 修复:从 `sys_user`(按 `dept_id` 关联 `sys_dept`)取完整花名册,无事件成员显示纯基础分(79.6分)
587
+
588
+**问题3:大屏下拉从班组级别改为小组级别**
589
+- `dept_type` 从 `'MANAGER'`(班组)改为 `'TEAMS'`(小组)
590
+
591
+**问题4:team_name 层级不匹配导致事件全部被过滤**
592
+- 根因:score_event 存储的是班组名(屹动班组),但大屏选择的是小组名,LIKE 查不到
593
+- 修复:移除 `scoreEventMapper.selectList(eq.setTeamName(...))` 的 team_name 过滤,改为全量加载后在 Java 中按 `rosterNames.contains(name)` 过滤
594
+
595
+**关键设计**:以 `sys_user.nick_name` 为准匹配 `score_event.person_name`,完全绕开 team_name 层级问题
596
+
597
+### 重新同步步骤(测试服务器)
598
+
599
+```sql
600
+-- 1. 清除旧同步数据(或执行 sql/truncate_ledger.sql 全清)
601
+DELETE FROM score_event WHERE source_type = '2';
602
+-- 2. 确认指标是新版ID(MAX应为1522)
603
+SELECT MAX(id) FROM score_indicator;
604
+-- 如果不是,执行:DELETE FROM score_indicator; 然后执行 indicator_init.sql
605
+-- 3. 重启后端,在页面点击"同步台账"
606
+```

+ 1 - 0
src/views/score/radar/index.vue

@@ -256,6 +256,7 @@ function buildRadarOption(indicators, series) {
256 256
     }],
257 257
     tooltip: {
258 258
       trigger: 'item',
259
+      appendToBody: true,
259 260
       backgroundColor: 'rgba(10,30,60,0.9)',
260 261
       borderColor: '#1a4a8a',
261 262
       textStyle: { color: '#e0f0ff', fontSize: 12 }

+ 2 - 2
vite.config.js

@@ -2,8 +2,8 @@ import { defineConfig, loadEnv } from 'vite'
2 2
 import path from 'path'
3 3
 import createVitePlugins from './vite/plugins'
4 4
 
5
-// const baseUrl = 'http://192.168.3.221:8088' // 后端接口
6
-const baseUrl = 'http://airport.samsundot.com:9024/prod-api'
5
+// const baseUrl = 'http://localhost:8088' // 后端接口
6
+const baseUrl = 'http://airport.samsundot.com:9035/prod-api'
7 7
 // https://vitejs.dev/config/
8 8
 export default defineConfig(({ mode, command }) => {
9 9
   const env = loadEnv(mode, process.cwd())