瀏覽代碼

refactor(profile): 优化个人画像页面布局及样式,调整组织架构命名

- 将“安检大队”名称统一修改为“旅检部”和“部门”等对应称谓
- 统一调整多个视图组件中“大队”、“主管”、“科室”为“部门”、“班组”、“小组”等
- 注释并隐藏出勤人次图中“安检综合大队”相关配置和数据序列
- 个人画像页内增加工作履历、获奖记录、职业资格证书时间等展示模块
- 优化职级时间显示顺序和显示逻辑,调整计算逻辑和相关数据处理
- 改进雷达图配置,简化最大值计算,调整样式和颜色渐变效果
- 修改画像页面用户信息展示布局,增加标签显示样式,完善综合得分组件
- 统一巡检任务层级命名,调整描述文本内容,确保逻辑一致性
- 修正teamProfile组件watch配置,增加immediate以触发初始加载
- 简化warningPage组件el-tree-select标签格式,调整属性排列,无功能改动
- 多处样式细节优化,如线性渐变颜色、滚动条样式和容器尺寸调整
huoyi 5 天之前
父節點
當前提交
cb1f0ce952

+ 7 - 20
src/views/assistant/components/dutyOrganization.vue

@@ -558,7 +558,7 @@ const attendanceBarOptions = {
558 558
     }
559 559
   },
560 560
   legend: {
561
-    data: ['安检一大队', '安检二大队', '安检三大队', '安检综合大队', '全站'],
561
+    data: ['旅检一部', '旅检二部', '旅检三部', '全站'],
562 562
     top: 0,
563 563
     show: true,
564 564
   },
@@ -611,7 +611,7 @@ const attendanceBarOptions = {
611 611
       data: []
612 612
     },
