Bladeren bron

feat(assistant): 优化组件显示逻辑和表格列名

1. 根据用户类型动态显示查获岗位分布和查获通道TOP5面板
2. 将表格列名从"科室"改为"主管"以更准确反映数据含义
3. 在qaAnalysis组件中处理新增的BRIGADE部门类型
4. 在dutyOrganization组件中增加用户资质能力展示和班组人员资质表格
huoyi 1 week geleden
bovenliggende
commit
9ebbae9070

+ 96 - 16
src/views/assistant/components/dutyOrganization.vue

@@ -37,7 +37,7 @@
37
         <div class="dept-cards">
37
         <div class="dept-cards">
38
           <template v-if="attendanceData && attendanceData.length > 0">
38
           <template v-if="attendanceData && attendanceData.length > 0">
39
             <div v-for="(item, index) in attendanceData.slice(0, 4)" :key="index" class="dept-card">
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
               <div class="dept-count"><span>{{ item.currentValue || 0 }}</span>人次</div>
41
               <div class="dept-count"><span>{{ item.currentValue || 0 }}</span>人次</div>
42
               <div class="dept-trend">
42
               <div class="dept-trend">
43
                 <div>
43
                 <div>
@@ -73,7 +73,7 @@
73
       </div>
73
       </div>
74
 
74
 
75
       <!-- 右侧:资质等级分布 -->
75
       <!-- 右侧:资质等级分布 -->
76
-      <div class="right-panel panel-item">
76
+      <div class="right-panel panel-item" v-show="!isUserType">
77
         <div class="panel-header">
77
         <div class="panel-header">
78
           <h3>资质等级分布</h3>
78
           <h3>资质等级分布</h3>
79
         </div>
79
         </div>
@@ -96,7 +96,7 @@
96
           </div>
96
           </div>
97
 
97
 
98
           <!-- 右侧:资质分布趋势 -->
98
           <!-- 右侧:资质分布趋势 -->
99
-          <div class="qualification-right">
99
+          <div class="qualification-right" v-show="isStationType">
100
             <!-- 上方描述卡片 -->
100
             <!-- 上方描述卡片 -->
101
             <div class="stat-card" v-if="qualificationPieDescriptionPart2">
101
             <div class="stat-card" v-if="qualificationPieDescriptionPart2">
102
               <div class="stat-content">
102
               <div class="stat-content">
@@ -109,6 +109,30 @@
109
               <div ref="barChartRef" class="echarts-chart"></div>
109
               <div ref="barChartRef" class="echarts-chart"></div>
110
             </div>
110
             </div>
111
           </div>
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
         </div>
136
         </div>
113
       </div>
137
       </div>
114
     </div>
138
     </div>
@@ -136,7 +160,8 @@ const props = defineProps({
136
     default: null
160
     default: null
137
   }
161
   }
138
 })
162
 })
139
-
163
+const user = ref({})
164
+const teamsQualificationData = ref([])
140
 // 饼图容器引用
165
 // 饼图容器引用
141
 const pieChartRef = ref(null)
166
 const pieChartRef = ref(null)
142
 const barChartRef = ref(null)
167
 const barChartRef = ref(null)
