Преглед изворни кода

feature:pc端的内容移植到移动端

huoyi пре 15 часа
родитељ
комит
e9adc680fb

+ 6 - 1
src/api/warningManage/index.js

@@ -17,5 +17,10 @@ export function getRedLineWarningPageData(data) {
17
 
17
 
18
 // 员工维度评分明细
18
 // 员工维度评分明细
19
 export function getEmployeeDimensionDetails(data) {
19
 export function getEmployeeDimensionDetails(data) {
20
-    return request({ url: '/ledger/warning/employeeDimensionDetail', method: 'post', data })
20
+    return request({ url: '/ledger/warning/employeeDimensionScores', method: 'post', data })
21
+}
22
+
23
+//
24
+export function getDimensionAll(params) {
25
+  return request({ url: `/score/dimension/all`, method: 'get', params: params })
21
 }
26
 }

+ 24 - 4
src/pages/components/EmployeeTreeNode.vue

@@ -4,14 +4,18 @@
4
             :class="['node-row', { 'is-dept': isDept, 'is-user': isUser }]"
4
             :class="['node-row', { 'is-dept': isDept, 'is-user': isUser }]"
5
             @click="handleClick"
5
             @click="handleClick"
6
         >
6
         >
7
-            <view class="toggle-icon" v-if="isDept">
7
+            <view class="toggle-icon" v-if="isDept && !selectable">
8
                 <u-icon :name="expanded ? 'arrow-down' : 'arrow-right'" size="16" color="#999" />
8
                 <u-icon :name="expanded ? 'arrow-down' : 'arrow-right'" size="16" color="#999" />
9
             </view>
9
             </view>
10
+            <view class="toggle-icon" v-else-if="isDept && selectable">
11
+                <text class="user-dot" style="color: #A78BFA">●</text>
12
+            </view>
10
             <view class="toggle-icon" v-else>
13
             <view class="toggle-icon" v-else>
11
                 <text class="user-dot">●</text>
14
                 <text class="user-dot">●</text>
12
             </view>
15
             </view>
13
             <text class="node-label">{{ nodeLabel }}</text>
16
             <text class="node-label">{{ nodeLabel }}</text>
14
-            <u-icon v-if="isUser && nodeId === selectedId" name="checkmark" color="#34D399" size="18" />
17
+            <u-icon v-if="selectable && nodeId === selectedId" name="checkmark" color="#34D399" size="18" />
18
+            <u-icon v-else-if="!selectable && isUser && nodeId === selectedId" name="checkmark" color="#34D399" size="18" />
15
         </view>
19
         </view>
16
         <view v-if="isDept && expanded" class="node-children">
20
         <view v-if="isDept && expanded" class="node-children">
17
             <template v-for="child in nodeChildren">
21
             <template v-for="child in nodeChildren">
@@ -20,6 +24,7 @@
20
                     :node="child"
24
                     :node="child"
21
                     :expanded-ids="expandedIds"
25
                     :expanded-ids="expandedIds"
22
                     :selected-id="selectedId"
26
                     :selected-id="selectedId"
27
+                    :selectable="selectable"
23
                     @toggle="$emit('toggle', $event)"
28
                     @toggle="$emit('toggle', $event)"
24
                     @select="$emit('select', $event)"
29
                     @select="$emit('select', $event)"
25
                 />
30
                 />
@@ -43,6 +48,10 @@ export default {
43
         selectedId: {
48
         selectedId: {
44
             type: [String, Number],
49
             type: [String, Number],
45
             default: null
50
             default: null
51
+        },
52
+        selectable: {
53
+            type: Boolean,
54
+            default: false
46
         }
55
         }
47
     },
56
     },