613 613
     {
614
-      name: '安检一大队',
614
+      name: '旅检一部',
615 615
       type: 'bar',
616 616
       barWidth: '10%',
617 617
       itemStyle: {
@@ -625,7 +625,7 @@ const attendanceBarOptions = {
625 625
       data: []
626 626
     },
627 627
     {
628
-      name: '安检二大队',
628
+      name: '旅检二部',
629 629
       type: 'bar',
630 630
       barWidth: '10%',
631 631
       itemStyle: {
@@ -639,7 +639,7 @@ const attendanceBarOptions = {
639 639
       data: []
640 640
     },
641 641
     {
642
-      name: '安检三大队',
642
+      name: '旅检三部',
643 643
       type: 'bar',
644 644
       barWidth: '10%',
645 645
       itemStyle: {
@@ -652,20 +652,7 @@ const attendanceBarOptions = {
652 652
       },
653 653
       data: []
654 654
     },
655
-    {
656
-      name: '安检综合大队',
657
-      type: 'bar',
658
-      barWidth: '10%',
659
-      itemStyle: {
660
-        color: '#FFD166'
661
-      },
662
-      label: {
663
-        show: true,
664
-        position: 'top',
665
-        formatter: '{c}人'
666
-      },
667
-      data: []
668
-    }
655
+    
669 656
   ]
670 657
 }
671 658
 // 出勤人次柱状图配置
@@ -902,7 +889,7 @@ const updateAttendanceBarChart = () => {
902 889
     const dept1Data = trendList.map(item => item.data1 || 0)
903 890
     const dept2Data = trendList.map(item => item.data2 || 0)
904 891
     const dept3Data = trendList.map(item => item.data3 || 0)
905
-    const dept4Data = trendList.map(item => item.data4 || 0)
892
+    // const dept4Data = trendList.map(item => item.data4 || 0)
906 893
 
907 894
     // 更新图表配置
908 895
     attendanceBarOptions.xAxis.data = xAxisData
@@ -910,7 +897,7 @@ const updateAttendanceBarChart = () => {
910 897
     attendanceBarOptions.series[1].data = dept1Data
911 898
     attendanceBarOptions.series[2].data = dept2Data
912 899
     attendanceBarOptions.series[3].data = dept3Data
913
-    attendanceBarOptions.series[4].data = dept4Data
900
+    // attendanceBarOptions.series[4].data = dept4Data
914 901
     attendanceBarOptions.legend.show = !!isStationType.value
915 902
 
916 903
     // 重新设置图表选项

+ 3 - 3
src/views/assistant/components/performanceAnalysis.vue

@@ -68,7 +68,7 @@
68 68
         <!-- 大队分析 -->
69 69
         <div class="panel-item" :class="{ 'loading-overlay': brigadeLoading }">
70 70
           <div class="panel-header">
71
-            <h3>大队</h3>
71
+            <h3>部门</h3>
72 72
           </div>
73 73
           <!-- 折线图 -->
74 74
           <div class="chart-container">
@@ -91,7 +91,7 @@
91 91
         <!-- 科室分析 -->
92 92
         <div class="panel-item" :class="{ 'loading-overlay': departmentLoading }">
93 93
           <div class="panel-header">
94
-            <h3>主管</h3>
94
+            <h3>班组</h3>
95 95
           </div>
96 96
           <!-- 折线图 -->
97 97
           <div class="chart-container">
@@ -117,7 +117,7 @@
117 117
         <!-- 班组分析 -->
118 118
         <div class="panel-item" :class="{ 'loading-overlay': teamLoading }">
119 119
           <div class="panel-header">
120
-            <h3>组</h3>
120
+            <h3>组</h3>
121 121
             <div class="panel-tabs">
122 122
               <div class="button-group small">
123 123
                 <div v-for="option in tabOptions" :key="option.value" class="custom-button"

+ 4 - 4
src/views/assistant/components/riskHazard.vue

@@ -86,7 +86,7 @@
86 86
           <div class="table-container">
87 87
             <el-table :data="captureRankData" style="width: 100%" size="small">
88 88
               <el-table-column prop="rank" label="排名" align="center" />
89
-              <el-table-column prop="department" label="大队" />
89
+              <el-table-column prop="department" label="部门" />
90 90
               <el-table-column prop="percentage" label="占比" align="center">
91 91
                 <template #default="{ row }">
92 92
                   <span>{{ row.percentage }}%</span>
@@ -397,7 +397,7 @@ const concealmentPositionStatsDescription = computed(() => {
397 397
 const departmentRankingDescription = computed(() => {
398 398
 
399 399
   if (!departmentRankingData.value || !Array.isArray(departmentRankingData.value)) {
400
-    return 'XXXX是违禁品查获的主力大队,查获违禁物品数量为XX,占比XX%。'
400
+    return 'XXXX是违禁品查获的主力部门,查获违禁物品数量为XX,占比XX%。'
401 401
   }
402 402
 
403 403
   const rankingData = departmentRankingData.value
@@ -408,7 +408,7 @@ const departmentRankingDescription = computed(() => {
408 408
   // 2. 获取查获量最高的大队
409 409
   const topDepartment = sortedData[0] || { departmentName: 'XXXX', seizureCount: 234 }
410 410
 
411
-  const str = isStationType.value ? '大队' : isBrigadeType.value ? '主管' : isDepartmentType.value ? '班组' : isTeamsType.value ? '成员' : ''
411
+  const str = isStationType.value ? '部门' : isBrigadeType.value ? '班组' : isDepartmentType.value ? '小组' : isTeamsType.value ? '成员' : ''
412 412
   // 5. 生成描述文字
413 413
   return `${topDepartment.brigadeName || 'XXXX'}是违禁品查获的主力${str},查获违禁物品数量为${topDepartment.seizureCount || 'XX'},占比${topDepartment.currentRatio}%。`
414 414
 })
@@ -962,7 +962,7 @@ const updateDepartmentRankingTable = () => {
962 962
     // 转换数据格式
963 963
     const formattedData = tableData.map((item, index) => ({
964 964
       rank: index + 1,
965
-      department: item.brigadeName || '未知大队',
965
+      department: item.brigadeName || '未知部门',
966 966
       percentage: item.currentRatio || 0,
967 967
       count: item.seizureCount || 0
968 968
     }))

文件差異過大導致無法顯示
+ 4 - 4
src/views/assistant/components/useReports.vue


+ 2 - 2
src/views/ledger/import/index.vue

@@ -363,8 +363,8 @@ const importItems = reactive([
363 363
   },
364 364
   {
365 365
     key: 'qualificationLevel',
366
-    title: '职业资格等级',
367
-    desc: '职业资格等级流程记录',
366
+    title: '职业资格证书获取时间',
367
+    desc: '职业资格证书获取时间流程记录',
368 368
     icon: 'Medal',
369 369
     api: importQualificationLevel,
370 370
     loading: false,

+ 3 - 8
src/views/portraitManagement/components/ProfileRadar.vue

@@ -68,19 +68,13 @@ const computedRadarData = computed(() => {
68 68
 
69 69
 const computedIndicators = computed(() => {
70 70
   const data = computedRadarData.value
71
-  const allScores = data.map(item => item.finalScore || 0)
72
-  const maxValue = allScores.length > 0 ? Math.max(...allScores) : 100
73 71
   return data.map(item => ({
74 72
     name: item.name + '\n\n' + (item.finalScore || 0),
75
-    max: Math.max(maxValue, 1)
73
+    max: 100
76 74
   }))
77 75
 })
78 76
 
79
-const computedMaxScore = computed(() => {
80
-  const data = computedRadarData.value
81
-  const allScores = data.map(item => item.finalScore || 0)
82
-  return allScores.length > 0 ? Math.max(...allScores) : 100
83
-})
77
+const computedMaxScore = computed(() => 100)
84 78
 
85 79
 const computedSeries = computed(() => {
86 80
   return computedRadarData.value.map(item => item.finalScore || 0)
@@ -90,6 +84,7 @@ const radarChartRef = ref(null)
90 84
 let radarChart = null
91 85
 
92 86
 const updateRadarChart = () => {
87
+  
93 88
   if (!radarChartRef.value) return
94 89
 
95 90
   if (!radarChart) {

+ 300 - 230
src/views/portraitManagement/employeeProfile/index.vue

@@ -4,194 +4,198 @@
4 4
       <div class="content-search">
5 5
         <SearchBar v-model:visible="visible" @search="searchHandler" :deptType="'user'" />
6 6
       </div>
7
-      
8
-        <div v-show="portrait.personName" class="content-info">
9
-          <Card title="个人基本信息">
10
-            <div class="userInfo">
11
-              <div class="userInfo-name">
12
-                <div class="avatar-area">
13
-                  <img v-if="portrait.avatar" :src="portrait.avatar" class="avatar" alt="头像" />
14
-                  <div v-else class="avatar">{{ portrait.personName?.charAt(0) }}</div>
7
+
8
+      <div v-show="portrait.personName" class="content-info">
9
+        <Card title="个人基本信息">
10
+          <div class="userInfo">
11
+            <div class="userInfo-name">
12
+              <div class="avatar-area">
13
+                <img v-if="portrait.avatar" :src="portrait.avatar" class="avatar" alt="头像" />
14
+                <div v-else class="avatar">{{ portrait.personName?.charAt(0) }}</div>
15
+              </div>
16
+              <div class="basic-name">
17
+                <div class="basic-label">姓名:</div>
18
+                <div class="basic-value">{{ portrait.personName }}</div>
19
+              </div>
20
+            </div>
21
+            <div class="userInfo-info">
22
+              <div class="info-item">
23
+                <div class="info-item-icon">
24
+                  <img src="/src/assets/dataBigScreen/img01.png" alt="" />
15 25
                 </div>
16
-                <div class="basic-name">
17
-                  <div class="basic-label">姓名:</div>
18
-                  <div class="basic-value">{{ portrait.personName }}</div>
26
+                <div class="info-item-content">
27
+                  <div class="info-item-label">所属部门及队室:</div>
28
+                  <div class="info-item-value">{{ portrait.deptPath || '-' }}</div>
19 29
                 </div>
20 30
               </div>
21
-              <div class="userInfo-info">
22
-                <div class="info-item">
23
-                  <div class="info-item-icon">
24
-                    <img src="/src/assets/dataBigScreen/img01.png" alt="" />
25
-                  </div>
26
-                  <div class="info-item-content">
27
-                    <div class="info-item-label">所属部门及队室:</div>
28
-                    <div class="info-item-value">{{ portrait.deptPath || '-' }}</div>
29
-                  </div>
31
+              <div class="info-item">
32
+                <div class="info-item-icon">
33
+                  <img src="/src/assets/dataBigScreen/img04.png" alt="" />
30 34
                 </div>
31
-                <div class="info-item">
32
-                  <div class="info-item-icon">
33
-                    <img src="/src/assets/dataBigScreen/img04.png" alt="" />
34
-                  </div>
35
-                  <div class="info-item-content">
36
-                    <div class="info-item-label">学历:</div>
37
-                    <div class="info-item-value">{{ getSchooling(portrait.schooling) }}</div>
38
-                  </div>
35
+                <div class="info-item-content">
36
+                  <div class="info-item-label">学历:</div>
37
+                  <div class="info-item-value">{{ getSchooling(portrait.schooling) }}</div>
39 38
                 </div>
40 39
               </div>
41
-              <div class="userInfo-info">
42
-                <div class="info-item">
43
-                  <div class="info-item-icon">
44
-                    <img src="/src/assets/dataBigScreen/img02.png" alt="" />
45
-                  </div>
46
-                  <div class="info-item-content">
47
-                    <div class="info-item-label">出生日期:</div>
48
-                    <div class="info-item-value">{{ portrait.birthday || '-' }}</div>
49
-                  </div>
40
+            </div>
41
+            <div class="userInfo-info">
42
+              <div class="info-item">
43
+                <div class="info-item-icon">
44
+                  <img src="/src/assets/dataBigScreen/img02.png" alt="" />
50 45
                 </div>
51
-                <div class="info-item">
52
-                  <div class="info-item-icon">
53
-                    <img src="/src/assets/dataBigScreen/img05.png" alt="" />
54
-                  </div>
55
-                  <div class="info-item-content">
56
-                    <div class="info-item-label">专业:</div>
57
-                    <div class="info-item-value">{{ portrait.major || '-' }}</div>
58
-                  </div>
46
+                <div class="info-item-content">
47
+                  <div class="info-item-label">出生日期:</div>
48
+                  <div class="info-item-value">{{ portrait.birthday || '-' }}</div>
59 49
                 </div>
60 50
               </div>
61
-              <div class="userInfo-info">
62
-                <div class="info-item">
63
-                  <div class="info-item-icon">
64
-                    <img src="/src/assets/dataBigScreen/img03.png" alt="" />
65
-                  </div>
66
-                  <div class="info-item-content">
67
-                    <div class="info-item-label">技能等级:</div>
68
-                    <div class="info-item-value">
69
-                      {{ portrait.qualificationLevelText || '-' }}
70
-                      <span class="info-item-tag" style="margin-left: 10px;margin-top: 2px;" v-if="!!portrait.xrayOperatorStarttime">X射线安检仪操作岗位</span>
71
-                    </div>
72
-                  </div>
51
+              <div class="info-item">
52
+                <div class="info-item-icon">
53
+                  <img src="/src/assets/dataBigScreen/img05.png" alt="" />
73 54
                 </div>
74
-                <div class="info-item">
75
-                  <div class="info-item-icon">
76
-                    <img src="/src/assets/dataBigScreen/img06.png" alt="" />
77
-                  </div>
78
-                  <div class="info-item-content">
79
-                    <div class="info-item-label">标签:</div>
80
-                    <div class="info-item-value" v-if="portrait.userTags">
81
-                      <span class="info-item-tag" v-for="tag in portrait.userTags.split(',')" :key="tag">{{ tag }}</span>
82
-                    </div>
55
+                <div class="info-item-content">
56
+                  <div class="info-item-label">专业:</div>
57
+                  <div class="info-item-value">{{ portrait.major || '-' }}</div>
58
+                </div>
59
+              </div>
60
+            </div>
61
+            <div class="userInfo-info">
62
+              <div class="info-item">
63
+                <div class="info-item-icon">
64
+                  <img src="/src/assets/dataBigScreen/img03.png" alt="" />
65
+                </div>
66
+                <div class="info-item-content">
67
+                  <div class="info-item-label">技能等级:</div>
68
+                  <div class="info-item-value">
69
+                    {{ portrait.qualificationLevelText || '-' }}
70
+                    <span class="info-item-tag" style="margin-left: 10px;margin-top: 2px;"
71
+                      v-if="!!portrait.xrayOperatorStarttime">X射线安检仪操作岗位</span>
83 72
                   </div>
84 73
                 </div>
85 74
               </div>
86
-              <div class="userInfo-score">
87
-                <div class="score-progress">
88
-                  <el-progress type="circle" :width="160" :stroke-width="18" color="#5BE39E" :percentage="(portrait.totalScore || -2) + 2">
89
-                    <div class="percentage-content">
90
-                      <span class="percentage-value">{{ (portrait.totalScore || 0)  }}</span>
91
-                      <span class="percentage-text">综合得分</span>
92
-                    </div>
93
-                  </el-progress>
75
+              <div class="info-item">
76
+                <div class="info-item-icon">
77
+                  <img src="/src/assets/dataBigScreen/img06.png" alt="" />
78
+                </div>
79
+                <div class="info-item-content">
80
+                  <div class="info-item-label">标签:</div>
81
+                  <div class="info-item-value" v-if="portrait.userTags">
82
+                    <span class="info-item-tag" v-for="tag in portrait.userTags.split(',')" :key="tag">{{ tag }}</span>
83
+                  </div>
94 84
                 </div>
95
-                <div class="score-box">
96
-                  <!-- <div class="score-row">
85
+              </div>
86
+            </div>
87
+            <div class="userInfo-score">
88
+              <div class="score-progress">
89
+                <el-progress type="circle" :width="160" :stroke-width="18" color="#5BE39E"
90
+                  :percentage="(portrait.totalScore || -2) + 2">
91
+                  <div class="percentage-content">
92
+                    <span class="percentage-value">{{ (portrait.totalScore || 0) }}</span>
93
+                    <span class="percentage-text">综合得分</span>
94
+                  </div>
95
+                </el-progress>
96
+              </div>
97
+              <div class="score-box">
98
+                <!-- <div class="score-row">
97 99
                     <span class="score-col">评分:</span>
98 100
                     <span class="score-col-2">{{ portrait.totalScore || 0 }}</span>
99 101
                   </div> -->
100
-                  <div class="score-row">
101
-                    <span class="score-col">附加分:</span>
102
-                    <span class="score-col-2">{{ portrait?.userTags?.split(',').length || 0 }}分</span>
103
-                    <!-- <span class="score-col-2">{{ tagScoreData != null ? (typeof tagScoreData === 'object' ? (tagScoreData.totalScore ?? tagScoreData.score ?? tagScoreData) : tagScoreData) : 0 }}</span> -->
104
-                  </div>
102
+                <div class="score-row">
103
+                  <span class="score-col">附加分:</span>
104
+                  <span class="score-col-2">{{ portrait?.userTags?.split(',').length || 0 }}分</span>
105
+                  <!-- <span class="score-col-2">{{ tagScoreData != null ? (typeof tagScoreData === 'object' ? (tagScoreData.totalScore ?? tagScoreData.score ?? tagScoreData) : tagScoreData) : 0 }}</span> -->
106
+                </div>
107
+              </div>
108
+            </div>
109
+          </div>
110
+        </Card>
111
+      </div>
112
+      <div v-show="portrait.personName" class="content-bottom">
113
+        <div class="content-bottom-left">
114
+          <Card title="工作履历">
115
+            <div class="work-history">
116
+              <span v-if="portrait.entryDate">
117
+                {{ formatWorkDate(portrait.entryDate) }}入职 | 司龄{{ portrait.companyYears != null ? portrait.companyYears
118
+                : '-' }}年 | 开机年限{{ portrait.xrayOperatorYears != null ? portrait.xrayOperatorYears : '-'
119
+
120
+                }}年 | 现任职{{ portrait.roleNames || '-' }}
121
+              </span>
122
+              <span v-else>暂无数据</span>
123
+            </div>
124
+          </Card>
125
+          <Card title="获奖记录">
126
+            <div class="card-content">
127
+              <div class="honor-item" v-for="(value, index) in portrait.awards" :key="index">
128
+                <div :style="{ '--indexBgColor': value.color }">
129
+                  <div :data-index="index + 1"></div>
130
+                  {{ value.level2Name }} {{ value.level4Name }}
105 131
                 </div>
132
+                <div>{{ value.score || '-' }}分</div>
133
+              </div>
134
+            </div>
135
+          </Card>
136
+          <Card title="职业资格证书获取时间">
137
+            <div class="cert-info">
138
+              <div class="cert-item" v-for="level in displayQualificationLevels" :key="level.field">
139
+                <span class="cert-name">{{ level.label }}:{{ qualificationData?.[level.field] || '-' }}</span>
106 140
               </div>
107 141
             </div>
108 142
           </Card>
109 143
         </div>
110
-        <div v-show="portrait.personName" class="content-bottom">
111
-          <div class="content-bottom-left">
112
-            <Card title="工作履历">
113
-              <div class="work-history">
114
-                <span v-if="portrait.entryDate">
115
-                  {{ formatWorkDate(portrait.entryDate)  }}入职 | 司龄{{ portrait.companyYears != null ? portrait.companyYears : '-' }}年 | 开机年限{{ portrait.xrayOperatorYears != null ? portrait.xrayOperatorYears : '-'
116
-
117
-                  }}年 | 现任职{{ portrait.roleNames || '-' }}
118
-                </span>
119
-                <span v-else>暂无数据</span>
144
+        <div class="content-bottom-center">
145
+          <Card title="个人能力">
146
+            <div class="chart-legend">
147
+              <div class="legend-item legend-warning"><span></span>预警线(低于75分)</div>
148
+              <!-- <div class="legend-item legend-normal"><span></span>正常线(75~90分)</div> -->
149
+              <div class="legend-item legend-excellent"><span></span>优秀线(高于90分)</div>
150
+              <div class="legend-item legend-current"><span></span>当前员工分值</div>
151
+            </div>
152
+            <div ref="abilityChart" class="chart-box" @click="goToWarningPage" />
153
+          </Card>
154
+        </div>
155
+        <div class="content-bottom-right">
156
+          <Card title="补充信息">
157
+            <div class="card-content">
158
+              <div class="supp-item">
159
+                <span class="s-lbl">政治面貌:</span>
160
+                <span class="s-val">{{ portrait.politicalStatusText || '-' }}</span>
120 161
               </div>
121
-            </Card>
122
-            <Card title="获奖记录">
123
-              <div class="card-content">
124
-                <div class="honor-item" v-for="(value, index) in portrait.awards" :key="index">
125
-                  <div :style="{'--indexBgColor': value.color}">
126
-                    <div :data-index="index + 1"></div>
127
-                    {{ value.level2Name }} {{ value.level4Name }}
128
-                  </div>
129
-                  <div>{{ value.score || '-' }}分</div>
130
-                </div>
162
+              <div class="supp-item supp-item-2">
163
+                <span class="s-lbl">性别:</span>
164
+                <span class="s-val">{{ portrait.sexText || '-' }}</span>
131 165
               </div>
132
-            </Card>
133
-            <Card title="职业资格证书情况">
134
-              <div class="cert-info">
135
-                <div class="cert-item" v-for="level in displayQualificationLevels" :key="level.field">
136
-                  <span class="cert-name">{{ level.label }}:{{ qualificationData?.[level.field] || '-' }}</span>
137
-                </div>
166
+              <div class="supp-item">
167
+                <span class="s-lbl">籍贯:</span>
168
+                <span class="s-val">{{ portrait.nativePlace || '-' }}</span>
138 169
               </div>
139
-            </Card>
140
-          </div>
141
-          <div class="content-bottom-center">
142
-            <Card title="个人能力">
143
-              <div class="chart-legend">
144
-                <div class="legend-item legend-warning"><span></span>预警线(低于75分)</div>
145
-                <!-- <div class="legend-item legend-normal"><span></span>正常线(75~90分)</div> -->
146
-                <div class="legend-item legend-excellent"><span></span>优秀线(高于90分)</div>
147
-                <div class="legend-item legend-current"><span></span>当前员工分值</div>
170
+              <div class="supp-item supp-item-2">
171
+                <span class="s-lbl">民族:</span>
172
+                <span class="s-val">{{ portrait.nation || '-' }}</span>
148 173
               </div>
149
-              <div ref="abilityChart" class="chart-box" @click="goToWarningPage" />
150
-            </Card>
151
-          </div>
152
-          <div class="content-bottom-right">
153
-            <Card title="补充信息">
154
-              <div class="card-content">
155
-                <div class="supp-item">
156
-                  <span class="s-lbl">政治面貌:</span>
157
-                  <span class="s-val">{{ portrait.politicalStatusText || '-' }}</span>
158
-                </div>
159
-                <div class="supp-item supp-item-2">
160
-                  <span class="s-lbl">性别:</span>
161
-                  <span class="s-val">{{ portrait.sexText || '-' }}</span>
162
-                </div>
163
-                <div class="supp-item">
164
-                  <span class="s-lbl">籍贯:</span>
165
-                  <span class="s-val">{{ portrait.nativePlace || '-' }}</span>
166
-                </div>
167
-                <div class="supp-item supp-item-2">
168
-                  <span class="s-lbl">民族:</span>
169
-                  <span class="s-val">{{ portrait.nation || '-' }}</span>
170
-                </div>
171
-                <div class="supp-item">
172
-                  <span class="s-lbl">年龄:</span>
173
-                  <span class="s-val">{{ getAge(portrait.birthday) }}</span>
174
-                </div>
175
-                <div class="supp-item supp-item-2">
176
-                  <span class="s-lbl">司龄:</span>
177
-                  <span class="s-val">{{ portrait.companyYears != null ? portrait.companyYears+'年' : '-' }}</span>
178
-                </div>
179
-                <div class="supp-item">
180
-                  <span class="s-lbl">性格特征:</span>
181
-                  <span class="s-val">{{ portrait.characterCharacteristics || '-' }}</span>
182
-                </div>
183
-                <div class="supp-item supp-item-2">
184
-                  <span class="s-lbl">工作风格:</span>
185
-                  <span class="s-val">{{ portrait.workingStyle || '-' }}</span>
186
-                </div>
187
-                <div :class="i % 2 ? 'supp-item' : 'supp-item supp-item-2'" v-for="(p, i) in (portrait.postNames || '').split('、')" :key="i">
188
-                  <span class="s-lbl">{{ i === 0 ? '业务岗位:' : ''}}</span>
189
-                  <span class="s-val">{{ p }}</span>
190
-                </div>
174
+              <div class="supp-item">
175
+                <span class="s-lbl">年龄:</span>
176
+                <span class="s-val">{{ getAge(portrait.birthday) }}</span>
191 177
               </div>
192
-            </Card>
193
-          </div>
178
+              <div class="supp-item supp-item-2">
179
+                <span class="s-lbl">司龄:</span>
180
+                <span class="s-val">{{ portrait.companyYears != null ? portrait.companyYears + '年' : '-' }}</span>
181
+              </div>
182
+              <div class="supp-item">
183
+                <span class="s-lbl">性格特征:</span>
184
+                <span class="s-val">{{ portrait.characterCharacteristics || '-' }}</span>
185
+              </div>
186
+              <div class="supp-item supp-item-2">
187
+                <span class="s-lbl">工作风格:</span>
188
+                <span class="s-val">{{ portrait.workingStyle || '-' }}</span>
189
+              </div>
190
+              <div :class="i % 2 ? 'supp-item' : 'supp-item supp-item-2'"
191
+                v-for="(p, i) in (portrait.postNames || '').split('、')" :key="i">
192
+                <span class="s-lbl">{{ i === 0 ? '业务岗位:' : '' }}</span>
193
+                <span class="s-val">{{ p }}</span>
194
+              </div>
195
+            </div>
196
+          </Card>
194 197
         </div>
198
+      </div>
195 199
       <div v-show="!portrait.personName" class="ep-empty">
196 200
         <el-empty description="搜索员工姓名以查看画像" />
197 201
       </div>
@@ -300,11 +304,11 @@ const deductTotal = computed(() => {
300 304
 
301 305
 // 职业资格等级枚举
302 306
 const qualificationLevelMap = [
303
-  { label: '一级', field: 'levelOneTime' },
304
-  { label: '二级', field: 'levelTwoTime' },
305
-  { label: '三级', field: 'levelThreeTime' },
307
+  { label: '五级', field: 'levelFiveTime' },
306 308
   { label: '四级', field: 'levelFourTime' },
307
-  { label: '五级', field: 'levelFiveTime' }
309
+  { label: '三级', field: 'levelThreeTime' },
310
+  { label: '二级', field: 'levelTwoTime' },
311
+  { label: '一级', field: 'levelOneTime' },
308 312
 ]
309 313
 
310 314
 const displayQualificationLevels = computed(() => {
@@ -312,7 +316,7 @@ const displayQualificationLevels = computed(() => {
312 316
   if (!currentLevel) return []
313 317
   const currentIndex = qualificationLevelMap.findIndex(l => l.label === currentLevel)
314 318
   if (currentIndex === -1) return []
315
-  return qualificationLevelMap.slice(0, currentIndex + 1)
319
+  return qualificationLevelMap.slice(currentIndex)
316 320
 })
317 321
 
318 322
 
@@ -367,12 +371,12 @@ const invokerEmployeePortrait = (query) => {
367 371
   const tagPromise = countTagScore(queryData).then(res => {
368 372
     const data = res.data
369 373
     if (Array.isArray(data)) {
370
-   
371
-   
372
-      const found = data.find(item => (item.userId == userId) )
373
-      
374
+
375
+
376
+      const found = data.find(item => (item.userId == userId))
377
+
374 378
       if (found) {
375
-        
379
+
376 380
         tagScoreData.value = found.totalScore ?? found.score
377 381
       } else {
378 382
         tagScoreData.value = null
@@ -414,50 +418,50 @@ const radarData = reactive({
414 418
 })
415 419
 const permutationRadarDataHandler = (result = []) => {
416 420
   radarData.grounp = result.map(d => ({ name: d.name + '\n\n' + d.score, max: 100 })),
417
-  radarData.data = [{
418
-    name: '个人能力',
419
-    value: result.map(attr => attr.score),
420
-    symbolSize: 10,
421
-    areaStyle: {
422
-      show: false,
423
-      opacity: 0,
424
-     
425
-      // color: {
426
-      //   type: 'linear',
427
-      //   x: 0,
428
-      //   y: 0,
429
-      //   x2: 0,
430
-      //   y2: 1,
431
-      //   colorStops: [{
432
-      //     offset: 0, color: '#4DC8FE'
433
-      //   }, {
434
-      //     offset: 1, color: '#6C26F3'
435
-      //   }],
436
-      //   global: false
421
+    radarData.data = [{
422
+      name: '个人能力',
423
+      value: result.map(attr => attr.score),
424
+      symbolSize: 10,
425
+      areaStyle: {
426
+        show: false,
427
+        opacity: 0,
428
+
429
+        // color: {
430
+        //   type: 'linear',
431
+        //   x: 0,
432
+        //   y: 0,
433
+        //   x2: 0,
434
+        //   y2: 1,
435
+        //   colorStops: [{
436
+        //     offset: 0, color: '#4DC8FE'
437
+        //   }, {
438
+        //     offset: 1, color: '#6C26F3'
439
+        //   }],
440
+        //   global: false
441
+        // },
442
+      },
443
+      lineStyle: {
444
+        color: '#4DC8FE',
445
+        width: 2
446
+      },
447
+      // lineStyle: {
448
+      //   color: {
449
+      //     type: 'linear',
450
+      //     x: 0,
451
+      //     y: 0,
452
+      //     x2: 0,
453
+      //     y2: 1,
454
+      //     colorStops: [{
455
+      //       offset: 0, color: '#4DC8FE'
456
+      //     }, {
457
+      //       offset: 1, color: '#6C26F3'
458
+      //     }],
459
+      //     global: false
460
+      //   },
461
+      //   width: 5
437 462
       // },
438
-    },
439
-    lineStyle: {
440
-      color: '#4DC8FE',
441
-      width: 2
442
-    },
443
-    // lineStyle: {
444
-    //   color: {
445
-    //     type: 'linear',
446
-    //     x: 0,
447
-    //     y: 0,
448
-    //     x2: 0,
449
-    //     y2: 1,
450
-    //     colorStops: [{
451
-    //       offset: 0, color: '#4DC8FE'
452
-    //     }, {
453
-    //       offset: 1, color: '#6C26F3'
454
-    //     }],
455
-    //     global: false
456
-    //   },
457
-    //   width: 5
458
-    // },
459
-    itemStyle: { color: '#fff', borderWidth: 1,  borderColor: '#00C8DA', borderJoin: 'round' }
460
-  }]
463
+      itemStyle: { color: '#fff', borderWidth: 1, borderColor: '#00C8DA', borderJoin: 'round' }
464
+    }]
461 465
 }
462 466
 const setRadarOptions = computed(() => {
463 467
   return {
@@ -467,7 +471,7 @@ const setRadarOptions = computed(() => {
467 471
       radius: '65%',
468 472
       splitNumber: 8,
469 473
       axisLine: { lineStyle: { color: '#ccc' } },
470
-      splitLine: { lineStyle: { color: ['#ccc', '#ccc', '#ccc', '#ccc', '#ccc', '#ccc', '#fe4322', '#8EC742', '#ccc'], width: 3  } },
474
+      splitLine: { lineStyle: { color: ['#ccc', '#ccc', '#ccc', '#ccc', '#ccc', '#ccc', '#fe4322', '#8EC742', '#ccc'], width: 3 } },
471 475
       splitArea: { show: false },
472 476
       axisName: {
473 477
         color: '#fff',
@@ -547,13 +551,14 @@ onUnmounted(() => {
547 551
 
548 552
 <style lang="scss" scoped>
549 553
 .content {
550
-  height:  calc(100vh - 90px);
554
+  height: calc(100vh - 90px);
551 555
   display: flex;
552 556
   flex-direction: column;
553 557
   row-gap: 15px;
554 558
   padding: 15px;
555 559
   box-sizing: border-box;
556 560
   overflow: hidden;
561
+
557 562
   .ep-empty {
558 563
     background: #fff;
559 564
     height: 100%;
@@ -564,17 +569,21 @@ onUnmounted(() => {
564 569
     opacity: 0.8;
565 570
     border-radius: 30px;
566 571
   }
572
+
567 573
   .content-search {}
574
+
568 575
   .content-info {
569
-    & > * {
576
+    &>* {
570 577
       height: 100%;
571 578
     }
579
+
572 580
     .userInfo {
573 581
       display: flex;
574 582
       width: 100%;
575 583
       height: 180px;
576 584
       box-sizing: border-box;
577 585
       column-gap: 5px;
586
+
578 587
       .userInfo-name {
579 588
         flex: 1;
580 589
         position: relative;
@@ -582,16 +591,18 @@ onUnmounted(() => {
582 591
         align-items: center;
583 592
         justify-content: center;
584 593
         column-gap: 30px;
594
+
585 595
         &::after {
586 596
           content: '';
587 597
           display: block;
588 598
           width: 1px;
589
-          background:linear-gradient(180deg, transparent, #6f6c98, transparent);
599
+          background: linear-gradient(180deg, transparent, #6f6c98, transparent);
590 600
           height: 100%;
591 601
           position: absolute;
592 602
           top: 0;
593 603
           right: -2px;
594 604
         }
605
+
595 606
         .avatar-area {
596 607
           height: 140px;
597 608
           width: 140px;
@@ -600,6 +611,7 @@ onUnmounted(() => {
600 611
           display: flex;
601 612
           align-items: center;
602 613
           justify-content: center;
614
+
603 615
           .avatar {
604 616
             width: 100%;
605 617
             height: 100%;
@@ -611,22 +623,26 @@ onUnmounted(() => {
611 623
             font-weight: 900;
612 624
           }
613 625
         }
626
+
614 627
         .basic-name {
615 628
           display: flex;
616 629
           flex-direction: column;
617 630
           justify-content: center;
618 631
           row-gap: 10px;
619 632
           font-weight: 500;
633
+
620 634
           .basic-label {
621 635
             font-size: 18px;
622 636
             color: #8675AE;
623 637
           }
638
+
624 639
           .basic-value {
625 640
             font-size: 26px;
626 641
             color: #fff;
627 642
           }
628 643
         }
629 644
       }
645
+
630 646
       .userInfo-info {
631 647
         flex: 1;
632 648
         position: relative;
@@ -636,28 +652,33 @@ onUnmounted(() => {
636 652
         padding: 10px 15px;
637 653
         padding-right: 0px;
638 654
         box-sizing: border-box;
655
+
639 656
         &::after {
640 657
           content: '';
641 658
           display: block;
642 659
           width: 1px;
643
-          background:linear-gradient(180deg, transparent, #6f6c98, transparent);
660
+          background: linear-gradient(180deg, transparent, #6f6c98, transparent);
644 661
           height: 100%;
645 662
           position: absolute;
646 663
           top: 0;
647 664
           right: -2px;
648 665
         }
666
+
649 667
         .info-item {
650 668
           display: flex;
651 669
           column-gap: 15px;
670
+
652 671
           .info-item-content {
653 672
             display: flex;
654 673
             flex-direction: column;
655 674
             justify-content: space-between;
656 675
             font-weight: 500;
676
+
657 677
             .info-item-label {
658 678
               font-size: 18px;
659 679
               color: #8675AE;
660 680
             }
681
+
661 682
             .info-item-value {
662 683
               font-size: 18px;
663 684
               color: #fff;
@@ -666,6 +687,7 @@ onUnmounted(() => {
666 687
               flex-wrap: wrap;
667 688
               gap: 2px;
668 689
             }
690
+
669 691
             .info-item-tag {
670 692
               font-size: 14px;
671 693
               display: block;
@@ -676,6 +698,7 @@ onUnmounted(() => {
676 698
           }
677 699
         }
678 700
       }
701
+
679 702
       .userInfo-score {
680 703
         :deep(.el-progress-circle) {
681 704
           width: 160px;
@@ -683,11 +706,13 @@ onUnmounted(() => {
683 706
           --el-fill-color-light: #004970;
684 707
           transform: rotate(0.5turn);
685 708
         }
709
+
686 710
         flex: 1;
687 711
         display: flex;
688 712
         align-items: center;
689 713
         padding-left: 15px;
690 714
         column-gap: 25px;
715
+
691 716
         .score-progress {
692 717
           .percentage-content {
693 718
             display: flex;
@@ -695,26 +720,31 @@ onUnmounted(() => {
695 720
             align-items: center;
696 721
             row-gap: 6px;
697 722
             font-weight: 500;
723
+
698 724
             .percentage-value {
699 725
               font-size: 48px;
700 726
               color: #02E5CC;
701 727
             }
728
+
702 729
             .percentage-text {
703 730
               font-size: 16px;
704 731
               color: #fff;
705 732
             }
706 733
           }
707 734
         }
735
+
708 736
         .score-box {
709 737
           display: flex;
710 738
           flex-direction: column;
711 739
           font-weight: 500;
712 740
           row-gap: 15px;
713 741
           font-size: 18px;
742
+
714 743
           .score-col {
715 744
             display: inline-block;
716 745
             width: 5em;
717 746
           }
747
+
718 748
           .score-col-2 {
719 749
             font-size: 24px;
720 750
           }
@@ -722,24 +752,30 @@ onUnmounted(() => {
722 752
       }
723 753
     }
724 754
   }
755
+
725 756
   .content-bottom {
726 757
     flex: 1;
727 758
     display: flex;
728 759
     column-gap: 15px;
729 760
     overflow: hidden;
761
+
730 762
     .content-bottom-left {
731 763
       width: 380px;
732 764
       display: flex;
733 765
       flex-direction: column;
734 766
       row-gap: 15px;
735
-      & > *:nth-child(1) {
767
+
768
+      &>*:nth-child(1) {
736 769
         height: 160px;
770
+
737 771
         .work-history {
738 772
           font-size: 18px;
739 773
         }
740 774
       }
741
-      & > *:nth-child(2) {
775
+
776
+      &>*:nth-child(2) {
742 777
         flex: 1.6;
778
+
743 779
         .honor-item {
744 780
           height: 48px;
745 781
           padding-right: 15px;
@@ -750,12 +786,14 @@ onUnmounted(() => {
750 786
           align-items: center;
751 787
           justify-content: space-between;
752 788
           position: relative;
753
-          & > div:nth-child(1) {
789
+
790
+          &>div:nth-child(1) {
754 791
             display: flex;
755 792
             align-items: center;
756 793
             column-gap: 15px;
757 794
             margin-left: 10px;
758
-            & > div {
795
+
796
+            &>div {
759 797
               width: 26px;
760 798
               height: 20px;
761 799
               position: relative;
@@ -763,6 +801,7 @@ onUnmounted(() => {
763 801
               text-align: center;
764 802
               line-height: 20px;
765 803
               color: #222;
804
+
766 805
               &::before {
767 806
                 position: absolute;
768 807
                 inset: 0;
@@ -773,6 +812,7 @@ onUnmounted(() => {
773 812
                 height: 100%;
774 813
                 transform: skew(-25deg);
775 814
               }
815
+
776 816
               &::after {
777 817
                 position: absolute;
778 818
                 inset: 0;
@@ -784,9 +824,11 @@ onUnmounted(() => {
784 824
               }
785 825
             }
786 826
           }
787
-          & > div:nth-child(2) {
827
+
828
+          &>div:nth-child(2) {
788 829
             color: #02E5CC;
789 830
           }
831
+
790 832
           &::after {
791 833
             content: '';
792 834
             display: block;
@@ -795,16 +837,19 @@ onUnmounted(() => {
795 837
             left: 0;
796 838
             height: 1px;
797 839
             width: 100%;
798
-            background:linear-gradient(45deg, transparent 0%, transparent 30%, #6f6c98 100%);
840
+            background: linear-gradient(45deg, transparent 0%, transparent 30%, #6f6c98 100%);
799 841
           }
800 842
         }
801 843
       }
802 844
     }
845
+
803 846
     .content-bottom-center {
804 847
       flex: 1;
805
-      & > * {
848
+
849
+      &>* {
806 850
         height: 100%;
807 851
       }
852
+
808 853
       .chart-legend {
809 854
         display: flex;
810 855
         justify-content: center;
@@ -815,10 +860,12 @@ onUnmounted(() => {
815 860
         color: #fff;
816 861
         font-size: 14px;
817 862
       }
863
+
818 864
       .legend-item {
819 865
         display: flex;
820 866
         align-items: center;
821 867
         gap: 6px;
868
+
822 869
         span {
823 870
           width: 24px;
824 871
           height: 10px;
@@ -826,41 +873,53 @@ onUnmounted(() => {
826 873
           border-radius: 2px;
827 874
         }
828 875
       }
876
+
829 877
       .legend-warning {
830 878
         color: #fe4322;
831
-        span { 
879
+
880
+        span {
832 881
           background-color: #fe4322;
833 882
         }
834 883
       }
884
+
835 885
       .legend-normal {
836 886
         color: #fff;
837
-        span { 
887
+
888
+        span {
838 889
           background-color: #fff;
839 890
         }
840 891
       }
892
+
841 893
       .legend-excellent {
842 894
         color: #8EC742;
843
-        span { 
895
+
896
+        span {
844 897
           background-color: #8EC742;
845 898
         }
846 899
       }
900
+
847 901
       .legend-current {
848 902
         color: #1890ff;
849
-        span { 
903
+
904
+        span {
850 905
           background-color: #1890ff;
851 906
         }
852 907
       }
908
+
853 909
       .chart-box {
854 910
         width: 100%;
855 911
         height: calc(100% - 34px);
856 912
         overflow: hidden;
857 913
       }
858 914
     }
915
+
859 916
     .content-bottom-right {
860 917
       width: 380px;
861
-      & > * {
918
+
919
+      &>* {
862 920
         height: 100%;
863 921
       }
922
+
864 923
       .supp-item {
865 924
         display: flex;
866 925
         justify-content: space-between;
@@ -869,24 +928,30 @@ onUnmounted(() => {
869 928
         padding: 0 15px;
870 929
         font-weight: 500;
871 930
         font-size: 18px;
931
+
872 932
         .s-lbl {
873 933
           color: #8675AE;
874 934
         }
935
+
875 936
         .s-val {
876 937
           color: #fff;
877 938
         }
878 939
       }
940
+
879 941
       .supp-item-2 {
880 942
         background: #261C48;
881 943
       }
882 944
     }
945
+
883 946
     .card-content {
884 947
       height: 100%;
885 948
       overflow-x: hidden;
886 949
       overflow-y: auto;
950
+
887 951
       &::-webkit-scrollbar-track {
888 952
         background: transparent;
889 953
       }
954
+
890 955
       &::-webkit-scrollbar-thumb {
891 956
         background: linear-gradient(225deg, #4355cb, #873dc3);
892 957
         border-radius: 4px;
@@ -903,6 +968,7 @@ onUnmounted(() => {
903 968
   pointer-events: none;
904 969
   transform: translateY(-80%);
905 970
   display: none;
971
+
906 972
   .p-empty {
907 973
     text-align: center;
908 974
     margin-top: 5px;
@@ -926,9 +992,11 @@ onUnmounted(() => {
926 992
     align-items: center;
927 993
     justify-content: space-between;
928 994
     color: #fff;
995
+
929 996
     .deduct-text {
930 997
       color: #ff4d4f;
931 998
     }
999
+
932 1000
     .add-text {
933 1001
       color: #00b42a;
934 1002
     }
@@ -941,9 +1009,11 @@ onUnmounted(() => {
941 1009
     justify-content: space-between;
942 1010
     font-weight: 500;
943 1011
     font-size: 16px;
1012
+
944 1013
     &.deduct {
945 1014
       color: #ff4d4f;
946 1015
     }
1016
+
947 1017
     &.add {
948 1018
       color: #00b42a;
949 1019
     }

+ 1 - 1
src/views/portraitManagement/teamProfile/component/profile.vue

@@ -139,7 +139,7 @@ const fetchData = (params) => {
139 139
 
140 140
 watch(() => props.queryParams, (newParams) => {
141 141
   fetchData(newParams)
142
-}, { deep: true })
142
+}, { deep: true, immediate: true })
143 143
 
144 144
 
145 145
 </script>

+ 32 - 46
src/views/warningPage/index.vue

@@ -28,18 +28,10 @@
28 28
                     <el-date-picker v-model="endDate" type="date" placeholder="结束日期" style="width: 150px;" />
29 29
 
30 30
                 </div>
31
-                <el-tree-select
32
-                    v-model="selectedOrg"
33
-                    :data="cascadeOptions"
34
-                    :props="{ label: 'label', value: 'value', children: 'children' }"
35
-                    node-key="value"
36
-                    placeholder="组织架构/员工"
37
-                    clearable
38
-                    filterable
39
-                    check-strictly
40
-                    style="width: 480px;"
41
-                    @change="fetchWarningData"
42
-                />
31
+                <el-tree-select v-model="selectedOrg" :data="cascadeOptions"
32
+                    :props="{ label: 'label', value: 'value', children: 'children' }" node-key="value"
33
+                    placeholder="组织架构/员工" clearable filterable check-strictly style="width: 480px;"
34
+                    @change="fetchWarningData" />
43 35
             </div>
44 36
             <div class="filter-group">
45 37
                 <el-select v-model="selectedAlertLevel" placeholder="预警等级" clearable style="width: 250px;">
@@ -86,7 +78,8 @@
86 78
                         <el-table-column prop="overallScore" label="综合评估得分" sortable>
87 79
                             <template #default="{ row }">
88 80
                                 <span v-if="row.overallScore < 75" class="score-danger">{{ row.overallScore }} 分</span>
89
-                                <span v-else-if="row.overallScore >= 90" class="score-excellent">{{ row.overallScore }} 分</span>
81
+                                <span v-else-if="row.overallScore >= 90" class="score-excellent">{{ row.overallScore }}
82
+                                    分</span>
90 83
                                 <span v-else style="font-weight:600;">{{ row.overallScore }} 分</span>
91 84
                             </template>
92 85
                         </el-table-column>
@@ -104,8 +97,7 @@
104 97
                         <el-table-column prop="coreRisksOrOutstandingAchievements" label="核心风险/优秀事迹" />
105 98
                         <el-table-column prop="statusLabel" label="状态标签">
106 99
                             <template #default="{ row }">
107
-                                <span v-if="row.overallScore < 75" style="color:#b91c1c;"><i
108
-                                        class="fas fa-bell"></i>
100
+                                <span v-if="row.overallScore < 75" style="color:#b91c1c;"><i class="fas fa-bell"></i>
109 101
                                     {{ getAlertLabel(row.statusLabel) }}</span>
110 102
                                 <span v-else-if="row.overallScore >= 90" style="color:#15803d;"><i
111 103
                                         class="fas fa-crown"></i> {{ getAlertLabel(row.statusLabel) }}</span>
@@ -113,17 +105,10 @@
113 105
                             </template>
114 106
                         </el-table-column>
115 107
                     </el-table>
116
-                    <el-pagination
117
-                        v-show="total > 0"
118
-                        :total="total"
119
-                        v-model:current-page="queryParams.pageNum"
120
-                        v-model:page-size="queryParams.pageSize"
121
-                        :page-sizes="[10, 20, 50, 100]"
122
-                        layout="total, sizes, prev, pager, next, jumper"
123
-                        @size-change="handleSizeChange"
124
-                        @current-change="handlePageChange"
125
-                        style="margin-top: 16px; justify-content: flex-end;"
126
-                    />
108
+                    <el-pagination v-show="total > 0" :total="total" v-model:current-page="queryParams.pageNum"
109
+                        v-model:page-size="queryParams.pageSize" :page-sizes="[10, 20, 50, 100]"
110
+                        layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange"
111
+                        @current-change="handlePageChange" style="margin-top: 16px; justify-content: flex-end;" />
127 112
                 </div>
128 113
                 <div class="warning-summary">
129 114
                     <div><i class="fas fa-circle" style="color:#ef4444;"></i> <strong>红色预警</strong> (综合评估 &lt; 75分) 共计
@@ -195,8 +180,8 @@ const coreRisksOrOutstandingAchievementsList = [
195 180
 
196 181
 const employeesData = ref([])
197 182
 const queryParams = reactive({
198
-  pageNum: 1,
199
-  pageSize: 10
183
+    pageNum: 1,
184
+    pageSize: 10
200 185
 })
201 186
 
202 187
 for (let i = 0; i < newNames.length; i++) {
@@ -213,25 +198,23 @@ for (let i = 0; i < newNames.length; i++) {
213 198
 const transformCascadeData = (nodes) => {
214 199
     if (!nodes) return []
215 200
     return nodes.map(node => {
216
-        const label = node.nickName || node.deptName || node.name || node.label
217 201
         const deptType = node.deptType || node.nodeType
218
-    //    console.log(node,"node")
219
-    //     let value
220
-    //     if (deptType === 'BRIGADE') {
221
-    //         value = String(node.deptId)
222
-    //     } else if (deptType === 'MANAGER') {
223
-    //         value = String(node.teamId)
224
-    //     } else if (deptType === 'TEAMS') {
225
-    //         value = String(node.groupId)
226
-    //     } else {
227
-    //         value = String(node.userId ?? node.id ?? node.deptId ?? '')
228
-    //     }
202
+        const label = deptType === 'user'
203
+            ? (node.nickName || node.label)
204
+            : (node.deptName || node.name || node.label)
205
+
206
+        let value;
207
+        if (deptType === 'STATION') value = `station_${node.id}`;
208
+        else if (deptType === 'BRIGADE') value = `dept_${node.id}`
209
+        else if (deptType === 'MANAGER') value = `team_${node.id}`
210
+        else if (deptType === 'TEAMS') value = `group_${node.id}`
211
+        else value = `user_${node.id}`
229 212
 
230 213
         const children = node.children && node.children.length > 0 ? transformCascadeData(node.children) : undefined
231 214
 
232 215
         return {
233 216
             label,
234
-            value:node.id,
217
+            value,
235 218
             deptType,
236 219
             children
237 220
         }
@@ -382,10 +365,12 @@ const fetchWarningData = async () => {
382 365
 
383 366
     const selectedInfo = getSelectedInfo(selectedOrg.value)
384 367
     if (selectedInfo) {
385
-        if (selectedInfo.deptType === 'BRIGADE') params.deptId = selectedInfo.value
386
-        else if (selectedInfo.deptType === 'MANAGER') params.teamId = selectedInfo.value
387
-        else if (selectedInfo.deptType === 'TEAMS') params.groupId = selectedInfo.value
388
-        else if (selectedInfo.deptType === 'user') params.userId = selectedInfo.value
368
+        const rawId = Number(selectedInfo.value.split('_')[1])
369
+
370
+        if (selectedInfo.deptType === 'BRIGADE') params.deptId = rawId
371
+        else if (selectedInfo.deptType === 'MANAGER') params.teamId = rawId
372
+        else if (selectedInfo.deptType === 'TEAMS') params.groupId = rawId
373
+        else if (selectedInfo.deptType === 'user') params.userId = rawId
389 374
     }
390 375
 
391 376
     try {
@@ -417,6 +402,7 @@ onMounted(async () => {
417 402
         const res = await getDeptUserTree()
418 403
         if (res.data) {
419 404
             cascadeOptions.value = transformCascadeData(res.data)
405
+            console.log(cascadeOptions.value, "cascadeOptions")
420 406
         }
421 407
     } catch (error) {
422 408
         console.error('获取组织架构数据失败:', error)
@@ -448,7 +434,7 @@ watch(selectedAlertLevel, () => {
448 434
 watch(() => route.query, (query) => {
449 435
     const { id } = query
450 436
     if (id) {
451
-        selectedOrg.value =Number(id)
437
+        selectedOrg.value = `user_${id}`
452 438
     } else {
453 439
         selectedOrg.value = ''
454 440
     }