人员管理

This commit is contained in:
guochunsi
2026-01-04 18:23:27 +08:00
parent fee5e2a6c0
commit 24453baf3e
34 changed files with 1603 additions and 1259 deletions

View File

@@ -15,21 +15,28 @@
</el-form-item>
<el-form-item label="证书编号" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编号" />
<el-input
v-model="waitShenheForm.form.certificateNumber"
placeholder="请输入证书编号(仅支持英文和数字)"
@input="handleCertificateNumberInput"
/>
</el-form-item>
<el-form-item label="证明材料">
<el-upload
:headers="headers"
style="width:3.5cm;height:5.3cm;"
:limit="1"
:action="materialUrlFrom.url"
:file-list="materialUrlFrom.fileListA"
:on-success="materiaUploadSuccessA"
:accept="'.jpg,.jpeg,.png,.pdf'"
>
<el-button size="small" type="primary">点击上传</el-button>
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
<div>
<el-button size="small" type="primary">点击上传</el-button>
<div style="margin-top: 8px;">
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
</div>
</div>
</el-upload>
</el-form-item>
@@ -93,36 +100,48 @@
</el-form-item>
<el-form-item label="证书编码" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编码" />
<el-input
v-model="waitShenheForm.form.certificateNumber"
placeholder="请输入证书编码(仅支持英文和数字)"
show-word-limit
maxlength="100"
@input="handleCertificateNumberInput"
/>
</el-form-item>
<el-form-item label="学历证书">
<el-upload
:headers="headers"
style="width:3.5cm;height:5.3cm;"
:limit="1"
:action="materialUrlFrom.url"
:file-list="materialUrlFrom.fileListA"
:on-success="materiaUploadSuccessA"
:accept="'.jpg,.jpeg,.png,.pdf'"
>
<el-button size="small" type="primary">点击上传</el-button>
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
<div>
<el-button size="small" type="primary">点击上传</el-button>
<div style="margin-top: 8px;">
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
</div>
</div>
</el-upload>
</el-form-item>
<el-form-item label="学位证书">
<el-upload
:headers="headers"
style="width:3.5cm;height:5.3cm;"
:limit="1"
:action="materialUrlFrom.url"
:on-success="materiaUploadSuccessB"
:file-list="materialUrlFrom.fileListB"
:accept="'.jpg,.jpeg,.png,.pdf'"
>
<el-button size="small" type="primary">点击上传</el-button>
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
<div>
<el-button size="small" type="primary">点击上传</el-button>
<div style="margin-top: 8px;">
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
</div>
</div>
</el-upload>
</el-form-item>
@@ -178,21 +197,28 @@
</el-form-item>
<el-form-item label="证书编号" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编号" />
<el-input
v-model="waitShenheForm.form.certificateNumber"
placeholder="请输入证书编号(仅支持英文和数字)"
@input="handleCertificateNumberInput"
/>
</el-form-item>
<el-form-item label="证明材料">
<el-upload
:headers="headers"
style="width:3.5cm;height:5.3cm;"
:limit="1"
:action="materialUrlFrom.url"
:file-list="materialUrlFrom.fileListA"
:on-success="materiaUploadSuccessA"
:accept="'.jpg,.jpeg,.png,.pdf'"
>
<el-button size="small" type="primary">点击上传</el-button>
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
<div>
<el-button size="small" type="primary">点击上传</el-button>
<div style="margin-top: 8px;">
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
</div>
</div>
</el-upload>
</el-form-item>
@@ -237,21 +263,30 @@
</el-form-item>
<el-form-item label="证书编号" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编号" />
<el-input
v-model="waitShenheForm.form.certificateNumber"
placeholder="请输入证书编号(仅支持英文和数字)"
show-word-limit
maxlength="32"
@input="handleCertificateNumberInput"
/>
</el-form-item>
<el-form-item label="材料1">
<el-upload
:headers="headers"
style="width:3.5cm;height:5.3cm;"
:limit="1"
:action="materialUrlFrom.url"
:file-list="materialUrlFrom.fileListA"
:on-success="materiaUploadSuccessA"
:accept="'.jpg,.jpeg,.png,.pdf'"
>
<el-button size="small" type="primary">点击上传</el-button>
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
<div>
<el-button size="small" type="primary">点击上传</el-button>
<div style="margin-top: 8px;">
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
</div>
</div>
</el-upload>
</el-form-item>
@@ -284,15 +319,18 @@
<el-form-item label="证明材料">
<el-upload
:headers="headers"
style="width:3.5cm;height:5.3cm;"
:limit="1"
:action="materialUrlFrom.url"
:on-success="materiaUploadSuccessA"
:file-list="materialUrlFrom.fileListA"
:accept="'.jpg,.jpeg,.png,.pdf'"
>
<el-button size="small" type="primary">点击上传</el-button>
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
<div>
<el-button size="small" type="primary">点击上传</el-button>
<div style="margin-top: 8px;">
<el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>
</div>
</div>
</el-upload>
</el-form-item>
@@ -428,7 +466,7 @@
<script setup lang="ts">
import { ref, reactive, computed } from 'vue'
import { useMessage, useMessageBox } from '/@/hooks/message'
import { updateOtherInfo, getMyTeacherNo, getAllInfoAboutList } from '/@/api/professional/teacherbase'
import { updateOtherInfo, getMyTeacherNo, getAllInfoAboutList } from '/@/api/professional/professionaluser/teacherbase'
import { checkLocked } from '/@/api/professional/professionalstatuslock'
import { getDeptListByLevelTwo, getDeptListByParent as getDeptListByParentApi } from '/@/api/basic/basicdept'
import { getTeacherCertificateList } from '/@/api/professional/rsbase/professionalteachercertificateconf'
@@ -456,7 +494,10 @@
// 表单验证规则
const teacherCertificateRules = {
certificateConfId: [{ required: true, message: '请选择类型', trigger: 'change' }],
certificateNumber: [{ required: true, message: '请输入证书编号', trigger: 'blur' }]
certificateNumber: [
{ required: true, message: '请输入证书编号', trigger: 'blur' },
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编号只能包含英文和数字', trigger: 'blur' }
]
}
const educationRules = {
@@ -464,21 +505,30 @@
type: [{ required: true, message: '请选择教育类型', trigger: 'change' }],
graduateSchool: [{ required: true, message: '请输入毕业学校', trigger: 'blur' }],
major: [{ required: true, message: '请输入所学专业', trigger: 'blur' }],
certificateNumber: [{ required: true, message: '请输入证书编码', trigger: 'blur' }]
certificateNumber: [
{ required: true, message: '请输入证书编码', trigger: 'blur' },
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编码只能包含英文和数字', trigger: 'blur' }
]
}
const proRules = {
professionalTitleConfigId: [{ required: true, message: '请选择职称等级', trigger: 'change' }],
majorStation: [{ required: true, message: '请选择专业技术职务', trigger: 'change' }],
certificateTime: [{ required: true, message: '请选择取证时间', trigger: 'change' }],
certificateNumber: [{ required: true, message: '请输入证书编号', trigger: 'blur' }]
certificateNumber: [
{ required: true, message: '请输入证书编号', trigger: 'blur' },
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编号只能包含英文和数字', trigger: 'blur' }
]
}
const workRules = {
worker: [{ required: true, message: '请选择职业工种', trigger: 'change' }],
qualificationConfigId: [{ required: true, message: '请选择等级', trigger: 'change' }],
certificateTime: [{ required: true, message: '请选择取证时间', trigger: 'change' }],
certificateNumber: [{ required: true, message: '请输入证书编号', trigger: 'blur' }]
certificateNumber: [
{ required: true, message: '请输入证书编号', trigger: 'blur' },
{ pattern: /^[A-Za-z0-9]+$/, message: '证书编号只能包含英文和数字', trigger: 'blur' }
]
}
const honorRules = {
@@ -598,21 +648,25 @@
}
})
// 方法定义
const initDicData = () => {
getAllInfoAboutList().then((response: any) => {
const map = response.data.data
baseInfoAbout.stationTypeList = map['stationTypeList']
baseInfoAbout.atStationList = map['atStationList']
baseInfoAbout.teacherTypeList = map['teacherTypeList']
baseInfoAbout.employmentNatureList = map['employmentNatureList']
baseInfoAbout.stationLevelList = map['stationLevelList']
baseInfoAbout.stationDutyLevelList = map['stationDutyLevelList']
baseInfoAbout.workTypeList = map['workTypeList']
baseInfoAbout.proTitleList = map['proTitleList']
baseInfoAbout.majorStationList = map['majorStationList']
baseInfoAbout.qualificationList = map['qualificationList']
baseInfoAbout.partBranchList = map['partBranchList']
})
const initDicData = async () => {
try {
const response = await getAllInfoAboutList()
const map = response.data
baseInfoAbout.stationTypeList = map['stationTypeList'] || []
baseInfoAbout.atStationList = map['atStationList'] || []
baseInfoAbout.teacherTypeList = map['teacherTypeList'] || []
baseInfoAbout.employmentNatureList = map['employmentNatureList'] || []
baseInfoAbout.stationLevelList = map['stationLevelList'] || []
baseInfoAbout.stationDutyLevelList = map['stationDutyLevelList'] || []
baseInfoAbout.workTypeList = map['workTypeList'] || []
baseInfoAbout.proTitleList = map['proTitleList'] || []
baseInfoAbout.majorStationList = map['majorStationList'] || []
baseInfoAbout.qualificationList = map['qualificationList'] || []
baseInfoAbout.partBranchList = map['partBranchList'] || []
} catch (error) {
// 获取基础信息失败
}
// 加载字典数据
loadCertificateTypeList()
loadEducationTypeList()
@@ -620,17 +674,18 @@
loadDegreeList()
}
const init = (val: number) => {
initDicData()
if (val == 5 || val == 6) {
const init = async (val: number) => {
await initDicData()
if (val === 5 || val === 6) {
teacherNo.value = props.nowRow.teacherNo
handleWaitExam(val)
} else {
for (let i in waitShenheForm.form) {
if (i !== 'newDeptCodeList' && i !== 'deptCodeList') {
(waitShenheForm.form as any)[i] = ''
}
}
// 重置表单数据
Object.keys(waitShenheForm.form).forEach(key => {
if (key !== 'newDeptCodeList' && key !== 'deptCodeList') {
(waitShenheForm.form as any)[key] = ''
}
})
waitShenheForm.form.newDeptCodeList = []
waitShenheForm.form.deptCodeList = []
materialUrlFrom.fileListA = []
@@ -638,32 +693,33 @@
materialUrlFrom.fileListC = []
materialUrlFrom.url = '/professional/file/teacherAboutInfoUpload'
let statusCode = ""
if (val == 0) {
statusCode = "teacherTitle"
}
if (val == 1) {
statusCode = "acade"
}
if (val == 2) {
statusCode = "title"
}
if (val == 3) {
statusCode = "job"
}
if (val == 4) {
statusCode = "remix"
}
checkLocked(statusCode).then((res: any) => {
if (!res.data.data) {
getMyTeacherNo().then((res: any) => {
teacherNo.value = res.data.data
handleWaitExam(val)
})
} else {
message.warning("新增功能已锁定,暂不允许操作")
}
})
// 状态码映射
const statusCodeMap: Record<number, string> = {
0: "teacherTitle",
1: "acade",
2: "title",
3: "job",
4: "remix"
}
const statusCode = statusCodeMap[val]
if (statusCode) {
try {
const lockResponse = await checkLocked(statusCode)
if (lockResponse.data) {
message.warning("新增功能已锁定,暂不允许操作")
return
}
const response = await getMyTeacherNo()
teacherNo.value = response.data
handleWaitExam(val)
} catch (error) {
message.error('操作失败')
}
} else {
handleWaitExam(val)
}
}
}
const handleWaitExam = (val: number) => {
@@ -676,127 +732,113 @@
waitShenheForm.f = false
waitShenheForm.g = false
switch (val) {
case 0:
waitShenheForm.title = "教师资格证"
waitShenheForm.a = true
break
case 1:
waitShenheForm.title = "学历更新"
waitShenheForm.b = true
break
case 2:
waitShenheForm.title = "职称更新"
waitShenheForm.c = true
break
case 3:
waitShenheForm.title = "职业更新"
waitShenheForm.d = true
break
case 4:
waitShenheForm.title = "综合表彰"
// 表单类型配置
const formConfig: Record<number, { title: string; field: 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' }> = {
0: { title: "教师资格证", field: 'a' },
1: { title: "学历更新", field: 'b' },
2: { title: "职称更新", field: 'c' },
3: { title: "职业更新", field: 'd' },
4: { title: "综合表彰", field: 'e' },
5: { title: "人员调动", field: 'f' },
6: { title: "党员调动", field: 'g' }
}
const config = formConfig[val]
if (config) {
waitShenheForm.title = config.title
;(waitShenheForm as any)[config.field] = true
// 特殊处理
if (val === 4) {
// 综合表彰:重置相关字段
materialUrlFrom.fileListA = []
waitShenheForm.form.honor = ''
waitShenheForm.form.honorCompany = ''
waitShenheForm.form.year = ''
waitShenheForm.form.attachment = ''
waitShenheForm.e = true
break
case 5:
waitShenheForm.title = "人员调动"
waitShenheForm.f = true
} else if (val === 5) {
// 人员调动:加载部门数据
waitShenheForm.form = { ...props.nowRow }
waitShenheForm.form.newDeptCodeList = []
waitShenheForm.form.deptCodeList = []
newSecDeptCode.value = ''
newSecChildDeptCode.value = ''
getDeptListByLevelTwo().then((res: any) => {
secDeptList.value = res.data.data
secDeptList.value = res.data
educationDialogFromVisible.value = true
}).catch(() => {
message.error('获取部门列表失败')
})
break
case 6:
waitShenheForm.title = "党员调动"
} else if (val === 6) {
// 党员调动:设置原支部
waitShenheForm.form = { ...props.nowRow }
waitShenheForm.form.oldBranchName = waitShenheForm.form.oldBranchId
waitShenheForm.g = true
break
}
materialUrlFrom.url = materialUrlFrom.url + "?teacherNo=" + teacherNo.value + "&type=" + val
if (val != 5) {
}
}
materialUrlFrom.url = `${materialUrlFrom.url}?teacherNo=${teacherNo.value}&type=${val}`
if (val !== 5) {
educationDialogFromVisible.value = true
}
}
const materiaUploadSuccessA = (response: any, file: any, fileList: any) => {
if (response.data.code == "-1") {
// 证书编号输入处理(只允许英文和数字)
const handleCertificateNumberInput = (value: string) => {
waitShenheForm.form.certificateNumber = value.replace(/[^A-Za-z0-9]/g, '')
}
// 文件上传成功处理
const materiaUploadSuccessA = (response: any) => {
if (response.data?.code === "-1") {
message.error("当前不允许上传文件")
return
}
return
}
waitShenheForm.form.mateA = response.data.url
}
const materiaUploadSuccessB = (response: any, file: any, fileList: any) => {
if (response.data.code == "-1") {
const materiaUploadSuccessB = (response: any) => {
if (response.data?.code === "-1") {
message.error("当前不允许上传文件")
return
}
return
}
waitShenheForm.form.mateB = response.data.url
}
const materiaUploadSuccessC = (response: any, file: any, fileList: any) => {
if (response.data.code == "-1") {
message.error("当前不允许上传文件")
return
}
waitShenheForm.form.mateC = response.data.url
}
const dialogSubmit = async (val: number) => {
waitShenheForm.form.type = val
waitShenheForm.form.teacherNo = teacherNo.value
// 表单验证
let formRef: any = null
// 表单验证配置
const formRefMap: Record<number, any> = {
0: teacherCertificateFormRef.value,
1: educationFormRef.value,
2: proFormRef.value,
3: workFormRef.value,
4: honorFormRef.value,
5: stationChangeFormRef.value,
6: partChangeFormRef.value
}
if (val == 0) {
formRef = teacherCertificateFormRef.value
if (undefined == waitShenheForm.form.mateA || waitShenheForm.form.mateA == "") {
const formRef = formRefMap[val]
// 材料验证
if (val === 0 || val === 2 || val === 3 || val === 4) {
// 需要上传材料A的表单
if (!waitShenheForm.form.mateA) {
message.info("请上传资料")
return
}
} else if (val == 1) {
formRef = educationFormRef.value
if ((undefined == waitShenheForm.form.mateA || waitShenheForm.form.mateA == "") && (undefined == waitShenheForm.form.mateB || waitShenheForm.form.mateB == "")) {
return
}
} else if (val === 1) {
// 学历需要上传材料A或材料B
if (!waitShenheForm.form.mateA && !waitShenheForm.form.mateB) {
message.info("请上传学历或学位证书")
return
}
} else if (val == 2) {
formRef = proFormRef.value
if (undefined == waitShenheForm.form.mateA || waitShenheForm.form.mateA == "") {
message.info("请上传证明材料")
return
}
} else if (val == 3) {
formRef = workFormRef.value
if (undefined == waitShenheForm.form.mateA || waitShenheForm.form.mateA == "") {
message.info("请上传资料")
return
}
} else if (val == 4) {
formRef = honorFormRef.value
if (undefined == waitShenheForm.form.mateA || waitShenheForm.form.mateA == "") {
message.info("请上传证明材料")
return
}
} else if (val == 5) {
formRef = stationChangeFormRef.value
} else if (val === 5) {
// 人员调动:需要选择部门
if (!newSecDeptCode.value) {
message.info("请选择要调入的部门")
return
}
return
}
waitShenheForm.form.newDeptCode = newSecDeptCode.value
waitShenheForm.form.newSecDeptCode = newSecChildDeptCode.value ? newSecChildDeptCode.value : newSecDeptCode.value
} else if (val == 6) {
formRef = partChangeFormRef.value
waitShenheForm.form.newSecDeptCode = newSecChildDeptCode.value || newSecDeptCode.value
}
// 验证表单
@@ -811,11 +853,11 @@
try {
await messageBox.confirm('确认提交?')
const res = await updateOtherInfo(waitShenheForm.form)
if (res.data.data == '-1') {
message.success("当前不允许提交")
if (res.data === '-1') {
message.warning("当前不允许提交")
} else {
message.success("提交成功")
}
}
emit("getList", props.page)
educationDialogFromVisible.value = false
} catch (err) {
@@ -823,12 +865,15 @@
}
}
const getDeptListByParent = () => {
const getDeptListByParent = async () => {
newSecChildDeptCode.value = ''
newSecChildDeptCodeList.value = []
getDeptListByParentApi(newSecDeptCode.value).then((res: any) => {
newSecChildDeptCodeList.value = res.data.data
})
try {
const res = await getDeptListByParentApi(newSecDeptCode.value)
newSecChildDeptCodeList.value = res.data
} catch (error) {
message.error('获取部门列表失败')
}
}
// 暴露方法