修复培训:支持逾期报到人工确认并修复学员选择器字段映射

fix(train): handle overdue report confirmation and student picker fields
This commit is contained in:
wangzhibiao committed 2026-09-23 19:08:50 +08:00
1 parent eb1ddfcaa8
commit 62085e8a49
4 files changed
+370 -21

No files matched your search

+2 -1
View File
@@ -60,6 +60,7 @@ export function confirmReport(enrollmentId, data) {
return request({
url: `/train/enrollments/${enrollmentId}/report`,
method: 'post',
data: data
data: data,
silentErrorCodes: [40051]
})
}
+8 -2
View File
@@ -110,8 +110,14 @@ service.interceptors.response.use(res => {
Message({ message: msg, type: 'warning' })
return Promise.reject('error')
} else if (code !== 200) {
Notification.error({ title: msg })
return Promise.reject(new Error(msg))
const silentCodes = (res.config && res.config.silentErrorCodes) || []
if (!silentCodes.includes(code)) {
Notification.error({ title: msg })
}
const err = new Error(msg)
err.code = code
err.data = res.data
return Promise.reject(err)
} else {
return res.data
}
@@ -158,7 +158,7 @@
<el-form :model="studentSearchQuery" size="small" :inline="true">
<el-form-item label="学员检索">
<el-input
v-model="studentSearchQuery.studentName"
v-model="studentSearchQuery.sName"
placeholder="请输入姓名检索学员库"
clearable
style="width: 200px"
@@ -180,12 +180,24 @@
>
<el-table-column label="选择" width="55" align="center">
<template slot-scope="scope">
<el-radio v-model="addDialog.selectedStudentId" :label="scope.row.sId" />
<el-radio v-model="addDialog.selectedStudentId" :label="scope.row.sId || scope.row.studentId" />
</template>
</el-table-column>
<el-table-column label="姓名" prop="sName" min-width="100">
<template slot-scope="scope">
<span>{{ scope.row.sName || scope.row.studentName || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="性别" prop="sGender" width="65" align="center">
<template slot-scope="scope">
<span>{{ formatGender(scope.row.sGender !== undefined && scope.row.sGender !== null ? scope.row.sGender : scope.row.gender) }}</span>
</template>
</el-table-column>
<el-table-column label="身份证号" prop="idCardMasked" min-width="170" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.idCardMasked || '-' }}</span>
</template>
</el-table-column>
<el-table-column label="姓名" prop="studentName" min-width="100" />
<el-table-column label="性别" prop="gender" width="65" align="center" />
<el-table-column label="身份证号" prop="idCardMasked" min-width="170" show-overflow-tooltip />
<el-table-column label="选派单位" prop="orgName" min-width="140" show-overflow-tooltip />
</el-table>
</div>
@@ -193,7 +205,7 @@
<el-form ref="addForm" :model="addForm" :rules="addRules" label-width="110px" size="small">
<el-form-item label="选中学员" prop="studentId">
<el-input
:value="addDialog.selectedStudent ? (addDialog.selectedStudent.studentName + (addDialog.selectedStudent.orgName ? ' - ' + addDialog.selectedStudent.orgName : '')) : ''"
:value="selectedStudentText"
readonly
placeholder="请在上方列表点击选择学员"
/>
@@ -377,7 +389,7 @@ export default {
studentCandidates: []
},
studentSearchQuery: {
studentName: ''
sName: ''
},
addForm: {
studentId: '',
@@ -408,6 +420,13 @@ export default {
computed: {
isPlanLocked() {
return this.planStatus === 2 || this.planStatus === 3
},
selectedStudentText() {
const s = this.addDialog.selectedStudent
if (!s) return ''
const name = (s.sName || s.studentName || '').trim()
const org = s.orgName ? ` - ${s.orgName}` : ''
return name ? `${name}${org}` : '-'
}
},
watch: {
@@ -503,12 +522,17 @@ export default {
this.getList()
}).catch(() => {})
},
formatGender(val) {
if (val === '0' || val === 0 || val === '男') return '男'
if (val === '1' || val === 1 || val === '女') return '女'
return '-'
},
// ---- 添加单名学员 ----
handleOpenAddModal() {
this.addDialog.selectedStudentId = null
this.addDialog.selectedStudent = null
this.addDialog.studentCandidates = []
this.studentSearchQuery.studentName = ''
this.studentSearchQuery.sName = ''
this.addForm = {
studentId: '',
sourceType: 1,
@@ -520,10 +544,11 @@ export default {
},
searchStudentPool() {
this.addDialog.searchLoading = true
const keyword = (this.studentSearchQuery.sName || '').trim()
listStudent({
pageNum: 1,
pageSize: 20,
studentName: this.studentSearchQuery.studentName
sName: keyword || undefined
}).then(res => {
this.addDialog.studentCandidates = res.rows || []
}).finally(() => {
@@ -532,9 +557,10 @@ export default {
},
handleSelectStudent(row) {
if (row) {
this.addDialog.selectedStudentId = row.sId
const studentId = row.sId || row.studentId
this.addDialog.selectedStudentId = studentId
this.addDialog.selectedStudent = row
this.addForm.studentId = row.sId
this.addForm.studentId = studentId
}
},
submitAddForm() {
@@ -593,19 +619,45 @@ export default {
})
},
handleConfirmReport(row) {
this.$confirm(`确认学员【${row.studentName}】现场报到到班?`, '报到确认', {
const studentName = row.studentName || row.sName || '该学员'
this.$confirm(`确认学员【${studentName}】现场报到到班?`, '报到确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'info'
}).then(() => {
return confirmReport(row.enrollmentId, {
reportWay: 4,
verifyNote: '管理员人工核验到班'
})
}).then(() => {
this.doConfirmReport(row, false)
}).catch(() => {})
},
doConfirmReport(row, forceOverride = false) {
const payload = {
reportWay: 4,
verifyNote: '管理员人工核验到班'
}
if (forceOverride) {
payload.forceOverride = true
}
return confirmReport(row.enrollmentId, payload).then(() => {
this.$modal.msgSuccess('报到成功')
this.getList()
}).catch(() => {})
}).catch(err => {
const isOverdueWarning = err && (
err.code === 40051 ||
(err.message && (err.message.includes('40051') || err.message.includes('已超过本期培训报到截止时间') || err.message.includes('报到截止时间')))
)
if (!forceOverride && isOverdueWarning) {
this.$confirm('该学员已超过本期培训报到截止时间,是否确认逾期报到?', '逾期报到提醒', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.doConfirmReport(row, true)
}).catch(() => {
// 用户取消:不产生任何状态变更
})
} else {
this.$modal.msgError((err && err.message) || '报到失败')
}
})
}
}
}