feat(kpiFilling): 完善KPI自评分数计算逻辑并新增功能模块

- 移除自评分数100分上限限制,直接显示实际计算分数
- 添加Number转换和空值处理,避免NaN错误
- 根据班级类型区分毕业班和非毕业班业务工作字段计算
- 新增加分项分数计算功能
- 新增就业指导工作分数计算(仅毕业班)
- 在审核列表中添加加分项和就业指导工作组件
- 修复就业指导工作组件仅在毕业班显示的条件判断
```
This commit is contained in:
2026-03-24 17:43:30 +08:00
parent 29bbf721dc
commit acefa6eed2
4 changed files with 148 additions and 46 deletions

View File

@@ -115,7 +115,7 @@
</el-table-column>
<el-table-column label="自评分数" align="center" prop="selfScoring">
<template slot-scope="scope">
{{ handleSelfScoring(scope.row) > 100 ? 100 : handleSelfScoring(scope.row) }}
{{ handleSelfScoring(scope.row) }}
</template>
</el-table-column>
<el-table-column label="最终评级" align="center" prop="finalRating">
@@ -485,33 +485,64 @@ export default {
},
handleSelfScoring(row, text) {
let scoring = 0
const isGraduate = row.classType === 'graduate'
// 学生管理分数
row.kpiFillingStuMgtList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += element.cadreScoring
scoring += element.classScoring
scoring += element.stuActivityScoring
scoring += element.stuTalkScoring
scoring += element.visitDormitoryScoring
scoring += Number(element.cadreScoring) || 0
scoring += Number(element.classScoring) || 0
scoring += Number(element.stuActivityScoring) || 0
scoring += Number(element.stuTalkScoring) || 0
scoring += Number(element.visitDormitoryScoring) || 0
scoring += Number(element.noticeScoring) || 0
scoring += Number(element.edgScoring) || 0
}
})
// 业务工作分数
// 业务工作分数 - 非毕业班和毕业班字段名不同
row.kpiFillingBusinessWorksList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += element.stuLeaveMaterialsScoring
scoring += element.stuFillingMaterialsScoring
scoring += element.stuBasicDataScoring
scoring += element.stuDisciplinaryViolationScoring
scoring += element.handleEventsScoring
if (isGraduate) {
scoring += Number(element.stuLeaveMaterialsScoring) || 0
scoring += Number(element.stuFillingMaterialsScoring) || 0
scoring += Number(element.stuBasicDataScoring) || 0
scoring += Number(element.stuDisciplinaryViolationScoring) || 0
scoring += Number(element.handleEventsScoring) || 0
scoring += Number(element.otherTaskScoring) || 0
} else {
scoring += Number(element.stuLeaveRequestScoring) || 0
scoring += Number(element.stuLeaveMaterialsScoring) || 0
scoring += Number(element.stuFillingMaterialsScoring) || 0
scoring += Number(element.stuBasicDataScoring) || 0
scoring += Number(element.stuDisciplinaryViolationScoring) || 0
scoring += Number(element.handleEventsScoring) || 0
}
}
})
// 考勤管理分数
row.kpiFillingAMgtList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += element.dutyWorkScoring
scoring += element.conferenceScoring
scoring += Number(element.dutyWorkScoring) || 0
scoring += Number(element.conferenceScoring) || 0
}
})
// 加分项分数
if (row.kpiFillingBonusPointsList) {
row.kpiFillingBonusPointsList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += Number(element.bonusScoring) || 0
}
})
}
// 就业指导工作分数 - 仅毕业班(graduate)计算
if (isGraduate && row.kpiFillingGraduationGuidanceList) {
row.kpiFillingGraduationGuidanceList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += Number(element.gradFormAuditScoring) || 0
scoring += Number(element.stuCareerConsultScoring) || 0
scoring += Number(element.gradFormGuidanceScoring) || 0
}
})
}
if (text === '最终评级') {
if (scoring >= 80) {
return 'A'

View File

@@ -98,7 +98,7 @@
</el-table-column>
<el-table-column label="自评分数" align="center" prop="selfScoring">
<template slot-scope="scope">
{{ handleSelfScoring(scope.row) > 100 ? 100 : handleSelfScoring(scope.row) }}
{{ handleSelfScoring(scope.row) }}
</template>
</el-table-column>
<el-table-column label="最终评级" align="center" prop="finalRating">
@@ -364,33 +364,64 @@ export default {
},
handleSelfScoring(row, text) {
let scoring = 0
const isGraduate = row.classType === 'graduate'
// 学生管理分数
row.kpiFillingStuMgtList.forEach(element => {
if (element.hasOwnProperty('id')) {
scoring += element.cadreScoring
scoring += element.classScoring
scoring += element.stuActivityScoring
scoring += element.stuTalkScoring
scoring += element.visitDormitoryScoring
scoring += Number(element.cadreScoring) || 0
scoring += Number(element.classScoring) || 0
scoring += Number(element.stuActivityScoring) || 0
scoring += Number(element.stuTalkScoring) || 0
scoring += Number(element.visitDormitoryScoring) || 0
scoring += Number(element.noticeScoring) || 0
scoring += Number(element.edgScoring) || 0
}
})
// 业务工作分数
// 业务工作分数 - 非毕业班和毕业班字段名不同
row.kpiFillingBusinessWorksList.forEach(element => {
if (element.hasOwnProperty('id')) {
scoring += element.stuLeaveMaterialsScoring
scoring += element.stuFillingMaterialsScoring
scoring += element.stuBasicDataScoring
scoring += element.stuDisciplinaryViolationScoring
scoring += element.handleEventsScoring
if (isGraduate) {
scoring += Number(element.stuLeaveMaterialsScoring) || 0
scoring += Number(element.stuFillingMaterialsScoring) || 0
scoring += Number(element.stuBasicDataScoring) || 0
scoring += Number(element.stuDisciplinaryViolationScoring) || 0
scoring += Number(element.handleEventsScoring) || 0
scoring += Number(element.otherTaskScoring) || 0
} else {
scoring += Number(element.stuLeaveRequestScoring) || 0
scoring += Number(element.stuLeaveMaterialsScoring) || 0
scoring += Number(element.stuFillingMaterialsScoring) || 0
scoring += Number(element.stuBasicDataScoring) || 0
scoring += Number(element.stuDisciplinaryViolationScoring) || 0
scoring += Number(element.handleEventsScoring) || 0
}
}
})
// 考勤管理分数
row.kpiFillingAMgtList.forEach(element => {
if (element.hasOwnProperty('id')) {
scoring += element.dutyWorkScoring
scoring += element.conferenceScoring
scoring += Number(element.dutyWorkScoring) || 0
scoring += Number(element.conferenceScoring) || 0
}
})
// 加分项分数
if (row.kpiFillingBonusPointsList) {
row.kpiFillingBonusPointsList.forEach(element => {
if (element.hasOwnProperty('id')) {
scoring += Number(element.bonusScoring) || 0
}
})
}
// 就业指导工作分数 - 仅毕业班(graduate)计算
if (isGraduate && row.kpiFillingGraduationGuidanceList) {
row.kpiFillingGraduationGuidanceList.forEach(element => {
if (element.hasOwnProperty('id')) {
scoring += Number(element.gradFormAuditScoring) || 0
scoring += Number(element.stuCareerConsultScoring) || 0
scoring += Number(element.gradFormGuidanceScoring) || 0
}
})
}
if (text === '最终评级') {
if (scoring >= 80) {
return 'A'

View File

@@ -104,7 +104,7 @@
</el-table-column>
<el-table-column label="自评分数" align="center" prop="selfScoring">
<template slot-scope="scope">
{{ handleSelfScoring(scope.row) > 100 ? 100 : handleSelfScoring(scope.row) }}
{{ handleSelfScoring(scope.row) }}
</template>
</el-table-column>
<el-table-column label="最终评级" align="center" prop="finalRating">
@@ -184,8 +184,11 @@
<!-- 选项卡 -->
<el-tabs type="border-card" style="margin-top: 20px;">
<el-tab-pane v-for="item in componentList" :key="item.name" :label="item.name">
<div class="componentList">
<component :is="item.value" :form="form" style="padding: 10px" />
<div v-if="item.value === 'graduationGuidance' && form.classType === 'graduate'" class="componentList">
<component :is="item.value" :form="form" :roleGroup="roleGroup" :audit="isExamineFdy(form)" style="padding: 10px" />
</div>
<div v-else-if="item.value !== 'graduationGuidance'" class="componentList">
<component :is="item.value" :form="form" :roleGroup="roleGroup" :audit="isExamineFdy(form)" style="padding: 10px" />
</div>
</el-tab-pane>
</el-tabs>
@@ -250,6 +253,8 @@ import attendanceManagement from '../components/attendanceManagement.vue'
import negativeList from '../components/negativeList.vue'
// 超工作量奖励绩效
import rewardsKpi from '../components/rewardsKpi.vue'
import bonusPoints from '../components/bonusPoints.vue'
import graduationGuidance from '../components/graduationGuidance.vue'
// 处理学生突发事件
import stuEmergency from '../components/stuEmergency.vue'
// 进度条
@@ -272,6 +277,8 @@ export default {
attendanceManagement,
negativeList,
rewardsKpi,
bonusPoints,
graduationGuidance,
stuEmergency,
auditSteps,
},
@@ -281,7 +288,9 @@ export default {
{ name: '学生管理', value: 'studentManagement' },
{ name: '业务工作', value: 'businessWord' },
{ name: '考勤管理', value: 'attendanceManagement' },
{ name: '加分项', value: 'bonusPoints' },
{ name: '负面清单', value: 'negativeList' },
{ name: '就业指导工作', value: 'graduationGuidance' },
{ name: '超工作量奖励绩效', value: 'rewardsKpi' },
{ name: '处理学生突发事件', value: 'stuEmergency' },
],
@@ -447,33 +456,64 @@ export default {
},
handleSelfScoring(row, text) {
let scoring = 0
const isGraduate = row.classType === 'graduate'
// 学生管理分数
row.kpiFillingStuMgtList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += element.cadreScoring
scoring += element.classScoring
scoring += element.stuActivityScoring
scoring += element.stuTalkScoring
scoring += element.visitDormitoryScoring
scoring += Number(element.cadreScoring) || 0
scoring += Number(element.classScoring) || 0
scoring += Number(element.stuActivityScoring) || 0
scoring += Number(element.stuTalkScoring) || 0
scoring += Number(element.visitDormitoryScoring) || 0
scoring += Number(element.noticeScoring) || 0
scoring += Number(element.edgScoring) || 0
}
})
// 业务工作分数
// 业务工作分数 - 非毕业班和毕业班字段名不同
row.kpiFillingBusinessWorksList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += element.stuLeaveMaterialsScoring
scoring += element.stuFillingMaterialsScoring
scoring += element.stuBasicDataScoring
scoring += element.stuDisciplinaryViolationScoring
scoring += element.handleEventsScoring
if (isGraduate) {
scoring += Number(element.stuLeaveMaterialsScoring) || 0
scoring += Number(element.stuFillingMaterialsScoring) || 0
scoring += Number(element.stuBasicDataScoring) || 0
scoring += Number(element.stuDisciplinaryViolationScoring) || 0
scoring += Number(element.handleEventsScoring) || 0
scoring += Number(element.otherTaskScoring) || 0
} else {
scoring += Number(element.stuLeaveRequestScoring) || 0
scoring += Number(element.stuLeaveMaterialsScoring) || 0
scoring += Number(element.stuFillingMaterialsScoring) || 0
scoring += Number(element.stuBasicDataScoring) || 0
scoring += Number(element.stuDisciplinaryViolationScoring) || 0
scoring += Number(element.handleEventsScoring) || 0
}
}
})
// 考勤管理分数
row.kpiFillingAMgtList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += element.dutyWorkScoring
scoring += element.conferenceScoring
scoring += Number(element.dutyWorkScoring) || 0
scoring += Number(element.conferenceScoring) || 0
}
})
// 加分项分数
if (row.kpiFillingBonusPointsList) {
row.kpiFillingBonusPointsList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += Number(element.bonusScoring) || 0
}
})
}
// 就业指导工作分数 - 仅毕业班(graduate)计算
if (isGraduate && row.kpiFillingGraduationGuidanceList) {
row.kpiFillingGraduationGuidanceList.forEach((element) => {
if (element.hasOwnProperty('id')) {
scoring += Number(element.gradFormAuditScoring) || 0
scoring += Number(element.stuCareerConsultScoring) || 0
scoring += Number(element.gradFormGuidanceScoring) || 0
}
})
}
if (text === '最终评级') {
if (scoring >= 80) {
return 'A'

View File

@@ -84,9 +84,9 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<!-- <el-button v-hasPermi="['teacher:teacherKpiFillingMgt:edit']" size="mini" type="text" icon="el-icon-edit"
<el-button v-hasPermi="['teacher:teacherKpiFillingMgt:edit']" size="mini" type="text" icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改</el-button> -->
>修改</el-button>
<!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="examineFdy(scope.row)"
v-hasPermi="['teacher:teacherKpiFillingMgt:edit']">查看辅导员自评</el-button> -->
<el-button v-hasPermi="['teacher:teacherKpiFillingMgt:remove']" size="mini" type="text" icon="el-icon-delete"