瀏覽代碼

feat(performance): 添加非干部月度考核功能及界面优化

- 新增非干部月度考核的CRUD及导出API接口
- 重构非干部考核表格列名及表单字段以匹配后端
- 实现非干部考核数据的列表展示、增删改查功能
- 添加字典标签显示用工形式、岗位和考核组
- 完善导出功能实现
huoyi 1 月之前
父節點
當前提交
5bf12ac275
共有 2 個文件被更改,包括 124 次插入68 次删除
  1. 41 1
      src/api/performance/monthlyAssess.js
  2. 83 67
      src/views/performanceManage/monthlyAssess/index.vue

+ 41 - 1
src/api/performance/monthlyAssess.js

@@ -16,4 +16,44 @@ export function generateCadreAssessment(params) {
16 16
     method: 'post',
17 17
     params: params
18 18
   })
19
-}
19
+}
20
+
21
+//查询非干部月度考核列表
22
+export function listNonCadreAssessment(query) {
23
+  return request({
24
+    url: '/personnel/assessment/list',
25
+    method: 'get',
26
+    params: query
27
+  })
28
+}
29
+//新增非干部月度考核
30
+export function addNonCadreAssessment(params) {
31
+  return request({
32
+    url: '/personnel/assessment',
33
+    method: 'post',
34
+    params: params
35
+  })
36
+}
37
+//修改非干部月度考核
38
+export function updateNonCadreAssessment(params) {
39
+  return request({
40
+    url: '/personnel/assessment',
41
+    method: 'put',
42
+    params: params
43
+  })
44
+}
45
+//删除非干部月度考核
46
+export function deleteNonCadreAssessment(ids) {
47
+  return request({
48
+    url: `/personnel/assessment/${ids}`,
49
+    method: 'delete',
50
+  })
51
+}
52
+//导出非干部月度考核列表
53
+export function exportNonCadreAssessment(params) {
54
+  return request({
55
+    url: '/personnel/assessment/export',
56
+    method: 'post',
57
+    params: params
58
+  })
59
+}

+ 83 - 67
src/views/performanceManage/monthlyAssess/index.vue

@@ -47,54 +47,67 @@
47 47
       <div v-if="currentTab === 'non-cadre'">
48 48
         <el-table v-loading="loading" :data="nonCadreList" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
49 49
           <el-table-column label="大队" prop="brigade" align="center" min-width="100" />
50
-          <el-table-column label="用工形式" prop="employmentType" align="center" min-width="100" />
51
-          <el-table-column label="员工编号" prop="employeeCode" align="center" min-width="120" />
52
-          <el-table-column label="员工姓名" prop="employeeName" align="center" min-width="120" />
53
-          <el-table-column label="考核组" prop="assessmentGroup" align="center" min-width="100" />
54
-          <el-table-column label="分管班组长" prop="teamLeader" align="center" min-width="120" />
55
-          <el-table-column label="分管主管" prop="supervisor" align="center" min-width="120" />
56
-          <el-table-column label="红线指标触发次数" prop="redLineTriggerCount" align="center" min-width="140" />
57
-          <el-table-column label="红线指标依据" prop="redLineBasis" align="center" min-width="120" show-overflow-tooltip />
58
-          <el-table-column label="核心指标分值" prop="coreIndicatorScore" align="center" min-width="120" />
59
-          <el-table-column label="核心指标依据" prop="coreIndicatorBasis" align="center" min-width="120" show-overflow-tooltip />
60
-          <el-table-column label="其他指标分值" prop="otherIndicatorScore" align="center" min-width="120" />
61
-          <el-table-column label="其他指标依据" prop="otherIndicatorBasis" align="center" min-width="120" show-overflow-tooltip />
50
+          <el-table-column label="用工形式" prop="employmentType" align="center" min-width="100">
51
+            <template #default="scope">
52
+              <dict-tag :options="employment_type" :value="scope.row.employmentType" />
53
+            </template>
54
+          </el-table-column>
55
+          <el-table-column label="岗位" prop="post" align="center" min-width="120">
56
+            <template #default="scope">
57
+              <dict-tag :options="post" :value="scope.row.post" />
58
+            </template>
59
+          </el-table-column>
60
+          <el-table-column label="员工姓名" prop="userName" align="center" min-width="120" />
61
+          <el-table-column label="考核组" prop="assessmentTeam" align="center" min-width="100">
62
+            <template #default="scope">
63
+              <dict-tag :options="assessment_team" :value="scope.row.assessmentTeam" />
64
+            </template>
65
+          </el-table-column>
66
+          <el-table-column label="分管班组长" prop="deputyTeamLeaderName" align="center" min-width="120" />
67
+          <el-table-column label="分管主管" prop="deputySupervisorName" align="center" min-width="120" />
68
+          <el-table-column label="分管经理" prop="deputyManagerName" align="center" min-width="120" />
69
+          <el-table-column label="红线指标触发次数" prop="redLineIndexTriggerCount" align="center" min-width="140" />
70
+          <el-table-column label="红线指标依据" prop="redLineIndexAccordList" align="center" min-width="120" show-overflow-tooltip />
71
+          <el-table-column label="核心指标分值" prop="coreIndexScore" align="center" min-width="120" />
72
+          <el-table-column label="核心指标依据" prop="coreIndexAccordList" align="center" min-width="120" show-overflow-tooltip />
73
+          <el-table-column label="其他指标分值" prop="otherIndexScore" align="center" min-width="120" />
74
+          <el-table-column label="其他指标依据" prop="otherIndexAccordList" align="center" min-width="120" show-overflow-tooltip />
62 75
           
