Преглед на файлове

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

1. 根据用户类型动态显示查获岗位分布和查获通道TOP5面板
2. 将表格列名从"科室"改为"主管"以更准确反映数据含义
3. 在qaAnalysis组件中处理新增的BRIGADE部门类型
4. 在dutyOrganization组件中增加用户资质能力展示和班组人员资质表格
huoyi преди 1 седмица
родител
ревизия
9ebbae9070
променени са 3 файла, в които са добавени 114 реда и са изтрити 33 реда
  1. 96 16
      src/views/assistant/components/dutyOrganization.vue
  2. 13 12
      src/views/assistant/components/qaAnalysis.vue
  3. 5 5
      src/views/assistant/components/riskHazard.vue

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

@@ -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;

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

@@ -119,7 +119,7 @@ const processQueryParams = (queryParams) => {
119 119
   // 根据部门类型添加相应的参数
120 120
   const selectedDept = props.selectedDeptObject
121 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 123
   processedParams.scopeId = id
124 124
   delete processedParams.deptId;
125 125
   delete processedParams.teamId;
@@ -218,7 +218,7 @@ const fetchCompletionTrendData = async () => {
218 218
     const processedParams = processQueryParams(props.queryForm)
219 219
     const response = await getCompletionTrend(processedParams);
220 220
     const { processedData, xAxisData } = processApiData(response);
221
-
221
+  
222 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 252
     // 安全获取数组元素,防止NaN
253 253
     const lastValue = stationData[stationData.length - 1] || 0;
@@ -296,24 +296,25 @@ const fetchCompletionTrendData = async () => {
296 296
     let descriptionText = '';
297 297
     let totalPerson = stationData[stationData.length - 1] || 0;
298 298
     if (maxData) {
299
+      
299 300
       // 有其他科室数据时显示科室信息
300 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 305
         descriptionText = `${firstYearStr}${secondYearStr}`;
305 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 310
         descriptionText = `${firstNotYearStr}${secondNotYearStr}`;
310 311
       }
311 312
     } else {
312 313
       // 只有全站数据时显示简化的描述
313 314
       if (props.queryForm.dateRangeQueryType === 'YEAR') {
314
-        descriptionText = `${selectedDeptName.value}共答题${totalPerson}人次,同比${tong}%。`;
315
+        descriptionText = `${maxData.name}共答题${totalPerson}人次,同比${tong}%。`;
315 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 539
     const radarData = processRadarData(response);
539 540
     let max = calculateRadarMaxValue(radarData.series)
540 541
     // console.log('fetchWrongAnalysisRadarData', radarData);
541
-    // debugger
542
+
542 543
     const series = radarData.series.map(ele => {
543 544
       if (ele.data.every(item => item === 0)) {
544 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 557
     setDepartmentComparisonOption({

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

@@ -98,7 +98,7 @@
98 98
         </div>
99 99
 
100 100
         <!-- 第五个:查获岗位分布 -->
101
-        <div class="panel-item">
101
+        <div class="panel-item" v-show="!isUserType">
102 102
           <div class="panel-header">
103 103
             <h3>查获岗位分布</h3>
104 104
           </div>
@@ -117,7 +117,7 @@
117 117
         </div>
118 118
 
119 119
         <!-- 第六个:查获通道TOP5 -->
120
-        <div class="panel-item">
120
+        <div class="panel-item" v-show="!isUserType">
121 121
           <div class="panel-header">
122 122
             <h3>查获通道TOP5</h3>
123 123
           </div>
@@ -155,7 +155,7 @@
155 155
           <!-- 表格 -->
156 156
           <div class="table-container">
157 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 159
               <el-table-column prop="teamName" label="班组" min-width="120" />
160 160
               <el-table-column prop="userName" label="姓名" min-width="100" />
161 161
               <el-table-column prop="itemName" label="查获物品" min-width="150" />
@@ -183,7 +183,7 @@
183 183
           <!-- 表格 -->
184 184
           <div class="table-container">
185 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 187
               <el-table-column prop="teamName" label="班组" min-width="120" />
188 188
               <el-table-column prop="userName" label="姓名" min-width="100" />
189 189
               <el-table-column prop="missItemName" label="漏检物品" min-width="150" />
@@ -210,7 +210,7 @@
210 210
           <!-- 表格 -->
211 211
           <div class="table-container">
212 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 214
               <el-table-column prop="teamName" label="班组" min-width="120" />
215 215
               <el-table-column prop="userName" label="姓名" min-width="100" />
216 216
               <el-table-column prop="seizureQuantity" label="查获数量" align="center" width="100" />