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

refactor(performanceManage): 重构月度考核模块,优化指标管理界面

feat(performanceManage): 新增月度考核汇总页面
feat(system): 更新指标分类管理功能,增加分值和单位字段
fix(system): 修复指标分类表单验证问题
huoyi 1 месяц назад
Родитель
Сommit
a5aafccd50

+ 0 - 600
src/views/performanceManage/NonCadreMonthlyAssess/index.vue

@@ -1,600 +0,0 @@
1
-<template>
2
-  <div class="app-container">
3
-    <el-card>
4
-      <!-- 查询条件 -->
5
-      <div class="filter-container">
6
-        <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
7
-          <el-form-item label="员工姓名" prop="employeeName">
8
-            <el-input v-model="queryParams.employeeName" placeholder="请输入员工姓名" clearable style="width: 200px" />
9
-          </el-form-item>
10
-          
11
-          <el-form-item label="查询月份" prop="assessmentMonth">
12
-            <el-date-picker v-model="queryParams.assessmentMonth" type="month" placeholder="请选择查询月份" 
13
-              value-format="YYYY-MM" style="width: 200px" />
14
-          </el-form-item>
15
-          
16
-          <el-form-item>
17
-            <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
18
-            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
19
-          </el-form-item>
20
-        </el-form>
21
-      </div>
22
-
23
-      <!-- 操作按钮 -->
24
-      <div class="operation-container">
25
-        <el-button type="primary" icon="Plus" @click="handleAdd">新增</el-button>
26
-        <el-button type="warning" icon="Download" @click="handleExport">导出</el-button>
27
-      </div>
28
-
29
-      <!-- 数据表格 -->
30
-      <el-table v-loading="loading" :data="assessmentList" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
31
-        <el-table-column type="index" label="序号" align="center" width="60" />
32
-        
33
-        <el-table-column label="员工姓名" prop="employeeName" align="center" min-width="120" />
34
-        <el-table-column label="用工形式" prop="employmentType" align="center" min-width="120" />
35
-        <el-table-column label="岗位" prop="position" align="center" min-width="120" />
36
-        <el-table-column label="考核组" prop="assessmentGroup" align="center" min-width="120" />
37
-        <el-table-column label="考核月份" prop="assessmentMonth" align="center" min-width="120" />
38
-        <el-table-column label="总分" prop="totalScore" align="center" min-width="100" sortable />
39
-        <el-table-column label="考核结果" prop="assessmentResult" align="center" min-width="120" />
40
-        <el-table-column label="应用方式" prop="applicationMethod" align="center" min-width="120" />
41
-        <el-table-column label="是否豁免" prop="isExempted" align="center" min-width="100">
42
-          <template #default="scope">
43
-            <el-tag :type="scope.row.isExempted ? 'success' : 'info'">
44
-              {{ scope.row.isExempted ? '是' : '否' }}
45
-            </el-tag>
46
-          </template>
47
-        </el-table-column>
48
-
49
-        <el-table-column label="操作" align="center" width="200" fixed="right">
50
-          <template #default="scope">
51
-            <el-button size="small" type="primary" link icon="Edit" @click="handleEdit(scope.row)">编辑</el-button>
52
-            <el-button size="small" type="danger" link icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
53
-          </template>
54
-        </el-table-column>
55
-      </el-table>
56
-
57
-      <!-- 分页 -->
58
-      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" 
59
-        v-model:limit="queryParams.pageSize" @pagination="getList" />
60
-    </el-card>
61
-
62
-    <!-- 编辑/新增弹窗 -->
63
-    <el-dialog :title="dialog.title" v-model="dialog.visible" width="80%" :close-on-click-modal="false">
64
-      <el-form :model="formData" ref="formRef" :rules="rules" label-width="150px" class="form-container">
65
-        <el-row :gutter="20">
66
-          <!-- 基本信息 -->
67
-          <el-col :span="8">
68
-            <el-form-item label="员工姓名" prop="employeeName">
69
-              <el-input v-model="formData.employeeName" placeholder="请输入员工姓名" />
70
-            </el-form-item>
71
-          </el-col>
72
-          <el-col :span="8">
73
-            <el-form-item label="用工形式" prop="employmentType">
74
-              <el-select v-model="formData.employmentType" placeholder="请选择用工形式">
75
-                <el-option v-for="item in employmentTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
76
-              </el-select>
77
-            </el-form-item>
78
-          </el-col>
79
-          <el-col :span="8">
80
-            <el-form-item label="岗位" prop="position">
81
-              <el-input v-model="formData.position" placeholder="请输入岗位" />
82
-            </el-form-item>
83
-          </el-col>
84
-        </el-row>
85
-
86
-        <el-row :gutter="20">
87
-          <el-col :span="8">
88
-            <el-form-item label="考核组" prop="assessmentGroup">
89
-              <el-input v-model="formData.assessmentGroup" placeholder="请输入考核组" />
90
-            </el-form-item>
91
-          </el-col>
92
-          <el-col :span="8">
93
-            <el-form-item label="分管班组长" prop="teamLeader">
94
-              <el-input v-model="formData.teamLeader" placeholder="请输入分管班组长" />
95
-            </el-form-item>
96
-          </el-col>
97
-          <el-col :span="8">
98
-            <el-form-item label="分管主管" prop="supervisor">
99
-              <el-input v-model="formData.supervisor" placeholder="请输入分管主管" />
100
-            </el-form-item>
101
-          </el-col>
102
-        </el-row>
103
-
104
-        <el-row :gutter="20">
105
-          <el-col :span="8">
106
-            <el-form-item label="分管经理" prop="manager">
107
-              <el-input v-model="formData.manager" placeholder="请输入分管经理" />
108
-            </el-form-item>
109
-          </el-col>
110
-          <el-col :span="8">
111
-            <el-form-item label="考核月份" prop="assessmentMonth">
112
-              <el-date-picker v-model="formData.assessmentMonth" type="month" placeholder="请选择考核月份" 
113
-                value-format="YYYY-MM" style="width: 100%" />
114
-            </el-form-item>
115
-          </el-col>
116
-          <el-col :span="8">
117
-            <el-form-item label="分管员工数量" prop="managedEmployeeCount">
118
-              <el-input-number v-model="formData.managedEmployeeCount" :min="0" controls-position="right" style="width: 100%" />
119
-            </el-form-item>
120
-          </el-col>
121
-        </el-row>
122
-
123
-        <!-- 红线指标 -->
124
-        <el-divider content-position="left">红线指标</el-divider>
125
-        <el-row :gutter="20">
126
-          <el-col :span="12">
127
-            <el-form-item label="红线指标触发次数" prop="redLineTriggerCount">
128
-              <el-input-number v-model="formData.redLineTriggerCount" :min="0" controls-position="right" style="width: 100%" />
129
-            </el-form-item>
130
-          </el-col>
131
-          <el-col :span="12">
132
-            <el-form-item label="红线指标依据" prop="redLineBasis">
133
-              <el-input v-model="formData.redLineBasis" type="textarea" :rows="2" placeholder="请输入红线指标依据" />
134
-            </el-form-item>
135
-          </el-col>
136
-        </el-row>
137
-
138
-        <!-- 核心指标 -->
139
-        <el-divider content-position="left">核心指标</el-divider>
140
-        <el-row :gutter="20">
141
-          <el-col :span="12">
142
-            <el-form-item label="核心指标分值" prop="coreIndicatorScore">
143
-              <el-input-number v-model="formData.coreIndicatorScore" :min="0" :precision="2" controls-position="right" style="width: 100%" />
144
-            </el-form-item>
145
-          </el-col>
146
-          <el-col :span="12">
147
-            <el-form-item label="核心指标依据" prop="coreIndicatorBasis">
148
-              <el-input v-model="formData.coreIndicatorBasis" type="textarea" :rows="2" placeholder="请输入核心指标依据" />
149
-            </el-form-item>
150
-          </el-col>
151
-        </el-row>
152
-
153
-        <!-- 其他指标 -->
154
-        <el-divider content-position="left">其他指标</el-divider>
155
-        <el-row :gutter="20">
156
-          <el-col :span="12">
157
-            <el-form-item label="其他指标分值" prop="otherIndicatorScore">
158
-              <el-input-number v-model="formData.otherIndicatorScore" :min="0" :precision="2" controls-position="right" style="width: 100%" />
159
-            </el-form-item>
160
-          </el-col>
161
-          <el-col :span="12">
162
-            <el-form-item label="其他指标依据" prop="otherIndicatorBasis">
163
-              <el-input v-model="formData.otherIndicatorBasis" type="textarea" :rows="2" placeholder="请输入其他指标依据" />
164
-            </el-form-item>
165
-          </el-col>
166
-        </el-row>
167
-
168
-        <!-- 安全指标(含SOC/站品控检查扣分) -->
169
-        <el-divider content-position="left">安全指标(含SOC/站品控检查扣分)</el-divider>
170
-        <el-row :gutter="20">
171
-          <el-col :span="12">
172
-            <el-form-item label="安全指标分值(含SOC)" prop="safetyIndicatorScoreWithSOC">
173
-              <el-input-number v-model="formData.safetyIndicatorScoreWithSOC" :min="0" :precision="2" controls-position="right" style="width: 100%" />
174
-            </el-form-item>
175
-          </el-col>
176
-          <el-col :span="12">
177
-            <el-form-item label="安全指标依据(含SOC)" prop="safetyIndicatorBasisWithSOC">
178
-              <el-input v-model="formData.safetyIndicatorBasisWithSOC" type="textarea" :rows="2" placeholder="请输入安全指标依据" />
179
-            </el-form-item>
180
-          </el-col>
181
-        </el-row>
182
-
183
-        <!-- 安全指标(不含SOC/站品控检查扣分) -->
184
-        <el-divider content-position="left">安全指标(不含SOC/站品控检查扣分)</el-divider>
185
-        <el-row :gutter="20">
186
-          <el-col :span="12">
187
-            <el-form-item label="安全指标分值(不含SOC)" prop="safetyIndicatorScoreWithoutSOC">
188
-              <el-input-number v-model="formData.safetyIndicatorScoreWithoutSOC" :min="0" :precision="2" controls-position="right" style="width: 100%" />
189
-            </el-form-item>
190
-          </el-col>
191
-          <el-col :span="12">
192
-            <el-form-item label="安全指标依据(不含SOC)" prop="safetyIndicatorBasisWithoutSOC">
193
-              <el-input v-model="formData.safetyIndicatorBasisWithoutSOC" type="textarea" :rows="2" placeholder="请输入安全指标依据" />
194
-            </el-form-item>
195
-          </el-col>
196
-        </el-row>
197
-
198
-        <!-- 非安全指标 -->
199
-        <el-divider content-position="left">非安全指标</el-divider>
200
-        <el-row :gutter="20">
201
-          <el-col :span="12">
202
-            <el-form-item label="非安全指标扣分" prop="nonSafetyIndicatorDeduction">
203
-              <el-input-number v-model="formData.nonSafetyIndicatorDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
204
-            </el-form-item>
205
-          </el-col>
206
-          <el-col :span="12">
207
-            <el-form-item label="非安全指标扣分依据" prop="nonSafetyIndicatorBasis">
208
-              <el-input v-model="formData.nonSafetyIndicatorBasis" type="textarea" :rows="2" placeholder="请输入非安全指标扣分依据" />
209
-            </el-form-item>
210
-          </el-col>
211
-        </el-row>
212
-
213
-        <!-- 综合扣分 -->
214
-        <el-divider content-position="left">综合扣分</el-divider>
215
-        <el-row :gutter="20">
216
-          <el-col :span="12">
217
-            <el-form-item label="非核心安全+核心扣分" prop="nonCoreSafetyCoreDeduction">
218
-              <el-input-number v-model="formData.nonCoreSafetyCoreDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
219
-            </el-form-item>
220
-          </el-col>
221
-          <el-col :span="12">
222
-            <el-form-item label="SOC/站品控检查涉及扣分" prop="socInspectionDeduction">
223
-              <el-input-number v-model="formData.socInspectionDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
224
-            </el-form-item>
225
-          </el-col>
226
-        </el-row>
227
-
228
-        <el-row :gutter="20">
229
-          <el-col :span="24">
230
-            <el-form-item label="SOC/站品控检查扣分依据" prop="socInspectionBasis">
231
-              <el-input v-model="formData.socInspectionBasis" type="textarea" :rows="2" placeholder="请输入SOC/站品控检查扣分依据" />
232
-            </el-form-item>
233
-          </el-col>
234
-        </el-row>
235
-
236
-        <!-- 统计信息 -->
237
-        <el-divider content-position="left">统计信息</el-divider>
238
-        <el-row :gutter="20">
239
-          <el-col :span="8">
240
-            <el-form-item label="扣分平均值" prop="averageDeduction">
241
-              <el-input-number v-model="formData.averageDeduction" :min="0" :precision="2" controls-position="right" style="width: 100%" />
242
-            </el-form-item>
243
-          </el-col>
244
-          <el-col :span="8">
245
-            <el-form-item label="总分" prop="totalScore">
246
-              <el-input-number v-model="formData.totalScore" :min="0" :precision="2" controls-position="right" style="width: 100%" />
247
-            </el-form-item>
248
-          </el-col>
249
-          <el-col :span="8">
250
-            <el-form-item label="奖励(元)" prop="rewardAmount">
251
-              <el-input-number v-model="formData.rewardAmount" :min="0" :precision="2" controls-position="right" style="width: 100%" />
252
-            </el-form-item>
253
-          </el-col>
254
-        </el-row>
255
-
256
-        <el-row :gutter="20">
257
-          <el-col :span="8">
258
-            <el-form-item label="扣罚(元)" prop="penaltyAmount">
259
-              <el-input-number v-model="formData.penaltyAmount" :min="0" :precision="2" controls-position="right" style="width: 100%" />
260
-            </el-form-item>
261
-          </el-col>
262
-          <el-col :span="8">
263
-            <el-form-item label="考核结果" prop="assessmentResult">
264
-              <el-select v-model="formData.assessmentResult" placeholder="请选择考核结果">
265
-                <el-option v-for="item in assessmentResultOptions" :key="item.value" :label="item.label" :value="item.value" />
266
-              </el-select>
267
-            </el-form-item>
268
-          </el-col>
269
-          <el-col :span="8">
270
-            <el-form-item label="应用方式" prop="applicationMethod">
271
-              <el-select v-model="formData.applicationMethod" placeholder="请选择应用方式">
272
-                <el-option v-for="item in applicationMethodOptions" :key="item.value" :label="item.label" :value="item.value" />
273
-              </el-select>
274
-            </el-form-item>
275
-          </el-col>
276
-        </el-row>
277
-
278
-        <!-- 备注信息 -->
279
-        <el-divider content-position="left">备注信息</el-divider>
280
-        <el-row :gutter="20">
281
-          <el-col :span="12">
282
-            <el-form-item label="奖励明细" prop="rewardDetails">
283
-              <el-input v-model="formData.rewardDetails" type="textarea" :rows="3" placeholder="请输入奖励明细" />
284
-            </el-form-item>
285
-          </el-col>
286
-          <el-col :span="12">
287
-            <el-form-item label="惩罚明细" prop="penaltyDetails">
288
-              <el-input v-model="formData.penaltyDetails" type="textarea" :rows="3" placeholder="请输入惩罚明细" />
289
-            </el-form-item>
290
-          </el-col>
291
-        </el-row>
292
-
293
-        <el-row :gutter="20">
294
-          <el-col :span="12">
295
-            <el-form-item label="考核结果备注" prop="assessmentResultRemark">
296
-              <el-input v-model="formData.assessmentResultRemark" type="textarea" :rows="2" placeholder="请输入考核结果备注" />
297
-            </el-form-item>
298
-          </el-col>
299
-          <el-col :span="12">
300
-            <el-form-item label="应用方式备注" prop="applicationMethodRemark">
301
-              <el-input v-model="formData.applicationMethodRemark" type="textarea" :rows="2" placeholder="请输入应用方式备注" />
302
-            </el-form-item>
303
-          </el-col>
304
-        </el-row>
305
-
306
-        <!-- 豁免信息 -->
307
-        <el-divider content-position="left">豁免信息</el-divider>
308
-        <el-row :gutter="20">
309
-          <el-col :span="12">
310
-            <el-form-item label="是否豁免" prop="isExempted">
311
-              <el-switch v-model="formData.isExempted" active-text="是" inactive-text="否" />
312
-            </el-form-item>
313
-          </el-col>
314
-          <el-col :span="12">
315
-            <el-form-item label="是否豁免备注" prop="exemptionRemark">
316
-              <el-input v-model="formData.exemptionRemark" type="textarea" :rows="2" placeholder="请输入豁免备注" />
317
-            </el-form-item>
318
-          </el-col>
319
-        </el-row>
320
-      </el-form>
321
-
322
-      <template #footer>
323
-        <div class="dialog-footer">
324
-          <el-button @click="dialog.visible = false">取消</el-button>
325
-          <el-button type="primary" @click="submitForm">确定</el-button>
326
-        </div>
327
-      </template>
328
-    </el-dialog>
329
-  </div>
330
-</template>
331
-
332
-<script setup>
333
-import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
334
-import { ElMessage, ElMessageBox } from 'element-plus'
335
-
336
-// API导入(需要根据实际API路径调整)
337
-import { getNonCadreMonthlyAssessList, addNonCadreMonthlyAssess, updateNonCadreMonthlyAssess, deleteNonCadreMonthlyAssess } from '@/api/performance/nonCadreMonthlyAssess.js'
338
-
339
-const { proxy } = getCurrentInstance()
340
-
341
-// 响应式数据
342
-const loading = ref(false)
343
-const total = ref(0)
344
-const queryFormRef = ref()
345
-const formRef = ref()
346
-
347
-// 查询参数
348
-const queryParams = reactive({
349
-  pageNum: 1,
350
-  pageSize: 10,
351
-  employeeName: '',
352
-  assessmentMonth: ''
353
-})
354
-
355
-// 表单数据
356
-const formData = reactive({
357
-  // 基本信息
358
-  employeeName: '',
359
-  employmentType: '',
360
-  position: '',
361
-  assessmentGroup: '',
362
-  teamLeader: '',
363
-  supervisor: '',
364
-  manager: '',
365
-  assessmentMonth: '',
366
-  managedEmployeeCount: 0,
367
-  
368
-  // 红线指标
369
-  redLineTriggerCount: 0,
370
-  redLineBasis: '',
371
-  
372
-  // 核心指标
373
-  coreIndicatorScore: 0,
374
-  coreIndicatorBasis: '',
375
-  
376
-  // 其他指标
377
-  otherIndicatorScore: 0,
378
-  otherIndicatorBasis: '',
379
-  
380
-  // 安全指标(含SOC)
381
-  safetyIndicatorScoreWithSOC: 0,
382
-  safetyIndicatorBasisWithSOC: '',
383
-  
384
-  // 安全指标(不含SOC)
385
-  safetyIndicatorScoreWithoutSOC: 0,
386
-  safetyIndicatorBasisWithoutSOC: '',
387
-  
388
-  // 非安全指标
389
-  nonSafetyIndicatorDeduction: 0,
390
-  nonSafetyIndicatorBasis: '',
391
-  
392
-  // 综合扣分
393
-  nonCoreSafetyCoreDeduction: 0,
394
-  socInspectionDeduction: 0,
395
-  socInspectionBasis: '',
396
-  
397
-  // 统计信息
398
-  averageDeduction: 0,
399
-  totalScore: 0,
400
-  rewardAmount: 0,
401
-  penaltyAmount: 0,
402
-  assessmentResult: '',
403
-  applicationMethod: '',
404
-  
405
-  // 备注信息
406
-  rewardDetails: '',
407
-  penaltyDetails: '',
408
-  assessmentResultRemark: '',
409
-  applicationMethodRemark: '',
410
-  
411
-  // 豁免信息
412
-  isExempted: false,
413
-  exemptionRemark: ''
414
-})
415
-
416
-// 弹窗配置
417
-const dialog = reactive({
418
-  visible: false,
419
-  title: ''
420
-})
421
-
422
-// 数据列表
423
-const assessmentList = ref([])
424
-
425
-// 选项配置
426
-const employmentTypeOptions = [
427
-  { label: '正式员工', value: 'formal' },
428
-  { label: '合同工', value: 'contract' },
429
-  { label: '临时工', value: 'temporary' },
430
-  { label: '实习生', value: 'intern' }
431
-]
432
-
433
-const assessmentResultOptions = [
434
-  { label: '优秀', value: 'excellent' },
435
-  { label: '良好', value: 'good' },
436
-  { label: '合格', value: 'qualified' },
437
-  { label: '不合格', value: 'unqualified' }
438
-]
439
-
440
-const applicationMethodOptions = [
441
-  { label: '直接应用', value: 'direct' },
442
-  { label: '加权计算', value: 'weighted' },
443
-  { label: '特殊处理', value: 'special' }
444
-]
445
-
446
-// 表单验证规则
447
-const rules = {
448
-  employeeName: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }],
449
-  employmentType: [{ required: true, message: '用工形式不能为空', trigger: 'change' }],
450
-  position: [{ required: true, message: '岗位不能为空', trigger: 'blur' }],
451
-  assessmentGroup: [{ required: true, message: '考核组不能为空', trigger: 'blur' }],
452
-  assessmentMonth: [{ required: true, message: '考核月份不能为空', trigger: 'change' }]
453
-}
454
-
455
-// 获取数据列表
456
-const getList = async () => {
457
-  loading.value = true
458
-  try {
459
-    const res = await getNonCadreMonthlyAssessList(queryParams)
460
-    assessmentList.value = res.rows || []
461
-    total.value = res.total || 0
462
-  } catch (error) {
463
-    console.error('获取数据失败:', error)
464
-    ElMessage.error('获取数据失败')
465
-  } finally {
466
-    loading.value = false
467
-  }
468
-}
469
-
470
-// 查询
471
-const handleQuery = () => {
472
-  queryParams.pageNum = 1
473
-  getList()
474
-}
475
-
476
-// 重置查询
477
-const resetQuery = () => {
478
-  queryFormRef.value?.resetFields()
479
-  queryParams.pageNum = 1
480
-  getList()
481
-}
482
-
483
-// 新增
484
-const handleAdd = () => {
485
-  dialog.visible = true
486
-  dialog.title = '新增非干部月度考核'
487
-  
488
-  // 重置表单数据
489
-  Object.keys(formData).forEach(key => {
490
-    if (typeof formData[key] === 'number') {
491
-      formData[key] = 0
492
-    } else if (typeof formData[key] === 'boolean') {
493
-      formData[key] = false
494
-    } else {
495
-      formData[key] = ''
496
-    }
497
-  })
498
-}
499
-
500
-// 编辑
501
-const handleEdit = (row) => {
502
-  dialog.visible = true
503
-  dialog.title = '编辑非干部月度考核'
504
-  
505
-  // 填充表单数据
506
-  Object.keys(formData).forEach(key => {
507
-    if (row[key] !== undefined) {
508
-      formData[key] = row[key]
509
-    }
510
-  })
511
-}
512
-
513
-// 删除
514
-const handleDelete = async (row) => {
515
-  try {
516
-    await ElMessageBox.confirm('确认删除该考核记录吗?', '提示', {
517
-      confirmButtonText: '确定',
518
-      cancelButtonText: '取消',
519
-      type: 'warning'
520
-    })
521
-    
522
-    await deleteNonCadreMonthlyAssess(row.id)
523
-    ElMessage.success('删除成功')
524
-    getList()
525
-  } catch (error) {
526
-    if (error !== 'cancel') {
527
-      ElMessage.error('删除失败')
528
-    }
529
-  }
530
-}
531
-
532
-// 提交表单
533
-const submitForm = async () => {
534
-  const valid = await formRef.value?.validate()
535
-  if (!valid) return
536
-  
537
-  try {
538
-    if (dialog.title === '新增非干部月度考核') {
539
-      await addNonCadreMonthlyAssess(formData)
540
-      ElMessage.success('新增成功')
541
-    } else {
542
-      await updateNonCadreMonthlyAssess(formData)
543
-      ElMessage.success('更新成功')
544
-    }
545
-    
546
-    dialog.visible = false
547
-    getList()
548
-  } catch (error) {
549
-    ElMessage.error('操作失败')
550
-  }
551
-}
552
-
553
-// 导出
554
-const handleExport = async () => {
555
-  try {
556
-    // 导出逻辑(需要根据实际API实现)
557
-    ElMessage.success('导出功能开发中')
558
-  } catch (error) {
559
-    ElMessage.error('导出失败')
560
-  }
561
-}
562
-
563
-onMounted(() => {
564
-  getList()
565
-})
566
-</script>
567
-
568
-<style lang="less" scoped>
569
-.app-container {
570
-  padding: 20px;
571
-}
572
-
573
-.filter-container {
574
-  margin-bottom: 20px;
575
-}
576
-
577
-.search-form {
578
-  display: flex;
579
-  flex-wrap: wrap;
580
-  gap: 10px;
581
-}
582
-
583
-.operation-container {
584
-  margin-bottom: 20px;
585
-}
586
-
587
-.form-container {
588
-  max-height: 70vh;
589
-  overflow-y: auto;
590
-  padding-right: 10px;
591
-}
592
-
593
-.el-divider {
594
-  margin: 20px 0;
595
-}
596
-
597
-:deep(.el-form-item__label) {
598
-  font-weight: 500;
599
-}
600
-</style>