63
-          <el-table-column label="其他指标中的安全(仅含SOC/站品控检查扣分)分值" prop="safetyWithSocScore" align="center" min-width="200" show-overflow-tooltip />
64
-          <el-table-column label="其他指标中的安全(仅含SOC/站品控检查扣分)依据" prop="safetyWithSocBasis" align="center" min-width="200" show-overflow-tooltip />
76
+          <el-table-column label="其他指标中的安全(仅含SOC/站品控检查扣分)分值" prop="otherIndexSafetyScoreWithSocStationQcDeduction" align="center" min-width="200" show-overflow-tooltip />
77
+          <el-table-column label="其他指标中的安全(仅含SOC/站品控检查扣分)依据" prop="otherIndexSafetyScoreWithSocStationQcAccordList" align="center" min-width="200" show-overflow-tooltip />
65 78
           
66
-          <el-table-column label="其他指标中的安全(不含SOC/站品控检查扣分)分值" prop="safetyWithoutSocScore" align="center" min-width="200" show-overflow-tooltip />
67
-          <el-table-column label="其他指标中的安全(不含SOC/站品控检查扣分)依据" prop="safetyWithoutSocBasis" align="center" min-width="200" show-overflow-tooltip />
79
+          <el-table-column label="其他指标中的安全(不含SOC/站品控检查扣分)分值" prop="otherIndexSafetyScoreWithoutSocStationQcDeduction" align="center" min-width="200" show-overflow-tooltip />
80
+          <el-table-column label="其他指标中的安全(不含SOC/站品控检查扣分)依据" prop="otherIndexSafetyScoreWithoutSocStationQcAccordList" align="center" min-width="200" show-overflow-tooltip />
68 81
           
69
-          <el-table-column label="其他指标中的非安全指标扣分" prop="nonSafetyDeduction" align="center" min-width="160" show-overflow-tooltip />
70
-          <el-table-column label="其他指标中的非安全指标扣分依据" prop="nonSafetyDeductionBasis" align="center" min-width="160" show-overflow-tooltip />
82
+          <el-table-column label="其他指标中的非安全指标扣分" prop="otherIndexNonSafetyDeduction" align="center" min-width="160" show-overflow-tooltip />
83
+          <el-table-column label="其他指标中的非安全指标扣分依据" prop="otherIndexNonSafetyAccordList" align="center" min-width="160" show-overflow-tooltip />
71 84
           
