Просмотр исходного кода

feat(organProfile): 添加排名列表及前三名头像组件

- 创建 RankList 组件展示排名数据
- 实现前三名头像顺序调整及样式区分
- 支持自定义分数字段标签显示
- 使用 scoped 样式美化排名列表和头像显示
- 优化前三名展示布局,突出第一名样式
huoyi 1 день назад
Родитель
Сommit
fa7a6d67c1

+ 9 - 0
src/api/system/user.js

@@ -125,4 +125,13 @@ export function getPostAllList() {
125
     url: '/system/post/listAllTree',
125
     url: '/system/post/listAllTree',
126
     method: 'get',
126
     method: 'get',
127
   })
127
   })
128
+}
129
+
130
+//树状组织架构带职务
131
+export function getDeptUserTreePosition(params) {
132
+  return request({
133
+    url: '/system/user/deptAndUserTree',
134
+    method: 'get',
135
+    params: params
136
+  })
128
 }
137
 }

+ 84 - 0
src/pages/organProfile/components/rankList.vue

@@ -0,0 +1,84 @@
1
+<template>
2
+    <view class="rank-section">
3
+        <!-- 前三名头像:顺序为 第2名(左) 第1名(中) 第3名(右) -->
4
+        <view class="rank-avatars">
5
+            <view class="rank-avatar-item" v-for="(item, idx) in reorderedTop3" :key="idx"
6
+                :class="{ 'rank-first': item._rank === 1 }">
7
+                <view class="rank-avatar-wrapper" :class="'rank-pos-' + item._rank">
8
+                    <view class="rank-avatar-circle" :style="{ background: item.color }">
9
+                        <text>{{ item.name.slice(-2) }}</text>
10
+                    </view>
11
+                    <text class="rank-badge">{{ item._rank }}</text>
12
+                </view>
13
+                <text class="rank-name">{{ item.name }}</text>
14
+                <text class="rank-num">{{ item.num }}</text>
15
+            </view>
16
+        </view>
17
+        <!-- 排行列表 -->
18
+        <view class="rank-table">
19
+            <view class="rank-tr rank-th">
20
+                <text>排名</text><text>姓名</text><text>{{ scoreLabel }}</text>
21
+            </view>
22
+            <view class="rank-tr" v-for="(item, idx) in list" :key="idx">
23
+                <text>{{ idx + 1 }}</text><text>{{ item.name }}</text><text>{{ item.num }}</text>
24
+            </view>
25
+        </view>
26
+    </view>
27
+</template>
28
+
29
+<script>
30
+export default {
31
+    name: 'RankList',
32
+    props: {
33
+        top3: { type: Array, default: () => [] },
34
+        list: { type: Array, default: () => [] },
35
+        scoreLabel: { type: String, default: '问题数' }
36
+    },
37
+    computed: {
38
+        // 原始 top3: [0]=第1名, [1]=第2名, [2]=第3名
39
+        // 显示顺序: 第2名(左) 第1名(中) 第3名(右)
40
+        reorderedTop3() {
41
+            if (!this.top3 || this.top3.length < 3) return []
42
+            return [
43
+                { ...this.top3[1], _rank: 2 },
44
+                { ...this.top3[0], _rank: 1 },
45
+                { ...this.top3[2], _rank: 3 }
46
+            ]
47
+        }
48
+    }
49
+}
50
+</script>
51
+
52
+<style lang="scss" scoped>
53
+.rank-section { padding: 0 8rpx; }
54
+.rank-avatars { display: flex; justify-content: center; align-items: flex-end; gap: 40rpx; margin-bottom: 24rpx; }
55
+.rank-avatar-item { display: flex; flex-direction: column; align-items: center; gap: 8rpx; }
56
+.rank-avatar-item.rank-first { transform: translateY(-16rpx); }
57
+.rank-avatar-wrapper { position: relative; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; }
58
+.rank-avatar-wrapper.rank-pos-1 { border: 4rpx solid #fbbf24; }
59
+.rank-avatar-wrapper.rank-pos-2 { border: 4rpx solid #94a3b8; }
60
+.rank-avatar-wrapper.rank-pos-3 { border: 4rpx solid #fb923c; }
61
+.rank-avatar-circle {
62
+    width: 80rpx; height: 80rpx; border-radius: 50%;
63
+    display: flex; align-items: center; justify-content: center;
64
+}
65
+.rank-avatar-circle text { color: #fff; font-size: 26rpx; font-weight: bold; }
66
+.rank-badge {
67
+    position: absolute; bottom: -12rpx; left: 50%; transform: translateX(-50%);
68
+    width: 28rpx; height: 28rpx; border-radius: 50%;
69
+    display: flex; align-items: center; justify-content: center;
70
+    font-size: 20rpx; font-weight: bold; color: #fff;
71
+}
72
+.rank-pos-1 .rank-badge { background: #fbbf24; }
73
+.rank-pos-2 .rank-badge { background: #94a3b8; }
74
+.rank-pos-3 .rank-badge { background: #fb923c; }
75
+.rank-name { font-size: 24rpx; color: #475569; }
76
+.rank-num { font-size: 32rpx; color: #1e293b; font-weight: bold; }
77
+.rank-table { display: flex; flex-direction: column; }
78
+.rank-tr {
79
+    display: flex; padding: 12rpx 0; font-size: 24rpx; color: #64748b;
80
+    border-bottom: 1rpx solid #e2e8f0;
81
+}
82
+.rank-tr text { flex: 1; text-align: center; }
83
+.rank-th { color: #1e293b; font-weight: bold; border-bottom: 2rpx solid #cbd5e1; }
84
+</style>

+ 34 - 145
src/pages/organProfile/index.vue

@@ -4,7 +4,7 @@
4
             <!-- ====== 顶部统计卡片 ====== -->
4
             <!-- ====== 顶部统计卡片 ====== -->
5
             <view class="metric-row">
5
             <view class="metric-row">
6
                 <view class="metric-card" v-for="(m, i) in metricCards" :key="i" :style="{ background: m.bg }">
6
                 <view class="metric-card" v-for="(m, i) in metricCards" :key="i" :style="{ background: m.bg }">
7
-                    <text class="metric-title">{{ m.title }}</text>
7
+                    <text class="metric-title" :style="{ color: m.color }">{{ m.title }}</text>
8
                     <text class="metric-value" :style="{ color: m.color }">{{ m.value }}</text>
8
                     <text class="metric-value" :style="{ color: m.color }">{{ m.value }}</text>
9
                     <view class="metric-change-row" v-if="!m.side">
9
                     <view class="metric-change-row" v-if="!m.side">
10
                         <view class="metric-change-info">
10
                         <view class="metric-change-info">
@@ -19,97 +19,97 @@
19
             </view>
19
             </view>
20
 
20
 
21
             <!-- ====== 监察问题统计 ====== -->
21
             <!-- ====== 监察问题统计 ====== -->
22
-            <view class="chart-card">
22
+            <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
23
                 <view class="chart-title">监察问题统计</view>
23
                 <view class="chart-title">监察问题统计</view>
24
                 <view class="chart-box"><div ref="chartSuperviseTrend" class="chart-inner"></div></view>
24
                 <view class="chart-box"><div ref="chartSuperviseTrend" class="chart-inner"></div></view>
25
             </view>
25
             </view>
26
 
26
 
27
             <!-- ====== 问题类型分布 ====== -->
27
             <!-- ====== 问题类型分布 ====== -->
28
-            <view class="chart-card">
28
+            <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
29
                 <view class="chart-title">问题类型分布</view>
29
                 <view class="chart-title">问题类型分布</view>
30
                 <view class="chart-box"><div ref="chartIssueType" class="chart-inner"></div></view>
30
                 <view class="chart-box"><div ref="chartIssueType" class="chart-inner"></div></view>
31
             </view>
31
             </view>
32
 
32
 
33
             <!-- ====== 班组问题统计(监察) ====== -->
33
             <!-- ====== 班组问题统计(监察) ====== -->
34
-            <view class="chart-card">
34
+            <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
35
                 <view class="chart-title">班组问题统计(监察)</view>
35
                 <view class="chart-title">班组问题统计(监察)</view>
36
                 <view class="chart-box"><div ref="chartTeamSupervise" class="chart-inner"></div></view>
36
                 <view class="chart-box"><div ref="chartTeamSupervise" class="chart-inner"></div></view>
37
             </view>
37
             </view>
38
 
38
 
39
             <!-- ====== 区域问题占比(监察) ====== -->
39
             <!-- ====== 区域问题占比(监察) ====== -->
40
-            <view class="chart-card">
40
+            <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
41
                 <view class="chart-title">区域问题占比(监察)</view>
41
                 <view class="chart-title">区域问题占比(监察)</view>
42
                 <view class="chart-box"><div ref="chartRegionPie" class="chart-inner chart-pie"></div></view>
42
                 <view class="chart-box"><div ref="chartRegionPie" class="chart-inner chart-pie"></div></view>
43
             </view>
43
             </view>
44
 
44
 
45
             <!-- ====== 班组问题统计(实时) ====== -->
45
             <!-- ====== 班组问题统计(实时) ====== -->
46
-            <view class="chart-card">
46
+            <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
47
                 <view class="chart-title">班组问题统计(实时)</view>
47
                 <view class="chart-title">班组问题统计(实时)</view>
48
                 <view class="chart-box"><div ref="chartTeamQuality" class="chart-inner"></div></view>
48
                 <view class="chart-box"><div ref="chartTeamQuality" class="chart-inner"></div></view>
49
             </view>
49
             </view>
50
 
50
 
51
             <!-- ====== 实时质控拦截情况 ====== -->
51
             <!-- ====== 实时质控拦截情况 ====== -->
52
-            <view class="chart-card">
52
+            <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
53
                 <view class="chart-title">实时质控拦截情况</view>
53
                 <view class="chart-title">实时质控拦截情况</view>
54
                 <view class="chart-box"><div ref="chartIntercept" class="chart-inner"></div></view>
54
                 <view class="chart-box"><div ref="chartIntercept" class="chart-inner"></div></view>
55
             </view>
55
             </view>
56
 
56
 
57
             <!-- ====== 实时质控开机年龄分布 ====== -->
57
             <!-- ====== 实时质控开机年龄分布 ====== -->
58
-            <view class="chart-card">
58
+            <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
59
                 <view class="chart-title">实时质控开机年龄分布</view>
59
                 <view class="chart-title">实时质控开机年龄分布</view>
60
                 <view class="chart-box"><div ref="chartAgeDist" class="chart-inner"></div></view>
60
                 <view class="chart-box"><div ref="chartAgeDist" class="chart-inner"></div></view>
61
             </view>
61
             </view>
62
 
62
 
63
             <!-- ====== 实时质控围栏难易度 ====== -->
63
             <!-- ====== 实时质控围栏难易度 ====== -->
64
-            <view class="chart-card">
65
-                <view class="chart-title">实时质控围栏难易度</view>
64
+            <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
65
+                <view class="chart-title">实时质控图像难易度</view>
66
                 <view class="chart-box"><div ref="chartFence" class="chart-inner"></div></view>
66
                 <view class="chart-box"><div ref="chartFence" class="chart-inner"></div></view>
67
             </view>
67
             </view>
68
 
68
 
69
             <!-- ====== 实时质控开机年限分布 ====== -->
69
             <!-- ====== 实时质控开机年限分布 ====== -->
70
-            <view class="chart-card">
70
+            <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
71
                 <view class="chart-title">实时质控开机年限分布</view>
71
                 <view class="chart-title">实时质控开机年限分布</view>
72
                 <view class="chart-box"><div ref="chartYearLimit" class="chart-inner"></div></view>
72
                 <view class="chart-box"><div ref="chartYearLimit" class="chart-inner"></div></view>
73
             </view>
73
             </view>
74
 
74
 
75
             <!-- ====== 实时拦截物品汇总 ====== -->
75
             <!-- ====== 实时拦截物品汇总 ====== -->
76
-            <view class="chart-card">
76
+            <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
77
                 <view class="chart-title">实时拦截物品汇总</view>
77
                 <view class="chart-title">实时拦截物品汇总</view>
78
                 <view class="chart-box"><div ref="chartItems" class="chart-inner"></div></view>
78
                 <view class="chart-box"><div ref="chartItems" class="chart-inner"></div></view>
79
             </view>
79
             </view>
80
 
80
 
81
             <!-- ====== 服务巡查 ====== -->
81
             <!-- ====== 服务巡查 ====== -->
82
-            <view class="chart-card">
82
+            <view class="chart-card" :style="{ backgroundColor: '#E4EBFF' }">
83
                 <view class="chart-title">服务巡查</view>
83
                 <view class="chart-title">服务巡查</view>
84
                 <view class="chart-box"><div ref="chartServiceInspect" class="chart-inner"></div></view>
84
                 <view class="chart-box"><div ref="chartServiceInspect" class="chart-inner"></div></view>
85
             </view>
85
             </view>
86
 
86
 
87
             <!-- ====== 服务巡查趋势 ====== -->
87
             <!-- ====== 服务巡查趋势 ====== -->
88
-            <view class="chart-card">
88
+            <view class="chart-card" :style="{ backgroundColor: '#E4EBFF' }">
89
                 <view class="chart-title">服务巡查</view>
89
                 <view class="chart-title">服务巡查</view>
90
                 <view class="chart-box"><div ref="chartServiceLine" class="chart-inner"></div></view>
90
                 <view class="chart-box"><div ref="chartServiceLine" class="chart-inner"></div></view>
91
             </view>
91
             </view>
92
 
92
 
93
             <!-- ====== 投诉涉及班组情况 ====== -->
93
             <!-- ====== 投诉涉及班组情况 ====== -->
94
-            <view class="chart-card">
94
+            <view class="chart-card" :style="{ backgroundColor: '#F0ACA1' }">
95
                 <view class="chart-title">投诉涉及班组情况</view>
95
                 <view class="chart-title">投诉涉及班组情况</view>
96
                 <view class="chart-box"><div ref="chartComplaint" class="chart-inner"></div></view>
96
                 <view class="chart-box"><div ref="chartComplaint" class="chart-inner"></div></view>
97
             </view>
97
             </view>
98
 
98
 
99
             <!-- ====== 不安全事件发生对比 ====== -->
99
             <!-- ====== 不安全事件发生对比 ====== -->
100
-            <view class="chart-card">
100
+            <view class="chart-card" :style="{ backgroundColor: '#DCDCDF' }">
101
                 <view class="chart-title">不安全事件发生对比</view>
101
                 <view class="chart-title">不安全事件发生对比</view>
102
                 <view class="chart-box"><div ref="chartUnsafe" class="chart-inner"></div></view>
102
                 <view class="chart-box"><div ref="chartUnsafe" class="chart-inner"></div></view>
103
             </view>
103
             </view>
104
 
104
 
105
             <!-- ====== 亚健康人数占比 ====== -->
105
             <!-- ====== 亚健康人数占比 ====== -->
106
-            <view class="chart-card">
106
+            <view class="chart-card" :style="{ backgroundColor: '#FFDBA1' }">
107
                 <view class="chart-title">亚健康人数占比</view>
107
                 <view class="chart-title">亚健康人数占比</view>
108
                 <view class="chart-box"><div ref="chartSubHealthPie" class="chart-inner chart-pie"></div></view>
108
                 <view class="chart-box"><div ref="chartSubHealthPie" class="chart-inner chart-pie"></div></view>
109
             </view>
109
             </view>
110
 
110
 
111
             <!-- ====== 各班组健康与亚健康比例 ====== -->
111
             <!-- ====== 各班组健康与亚健康比例 ====== -->
112
-            <view class="chart-card">
112
+            <view class="chart-card" :style="{ backgroundColor: '#FFDBA1' }">
113
                 <view class="chart-title">各班组健康与亚健康比例</view>
113
                 <view class="chart-title">各班组健康与亚健康比例</view>
114
                 <view class="chart-box"><div ref="chartHealthStack" class="chart-inner"></div></view>
114
                 <view class="chart-box"><div ref="chartHealthStack" class="chart-inner"></div></view>
115
             </view>
115
             </view>
@@ -121,129 +121,47 @@
121
             </view>
121
             </view>
122
 
122
 
123
             <!-- ====== 监察问题(总)排行 ====== -->
123
             <!-- ====== 监察问题(总)排行 ====== -->
124
-            <view class="chart-card">
124
+            <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
125
                 <view class="chart-title">监察问题(总)</view>
125
                 <view class="chart-title">监察问题(总)</view>
126
-                <view class="rank-section">
127
-                    <view class="rank-avatars">
128
-                        <view class="rank-avatar-item" v-for="(item, idx) in superVisionTop3" :key="idx">
129
-                            <view class="rank-avatar-wrapper" :class="'rank-pos-' + (idx + 1)">
130
-                                <view class="rank-avatar-circle" :style="{ background: item.color }">
131
-                                    <text>{{ item.name.slice(-2) }}</text>
132
-                                </view>
133
-                                <text class="rank-badge">{{ idx + 1 }}</text>
134
-                            </view>
135
-                            <text class="rank-name">{{ item.name }}</text>
136
-                            <text class="rank-num">{{ item.num }}</text>
137
-                        </view>
138
-                    </view>
139
-                    <view class="rank-table">
140
-                        <view class="rank-tr rank-th">
141
-                            <text>排名</text><text>姓名</text><text>问题数</text>
142
-                        </view>
143
-                        <view class="rank-tr" v-for="(item, idx) in superVisionList" :key="idx">
144
-                            <text>{{ idx + 1 }}</text><text>{{ item.name }}</text><text>{{ item.num }}</text>
145
-                        </view>
146
-                    </view>
147
-                </view>
126
+                <RankList :top3="superVisionTop3" :list="superVisionList" scoreLabel="问题数" />
148
             </view>
127
             </view>
149
 
128
 
150
             <!-- ====== 实时漏洞检情况(总)排行 ====== -->
129
             <!-- ====== 实时漏洞检情况(总)排行 ====== -->
151
-            <view class="chart-card">
130
+            <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
152
                 <view class="chart-title">实时漏洞检情况(总)</view>
131
                 <view class="chart-title">实时漏洞检情况(总)</view>
153
-                <view class="rank-section">
154
-                    <view class="rank-avatars">
155
-                        <view class="rank-avatar-item" v-for="(item, idx) in vulnTop3" :key="idx">
156
-                            <view class="rank-avatar-wrapper" :class="'rank-pos-' + (idx + 1)">
157
-                                <view class="rank-avatar-circle" :style="{ background: item.color }">
158
-                                    <text>{{ item.name.slice(-2) }}</text>
159
-                                </view>
160
-                                <text class="rank-badge">{{ idx + 1 }}</text>
161
-                            </view>
162
-                            <text class="rank-name">{{ item.name }}</text>
163
-                            <text class="rank-num">{{ item.num }}</text>
164
-                        </view>
165
-                    </view>
166
-                    <view class="rank-table">
167
-                        <view class="rank-tr rank-th">
168
-                            <text>排名</text><text>姓名</text><text>问题数</text>
169
-                        </view>
170
-                        <view class="rank-tr" v-for="(item, idx) in vulnList" :key="idx">
171
-                            <text>{{ idx + 1 }}</text><text>{{ item.name }}</text><text>{{ item.num }}</text>
172
-                        </view>
173
-                    </view>
174
-                </view>
132
+                <RankList :top3="vulnTop3" :list="vulnList" scoreLabel="问题数" />
175
             </view>
133
             </view>
176
 
134
 
177
             <!-- ====== 航站楼加分排行 ====== -->
135
             <!-- ====== 航站楼加分排行 ====== -->
178
-            <view class="chart-card">
136
+            <view class="chart-card" :style="{ backgroundColor: '#E4EBFF' }">
179
                 <view class="chart-title">航站楼加分</view>
137
                 <view class="chart-title">航站楼加分</view>
180
-                <view class="rank-section">
181
-                    <view class="rank-avatars">
182
-                        <view class="rank-avatar-item" v-for="(item, idx) in bonusTop3" :key="idx">
183
-                            <view class="rank-avatar-wrapper" :class="'rank-pos-' + (idx + 1)">
184
-                                <view class="rank-avatar-circle" :style="{ background: item.color }">
185
-                                    <text>{{ item.name.slice(-2) }}</text>
186
-                                </view>
187
-                                <text class="rank-badge">{{ idx + 1 }}</text>
188
-                            </view>
189
-                            <text class="rank-name">{{ item.name }}</text>
190
-                            <text class="rank-num">{{ item.num }}</text>
191
-                        </view>
192
-                    </view>
193
-                    <view class="rank-table">
194
-                        <view class="rank-tr rank-th">
195
-                            <text>排名</text><text>姓名</text><text>加分</text>
196
-                        </view>
197
-                        <view class="rank-tr" v-for="(item, idx) in bonusList" :key="idx">
198
-                            <text>{{ idx + 1 }}</text><text>{{ item.name }}</text><text>{{ item.num }}</text>
199
-                        </view>
200
-                    </view>
201
-                </view>
138
+                <RankList :top3="bonusTop3" :list="bonusList" scoreLabel="加分" />
202
             </view>
139
             </view>
203
 
140
 
204
             <!-- ====== 查获数量排行 ====== -->
141
             <!-- ====== 查获数量排行 ====== -->
205
             <view class="chart-card">
142
             <view class="chart-card">
206
                 <view class="chart-title">查获数量</view>
143
                 <view class="chart-title">查获数量</view>
207
-                <view class="rank-section">
208
-                    <view class="rank-avatars">
209
-                        <view class="rank-avatar-item" v-for="(item, idx) in seizeTop3" :key="idx">
210
-                            <view class="rank-avatar-wrapper" :class="'rank-pos-' + (idx + 1)">
211
-                                <view class="rank-avatar-circle" :style="{ background: item.color }">
212
-                                    <text>{{ item.name.slice(-2) }}</text>
213
-                                </view>
214
-                                <text class="rank-badge">{{ idx + 1 }}</text>
215
-                            </view>
216
-                            <text class="rank-name">{{ item.name }}</text>
217
-                            <text class="rank-num">{{ item.num }}</text>
218
-                        </view>
219
-                    </view>
220
-                    <view class="rank-table">
221
-                        <view class="rank-tr rank-th">
222
-                            <text>排名</text><text>姓名</text><text>查获数</text>
223
-                        </view>
224
-                        <view class="rank-tr" v-for="(item, idx) in seizeList" :key="idx">
225
-                            <text>{{ idx + 1 }}</text><text>{{ item.name }}</text><text>{{ item.num }}</text>
226
-                        </view>
227
-                    </view>
228
-                </view>
144
+                <RankList :top3="seizeTop3" :list="seizeList" scoreLabel="查获数" />
229
             </view>
145
             </view>
230
         </scroll-view>
146
         </scroll-view>
231
     </view>
147
     </view>
232
 </template>
148
 </template>
233
 <script>
149
 <script>
234
 import * as echarts from 'echarts'
150
 import * as echarts from 'echarts'
151
+import RankList from './components/rankList.vue'
235
 export default {
152
 export default {
236
     name: 'OrganProfile',
153
     name: 'OrganProfile',
154
+    components: { RankList },
237
     data() {
155
     data() {
238
         return {
156
         return {
239
             metricCards: [
157
             metricCards: [
240
-                { title: '监察问题数(本月)', value: '11', change: '57.69%', changeType: 'down', changeColor: '#ef4444', color: '#f59e0b', bg: '#dbeafe', sparkColor: '#3b82f6', _sparkRef: null },
241
-                { title: '实时质控数(本月)', value: '21', change: '56.25%', changeType: 'down', changeColor: '#ef4444', color: '#22c55e', bg: '#dcfce7', sparkColor: '#22c55e', _sparkRef: null },
242
-                { title: '服务巡查(本月)', value: '4', change: '0%', changeType: 'flat', changeColor: '#6b7280', color: '#3b82f6', bg: '#dbeafe', sparkColor: '#3b82f6', _sparkRef: null },
243
-                { title: '投诉情况(本月)', value: '1', change: '88.89%', changeType: 'down', changeColor: '#ef4444', color: '#ef4444', bg: '#fce4ec', sparkColor: '#ef4444', _sparkRef: null },
158
+                { title: '监察问题数(本月)', value: '11', change: '57.69%', changeType: 'down', changeColor: '#ef4444', color: '#f59e0b', bg: '#FFF4E4', sparkColor: '#3b82f6', _sparkRef: null },
159
+                { title: '实时质控数(本月)', value: '21', change: '56.25%', changeType: 'down', changeColor: '#ef4444', color: '#22c55e', bg: '#E4F0E5', sparkColor: '#22c55e', _sparkRef: null },
160
+                { title: '服务巡查(本月)', value: '4', change: '0%', changeType: 'flat', changeColor: '#6b7280', color: '#3b82f6', bg: '#E6E8FF', sparkColor: '#3b82f6', _sparkRef: null },
161
+                { title: '投诉情况(本月)', value: '1', change: '88.89%', changeType: 'down', changeColor: '#ef4444', color: '#ef4444', bg: '#F0ACA1', sparkColor: '#ef4444', _sparkRef: null },
244
                 { title: '不安全事件发生次数(今年)', value: '3', change: '57.14%', changeType: 'down', changeColor: '#ef4444', color: '#ffffff', bg: '#6b7280', sparkColor: '#9ca3af', _sparkRef: null },
162
                 { title: '不安全事件发生次数(今年)', value: '3', change: '57.14%', changeType: 'down', changeColor: '#ef4444', color: '#ffffff', bg: '#6b7280', sparkColor: '#9ca3af', _sparkRef: null },
245
-                { title: '锐甲安语—自愿报告系统', value: '3', color: '#fff', bg: 'linear-gradient(135deg, #f59e0b, #d97706)', side: true },
246
-                { title: '部门亚健康人员', value: '147', color: '#fff', bg: 'linear-gradient(135deg, #fbbf24, #f59e0b)', side: true }
163
+                { title: '锐甲安语—自愿报告系统', value: '3', color: '#507AFC', bg: '#F2E5FF', side: true },
164
+                { title: '部门亚健康人员', value: '147', color: '#E41754', bg: '#FFDBA1', side: true }
247
             ],
165
             ],
248
             superVisionTop3: [
166
             superVisionTop3: [
249
                 { name: '徐皓迪', num: 7, color: '#3b82f6' },
167
                 { name: '徐皓迪', num: 7, color: '#3b82f6' },
@@ -657,34 +575,5 @@ export default {
657
 .chart-box { width: 100%; }
575
 .chart-box { width: 100%; }
658
 .chart-inner { width: 100%; height: 380rpx; }
576
 .chart-inner { width: 100%; height: 380rpx; }
659
 .chart-pie { height: 420rpx; }
577
 .chart-pie { height: 420rpx; }
660
-.rank-section { padding: 0 8rpx; }
661
-.rank-avatars { display: flex; justify-content: center; gap: 40rpx; margin-bottom: 24rpx; }
662
-.rank-avatar-item { display: flex; flex-direction: column; align-items: center; gap: 8rpx; }
663
-.rank-avatar-wrapper { position: relative; display: inline-flex; align-items: center; justify-content: center; border-radius: 50%; }
664
-.rank-avatar-wrapper.rank-pos-1 { border: 4rpx solid #94a3b8; }
665
-.rank-avatar-wrapper.rank-pos-2 { border: 4rpx solid #fbbf24; }
666
-.rank-avatar-wrapper.rank-pos-3 { border: 4rpx solid #fb923c; }
667
-.rank-avatar-circle {
668
-    width: 80rpx; height: 80rpx; border-radius: 50%;
669
-    display: flex; align-items: center; justify-content: center;
670
-}
671
-.rank-avatar-circle text { color: #fff; font-size: 26rpx; font-weight: bold; }
672
-.rank-badge {
673
-    position: absolute; bottom: -12rpx; left: 50%; transform: translateX(-50%);
674
-    width: 28rpx; height: 28rpx; border-radius: 50%;
675
-    display: flex; align-items: center; justify-content: center;
676
-    font-size: 20rpx; font-weight: bold; color: #fff;
677
-}
678
-.rank-pos-1 .rank-badge { background: #94a3b8; }
679
-.rank-pos-2 .rank-badge { background: #fbbf24; }
680
-.rank-pos-3 .rank-badge { background: #fb923c; }
681
-.rank-name { font-size: 24rpx; color: #475569; }
682
-.rank-num { font-size: 32rpx; color: #1e293b; font-weight: bold; }
683
-.rank-table { display: flex; flex-direction: column; }
684
-.rank-tr {
685
-    display: flex; padding: 12rpx 0; font-size: 24rpx; color: #64748b;
686
-    border-bottom: 1rpx solid #e2e8f0;
687
-}
688
-.rank-tr text { flex: 1; text-align: center; }
689
-.rank-th { color: #1e293b; font-weight: bold; border-bottom: 2rpx solid #cbd5e1; }
578
+
690
 </style>
579
 </style>

+ 4 - 4
src/pages/organizationStruct/index.vue

@@ -91,8 +91,8 @@
91
                         </view>
91
                         </view>
92
                     </view>
92
                     </view>
93
                     <view class="user-info">
93
                     <view class="user-info">
94
-                        <text class="user-name">{{ item.label  }}</text>
95
-                        <text v-if="item.postNames" class="user-post">{{ item.postNames }}</text>
94
+                        <text class="user-name">{{ item.label }}</text>
95
+                        <text v-if="item.roles" class="user-post">{{ item.roles }}</text>
96
                     </view>
96
                     </view>
97
                 </view>
97
                 </view>
98
 
98
 
@@ -111,7 +111,7 @@
111
 </template>
111
 </template>
112
 
112
 
113
 <script>
113
 <script>
114
-import { getDeptUserTree } from '@/api/system/user'
114
+import { getDeptUserTreePosition } from '@/api/system/user'
115
 
115
 
116
 export default {
116
 export default {
117
     name: 'OrganizationStruct',
117
     name: 'OrganizationStruct',
@@ -146,7 +146,7 @@ export default {
146
         async fetchTreeData() {
146
         async fetchTreeData() {
147
             this.loading = true
147
             this.loading = true
148
             try {
148
             try {
149
-                const res = await getDeptUserTree()
149
+                const res = await getDeptUserTreePosition()
150
                 this.treeData = res.data || []
150
                 this.treeData = res.data || []
151
                 this.currentNode = null
151
                 this.currentNode = null
152
                 this.breadcrumbs = []
152
                 this.breadcrumbs = []

+ 1 - 1
src/pages/profileManage/index.vue

@@ -20,7 +20,7 @@
20
 import HomeContainer from '@/components/HomeContainer.vue'
20
 import HomeContainer from '@/components/HomeContainer.vue'
21
 import { getAppList } from '@/api/system/user'
21
 import { getAppList } from '@/api/system/user'
22
 
22
 
23
-const profileAppNames = ['综合信息画像', '部门画像', '班组画像', '小组画像', '员工画像']
23
+const profileAppNames = ['全站综合信息', '部门画像', '班组画像', '小组画像', '员工画像']
24
 
24
 
25
 export default {
25
 export default {
26
   components: { HomeContainer },
26
   components: { HomeContainer },

+ 1 - 1
src/pages/work/index.vue

@@ -41,7 +41,7 @@
41
 import HomeContainer from "@/components/HomeContainer.vue";
41
 import HomeContainer from "@/components/HomeContainer.vue";
42
 import { checkRolePermission } from "@/utils/common.js";
42
 import { checkRolePermission } from "@/utils/common.js";
43
 import { getUserProfile, getAppListByRoleId,getAppList } from "@/api/system/user";
43
 import { getUserProfile, getAppListByRoleId,getAppList } from "@/api/system/user";
44
-const profileAppNames = ['综合信息画像', '部门画像', '班组画像', '小组画像', '员工画像']
44
+const profileAppNames = ['全站综合信息', '部门画像', '班组画像', '小组画像', '员工画像']
45
 export default {
45
 export default {
46
   components: { HomeContainer },
46
   components: { HomeContainer },
47
   data() {
47
   data() {