+ 0 - 172
src/views/performanceManage/NonCadreMonthlyAssessSum/index.vue

@@ -1,172 +0,0 @@
1
-<template>
2
-  <div class="app-container">
3
-    <el-card>
4
-      <!-- 查询条件 -->
5
-      <div class="filter-container">
6
-        <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
7
-          <el-form-item label="查询月份" prop="assessmentMonth">
8
-            <el-date-picker v-model="queryParams.assessmentMonth" type="month" placeholder="请选择查询月份" 
9
-              value-format="YYYY-MM" style="width: 200px" />
10
-          </el-form-item>
11
-          
12
-          <el-form-item>
13
-            <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
14
-            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
15
-          </el-form-item>
16
-        </el-form>
17
-      </div>
18
-
19
-      <!-- 操作按钮 -->
20
-      <div class="operation-container">
21
-        <el-button type="warning" icon="Download" @click="handleExport">导出</el-button>
22
-      </div>
23
-
24
-      <!-- 汇总表格 -->
25
-      <el-table v-loading="loading" :data="summaryData" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
26
-        <!-- 区间列 -->
27
-        <el-table-column prop="rangeName" label="区间" align="center" min-width="150" fixed />
28
-
29
-        <!-- 一队 -->
30
-        <el-table-column label="一队" align="center" min-width="120">
31
-          <template #default="scope">
32
-            {{ scope.row.team1 || '-' }}
33
-          </template>
34
-        </el-table-column>
35
-
36
-        <!-- 二队 -->
37
-        <el-table-column label="二队" align="center" min-width="120">
38
-          <template #default="scope">
39
-            {{ scope.row.team2 || '-' }}
40
-          </template>
41
-        </el-table-column>
42
-
43
-        <!-- 三队 -->
44
-        <el-table-column label="三队" align="center" min-width="120">
45
-          <template #default="scope">
46
-            {{ scope.row.team3 || '-' }}
47
-          </template>
48
-        </el-table-column>
49
-
50
-        <!-- 综合大队 -->
51
-        <el-table-column label="综合大队" align="center" min-width="120">
52
-          <template #default="scope">
53
-            {{ scope.row.comprehensiveBrigade || '-' }}
54
-          </template>
55
-        </el-table-column>
56
-
57
-        <!-- 品控 -->
58
-        <el-table-column label="品控" align="center" min-width="120">
59
-          <template #default="scope">
60
-            {{ scope.row.qualityControl || '-' }}
61
-          </template>
62
-        </el-table-column>
63
-
64
-        <!-- 培训 -->
65
-        <el-table-column label="培训" align="center" min-width="120">
66
-          <template #default="scope">
67
-            {{ scope.row.training || '-' }}
68
-          </template>
69
-        </el-table-column>
70
-
71
-        <!-- 设备 -->
72
-        <el-table-column label="设备" align="center" min-width="120">
73
-          <template #default="scope">
74
-            {{ scope.row.equipment || '-' }}
75
-          </template>
76
-        </el-table-column>
77
-
78
-        <!-- 综管 -->
79
-        <el-table-column label="综管" align="center" min-width="120">
80
-          <template #default="scope">
81
-            {{ scope.row.comprehensiveManagement || '-' }}
82
-          </template>
83
-        </el-table-column>
84
-      </el-table>
85
-    </el-card>
86
-  </div>
87
-</template>
88
-
89
-<script setup>
90
-import { ref, reactive, onMounted } from 'vue'
91
-import { ElMessage } from 'element-plus'
92
-
93
-// API导入
94
-import { getNonCadreMonthlyAssessSummary } from '@/api/performance/nonCadreMonthlyAssessSummary.js'
95
-
96
-// 响应式数据
97
-const loading = ref(false)
98
-const queryFormRef = ref()
99
-
100
-// 查询参数
101
-const queryParams = reactive({
102
-  assessmentMonth: ''
103
-})
104
-
105
-// 汇总数据
106
-const summaryData = ref([])
107
-
108
-// 获取汇总数据
109
-const getList = async () => {
110
-  loading.value = true
111
-  try {
112
-    const res = await getNonCadreMonthlyAssessSummary(queryParams)
113
-    summaryData.value = res.data || []
114
-  } catch (error) {
115
-    console.error('获取汇总数据失败:', error)
116
-    ElMessage.error('获取汇总数据失败')
117
-  } finally {
118
-    loading.value = false
119
-  }
120
-}
121
-
122
-// 查询
123
-const handleQuery = () => {
124
-  getList()
125
-}
126
-
127
-// 重置查询
128
-const resetQuery = () => {
129
-  queryFormRef.value?.resetFields()
130
-  getList()
131
-}
132
-
133
-// 导出
134
-const handleExport = async () => {
135
-  try {
136
-    ElMessage.success('导出功能开发中')
137
-  } catch (error) {
138
-    ElMessage.error('导出失败')
139
-  }
140
-}
141
-
142
-onMounted(() => {
143
-  getList()
144
-})
145
-</script>
146
-
147
-<style lang="less" scoped>
148
-.app-container {
149
-  padding: 20px;
150
-}
151
-
152
-.filter-container {
153
-  margin-bottom: 20px;
154
-}
155
-
156
-.search-form {
157
-  display: flex;
158
-  flex-wrap: wrap;
159
-  gap: 10px;
160
-}
161
-
162
-.operation-container {
163
-  margin-bottom: 20px;
164
-}
165
-
166
-:deep(.el-table) {
167
-  .el-table__header th {
168
-    background-color: #f5f7fa;
169
-    font-weight: 600;
170
-  }
171
-}
172
-</style>