72
-          <el-table-column label="非核心安全+核心扣分" prop="nonCoreSafetyCoreDeduction" align="center" min-width="140" />
73
-          <el-table-column label="SOC/站品控检查的涉及核心、安全指标扣分" prop="socSafetyCoreDeduction" align="center" min-width="200" show-overflow-tooltip />
74
-          <el-table-column label="SOC/站品控检查的涉及核心、安全指标扣分依据" prop="socSafetyCoreDeductionBasis" align="center" min-width="200" show-overflow-tooltip />
85
+          <el-table-column label="非核心安全+核心扣分" prop="nonCoreSafetyPlusCoreDeduction" align="center" min-width="140" />
86
+          <el-table-column label="SOC/站品控检查的涉及核心、安全指标扣分" prop="socStationQcInvolvedCoreSafetyDeduction" align="center" min-width="200" show-overflow-tooltip />
87
+          <el-table-column label="SOC/站品控检查的涉及核心、安全指标扣分依据" prop="socStationQcInvolvedCoreSafetyAccordList" align="center" min-width="200" show-overflow-tooltip />
75 88
           
76
-          <el-table-column label="分管员工数量" prop="managedEmployeeCount" align="center" min-width="120" />
77
-          <el-table-column label="扣分平均值" prop="averageDeduction" align="center" min-width="100" />
89
+          <el-table-column label="分管员工数量" prop="inChargeEmployeeCount" align="center" min-width="120" />
90
+          <el-table-column label="扣分平均值" prop="deductionAverage" align="center" min-width="100" />
78 91
           <el-table-column label="总分" prop="totalScore" align="center" min-width="100" sortable />
79
-          <el-table-column label="奖励明细" prop="rewardDetails" align="center" min-width="120" show-overflow-tooltip />
80
-          <el-table-column label="惩罚明细" prop="penaltyDetails" align="center" min-width="120" show-overflow-tooltip />
92
+          <el-table-column label="奖励明细" prop="rewardAccordList" align="center" min-width="120" show-overflow-tooltip />
93
+          <el-table-column label="惩罚明细" prop="punishmentAccordList" align="center" min-width="120" show-overflow-tooltip />
81 94
           <el-table-column label="奖励(元)" prop="rewardAmount" align="center" min-width="100" />
82
-          <el-table-column label="扣罚(元)" prop="penaltyAmount" align="center" min-width="100" />
95
+          <el-table-column label="扣罚(元)" prop="punishmentAmount" align="center" min-width="100" />
83 96
           <el-table-column label="考核结果" prop="assessmentResult" align="center" min-width="100" />
84 97
           <el-table-column label="考核结果备注" prop="assessmentResultRemark" align="center" min-width="140" show-overflow-tooltip />
85 98
           <el-table-column label="应用方式" prop="applicationMethod" align="center" min-width="100" />
86 99
           <el-table-column label="应用方式备注" prop="applicationMethodRemark" align="center" min-width="140" show-overflow-tooltip />
87
-          <el-table-column label="是否豁免" prop="isExempted" align="center" min-width="100">
100
+          <el-table-column label="是否豁免" prop="exemption" align="center" min-width="100">
88 101
             <template #default="scope">
89
-              <el-tag :type="scope.row.isExempted ? 'success' : 'info'">
90
-                {{ scope.row.isExempted ? '是' : '否' }}
102
+              <el-tag :type="scope.row.exemption ? 'success' : 'info'">
103
+                {{ scope.row.exemption ? '是' : '否' }}
91 104
               </el-tag>
92 105
             </template>
93 106
           </el-table-column>
94
-          <el-table-column label="是否豁免备注" prop="exemptionRemark" align="center" min-width="140" show-overflow-tooltip />
107
+          <el-table-column label="是否豁免备注" prop="exemptionReasonRemark" align="center" min-width="140" show-overflow-tooltip />
95 108
           <el-table-column label="考核月份" prop="assessmentMonth" align="center" min-width="120" />
96 109
 
97
-          <el-table-column label="操作" align="center" width="120" fixed="right">
110
+          <el-table-column label="操作" align="center" width="150" fixed="right">
98 111
             <template #default="scope">
99 112
               <el-button link type="primary" icon="Edit" @click="handleEdit(scope.row, 'non-cadre')">修改</el-button>
