Преглед изворни кода

feat: 员工画像页面样式按设计稿全面调整

- 各区块背景色、字体、字号、颜色按设计稿原型图精确还原
- 质控情况背景色改为 #D5E7FD
- 培训情况数值单元格背景色改为 #CEF8E4
- 补充信息数值背景色改为 #FEE9E8,文字颜色改为红色
- 工作履历、获奖记录、雷达图、浮窗等区域样式完善

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
simonlll пре 1 месец
родитељ
комит
1f5d33b1b1
2 измењених фајлова са 515 додато и 201 уклоњено
  1. 9 1
      src/assets/styles/index.scss
  2. 506 200
      src/views/portraitManagement/employeeProfile/index.vue

+ 9 - 1
src/assets/styles/index.scss

@@ -5,13 +5,21 @@
5 5
 @use './btn.scss';
6 6
 @use './ruoyi.scss';
7 7
 
8
+@font-face {
9
+  font-family: 'AlibabaPuHuiTi';
10
+  src: url('/fonts/AlibabaPuHuiTi-Regular.ttf') format('truetype');
11
+  font-weight: 100 900;
12
+  font-style: normal;
13
+  font-display: swap;
14
+}
15
+
8 16
 body {
9 17
   height: 100%;
10 18
   margin: 0;
11 19
   -moz-osx-font-smoothing: grayscale;
12 20
   -webkit-font-smoothing: antialiased;
13 21
   text-rendering: optimizeLegibility;
14
-  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
22
+  font-family: 'AlibabaPuHuiTi', Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
15 23
 }
16 24
 