+ 0 - 0
src/views/performanceManage/NonCadreMonthlyScoreSum/非干部月度考核分数汇总


+ 847 - 0
src/views/performanceManage/monthlyAssess/index.vue

@@ -0,0 +1,847 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-card>
4
+      <!-- 顶部切换 -->
5
+      <div class="tab-container">
6
+        <el-radio-group v-model="currentTab" size="large">
7
+          <el-radio-button value="non-cadre">非干部</el-radio-button>
8
+          <el-radio-button value="cadre">干部</el-radio-button>
9
+        </el-radio-group>
10
+      </div>
11
+
12
+      <!-- 查询条件 -->
13
+      <div class="filter-container">
14
+        <el-form :model="queryParams" ref="queryFormRef" :inline="true" class="search-form">
15
+          <el-form-item label="姓名" prop="employeeName">
16
+            <el-input v-model="queryParams.employeeName" placeholder="请输入姓名" clearable style="width: 200px" />
17
+          </el-form-item>
18
+          
19
+          <el-form-item label="考核月份" prop="assessmentMonth">
20
+            <el-date-picker v-model="queryParams.assessmentMonth" type="month" placeholder="请选择考核月份" 
21
+              value-format="YYYY-MM" style="width: 200px" />
22
+          </el-form-item>
23
+          
24
+          <el-form-item>
25
+            <el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
26
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
27
+          </el-form-item>
28
+        </el-form>
29
+      </div>
30
+
31
+      <!-- 操作按钮 -->
32
+      <div class="operation-container">
33
+        <!-- 非干部操作按钮 -->
34
+        <div v-if="currentTab === 'non-cadre'" class="left-buttons">
35
+          <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
36
+          <el-button type="warning" plain icon="Download" @click="handleExport">导出</el-button>
37
+        </div>
38
+        <!-- 干部模式时显示空白占位 -->
39
+        <div v-else class="left-buttons"></div>
40
+        
41
+        <div class="right-buttons">
42
+          <el-button type="primary" @click="generateMonthlyAssessment">生成本月考核表</el-button>
43
+        </div>
44
+      </div>
45
+
46
+      <!-- 非干部数据表格 -->
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;">
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 />
62
+          
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 />
65
+          
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 />
68
+          
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 />
71
+          
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 />
75
+          
76
+          <el-table-column label="分管员工数量" prop="managedEmployeeCount" align="center" min-width="120" />
77
+          <el-table-column label="扣分平均值" prop="averageDeduction" align="center" min-width="100" />
78
+          <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 />
81
+          <el-table-column label="奖励(元)" prop="rewardAmount" align="center" min-width="100" />
82
+          <el-table-column label="扣罚(元)" prop="penaltyAmount" align="center" min-width="100" />
83
+          <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 />
85
+          <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 />
87
+          <el-table-column label="是否豁免" prop="isExempted" align="center" min-width="100">
88
+            <template #default="scope">
89
+              <el-tag :type="scope.row.isExempted ? 'success' : 'info'">
90
+                {{ scope.row.isExempted ? '是' : '否' }}
91
+              </el-tag>
92
+            </template>
93
+          </el-table-column>
94
+          <el-table-column label="是否豁免备注" prop="exemptionRemark" align="center" min-width="140" show-overflow-tooltip />
95
+          <el-table-column label="考核月份" prop="assessmentMonth" align="center" min-width="120" />
96
+
97
+          <el-table-column label="操作" align="center" width="150" fixed="right">
98
+            <template #default="scope">
99
+              <el-button size="small" type="primary" link @click="handleEdit(scope.row, 'non-cadre')">修改</el-button>
100
+              <el-button size="small" type="danger" link @click="handleDelete(scope.row)">删除</el-button>
101
+            </template>
102
+          </el-table-column>
103
+        </el-table>
104
+      </div>
105
+
106
+      <!-- 干部数据表格 -->
107
+      <div v-else>
108
+        <el-table v-loading="loading" :data="cadreList" border fit highlight-current-row style="width: 100%; margin-top: 20px;">
109
+          <el-table-column label="员工姓名" prop="employeeName" align="center" min-width="120" />
110
+          <el-table-column label="岗位" prop="position" align="center" min-width="120" />
111
+          <el-table-column label="区域" prop="area" align="center" min-width="100" />
112
+          <el-table-column label="红线扣分" prop="redLineDeduction" align="center" min-width="100" />
113
+          <el-table-column label="红线扣分豁免情况" prop="redLineExemption" align="center" min-width="140" show-overflow-tooltip />
114
+          <el-table-column label="违规排名扣分" prop="violationRankingDeduction" align="center" min-width="140" />
115
+          <el-table-column label="违规排名扣分豁免情况" prop="violationRankingExemption" align="center" min-width="180" show-overflow-tooltip />
116
+          <el-table-column label="技能排名扣分" prop="skillRankingDeduction" align="center" min-width="140" />
117
+          <el-table-column label="技能排名扣分豁免情况" prop="skillRankingExemption" align="center" min-width="180" show-overflow-tooltip />
118
+          <el-table-column label="总分" prop="totalScore" align="center" min-width="100" sortable />
119
+          <el-table-column label="考核结果" prop="assessmentResult" align="center" min-width="120" />
120
+          <el-table-column label="考核结果备注" prop="assessmentResultRemark" align="center" min-width="140" show-overflow-tooltip />
121
+          <el-table-column label="考核月份" prop="assessmentMonth" align="center" min-width="120" />
122
+          <el-table-column label="应用方式" prop="applicationMethod" align="center" min-width="120" />
123
+          <el-table-column label="应用方式备注" prop="applicationMethodRemark" align="center" min-width="160" show-overflow-tooltip />
124
+
125
+          <el-table-column label="操作" align="center" width="150" fixed="right">
126
+            <template #default="scope">
127
+              <el-button size="small" type="primary" link @click="handleEdit(scope.row, 'cadre')">修改</el-button>
128
+              <el-button size="small" type="danger" link @click="handleDelete(scope.row)">删除</el-button>
129
+            </template>
130
+          </el-table-column>
131
+        </el-table>
132
+      </div>
133
+
134
+      <!-- 分页 -->
135
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" 
136
+        v-model:limit="queryParams.pageSize" @pagination="getList" />
137
+    </el-card>
138
+
139
+    <!-- 编辑/新增弹窗 -->
140
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="80%" :close-on-click-modal="false">
141
+      <!-- 非干部表单 -->
142
+      <el-form v-if="dialog.type === 'non-cadre'" :model="nonCadreForm" ref="formRef" :rules="nonCadreRules" label-width="180px" class="form-container">
143
+        <el-row :gutter="20">
144
+          <el-col :span="8">
145
+            <el-form-item label="大队" prop="brigade">
146
+              <el-input v-model="nonCadreForm.brigade" placeholder="请输入大队" />
147
+            </el-form-item>
148
+          </el-col>
149
+          <el-col :span="8">
150
+            <el-form-item label="用工形式" prop="employmentType">
151
+              <el-select v-model="nonCadreForm.employmentType" placeholder="请选择用工形式" style="width: 100%">
152
+                <el-option v-for="item in employmentTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
153
+              </el-select>
154
+            </el-form-item>
155
+          </el-col>
156
+          <el-col :span="8">
157
+            <el-form-item label="员工编号" prop="employeeCode">
158
+              <el-input v-model="nonCadreForm.employeeCode" placeholder="请输入员工编号" />
159
+            </el-form-item>
160
+          </el-col>
161
+        </el-row>
162
+
163
+        <el-row :gutter="20">
164
+          <el-col :span="8">
165
+            <el-form-item label="员工姓名" prop="employeeName">
166
+              <el-input v-model="nonCadreForm.employeeName" placeholder="请输入员工姓名" />
167
+            </el-form-item>
168
+          </el-col>
169
+          <el-col :span="8">
170
+            <el-form-item label="考核组" prop="assessmentGroup">
171
+              <el-input v-model="nonCadreForm.assessmentGroup" placeholder="请输入考核组" />
172
+            </el-form-item>
173
+          </el-col>
174
+          <el-col :span="8">
175
+            <el-form-item label="考核月份" prop="assessmentMonth">
176
+              <el-date-picker v-model="nonCadreForm.assessmentMonth" type="month" placeholder="请选择考核月份" 
177
+                value-format="YYYY-MM" style="width: 100%" />
178
+            </el-form-item>
179
+          </el-col>
180
+        </el-row>
181
+
182
+        <el-row :gutter="20">
183
+          <el-col :span="8">
184
+            <el-form-item label="分管班组长" prop="teamLeader">
185
+              <el-input v-model="nonCadreForm.teamLeader" placeholder="请输入分管班组长" />
186
+            </el-form-item>
187
+          </el-col>
188
+          <el-col :span="8">
189
+            <el-form-item label="分管主管" prop="supervisor">
190
+              <el-input v-model="nonCadreForm.supervisor" placeholder="请输入分管主管" />
191
+            </el-form-item>
192
+          </el-col>
193
+          <el-col :span="8">
194
+            <el-form-item label="分管员工数量" prop="managedEmployeeCount">
195
+              <el-input-number v-model="nonCadreForm.managedEmployeeCount" :min="0" style="width: 100%" />
196
+            </el-form-item>
197
+          </el-col>
198
+        </el-row>
199
+
200
+        <el-divider content-position="left">红线指标</el-divider>
201
+        <el-row :gutter="20">
202
+          <el-col :span="12">
203
+            <el-form-item label="红线指标触发次数" prop="redLineTriggerCount">
204
+              <el-input-number v-model="nonCadreForm.redLineTriggerCount" :min="0" style="width: 100%" />
205
+            </el-form-item>
206
+          </el-col>
207
+          <el-col :span="12">
208
+            <el-form-item label="红线指标依据" prop="redLineBasis">
209
+              <el-input v-model="nonCadreForm.redLineBasis" type="textarea" :rows="2" placeholder="请输入红线指标依据" />
210
+            </el-form-item>
211
+          </el-col>
212
+        </el-row>
213
+
214
+        <el-divider content-position="left">核心指标</el-divider>
215
+        <el-row :gutter="20">
216
+          <el-col :span="12">
217
+            <el-form-item label="核心指标分值" prop="coreIndicatorScore">
218
+              <el-input-number v-model="nonCadreForm.coreIndicatorScore" :min="0" :precision="2" style="width: 100%" />
219
+            </el-form-item>
220
+          </el-col>
221
+          <el-col :span="12">
222
+            <el-form-item label="核心指标依据" prop="coreIndicatorBasis">
223
+              <el-input v-model="nonCadreForm.coreIndicatorBasis" type="textarea" :rows="2" placeholder="请输入核心指标依据" />
224
+            </el-form-item>
225
+          </el-col>
226
+        </el-row>
227
+
228
+        <el-divider content-position="left">其他指标</el-divider>
229
+        <el-row :gutter="20">
230
+          <el-col :span="12">
231
+            <el-form-item label="其他指标分值" prop="otherIndicatorScore">
232
+              <el-input-number v-model="nonCadreForm.otherIndicatorScore" :min="0" :precision="2" style="width: 100%" />
233
+            </el-form-item>
234
+          </el-col>
235
+          <el-col :span="12">
236
+            <el-form-item label="其他指标依据" prop="otherIndicatorBasis">
237
+              <el-input v-model="nonCadreForm.otherIndicatorBasis" type="textarea" :rows="2" placeholder="请输入其他指标依据" />
238
+            </el-form-item>
239
+          </el-col>
240
+        </el-row>
241
+
242
+        <el-divider content-position="left">其他指标中的安全(仅含SOC/站品控检查扣分)</el-divider>
243
+        <el-row :gutter="20">
244
+          <el-col :span="12">
245
+            <el-form-item label="分值" prop="safetyWithSocScore">
246
+              <el-input-number v-model="nonCadreForm.safetyWithSocScore" :min="0" :precision="2" style="width: 100%" />
247
+            </el-form-item>
248
+          </el-col>
249
+          <el-col :span="12">
250
+            <el-form-item label="依据" prop="safetyWithSocBasis">
251
+              <el-input v-model="nonCadreForm.safetyWithSocBasis" type="textarea" :rows="2" placeholder="请输入依据" />
252
+            </el-form-item>
253
+          </el-col>
254
+        </el-row>
255
+
256
+        <el-divider content-position="left">其他指标中的安全(不含SOC/站品控检查扣分)</el-divider>
257
+        <el-row :gutter="20">
258
+          <el-col :span="12">
259
+            <el-form-item label="分值" prop="safetyWithoutSocScore">
260
+              <el-input-number v-model="nonCadreForm.safetyWithoutSocScore" :min="0" :precision="2" style="width: 100%" />
261
+            </el-form-item>
262
+          </el-col>
263
+          <el-col :span="12">
264
+            <el-form-item label="依据" prop="safetyWithoutSocBasis">
265
+              <el-input v-model="nonCadreForm.safetyWithoutSocBasis" type="textarea" :rows="2" placeholder="请输入依据" />
266
+            </el-form-item>
267
+          </el-col>
268
+        </el-row>
269
+
270
+        <el-divider content-position="left">其他指标中的非安全指标扣分</el-divider>
271
+        <el-row :gutter="20">
272
+          <el-col :span="12">
273
+            <el-form-item label="扣分" prop="nonSafetyDeduction">
274
+              <el-input-number v-model="nonCadreForm.nonSafetyDeduction" :min="0" :precision="2" style="width: 100%" />
275
+            </el-form-item>
276
+          </el-col>
277
+          <el-col :span="12">
278
+            <el-form-item label="依据" prop="nonSafetyDeductionBasis">
279
+              <el-input v-model="nonCadreForm.nonSafetyDeductionBasis" type="textarea" :rows="2" placeholder="请输入依据" />
280
+            </el-form-item>
281
+          </el-col>
282
+        </el-row>
283
+
284
+        <el-divider content-position="left">综合扣分</el-divider>
285
+        <el-row :gutter="20">
286
+          <el-col :span="12">
287
+            <el-form-item label="非核心安全+核心扣分" prop="nonCoreSafetyCoreDeduction">
288
+              <el-input-number v-model="nonCadreForm.nonCoreSafetyCoreDeduction" :min="0" :precision="2" style="width: 100%" />
289
+            </el-form-item>
290
+          </el-col>
291
+          <el-col :span="12">
292
+            <el-form-item label="SOC/站品控检查的涉及核心、安全指标扣分" prop="socSafetyCoreDeduction">
293
+              <el-input-number v-model="nonCadreForm.socSafetyCoreDeduction" :min="0" :precision="2" style="width: 100%" />
294
+            </el-form-item>
295
+          </el-col>
296
+        </el-row>
297
+
298
+        <el-row :gutter="20">
299
+          <el-col :span="24">
300
+            <el-form-item label="SOC/站品控检查的涉及核心、安全指标扣分依据" prop="socSafetyCoreDeductionBasis">
301
+              <el-input v-model="nonCadreForm.socSafetyCoreDeductionBasis" type="textarea" :rows="2" placeholder="请输入依据" />
302
+            </el-form-item>
303
+          </el-col>
304
+        </el-row>
305
+
306
+        <el-divider content-position="left">统计信息</el-divider>
307
+        <el-row :gutter="20">
308
+          <el-col :span="8">
309
+            <el-form-item label="扣分平均值" prop="averageDeduction">
310
+              <el-input-number v-model="nonCadreForm.averageDeduction" :min="0" :precision="2" style="width: 100%" />
311
+            </el-form-item>
312
+          </el-col>
313
+          <el-col :span="8">
314
+            <el-form-item label="总分" prop="totalScore">
315
+              <el-input-number v-model="nonCadreForm.totalScore" :min="0" :precision="2" style="width: 100%" />
316
+            </el-form-item>
317
+          </el-col>
318
+          <el-col :span="8">
319
+            <el-form-item label="奖励(元)" prop="rewardAmount">
320
+              <el-input-number v-model="nonCadreForm.rewardAmount" :min="0" :precision="2" style="width: 100%" />
321
+            </el-form-item>
322
+          </el-col>
323
+        </el-row>
324
+
325
+        <el-row :gutter="20">
326
+          <el-col :span="8">
327
+            <el-form-item label="扣罚(元)" prop="penaltyAmount">
328
+              <el-input-number v-model="nonCadreForm.penaltyAmount" :min="0" :precision="2" style="width: 100%" />
329
+            </el-form-item>
330
+          </el-col>
331
+          <el-col :span="8">
332
+            <el-form-item label="考核结果" prop="assessmentResult">
333
+              <el-select v-model="nonCadreForm.assessmentResult" placeholder="请选择考核结果" style="width: 100%">
334
+                <el-option v-for="item in assessmentResultOptions" :key="item.value" :label="item.label" :value="item.value" />
335
+              </el-select>
336
+            </el-form-item>
337
+          </el-col>
338
+          <el-col :span="8">
339
+            <el-form-item label="应用方式" prop="applicationMethod">
340
+              <el-select v-model="nonCadreForm.applicationMethod" placeholder="请选择应用方式" style="width: 100%">
341
+                <el-option v-for="item in applicationMethodOptions" :key="item.value" :label="item.label" :value="item.value" />
342
+              </el-select>
343
+            </el-form-item>
344
+          </el-col>
345
+        </el-row>
346
+
347
+        <el-row :gutter="20">
348
+          <el-col :span="12">
349
+            <el-form-item label="奖励明细" prop="rewardDetails">
350
+              <el-input v-model="nonCadreForm.rewardDetails" type="textarea" :rows="2" placeholder="请输入奖励明细" />
351
+            </el-form-item>
352
+          </el-col>
353
+          <el-col :span="12">
354
+            <el-form-item label="惩罚明细" prop="penaltyDetails">
355
+              <el-input v-model="nonCadreForm.penaltyDetails" type="textarea" :rows="2" placeholder="请输入惩罚明细" />
356
+            </el-form-item>
357
+          </el-col>
358
+        </el-row>
359
+
360
+        <el-row :gutter="20">
361
+          <el-col :span="12">
362
+            <el-form-item label="考核结果备注" prop="assessmentResultRemark">
363
+              <el-input v-model="nonCadreForm.assessmentResultRemark" type="textarea" :rows="2" placeholder="请输入考核结果备注" />
364
+            </el-form-item>
365
+          </el-col>
366
+          <el-col :span="12">
367
+            <el-form-item label="应用方式备注" prop="applicationMethodRemark">
368
+              <el-input v-model="nonCadreForm.applicationMethodRemark" type="textarea" :rows="2" placeholder="请输入应用方式备注" />
369
+            </el-form-item>
370
+          </el-col>
371
+        </el-row>
372
+
373
+        <el-divider content-position="left">豁免信息</el-divider>
374
+        <el-row :gutter="20">
375
+          <el-col :span="12">
376
+            <el-form-item label="是否豁免" prop="isExempted">
377
+              <el-switch v-model="nonCadreForm.isExempted" active-text="是" inactive-text="否" />
378
+            </el-form-item>
379
+          </el-col>
380
+          <el-col :span="12">
381
+            <el-form-item label="是否豁免备注" prop="exemptionRemark">
382
+              <el-input v-model="nonCadreForm.exemptionRemark" type="textarea" :rows="2" placeholder="请输入豁免备注" />
383
+            </el-form-item>
384
+          </el-col>
385
+        </el-row>
386
+      </el-form>
387
+
388
+      <!-- 干部表单 -->
389
+      <el-form v-else :model="cadreForm" ref="formRef" :rules="cadreRules" label-width="180px" class="form-container">
390
+        <el-row :gutter="20">
391
+          <el-col :span="8">
392
+            <el-form-item label="员工姓名" prop="employeeName">
393
+              <el-input v-model="cadreForm.employeeName" placeholder="请输入员工姓名" />
394
+            </el-form-item>
395
+          </el-col>
396
+          <el-col :span="8">
397
+            <el-form-item label="岗位" prop="position">
398
+              <el-input v-model="cadreForm.position" placeholder="请输入岗位" />
399
+            </el-form-item>
400
+          </el-col>
401
+          <el-col :span="8">
402
+            <el-form-item label="区域" prop="area">
403
+              <el-input v-model="cadreForm.area" placeholder="请输入区域" />
404
+            </el-form-item>
405
+          </el-col>
406
+        </el-row>
407
+
408
+        <el-row :gutter="20">
409
+          <el-col :span="8">
410
+            <el-form-item label="考核月份" prop="assessmentMonth">
411
+              <el-date-picker v-model="cadreForm.assessmentMonth" type="month" placeholder="请选择考核月份" 
412
+                value-format="YYYY-MM" style="width: 100%" />
413
+            </el-form-item>
414
+          </el-col>
415
+          <el-col :span="8">
416
+            <el-form-item label="考核结果" prop="assessmentResult">
417
+              <el-select v-model="cadreForm.assessmentResult" placeholder="请选择考核结果" style="width: 100%">
418
+                <el-option v-for="item in assessmentResultOptions" :key="item.value" :label="item.label" :value="item.value" />
419
+              </el-select>
420
+            </el-form-item>
421
+          </el-col>
422
+          <el-col :span="8">
423
+            <el-form-item label="应用方式" prop="applicationMethod">
424
+              <el-select v-model="cadreForm.applicationMethod" placeholder="请选择应用方式" style="width: 100%">
425
+                <el-option v-for="item in applicationMethodOptions" :key="item.value" :label="item.label" :value="item.value" />
426
+              </el-select>
427
+            </el-form-item>
428
+          </el-col>
429
+        </el-row>
430
+
431
+        <el-divider content-position="left">红线扣分</el-divider>
432
+        <el-row :gutter="20">
433
+          <el-col :span="12">
434
+            <el-form-item label="红线扣分" prop="redLineDeduction">
435
+              <el-input-number v-model="cadreForm.redLineDeduction" :min="0" :precision="2" style="width: 100%" />
436
+            </el-form-item>
437
+          </el-col>
438
+          <el-col :span="12">
439
+            <el-form-item label="红线扣分豁免情况" prop="redLineExemption">
440
+              <el-input v-model="cadreForm.redLineExemption" type="textarea" :rows="2" placeholder="请输入豁免情况" />
441
+            </el-form-item>
442
+          </el-col>
443
+        </el-row>
444
+
445
+        <el-divider content-position="left">违规排名扣分</el-divider>
446
+        <el-row :gutter="20">
447
+          <el-col :span="12">
448
+            <el-form-item label="违规排名扣分" prop="violationRankingDeduction">
449
+              <el-input-number v-model="cadreForm.violationRankingDeduction" :min="0" :precision="2" style="width: 100%" />
450
+            </el-form-item>
451
+          </el-col>
452
+          <el-col :span="12">
453
+            <el-form-item label="违规排名扣分豁免情况" prop="violationRankingExemption">
454
+              <el-input v-model="cadreForm.violationRankingExemption" type="textarea" :rows="2" placeholder="请输入豁免情况" />
455
+            </el-form-item>
456
+          </el-col>
457
+        </el-row>
458
+
459
+        <el-divider content-position="left">技能排名扣分</el-divider>
460
+        <el-row :gutter="20">
461
+          <el-col :span="12">
462
+            <el-form-item label="技能排名扣分" prop="skillRankingDeduction">
463
+              <el-input-number v-model="cadreForm.skillRankingDeduction" :min="0" :precision="2" style="width: 100%" />
464
+            </el-form-item>
465
+          </el-col>
466
+          <el-col :span="12">
467
+            <el-form-item label="技能排名扣分豁免情况" prop="skillRankingExemption">
468
+              <el-input v-model="cadreForm.skillRankingExemption" type="textarea" :rows="2" placeholder="请输入豁免情况" />
469
+            </el-form-item>
470
+          </el-col>
471
+        </el-row>
472
+
473
+        <el-divider content-position="left">统计信息</el-divider>
474
+        <el-row :gutter="20">
475
+          <el-col :span="12">
476
+            <el-form-item label="总分" prop="totalScore">
477
+              <el-input-number v-model="cadreForm.totalScore" :min="0" :precision="2" style="width: 100%" />
478
+            </el-form-item>
479
+          </el-col>
480
+        </el-row>
481
+
482
+        <el-row :gutter="20">
483
+          <el-col :span="12">
484
+            <el-form-item label="考核结果备注" prop="assessmentResultRemark">
485
+              <el-input v-model="cadreForm.assessmentResultRemark" type="textarea" :rows="2" placeholder="请输入考核结果备注" />
486
+            </el-form-item>
487
+          </el-col>
488
+          <el-col :span="12">
489
+            <el-form-item label="应用方式备注" prop="applicationMethodRemark">
490
+              <el-input v-model="cadreForm.applicationMethodRemark" type="textarea" :rows="2" placeholder="请输入应用方式备注" />
491
+            </el-form-item>
492
+          </el-col>
493
+        </el-row>
494
+      </el-form>
495
+
496
+      <template #footer>
497
+        <div class="dialog-footer">
498
+          <el-button @click="dialog.visible = false">取消</el-button>
499
+          <el-button type="primary" @click="submitForm">确定</el-button>
500
+        </div>
501
+      </template>
502
+    </el-dialog>
503
+  </div>
504
+</template>
505
+
506
+<script setup>
507
+import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
508
+import { ElMessage, ElMessageBox } from 'element-plus'
509
+
510
+// API导入(需要根据实际API路径调整)
511
+import { getNonCadreMonthlyAssessList, addNonCadreMonthlyAssess, updateNonCadreMonthlyAssess, deleteNonCadreMonthlyAssess } from '@/api/performance/nonCadreMonthlyAssess.js'
512
+
513
+const { proxy } = getCurrentInstance()
514
+
515
+// 响应式数据
516
+const loading = ref(false)
517
+const total = ref(0)
518
+const queryFormRef = ref()
519
+const formRef = ref()
520
+const currentTab = ref('non-cadre')
521
+
522
+// 查询参数
523
+const queryParams = reactive({
524
+  pageNum: 1,
525
+  pageSize: 10,
526
+  employeeName: '',
527
+  assessmentMonth: ''
528
+})
529
+
530
+// 非干部表单数据
531
+const nonCadreForm = reactive({
532
+  brigade: '',
533
+  employmentType: '',
534
+  employeeCode: '',
535
+  employeeName: '',
536
+  assessmentGroup: '',
537
+  teamLeader: '',
538
+  supervisor: '',
539
+  managedEmployeeCount: 0,
540
+  assessmentMonth: '',
541
+  redLineTriggerCount: 0,
542
+  redLineBasis: '',
543
+  coreIndicatorScore: 0,
544
+  coreIndicatorBasis: '',
545
+  otherIndicatorScore: 0,
546
+  otherIndicatorBasis: '',
547
+  safetyWithSocScore: 0,
548
+  safetyWithSocBasis: '',
549
+  safetyWithoutSocScore: 0,
550
+  safetyWithoutSocBasis: '',
551
+  nonSafetyDeduction: 0,
552
+  nonSafetyDeductionBasis: '',
553
+  nonCoreSafetyCoreDeduction: 0,
554
+  socSafetyCoreDeduction: 0,
555
+  socSafetyCoreDeductionBasis: '',
556
+  averageDeduction: 0,
557
+  totalScore: 0,
558
+  rewardAmount: 0,
559
+  penaltyAmount: 0,
560
+  assessmentResult: '',
561
+  applicationMethod: '',
562
+  rewardDetails: '',
563
+  penaltyDetails: '',
564
+  assessmentResultRemark: '',
565
+  applicationMethodRemark: '',
566
+  isExempted: false,
567
+  exemptionRemark: ''
568
+})
569
+
570
+// 干部表单数据
571
+const cadreForm = reactive({
572
+  employeeName: '',
573
+  position: '',
574
+  area: '',
575
+  assessmentMonth: '',
576
+  redLineDeduction: 0,
577
+  redLineExemption: '',
578
+  violationRankingDeduction: 0,
579
+  violationRankingExemption: '',
580
+  skillRankingDeduction: 0,
581
+  skillRankingExemption: '',
582
+  totalScore: 0,
583
+  assessmentResult: '',
584
+  applicationMethod: '',
585
+  assessmentResultRemark: '',
586
+  applicationMethodRemark: ''
587
+})
588
+
589
+// 弹窗配置
590
+const dialog = reactive({
591
+  visible: false,
592
+  title: '',
593
+  type: 'non-cadre'
594
+})
595
+
596
+// 数据列表
597
+const nonCadreList = ref([])
598
+const cadreList = ref([])
599
+
600
+// 选项配置
601
+const employmentTypeOptions = [
602
+  { label: '正式员工', value: 'formal' },
603
+  { label: '合同工', value: 'contract' },
604
+  { label: '临时工', value: 'temporary' },
605
+  { label: '实习生', value: 'intern' }
606
+]
607
+
608
+const assessmentResultOptions = [
609
+  { label: '优秀', value: 'excellent' },
610
+  { label: '良好', value: 'good' },
611
+  { label: '合格', value: 'qualified' },
612
+  { label: '不合格', value: 'unqualified' }
613
+]
614
+
615
+const applicationMethodOptions = [
616
+  { label: '直接应用', value: 'direct' },
617
+  { label: '加权计算', value: 'weighted' },
618
+  { label: '特殊处理', value: 'special' }
619
+]
620
+
621
+// 非干部表单验证规则
622
+const nonCadreRules = {
623
+  employeeName: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }],
624
+  employmentType: [{ required: true, message: '用工形式不能为空', trigger: 'change' }],
625
+  assessmentGroup: [{ required: true, message: '考核组不能为空', trigger: 'blur' }],
626
+  assessmentMonth: [{ required: true, message: '考核月份不能为空', trigger: 'change' }]
627
+}
628
+
629
+// 干部表单验证规则
630
+const cadreRules = {
631
+  employeeName: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }],
632
+  position: [{ required: true, message: '岗位不能为空', trigger: 'blur' }],
633
+  assessmentMonth: [{ required: true, message: '考核月份不能为空', trigger: 'change' }],
634
+  assessmentResult: [{ required: true, message: '考核结果不能为空', trigger: 'change' }]
635
+}
636
+
637
+// 获取数据列表
638
+const getList = async () => {
639
+  loading.value = true
640
+  try {
641
+    if (currentTab.value === 'non-cadre') {
642
+      const res = await getNonCadreMonthlyAssessList(queryParams)
643
+      nonCadreList.value = res.rows || []
644
+      total.value = res.total || 0
645
+    } else {
646
+      // 干部数据API(待实现)
647
+      cadreList.value = []
648
+      total.value = 0
649
+    }
650
+  } catch (error) {
651
+    console.error('获取数据失败:', error)
652
+    ElMessage.error('获取数据失败')
653
+  } finally {
654
+    loading.value = false
655
+  }
656
+}
657
+
658
+// 查询
659
+const handleQuery = () => {
660
+  queryParams.pageNum = 1
661
+  getList()
662
+}
663
+
664
+// 重置查询
665
+const resetQuery = () => {
666
+  queryFormRef.value?.resetFields()
667
+  queryParams.pageNum = 1
668
+  getList()
669
+}
670
+
671
+// 新增
672
+const handleAdd = () => {
673
+  dialog.visible = true
674
+  dialog.type = currentTab.value
675
+  dialog.title = currentTab.value === 'non-cadre' ? '新增非干部月度考核' : '新增干部月度考核'
676
+  
677
+  // 重置表单数据
678
+  if (currentTab.value === 'non-cadre') {
679
+    Object.keys(nonCadreForm).forEach(key => {
680
+      if (typeof nonCadreForm[key] === 'number') {
681
+        nonCadreForm[key] = 0
682
+      } else if (typeof nonCadreForm[key] === 'boolean') {
683
+        nonCadreForm[key] = false
684
+      } else {
685
+        nonCadreForm[key] = ''
686
+      }
687
+    })
688
+  } else {
689
+    Object.keys(cadreForm).forEach(key => {
690
+      if (typeof cadreForm[key] === 'number') {
691
+        cadreForm[key] = 0
692
+      } else if (typeof cadreForm[key] === 'boolean') {
693
+        cadreForm[key] = false
694
+      } else {
695
+        cadreForm[key] = ''
696
+      }
697
+    })
698
+  }
699
+}
700
+
701
+// 编辑
702
+const handleEdit = (row, type) => {
703
+  dialog.visible = true
704
+  dialog.type = type
705
+  dialog.title = type === 'non-cadre' ? '编辑非干部月度考核' : '编辑干部月度考核'
706
+  
707
+  // 填充表单数据
708
+  if (type === 'non-cadre') {
709
+    Object.keys(nonCadreForm).forEach(key => {
710
+      if (row[key] !== undefined) {
711
+        nonCadreForm[key] = row[key]
712
+      }
713
+    })
714
+  } else {
715
+    Object.keys(cadreForm).forEach(key => {
716
+      if (row[key] !== undefined) {
717
+        cadreForm[key] = row[key]
718
+      }
719
+    })
720
+  }
721
+}
722
+
723
+// 删除
724
+const handleDelete = async (row) => {
725
+  try {
726
+    await ElMessageBox.confirm('确认删除该考核记录吗?', '提示', {
727
+      confirmButtonText: '确定',
728
+      cancelButtonText: '取消',
729
+      type: 'warning'
730
+    })
731
+    
732
+    await deleteNonCadreMonthlyAssess(row.id)
733
+    ElMessage.success('删除成功')
734
+    getList()
735
+  } catch (error) {
736
+    if (error !== 'cancel') {
737
+      ElMessage.error('删除失败')
738
+    }
739
+  }
740
+}
741
+
742
+// 提交表单
743
+const submitForm = async () => {
744
+  const valid = await formRef.value?.validate()
745
+  if (!valid) return
746
+  
747
+  try {
748
+    if (dialog.type === 'non-cadre') {
749
+      if (dialog.title === '新增非干部月度考核') {
750
+        await addNonCadreMonthlyAssess(nonCadreForm)
751
+        ElMessage.success('新增成功')
752
+      } else {
753
+        await updateNonCadreMonthlyAssess(nonCadreForm)
754
+        ElMessage.success('更新成功')
755
+      }
756
+    } else {
757
+      // 干部数据API(待实现)
758
+      ElMessage.success('操作成功')
759
+    }
760
+    
761
+    dialog.visible = false
762
+    getList()
763
+  } catch (error) {
764
+    ElMessage.error('操作失败')
765
+  }
766
+}
767
+
768
+// 导出
769
+const handleExport = async () => {
770
+  try {
771
+    ElMessage.success('导出功能开发中')
772
+  } catch (error) {
773
+    ElMessage.error('导出失败')
774
+  }
775
+}
776
+
777
+// 生成本月考核表
778
+const generateMonthlyAssessment = async () => {
779
+  try {
780
+    ElMessage.success('生成本月考核表功能开发中')
781
+  } catch (error) {
782
+    ElMessage.error('生成失败')
783
+  }
784
+}
785
+
786
+// 监听Tab切换
787
+const handleTabChange = () => {
788
+  queryParams.pageNum = 1
789
+  getList()
790
+}
791
+
792
+onMounted(() => {
793
+  getList()
794
+})
795
+</script>
796
+
797
+<style lang="less" scoped>
798
+.app-container {
799
+  padding: 20px;
800
+}
801
+
802
+.tab-container {
803
+  margin-bottom: 20px;
804
+  text-align: left;
805
+}
806
+
807
+.filter-container {
808
+//  margin-bottom: 20px;
809
+}
810
+
811
+.search-form {
812
+  display: flex;
813
+  flex-wrap: wrap;
814
+  gap: 10px;
815
+}
816
+
817
+.operation-container {
818
+  margin-bottom: 20px;
819
+  display: flex;
820
+  justify-content: space-between;
821
+  align-items: center;
822
+}
823
+
824
+.left-buttons {
825
+  display: flex;
826
+  gap: 10px;
827
+}
828
+
829
+.right-buttons {
830
+  display: flex;
831
+  gap: 10px;
832
+}
833
+
834
+.form-container {
835
+  max-height: 70vh;
836
+  overflow-y: auto;
837
+  padding-right: 10px;
838
+}
839
+
840
+.el-divider {
841
+  margin: 20px 0;
842
+}
843
+
844
+:deep(.el-form-item__label) {
845
+  font-weight: 500;
846
+}
847
+</style>

