|
|
@@ -4,7 +4,7 @@
|
|
4
|
4
|
<!-- ====== 顶部统计卡片 ====== -->
|
|
5
|
5
|
<view class="metric-row">
|
|
6
|
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
|
8
|
<text class="metric-value" :style="{ color: m.color }">{{ m.value }}</text>
|
|
9
|
9
|
<view class="metric-change-row" v-if="!m.side">
|
|
10
|
10
|
<view class="metric-change-info">
|
|
|
@@ -19,97 +19,97 @@
|
|
19
|
19
|
</view>
|
|
20
|
20
|
|
|
21
|
21
|
<!-- ====== 监察问题统计 ====== -->
|
|
22
|
|
- <view class="chart-card">
|
|
|
22
|
+ <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
|
|
23
|
23
|
<view class="chart-title">监察问题统计</view>
|
|
24
|
24
|
<view class="chart-box"><div ref="chartSuperviseTrend" class="chart-inner"></div></view>
|
|
25
|
25
|
</view>
|
|
26
|
26
|
|
|
27
|
27
|
<!-- ====== 问题类型分布 ====== -->
|
|
28
|
|
- <view class="chart-card">
|
|
|
28
|
+ <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
|
|
29
|
29
|
<view class="chart-title">问题类型分布</view>
|
|
30
|
30
|
<view class="chart-box"><div ref="chartIssueType" class="chart-inner"></div></view>
|
|
31
|
31
|
</view>
|
|
32
|
32
|
|
|
33
|
33
|
<!-- ====== 班组问题统计(监察) ====== -->
|
|
34
|
|
- <view class="chart-card">
|
|
|
34
|
+ <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
|
|
35
|
35
|
<view class="chart-title">班组问题统计(监察)</view>
|
|
36
|
36
|
<view class="chart-box"><div ref="chartTeamSupervise" class="chart-inner"></div></view>
|
|
37
|
37
|
</view>
|
|
38
|
38
|
|
|
39
|
39
|
<!-- ====== 区域问题占比(监察) ====== -->
|
|
40
|
|
- <view class="chart-card">
|
|
|
40
|
+ <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
|
|
41
|
41
|
<view class="chart-title">区域问题占比(监察)</view>
|
|
42
|
42
|
<view class="chart-box"><div ref="chartRegionPie" class="chart-inner chart-pie"></div></view>
|
|
43
|
43
|
</view>
|
|
44
|
44
|
|
|
45
|
45
|
<!-- ====== 班组问题统计(实时) ====== -->
|
|
46
|
|
- <view class="chart-card">
|
|
|
46
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
|
|
47
|
47
|
<view class="chart-title">班组问题统计(实时)</view>
|
|
48
|
48
|
<view class="chart-box"><div ref="chartTeamQuality" class="chart-inner"></div></view>
|
|
49
|
49
|
</view>
|
|
50
|
50
|
|
|
51
|
51
|
<!-- ====== 实时质控拦截情况 ====== -->
|
|
52
|
|
- <view class="chart-card">
|
|
|
52
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
|
|
53
|
53
|
<view class="chart-title">实时质控拦截情况</view>
|
|
54
|
54
|
<view class="chart-box"><div ref="chartIntercept" class="chart-inner"></div></view>
|
|
55
|
55
|
</view>
|
|
56
|
56
|
|
|
57
|
57
|
<!-- ====== 实时质控开机年龄分布 ====== -->
|
|
58
|
|
- <view class="chart-card">
|
|
|
58
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
|
|
59
|
59
|
<view class="chart-title">实时质控开机年龄分布</view>
|
|
60
|
60
|
<view class="chart-box"><div ref="chartAgeDist" class="chart-inner"></div></view>
|
|
61
|
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
|
66
|
<view class="chart-box"><div ref="chartFence" class="chart-inner"></div></view>
|
|
67
|
67
|
</view>
|
|
68
|
68
|
|
|
69
|
69
|
<!-- ====== 实时质控开机年限分布 ====== -->
|
|
70
|
|
- <view class="chart-card">
|
|
|
70
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
|
|
71
|
71
|
<view class="chart-title">实时质控开机年限分布</view>
|
|
72
|
72
|
<view class="chart-box"><div ref="chartYearLimit" class="chart-inner"></div></view>
|
|
73
|
73
|
</view>
|
|
74
|
74
|
|
|
75
|
75
|
<!-- ====== 实时拦截物品汇总 ====== -->
|
|
76
|
|
- <view class="chart-card">
|
|
|
76
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
|
|
77
|
77
|
<view class="chart-title">实时拦截物品汇总</view>
|
|
78
|
78
|
<view class="chart-box"><div ref="chartItems" class="chart-inner"></div></view>
|
|
79
|
79
|
</view>
|
|
80
|
80
|
|
|
81
|
81
|
<!-- ====== 服务巡查 ====== -->
|
|
82
|
|
- <view class="chart-card">
|
|
|
82
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4EBFF' }">
|
|
83
|
83
|
<view class="chart-title">服务巡查</view>
|
|
84
|
84
|
<view class="chart-box"><div ref="chartServiceInspect" class="chart-inner"></div></view>
|
|
85
|
85
|
</view>
|
|
86
|
86
|
|
|
87
|
87
|
<!-- ====== 服务巡查趋势 ====== -->
|
|
88
|
|
- <view class="chart-card">
|
|
|
88
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4EBFF' }">
|
|
89
|
89
|
<view class="chart-title">服务巡查</view>
|
|
90
|
90
|
<view class="chart-box"><div ref="chartServiceLine" class="chart-inner"></div></view>
|
|
91
|
91
|
</view>
|
|
92
|
92
|
|
|
93
|
93
|
<!-- ====== 投诉涉及班组情况 ====== -->
|
|
94
|
|
- <view class="chart-card">
|
|
|
94
|
+ <view class="chart-card" :style="{ backgroundColor: '#F0ACA1' }">
|
|
95
|
95
|
<view class="chart-title">投诉涉及班组情况</view>
|
|
96
|
96
|
<view class="chart-box"><div ref="chartComplaint" class="chart-inner"></div></view>
|
|
97
|
97
|
</view>
|
|
98
|
98
|
|
|
99
|
99
|
<!-- ====== 不安全事件发生对比 ====== -->
|
|
100
|
|
- <view class="chart-card">
|
|
|
100
|
+ <view class="chart-card" :style="{ backgroundColor: '#DCDCDF' }">
|
|
101
|
101
|
<view class="chart-title">不安全事件发生对比</view>
|
|
102
|
102
|
<view class="chart-box"><div ref="chartUnsafe" class="chart-inner"></div></view>
|
|
103
|
103
|
</view>
|
|
104
|
104
|
|
|
105
|
105
|
<!-- ====== 亚健康人数占比 ====== -->
|
|
106
|
|
- <view class="chart-card">
|
|
|
106
|
+ <view class="chart-card" :style="{ backgroundColor: '#FFDBA1' }">
|
|
107
|
107
|
<view class="chart-title">亚健康人数占比</view>
|
|
108
|
108
|
<view class="chart-box"><div ref="chartSubHealthPie" class="chart-inner chart-pie"></div></view>
|
|
109
|
109
|
</view>
|
|
110
|
110
|
|
|
111
|
111
|
<!-- ====== 各班组健康与亚健康比例 ====== -->
|
|
112
|
|
- <view class="chart-card">
|
|
|
112
|
+ <view class="chart-card" :style="{ backgroundColor: '#FFDBA1' }">
|
|
113
|
113
|
<view class="chart-title">各班组健康与亚健康比例</view>
|
|
114
|
114
|
<view class="chart-box"><div ref="chartHealthStack" class="chart-inner"></div></view>
|
|
115
|
115
|
</view>
|
|
|
@@ -121,129 +121,47 @@
|
|
121
|
121
|
</view>
|
|
122
|
122
|
|
|
123
|
123
|
<!-- ====== 监察问题(总)排行 ====== -->
|
|
124
|
|
- <view class="chart-card">
|
|
|
124
|
+ <view class="chart-card" :style="{ backgroundColor: '#FFF4E4' }">
|
|
125
|
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
|
127
|
</view>
|
|
149
|
128
|
|
|
150
|
129
|
<!-- ====== 实时漏洞检情况(总)排行 ====== -->
|
|
151
|
|
- <view class="chart-card">
|
|
|
130
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4F0E5' }">
|
|
152
|
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
|
133
|
</view>
|
|
176
|
134
|
|
|
177
|
135
|
<!-- ====== 航站楼加分排行 ====== -->
|
|
178
|
|
- <view class="chart-card">
|
|
|
136
|
+ <view class="chart-card" :style="{ backgroundColor: '#E4EBFF' }">
|
|
179
|
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
|
139
|
</view>
|
|
203
|
140
|
|
|
204
|
141
|
<!-- ====== 查获数量排行 ====== -->
|
|
205
|
142
|
<view class="chart-card">
|
|
206
|
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
|
145
|
</view>
|
|
230
|
146
|
</scroll-view>
|
|
231
|
147
|
</view>
|
|
232
|
148
|
</template>
|
|
233
|
149
|
<script>
|
|
234
|
150
|
import * as echarts from 'echarts'
|
|
|
151
|
+import RankList from './components/rankList.vue'
|
|
235
|
152
|
export default {
|
|
236
|
153
|
name: 'OrganProfile',
|
|
|
154
|
+ components: { RankList },
|
|
237
|
155
|
data() {
|
|
238
|
156
|
return {
|
|
239
|
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
|
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
|
166
|
superVisionTop3: [
|
|
249
|
167
|
{ name: '徐皓迪', num: 7, color: '#3b82f6' },
|
|
|
@@ -657,34 +575,5 @@ export default {
|
|
657
|
575
|
.chart-box { width: 100%; }
|
|
658
|
576
|
.chart-inner { width: 100%; height: 380rpx; }
|
|
659
|
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
|
579
|
</style>
|