17 25
 label {

+ 506 - 200
src/views/portraitManagement/employeeProfile/index.vue

@@ -68,8 +68,12 @@
68 68
                 <span class="val">{{ portrait.deptPath || '-' }}</span>
69 69
               </div>
70 70
               <div class="basic-row2">
71
+                <span><span class="lbl">出生日期:</span><span class="val">{{ portrait.birthday || '-' }}</span></span>
71 72
                 <span><span class="lbl">技能等级:</span><span class="val">{{ portrait.qualificationLevelText || '-' }}</span></span>
73
+              </div>
74
+              <div class="basic-row2">
72 75
                 <span><span class="lbl">学历:</span><span class="val">{{ portrait.schooling || '-' }}</span></span>
76
+                <span><span class="lbl">专业:</span><span class="val">{{ portrait.major || '-' }}</span></span>
73 77
               </div>
74 78
               <div class="basic-row2" v-if="portrait.startWorkingDate">
75 79
                 <span><span class="lbl">入职日期:</span><span class="val">{{ portrait.startWorkingDate }}</span></span>
@@ -77,8 +81,8 @@
77 81
               </div>
78 82
               <div class="tags-row">
79 83
                 <span class="lbl">标签:</span>
80
-                <el-tag size="small" type="primary" style="margin-right:6px" v-if="portrait.qualificationLevelText">{{ portrait.qualificationLevelText }}</el-tag>
81
-                <el-tag size="small" type="warning" v-if="portrait.deptName">{{ portrait.deptName }}</el-tag>
84
+                <el-tag size="small" type="primary" style="margin-right:6px" v-if="portrait.roleNames">{{ portrait.roleNames }}</el-tag>
85
+                <el-tag size="small" type="warning" v-if="portrait.postNames">{{ portrait.postNames }}</el-tag>
82 86
               </div>
83 87
             </div>
84 88
           </div>
@@ -98,110 +102,152 @@
98 102
           <div class="card left-mid-card">
99 103
             <div class="sec-title">● 工作履历</div>
100 104
             <div class="history-list">
101
-              <div class="history-item" v-if="portrait.startWorkingDate">
102
-                {{ portrait.startWorkingDate?.substring(0,7) }}入职
103
-                <span v-if="portrait.workYears != null">|司龄{{ portrait.workYears }}年</span>
104
-                <span v-if="portrait.securityCheckYears != null">|开机年限{{ portrait.securityCheckYears }}年</span>
105
-                <span v-if="portrait.securityInspectionPosition">|现任职{{ portrait.securityInspectionPosition }}</span>
105
+              <div class="history-item">
106
+                {{ portrait.startWorkingDate ? formatWorkDate(portrait.startWorkingDate) + '入职' : '0(暂无数据)入职' }}
107
+                | 司龄{{ portrait.workYears != null ? portrait.workYears + '年' : '0(暂无数据)' }}
108
+                | 开机年限{{ portrait.securityCheckYears != null ? portrait.securityCheckYears + '年' : '0(暂无数据)' }}
109
+                | 现任职{{ portrait.roleNames || '0(暂无数据)' }}
106 110
               </div>
107
-              <div v-if="!portrait.startWorkingDate" class="empty-text">暂无履历数据</div>
108 111
             </div>
109 112
 
110
-            <div class="sec-title mt16">● 获奖记录</div>
111
-            <table class="award-table" v-if="portrait.awards && portrait.awards.length">
112
-              <thead>
113
-                <tr>
114
-                  <th>类型</th>
115
-                  <th>内容</th>
116
-                  <th>加分</th>
117
-                  <th>日期</th>
118
-                </tr>
119
-              </thead>
120
-              <tbody>
121
-                <tr v-for="(aw, i) in portrait.awards" :key="i" :class="i%2===0?'tr-a':'tr-b'">
122
-                  <td>{{ aw.type }}</td>
123
-                  <td>{{ aw.content }}</td>
124
-                  <td class="td-score">+{{ aw.score }}</td>
125
-                  <td>{{ aw.date }}</td>
126
-                </tr>
127
-              </tbody>
128
-            </table>
129
-            <div v-else class="empty-text mt8">暂无获奖记录</div>
113
+            <div class="award-section">
114
+              <div class="sec-title">● 获奖记录</div>
115
+              <table class="award-table" v-if="portrait.awards && portrait.awards.length">
116
+                <tbody>
117
+                  <tr v-for="(aw, i) in portrait.awards" :key="i" :class="i%2===0?'tr-a':'tr-b'">
118
+                    <td>{{ aw.level3Name || '-' }}</td>
119
+                    <td>{{ aw.level2Name || '-' }}</td>
120
+                    <td>{{ aw.level4Name || '-' }}</td>
121
+                    <td class="td-score">{{ aw.score }}</td>
122
+                  </tr>
123
+                </tbody>
124
+              </table>
125
+              <div v-else class="empty-text mt8">暂无获奖记录</div>
126
+            </div>
130 127
           </div>
131 128
 
132 129
           <!-- 个人能力雷达 -->
133 130
           <div class="card radar-card">
134 131
             <div class="sec-title">● 个人能力</div>
135
-            <div ref="abilityChart" class="chart-box"></div>
132
+            <div class="radar-body">
133
+              <!-- 扣分明细浮窗 -->
134
+              <div class="score-panel deduct-panel">
135
+                <div class="panel-header deduct-header">
136
+                  扣分明细&nbsp;<span class="panel-total">合计 {{ deductTotal }}</span>
137
+                </div>
138
+                <div class="panel-list">
139
+                  <div v-for="(item, i) in deductList" :key="i" class="panel-row">
140
+                    <span class="p-dim">{{ item.dimensionName }}</span>
141
+                    <span class="p-name">{{ item.level2Name }}{{ item.level3Name ? '·'+item.level3Name : '' }}</span>
142
+                    <span class="p-score deduct-score">{{ item.totalScore }}</span>
143
+                  </div>
144
+                  <div v-if="!deductList.length" class="p-empty">暂无扣分记录</div>
145
+                </div>
146
+              </div>
147
+
148
+              <!-- 雷达图 -->
149
+              <div ref="abilityChart" class="chart-box"></div>
150
+
151
+              <!-- 加分明细浮窗 -->
152
+              <div class="score-panel add-panel">
153
+                <div class="panel-header add-header">
154
+                  加分明细&nbsp;<span class="panel-total">合计 {{ addTotal }}</span>
155
+                </div>
156
+                <div class="panel-list">
157
+                  <div v-for="(item, i) in addList" :key="i" class="panel-row">
158
+                    <span class="p-dim">{{ item.dimensionName }}</span>
159
+                    <span class="p-name">{{ item.level2Name }}{{ item.level3Name ? '·'+item.level3Name : '' }}</span>
160
+                    <span class="p-score add-score">+{{ item.totalScore }}</span>
161
+                  </div>
162
+                  <div v-if="!addList.length" class="p-empty">暂无加分记录</div>
163
+                </div>
164
+              </div>
165
+            </div>
136 166
           </div>
137 167
         </div>
138 168
 
139 169
       </div>
140 170
 
141
-      <!-- 右侧边栏 -->
171
+      <!-- 右侧边栏:一个大卡片 -->
142 172
       <div class="ep-right">
143
-
144
-        <!-- 补充信息 -->
145
-        <div class="card side-card">
146
-          <div class="side-title">补充信息</div>
147
-          <div class="supp-grid">
148
-            <div class="supp-item">
149
-              <span class="s-lbl">政治面貌</span>
150
-              <span class="s-val">{{ portrait.politicalStatusText || '-' }}</span>
151
-            </div>
152
-            <div class="supp-item">
153
-              <span class="s-lbl">性别</span>
154
-              <span class="s-val">{{ portrait.sexText || '-' }}</span>
155
-            </div>
156
-            <div class="supp-item">
157
-              <span class="s-lbl">司龄</span>
158
-              <span class="s-val">{{ portrait.workYears != null ? portrait.workYears+'年' : '-' }}</span>
159
-            </div>
160
-            <div class="supp-item">
161
-              <span class="s-lbl">开机年限</span>
162
-              <span class="s-val">{{ portrait.securityCheckYears != null ? portrait.securityCheckYears+'年' : '-' }}</span>
163
-            </div>
164
-            <div class="supp-item">
165
-              <span class="s-lbl">性格特征</span>
166
-              <span class="s-val">{{ portrait.characterCharacteristics || '-' }}</span>
167
-            </div>
168
-            <div class="supp-item">
169
-              <span class="s-lbl">工作风格</span>
170
-              <span class="s-val">{{ portrait.workingStyle || '-' }}</span>
173
+        <div class="card side-big-card">
174
+
175
+          <!-- 补充信息 -->
176
+          <div class="side-section">
177
+            <div class="side-title">补充信息</div>
178
+            <div class="supp-grid supp-info-bg">
179
+              <div class="supp-item">
180
+                <span class="s-lbl">政治面貌</span>
181
+                <span class="s-val">{{ portrait.politicalStatusText || '-' }}</span>
182
+              </div>
183
+              <div class="supp-item">
184
+                <span class="s-lbl">性别</span>
185
+                <span class="s-val">{{ portrait.sexText || '-' }}</span>
186
+              </div>
187
+              <div class="supp-item">
188
+                <span class="s-lbl">司龄</span>
189
+                <span class="s-val">{{ portrait.workYears != null ? portrait.workYears+'年' : '-' }}</span>
190
+              </div>
191
+              <div class="supp-item">
192
+                <span class="s-lbl">开机年限</span>
193
+                <span class="s-val">{{ portrait.securityCheckYears != null ? portrait.securityCheckYears+'年' : '-' }}</span>
194
+              </div>
195
+              <div class="supp-item">
196
+                <span class="s-lbl">性格特征</span>
197
+                <span class="s-val">{{ portrait.characterCharacteristics || '-' }}</span>
198
+              </div>
199
+              <div class="supp-item">
200
+                <span class="s-lbl">工作风格</span>
201
+                <span class="s-val">{{ portrait.workingStyle || '-' }}</span>
202
+              </div>
171 203
             </div>
172 204
           </div>
173
-        </div>
174 205
 
175
-        <!-- 业务岗位 -->
176
-        <div class="card side-card">
177
-          <div class="side-title">业务岗位</div>
178
-          <div class="pos-list">
179
-            <div class="pos-item" v-for="(p, i) in positionList" :key="i">{{ p }}</div>
180
-            <div v-if="!positionList.length" class="empty-text">暂无岗位信息</div>
206
+          <!-- 业务岗位 -->
207
+          <div class="side-section">
208
+            <div class="side-title">业务岗位</div>
209
+            <div class="pos-list pos-info-bg">
210
+              <div class="pos-item" v-for="(p, i) in positionList" :key="i">{{ p }}</div>
211
+              <div v-if="!positionList.length" class="empty-text">暂无岗位信息</div>
212
+            </div>
181 213
           </div>
182
-        </div>
183 214
 
184
-        <!-- 培训情况 -->
185
-        <div class="card side-card">
186
-          <div class="side-title">培训情况</div>
187
-          <div v-if="portrait.theoryScore != null || portrait.imageScore != null">
188
-            <div class="train-header">
189
-              <span>季度</span><span>理论成绩</span><span>图像成绩</span>
215
+          <!-- 培训情况 -->
216
+          <div class="side-section">
217
+            <div class="side-title">培训情况</div>
218
+            <div class="train-info-bg">
219
+              <div v-if="portrait.theoryScore != null || portrait.imageScore != null">
220
+                <div class="train-header">
221
+                  <span>季度</span><span>理论成绩</span><span>图像成绩</span>
222
+                </div>
223
+                <div class="train-row">
224
+                  <span>{{ portrait.examPeriod || '-' }}</span>
225
+                  <span :style="examScoreStyle(portrait.theoryScore)">
226
+                    {{ portrait.theoryScore != null ? portrait.theoryScore+'分' : '-' }}
227
+                  </span>
228
+                  <span :style="examScoreStyle(portrait.imageScore)">
229
+                    {{ portrait.imageScore != null ? portrait.imageScore+'分' : '-' }}
230
+                  </span>
231
+                </div>
232
+              </div>
233
+              <div v-else class="empty-text">暂无考试记录</div>
190 234
             </div>
191
-            <div class="train-row">
192
-              <span>{{ portrait.examPeriod || '-' }}</span>
193
-              <span :style="examScoreStyle(portrait.theoryScore)">
194
-                {{ portrait.theoryScore != null ? portrait.theoryScore+'分' : '-' }}
195
-              </span>
196
-              <span :style="examScoreStyle(portrait.imageScore)">
197
-                {{ portrait.imageScore != null ? portrait.imageScore+'分' : '-' }}
198
-              </span>
235
+          </div>
236
+
237
+          <!-- 质控情况 -->
238
+          <div class="side-section">
239
+            <div class="side-title">质控情况</div>
240
+            <div class="supp-grid qc-info-bg">
241
+              <div class="supp-item">
242
+                <span class="s-lbl">查获违规品次数</span>
243
+                <span class="s-val">{{ portrait.qualityControlCount ?? '-' }}</span>
244
+              </div>
199 245
             </div>
200 246
           </div>
201
-          <div v-else class="empty-text">暂无考试记录</div>
202
-        </div>
203 247
 
248
+        </div>
204 249
       </div>
250
+
205 251
     </div>
206 252
   </div>
207 253
 </template>
@@ -295,6 +341,31 @@ const positionList = computed(() => {
295 341
   return pos.split(/[,,、/]/).map(s => s.trim()).filter(Boolean)
296 342
 })
297 343
 
344
+const scoreDetails = computed(() => portrait.value?.scoreDetails || [])
345
+
346
+const addList = computed(() =>
347
+  scoreDetails.value.filter(d => d.totalScore != null && Number(d.totalScore) > 0)
348
+)
349
+const deductList = computed(() =>
350
+  scoreDetails.value.filter(d => d.totalScore != null && Number(d.totalScore) < 0)
351
+)
352
+const addTotal = computed(() => {
353
+  const s = addList.value.reduce((acc, d) => acc + Number(d.totalScore), 0)
354
+  return (s > 0 ? '+' : '') + s.toFixed(2)
355
+})
356
+const deductTotal = computed(() => {
357
+  const s = deductList.value.reduce((acc, d) => acc + Number(d.totalScore), 0)
358
+  return s.toFixed(2)
359
+})
360
+
361
+const formatWorkDate = (d) => {
362
+  if (!d) return '-'
363
+  const str = String(d)
364
+  const parts = str.substring(0, 10).split('-')
365
+  if (parts.length < 3) return str
366
+  return `${parts[0]}.${Number(parts[1])}.${Number(parts[2])}`
367
+}
368
+
298 369
 const examScoreStyle = (score) => {
299 370
   const s = Number(score)
300 371
   if (s >= 90) return 'color:#67c23a;font-weight:600'
@@ -302,38 +373,48 @@ const examScoreStyle = (score) => {
302 373
   return 'color:#409eff'
303 374
 }
304 375
 
376
+const radarColor = computed(() => {
377
+  const total = Number(portrait.value?.totalScore ?? 0)
378
+  if (total < 75)  return { line: '#F56C6C', fill: 'rgba(245,108,108,0.22)', label: '#F56C6C' }
379
+  if (total >= 90) return { line: '#67C23A', fill: 'rgba(103,194,58,0.22)',  label: '#67C23A' }
380
+  return             { line: '#333333',  fill: 'rgba(255,196,0,0.28)',    label: '#555555' }
381
+})
382
+
305 383
 const initChart = () => {
306 384
   if (!abilityChart.value || !portrait.value) return
307 385
   if (chart) { chart.dispose(); chart = null }
308 386
   chart = echarts.init(abilityChart.value)
309 387
   const dims = portrait.value.dimensions || []
388
+  const c = radarColor.value
310 389
   chart.setOption({
311 390
     radar: {
391
+      // 指标名显示加权前分值
312 392
       indicator: dims.map(d => ({ name: d.name + '\n' + d.score, max: 100 })),
313 393
       center: ['50%', '52%'],
314 394
       radius: '65%',
315 395
       splitNumber: 4,
316
-      name: { textStyle: { color: '#555', fontSize: 11 }, formatter: (v) => v },
317
-      axisLine: { lineStyle: { color: '#c8dff5' } },
318
-      splitLine: { lineStyle: { color: '#c8dff5' } },
319
-      splitArea: { areaStyle: { color: ['rgba(64,158,255,0.03)', 'rgba(64,158,255,0.06)'] } }
396
+      name: { textStyle: { color: '#555', fontSize: 11 } },
397
+      axisLine: { lineStyle: { color: 'rgba(180,180,180,0.5)' } },
398
+      splitLine: { lineStyle: { color: 'rgba(180,180,180,0.4)' } },
399
+      splitArea: { areaStyle: { color: ['rgba(250,250,250,0.3)', 'rgba(230,230,230,0.2)'] } }
320 400
     },
321 401
     series: [{
322 402
       type: 'radar',
323 403
       data: [{
324 404
         value: dims.map(d => Number(d.score)),
325 405
         name: '个人能力',
326
-        areaStyle: { color: 'rgba(64,158,255,0.25)' },
327
-        lineStyle: { color: '#409eff', width: 2 },
328
-        itemStyle: { color: '#409eff' }
406
+        areaStyle: { color: c.fill },
407
+        lineStyle: { color: c.line, width: 3 },
408
+        itemStyle: { color: c.line }
329 409
       }],
330 410
       symbol: 'circle',
331
-      symbolSize: 5,
411
+      symbolSize: 6,
332 412
       label: {
333 413
         show: true,
334 414
         formatter: (p) => p.value,
335
-        color: '#409eff',
336
-        fontSize: 11
415
+        color: c.label,
416
+        fontSize: 12,
417
+        fontWeight: 'bold'
337 418
       }
338 419
     }],
339 420
     tooltip: { trigger: 'item' }
@@ -359,13 +440,13 @@ onBeforeUnmount(() => {
359 440
 <style scoped lang="scss">
360 441
 .ep-root {
361 442
   min-height: 100vh;
362
-  background: #eef2fb;
443
+  background: linear-gradient(180deg, #C5DDFF 0%, #E4FBF0 100%);
363 444
   display: flex;
364 445
   flex-direction: column;
365
-  padding: 12px;
446
+  padding: 20px;
366 447
   box-sizing: border-box;
367
-  gap: 12px;
368
-  font-family: 'AlibabaPuHui-regular', 'Alibaba PuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
448
+  gap: 20px;
449
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
369 450
   color: rgba(16, 16, 16, 1);
370 451
   line-height: 28px;
371 452
 }
@@ -402,7 +483,7 @@ onBeforeUnmount(() => {
402 483
 /* ── 主体两栏 ── */
403 484
 .ep-body {
404 485
   display: flex;
405
-  gap: 12px;
486
+  gap: 20px;
406 487
   flex: 1;
407 488
   min-height: 0;
408 489
 }
@@ -412,15 +493,19 @@ onBeforeUnmount(() => {
412 493
   min-width: 0;
413 494
   display: flex;
414 495
   flex-direction: column;
415
-  gap: 12px;
496
+  gap: 20px;
416 497
 }
417 498
 
418 499
 .ep-right {
419
-  width: 230px;
500
+  width: 366px;
420 501
   flex-shrink: 0;
421 502
   display: flex;
422 503
   flex-direction: column;
423
-  gap: 12px;
504
+  gap: 20px;
505
+  font-size: 20px;
506
+  color: rgba(16, 16, 16, 1);
507
+  line-height: 28px;
508
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
424 509
 }
425 510
 
426 511
 /* ── 通用卡片 ── */
@@ -434,41 +519,37 @@ onBeforeUnmount(() => {
434 519
 .row-flex {
435 520
   display: flex;
436 521
 }
437
-.gap { gap: 12px; }
522
+.gap { gap: 20px; }
438 523
 
439 524
 /* ── 基本信息卡 ── */
440 525
 .basic-card {
441
-  flex: 1;
526
+  flex: 3;
527
+  min-width: 0;
442 528
   display: flex;
443
-  gap: 16px;
444
-  align-items: flex-start;
445
-  background: repeating-linear-gradient(
446
-    45deg,
447
-    #daeeff 0px, #daeeff 2px,
448
-    #eef7ff 2px, #eef7ff 14px
449
-  );
529
+  gap: 24px;
530
+  align-items: center;
531
+  background: #eef7ff;
450 532
 
451 533
   .avatar-area {
452 534
     flex-shrink: 0;
453 535
     .avatar {
454
-      width: 90px;
455
-      height: 90px;
456
-      border-radius: 50%;
457
-      border: 3px solid #409eff;
536
+      width: 260px;
537
+      height: 260px;
538
+      border-radius: 180px;
539
+      background-color: rgba(229, 229, 229, 1);
458 540
       object-fit: cover;
459 541
     }
460 542
     .avatar-fallback {
461
-      width: 90px;
462
-      height: 90px;
463
-      border-radius: 50%;
464
-      background: linear-gradient(135deg, #409eff, #79bbff);
465
-      border: 3px solid #409eff;
543
+      width: 260px;
544
+      height: 260px;
545
+      border-radius: 180px;
546
+      background-color: rgba(229, 229, 229, 1);
466 547
       display: flex;
467 548
       align-items: center;
468 549
       justify-content: center;
469
-      font-size: 32px;
550
+      font-size: 80px;
470 551
       font-weight: bold;
471
-      color: #fff;
552
+      color: #aaa;
472 553
     }
473 554
   }
474 555
 
@@ -482,125 +563,191 @@ onBeforeUnmount(() => {
482 563
   .basic-name {
483 564
     display: flex;
484 565
     align-items: center;
566
+    .lbl {
567
+      font-size: 64px;
568
+      font-weight: bold;
569
+      color: rgba(31, 135, 232, 1);
570
+      font-family: 'YSBiaoTiHei-bold', 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
571
+      line-height: 80px;
572
+    }
485 573
     .person-name {
486
-      font-size: 48px;
487
-      font-weight: normal;
574
+      font-size: 64px;
575
+      font-weight: bold;
488 576
       color: rgba(31, 135, 232, 1);
489
-      font-family: 'YSBiaoTiHei-bold', 'YouSheBiaoTiHei', 'PingFang SC', 'Microsoft YaHei', sans-serif;
490
-      line-height: 68px;
577
+      font-family: 'YSBiaoTiHei-bold', 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
578
+      line-height: 80px;
491 579
     }
492 580
   }
493 581
 
494 582
   .basic-row {
495
-    font-size: 13px;
583
+    font-size: 20px;
584
+    color: rgba(16, 16, 16, 1);
585
+    line-height: 28px;
496 586
   }
497 587
 
498 588
   .basic-row2 {
499 589
     display: flex;
500
-    gap: 24px;
501
-    font-size: 13px;
590
+    gap: 32px;
591
+    font-size: 20px;
592
+    color: rgba(16, 16, 16, 1);
593
+    line-height: 28px;
502 594
   }
503 595
 
504 596
   .tags-row {
505 597
     display: flex;
506 598
     align-items: center;
507 599
     gap: 6px;
508
-    font-size: 13px;
600
+    font-size: 20px;
601
+    line-height: 28px;
509 602
   }
510 603
 
511
-  .lbl { color: #888; }
512
-  .val { color: #333; font-weight: 500; }
604
+  .lbl { color: rgba(16, 16, 16, 1); }
605
+  .val { color: rgba(16, 16, 16, 1); font-weight: 500; }
513 606
 }
514 607
 
515 608
 /* ── 综合评价卡 ── */
516 609
 .score-card {
517
-  width: 150px;
518
-  flex-shrink: 0;
610
+  flex: 1;
611
+  min-width: 0;
519 612
   display: flex;
520 613
   flex-direction: column;
521 614
   align-items: center;
522 615
   justify-content: center;
523
-  background: linear-gradient(160deg, #f7b89c, #f4a088);
524
-  border: none;
616
+  background: rgb(239, 246, 254);
617
+  color: rgba(16, 16, 16, 1);
618
+  font-size: 20px;
619
+  text-align: center;
620
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
525 621
 
526 622
   .score-label {
527
-    font-size: 14px;
528
-    font-weight: 600;
529
-    color: #fff;
530
-    margin-bottom: 8px;
531
-    text-shadow: 0 1px 2px rgba(0,0,0,0.15);
623
+    font-size: 48px;
624
+    font-weight: bold;
625
+    line-height: 68px;
626
+    color: rgba(31, 135, 232, 1);
627
+    text-align: left;
628
+    font-family: 'YSBiaoTiHei-bold', 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
629
+    margin-bottom: 16px;
532 630
   }
533 631
 
534 632
   .score-num {
535
-    font-size: 52px;
633
+    width: 320px;
634
+    height: 126px;
635
+    border-radius: 30px;
636
+    background-color: rgba(118, 220, 198, 1);
637
+    color: rgba(247, 89, 54, 1);
638
+    font-size: 72px;
536 639
     font-weight: bold;
640
+    font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
641
+    text-align: center;
642
+    display: flex;
643
+    align-items: center;
644
+    justify-content: center;
537 645
     line-height: 1;
538
-    color: #fff;
539
-    text-shadow: 0 2px 6px rgba(0,0,0,0.15);
540 646
   }
541 647
 
542 648
   .score-level-tag {
543
-    margin-top: 8px;
544
-    font-size: 14px;
649
+    margin-top: 16px;
650
+    font-size: 20px;
545 651
     font-weight: 600;
546
-    color: #fff;
547
-    background: rgba(255,255,255,0.25);
548
-    padding: 2px 12px;
652
+    color: rgba(16, 16, 16, 1);
653
+    background: #f5f5f5;
654
+    padding: 4px 20px;
549 655
     border-radius: 10px;
550 656
   }
551 657
 }
552 658
 
553 659
 /* ── 工作履历 + 获奖 ── */
554 660
 .left-mid-card {
555
-  width: 260px;
661
+  width: 604px;
556 662
   flex-shrink: 0;
557 663
   overflow-y: auto;
558
-  background: #e8f5ff;
664
+  background: rgb(243, 250, 252);
665
+  color: rgba(16, 16, 16, 1);
666
+  font-size: 20px;
667
+  line-height: 28px;
668
+  text-align: center;
669
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
559 670
 
560 671
   .sec-title {
561
-    font-size: 14px;
562
-    font-weight: 600;
563
-    color: #333;
672
+    font-size: 48px;
673
+    font-weight: bold;
674
+    line-height: 68px;
675
+    color: rgba(31, 135, 232, 1);
676
+    text-align: left;
677
+    font-family: 'YSBiaoTiHei-bold', 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
564 678
     margin-bottom: 8px;
565 679
   }
566 680
   .mt16 { margin-top: 16px; }
567 681
   .mt8  { margin-top: 8px; }
568 682
 
569 683
   .history-list {
684
+    background-color: rgba(236, 220, 220, 1);
685
+    border-radius: 30px;
686
+    padding: 12px 16px;
687
+
570 688
     .history-item {
571
-      font-size: 12px;
572
-      color: #555;
573
-      background: #f0f7ff;
574
-      border-radius: 4px;
575
-      padding: 6px 10px;
576
-      margin-bottom: 6px;
577
-      line-height: 1.6;
689
+      font-size: 20px;
690
+      font-weight: normal;
691
+      font-family: 'PingFang SC', 'AlibabaPuHuiTi', 'Microsoft YaHei', sans-serif;
692
+      color: rgba(16, 16, 16, 1);
693
+      line-height: 28px;
694
+      text-align: left;
695
+      background: none;
696
+      border-radius: 0;
697
+      padding: 0;
698
+      margin-bottom: 0;
699
+
700
+      .lbl {
701
+        color: rgba(16, 16, 16, 1);
702
+        font-size: 20px;
703
+      }
578 704
     }
579 705
   }
580 706
 }
581 707
 
708
+.award-section {
709
+  margin-top: 16px;
710
+  background-color: rgba(169, 209, 250, 1);
711
+  border-radius: 20px;
712
+  padding: 12px;
713
+  font-size: 20px;
714
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
715
+  font-weight: bold;
716
+
717
+  .sec-title {
718
+    font-size: 48px;
719
+    font-weight: bold;
720
+    line-height: 68px;
721
+    color: rgba(31, 135, 232, 1);
722
+    text-align: left;
723
+    font-family: 'YSBiaoTiHei-bold', 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
724
+    margin-bottom: 10px;
725
+  }
726
+}
727
+
582 728
 .award-table {
583 729
   width: 100%;
584 730
   border-collapse: collapse;
585
-  font-size: 12px;
731
+  font-size: 20px;
732
+  line-height: 28px;
586 733
 
587 734
   th {
588 735
     background: #fde8e6;
589
-    color: #555;
590
-    padding: 6px 6px;
736
+    color: rgba(16, 16, 16, 1);
737
+    padding: 8px 10px;
591 738
     text-align: center;
592
-    font-weight: 500;
739
+    font-weight: 600;
593 740
   }
594 741
 
595 742
   td {
596
-    padding: 6px 6px;
743
+    padding: 8px 10px;
597 744
     text-align: center;
598
-    color: #555;
745
+    color: rgba(16, 16, 16, 1);
599 746
   }
600 747
 
601
-  .tr-a td { background: #fff8f7; }
602
-  .tr-b td { background: #fff; }
603
-  .td-score { color: #67c23a; font-weight: 600; }
748
+  .tr-a td { background: rgba(255,255,255,0.5); }
749
+  .tr-b td { background: rgba(255,255,255,0.25); }
750
+  .td-score { color: rgba(248, 3, 3, 1); font-weight: bold; }
604 751
 }
605 752
 
606 753
 /* ── 雷达图卡 ── */
@@ -609,31 +756,70 @@ onBeforeUnmount(() => {
609 756
   min-width: 0;
610 757
   display: flex;
611 758
   flex-direction: column;
759
+  background: rgb(242, 249, 253);
760
+  color: rgba(16, 16, 16, 1);
761
+  font-size: 20px;
762
+  line-height: 28px;
763
+  text-align: center;
764
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
612 765
 
613 766
   .sec-title {
614
-    font-size: 14px;
615
-    font-weight: 600;
616
-    color: #333;
767
+    font-size: 48px;
768
+    font-weight: bold;
769
+    line-height: 68px;
770
+    color: rgba(31, 135, 232, 1);
771
+    text-align: left;
772
+    font-family: 'YSBiaoTiHei-bold', 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
617 773
     margin-bottom: 4px;
618 774
     flex-shrink: 0;
619 775
   }
620 776
 
621 777
   .chart-box {
622 778
     flex: 1;
623
-    min-height: 260px;
779
+    min-height: 400px;
624 780
   }
625 781
 }
626 782
 
627
-/* ── 右侧侧栏卡片 ── */
628
-.side-card {
783
+/* ── 右侧大卡片 ── */
784
+.side-big-card {
785
+  flex: 1;
786
+  display: flex;
787
+  flex-direction: column;
788
+  gap: 0;
789
+  overflow: hidden;
790
+}
791
+
792
+.side-section {
793
+  padding: 0 0 16px;
794
+  border-bottom: 1px solid #e8edf5;
795
+  &:last-child { border-bottom: none; padding-bottom: 0; }
796
+
629 797
   .side-title {
630
-    font-size: 13px;
631
-    font-weight: 600;
632
-    color: #fff;
633
-    background: #409eff;
634
-    margin: -14px -16px 12px;
635
-    padding: 7px 16px;
636
-    border-radius: 20px 20px 0 0;
798
+    font-size: 36px;
799
+    font-weight: bold;
800
+    line-height: 50px;
801
+    color: rgba(31, 135, 232, 1);
802
+    text-align: left;
803
+    font-family: 'YSBiaoTiHei-bold', 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
804
+    margin-bottom: 12px;
805
+  }
806
+}
807
+
808
+/* 补充信息内容背景 */
809
+.supp-info-bg {
810
+  background-color: rgba(254, 233, 232, 1);
811
+  border-radius: 30px;
812
+  padding: 12px 16px;
813
+  color: rgba(248, 3, 3, 1);
814
+  font-size: 20px;
815
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
816
+  font-weight: bold;
817
+
818
+  .s-lbl { color: rgba(248, 3, 3, 1); }
819
+  .s-val {
820
+    color: rgba(248, 3, 3, 1);
821
+    background: #FEE9E8;
822
+    font-weight: bold;
637 823
   }
638 824
 }
639 825
 
@@ -647,20 +833,20 @@ onBeforeUnmount(() => {
647 833
     display: flex;
648 834
     justify-content: space-between;
649 835
     align-items: center;
650
-    padding: 5px 0;
836
+    padding: 7px 0;
651 837
     border-bottom: 1px dashed #dce9f5;
652
-    font-size: 12px;
838
+    font-size: 20px;
653 839
 
654 840
     &:last-child { border-bottom: none; }
655 841
 
656
-    .s-lbl { color: #666; }
842
+    .s-lbl { color: rgba(16, 16, 16, 1); }
657 843
     .s-val {
658
-      color: #2c6baf;
659
-      font-weight: 500;
660
-      background: #d6eaf8;
661
-      padding: 2px 10px;
844
+      color: rgba(248, 3, 3, 1);
845
+      font-weight: bold;
846
+      background: #FEE9E8;
847
+      padding: 3px 12px;
662 848
       border-radius: 4px;
663
-      min-width: 56px;
849
+      min-width: 80px;
664 850
       text-align: center;
665 851
     }
666 852
   }
@@ -670,46 +856,166 @@ onBeforeUnmount(() => {
670 856
 .pos-list {
671 857
   display: flex;
672 858
   flex-direction: column;
673
-  gap: 6px;
859
+  gap: 8px;
674 860
 
675 861
   .pos-item {
676 862
     background: #c8e6f8;
677 863
     color: #1a6aaa;
678 864
     border-radius: 4px;
679
-    padding: 7px 10px;
680
-    font-size: 12px;
865
+    padding: 8px 10px;
866
+    font-size: 20px;
681 867
     text-align: center;
682 868
     font-weight: 500;
683 869
   }
684 870
 }
685 871
 
872
+/* 业务岗位内容背景 */
873
+.pos-info-bg {
874
+  background-color: rgba(254, 233, 232, 1);
875
+  border-radius: 30px;
876
+  padding: 12px 16px;
877
+  color: rgba(248, 3, 3, 1);
878
+  font-size: 20px;
879
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
880
+  font-weight: bold;
881
+  line-height: 28px;
882
+  text-align: center;
883
+
884
+  .pos-item {
885
+    background: rgba(255, 255, 255, 0.6);
886
+    color: rgba(248, 3, 3, 1);
887
+    border-radius: 4px;
888
+    padding: 8px 10px;
889
+    font-size: 20px;
890
+    text-align: center;
891
+    font-weight: bold;
892
+  }
893
+}
894
+
895
+/* 培训情况内容背景 */
896
+.train-info-bg {
897
+  background-color: rgba(206, 248, 228, 1);
898
+  border-radius: 20px;
899
+  padding: 12px 16px;
900
+  color: rgba(248, 3, 3, 1);
901
+  font-size: 20px;
902
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
903
+  font-weight: bold;
904
+  line-height: 28px;
905
+  text-align: center;
906
+  min-height: 101px;
907
+  display: flex;
908
+  flex-direction: column;
909
+  justify-content: center;
910
+}
911
+
686 912
 /* 培训情况 */
687 913
 .train-header, .train-row {
688 914
   display: grid;
689 915
   grid-template-columns: 1fr 1fr 1fr;
690
-  font-size: 12px;
916
+  font-size: 20px;
691 917
   text-align: center;
692 918
   gap: 4px;
693 919
 }
694 920
 
695 921
 .train-header {
696
-  color: #888;
697
-  margin-bottom: 6px;
698
-  padding-bottom: 4px;
922
+  color: rgba(16, 16, 16, 1);
923
+  font-size: 20px;
924
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
925
+  margin-bottom: 8px;
926
+  padding-bottom: 6px;
699 927
   border-bottom: 1px solid #dce9f5;
700 928
 }
701 929
 
702 930
 .train-row {
703
-  color: #2c6baf;
931
+  color: rgba(16, 16, 16, 1);
704 932
   font-weight: 600;
705 933
 
706 934
   span {
707
-    background: #d6eaf8;
935
+    background: #CEF8E4;
708 936
     border-radius: 4px;
709
-    padding: 4px 4px;
937
+    padding: 5px 4px;
938
+    font-size: 20px;
939
+    font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
940
+  }
941
+}
942
+
943
+/* ── 雷达图主体(含两侧浮窗) ── */
944
+.radar-body {
945
+  flex: 1;
946
+  display: flex;
947
+  gap: 8px;
948
+  min-height: 0;
949
+}
950
+
951
+/* ── 加/扣分浮窗 ── */
952
+.score-panel {
953
+  width: 180px;
954
+  flex-shrink: 0;
955
+  display: flex;
956
+  flex-direction: column;
957
+  border-radius: 12px;
958
+  overflow: hidden;
959
+  border: 1px solid #e0e7f0;
960
+  font-size: 12px;
961
+  background: #fff;
962
+}
963
+
964
+.panel-header {
965
+  padding: 6px 10px;
966
+  font-size: 13px;
967
+  font-weight: bold;
968
+  display: flex;
969
+  align-items: center;
970
+  flex-shrink: 0;
971
+}
972
+.deduct-header { background: rgba(254,233,232,1); color: #e03030; }
973
+.add-header    { background: rgba(206,248,228,1); color: #1a9944; }
974
+
975
+.panel-total {
976
+  font-size: 12px;
977
+  font-weight: bold;
978
+  margin-left: auto;
979
+}
980
+
981
+.panel-list {
982
+  flex: 1;
983
+  overflow-y: auto;
984
+  padding: 4px 0;
985
+}
986
+
987
+.panel-row {
988
+  display: flex;
989
+  align-items: center;
990
+  padding: 4px 8px;
991
+  gap: 4px;
992
+  border-bottom: 1px dashed #f0f0f0;
993
+  &:last-child { border-bottom: none; }
994
+}
995
+.p-dim  { color: #999; font-size: 11px; flex-shrink: 0; min-width: 28px; }
996
+.p-name { flex: 1; color: #444; font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
997
+.p-score { font-size: 12px; font-weight: bold; flex-shrink: 0; }
998
+.deduct-score { color: #e03030; }
999
+.add-score    { color: #1a9944; }
1000
+.p-empty { color: #bbb; font-size: 11px; text-align: center; padding: 12px 0; }
1001
+
1002
+/* 质控情况内容背景 */
1003
+.qc-info-bg {
1004
+  background-color: #D5E7FD;
1005
+  border-radius: 30px;
1006
+  padding: 12px 16px;
1007
+  font-size: 20px;
1008
+  font-family: 'AlibabaPuHuiTi', 'PingFang SC', 'Microsoft YaHei', sans-serif;
1009
+  font-weight: bold;
1010
+
1011
+  .s-lbl { color: rgba(16, 16, 16, 1); }
1012
+  .s-val {
1013
+    color: rgba(248, 3, 3, 1);
1014
+    background: rgba(255, 255, 255, 0.6);
1015
+    font-weight: bold;
710 1016
   }
711 1017
 }
712 1018
 
713 1019
 /* 通用 */
714
-.empty-text { color: #bbb; font-size: 12px; text-align: center; padding: 8px 0; }
1020
+.empty-text { color: #bbb; font-size: 20px; text-align: center; padding: 8px 0; }
715 1021
 </style>