src/views/performanceManage/NonCadreMonthlyAssess/非干部月度考核 → src/views/performanceManage/monthlyAssess/月度考核


src/views/performanceManage/NonCadreMonthlyScoreSum/index.vue → src/views/performanceManage/monthlyAssessSum/index.vue


src/views/performanceManage/NonCadreMonthlyAssessSum/非干部月度考核汇总表 → src/views/performanceManage/monthlyAssessSum/月度汇总


+ 30 - 21
src/views/system/classificationAssess/index.vue

@@ -4,15 +4,15 @@
4 4
       <el-form-item label="编码" prop="code">
5 5
         <el-input v-model="queryParams.code" placeholder="请输入编码" clearable @keyup.enter="handleQuery" />
6 6
       </el-form-item>
7
-      <el-form-item label="检查项目名称" prop="name">
8
-        <el-input v-model="queryParams.name" placeholder="请输入检查项目名称" clearable @keyup.enter="handleQuery" />
7
+      <el-form-item label="考核指标名称" prop="name">
8
+        <el-input v-model="queryParams.name" placeholder="请输入考核指标名称" clearable @keyup.enter="handleQuery" />
9 9
       </el-form-item>
10 10
 
11 11
       <!-- <el-form-item label="重要程度" prop="categoryName"> -->
