Просмотр исходного кода

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

- 新增非干部月度考核的CRUD及导出API接口
- 重构非干部考核表格列名及表单字段以匹配后端
- 实现非干部考核数据的列表展示、增删改查功能
- 添加字典标签显示用工形式、岗位和考核组
- 完善导出功能实现
huoyi 1 месяц назад
Родитель
Сommit
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
     method: 'post',
16
     method: 'post',
17
     params: params
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
       <div v-if="currentTab === 'non-cadre'">
47
       <div v-if="currentTab === 'non-cadre'">
48
         <el-table v-loading="loading" :data="nonCadreList" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
48
         <el-table v-loading="loading" :data="nonCadreList" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
49
           <el-table-column label="大队" prop="brigade" align="center" min-width="100" />
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
           <el-table-column label="总分" prop="totalScore" align="center" min-width="100" sortable />
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
           <el-table-column label="奖励(元)" prop="rewardAmount" align="center" min-width="100" />
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
           <el-table-column label="考核结果" prop="assessmentResult" align="center" min-width="100" />
96
           <el-table-column label="考核结果" prop="assessmentResult" align="center" min-width="100" />
84
           <el-table-column label="考核结果备注" prop="assessmentResultRemark" align="center" min-width="140" show-overflow-tooltip />
97
           <el-table-column label="考核结果备注" prop="assessmentResultRemark" align="center" min-width="140" show-overflow-tooltip />
85
           <el-table-column label="应用方式" prop="applicationMethod" align="center" min-width="100" />
98
           <el-table-column label="应用方式" prop="applicationMethod" align="center" min-width="100" />
86
           <el-table-column label="应用方式备注" prop="applicationMethodRemark" align="center" min-width="140" show-overflow-tooltip />
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
             <template #default="scope">
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
               </el-tag>
104
               </el-tag>
92
             </template>
105
             </template>
93
           </el-table-column>
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
           <el-table-column label="考核月份" prop="assessmentMonth" align="center" min-width="120" />
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
             <template #default="scope">
111
             <template #default="scope">
99
               <el-button link type="primary" icon="Edit" @click="handleEdit(scope.row, 'non-cadre')">修改</el-button>
112
               <el-button link type="primary" icon="Edit" @click="handleEdit(scope.row, 'non-cadre')">修改</el-button>
100
               <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
113
               <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
@@ -147,8 +160,8 @@
147
         <!-- 第一部分:基础信息 -->
160
         <!-- 第一部分:基础信息 -->
148
         <el-row :gutter="20">
161
         <el-row :gutter="20">
149
           <el-col :span="8">
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
             </el-form-item>
165
             </el-form-item>
153
           </el-col>
166
           </el-col>
154
           <el-col :span="8">
167
           <el-col :span="8">
@@ -173,43 +186,39 @@
173
           <el-col :span="8">
186
           <el-col :span="8">
174
             <el-form-item label="用工形式" prop="employmentType">
187
             <el-form-item label="用工形式" prop="employmentType">
175
               <el-select v-model="nonCadreForm.employmentType" placeholder="请选择用工形式" style="width: 100%">
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
               </el-select>
190
               </el-select>
178
             </el-form-item>
191
             </el-form-item>
179
           </el-col>
192
           </el-col>
180
           <el-col :span="8">
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
             </el-form-item>
196
             </el-form-item>
184
           </el-col>
197
           </el-col>
185
           <el-col :span="8">
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
             </el-form-item>
201
             </el-form-item>
189
           </el-col>
202
           </el-col>
190
         </el-row>
203
         </el-row>
191
 
204
 
192
         <el-row :gutter="20">
205
         <el-row :gutter="20">
193
           <el-col :span="8">
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
             </el-form-item>
209
             </el-form-item>
197
           </el-col>
210
           </el-col>
198
           <el-col :span="8">
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
               </el-select>
215
               </el-select>
205
             </el-form-item>
216
             </el-form-item>
206
           </el-col>
217
           </el-col>
207
           <el-col :span="8">
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
               </el-select>
222
               </el-select>
214
             </el-form-item>
223
             </el-form-item>
215
           </el-col>
224
           </el-col>
@@ -580,10 +589,10 @@ import { ref, reactive, onMounted, getCurrentInstance, watch } from 'vue'
580
 import { ElMessage, ElMessageBox } from 'element-plus'
589
 import { ElMessage, ElMessageBox } from 'element-plus'
581
 
590
 
582
 // API导入(需要根据实际API路径调整)
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
 const { proxy } = getCurrentInstance()
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
 const loading = ref(false)
598
 const loading = ref(false)
@@ -707,14 +716,6 @@ const dialog = reactive({
707
 const nonCadreList = ref([])
716
 const nonCadreList = ref([])
708
 const cadreList = ref([])
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
 const assessmentResultOptions = [
719
 const assessmentResultOptions = [
719
   { label: '优秀', value: 'excellent' },
720
   { label: '优秀', value: 'excellent' },
720
   { label: '良好', value: 'good' },
721
   { label: '良好', value: 'good' },
@@ -774,9 +775,9 @@ const getList = async () => {
774
     }
775
     }
775
     
776
     
776
     if (currentTab.value === 'non-cadre') {
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
     } else {
781
     } else {
781
       // 干部数据API
782
       // 干部数据API
782
       const res = await listCadreAssessment(params)
783
       const res = await listCadreAssessment(params)
@@ -866,7 +867,7 @@ const handleDelete = async (row) => {
866
       type: 'warning'
867
       type: 'warning'
867
     })
868
     })
868
     
869
     
869
-    await deleteNonCadreMonthlyAssess(row.id)
870
+    await deleteNonCadreAssessment(row.id)
870
     ElMessage.success('删除成功')
871
     ElMessage.success('删除成功')
871
     getList()
872
     getList()
872
   } catch (error) {
873
   } catch (error) {
@@ -884,10 +885,10 @@ const submitForm = async () => {
884
   try {
885
   try {
885
     if (dialog.type === 'non-cadre') {
886
     if (dialog.type === 'non-cadre') {
886
       if (dialog.title === '新增非干部月度考核') {
887
       if (dialog.title === '新增非干部月度考核') {
887
-        await addNonCadreMonthlyAssess(nonCadreForm)
888
+        await addNonCadreAssessment(nonCadreForm)
888
         ElMessage.success('新增成功')
889
         ElMessage.success('新增成功')
889
       } else {
890
       } else {
890
-        await updateNonCadreMonthlyAssess(nonCadreForm)
891
+        await updateNonCadreAssessment(nonCadreForm)
891
         ElMessage.success('更新成功')
892
         ElMessage.success('更新成功')
892
       }
893
       }
893
     } else {
894
     } else {
@@ -905,7 +906,22 @@ const submitForm = async () => {
905
 // 导出
906
 // 导出
906
 const handleExport = async () => {
907
 const handleExport = async () => {
907
   try {
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
   } catch (error) {
925
   } catch (error) {
910
     ElMessage.error('导出失败')
926
     ElMessage.error('导出失败')
911
   }
927
   }