48
     computed: {
57
     computed: {
@@ -51,7 +60,7 @@ export default {
51
             return hasChildren || this.node.nodeType === 'dept'
60
             return hasChildren || this.node.nodeType === 'dept'
52
         },
61
         },
53
         isUser() {
62
         isUser() {
54
-            return !this.isDept
63
+            return !this.isDept || this.selectable
55
         },
64
         },
56
         nodeId() {
65
         nodeId() {
57
             return this.node.userId || this.node.id
66
             return this.node.userId || this.node.id
@@ -73,10 +82,21 @@ export default {
73
         handleClick() {
82
         handleClick() {
74
             if (this.isDept) {
83
             if (this.isDept) {
75
                 this.$emit('toggle', this.node.id)
84
                 this.$emit('toggle', this.node.id)
85
+                if (this.selectable) {
86
+                    this.$emit('select', {
87
+                        userId: this.node.userId || this.node.id,
88
+                        nodeId: this.node.id,
89
+                        nickName: this.nodeLabel,
90
+                        nodeType: this.node.nodeType || 'dept',
91
+                        deptType: this.node.deptType || ''
92
+                    })
93
+                }
76
             } else {
94
             } else {
77
                 this.$emit('select', {
95
                 this.$emit('select', {
78
                     userId: this.nodeId,
96
                     userId: this.nodeId,
79
-                    nickName: this.nodeLabel
97
+                    nickName: this.nodeLabel,
98
+                    nodeType: this.node.nodeType || 'user',
99
+                    deptType: this.node.deptType || ''
80
                 })
100
                 })
81
             }
101
             }
82
         }
102
         }

+ 80 - 25
src/pages/employeeDimensionDetails/index.vue

@@ -58,11 +58,14 @@
58
 
58
 
59
             <view class="table-wrapper">
59
             <view class="table-wrapper">
60
                 <statistic-table :columns="tableColumns" :data="tableData" />
60
                 <statistic-table :columns="tableColumns" :data="tableData" />
61
+                <view class="loading-mask" v-if="loading">
62
+                    <u-loading-icon size="28"></u-loading-icon>
63
+                    <text class="loading-text">加载中...</text>
64
+                </view>
61
             </view>
65
             </view>
62
 
66
 
63
             <view class="pagination-wrapper" v-if="total > 0">
67
             <view class="pagination-wrapper" v-if="total > 0">
64
-                <uni-pagination :current="pageNum" :total="total" :page-size="pageSize" :show-page-size="true"
65
-                    :page-size-range="[10, 20, 50]" @change="onPageChange" @pageSizeChange="onPageSizeChange" />
68
+                <uni-pagination :current="pageNum" :total="total" :page-size="pageSize" @change="onPageChange" />
66
             </view>
69
             </view>
67
         </view>
70
         </view>
68
 
71
 
@@ -79,7 +82,7 @@
79
                 </view>
82
                 </view>
80
                 <scroll-view v-if="!orgSearchKeyword.trim()" scroll-y class="tree-list">
83
                 <scroll-view v-if="!orgSearchKeyword.trim()" scroll-y class="tree-list">
81
                     <employee-tree-node v-for="(node, index) in deptTreeData" :key="node.id" :node="node" :expanded-ids="expandedDeptIds"
84
                     <employee-tree-node v-for="(node, index) in deptTreeData" :key="node.id" :node="node" :expanded-ids="expandedDeptIds"
82
-                        :selected-id="selectedOrgId" @toggle="toggleDeptExpand" @select="onOrgSelect" />
85
+                        :selected-id="selectedOrgId" :selectable="true" @toggle="toggleDeptExpand" @select="onOrgSelect" />
83
                 </scroll-view>
86
                 </scroll-view>
84
                 <scroll-view v-else scroll-y class="org-list">
87
                 <scroll-view v-else scroll-y class="org-list">
85
                     <view class="org-item" v-for="item in filteredOrgList" :key="item.userId"
88
                     <view class="org-item" v-for="item in filteredOrgList" :key="item.userId"
@@ -117,7 +120,7 @@
117
 <script>
120
 <script>
118
 import StatisticTable from '@/components/statistic-table/statistic-table.vue'
121
 import StatisticTable from '@/components/statistic-table/statistic-table.vue'
119
 import EmployeeTreeNode from '@/pages/components/EmployeeTreeNode.vue'
122
 import EmployeeTreeNode from '@/pages/components/EmployeeTreeNode.vue'
120
-import { getEmployeeDimensionDetails } from '@/api/warningManage/index'
123
+import { getEmployeeDimensionDetails, getDimensionAll } from '@/api/warningManage/index'
121
 import { getDeptUserTree } from '@/api/system/user'
124
 import { getDeptUserTree } from '@/api/system/user'
122
 
125
 
123
 export default {
126
 export default {
@@ -134,6 +137,7 @@ export default {
134
             endTime: '',
137
             endTime: '',
135
             selectedOrgId: null,
138
             selectedOrgId: null,
136
             selectedOrgName: '',
139
             selectedOrgName: '',
140
+            selectedDeptType: '',
137
             selectedDimension: '',
141
             selectedDimension: '',
138
             selectedDimName: '全部',
142
             selectedDimName: '全部',
139
             showOrgPicker: false,
143
             showOrgPicker: false,
@@ -142,24 +146,22 @@ export default {
142
             deptTreeData: [],
146
             deptTreeData: [],
143
             expandedDeptIds: [],
147
             expandedDeptIds: [],
144
             orgList: [],
148
             orgList: [],
145
-            dimensionOptions: [
146
-                { label: '安全响应能力', value: '安全响应能力' },
147
-                { label: '服务响应能力', value: '服务响应能力' }
148
-            ],
149
+            dimensionOptions: [],
149
             tableColumns: [
150
             tableColumns: [
150
                 { props: 'userId', title: '员工ID' },
151
                 { props: 'userId', title: '员工ID' },
151
-                { props: 'nickName', title: '姓名' },
152
+                { props: 'personName', title: '姓名' },
152
                 { props: 'deptName', title: '部门' },
153
                 { props: 'deptName', title: '部门' },
153
                 { props: 'teamName', title: '班组' },
154
                 { props: 'teamName', title: '班组' },
154
                 { props: 'groupName', title: '小组' },
155
                 { props: 'groupName', title: '小组' },
155
-                { props: 'dimName', title: '维度名称' },
156
-                { props: 'dimScore', title: '维度分值' }
156
+                { props: 'dimensionName', title: '维度名称' },
157
+                { props: 'dimensionScore', title: '维度分值' }
157
             ],
158
             ],
158
             tableData: [],
159
             tableData: [],
159
             allTableData: [],
160
             allTableData: [],
160
             pageNum: 1,
161
             pageNum: 1,
161
             pageSize: 10,
162
             pageSize: 10,
162
-            total: 0
163
+            total: 0,
164
+            loading: false
163
         }
165
         }
164
     },
166
     },
165
     computed: {
167
     computed: {
@@ -173,6 +175,7 @@ export default {
173
     },
175
     },
174
     mounted() {
176
     mounted() {
175
         this.loadDeptTree()
177
         this.loadDeptTree()
178
+        this.loadDimensionOptions()
176
         this.fetchData()
179
         this.fetchData()
177
     },
180
     },
178
     methods: {
181
     methods: {
@@ -258,7 +261,9 @@ export default {
258
         onOrgSelect(item) {
261
         onOrgSelect(item) {
259
             this.selectedOrgId = item.userId
262
             this.selectedOrgId = item.userId
260
             this.selectedOrgName = item.nickName
263
             this.selectedOrgName = item.nickName
264
+            this.selectedDeptType = item.deptType || ''
261
             this.showOrgPicker = false
265
             this.showOrgPicker = false
266
+         
262
         },
267
         },
263
         onOrgSearch() { },
268
         onOrgSearch() { },
264
         selectDimension(value) {
269
         selectDimension(value) {
@@ -277,33 +282,38 @@ export default {
277
             this.endTime = ''
282
             this.endTime = ''
278
             this.selectedOrgId = null
283
             this.selectedOrgId = null
279
             this.selectedOrgName = ''
284
             this.selectedOrgName = ''
285
+            this.selectedDeptType = ''
280
             this.selectedDimension = ''
286
             this.selectedDimension = ''
281
             this.selectedDimName = '全部'
287
             this.selectedDimName = '全部'
282
             this.pageNum = 1
288
             this.pageNum = 1
289
+            this.loadDimensionOptions()
283
             this.fetchData()
290
             this.fetchData()
284
         },
291
         },
285
         onPageChange(e) {
292
         onPageChange(e) {
286
             this.pageNum = e.current
293
             this.pageNum = e.current
287
-            this.fetchData()
288
-        },
289
-        onPageSizeChange(e) {
290
-            this.pageSize = e.pageSize
291
-            this.pageNum = 1
292
-            this.fetchData()
294
+            this.updatePagedData()
293
         },
295
         },
294
         async fetchData() {
296
         async fetchData() {
297
+            this.loading = true
295
             let params = this.getQueryParams()
298
             let params = this.getQueryParams()
296
-            params.pageNum = this.pageNum
297
-            params.pageSize = this.pageSize
298
             try {
299
             try {
299
                 const res = await getEmployeeDimensionDetails(params)
300
                 const res = await getEmployeeDimensionDetails(params)
300
                 if (res.code === 200 && res.data) {
301
                 if (res.code === 200 && res.data) {
301
                     const data = res.data
302
                     const data = res.data
302
                     this.allTableData = data.list || data || []
303
                     this.allTableData = data.list || data || []
303
-                    this.tableData = this.allTableData
304
-                    this.total = data.total || this.allTableData.length
304
+                    this.pageNum = 1
305
+                    this.updatePagedData()
305
                 }
306
                 }
306
-            } catch (e) { }
307
+            } catch (e) { } finally {
308
+                this.loading = false
309
+            }
310
+        },
311
+        updatePagedData() {
312
+            const data = this.allTableData
313
+            this.total = data.length
314
+            const start = (this.pageNum - 1) * this.pageSize
315
+            const end = start + this.pageSize
316
+            this.tableData = data.slice(start, end)
307
         },
317
         },
308
         getQueryParams() {
318
         getQueryParams() {
309
             let params = {}
319
             let params = {}
@@ -316,12 +326,35 @@ export default {
316
                 params.endDate = range.endDate
326
                 params.endDate = range.endDate
317
             }
327
             }
318
             if (this.selectedOrgId) {
328
             if (this.selectedOrgId) {
319
-                params.userId = this.selectedOrgId
329
+                const key = this.getOrgParamKey()
330
+                if (key){
331
+                    params[key] = this.selectedOrgId
332
+                }
320
             }
333
             }
321
             if (this.selectedDimension) {
334
             if (this.selectedDimension) {
322
-                params.dimension = this.selectedDimension
335
+                params.dimensionId = this.selectedDimension
323
             }
336
             }
324
             return params
337
             return params
338
+        },
339
+        getOrgParamKey() {
340
+            const deptType = this.selectedDeptType
341
+            if (deptType === 'BRIGADE') return 'deptId'
342
+            if (deptType === 'MANAGER') return 'teamId'
343
+            if (deptType === 'TEAMS') return 'groupId'
344
+            if (deptType === 'user') return 'userId'
345
+            return ''
346
+        },
347
+        async loadDimensionOptions() {
348
+            try {
349
+                
350
+                const res = await getDimensionAll({ pageNum: 1, pageSize: 100, org: 4 })
351
+                if (res.code === 200 && res.data) {
352
+                    this.dimensionOptions = (res.data || []).map(item => ({
353
+                        label: item.name || item.label || item.dimensionName || '',
354
+                        value: item.id != null ? String(item.id) : (item.value || item.name || '')
355
+                    }))
356
+                }
357
+            } catch (e) { }
325
         }
358
         }
326
     }
359
     }
327
 }
360
 }
@@ -494,6 +527,28 @@ export default {
494
     border-radius: 16rpx;
527
     border-radius: 16rpx;
495
     overflow-x: auto;
528
     overflow-x: auto;
496
     box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
529
     box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
530
+    position: relative;
531
+    min-height: 200rpx;
532
+}
533
+
534
+.loading-mask {
535
+    position: absolute;
536
+    top: 0;
537
+    left: 0;
538
+    right: 0;
539
+    bottom: 0;
540
+    background: rgba(255, 255, 255, 0.8);
541
+    display: flex;
542
+    flex-direction: column;
543
+    align-items: center;
544
+    justify-content: center;
545
+    gap: 16rpx;
546
+    z-index: 10;
547
+}
548
+
549
+.loading-text {
550
+    font-size: 24rpx;
551
+    color: #999;
497
 }
552
 }
498
 
553
 
499
 .pagination-wrapper {
554
 .pagination-wrapper {

+ 52 - 26
src/pages/redLineWarning/index.vue

@@ -2,7 +2,7 @@
2
     <view class="redline-page">
2
     <view class="redline-page">
3
         <view class="page-header">
3
         <view class="page-header">
4
             <view class="header-title">红线指标预警</view>
4
             <view class="header-title">红线指标预警</view>
5
-            <view class="header-subtitle">权重扣分 ≥ 3分自动进入红色预警区</view>
5
+            <view class="header-subtitle">员工综合评估(<75分红色预警 | ≥90分优秀)</view>
6
             <view class="badge-group">
6
             <view class="badge-group">
7
                 <view class="alert-badge">红色预警</view>
7
                 <view class="alert-badge">红色预警</view>
8
                 <view class="alert-badge orange">动态月度数据</view>
8
                 <view class="alert-badge orange">动态月度数据</view>
@@ -55,7 +55,7 @@
55
         <!-- 员工列表 -->
55
         <!-- 员工列表 -->
56
         <view class="section-area">
56
         <view class="section-area">
57
             <SectionTitle title="红线指标预警明细">
57
             <SectionTitle title="红线指标预警明细">
58
-                <view class="section-badge">权重扣分 ≥ 3分</view>
58
+                <view class="section-badge">评分依据:员工配分表</view>
59
             </SectionTitle>
59
             </SectionTitle>
60
 
60
 
61
             <view class="table-wrapper">
61
             <view class="table-wrapper">
@@ -64,12 +64,17 @@
64
                         <text v-if="row.totalScore >= 3" class="score-danger">{{ row.totalScore }}</text>
64
                         <text v-if="row.totalScore >= 3" class="score-danger">{{ row.totalScore }}</text>
65
                         <text v-else>{{ row.totalScore }}</text>
65
                         <text v-else>{{ row.totalScore }}</text>
66
                     </template>
66
                     </template>
67
+                    <template #column-warningLevel="{ row }">
68
+                        <text :style="{ color: row.warningLevel === '1' ? '#dc2626' : '' }">{{ getDictLabel(alertLevelList, row.warningLevel) }}</text>
69
+                    </template>
70
+                    <template #column-statusLabel="{ row }">
71
+                        <text :style="{ color: row.statusLabel === '1' ? '#dc2626' : '' }">{{ getDictLabel(statusLabelList, row.statusLabel) }}</text>
72
+                    </template>
67
                 </statistic-table>
73
                 </statistic-table>
68
             </view>
74
             </view>
69
 
75
 
70
             <view class="pagination-wrapper" v-if="total > 0">
76
             <view class="pagination-wrapper" v-if="total > 0">
71
-                <uni-pagination :current="pageNum" :total="total" :page-size="pageSize" :show-page-size="true"
72
-                    :page-size-range="[10, 20, 50]" @change="onPageChange" @pageSizeChange="onPageSizeChange" />
77
+                <uni-pagination :current="pageNum" :total="total" :page-size="pageSize" simple @change="onPageChange" />
73
             </view>
78
             </view>
74
 
79
 
75
             <view class="warning-summary">
80
             <view class="warning-summary">
@@ -142,9 +147,11 @@ import StatisticTable from '@/components/statistic-table/statistic-table.vue'
142
 import EmployeeTreeNode from '@/pages/components/EmployeeTreeNode.vue'
147
 import EmployeeTreeNode from '@/pages/components/EmployeeTreeNode.vue'
143
 import { getRedLineWarningPageData } from '@/api/warningManage/index'
148
 import { getRedLineWarningPageData } from '@/api/warningManage/index'
144
 import { getDeptUserTree } from '@/api/system/user'
149
 import { getDeptUserTree } from '@/api/system/user'
150
+import useDict from '@/utils/dict'
145
 
151
 
146
 export default {
152
 export default {
147
     name: 'RedLineWarning',
153
     name: 'RedLineWarning',
154
+    mixins: [useDict],
148
     components: {
155
     components: {
149
         SectionTitle,
156
         SectionTitle,
150
         StatisticTable,
157
         StatisticTable,
@@ -166,10 +173,8 @@ export default {
166
             deptTreeData: [],
173
             deptTreeData: [],
167
             expandedDeptIds: [],
174
             expandedDeptIds: [],
168
             orgList: [],
175
             orgList: [],
169
-            alertLevelList: [
170
-                { label: '红色预警', value: '1' },
171
-                { label: '正常范围', value: '3' }
172
-            ],
176
+            alertLevelList: [],
177
+            statusLabelList: [],
173
             tableColumns: [
178
             tableColumns: [
174
                 { props: 'nickName', title: '姓名' },
179
                 { props: 'nickName', title: '姓名' },
175
                 { props: 'deptName', title: '部门' },
180
                 { props: 'deptName', title: '部门' },
@@ -177,8 +182,9 @@ export default {
177
                 { props: 'level2Name', title: '二级指标' },
182
                 { props: 'level2Name', title: '二级指标' },
178
                 { props: 'totalScore', title: '扣分合计', slot: true },
183
                 { props: 'totalScore', title: '扣分合计', slot: true },
179
                 { props: 'occurrenceCount', title: '发生次数' },
184
                 { props: 'occurrenceCount', title: '发生次数' },
180
-                { props: 'warningLevel', title: '预警等级' },
181
-                { props: 'coreRisks', title: '核心风险' }
185
+                { props: 'warningLevel', title: '预警等级', slot: true },
186
+                { props: 'coreRisks', title: '核心风险' },
187
+                { props: 'statusLabel', title: '状态标签', slot: true }
182
             ],
188
             ],
183
             tableData: [],
189
             tableData: [],
184
             allTableData: [],
190
             allTableData: [],
@@ -197,6 +203,10 @@ export default {
197
             return this.orgList.filter(item =>
203
             return this.orgList.filter(item =>
198
                 (item.nickName || '').toLowerCase().includes(keyword)
204
                 (item.nickName || '').toLowerCase().includes(keyword)
199
             )
205
             )
206
+        },
207
+        filteredTableData() {
208
+            if (!this.selectedAlertLevel) return this.allTableData
209
+            return this.allTableData.filter(item => item.warningLevel === this.selectedAlertLevel)
200
         }
210
         }
201
     },
211
     },
202
     onLoad(options) {
212
     onLoad(options) {
@@ -211,16 +221,15 @@ export default {
211
             this.endTime = options.endDate
221
             this.endTime = options.endDate
212
         }
222
         }
213
         if (options.activeRange) {
223
         if (options.activeRange) {
214
-            this.selectedTimeTag = options.activeRange
224
+            this.selectedTimeTag = Number(options.activeRange)
215
         }
225
         }
216
         if (options.alertLevel) {
226
         if (options.alertLevel) {
217
             this.selectedAlertLevel = options.alertLevel
227
             this.selectedAlertLevel = options.alertLevel
218
-            const item = this.alertLevelList.find(l => l.value === options.alertLevel)
219
-            if (item) this.selectedLevelName = item.label
220
         }
228
         }
221
     },
229
     },
222
     mounted() {
230
     mounted() {
223
         this.loadDeptTree()
231
         this.loadDeptTree()
232
+        this.loadDicts()
224
         this.fetchData()
233
         this.fetchData()
225
     },
234
     },
226
     methods: {
235
     methods: {
@@ -292,6 +301,10 @@ export default {
292
                     this.deptTreeData = res.data || []
301
                     this.deptTreeData = res.data || []
293
                     this.orgList = this.flattenDeptTree(this.deptTreeData).filter(u => u.nodeType === 'user')
302
                     this.orgList = this.flattenDeptTree(this.deptTreeData).filter(u => u.nodeType === 'user')
294
                     this.expandAllDepts(this.deptTreeData)
303
                     this.expandAllDepts(this.deptTreeData)
304
+                    if (this.selectedOrgId) {
305
+                        const user = this.orgList.find(u => u.userId === this.selectedOrgId)
306
+                        if (user) this.selectedOrgName = user.nickName
307
+                    }
295
                 }
308
                 }
296
             }).catch(() => { })
309
             }).catch(() => { })
297
         },
310
         },
@@ -314,6 +327,8 @@ export default {
314
             const item = this.alertLevelList.find(l => l.value === value)
327
             const item = this.alertLevelList.find(l => l.value === value)
315
             this.selectedLevelName = value === '' ? '全部' : (item ? item.label : '')
328
             this.selectedLevelName = value === '' ? '全部' : (item ? item.label : '')
316
             this.showLevelPicker = false
329
             this.showLevelPicker = false
330
+            this.pageNum = 1
331
+            this.updatePagedData()
317
         },
332
         },
318
         handleSearch() {
333
         handleSearch() {
319
             this.pageNum = 1
334
             this.pageNum = 1
@@ -332,30 +347,44 @@ export default {
332
         },
347
         },
333
         onPageChange(e) {
348
         onPageChange(e) {
334
             this.pageNum = e.current
349
             this.pageNum = e.current
335
-            this.fetchData()
336
-        },
337
-        onPageSizeChange(e) {
338
-            this.pageSize = e.pageSize
339
-            this.pageNum = 1
340
-            this.fetchData()
350
+            this.updatePagedData()
341
         },
351
         },
342
         async fetchData() {
352
         async fetchData() {
343
             let params = this.getQueryParams()
353
             let params = this.getQueryParams()
344
-            params.pageNum = this.pageNum
345
-            params.pageSize = this.pageSize
346
             try {
354
             try {
347
                 const res = await getRedLineWarningPageData(params)
355
                 const res = await getRedLineWarningPageData(params)
348
                 if (res.code === 200 && res.data) {
356
                 if (res.code === 200 && res.data) {
349
                     const data = res.data
357
                     const data = res.data
350
                     this.allTableData = data || []
358
                     this.allTableData = data || []
351
-                    this.tableData = this.allTableData
352
-                    this.total = data.total || this.allTableData.length
353
                     this.redAlertCount = data.redAlertNum || 0
359
                     this.redAlertCount = data.redAlertNum || 0
354
                     this.excellentCount = data.excellentBenchmarkNum || 0
360
                     this.excellentCount = data.excellentBenchmarkNum || 0
355
                     this.avgScore = data.averageComprehensiveScore || 0
361
                     this.avgScore = data.averageComprehensiveScore || 0
362
+                    this.pageNum = 1
363
+                    this.updatePagedData()
356
                 }
364
                 }
357
             } catch (e) { }
365
             } catch (e) { }
358
         },
366
         },
367
+        async loadDicts() {
368
+            const res = await this.useDict('alert_level', 'status_label')
369
+            this.alertLevelList = res.alert_level || []
370
+            this.statusLabelList = res.status_label || []
371
+            if (this.selectedAlertLevel) {
372
+                const item = this.alertLevelList.find(l => l.value === this.selectedAlertLevel)
373
+                if (item) this.selectedLevelName = item.label
374
+            }
375
+        },
376
+        getDictLabel(dictList, value) {
377
+            if (!value) return ''
378
+            const item = dictList.find(d => d.value === value)
379
+            return item ? item.label : value
380
+        },
381
+        updatePagedData() {
382
+            const data = this.filteredTableData
383
+            this.total = data.length
384
+            const start = (this.pageNum - 1) * this.pageSize
385
+            const end = start + this.pageSize
386
+            this.tableData = data.slice(start, end)
387
+        },
359
         getQueryParams() {
388
         getQueryParams() {
360
             let params = {}
389
             let params = {}
361
             if (this.beginTime && this.endTime) {
390
             if (this.beginTime && this.endTime) {
@@ -369,9 +398,6 @@ export default {
369
             if (this.selectedOrgId) {
398
             if (this.selectedOrgId) {
370
                 params.userId = this.selectedOrgId
399
                 params.userId = this.selectedOrgId
371
             }
400
             }
372
-            if (this.selectedAlertLevel) {
373
-                params.warningLevel = this.selectedAlertLevel
374
-            }
375
             return params
401
             return params
376
         }
402
         }
377
     }
403
     }

+ 47 - 12
src/pages/warningPage/index.vue

@@ -73,6 +73,12 @@
73
                         <text v-else-if="row.overallScore >= 90" class="score-excellent">{{ row.overallScore }}分</text>
73
                         <text v-else-if="row.overallScore >= 90" class="score-excellent">{{ row.overallScore }}分</text>
74
                         <text v-else>{{ row.overallScore }}分</text>
74
                         <text v-else>{{ row.overallScore }}分</text>
75
                     </template>
75
                     </template>
76
+                    <template #column-warningLevel="{ row }">
77
+                        <text :style="{ color: row.warningLevel === '1' ? '#dc2626' : '' }">{{ getDictLabel(alertLevelList, row.warningLevel) }}</text>
78
+                    </template>
79
+                    <template #column-statusLabel="{ row }">
80
+                        <text :style="{ color: row.statusLabel === '1' ? '#dc2626' : '' }">{{ getDictLabel(statusLabelList, row.statusLabel) }}</text>
81
+                    </template>
76
                     <template #column-detail="{ row }">
82
                     <template #column-detail="{ row }">
77
                         <text class="detail-link" @click="goToDetail(row)">详情</text>
83
                         <text class="detail-link" @click="goToDetail(row)">详情</text>
78
                     </template>
84
                     </template>
@@ -153,9 +159,11 @@ import StatisticTable from '@/components/statistic-table/statistic-table.vue'
153
 import EmployeeTreeNode from '@/pages/components/EmployeeTreeNode.vue'
159
 import EmployeeTreeNode from '@/pages/components/EmployeeTreeNode.vue'
154
 import { getWarningPageData, getEmployeeWarningPageData } from '@/api/warningManage/index'
160
 import { getWarningPageData, getEmployeeWarningPageData } from '@/api/warningManage/index'
155
 import { getDeptUserTree } from '@/api/system/user'
161
 import { getDeptUserTree } from '@/api/system/user'
162
+import useDict from '@/utils/dict'
156
 
163
 
157
 export default {
164
 export default {
158
     name: 'WarningPage',
165
     name: 'WarningPage',
166
+    mixins: [useDict],
159
     components: {
167
     components: {
160
         SectionTitle,
168
         SectionTitle,
161
         StatisticTable,
169
         StatisticTable,
@@ -177,10 +185,8 @@ export default {
177
             deptTreeData: [],
185
             deptTreeData: [],
178
             expandedDeptIds: [],
186
             expandedDeptIds: [],
179
             orgList: [],
187
             orgList: [],
180
-            alertLevelList: [
181
-                { label: '红色预警', value: '1' },
182
-                { label: '正常范围', value: '3' }
183
-            ],
188
+            alertLevelList: [],
189
+            statusLabelList: [],
184
             summaryCards: [
190
             summaryCards: [
185
                 { title: '部门监察问题', badge: '部门级', value: '0', color: '#b45309' },
191
                 { title: '部门监察问题', badge: '部门级', value: '0', color: '#b45309' },
186
                 { title: '实时质控拦截', badge: '部门级', value: '0', color: '#2563eb' },
192
                 { title: '实时质控拦截', badge: '部门级', value: '0', color: '#2563eb' },
@@ -197,9 +203,9 @@ export default {
197
                 { props: 'nickName', title: '姓名' },
203
                 { props: 'nickName', title: '姓名' },
198
                 { props: 'deptName', title: '所属部门' },
204
                 { props: 'deptName', title: '所属部门' },
199
                 { props: 'overallScore', title: '综合评估得分', slot: true },
205
                 { props: 'overallScore', title: '综合评估得分', slot: true },
200
-                { props: 'warningLevel', title: '预警等级' },
206
+                { props: 'warningLevel', title: '预警等级', slot: true },
201
                 { props: 'coreRisksOrOutstandingAchievements', title: '核心风险/优秀事迹' },
207
                 { props: 'coreRisksOrOutstandingAchievements', title: '核心风险/优秀事迹' },
202
-                { props: 'statusLabel', title: '状态标签' },
208
+                { props: 'statusLabel', title: '状态标签', slot: true },
203
                 { props: 'detail', title: '详情', slot: true }
209
                 { props: 'detail', title: '详情', slot: true }
204
             ],
210
             ],
205
             employeeList: [],
211
             employeeList: [],
@@ -230,6 +236,10 @@ export default {
230
             return this.orgList.filter(item =>
236
             return this.orgList.filter(item =>
231
                 (item.nickName || '').toLowerCase().includes(keyword)
237
                 (item.nickName || '').toLowerCase().includes(keyword)
232
             )
238
             )
239
+        },
240
+        filteredEmployeeList() {
241
+            if (!this.selectedAlertLevel) return this.allEmployeeList
242
+            return this.allEmployeeList.filter(item => item.warningLevel === this.selectedAlertLevel)
233
         }
243
         }
234
     },
244
     },
235
     onLoad(options) {
245
     onLoad(options) {
@@ -239,9 +249,20 @@ export default {
239
     },
249
     },
240
     mounted() {
250
     mounted() {
241
         this.loadDeptTree()
251
         this.loadDeptTree()
252
+        this.loadDicts()
242
         this.fetchData()
253
         this.fetchData()
243
     },
254
     },
244
     methods: {
255
     methods: {
256
+        async loadDicts() {
257
+            const res = await this.useDict('alert_level', 'status_label')
258
+            this.alertLevelList = res.alert_level || []
259
+            this.statusLabelList = res.status_label || []
260
+        },
261
+        getDictLabel(dictList, value) {
262
+            if (!value) return ''
263
+            const item = dictList.find(d => d.value === value)
264
+            return item ? item.label : value
265
+        },
245
         formatDate(date) {
266
         formatDate(date) {
246
             const y = date.getFullYear()
267
             const y = date.getFullYear()
247
             const m = String(date.getMonth() + 1).padStart(2, '0')
268
             const m = String(date.getMonth() + 1).padStart(2, '0')
@@ -332,6 +353,8 @@ export default {
332
             const item = this.alertLevelList.find(l => l.value === value)
353
             const item = this.alertLevelList.find(l => l.value === value)
333
             this.selectedLevelName = value === '' ? '全部' : (item ? item.label : '')
354
             this.selectedLevelName = value === '' ? '全部' : (item ? item.label : '')
334
             this.showLevelPicker = false
355
             this.showLevelPicker = false
356
+            this.pageNum = 1
357
+            this.updatePagedData()
335
         },
358
         },
336
         handleSearch() {
359
         handleSearch() {
337
             this.pageNum = 1
360
             this.pageNum = 1
@@ -379,19 +402,21 @@ export default {
379
                 if (res.code === 200 && res.data) {
402
                 if (res.code === 200 && res.data) {
380
                     const data = res.data
403
                     const data = res.data
381
                     this.allEmployeeList = data.ledgerWarningDetailItemList || []
404
                     this.allEmployeeList = data.ledgerWarningDetailItemList || []
382
-                    this.total = this.allEmployeeList.length
383
                    
405
                    
384
                     this.redAlertCount = data.redAlertNum || 0
406
                     this.redAlertCount = data.redAlertNum || 0
385
                     this.excellentCount = data.excellentBenchmarkNum || 0
407
                     this.excellentCount = data.excellentBenchmarkNum || 0
386
                     this.avgScore = data.averageComprehensiveScore || 0
408
                     this.avgScore = data.averageComprehensiveScore || 0
409
+                    this.pageNum = 1
387
                     this.updatePagedData()
410
                     this.updatePagedData()
388
                 }
411
                 }
389
             } catch (e) { }
412
             } catch (e) { }
390
         },
413
         },
391
         updatePagedData() {
414
         updatePagedData() {
415
+            const data = this.filteredEmployeeList
416
+            this.total = data.length
392
             const start = (this.pageNum - 1) * this.pageSize
417
             const start = (this.pageNum - 1) * this.pageSize
393
             const end = start + this.pageSize
418
             const end = start + this.pageSize
394
-            this.employeeList = this.allEmployeeList.slice(start, end)
419
+            this.employeeList = data.slice(start, end)
395
         },
420
         },
396
         getQueryParams() {
421
         getQueryParams() {
397
             let params = {}
422
             let params = {}
@@ -406,14 +431,24 @@ export default {
406
             if (this.selectedOrgId) {
431
             if (this.selectedOrgId) {
407
                 params.userId = this.selectedOrgId
432
                 params.userId = this.selectedOrgId
408
             }
433
             }
409
-            if (this.selectedAlertLevel) {
410
-                params.warningLevel = this.selectedAlertLevel
411
-            }
412
             return params
434
             return params
413
         },
435
         },
414
         goToDetail(row) {
436
         goToDetail(row) {
437
+            const query = []
438
+            if (row.userId) {
439
+                query.push('id=' + row.userId)
440
+            }
441
+            if (this.beginTime && this.endTime) {
442
+                query.push('startDate=' + this.beginTime)
443
+                query.push('endDate=' + this.endTime)
444
+            } else {
445
+                query.push('activeRange=' + this.selectedTimeTag)
446
+            }
447
+            if (this.selectedAlertLevel) {
448
+                query.push('alertLevel=' + this.selectedAlertLevel)
449
+            }
415
             uni.navigateTo({
450
             uni.navigateTo({
416
-                url: '/pages/redLineWarning/index?id=' + row.userId
451
+                url: '/pages/redLineWarning/index?' + query.join('&')
417
             })
452
             })
418
         }
453
         }
419
     }
454
     }