@@ -156,7 +181,25 @@ const qualificationBarData = ref({})
156
 const selectedDeptType = computed(() => {
181
 const selectedDeptType = computed(() => {
157
   return props.selectedDeptObject && props.selectedDeptObject?.deptType
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
 const qualificationPieDescriptionPart1 = computed(() => {
204
 const qualificationPieDescriptionPart1 = computed(() => {
162
   if (!qualificationPieData.value || !qualificationPieData.value.data || !Array.isArray(qualificationPieData.value.data)) {
205
   if (!qualificationPieData.value || !qualificationPieData.value.data || !Array.isArray(qualificationPieData.value.data)) {
@@ -287,18 +330,46 @@ const fetchDutyOrganizationData = async (queryParams) => {
287
     console.log('出勤人次趋势数据:', trendResponse)
330
     console.log('出勤人次趋势数据:', trendResponse)
288
     trendData.value = trendResponse || []
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
   } catch (error) {
374
   } catch (error) {
304
     console.error('获取勤务组织数据失败:', error)
375
     console.error('获取勤务组织数据失败:', error)
@@ -791,10 +862,10 @@ onUnmounted(() => {
791
 }
862
 }
792
 
863
 
793
 .section-title h2 {
864
 .section-title h2 {
794
-  font-size: 24px;
865
+  margin: 0;
866
+  font-size: 18px;
795
   font-weight: 600;
867
   font-weight: 600;
796
   color: #333;
868
   color: #333;
797
-  margin: 0;
798
 }
869
 }
799
 
870
 
800
 /* 横向布局内容区域 */
871
 /* 横向布局内容区域 */
@@ -822,6 +893,15 @@ onUnmounted(() => {
822
   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
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
 .panel-header {
905
 .panel-header {
826
   margin-bottom: 20px;
906
   margin-bottom: 20px;
827
   padding-bottom: 0;
907
   padding-bottom: 0;

+ 13 - 12
src/views/assistant/components/qaAnalysis.vue

@@ -119,7 +119,7 @@ const processQueryParams = (queryParams) => {
119
   // 根据部门类型添加相应的参数
119
   // 根据部门类型添加相应的参数
120
   const selectedDept = props.selectedDeptObject
120
   const selectedDept = props.selectedDeptObject
121
   const { deptType = "", id } = selectedDept ? selectedDept : { deptType: "", id: "" }
121
   const { deptType = "", id } = selectedDept ? selectedDept : { deptType: "", id: "" }
122
-  processedParams.scopeType = deptType === 'STATION' ? 'STATION' : deptType == 'DEPARTMENT' ? 'DEPT' : deptType == 'TEAMS' ? 'TEAM' : deptType == 'USER' ? 'USER' : ''
122
+  processedParams.scopeType = deptType === 'STATION' ? 'STATION' : deptType == 'BRIGADE' ? 'BRIGADE' : deptType == 'DEPARTMENT' ? 'DEPT' : deptType == 'TEAMS' ? 'TEAM' : deptType == 'USER' ? 'USER' : ''
123
   processedParams.scopeId = id
123
   processedParams.scopeId = id
124
   delete processedParams.deptId;
124
   delete processedParams.deptId;
125
   delete processedParams.teamId;
125
   delete processedParams.teamId;
@@ -218,7 +218,7 @@ const fetchCompletionTrendData = async () => {
218
     const processedParams = processQueryParams(props.queryForm)
218
     const processedParams = processQueryParams(props.queryForm)
219
     const response = await getCompletionTrend(processedParams);
219
     const response = await getCompletionTrend(processedParams);
220
     const { processedData, xAxisData } = processApiData(response);
220
     const { processedData, xAxisData } = processApiData(response);
221
-
221
+  
222
     let stationData = processedData.find(item => item.name === '全站')?.data || 0;
222
     let stationData = processedData.find(item => item.name === '全站')?.data || 0;
223
 
223
 
224
 
224
 
@@ -246,8 +246,8 @@ const fetchCompletionTrendData = async () => {
246
       }
246
       }
247
     }
247
     }
248
 
248
 
249
-    //计算同比
250
-    console.log('maxData', maxData)
249
+   
250
+
251
 
251
 
252
     // 安全获取数组元素,防止NaN
252
     // 安全获取数组元素,防止NaN
253
     const lastValue = stationData[stationData.length - 1] || 0;
253
     const lastValue = stationData[stationData.length - 1] || 0;
@@ -296,24 +296,25 @@ const fetchCompletionTrendData = async () => {
296
     let descriptionText = '';
296
     let descriptionText = '';
297
     let totalPerson = stationData[stationData.length - 1] || 0;
297
     let totalPerson = stationData[stationData.length - 1] || 0;
298
     if (maxData) {
298
     if (maxData) {
299
+      
299
       // 有其他科室数据时显示科室信息
300
       // 有其他科室数据时显示科室信息
300
       if (props.queryForm.dateRangeQueryType === 'YEAR') {
301
       if (props.queryForm.dateRangeQueryType === 'YEAR') {
301
-        const firstYearStr = isStationType.value ? `${selectedDeptName.value}共答题${totalPerson}人次,同比${tong}%,` : '';
302
-        const secondYearStr = isStationType.value ? `${maxData.name}共答题${maxData.data[maxData.data.length - 1]}人次,占比最高为${maxDataPercent}%。` : `${selectedDeptName.value}完成${maxDataLastValue}人次,同比${maxDataTong}%。`
302
+        const firstYearStr = isStationType.value ? `${maxData.name}共答题${totalPerson}人次,同比${tong}%,` : '';
303
+        const secondYearStr = isStationType.value ? `${maxData.name}共答题${maxData.data[maxData.data.length - 1]}人次,占比最高为${maxDataPercent}%。` : `${maxData.name}完成${maxDataLastValue}人次,同比${maxDataTong}%。`
303
         // 年查询:只显示同比,隐藏环比
304
         // 年查询:只显示同比,隐藏环比
304
         descriptionText = `${firstYearStr}${secondYearStr}`;
305
         descriptionText = `${firstYearStr}${secondYearStr}`;
305
       } else {
306
       } else {
306
-        const firstNotYearStr = isStationType.value ? `${selectedDeptName.value}共答题${totalPerson}人次,同比${tong}%,环比${huan}%,` : '';
307
-        const secondNotYearStr = isStationType.value ? `${maxData.name}共答题${maxData.data[maxData.data.length - 1]}人次,占比最高为${maxDataPercent}%。` : `${selectedDeptName.value}完成${maxDataLastValue}人次,同比${maxDataTong}%,环比${maxDataHuan}%。`
307
+        const firstNotYearStr = isStationType.value ? `${maxData.name}共答题${totalPerson}人次,同比${tong}%,环比${huan}%,` : '';
308
+        const secondNotYearStr = isStationType.value ? `${maxData.name}共答题${maxData.data[maxData.data.length - 1]}人次,占比最高为${maxDataPercent}%。` : `${maxData.name}完成${maxDataLastValue}人次,同比${maxDataTong}%,环比${maxDataHuan}%。`
308
         // 季度或月查询:显示同比和环比
309
         // 季度或月查询:显示同比和环比
309
         descriptionText = `${firstNotYearStr}${secondNotYearStr}`;
310
         descriptionText = `${firstNotYearStr}${secondNotYearStr}`;
310
       }
311
       }
311
     } else {
312
     } else {
312
       // 只有全站数据时显示简化的描述
313
       // 只有全站数据时显示简化的描述
313
       if (props.queryForm.dateRangeQueryType === 'YEAR') {
314
       if (props.queryForm.dateRangeQueryType === 'YEAR') {
314
-        descriptionText = `${selectedDeptName.value}共答题${totalPerson}人次,同比${tong}%。`;
315
+        descriptionText = `${maxData.name}共答题${totalPerson}人次,同比${tong}%。`;
315
       } else {
316
       } else {
316
-        descriptionText = `${selectedDeptName.value}共答题${totalPerson}人次,同比${tong}%,环比${huan}%。`;
317
+        descriptionText = `${maxData.name}共答题${totalPerson}人次,同比${tong}%,环比${huan}%。`;
317
       }
318
       }
318
     }
319
     }
319
 
320
 
@@ -538,7 +539,7 @@ const fetchWrongAnalysisRadarData = async () => {
538
     const radarData = processRadarData(response);
539
     const radarData = processRadarData(response);
539
     let max = calculateRadarMaxValue(radarData.series)
540
     let max = calculateRadarMaxValue(radarData.series)
540
     // console.log('fetchWrongAnalysisRadarData', radarData);
541
     // console.log('fetchWrongAnalysisRadarData', radarData);
541
-    // debugger
542
+
542
     const series = radarData.series.map(ele => {
543
     const series = radarData.series.map(ele => {
543
       if (ele.data.every(item => item === 0)) {
544
       if (ele.data.every(item => item === 0)) {
544
         return ''
545
         return ''
@@ -550,7 +551,7 @@ const fetchWrongAnalysisRadarData = async () => {
550
 
551
 
551
 
552
 
552
     // 设置描述卡片文本
553
     // 设置描述卡片文本
553
-    departmentComparisonDescription.value = `${series}${series.length > 0 ? ',' : '暂无问题'},可精准识别科室管理短板,分配质控资源。`
554
+    departmentComparisonDescription.value = `${series}${series.length > 0 ? ',' : '暂无问题'},可精准识别主管管理短板,分配质控资源。`
554
 
555
 
555
     // 更新各科错题分布对比雷达图
556
     // 更新各科错题分布对比雷达图
556
     setDepartmentComparisonOption({
557
     setDepartmentComparisonOption({

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

@@ -98,7 +98,7 @@
98
         </div>
98
         </div>
99
 
99
 
100
         <!-- 第五个:查获岗位分布 -->
100
         <!-- 第五个:查获岗位分布 -->
101
-        <div class="panel-item">
101
+        <div class="panel-item" v-show="!isUserType">
102
           <div class="panel-header">
102
           <div class="panel-header">
103
             <h3>查获岗位分布</h3>
103
             <h3>查获岗位分布</h3>
104
           </div>
104
           </div>
@@ -117,7 +117,7 @@
117
         </div>
117
         </div>
118
 
118
 
119
         <!-- 第六个:查获通道TOP5 -->
119
         <!-- 第六个:查获通道TOP5 -->
120
-        <div class="panel-item">
120
+        <div class="panel-item" v-show="!isUserType">
121
           <div class="panel-header">
121
           <div class="panel-header">
122
             <h3>查获通道TOP5</h3>
122
             <h3>查获通道TOP5</h3>
123
           </div>
123
           </div>
@@ -155,7 +155,7 @@
155
           <!-- 表格 -->
155
           <!-- 表格 -->
156
           <div class="table-container">
156
           <div class="table-container">
157
             <el-table :data="policeTransferData" size="small" height="250" :scroll="{ x: 'max-content' }">
157
             <el-table :data="policeTransferData" size="small" height="250" :scroll="{ x: 'max-content' }">
158
-              <el-table-column prop="departmentName" label="科室" min-width="120" />
158
+              <el-table-column prop="departmentName" label="主管" min-width="120" />
159
               <el-table-column prop="teamName" label="班组" min-width="120" />
159
               <el-table-column prop="teamName" label="班组" min-width="120" />
160
               <el-table-column prop="userName" label="姓名" min-width="100" />
160
               <el-table-column prop="userName" label="姓名" min-width="100" />
161
               <el-table-column prop="itemName" label="查获物品" min-width="150" />
161
               <el-table-column prop="itemName" label="查获物品" min-width="150" />
@@ -183,7 +183,7 @@
183
           <!-- 表格 -->
183
           <!-- 表格 -->
184
           <div class="table-container">
184
           <div class="table-container">
185
             <el-table :data="xrayMissData" size="small" height="250" :scroll="{ x: 'max-content' }">
185
             <el-table :data="xrayMissData" size="small" height="250" :scroll="{ x: 'max-content' }">
186
-              <el-table-column prop="departmentName" label="科室" min-width="120" />
186
+              <el-table-column prop="departmentName" label="主管" min-width="120" />
187
               <el-table-column prop="teamName" label="班组" min-width="120" />
187
               <el-table-column prop="teamName" label="班组" min-width="120" />
188
               <el-table-column prop="userName" label="姓名" min-width="100" />
188
               <el-table-column prop="userName" label="姓名" min-width="100" />
189
               <el-table-column prop="missItemName" label="漏检物品" min-width="150" />
189
               <el-table-column prop="missItemName" label="漏检物品" min-width="150" />
@@ -210,7 +210,7 @@
210
           <!-- 表格 -->
210
           <!-- 表格 -->
211
           <div class="table-container">
211
           <div class="table-container">
212
             <el-table :data="abnormalCaptureData" size="small" height="250" :scroll="{ x: 'max-content' }">
212
             <el-table :data="abnormalCaptureData" size="small" height="250" :scroll="{ x: 'max-content' }">
213
-              <el-table-column prop="departmentName" label="科室" min-width="120" />
213
+              <el-table-column prop="departmentName" label="主管" min-width="120" />
214
               <el-table-column prop="teamName" label="班组" min-width="120" />
214
               <el-table-column prop="teamName" label="班组" min-width="120" />
215
               <el-table-column prop="userName" label="姓名" min-width="100" />
215
               <el-table-column prop="userName" label="姓名" min-width="100" />
216
               <el-table-column prop="seizureQuantity" label="查获数量" align="center" width="100" />
216
               <el-table-column prop="seizureQuantity" label="查获数量" align="center" width="100" />