100 113
               <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
@@ -147,8 +160,8 @@
147 160
         <!-- 第一部分:基础信息 -->
148 161
         <el-row :gutter="20">
149 162
           <el-col :span="8">
150
-            <el-form-item label="姓名" prop="employeeName">
151
-              <el-input v-model="nonCadreForm.employeeName" placeholder="请输入姓名" />
163
+            <el-form-item label="姓名" prop="userName">
164
+              <el-input v-model="nonCadreForm.userName" placeholder="请输入姓名" />
152 165
             </el-form-item>
153 166
           </el-col>
154 167
           <el-col :span="8">
@@ -173,43 +186,39 @@
173 186
           <el-col :span="8">
174 187
             <el-form-item label="用工形式" prop="employmentType">
175 188
               <el-select v-model="nonCadreForm.employmentType" placeholder="请选择用工形式" style="width: 100%">
176
-                <el-option v-for="item in employmentTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
189
+                <el-option v-for="item in employment_type" :key="item.value" :label="item.label" :value="item.value" />
177 190
               </el-select>
178 191
             </el-form-item>
179 192
           </el-col>
180 193
           <el-col :span="8">
181
-            <el-form-item label="分管班组长" prop="teamLeader">
182
-              <el-input v-model="nonCadreForm.teamLeader" placeholder="请输入分管班组长" />
194
+            <el-form-item label="分管班组长" prop="deputyTeamLeaderName">
195
+              <el-input v-model="nonCadreForm.deputyTeamLeaderName" placeholder="请输入分管班组长" />
183 196
             </el-form-item>
184 197
           </el-col>
185 198
           <el-col :span="8">
186
-            <el-form-item label="分管主管" prop="supervisor">
187
-              <el-input v-model="nonCadreForm.supervisor" placeholder="请输入分管主管" />
199
+            <el-form-item label="分管主管" prop="deputySupervisorName">
200
+              <el-input v-model="nonCadreForm.deputySupervisorName" placeholder="请输入分管主管" />
188 201
             </el-form-item>
189 202
           </el-col>
190 203
         </el-row>
191 204
 
192 205
         <el-row :gutter="20">
193 206
           <el-col :span="8">
194
-            <el-form-item label="分管经理" prop="manager">
195
-              <el-input v-model="nonCadreForm.manager" placeholder="请输入分管经理" />
207
+            <el-form-item label="分管经理" prop="deputyManagerName">
208
+              <el-input v-model="nonCadreForm.deputyManagerName" placeholder="请输入分管经理" />
196 209
             </el-form-item>
197 210
           </el-col>
198 211
           <el-col :span="8">
199
-            <el-form-item label="大队" prop="brigade">
200
-              <el-select v-model="nonCadreForm.brigade" placeholder="请选择大队" style="width: 100%">
201
-                <el-option label="一大队" value="1" />
202
-                <el-option label="二大队" value="2" />
203
-                <el-option label="三大队" value="3" />
212
+            <el-form-item label="考核组" prop="assessmentTeam">
213
+              <el-select v-model="nonCadreForm.assessmentTeam" placeholder="请选择考核组" style="width: 100%">
214
+                <el-option v-for="item in assessment_team" :key="item.value" :label="item.label" :value="item.value" />
204 215
               </el-select>
205 216
             </el-form-item>
206 217
           </el-col>
207 218
           <el-col :span="8">
208
-            <el-form-item label="考核组" prop="assessmentGroup">
209
-              <el-select v-model="nonCadreForm.assessmentGroup" placeholder="请选择考核组" style="width: 100%">
210
-                <el-option label="一组" value="1" />
211
-                <el-option label="二组" value="2" />
212
-                <el-option label="三组" value="3" />
219
+            <el-form-item label="岗位" prop="post">
220
+              <el-select v-model="nonCadreForm.post" placeholder="请选择岗位" style="width: 100%">
221
+                <el-option v-for="item in post" :key="item.value" :label="item.label" :value="item.value" />
213 222
               </el-select>
214 223
             </el-form-item>
215 224
           </el-col>
