|
|
@@ -37,7 +37,7 @@
|
|
37
|
37
|
<div class="dept-cards">
|
|
38
|
38
|
<template v-if="attendanceData && attendanceData.length > 0">
|
|
39
|
39
|
<div v-for="(item, index) in attendanceData.slice(0, 4)" :key="index" class="dept-card">
|
|
40
|
|
- <div class="dept-name">{{ item.deptName || '未知科室' }}</div>
|
|
|
40
|
+ <div class="dept-name">{{ item.deptName || selectedDeptObject?.label }}</div>
|
|
41
|
41
|
<div class="dept-count"><span>{{ item.currentValue || 0 }}</span>人次</div>
|
|
42
|
42
|
<div class="dept-trend">
|
|
43
|
43
|
<div>
|
|
|
@@ -73,7 +73,7 @@
|
|
73
|
73
|
</div>
|
|
74
|
74
|
|
|
75
|
75
|
<!-- 右侧:资质等级分布 -->
|
|
76
|
|
- <div class="right-panel panel-item">
|
|
|
76
|
+ <div class="right-panel panel-item" v-show="!isUserType">
|
|
77
|
77
|
<div class="panel-header">
|
|
78
|
78
|
<h3>资质等级分布</h3>
|
|
79
|
79
|
</div>
|
|
|
@@ -96,7 +96,7 @@
|
|
96
|
96
|
</div>
|
|
97
|
97
|
|
|
98
|
98
|
<!-- 右侧:资质分布趋势 -->
|
|
99
|
|
- <div class="qualification-right">
|
|
|
99
|
+ <div class="qualification-right" v-show="isStationType">
|
|
100
|
100
|
<!-- 上方描述卡片 -->
|
|
101
|
101
|
<div class="stat-card" v-if="qualificationPieDescriptionPart2">
|
|
102
|
102
|
<div class="stat-content">
|
|
|
@@ -109,6 +109,30 @@
|
|
109
|
109
|
<div ref="barChartRef" class="echarts-chart"></div>
|
|
110
|
110
|
</div>
|
|
111
|
111
|
</div>
|
|
|
112
|
+
|
|
|
113
|
+ <div class="qualification-right" style="justify-content: center;" v-show="isTeamsType">
|
|
|
114
|
+ <!-- 班组人员资质等级表格 -->
|
|
|
115
|
+ <div class="table-container">
|
|
|
116
|
+ <el-table :data="teamsQualificationData" size="small" height="250" border :scroll="{ x: 'max-content' }"
|
|
|
117
|
+ stripe>
|
|
|
118
|
+ <el-table-column prop="deptName" label="姓名" align="center" />
|
|
|
119
|
+ <el-table-column prop="qualificationLevel" label="等级" align="center" />
|
|
|
120
|
+ </el-table>
|
|
|
121
|
+ </div>
|
|
|
122
|
+ </div>
|
|
|
123
|
+ </div>
|
|
|
124
|
+ </div>
|
|
|
125
|
+ <div class="right-panel-ability panel-item" v-show="isUserType">
|
|
|
126
|
+ <div class="panel-header">
|
|
|
127
|
+ <h3>资质能力</h3>
|
|
|
128
|
+ </div>
|
|
|
129
|
+
|
|
|
130
|
+ <!-- 统计卡片 -->
|
|
|
131
|
+ <div class="stat-card">
|
|
|
132
|
+ <div class="stat-content">资质等级:{{ user?.qualificationLevel || '未知' }}</div>
|
|
|
133
|
+ <div class="stat-content">可上岗岗位:{{user?.sysPostList && user?.sysPostList.map(item => item.postName).join('、')
|
|
|
134
|
+ || '未知'
|
|
|
135
|
+ }}</div>
|
|
112
|
136
|
</div>
|
|
113
|
137
|
</div>
|
|
114
|
138
|
</div>
|
|
|
@@ -136,7 +160,8 @@ const props = defineProps({
|
|
136
|
160
|
default: null
|
|
137
|
161
|
}
|
|
138
|
162
|
})
|
|
139
|
|
-
|
|
|
163
|
+const user = ref({})
|
|
|
164
|
+const teamsQualificationData = ref([])
|
|
140
|
165
|
// 饼图容器引用
|
|
141
|
166
|
const pieChartRef = ref(null)
|
|
142
|
167
|
const barChartRef = ref(null)
|
|
|
@@ -156,7 +181,25 @@ const qualificationBarData = ref({})
|
|
156
|
181
|
const selectedDeptType = computed(() => {
|
|
157
|
182
|
return props.selectedDeptObject && props.selectedDeptObject?.deptType
|
|
158
|
183
|
})
|
|
|
184
|
+// 计算属性:检查是否为STATION类型
|
|
|
185
|
+const isStationType = computed(() => {
|
|
|
186
|
+ console.log('selectedDeptType.value', selectedDeptType.value)
|
|
159
|
187
|
|
|
|
188
|
+ return selectedDeptType.value === 'STATION' || !selectedDeptType.value
|
|
|
189
|
+})
|
|
|
190
|
+const isDepartmentType = computed(() => {
|
|
|
191
|
+ return selectedDeptType.value === 'DEPARTMENT'
|
|
|
192
|
+})
|
|
|
193
|
+const isTeamsType = computed(() => {
|
|
|
194
|
+ return selectedDeptType.value === 'TEAMS'
|
|
|
195
|
+})
|
|
|
196
|
+const isUserType = computed(() => {
|
|
|
197
|
+ return selectedDeptType.value === 'USER'
|
|
|
198
|
+})
|
|
|
199
|
+// 计算属性:检查是否为非STATION类型
|
|
|
200
|
+const isNotUserType = computed(() => {
|
|
|
201
|
+ return !selectedDeptType.value !== 'USER'
|
|
|
202
|
+})
|
|
160
|
203
|
// 计算属性:动态生成资质等级分布描述第一部分(句号前)
|
|
161
|
204
|
const qualificationPieDescriptionPart1 = computed(() => {
|
|
162
|
205
|
if (!qualificationPieData.value || !qualificationPieData.value.data || !Array.isArray(qualificationPieData.value.data)) {
|
|
|
@@ -287,18 +330,46 @@ const fetchDutyOrganizationData = async (queryParams) => {
|
|
287
|
330
|
console.log('出勤人次趋势数据:', trendResponse)
|
|
288
|
331
|
trendData.value = trendResponse || []
|
|
289
|
332
|
|
|
290
|
|
- // 获取资质等级分布饼图数据
|
|
291
|
|
- const pieResponse = await getQualificationPieChart({ ...processedParams, ...calculateParams })
|
|
292
|
|
- console.log('资质等级分布饼图数据:', pieResponse)
|
|
293
|
|
- qualificationPieData.value = pieResponse.data || []
|
|
|
333
|
+ // 获取资质等级分布饼图数据(如果部门类型不是STATION)
|
|
|
334
|
+ if (isNotUserType.value) {
|
|
|
335
|
+ const pieResponse = await getQualificationPieChart({ ...processedParams, ...calculateParams })
|
|
|
336
|
+ console.log('资质等级分布饼图数据:', pieResponse)
|
|
|
337
|
+ qualificationPieData.value = pieResponse.data || []
|
|
|
338
|
+ } else {
|
|
|
339
|
+ qualificationPieData.value = []
|
|
|
340
|
+ }
|
|
|
341
|
+
|
|
|
342
|
+ if (isStationType.value) {
|
|
|
343
|
+ //获取资质等级分布柱状图数据
|
|
|
344
|
+ const barResponse = await getQualificationBarChart({ ...processedParams, ...calculateParams })
|
|
|
345
|
+
|
|
|
346
|
+ qualificationBarData.value = barResponse.data?.brigades || []
|
|
|
347
|
+
|
|
|
348
|
+ } else if (isTeamsType.value) {
|
|
294
|
349
|
|
|
295
|
|
- // 获取资质等级分布柱状图数据
|
|
296
|
|
- const barResponse = await getQualificationBarChart({ ...processedParams, ...calculateParams })
|
|
297
|
|
- console.log('资质等级分布柱状图数据:', barResponse)
|
|
298
|
|
- qualificationBarData.value = barResponse.data?.brigades || []
|
|
|
350
|
+ // 获取资质等级分布柱状图数据
|
|
|
351
|
+ const barResponse = await getQualificationBarChart({ ...processedParams, ...calculateParams })
|
|
|
352
|
+ console.log('资质等级分布柱状图数据:', barResponse.data?.brigades)
|
|
299
|
353
|
|
|
300
|
|
- // 更新图表和统计信息
|
|
301
|
|
- updateChartsWithData()
|
|
|
354
|
+ // 处理班组人员资质等级数据
|
|
|
355
|
+ if (barResponse.data?.brigades && Array.isArray(barResponse.data.brigades)) {
|
|
|
356
|
+ teamsQualificationData.value = barResponse.data.brigades
|
|
|
357
|
+ } else {
|
|
|
358
|
+ teamsQualificationData.value = []
|
|
|
359
|
+ }
|
|
|
360
|
+
|
|
|
361
|
+ } else if (isUserType.value) {
|
|
|
362
|
+ // 获取资质等级分布柱状图数据
|
|
|
363
|
+ const barResponse = await getQualificationBarChart({ ...processedParams, ...calculateParams })
|
|
|
364
|
+ console.log('资质等级分布柱状图数据:', barResponse.data.brigades)
|
|
|
365
|
+ user.value = barResponse?.data?.brigades[0]
|
|
|
366
|
+
|
|
|
367
|
+ }
|
|
|
368
|
+
|
|
|
369
|
+ setTimeout(() => {
|
|
|
370
|
+ // 更新图表和统计信息
|
|
|
371
|
+ updateChartsWithData()
|
|
|
372
|
+ }, 0);
|
|
302
|
373
|
|
|
303
|
374
|
} catch (error) {
|
|
304
|
375
|
console.error('获取勤务组织数据失败:', error)
|
|
|
@@ -791,10 +862,10 @@ onUnmounted(() => {
|
|
791
|
862
|
}
|
|
792
|
863
|
|
|
793
|
864
|
.section-title h2 {
|
|
794
|
|
- font-size: 24px;
|
|
|
865
|
+ margin: 0;
|
|
|
866
|
+ font-size: 18px;
|
|
795
|
867
|
font-weight: 600;
|
|
796
|
868
|
color: #333;
|
|
797
|
|
- margin: 0;
|
|
798
|
869
|
}
|
|
799
|
870
|
|
|
800
|
871
|
/* 横向布局内容区域 */
|
|
|
@@ -822,6 +893,15 @@ onUnmounted(() => {
|
|
822
|
893
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
823
|
894
|
}
|
|
824
|
895
|
|
|
|
896
|
+.right-panel-ability {
|
|
|
897
|
+ flex: 1 1 30%;
|
|
|
898
|
+ min-width: 400px;
|
|
|
899
|
+ background: white;
|
|
|
900
|
+ border-radius: 8px;
|
|
|
901
|
+ padding: 20px;
|
|
|
902
|
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
|
903
|
+}
|
|
|
904
|
+
|
|
825
|
905
|
.panel-header {
|
|
826
|
906
|
margin-bottom: 20px;
|
|
827
|
907
|
padding-bottom: 0;
|