Przeglądaj źródła

refactor(数据大屏): 将科室相关术语统一改为大队

更新前端组件和逻辑,将原“科室”相关术语统一修改为“大队”,包括界面显示、变量命名和数据处理逻辑
huoyi 1 miesiąc temu
rodzic
commit
adb1538826

+ 10 - 7
src/store/modules/user.js

@@ -15,7 +15,8 @@ const useUserStore = defineStore(
15 15
       nickName: '',
16 16
       avatar: '',
17 17
       roles: [],
18
-      permissions: []
18
+      permissions: [],
19
+      userInfo: {},
19 20
     }),
20 21
     actions: {
21 22
       // 登录
@@ -53,17 +54,18 @@ const useUserStore = defineStore(
53 54
             this.name = user.userName
54 55
             this.nickName = user.nickName
55 56
             this.avatar = avatar
57
+            this.userInfo = res.userInfo
56 58
             /* 初始密码提示 */
57
-            if(res.isDefaultModifyPwd) {
58
-              ElMessageBox.confirm('您的密码还是初始密码,请修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
59
+            if (res.isDefaultModifyPwd) {
60
+              ElMessageBox.confirm('您的密码还是初始密码,请修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
59 61
                 router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
60
-              }).catch(() => {})
62
+              }).catch(() => { })
61 63
             }
62 64
             /* 过期密码提示 */
63
-            if(!res.isDefaultModifyPwd && res.isPasswordExpired) {
64
-              ElMessageBox.confirm('您的密码已过期,请尽快修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
65
+            if (!res.isDefaultModifyPwd && res.isPasswordExpired) {
66
+              ElMessageBox.confirm('您的密码已过期,请尽快修改密码!', '安全提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
65 67
                 router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
66
-              }).catch(() => {})
68
+              }).catch(() => { })
67 69
             }
68 70
             resolve(res)