12
-        <!-- <el-select v-model="queryParams.importance" placeholder="请选择重要程度" clearable style="width: 180px;">
12
+      <!-- <el-select v-model="queryParams.importance" placeholder="请选择重要程度" clearable style="width: 180px;">
13 13
           <el-option v-for="dict in base_check_importance" :key="dict.value" :label="dict.label" :value="dict.value" />
14 14
         </el-select> -->
15
-        <!-- <el-input v-model="queryParams.categoryName" placeholder="请输入所属分类名称" clearable @keyup.enter="handleQuery" />
15
+      <!-- <el-input v-model="queryParams.categoryName" placeholder="请输入所属分类名称" clearable @keyup.enter="handleQuery" />
16 16
       </el-form-item> -->
17 17
       <el-form-item>
18 18
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -43,15 +43,18 @@
43 43
     <el-table v-loading="loading" :data="projectList" @selection-change="handleSelectionChange">
44 44
       <el-table-column type="selection" width="55" align="center" />
45 45
       <el-table-column label="编码" align="center" prop="code" />
46
-      <el-table-column label="检查项目名称" align="center" prop="name" />
46
+      <el-table-column label="考核指标名称" align="center" prop="name" />
47 47
       <el-table-column label="所属分类" align="center" prop="categoryName" />