@@ -580,10 +589,10 @@ import { ref, reactive, onMounted, getCurrentInstance, watch } from 'vue'
580 589
 import { ElMessage, ElMessageBox } from 'element-plus'
581 590
 
582 591
 // API导入(需要根据实际API路径调整)
583
-import { listCadreAssessment, generateCadreAssessment } from '@/api/performance/monthlyAssess.js'
592
+import { listCadreAssessment, generateCadreAssessment, listNonCadreAssessment, addNonCadreAssessment, updateNonCadreAssessment, deleteNonCadreAssessment, exportNonCadreAssessment } from '@/api/performance/monthlyAssess.js'
584 593
 
585 594
 const { proxy } = getCurrentInstance()
586
-const { post, work_area } = proxy.useDict('post', 'work_area')
595
+const { post, work_area, employment_type, assessment_team } = proxy.useDict('post', 'work_area', 'employment_type', 'assessment_team')
587 596
 
588 597
 // 响应式数据
589 598
 const loading = ref(false)
@@ -707,14 +716,6 @@ const dialog = reactive({
707 716
 const nonCadreList = ref([])
708 717
 const cadreList = ref([])
709 718
 
710
-// 选项配置
711
-const employmentTypeOptions = [
712
-  { label: '正式员工', value: 'formal' },
713
-  { label: '合同工', value: 'contract' },
714
-  { label: '临时工', value: 'temporary' },
715
-  { label: '实习生', value: 'intern' }
716
-]
717
-
718 719
 const assessmentResultOptions = [
719 720
   { label: '优秀', value: 'excellent' },
720 721
   { label: '良好', value: 'good' },
@@ -774,9 +775,9 @@ const getList = async () => {
774 775
     }
775 776
     
776 777
     if (currentTab.value === 'non-cadre') {
777
-      // const res = await getNonCadreMonthlyAssessList(params)
778
-      // nonCadreList.value = res.rows || []
779
-      // total.value = res.total || 0
778
+      const res = await listNonCadreAssessment(params)
779
+      nonCadreList.value = res.rows || []
780
+      total.value = res.total || 0
780 781
     } else {
781 782
       // 干部数据API
782 783
       const res = await listCadreAssessment(params)
@@ -866,7 +867,7 @@ const handleDelete = async (row) => {
866 867
       type: 'warning'
867 868
     })
868 869
     
869
-    await deleteNonCadreMonthlyAssess(row.id)
870
+    await deleteNonCadreAssessment(row.id)
870 871
     ElMessage.success('删除成功')
871 872
     getList()
872 873
   } catch (error) {
@@ -884,10 +885,10 @@ const submitForm = async () => {
884 885
   try {
885 886
     if (dialog.type === 'non-cadre') {
886 887
       if (dialog.title === '新增非干部月度考核') {
887
-        await addNonCadreMonthlyAssess(nonCadreForm)
888
+        await addNonCadreAssessment(nonCadreForm)
888 889
         ElMessage.success('新增成功')
889 890
       } else {
890
-        await updateNonCadreMonthlyAssess(nonCadreForm)
891
+        await updateNonCadreAssessment(nonCadreForm)
891 892
         ElMessage.success('更新成功')
892 893
       }
893 894
     } else {
@@ -905,7 +906,22 @@ const submitForm = async () => {
905 906
 // 导出
906 907
 const handleExport = async () => {
907 908
   try {
908
-    ElMessage.success('导出功能开发中')
909
+    let params = { ...queryParams }
910
+    
911
+    if (params.assessmentMonth) {
912
+      const [year, month] = params.assessmentMonth.split('-')
913
+      params.year = parseInt(year)
914
+      params.month = parseInt(month)
915
+      delete params.assessmentMonth
916
+    }
917
+    
918
+    Object.keys(params).forEach(key => {
919
+      if (params[key] === null || params[key] === undefined || params[key] === '') {
920
+        delete params[key]
921
+      }
922
+    })
923
+    
924
+    proxy.download('personnel/assessment/export', params, `非干部月度考核_${new Date().getTime()}.xlsx`)
909 925
   } catch (error) {
910 926
     ElMessage.error('导出失败')
911 927
   }