69 71
           }).catch(error => {
@@ -78,6 +80,7 @@ const useUserStore = defineStore(
78 80
             this.token = ''
79 81
             this.roles = []
80 82
             this.permissions = []
83
+            this.userInfo = {}
81 84
             removeToken()
82 85
             resolve()
83 86
           }).catch(error => {

+ 1 - 1
src/views/dataBigScreen/dashboard/SeizedRanking.vue

@@ -3,7 +3,7 @@
3 3
     <template #right-menu>
4 4
       <div class="dashboard-right-menu">
5 5
         <span :class="{ active: currentType === 1 }" @click="handleClick(1)">
6
-          按科室
6
+          按大队
7 7
         </span>
8 8
         <span :class="{ active: currentType === 2 }" @click="handleClick(2)">
9 9
           按班组

+ 2 - 2
src/views/dataBigScreen/dashboard/components/pageItems/DepartmentInfo.vue

@@ -4,7 +4,7 @@
4 4
       <el-table v-auto-scroll :data="tableData" border style="width: 100%" height="100%">
5 5
         <el-table-column v-if="type === 'team'" prop="name" label="姓名" min-width="80" />
6 6
         <el-table-column v-if="type === 'department'" prop="name" label="班组" min-width="80" />
7
-        <el-table-column v-if="type === 'station'" label="科室" prop="name"  min-width="80" />
7
+        <el-table-column v-if="type === 'station'" label="大队" prop="name"  min-width="80" />
8 8
         <el-table-column prop="qualificationLevel" label="资质等级" v-if="type === 'team'">
9 9
           <template #default="scope">
10 10
             {{ getLabel(scope.row.qualificationLevel) }}
@@ -39,7 +39,7 @@ const title = computed(() => {
39 39
   } else if (props.type === 'department') {
40 40
     return '班组明细'
41 41
   } else {
42
-    return '科室明细'
42
+    return '大队明细'
43 43
   }
44 44
 })
45 45
 

+ 20 - 34
src/views/dataBigScreen/dashboard/components/pageItems/HomePageOverview.vue

@@ -292,48 +292,34 @@ const fetchDepartments = async () => {
292 292
   try {
293 293
     const res = await getDeptUserTree()
294 294
     departments.value = res.data
295
-
296
-    // 数据加载完成后,设置第一个选择项的默认值为100
295
+     
296
+    // 数据加载完成后,查找deptType为BRIGADE的对象
297 297
     if (res.data && res.data.length > 0) {
298
-      // 检查ID为100的选项是否存在
299
-      const findItemById = (items, targetId) => {
298
+      // 查找deptType为BRIGADE的对象
299
+      const findBrigadeItems = (items) => {
300
+        const brigadeItems = []
300 301
         for (const item of items) {
301
-          if (item.id === targetId) {
302
-            return item
302
+          if (item.deptType === 'BRIGADE') {
303
+            brigadeItems.push(item)
303 304
           }
304 305
           if (item.children && item.children.length > 0) {
305
-            const found = findItemById(item.children, targetId)
306
-            if (found) return found
306
+            const childBrigadeItems = findBrigadeItems(item.children)
307
+            brigadeItems.push(...childBrigadeItems)
307 308
           }
308 309
         }
309
-        return null
310
+        return brigadeItems
310 311
       }
311 312
 
312
-      const defaultItem1 = findItemById(res.data, 100);
313
-      const defaultItem2 = findItemById(res.data, 220);
314
-      const defaultItem3 = findItemById(res.data, 221);
315
-      const defaultItem4 = findItemById(res.data, 222);
316
-
317
-      if (defaultItem1) {
318
-        selectionItems.value[0] = {
319
-          ...defaultItem1,
320
-          selectedId: defaultItem1.id,
321
-          selectedName: defaultItem1.label || defaultItem1.name
322
-        }
323
-        selectionItems.value[1] = {
324
-          ...defaultItem2,
325
-          selectedId: defaultItem2.id,
326
-          selectedName: defaultItem2.label || defaultItem2.name
327
-        }
328
-        selectionItems.value[2] = {
329
-          ...defaultItem3,
330
-          selectedId: defaultItem3.id,
331
-          selectedName: defaultItem3.label || defaultItem3.name
332
-        }
333
-        selectionItems.value[3] = {
334
-          ...defaultItem4,
335
-          selectedId: defaultItem4.id,
336
-          selectedName: defaultItem4.label || defaultItem4.name
313
+      const brigadeItems = findBrigadeItems(res.data)
314
+      
315
+      // 设置前4个BRIGADE对象作为默认选项
316
+      if (brigadeItems.length > 0) {
317
+        for (let i = 0; i < Math.min(brigadeItems.length, 4); i++) {
318
+          selectionItems.value[i] = {
319
+            ...brigadeItems[i],
320
+            selectedId: brigadeItems[i].id,
321
+            selectedName: brigadeItems[i].label || brigadeItems[i].name
322
+          }
337 323
         }
338 324
         // 触发数据请求
339 325
         fetchHomePageDetailData()

+ 4 - 4
src/views/dataBigScreen/dashboard/components/pageItems/HomePageStats.vue

@@ -59,13 +59,13 @@
59 59
             </div>
60 60
           </div>
61 61
 
62
-          <!-- 科室和班组合格率排行 -->
62
+          <!-- 大队和班组合格率排行 -->
63 63
           <div class="rank-section">
64
-            <!-- 科室排名区域 -->
64
+            <!-- 大队排名区域 -->
65 65
             <div class="department-rank-container">
66 66
               <div class="custom-title">
67 67
                 <div class="arrow-icon"></div>
68
-                <span>{{ item.title === '查获上报' ? '科室查获总数排名' : item.title == '抽问抽答' ? '科室正确率排名' : '科室合格率排名' }}</span>
68
+                <span>{{ item.title === '查获上报' ? '大队查获总数排名' : item.title == '抽问抽答' ? '大队正确率排名' : '大队合格率排名' }}</span>
69 69
               </div>
70 70
               <div v-for="(dept, index) in item.departmentRank" :key="'dept-' + index" class="rank-item">
71 71
                 <div class="rank-label">{{ dept.name }}</div>
@@ -448,7 +448,7 @@ const getPercentage = (value, array) => {
448 448
     margin-bottom: 0;
449 449
   }
450 450
 
451
-  /* 科室排名容器样式 */
451
+  /* 大队排名容器样式 */
452 452
   .department-rank-container {
453 453
 
454 454
     overflow-y: auto;

+ 1 - 1
src/views/dataBigScreen/dashboard/components/pageItems/HomePageSystemStatus.vue

@@ -120,7 +120,7 @@ const attendanceItems = computed(() => {
120 120
   if (role.value.includes('kezhang') || role.value.includes('test') || role.value.includes('zhijianke') || role.value.includes('admin')) {
121 121
     res = attendanceStats.value.stationLeaderStats || {}
122 122
     return [
123
-      { id: 1, label: `在岗科室`, value: res?.dutyDeptName, unit: '' },
123
+      { id: 1, label: `在岗大队`, value: res?.dutyDeptName, unit: '' },
124 124
       { id: 2, label: '在岗班组', value: res?.onDutyTeamCount, unit: '' },
125 125
       { id: 3, label: '在岗人员', value: res?.onDutyPersonnelCount, unit: '' },
126 126
       { id: 4, label: '今日查获上报', value: res?.todaySeizureReportCount, unit: '' },

+ 1 - 1
src/views/dataBigScreen/dashboard/components/pageItems/index.js

@@ -55,7 +55,7 @@ export {
55 55
   Attendance, // 出勤投入
56 56
   WorkOutput, // 工作产出
57 57
   LearningGrowth, // 学习成长
58
-  DepartmentInfo, // 科室明细
58
+  DepartmentInfo, // 大队明细
59 59
   // components
60 60
   CustomStyleSelect
61 61
 }

+ 14 - 13
src/views/dataBigScreen/dashboard/components/pageView/HomePage.vue

@@ -107,12 +107,12 @@ const typeDetailData = computed(() => {
107 107
       dividerIndex: 0,
108 108
       dataItems: getSeizeDataItems(),
109 109
       // rankList: getSeizeRankList(),
110
-      departmentRank: seizeData.value.stationMasterData && seizeData.value.stationMasterData.departmentRankings?.map(item => ({ ...item, passRate: item.seizureCount?.toFixed(2), name: item.departmentName })) || [],
111
-      teamRank: seizeData.value.stationMasterData && seizeData.value.stationMasterData.topFiveTeamRankings?.map(item => ({ ...item, passRate: item.seizureCount?.toFixed(2), name: item.teamName })) || [],
110
+      departmentRank: seizeData.value.stationMasterData && seizeData.value.stationMasterData.brigadeRankings?.map(item => ({ ...item,passRate: item.seizureCount?.toFixed(2), name: item.brigadeName })) || [],
111
+      teamRank: seizeData.value.stationMasterData && seizeData.value.stationMasterData.topThreeTeamRankings?.map(item => ({ ...item, passRate: item.seizureCount?.toFixed(2), name: item.teamName })) || [],
112 112
       bottomTeamRank: [{ passRate: 0, name: '无' }],
113 113
       teamSortType: sortStates.value['查获上报'].teamSortType,
114 114
       deptSortType: sortStates.value['查获上报'].deptSortType,
115
-      bottomTeamRank: seizeData.value.stationMasterData && seizeData.value.stationMasterData.botomFiveTeamRankings.map(item => ({ ...item, passRate: item.seizureCount.toFixed(2), name: item.teamName })),
115
+      bottomTeamRank: seizeData.value.stationMasterData && seizeData.value.stationMasterData.botomThreeTeamRankings.map(item => ({ ...item, passRate: item.seizureCount.toFixed(2), name: item.teamName })),
116 116
     },
117 117
     {
118 118
       title: '抽问抽答',
@@ -138,7 +138,7 @@ const typeDetailData = computed(() => {
138 138
       completed: inspectionData.value.doneNumber,
139 139
       pending: inspectionData.value.doingNumber,
140 140
       // rankList: getRankList(),
141
-      departmentRank: inspectionData.value.departmentRankingList && inspectionData.value.departmentRankingList?.map(item => ({ ...item, passRate: (item.passRate * 100)?.toFixed(2) })) || [],
141
+      departmentRank: inspectionData.value.brigadeRankingList && inspectionData.value.brigadeRankingList?.map(item => ({ ...item, passRate: (item.passRate * 100)?.toFixed(2) })) || [],
142 142
       teamRank: inspectionData.value.teamRankingList && inspectionData.value.teamRankingList?.map(item => ({ ...item, passRate: (item.passRate * 100)?.toFixed(2) })) || [],
143 143
       bottomTeamRank: [{ passRate: 0, name: '无' }],
144 144
       teamSortType: sortStates.value['巡检'].teamSortType,
@@ -390,7 +390,7 @@ const getInspectionDataItems = () => {
390 390
     //   ];
391 391
     // } else
392 392
     if (isTestRole.value) {
393
-      // test/zhijianke角色:全站、前三名的科室(isImage: true)
393
+      // test/zhijianke角色:全站、前三名的大队(isImage: true)
394 394
       return [
395 395
         { label: '全站', value: ((stationPassRate || 0) * 100).toFixed(2) + '%', isImage: false },
396 396
         { label: getObjByRank(departmentRankingList, 1).name, value: oneIcon, isImage: true },
@@ -436,7 +436,7 @@ const getQuestionDataItems = () => {
436 436
     //   ];
437 437
     // } else 
438 438
     if (isTestRole.value) {
439
-      // test/zhijianke角色:全站、前三名的科室(isImage: true)
439
+      // test/zhijianke角色:全站、前三名的大队(isImage: true)
440 440
       return [
441 441
         { label: '全站', value: (siteAvgAccuracy || 0) + '%', isImage: false },
442 442
         { label: getObjByRank(topDepts, 1).deptName, value: oneIcon, isImage: true },
@@ -453,6 +453,7 @@ const getQuestionDataItems = () => {
453 453
 
454 454
 //根据角色获取查获数据项目组
455 455
 const getSeizeDataItems = () => {
456
+  
456 457
   if (isIndividualView.value) {
457 458
     // SecurityCheck角色:从securityCheckerData解构
458 459
     const { securityCheckerData } = seizeData.value;
@@ -493,22 +494,22 @@ const getSeizeDataItems = () => {
493 494
     if (isTestRole.value) {
494 495
       // test/zhijianke角色:从securityCheckerData解构
495 496
       const { stationMasterData } = seizeData.value;
496
-      const { totalStationSeizure, departmentRankings } = stationMasterData || {}
497
+      const { totalStationSeizure, brigadeRankings } = stationMasterData || {}
497 498
 
498 499
       // 对departmentRankings数组按照seizureCount由大到小排序
499
-      const sortedDepartmentRankings = Array.isArray(departmentRankings)
500
-        ? [...departmentRankings].sort((a, b) => (b.seizureCount || 0) - (a.seizureCount || 0))
500
+      const sortedDepartmentRankings = Array.isArray(brigadeRankings)
501
+        ? [...brigadeRankings].sort((a, b) => (b.seizureCount || 0) - (a.seizureCount || 0))
501 502
         : [];
502 503
 
503 504
       if (sortedDepartmentRankings.length == 0) {
504 505
         return []
505 506
       }
506
-      // test/zhijianke角色:全站、前三名的科室(isImage: true)
507
+      // test/zhijianke角色:全站、前三名的大队(isImage: true)
507 508
       return [
508 509
         { label: '全站', value: totalStationSeizure || 0, isImage: false },
509
-        { label: sortedDepartmentRankings[0].departmentName, value: oneIcon, isImage: true },
510
-        { label: sortedDepartmentRankings[1].departmentName, value: twoIcon, isImage: true },
511
-        { label: sortedDepartmentRankings[2].departmentName, value: threeIcon, isImage: true }
510
+        { label: sortedDepartmentRankings[0].brigadeName, value: oneIcon, isImage: true },
511
+        { label: sortedDepartmentRankings[1].brigadeName, value: twoIcon, isImage: true },
512
+        { label: sortedDepartmentRankings[2].brigadeName, value: threeIcon, isImage: true }
512 513
       ];
513 514
     } else {
514 515
       // 默认角色:检查项、完成率

+ 7 - 7
src/views/dataBigScreen/dashboard/components/pageView/QualityControl.vue

@@ -6,7 +6,7 @@
6 6
       </div>
7 7
       <div class="content-center">
8 8
         <div class="userSelectParams">
9
-          <CustomStyleSelect v-if="type === 'department'" v-model="params.inspectDepartmentId" :options="departments" />
9
+          <CustomStyleSelect v-if="type === 'brigade'" v-model="params.inspectDepartmentId" :options="departments" />
10 10
           <el-date-picker
11 11
             v-model="params.time"
12 12
             type="daterange"
@@ -64,7 +64,7 @@ const props = defineProps({
64 64
 
65 65
 const params = ref({
66 66
   time: [moment().subtract(91, 'days').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')],
67
-  inspectDepartmentId: props.type === 'department' ? '' : 'ALL'
67
+  inspectDepartmentId: props.type === 'brigade' ? '' : 'ALL'
68 68
 })
69 69
 
70 70
 const provideParams = computed(() => {
@@ -89,15 +89,15 @@ useTimeOut(() => {
89 89
     infoNumber.value = res.data
90 90
   })
91 91
 }, [provideParams])
92
-const departments = ref(props.type === 'department' ? [] : [
92
+const departments = ref(props.type === 'brigade' ? [] : [
93 93
   { value: 'ALL', label: '全站' },
94 94
 ])
95
-function buildDepartmentOptions (tree = []) {
95
+function buildBrigadeOptions (tree = []) {
96 96
   const result = [];
97 97
   function dfs (node, path = []) {
98 98
     const currentPath = [ ...path, node.label ];
99 99
     // 如果是 DEPARTMENT 节点
100
-    if (node.deptType === 'DEPARTMENT') {
100
+    if (node.deptType === "BRIGADE") {
101 101
       result.push({
102 102
         text: currentPath.join(' / '),
103 103
         value: node.id
@@ -113,8 +113,8 @@ function buildDepartmentOptions (tree = []) {
113 113
 }
114 114
 const defaultIndex = ref(0)
115 115
 onMounted(() => {
116
-  props.type === 'department' && getDeptList().then(res => {
117
-    departments.value = [ ...departments.value, ...buildDepartmentOptions(res.data || []).map(item => ({
116
+  props.type === 'brigade' && getDeptList().then(res => {
117
+    departments.value = [ ...departments.value, ...buildBrigadeOptions(res.data || []).map(item => ({
118 118
       ...item,
119 119
       label: item.text?.split('/')[ 1 ],
120 120
       value: item.value.toString()

+ 3 - 3
src/views/dataBigScreen/dashboard/index.vue

@@ -9,13 +9,13 @@
9 9
         </div>
10 10
         <div :class="{ carouselItemBtn: true, carouselItemActive: activeIndex === 2 }" @click="setActiveItem(2)">站级质控
11 11
         </div>
12
-        <div :class="{ carouselItemBtn: true, carouselItemActive: activeIndex === 3 }" @click="setActiveItem(3)">级质控
12
+        <div :class="{ carouselItemBtn: true, carouselItemActive: activeIndex === 3 }" @click="setActiveItem(3)">级质控
13 13
         </div>
14 14
       </div>
15 15
       <div class="right">
16 16
         <div :class="{ carouselItemBtn: true, carouselItemActive: activeIndex === 4 }" @click="setActiveItem(4)">站级画像
17 17
         </div>
18
-        <div :class="{ carouselItemBtn: true, carouselItemActive: activeIndex === 5 }" @click="setActiveItem(5)">级画像
18
+        <div :class="{ carouselItemBtn: true, carouselItemActive: activeIndex === 5 }" @click="setActiveItem(5)">级画像
19 19
         </div>
20 20
         <!-- <div :class="{ carouselItemBtn: true, carouselItemActive: activeIndex === 6 || activeIndex === 7  }" @click="setActiveItem( 6 )">班组画像
21 21
         </div> -->
@@ -35,7 +35,7 @@
35 35
             <QualityControl v-if="activeIndex === 2" />
36 36
           </el-carousel-item>
37 37
           <el-carousel-item>
38
-            <QualityControl type="department" v-if="activeIndex === 3" ref="departmentQualityControl" />
38
+            <QualityControl type="brigade" v-if="activeIndex === 3" ref="departmentQualityControl" />
39 39
           </el-carousel-item>
40 40
           <el-carousel-item>
41 41
             <OrganizationalPortrait v-if="activeIndex === 4" />