48
+      <el-table-column label="分值" align="center" prop="score" />
49
+      <el-table-column label="单位" align="center" prop="unit" />
50
+      <el-table-column label="事病假" align="center" prop="leaveType" />
48 51
       <!-- <el-table-column label="检查标准" align="center" prop="checkStandard" />
49 52
       <el-table-column label="检查方法" align="center" prop="checkMethod" /> -->
50 53
       <!-- <el-table-column label="重要程度" align="center" prop="importance">
51 54
         <template #default="scope">
52 55
           <dict-tag :options="base_check_importance" :value="scope.row.importance" />
53 56
         </template>
54
-      </el-table-column> -->
57
+</el-table-column> -->
55 58
       <!-- <el-table-column label="状态" align="center" prop="status" >
56 59
         <template #default="scope">
57 60
           <dict-tag :options="base_check_status" :value="scope.row.status"/>
@@ -71,30 +74,36 @@
71 74
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
72 75
       v-model:limit="queryParams.pageSize" @pagination="getList" />
73 76
 
74
-    <!-- 添加或修改检查项目对话框 -->
77
+    <!-- 添加或修改考核指标对话框 -->
75 78
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
76 79
       <el-form ref="projectRef" :model="form" :rules="rules" label-width="120px">
77 80
         <el-form-item label="编码" prop="code" v-if="form.id">
