辅导员管理-添加业绩考核个人填报详情和加分项、就业指导工作API

- 新增kpiFillingDetail函数用于获取业绩考核个人填报详情
- 新增加分项相关API:kpiFillingBonusPointsAdd、kpiFillingBonusPointsUpdate、
  kpiFillingBonusPointsDetail
- 新增就业指导工作相关API:kpiFillingGraduationGuidanceAdd、
  kpiFillingGraduationGuidanceUpdate、kpiFillingGraduationGuidanceDetail
- 添加TODO注释标记待后端API完成的功能

fix(pages): 解决部门名称存储问题

- 启用被注释掉的部门名称存储功能
- 确保deptName正确存入本地缓存

feat(performance): 支持毕业班和非毕业班不同考核标准

- 为考勤管理组件添加classType参数支持
- 为负面清单组件添加classType参数支持
- 为专业工作组件重构标签显示逻辑,支持根据classType动态显示
- 为奖励绩效加班组件添加classType参数支持
- 为学生突发事件组件添加classType参数支持
- 为学生管理组件添加毕业班/非毕业班差异化显示逻辑

refactor(performance): 优化业绩评估页面结构

- 添加班级类型选择按钮(毕业班/非毕业班)
- 在填报时间弹窗中集成班级类型选择功能
- 更新数据加载逻辑以支持classType参数
- 修正各种评分计算中的数值类型转换问题
```
This commit is contained in:
2026-03-13 15:14:29 +08:00
parent e1b2a84030
commit ecc0d00a4f
13 changed files with 788 additions and 154 deletions

View File

@@ -34,6 +34,13 @@ export function kpiFillingList(query) {
data: query data: query
}) })
} }
// 获取业绩考核-个人填报详情
export function kpiFillingDetail(id) {
return request({
url: '/teacher/kpiFilling/' + id,
method: 'get'
})
}
//个人填报-学生管理 新增 //个人填报-学生管理 新增
@@ -137,3 +144,58 @@ export function kpiFillingNegativeListDetail(query) {
}) })
} }
// TODO: 个人填报-加分项 待后端API完成后实现
// export function kpiFillingBonusPointsAdd(data) {}
// export function kpiFillingBonusPointsUpdate(data) {}
// export function kpiFillingBonusPointsDetail(query) {}
//个人填报-加分项 新增
export function kpiFillingBonusPointsAdd(data) {
return request({
url: '/teacher/kpiFillingBonusPoints/add',
method: 'post',
data: data
})
}
//个人填报-加分项 修改
export function kpiFillingBonusPointsUpdate(data) {
return request({
url: '/teacher/kpiFillingBonusPoints/update',
method: 'post',
data: data
})
}
//个人填报-加分项 详情
export function kpiFillingBonusPointsDetail(query) {
return request({
url: '/teacher/kpiFillingBonusPoints/getByFdyNameAndYearAndMonth',
method: 'get',
data: query
})
}
//个人填报-就业指导工作 新增
export function kpiFillingGraduationGuidanceAdd(data) {
return request({
url: '/teacher/kpiFillingGraduationGuidance/add',
method: 'post',
data: data
})
}
//个人填报-就业指导工作 修改
export function kpiFillingGraduationGuidanceUpdate(data) {
return request({
url: '/teacher/kpiFillingGraduationGuidance/update',
method: 'post',
data: data
})
}
//个人填报-就业指导工作 详情
export function kpiFillingGraduationGuidanceDetail(query) {
return request({
url: '/teacher/kpiFillingGraduationGuidance/getByFdyNameAndYearAndMonth',
method: 'get',
data: query
})
}

View File

@@ -1321,6 +1321,12 @@
"navigationBarTitleText": "自治区奖学金申请", "navigationBarTitleText": "自治区奖学金申请",
"navigationBarTextStyle": "white" "navigationBarTextStyle": "white"
} }
},
{
"path": "pages/instructor/performance-appraisal/components/bonuspoints",
"style": {
"navigationBarTitleText": ""
}
} }
], ],
"globalStyle": { "globalStyle": {

View File

@@ -304,7 +304,7 @@
uni.setStorageSync('stuName', data.nickName); uni.setStorageSync('stuName', data.nickName);
uni.setStorageSync('stuId', data.userId); uni.setStorageSync('stuId', data.userId);
uni.setStorageSync("stuNo", data.userName) uni.setStorageSync("stuNo", data.userName)
//uni.setStorageSync("deptName", data.dept.deptName) uni.setStorageSync("deptName", data.dept.deptName)
uni.setStorageSync("roles", res.roleGroup) uni.setStorageSync("roles", res.roleGroup)
this.nickName = data.nickName this.nickName = data.nickName
this.username = data.userName this.username = data.userName

View File

@@ -8,9 +8,9 @@
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item">
<label>02 按要求参加辅导员各项会议培训10</label> <label>02 按要求参加辅导员各项会议培训5</label>
<view class="bottom"> <view class="bottom">
<input type="number" @blur="onLimitInput($event,'conferenceScoring',10)" <input type="number" @blur="onLimitInput($event,'conferenceScoring',5)"
v-model="formData.conferenceScoring" placeholder="请输入分值" placeholder-class="input-placeholder" /> v-model="formData.conferenceScoring" placeholder="请输入分值" placeholder-class="input-placeholder" />
<text @tap="uploadMaterials"> <text @tap="uploadMaterials">
{{commitStatus==1?"查看材料":"上传材料"}} {{commitStatus==1?"查看材料":"上传材料"}}
@@ -28,7 +28,7 @@
kpiFillingAMgtDetail kpiFillingAMgtDetail
} from "@/api/instructor/superintendent.js" } from "@/api/instructor/superintendent.js"
export default { export default {
props: ["queryDetailParams", "commitStatus"], props: ["queryDetailParams", "commitStatus", "classType"],
data() { data() {
return { return {
formData: { formData: {
@@ -39,7 +39,11 @@
} }
}, },
created() { created() {
kpiFillingAMgtDetail(this.queryDetailParams).then(res => { const params = {
...this.queryDetailParams,
classType: this.classType
};
kpiFillingAMgtDetail(params).then(res => {
console.log(res); console.log(res);
if (res.rows.length > 0) { if (res.rows.length > 0) {
const { const {

View File

@@ -0,0 +1,118 @@
<template>
<view class="form-container">
<view class="form-item">
<label>加分项三选一不选则不加分</label>
<view class="options">
<radio-group @change="onOptionChange">
<label class="option-item" v-for="(item, index) in options" :key="index">
<radio :value="item.value" :checked="formData.bonusType === item.value" />
<text>{{ item.label }} (+{{ item.score }})</text>
</label>
</radio-group>
</view>
</view>
</view>
</template>
<script>
import {
kpiFillingBonusPointsDetail
} from "@/api/instructor/superintendent.js"
export default {
props: ["queryDetailParams", "commitStatus", "classType"],
data() {
return {
options: [
{ label: "1.获得上级部门或学校表扬,妥善处置学生事件并形成典型案例,积极建言献策且建议被采纳,发挥模范带头作用。", value: "option1", score: 10 },
{ label: "2.在学校、学院阶段性重要任务推进过程中,主动担当作为,切实发挥作用。", value: "option2", score: 10 },
{ label: "3.协助学校开展辅导员培训、会议和学生活动,在活动中担任工作人员。", value: "option3", score: 10 }
],
formData: {
bonusType: "",
bonusScoring: "",
id: ""
}
}
},
created() {
const params = {
...this.queryDetailParams,
classType: this.classType
};
kpiFillingBonusPointsDetail(params).then(res => {
console.log(res);
if (res && res.rows && res.rows.length > 0) {
const {
bonusType,
bonusScoring,
id
} = res.rows[0];
this.formData = {
...this.formData,
bonusType,
bonusScoring,
id
};
} else {
console.log("第一次");
}
}).catch(err => {
console.log("API调用失败", err);
})
},
methods: {
onOptionChange(e) {
const value = e.detail.value;
this.formData.bonusType = value;
const selected = this.options.find(item => item.value === value);
this.formData.bonusScoring = selected ? selected.score : 0;
},
getFormData() {
return this.formData;
}
}
}
</script>
<style scoped lang="scss">
.form-container {
.form-item {
padding: 22rpx 40rpx 40rpx 40rpx;
background-color: white;
margin-bottom: 40rpx;
border-radius: 16rpx;
label {
margin-bottom: 20rpx;
display: inline-block;
font-size: 26rpx;
}
.options {
radio-group {
display: flex;
flex-direction: column;
.option-item {
display: flex;
align-items: center;
padding: 20rpx 0;
border-bottom: 1px solid #f0f0f0;
&:last-child {
border-bottom: none;
}
radio {
margin-right: 20rpx;
}
text {
font-size: 28rpx;
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,116 @@
<template>
<view class="form-container">
<view class="form-item">
<label>01 指导审核毕业生登记表等就业核心材料10</label>
<view class="bottom">
<input @blur="onLimitInput($event,'gradFormAuditScoring',10)" type="number"
v-model="formData.gradFormAuditScoring" placeholder="请输入分值" placeholder-class="input-placeholder" />
</view>
</view>
<view class="form-item">
<label>02 开展学生就业咨询服务及团体辅导工作助力学生解决就业困惑提升就业竞争力5</label>
<view class="bottom">
<input type="number" @blur="onLimitInput($event,'stuCareerConsultScoring',5)"
v-model="formData.stuCareerConsultScoring" placeholder="请输入分值" placeholder-class="input-placeholder" />
</view>
</view>
<view class="form-item">
<label>03 审核毕业生源信息就业系统信息等数据及就业证明材料含真实性完整性规范性10</label>
<view class="bottom">
<input type="number" @blur="onLimitInput($event,'gradFormGuidanceScoring',10)"
v-model="formData.gradFormGuidanceScoring" placeholder="请输入分值" placeholder-class="input-placeholder" />
</view>
</view>
</view>
</template>
<script>
import {
limitInput
} from "@/utils/limitInput.js"
import {
kpiFillingGraduationGuidanceDetail
} from "@/api/instructor/superintendent.js"
export default {
props: ["queryDetailParams", "commitStatus", "classType"],
data() {
return {
formData: {
gradFormAuditScoring: "",
stuCareerConsultScoring: "",
gradFormGuidanceScoring: "",
id: ""
}
}
},
created() {
const params = {
...this.queryDetailParams,
classType: this.classType
};
kpiFillingGraduationGuidanceDetail(params).then(res => {
console.log(res);
if (res.rows && res.rows.length > 0) {
const {
gradFormAuditScoring,
stuCareerConsultScoring,
gradFormGuidanceScoring,
id
} = res.rows[0];
this.formData = {
...this.formData,
gradFormAuditScoring,
stuCareerConsultScoring,
gradFormGuidanceScoring,
id
};
} else {
console.log("第一次");
}
})
},
methods: {
onLimitInput(event, name, max) {
let result = limitInput(event.detail.value, max);
this.formData[name] = result;
},
getFormData() {
return this.formData;
}
}
}
</script>
<style scoped lang="scss">
.form-container {
.form-item {
padding: 22rpx 40rpx 40rpx 40rpx;
background-color: white;
margin-bottom: 40rpx;
border-radius: 16rpx;
label {
margin-bottom: 20rpx;
display: inline-block;
font-size: 26rpx;
}
.bottom {
display: flex;
align-items: center;
input {
flex: 1;
border: 1px solid #E1E1E1;
border-radius: 10rpx;
height: 60rpx;
padding-left: 30rpx;
.input-placeholder {
color: #b6b6b6;
}
}
}
}
}
</style>

View File

@@ -113,7 +113,7 @@
kpiFillingNegativeListDetail kpiFillingNegativeListDetail
} from "@/api/instructor/superintendent.js" } from "@/api/instructor/superintendent.js"
export default { export default {
props: ["queryDetailParams"], props: ["queryDetailParams", "classType"],
data() { data() {
return { return {
formData: { formData: {
@@ -129,7 +129,11 @@
} }
}, },
created() { created() {
kpiFillingNegativeListDetail(this.queryDetailParams).then(res => { const params = {
...this.queryDetailParams,
classType: this.classType
};
kpiFillingNegativeListDetail(params).then(res => {
console.log(res); console.log(res);
if (res.rows.length > 0) { if (res.rows.length > 0) {
// this.formData = res.rows[0]; // this.formData = res.rows[0];
@@ -164,9 +168,10 @@
handleRadioChange(e) { handleRadioChange(e) {
const groupName = e.target.dataset.groupName; // 获取data-group-name的值 const groupName = e.target.dataset.groupName; // 获取data-group-name的值
this.formData[groupName] = e.detail.value; // 更新formData中对应的属性 this.formData[groupName] = e.detail.value; // 更新formData中对应的属性
// 可以在这里加入其他逻辑,比如数据校验、表单提交等 console.log('negative-list formData:', this.formData);
}, },
getFormData() { getFormData() {
console.log('getFormData called, returning:', this.formData);
return this.formData; return this.formData;
} }
} }

View File

@@ -1,38 +1,48 @@
<template> <template>
<view class="form-container"> <view class="form-container">
<view class="form-item"> <view class="form-item">
<label>01 严格执行学生请销假登记制度5</label> <label>{{label01}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'stuLeaveMaterialsScoring',5)" v-model="formData.stuLeaveMaterialsScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'stuLeaveMaterialsScoring',5)"
v-model="formData.stuLeaveMaterialsScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" /> placeholder-class="input-placeholder" />
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item">
<label>02 认真指导学生完成各项材料填报工作 10</label> <label>{{label02}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'stuFillingMaterialsScoring',10)" v-model="formData.stuFillingMaterialsScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'stuFillingMaterialsScoring',maxStuDisciplinaryViolation)"
v-model="formData.stuFillingMaterialsScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" /> placeholder-class="input-placeholder" />
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item">
<label>03 按时按质完成学生基础数据上报工作10</label> <label>{{label03}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'stuBasicDataScoring',10)" v-model="formData.stuBasicDataScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'stuBasicDataScoring',maxHandleEvents)" v-model="formData.stuBasicDataScoring"
type="number" placeholder="请输入分值" placeholder-class="input-placeholder" />
</view>
</view>
<view class="form-item">
<label>{{label04}}</label>
<view class="bottom">
<input @blur="onLimitInput($event,'stuDisciplinaryViolationScoring',5)"
v-model="formData.stuDisciplinaryViolationScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" /> placeholder-class="input-placeholder" />
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item">
<label>04 按规定完成学生违纪处分材料5</label> <label>{{label05}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'stuDisciplinaryViolationScoring',5)" v-model="formData.stuDisciplinaryViolationScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'handleEventsScoring',maxStuDisciplinaryViolation)" v-model="formData.handleEventsScoring"
placeholder-class="input-placeholder" /> type="number" placeholder="请输入分值" placeholder-class="input-placeholder" />
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item">
<label>05 按程序要求处理突发事件10</label> <label>{{label06}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'handleEventsScoring',10)" v-model="formData.handleEventsScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'otherTaskScoring',5)" v-model="formData.otherTaskScoring"
placeholder-class="input-placeholder" /> type="number" placeholder="请输入分值" placeholder-class="input-placeholder" />
</view> </view>
</view> </view>
</view> </view>
@@ -46,54 +56,108 @@
kpiFillingBusinessWorkDetail kpiFillingBusinessWorkDetail
} from "@/api/instructor/superintendent.js" } from "@/api/instructor/superintendent.js"
export default { export default {
props: ["queryDetailParams"], props: {
data() { queryDetailParams: Object,
return { commitStatus: [String, Number],
formData: { classType: {
stuLeaveMaterialsScoring: "", type: String,
stuFillingMaterialsScoring: "", default: 'ungraduate'
stuBasicDataScoring: "",
stuDisciplinaryViolationScoring: "",
handleEventsScoring: "",
id: ""
}
} }
}, },
created() { computed: {
kpiFillingBusinessWorkDetail(this.queryDetailParams).then(res => { isGraduate() {
if (res.rows.length > 0) { return this.classType === 'graduate';
const {
stuLeaveMaterialsScoring,
stuFillingMaterialsScoring,
stuBasicDataScoring,
stuDisciplinaryViolationScoring,
handleEventsScoring,
id
} = res.rows[0];
this.formData = {
...this.formData, // 保留 this.formData 中已有的其他属性
stuLeaveMaterialsScoring,
stuFillingMaterialsScoring,
stuBasicDataScoring,
stuDisciplinaryViolationScoring,
handleEventsScoring,
id
};
} else {
console.log("第一次");
}
})
},
methods: {
onLimitInput(event,name,max) {
let result = limitInput(event.detail.value,max);
this.formData[name] = result;
}, },
getFormData() { label01() {
return this.formData; return this.isGraduate
? "01 按规定完成学生学籍异动、违纪处分与解除等材料5分"
: "01 严格执行学生请销假登记制度5分";
},
label02() {
return this.isGraduate
? "02 认真完成评优评先、资助评定工作 10分"
: "02 按规定完成学生学籍异动、违纪处分与解除等材料5分";
},
label03() {
return this.isGraduate
? "03 按时、准确填报学生各项基础数据 5分"
: "03 认真完成评优评先、资助评定工作10分";
},
label04() {
return this.isGraduate
? "04 认真指导学生完成各项材料填报工作 5分"
: "04 按时、准确填报学生各项基础数据5分";
},
label05() {
return this.isGraduate
? "05 按程序要求处理突发事件 10分"
: "05 认真指导学生完成各项材料填报工作5分";
},
label06() {
return this.isGraduate
? "06 按时按质完成学工、学院发布的各项学生工作通知、任务 5分"
: "06 按程序要求处理突发事件5分";
},
maxStuDisciplinaryViolation() {
return this.isGraduate ? 10 : 5;
},
maxHandleEvents() {
return this.isGraduate ? 5 : 10;
}
},data() {
return {
formData: {
stuLeaveMaterialsScoring: "",
stuFillingMaterialsScoring: "",
stuBasicDataScoring: "",
stuDisciplinaryViolationScoring: "",
handleEventsScoring: "",
otherTaskScoring: "",
id: ""
}
}
},
created() {
const params = {
...this.queryDetailParams,
classType: this.classType
};
kpiFillingBusinessWorkDetail(params).then(res => {
if (res.rows.length > 0) {
const {
stuLeaveMaterialsScoring,
stuFillingMaterialsScoring,
stuBasicDataScoring,
stuDisciplinaryViolationScoring,
handleEventsScoring,
otherTaskScoring,
id
} = res.rows[0];
this.formData = {
...this.formData, // 保留 this.formData 中已有的其他属性
stuLeaveMaterialsScoring,
stuFillingMaterialsScoring,
stuBasicDataScoring,
stuDisciplinaryViolationScoring,
handleEventsScoring,
otherTaskScoring,
id
};
} else {
console.log("第一次");
}
})
},
methods: {
onLimitInput(event, name, max) {
let result = limitInput(event.detail.value, max);
this.formData[name] = result;
},
getFormData() {
return this.formData;
}
} }
} }
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

View File

@@ -44,7 +44,7 @@
delkpiFillingRewards delkpiFillingRewards
} from "@/api/instructor/overwork-materials.js" } from "@/api/instructor/overwork-materials.js"
export default { export default {
props: ["queryDetailParams", "commitStatus"], props: ["queryDetailParams", "commitStatus", "classType"],
data() { data() {
return { return {
actionOptions: [{ actionOptions: [{
@@ -67,6 +67,7 @@
created() { created() {
this.query = { this.query = {
...this.queryDetailParams, ...this.queryDetailParams,
classType: this.classType,
fdyName: uni.getStorageSync("stuName"), fdyName: uni.getStorageSync("stuName"),
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,

View File

@@ -48,7 +48,7 @@
delkpiFillingStuEmergency delkpiFillingStuEmergency
} from "@/api/instructor/studentEmergencies.js" } from "@/api/instructor/studentEmergencies.js"
export default { export default {
props: ["queryDetailParams", "commitStatus"], props: ["queryDetailParams", "commitStatus", "classType"],
data() { data() {
return { return {
actionOptions: [{ actionOptions: [{
@@ -71,6 +71,7 @@
mounted() { mounted() {
this.query = { this.query = {
...this.queryDetailParams, ...this.queryDetailParams,
classType: this.classType,
fdyName: uni.getStorageSync("stuName"), fdyName: uni.getStorageSync("stuName"),
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,

View File

@@ -1,7 +1,7 @@
<template> <template>
<view class="student-management"> <view class="student-management">
<view class="form-item"> <view class="form-item">
<label>01 每周按时开展班会10</label> <label>{{label01}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'classScoring',10)" v-model="classScoring" type="number" <input @blur="onLimitInput($event,'classScoring',10)" v-model="classScoring" type="number"
placeholder="请输入分值" placeholder-class="input-placeholder" /> placeholder="请输入分值" placeholder-class="input-placeholder" />
@@ -10,8 +10,8 @@
</text> </text>
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item" v-if="!isGraduate">
<label>02 每周深入学生宿舍至少2次10</label> <label>{{label02}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'visitDormitoryScoring',10)" v-model="visitDormitoryScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'visitDormitoryScoring',10)" v-model="visitDormitoryScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" /> placeholder-class="input-placeholder" />
@@ -21,7 +21,7 @@
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item">
<label>03 每月与带班学生谈心谈话覆盖率不低于8%10</label> <label>{{label03}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'stuTalkScoring',10)" v-model="stuTalkScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'stuTalkScoring',10)" v-model="stuTalkScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" /> placeholder-class="input-placeholder" />
@@ -30,8 +30,8 @@
</text> </text>
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item" v-if="!isGraduate">
<label>04 每月开展班团干部会议至少2次5</label> <label>{{label04}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'cadreScoring',5)" v-model="cadreScoring" type="number" placeholder="请输入分值" placeholder-class="input-placeholder" /> <input @blur="onLimitInput($event,'cadreScoring',5)" v-model="cadreScoring" type="number" placeholder="请输入分值" placeholder-class="input-placeholder" />
<text @tap="uploadLeagueMeetingMaterial"> <text @tap="uploadLeagueMeetingMaterial">
@@ -39,8 +39,8 @@
</text> </text>
</view> </view>
</view> </view>
<view class="form-item"> <view class="form-item" v-if="!isGraduate">
<label>05 每月深入学生社区面向学生开展活动1次 5</label> <label>{{label05}}</label>
<view class="bottom"> <view class="bottom">
<input @blur="onLimitInput($event,'stuActivityScoring',5)" v-model="stuActivityScoring" type="number" placeholder="请输入分值" <input @blur="onLimitInput($event,'stuActivityScoring',5)" v-model="stuActivityScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" /> placeholder-class="input-placeholder" />
@@ -49,6 +49,20 @@
</text> </text>
</view> </view>
</view> </view>
<view class="form-item" v-if="!isGraduate">
<label>{{label06}}</label>
<view class="bottom">
<input @blur="onLimitInput($event,'edgScoring',5)" v-model="edgScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" />
</view>
</view>
<view class="form-item" v-if="!isGraduate">
<label>{{label07}}</label>
<view class="bottom">
<input @blur="onLimitInput($event,'noticeScoring',5)" v-model="noticeScoring" type="number" placeholder="请输入分值"
placeholder-class="input-placeholder" />
</view>
</view>
</view> </view>
</template> </template>
@@ -60,7 +74,49 @@
limitInput limitInput
} from "@/utils/limitInput.js" } from "@/utils/limitInput.js"
export default { export default {
props: ["queryDetailParams","commitStatus"], props: {
queryDetailParams: Object,
commitStatus: [String, Number],
classType: {
type: String,
default: 'ungraduate'
}
},
computed: {
isGraduate() {
return this.classType === 'graduate';
},
label01() {
return this.isGraduate
? "01 每月通过线上线下方式定期召开班会开展教育10分"
: "01 每周日及节假日收假当天组织开展班会10分";
},
label02() {
if (this.isGraduate) return "";
return "02 每周深入学生宿舍至少2次10分";
},
label03() {
return this.classType === 'graduate'
? "03 月度谈心谈话总量≥10人次覆盖重点关注学生困难救助、就业预警、心理危机、违纪待处理等10分"
: "03 月度谈心谈话总量≥10人次覆盖重点关注学生困难救助、学业指导、心理危机、违纪待处理等10分";
},
label04() {
if (this.isGraduate) return "";
return "04 每月开展班团干部培训、专题工作会议频次均不少于1次5分";
},
label05() {
if (this.isGraduate) return "";
return "05 每月组织或参与学生社区育人活动、思政教育活动及文化艺术体育活动频次不少于2次5分";
},
label06() {
if (this.isGraduate) return "";
return "06 根据学校就业育人工作部署第一学期需指导并组织所带班级学生参与职业测评整体完成率需≥90%第二学期每月需开展1次就业育人相关活动。5分";
},
label07() {
if (this.isGraduate) return "";
return "07 按时按质完成学校及相关职能部门发布的与学生相关的各项工作通知、任务5分";
}
},
data() { data() {
return { return {
classScoring: "", //班会材料分数 classScoring: "", //班会材料分数
@@ -68,29 +124,74 @@
stuTalkScoring: "", // 学生谈话分数 stuTalkScoring: "", // 学生谈话分数
cadreScoring: "", //班团干部会议材料分数 cadreScoring: "", //班团干部会议材料分数
stuActivityScoring: "", //学生开展活动材料分数 stuActivityScoring: "", //学生开展活动材料分数
edgScoring: "", //职业测评分数
noticeScoring: "", //其他任务分数
id: "", //学生开展活动材料分数 id: "", //学生开展活动材料分数
queryParams:null queryParams:null
} }
}, },
created() { created() {
teacherKpiFillingMgtDetail(this.queryDetailParams).then(res => { console.log('===== student-management created =====');
console.log('queryDetailParams:', this.queryDetailParams);
console.log('classType:', this.classType);
},
mounted() {
// 初始化查询参数
this.initQueryParams();
// 等待 classType 准备好后再查询
if (this.classType) {
this.loadData();
}
},
methods: {
loadData() {
// 查询时带上 classType
const queryParams = {
...this.queryDetailParams,
classType: this.classType
};
console.log('最终查询参数:', queryParams);
teacherKpiFillingMgtDetail(queryParams).then(res => {
console.log('===== API 返回数据 =====');
console.log(res); console.log(res);
if (res.data) { if (res.data) {
this.classScoring = res.data.classScoring; // 毕业班只填充需要的字段
this.visitDormitoryScoring = res.data.visitDormitoryScoring; if (this.isGraduate) {
this.stuTalkScoring = res.data.stuTalkScoring; this.classScoring = res.data.classScoring;
this.cadreScoring = res.data.cadreScoring; this.stuTalkScoring = res.data.stuTalkScoring;
this.stuActivityScoring = res.data.stuActivityScoring; this.id = res.data.id;
this.id = res.data.id; } else {
this.classScoring = res.data.classScoring;
this.visitDormitoryScoring = res.data.visitDormitoryScoring;
this.stuTalkScoring = res.data.stuTalkScoring;
this.cadreScoring = res.data.cadreScoring;
this.stuActivityScoring = res.data.stuActivityScoring;
this.edgScoring = res.data.edgScoring;
this.noticeScoring = res.data.noticeScoring;
this.id = res.data.id;
}
} }
}) })
},
initQueryParams() {
this.queryParams = new URLSearchParams({ this.queryParams = new URLSearchParams({
year: this.queryDetailParams.fillingYear, year: this.queryDetailParams.fillingYear,
month: this.queryDetailParams.fillingMonth, month: this.queryDetailParams.fillingMonth,
commitStatus:this.commitStatus commitStatus:this.commitStatus
}); });
}, },
methods: { onLimitInput(event,name,max) {
let result = limitInput(event.detail.value,max);
this[name] = result;
},
initQueryParams() {
this.queryParams = new URLSearchParams({
year: this.queryDetailParams.fillingYear,
month: this.queryDetailParams.fillingMonth,
commitStatus:this.commitStatus
});
},
onLimitInput(event,name,max) { onLimitInput(event,name,max) {
let result = limitInput(event.detail.value,max); let result = limitInput(event.detail.value,max);
this[name] = result; this[name] = result;
@@ -122,14 +223,20 @@
}) })
}, },
getFormData() { getFormData() {
return { const data = {
classScoring: this.classScoring, classScoring: this.classScoring,
visitDormitoryScoring: this.visitDormitoryScoring,
stuTalkScoring: this.stuTalkScoring, stuTalkScoring: this.stuTalkScoring,
cadreScoring: this.cadreScoring,
stuActivityScoring: this.stuActivityScoring,
id: this.id id: this.id
}; };
// 非毕业班才包含这些字段
if (!this.isGraduate) {
data.visitDormitoryScoring = this.visitDormitoryScoring;
data.cadreScoring = this.cadreScoring;
data.stuActivityScoring = this.stuActivityScoring;
data.edgScoring = this.edgScoring;
data.noticeScoring = this.noticeScoring;
}
return data;
} }
} }
} }

View File

@@ -77,37 +77,42 @@
+ +
</view> </view>
<uni-popup @change="popupChange" ref="popupTime" class="popup-time" background-color="#ffffff"> <uni-popup @change="popupChange" ref="popupTime" class="popup-time" background-color="#ffffff">
<view class="popup-content"> <view class="popup-content">
<view class="title"> <view class="title">
填报时间 填报时间
</view>
<view class="class-type-btns">
<button :class="['type-btn', classType === 'graduate' ? 'active' : '']" @tap="selectClassType('graduate')">毕业班</button>
<button :class="['type-btn', classType === 'ungraduate' ? 'active' : '']" @tap="selectClassType('ungraduate')">非毕业班</button>
</view>
<view class="type-tip">必选</view>
<form @submit="topersonalReporting">
<view class="form-item">
<label>填报年份</label>
<picker v-if="years.length>0" range-key="dictValue" :value="yearIndex" :range="years"
@change="yearChange" name="year">
<view class="uni-input">
<text class="val">{{years[yearIndex].dictValue}}</text>
<uni-icons type="calendar" size="25" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="form-item">
<label>选择月份</label>
<picker v-if="months.length>0" name="month" range-key="dictValue" @change="monthChange"
:value="monthIndex" :range="months">
<view class="uni-input">
<text class="val">{{months[monthIndex].dictValue}}</text>
<uni-icons type="calendar" size="25" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="btns">
<button type="default" @tap="onCancel">取消</button>
<button form-type="submit" type="primary">确定</button>
</view>
</form>
</view> </view>
<form @submit="topersonalReporting">
<view class="form-item">
<label>填报年份</label>
<picker v-if="years.length>0" range-key="dictValue" :value="yearIndex" :range="years"
@change="yearChange" name="year">
<view class="uni-input">
<text class="val">{{years[yearIndex].dictValue}}</text>
<uni-icons type="calendar" size="25" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="form-item">
<label>选择月份</label>
<picker v-if="months.length>0" name="month" range-key="dictValue" @change="monthChange"
:value="monthIndex" :range="months">
<view class="uni-input">
<text class="val">{{months[monthIndex].dictValue}}</text>
<uni-icons type="calendar" size="25" color="#202020"></uni-icons>
</view>
</picker>
</view>
<view class="btns">
<button type="default" @tap="onCancel">取消</button>
<button form-type="submit" type="primary">确定</button>
</view>
</form>
</view>
</uni-popup> </uni-popup>
<uni-popup ref="popupAuditStatus" class="popup-audit " background-color="#ffffff"> <uni-popup ref="popupAuditStatus" class="popup-audit " background-color="#ffffff">
<view class="popup-content"> <view class="popup-content">
@@ -146,6 +151,7 @@
export default { export default {
data() { data() {
return { return {
classType: "graduate", // graduate-毕业班, ungraduate-非毕业班
topLoading: true, topLoading: true,
loading: false, loading: false,
type: 'center', type: 'center',
@@ -250,7 +256,8 @@
month: item.fillingMonth, month: item.fillingMonth,
reportingId: item.id, reportingId: item.id,
commitStatus: item.commitStatus, commitStatus: item.commitStatus,
roleAudit: item.roleAudit roleAudit: item.roleAudit,
classType: item.classType || 'ungraduate'
}); });
if (item.auditStatus == 2) { if (item.auditStatus == 2) {
let refuseTxt = ""; let refuseTxt = "";
@@ -292,30 +299,51 @@
// 学生管理分数 // 学生管理分数
row.kpiFillingStuMgtList.forEach(element => { row.kpiFillingStuMgtList.forEach(element => {
if (element.hasOwnProperty('id')) { if (element.hasOwnProperty('id')) {
scoring += element.cadreScoring scoring += Number(element.cadreScoring) || 0
scoring += element.classScoring scoring += Number(element.classScoring) || 0
scoring += element.stuActivityScoring scoring += Number(element.stuActivityScoring) || 0
scoring += element.stuTalkScoring scoring += Number(element.stuTalkScoring) || 0
scoring += element.visitDormitoryScoring scoring += Number(element.visitDormitoryScoring) || 0
scoring += Number(element.noticeScoring) || 0
scoring += Number(element.edgScoring) || 0
} }
}); });
// 业务工作分数 // 业务工作分数
row.kpiFillingBusinessWorksList.forEach(element => { row.kpiFillingBusinessWorksList.forEach(element => {
if (element.hasOwnProperty('id')) { if (element.hasOwnProperty('id')) {
scoring += element.stuLeaveMaterialsScoring scoring += Number(element.stuLeaveMaterialsScoring) || 0
scoring += element.stuFillingMaterialsScoring scoring += Number(element.stuFillingMaterialsScoring) || 0
scoring += element.stuBasicDataScoring scoring += Number(element.stuBasicDataScoring) || 0
scoring += element.stuDisciplinaryViolationScoring scoring += Number(element.stuDisciplinaryViolationScoring) || 0
scoring += element.handleEventsScoring scoring += Number(element.handleEventsScoring) || 0
scoring += Number(element.otherTaskScoring) || 0
} }
}); });
// 考勤管理分数 // 考勤管理分数
row.kpiFillingAMgtList.forEach(element => { row.kpiFillingAMgtList.forEach(element => {
if (element.hasOwnProperty('id')) { if (element.hasOwnProperty('id')) {
scoring += element.dutyWorkScoring scoring += Number(element.dutyWorkScoring) || 0
scoring += element.conferenceScoring scoring += Number(element.conferenceScoring) || 0
} }
}); });
// 加分项分数
if (row.kpiFillingBonusPointsList) {
row.kpiFillingBonusPointsList.forEach(element => {
if (element.hasOwnProperty('id')) {
scoring += Number(element.bonusScoring) || 0
}
});
}
// 就业指导工作分数
if (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
}
});
}
return scoring return scoring
}, },
scrolltolower() { scrolltolower() {
@@ -391,7 +419,17 @@
addRecordsPopup() { addRecordsPopup() {
this.$refs.popupTime.open(this.type); this.$refs.popupTime.open(this.type);
}, },
selectClassType(type) {
this.classType = type;
},
async topersonalReporting(e) { async topersonalReporting(e) {
if (!this.classType) {
uni.showToast({
title: '请选择班级类型',
icon: 'none'
});
return;
}
this.$refs.popupTime.close(); this.$refs.popupTime.close();
let year = this.years[e.detail.value.year + 1].dictValue; let year = this.years[e.detail.value.year + 1].dictValue;
let month = this.months[e.detail.value.month].dictValue; let month = this.months[e.detail.value.month].dictValue;
@@ -399,6 +437,7 @@
let formData = { let formData = {
fillingYear: year, fillingYear: year,
fillingMonth: month, fillingMonth: month,
classType: this.classType,
} }
let res = await kpiFillingAdd(formData); let res = await kpiFillingAdd(formData);
if (res.code == 200) { if (res.code == 200) {
@@ -407,7 +446,8 @@
month, month,
commitStatus: 0, commitStatus: 0,
reportingId: res.data.id, reportingId: res.data.id,
completionStatus: 0 completionStatus: 0,
classType: this.classType,
}); });
uni.navigateTo({ uni.navigateTo({
url: `/pages/instructor/performance-appraisal/performance-evaluation/personal-reporting?${searchParams.toString()}` url: `/pages/instructor/performance-appraisal/performance-evaluation/personal-reporting?${searchParams.toString()}`
@@ -416,12 +456,14 @@
}, },
toPersonalReportingPage(params) { toPersonalReportingPage(params) {
console.log('toPersonalReportingPage params:', params);
const searchParams = new URLSearchParams({ const searchParams = new URLSearchParams({
year: params.fillingYear, year: params.fillingYear,
month: params.fillingMonth, month: params.fillingMonth,
reportingId: params.id, reportingId: params.id,
commitStatus: params.commitStatus, commitStatus: params.commitStatus,
completionStatus: params.completionStatus completionStatus: params.completionStatus,
classType: params.classType || 'ungraduate'
}); });
uni.navigateTo({ uni.navigateTo({
@@ -702,7 +744,7 @@
.popup-content { .popup-content {
width: 600rpx; width: 600rpx;
height: 600rpx; height: 680rpx;
padding: 40rpx 50rpx 40rpx; padding: 40rpx 50rpx 40rpx;
.title { .title {
@@ -748,6 +790,35 @@
} }
} }
.class-type-btns {
display: flex;
justify-content: center;
margin: 30rpx 0;
.type-btn {
flex: 1;
margin: 0 20rpx;
height: 70rpx;
line-height: 70rpx;
background-color: #f0f0f0;
color: #666;
border-radius: 10rpx;
font-size: 28rpx;
&.active {
background-color: #1890FF;
color: #fff;
}
}
}
.type-tip {
text-align: center;
color: #ff4d4f;
font-size: 24rpx;
margin-bottom: 20rpx;
}
.btns { .btns {
display: flex; display: flex;
margin-top: 50rpx; margin-top: 50rpx;

View File

@@ -6,18 +6,20 @@
:key="index">{{item}}</text> :key="index">{{item}}</text>
</view> </view>
</scroll-view> </scroll-view>
<view class="form"> <view class="form" v-if="!loading">
<StudentManagement :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" ref="studentManagement" v-if="tabIndex==0" /> <StudentManagement :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="studentManagement" v-if="tabIndex==0" :key="classType" />
<ProfessionalWork :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" ref="ProfessionalWork" v-if="tabIndex==1" /> <GraduationGuidance :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="GraduationGuidance" v-if="classType === 'graduate' && tabIndex==1" :key="classType" />
<AttendanceManagement :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" ref="AttendanceManagement" <ProfessionalWork :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="ProfessionalWork" v-if="(classType === 'graduate' && tabIndex==2) || (classType !== 'graduate' && tabIndex==1)" :key="classType" />
v-if="tabIndex==2" /> <AttendanceManagement :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="AttendanceManagement"
<NegativeList :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" ref="NegativeList" v-if="tabIndex==3" /> v-if="(classType === 'graduate' && tabIndex==3) || (classType !== 'graduate' && tabIndex==2)" :key="classType" />
<OverWork :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" ref="OverWork" v-if="tabIndex==4" /> <BonusPoints :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="BonusPoints" v-if="(classType === 'graduate' && tabIndex==4) || (classType !== 'graduate' && tabIndex==3)" :key="classType" />
<StudentEmergencies :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" ref="StudentEmergencies" v-if="tabIndex==5" /> <NegativeList :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="NegativeList" v-if="(classType === 'graduate' && tabIndex==5) || (classType !== 'graduate' && tabIndex==4)" :key="classType" />
<OverWork :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="OverWork" v-if="(classType === 'graduate' && tabIndex==6) || (classType !== 'graduate' && tabIndex==5)" :key="classType" />
<StudentEmergencies :commitStatus="commitStatus" :queryDetailParams="queryDetailParams" :classType="classType" ref="StudentEmergencies" v-if="(classType === 'graduate' && tabIndex==7) || (classType !== 'graduate' && tabIndex==6)" :key="classType" />
<view class="btns" v-if="commitStatus==0"> <view class="btns" v-if="commitStatus==0">
<button type="primary" class="prev-page" v-if="tabIndex!=0" @click="onPrevPage">上一页</button> <button type="primary" class="prev-page" v-if="tabIndex!=0" @click="onPrevPage">上一页</button>
<button type="primary" class="next-page" @click="onNextPage" v-if="tabIndex!=5">保存</button> <button type="primary" class="next-page" @click="onNextPage" v-if="(classType === 'graduate' && tabIndex!=7) || (classType !== 'graduate' && tabIndex!=6)">保存</button>
<button type="primary" class="next-page" @click="onSubmit" v-if="tabIndex==5">提交</button> <button type="primary" class="next-page" @click="onSubmit" v-if="(classType === 'graduate' && tabIndex==7) || (classType !== 'graduate' && tabIndex==6)">提交</button>
</view> </view>
</view> </view>
</view> </view>
@@ -26,6 +28,7 @@
<script> <script>
import { import {
kpiFillingUpdate, kpiFillingUpdate,
kpiFillingDetail,
teacherKpiFillingMgtAdd, teacherKpiFillingMgtAdd,
teacherKpiFillingMgtUpdate, teacherKpiFillingMgtUpdate,
teacherKpiFillingMgtDetail, teacherKpiFillingMgtDetail,
@@ -34,7 +37,11 @@
kpiFillingAMgtAdd, kpiFillingAMgtAdd,
kpiFillingAMgtUpdate, kpiFillingAMgtUpdate,
kpiFillingNegativeListAdd, kpiFillingNegativeListAdd,
kpiFillingNegativeListUpdate kpiFillingNegativeListUpdate,
kpiFillingBonusPointsAdd,
kpiFillingBonusPointsUpdate,
kpiFillingGraduationGuidanceAdd,
kpiFillingGraduationGuidanceUpdate
} from "@/api/instructor/superintendent.js" } from "@/api/instructor/superintendent.js"
import StudentManagement from "../components/student-management.vue"; import StudentManagement from "../components/student-management.vue";
import ProfessionalWork from "../components/professional-work.vue"; import ProfessionalWork from "../components/professional-work.vue";
@@ -42,6 +49,8 @@
import NegativeList from "../components/negative-list.vue"; import NegativeList from "../components/negative-list.vue";
import OverWork from "../components/reward-performance-overwork.vue"; import OverWork from "../components/reward-performance-overwork.vue";
import StudentEmergencies from "../components/student-emergencies.vue"; import StudentEmergencies from "../components/student-emergencies.vue";
import BonusPoints from "../components/bonuspoints.vue"
import GraduationGuidance from "../components/graduation-guidance.vue"
export default { export default {
components: { components: {
StudentManagement, StudentManagement,
@@ -50,15 +59,18 @@
NegativeList, NegativeList,
OverWork, OverWork,
StudentEmergencies, StudentEmergencies,
BonusPoints,
GraduationGuidance,
reportingId: "" reportingId: ""
}, },
data() { data() {
return { return {
tabs: ["学生管理", "业务管理", "考勤管理", "负面清单", "超工作量奖励绩效", "处理学生突发事件"],
tabIndex: 0, tabIndex: 0,
fillingYear: "", fillingYear: "",
fillingMonth: "", fillingMonth: "",
queryDetailParams: { classType: "ungraduate",
loading: true,
queryDetailParams: {
fdyName: uni.getStorageSync("stuName"), fdyName: uni.getStorageSync("stuName"),
fillingMonth: "", fillingMonth: "",
fillingYear: "" fillingYear: ""
@@ -76,30 +88,49 @@
updateFunc: teacherKpiFillingMgtUpdate, updateFunc: teacherKpiFillingMgtUpdate,
}, },
1: { 1: {
ref: 'GraduationGuidance',
addFunc: kpiFillingGraduationGuidanceAdd,
updateFunc: kpiFillingGraduationGuidanceUpdate,
},
2: {
ref: 'ProfessionalWork', ref: 'ProfessionalWork',
addFunc: kpiFillingBusinessWorkAdd, addFunc: kpiFillingBusinessWorkAdd,
updateFunc: kpiFillingBusinessWorkUpdate, updateFunc: kpiFillingBusinessWorkUpdate,
}, },
2: { 3: {
ref: 'AttendanceManagement', ref: 'AttendanceManagement',
addFunc: kpiFillingAMgtAdd, addFunc: kpiFillingAMgtAdd,
updateFunc: kpiFillingAMgtUpdate, updateFunc: kpiFillingAMgtUpdate,
}, },
3: { 4: {
ref: 'BonusPoints',
addFunc: kpiFillingBonusPointsAdd,
updateFunc: kpiFillingBonusPointsUpdate,
},
5: {
ref: 'NegativeList', ref: 'NegativeList',
addFunc: kpiFillingNegativeListAdd, addFunc: kpiFillingNegativeListAdd,
updateFunc: kpiFillingNegativeListUpdate, updateFunc: kpiFillingNegativeListUpdate,
}, },
4: { 6: {
ref: 'OverWork', ref: 'OverWork',
}, },
5: { 7: {
ref: 'StudentEmergencies', ref: 'StudentEmergencies',
} }
} }
} }
}, },
computed: {
tabs() {
if (this.classType === 'graduate') {
return ["学生管理", "就业指导工作", "业务管理", "考勤管理", "加分项", "负面清单", "超工作量奖励绩效", "处理学生突发事件"];
}
return ["学生管理", "业务管理", "考勤管理", "加分项", "负面清单", "超工作量奖励绩效", "处理学生突发事件"];
}
},
onLoad(option) { onLoad(option) {
console.log('personal-reporting onLoad option:', option);
this.fillingYear = option.year; this.fillingYear = option.year;
this.fillingMonth = option.month; this.fillingMonth = option.month;
this.reportingId = option.reportingId; this.reportingId = option.reportingId;
@@ -108,8 +139,30 @@
this.commitStatus = option.commitStatus; this.commitStatus = option.commitStatus;
this.completionStatus = option.completionStatus; this.completionStatus = option.completionStatus;
this.roleAudit = option.roleAudit; this.roleAudit = option.roleAudit;
// 始终从后端获取classType
if (this.reportingId) {
this.getClassType();
} else if (option.classType) {
this.classType = option.classType;
}
this.loading = false;
}, },
methods: { methods: {
async getClassType() {
try {
console.log('calling kpiFillingDetail with id:', this.reportingId);
const res = await kpiFillingDetail(this.reportingId);
console.log('kpiFillingDetail response:', res);
if (res.data) {
this.classType = res.data.classType || 'ungraduate';
console.log('classType from backend:', this.classType);
}
} catch(e) {
console.error('getClassType error:', e);
}
},
tabChange(index) { tabChange(index) {
this.tabIndex = index; this.tabIndex = index;
}, },
@@ -137,24 +190,50 @@
addFunc, addFunc,
updateFunc updateFunc
} = this.tabConfigs[this.tabIndex]; } = this.tabConfigs[this.tabIndex];
// 检查组件是否存在
if (!this.$refs[ref]) {
this.tabIndex++;
return;
}
// 获取表单数据 // 获取表单数据
let formData = this.$refs[ref].getFormData(); let formData = this.$refs[ref].getFormData();
formData = { formData = {
...formData, ...formData,
departmentName: uni.getStorageSync("deptName"), departmentName: uni.getStorageSync("deptName") || "测试学院",
fdyName: uni.getStorageSync("stuName"), fdyName: uni.getStorageSync("stuName"),
fillingYear: this.fillingYear, fillingYear: this.fillingYear,
fillingMonth: this.fillingMonth, fillingMonth: this.fillingMonth,
classType: this.classType,
}; };
// 根据班级类型排除不需要填写的字段
let excludeKeys = ['id', 'departmentName', 'fdyName', 'fillingYear', 'fillingMonth', 'classType'];
// 学生管理(tabIndex 0) - 毕业班需要排除部分字段
if (this.tabIndex === 0 && this.classType === 'graduate') {
excludeKeys = [...excludeKeys, 'visitDormitoryScoring', 'cadreScoring', 'stuActivityScoring', 'edgScoring', 'noticeScoring'];
}
// 负面清单(tabIndex 4/5)、考勤管理(tabIndex 2/3)、加分项(tabIndex 3/4)、就业指导(tabIndex 1)等不需要验证空值
if (this.tabIndex === 1 || this.tabIndex === 2 || this.tabIndex === 3 || this.tabIndex === 4 || this.tabIndex === 5) {
excludeKeys = [...excludeKeys,
'moralityAndBehavior', 'speech', 'complaint', 'offense', 'emergency', 'punishment', 'practiceFraud',
'dutyWorkScoring', 'conferenceScoring', 'bonusType', 'bonusScoring',
'gradFormAuditScoring', 'stuCareerConsultScoring', 'gradFormGuidanceScoring'];
}
console.log('formData:', formData);
console.log('excludeKeys:', excludeKeys);
console.log('hasEmptyValues result:', this.hasEmptyValues(formData, excludeKeys));
// 检查formData中是否有空值 // 检查formData中是否有空值
if (this.hasEmptyValues(formData, ['id'])) { if (this.hasEmptyValues(formData, excludeKeys)) {
console.log('表单有空值,阻止保存');
uni.showToast({ uni.showToast({
title: "请填写完整内容!", title: "请填写完整内容!",
icon: 'none' // 根据需要设置图标 icon: 'none' // 根据需要设置图标
}); });
return; // 停止执行后续操作 return; // 停止执行后续操作
} }
if (this.tabIndex !== 4 && this.tabIndex !== 5) { console.log('准备保存tabIndex:', this.tabIndex, 'formData:', formData);
// 只跳过超工作量(tabIndex 6)和处理学生突发事件(tabIndex 7)
if (this.tabIndex !== 6 && this.tabIndex !== 7) {
if (formData.id || formData.id === 0) { if (formData.id || formData.id === 0) {
let res = await updateFunc(formData); let res = await updateFunc(formData);
if (res.code == 200) { if (res.code == 200) {