78 81
           <el-input v-model="form.code" placeholder="请输入编码" disabled />
79 82
         </el-form-item>
80
-        <el-form-item label="检查项目名称" prop="name">
81
-          <el-input v-model="form.name" placeholder="请输入检查项目名称" />
83
+        <el-form-item label="考核指标名称" prop="name">
84
+          <el-input v-model="form.name" placeholder="请输入考核指标名称" />
82 85
         </el-form-item>
83 86
         <el-form-item label="所属分类" prop="categoryCode">
84 87
           <el-tree-select v-model="form.categoryCode" :data="enableCategoryOptions"
85 88
             :props="{ value: 'code', label: 'label', children: 'children' }" value-key="id" placeholder="请选择所属分类"
86 89
             @node-click="handleNodeClick" />
87 90
         </el-form-item>
88
-        <el-form-item label="检查级别" prop="checkLevel">
89
-          <el-select v-model="form.checkLevel" placeholder="请选择检查级别" multiple>
90
-            <el-option v-for="dict in check_level" :key="dict.value" :label="dict.label" :value="dict.value" />
91
-          </el-select>
91
+        <el-form-item label="分值" prop="score">
92
+          <el-input-number v-model="form.score" :min="0" :precision="2" placeholder="请输入分值" style="width: 100%" />
92 93
         </el-form-item>
93
-        <el-form-item label="检查标准" prop="checkStandard">
94
-          <el-input v-model="form.checkStandard" type="textarea" placeholder="请输入内容" />
94
+
95
+
96
+
97
+
98
+        <el-form-item label="单位" prop="unit">
99
+          <el-input v-model="form.unit" placeholder="请输入单位" />
95 100
         </el-form-item>
96
-        <el-form-item label="检查方法" prop="checkMethod">
97
-          <el-input v-model="form.checkMethod" type="textarea" placeholder="请输入内容" />
101
+
102
+        <el-form-item label="事病假" prop="leaveType">
103
+          <el-select v-model="form.leaveType" placeholder="请选择事病假" style="width: 100%">
104
+            <el-option label="是" value="1" />
105
+            <el-option label="否" value="0" />
106
+          </el-select>
98 107
         </el-form-item>
99 108
         <!-- <el-form-item label="重要程度" prop="importance">
100 109
           <el-select v-model="form.importance" placeholder="请选择重要程度">
@@ -153,7 +162,7 @@ const data = reactive({
153 162
   },
154 163
   rules: {
155 164
     name: [
156
-      { required: true, message: "检查项目名称不能为空", trigger: "blur" }
165
+      { required: true, message: "考核指标名称不能为空", trigger: "blur" }
157 166
     ],
158 167
     categoryCode: [
159 168
       { required: true, message: "分类编码不能为空", trigger: "blur" }
@@ -178,7 +187,7 @@ const data = reactive({
178 187
 
179 188
 const { queryParams, form, rules } = toRefs(data)
180 189
 
181
-/** 查询检查项目列表 */
190
+/** 查询考核指标列表 */
182 191
 function getList() {
183 192
   loading.value = true
184 193
   listProject(queryParams.value).then(response => {
@@ -241,7 +250,7 @@ function handleSelectionChange(selection) {
241 250
 function handleAdd() {
242 251
   reset()
243 252
   open.value = true
244
-  title.value = "添加检查项目"
253
+  title.value = "添加考核指标"
245 254
 }
246 255
 
247 256
 /** 修改按钮操作 */
@@ -254,7 +263,7 @@ function handleUpdate(row) {
254 263
       checkLevel: response.data?.checkLevel?.split(","),
255 264
     }
256 265
     open.value = true
257
-    title.value = "修改检查项目"
266
+    title.value = "修改考核指标"
258 267
   })
259 268
 }
260 269
 

+ 34 - 35
src/views/system/classificationAssessIndicator/index.vue

@@ -1,18 +1,11 @@
1 1
 <template>
2 2
   <div class="app-container">
3 3
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
4
-      <el-form-item label="编码" prop="code">
5
-        <el-input
6
-          v-model="queryParams.code"
7
-          placeholder="请输入编码"
8
-          clearable
9
-          @keyup.enter="handleQuery"
10
-        />
11
-      </el-form-item>
12
-      <el-form-item label="分类名称" prop="name">
4
+      
5
+      <el-form-item label="指标名称" prop="name">
13 6
         <el-input
14 7
           v-model="queryParams.name"
15
-          placeholder="请输入分类名称"
8
+          placeholder="请输入指标名称"
16 9
           clearable
17 10
           @keyup.enter="handleQuery"
18 11
         />
@@ -53,8 +46,9 @@
53 46
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
54 47
     >
55 48
       <el-table-column label="编码" align="center" prop="code" />
56
-      <el-table-column label="分类名称" align="center" prop="name" />
49
+      <el-table-column label="指标名称" align="center" prop="name" />
57 50
       <el-table-column label="显示顺序" align="center" prop="orderNum" />
51
+      <el-table-column label="分值" align="center" prop="score" />
58 52
       <el-table-column label="备注" align="center" prop="remark" />
59 53
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
60 54
         <template #default="scope">
@@ -65,29 +59,39 @@
65 59
       </el-table-column>
66 60
     </el-table>
67 61
 
68
-    <!-- 添加或修改检查项分类对话框 -->
62
+    <!-- 添加或修改指标对话框 -->
69 63
     <el-dialog :title="title" v-model="open" width="500px" append-to-body>
70 64
       <el-form ref="checkCategoryRef" :model="form" :rules="rules" label-width="80px">
71
-        <el-form-item label="编码" prop="code" v-if="form.id">
72
-          <el-input v-model="form.code" placeholder="请输入编码" disabled/>
65
+        <el-form-item label="序号" prop="orderNum">
66
+      
67
+          <el-input v-model="form.orderNum" placeholder="请输入序号" />
73 68
         </el-form-item>
74
-        <el-form-item label="分类名称" prop="name">
75
-          <el-input v-model="form.name" placeholder="请输入分类名称" />
69
+        <el-form-item label="指标名称" prop="name">
70
+         
71
+          <el-input v-model="form.name" placeholder="请输入指标名称" />
76 72
         </el-form-item>
77
-        <el-form-item label="上级分类" prop="parentId">
73
+        <el-form-item label="上级位置" prop="parentId">
74
+        
78 75
           <el-tree-select
79 76
             v-model="form.parentId"
80 77
             :data="checkCategoryOptions"
81 78
             :props="{ value: 'id', label: 'name', children: 'children' }"
82 79
             value-key="id"
83
-            placeholder="请选择上级分类"
80
+            placeholder="顶级节点"
84 81
             check-strictly
85 82
           />
86 83
         </el-form-item>
87
-        <el-form-item label="显示顺序" prop="orderNum">
88
-          <el-input v-model="form.orderNum" placeholder="请输入显示顺序" />
84
+        <el-form-item label="分值/单位" prop="scoreUnit">
85
+          <div style="display: flex; align-items: center; gap: 8px; width: 100%;">
86
+            <el-input v-model="form.score" placeholder="" style="flex: 1;" />
87
+            <span>/</span>
88
+            <el-select v-model="form.unit" placeholder="下拉菜单" style="flex: 1;">
89
+              <el-option label="分" value="分" />
90
+              <el-option label="次" value="次" />
91
+              <el-option label="项" value="项" />
92
+            </el-select>
93
+          </div>
89 94
         </el-form-item>
90
-
91 95
         <el-form-item label="备注" prop="remark">
92 96
           <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
93 97
         </el-form-item>
@@ -123,25 +127,18 @@ const data = reactive({
123 127
     parentId: null,
124 128
     orderNum: null,
125 129
     code: null,
130
+    score: null,
131
+    unit: null,
126 132
   },
127 133
   rules: {
128 134
     name: [
129
-      { required: true, message: "分类名称不能为空", trigger: "blur" }
135
+      { required: true, message: "指标名称不能为空", trigger: "blur" }
130 136
     ],
131 137
     parentId: [
132
-      { required: true, message: "上级分类不能为空", trigger: "blur" }
133
-    ],
134
-    ancestors: [
135
-      { required: true, message: "祖级列表不能为空", trigger: "blur" }
136
-    ],
137
-    level: [
138
-      { required: true, message: "层级不能为空", trigger: "blur" }
138
+      { required: true, message: "上级位置不能为空", trigger: "blur" }
139 139
     ],
140 140
     orderNum: [
141
-      { required: true, message: "显示顺序不能为空", trigger: "blur" }
142
-    ],
143
-    code: [
144
-      { required: true, message: "编码不能为空", trigger: "blur" }
141
+      { required: true, message: "序号不能为空", trigger: "blur" }
145 142
     ],
146 143
   }
147 144
 })
@@ -189,6 +186,8 @@ function reset() {
189 186
     level: null,
190 187
     orderNum: null,
191 188
     code: null,
189
+    score: null,
190
+    unit: null,
192 191
     remark: null
193 192
   }
194 193
   proxy.resetForm("checkCategoryRef")
@@ -215,7 +214,7 @@ function handleAdd(row) {
215 214
     form.value.parentId = 0
216 215
   }
217 216
   open.value = true
218
-  title.value = "添加检查项分类"
217
+  title.value = "添加指标"
219 218
 }
220 219
 
221 220
 /** 展开/折叠操作 */
@@ -237,7 +236,7 @@ async function handleUpdate(row) {
237 236
   getCheckCategory(row.id).then(response => {
238 237
     form.value = response.data
239 238
     open.value = true
240
-    title.value = "修改检查项分类"
239
+    title.value = "修改指标"
241 240
   })
242 241
 }
243 242