This commit is contained in:
guochunsi
2025-12-31 17:40:01 +08:00
parent 6d94e91b70
commit 74c06bb8a0
713 changed files with 115034 additions and 46 deletions

View File

@@ -0,0 +1,254 @@
<template>
<el-dialog v-model="dialogEmptyFromVisible" title="教职工信息导出" width="80%">
<el-form style="margin-left: 7px" :inline="true">
<el-form-item>
<el-tag>导出教职工人数,依据'职工信息'页面检索条件,如部门,职称等级等条件</el-tag>
<el-tag type="warning">*请在'职工信息'页面点击搜索后,再点开当前导出页面</el-tag>
</el-form-item>
<el-form-item label="是否退休">
<el-select
v-model="tiedTag"
filterable
reserve-keyword
clearable
>
<el-option
v-for="item in YES_OR_NO"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
@click="exportTeacherInfo"
:loading="exportLoading"
size="small">导出</el-button>
</el-form-item>
</el-form>
<!-- 基本信息 -->
<div class="div_stuData" style="margin-bottom: 5px;margin-top: 5px;">基础信息
<el-checkbox v-model="allCheckTeacherBaseInfo" style="margin-left:20px">全选</el-checkbox>
</div>
<el-tabs type="border-card" tab-position="left">
<el-form ref="baseForm" label-width="120px">
<el-row>
<el-checkbox-group v-model="checkedTeacherBaseInfo">
<el-checkbox v-for="(item,index) in teacherBasicCheckData" :label="item.value" :key="index">{{item.label}}</el-checkbox>
</el-checkbox-group>
</el-row>
</el-form>
</el-tabs>
<!-- 岗位信息 -->
<div class="div_stuData" style="margin-bottom: 5px;margin-top: 5px;">岗位信息
<el-checkbox v-model="allCheckStationInfo">全选</el-checkbox>
</div>
<el-tabs type="border-card" tab-position="left">
<el-form ref="baseForm" label-width="120px">
<el-row>
<el-checkbox-group v-model="checkedTeacherStationInfo">
<el-checkbox v-for="(item, index) in teacherStationData" :key="index" :label="item.value">{{item.label}}</el-checkbox>
</el-checkbox-group>
</el-row>
</el-form>
</el-tabs>
<!-- 其他 -->
<div class="div_stuData" style="margin-bottom: 5px;margin-top: 5px;">其他
<el-checkbox v-model="allCheckedother" style="margin-left: 20px">全选</el-checkbox>
</div>
<el-tabs type="border-card" tab-position="left">
<el-form ref="baseForm" label-width="120px">
<el-row>
<el-checkbox-group v-model="checkedTeacherOtherInfo">
<el-checkbox v-for="(item, index) in teacherOtherData" :key="index" :label="item.value">{{item.label}}</el-checkbox>
</el-checkbox-group>
</el-row>
</el-form>
</el-tabs>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
import { ElNotification } from 'element-plus'
import global from '/@/components/tools/commondict.vue'
import request from '/@/utils/request'
// Props
const props = defineProps<{
search: any
}>()
// 响应式数据
const tiedTag = ref('')
const YES_OR_NO = global.YES_OR_NO
const exportLoading = ref(false)
const dialogEmptyFromVisible = ref(false)
const allCheckTeacherBaseInfo = ref(false)
const allCheckStationInfo = ref(false)
const allCheckedother = ref(false)
const checkedTeacherBaseInfo = ref<string[]>([])
const checkedTeacherStationInfo = ref<string[]>([])
const checkedTeacherOtherInfo = ref<string[]>([])
const teacherBasicCheckData = [
{label:'姓名',value:'realName_姓名'},
{label:'工号',value:'teacherNo_工号'},
{label:'部门',value:'deptCode_部门'},
{label:'性别',value:'sex_性别'},
{label:'身份证',value:'idCard_身份证'},
{label:'出生年月',value:'birthday_出生年月'},
{label:'年龄',value:'age_年龄'},
{label:'手机',value:'telPhone_手机'},
{label:'手机2',value:'telPhoneTwo_手机2'},
{label:'宅电',value:'homePhone_宅电'},
{label:'民族',value:'national_民族'},
{label:'籍贯',value:'nativePlace_籍贯'},
{label:'出生地',value:'birthPlace_出生地'},
{label:'健康状况',value:'health_健康状况'},
{label:'特长',value:'speciality_特长'},
{label:'银行卡号',value:'bankNo_银行卡号'},
{label:'开户行',value:'bankOpen_开户行'},
{label:'家庭住址',value:'homeAddress_家庭住址'},
{label:'授课类型',value:'teacherCate_授课类型'},
{label:'允许进出',value:'inoutFlag_允许进出'},
{label:'进出情况备注',value:'inoutRemarks_进出情况备注'},
]
const teacherStationData = [
{label:'教师类型',value:'teacherTypeName_教师类型'},
{label:'党支部',value:'branchName_党支部'},
{label:'用工性质',value:'employmentNatureName_用工性质'},
{label:'岗位类别',value:'stationTypeName_岗位类别'},
{label:'岗位级别',value:'stationLevelName_岗位级别'},
{label:'职务级别',value:'stationDutyLevelName_职务级别'},
{label:'任现岗位职级时间',value:'stationDate_任现岗位职级时间'},
{label:'在职情况',value:'atStationName_在职情况'},
{label:'职务',value:'dutyDesc_职务'},
{label:'参加工作时间',value:'workDate_参加工作时间'},
{label:'退休时间',value:'retireDate_退休时间'},
{label:'职位类别',value:'teacherClassify_职位类别'},
{label:'任现职务时间',value:'dutyDate_任现职务时间'},
{label:'进编时间',value:'entryDutyDate_进编时间'},
{label:'进校时间',value:'entrySchoolDate_进校时间'},
]
const teacherOtherData = [
{label:'职业资格工种',value:'zyzg_职业资格工种'},
{label:'职业资格等级',value:'zyzgLevel_职业资格等级'},
{label:'政治面貌',value:'zzmm_政治面貌'},
{label:'学历',value:'xl_学历'},
{label:'学位',value:'xw_学位'},
{label:'职称',value:'zc_职称'},
{label:'高校教师资格证',value:'highCer_高校教师资格证'},
{label:'中等教师资格证',value:'midCer_中等教师资格证'},
{label:'教师上岗证',value:'priCer_教师上岗证'},
{label:'共同居住人',value:'livewith_共同居住人'},
]
// 导出文件函数
const exportForModel = async (params: any, fileNameStr: string, url: string) => {
try {
const res = await request({
method: 'post',
url: url,
data: params,
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
})
const blob = new Blob([res.data])
const fileName = fileNameStr
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
} catch (err) {
ElNotification.error({
title: '错误',
message: '导出失败',
})
}
}
// Watch
watch(allCheckTeacherBaseInfo, (newVal) => {
if (newVal) {
checkedTeacherBaseInfo.value = teacherBasicCheckData.map(item => item.value)
} else {
checkedTeacherBaseInfo.value = []
}
})
watch(allCheckStationInfo, (newVal) => {
if (newVal) {
checkedTeacherStationInfo.value = teacherStationData.map(item => item.value)
} else {
checkedTeacherStationInfo.value = []
}
})
watch(allCheckedother, (newVal) => {
if (newVal) {
checkedTeacherOtherInfo.value = teacherOtherData.map(item => item.value)
} else {
checkedTeacherOtherInfo.value = []
}
})
// 方法
const init = () => {
tiedTag.value = props.search.tied
dialogEmptyFromVisible.value = true
}
const exportTeacherInfo = async () => {
if (checkedTeacherBaseInfo.value.length == 0 && checkedTeacherStationInfo.value.length == 0 && checkedTeacherOtherInfo.value.length == 0) {
ElNotification({
title: '警告',
message: '请选择要导出的字段',
type: 'warning',
duration: 3000
})
return
}
exportLoading.value = true
const searchData = JSON.parse(JSON.stringify(props.search))
searchData.tied = tiedTag.value
const params = {
"checkedTeacherBaseInfo": checkedTeacherBaseInfo.value,
"checkedTeacherStationInfo": checkedTeacherStationInfo.value,
"checkedTeacherOtherInfo": checkedTeacherOtherInfo.value,
"teacherBaseDTO": searchData
}
await exportForModel(params, "教职工信息.xls", "/professional/teacherbase/exportTeacherInfoBySelf")
setTimeout(() => {
exportLoading.value = false
}, 3000)
}
// 暴露方法给父组件
defineExpose({
init
})
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,82 @@
<template>
<el-dialog v-model="visible" title="导入" width="80%" append-to-body>
<el-row>
<el-col>
<a href="excel/dictlist.xlsx" rel="external nofollow" download="职工信息字典下载">
<el-button style="margin-left: 20px" size="small" type="success">职工信息字典下载</el-button>
</a>
</el-col>
</el-row>
<el-row>
<el-col>
<el-tag>导入时部分字段需严格按照字典值填写</el-tag>
</el-col>
</el-row>
<el-row>
<el-upload
class="upload-demo"
action="/professional/file/importTeacherInfoSimple"
:headers="headers"
:accept="'.xls,.xlsx'"
:on-success="handleUploadSuccess"
:on-error="handleAvatarError"
list-type="picture">
<el-button size="small" type="primary">点击上传</el-button>
<template #tip>
<div class="el-upload__tip">只能上传后缀为xls,xlsx的文件</div>
</template>
</el-upload>
</el-row>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import { ElNotification } from 'element-plus'
import { Session } from '/@/utils/storage'
// 响应式数据
const visible = ref(false)
// 计算属性
const headers = computed(() => {
return {
"Authorization": 'Bearer ' + Session.getToken()
}
})
// 方法
const init = () => {
visible.value = true
}
const handleUploadSuccess = () => {
visible.value = false
ElNotification({
title: '成功',
message: '导入成功',
type: 'success',
})
}
const handleAvatarError = (err: any) => {
const result = JSON.parse(err.message)
if (result.code == "1") {
ElNotification.error({
title: '错误',
message: result.msg,
duration: 30000
})
}
}
// 暴露方法给父组件
defineExpose({
init
})
</script>
<style scoped>
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,842 @@
<template>
<el-dialog v-model="educationDialogFromVisible" width="80%" :title="waitShenheForm.title" append-to-body>
<!--2.1 教师资格证-->
<el-form v-if="waitShenheForm.a" ref="teacherCertificateFormRef" :model="waitShenheForm.form" :rules="teacherCertificateRules" label-width="120px">
<el-form-item label="类型" prop="certificateConfId">
<el-select v-model="waitShenheForm.form.certificateConfId" placeholder="请选择类型" style="width: 100%">
<el-option
v-for="item in certificateTypeList"
:key="item.id"
:label="item.cretificateName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="证书编号" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编号" />
</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>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="dialogSubmit(0)">提交</el-button>
<el-button @click="educationDialogFromVisible = false">取消</el-button>
</el-form-item>
</el-form>
<!--2.2 学历-->
<el-form v-if="waitShenheForm.b" ref="educationFormRef" :model="waitShenheForm.form" :rules="educationRules" label-width="120px">
<el-form-item label="毕业时间" prop="graduateTime">
<el-date-picker
v-model="waitShenheForm.form.graduateTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="教育类型" prop="type">
<el-select v-model="waitShenheForm.form.type" placeholder="请选择教育类型" style="width: 100%">
<el-option
v-for="item in educationTypeList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="学历" prop="qualificationConfigId">
<el-select v-model="waitShenheForm.form.qualificationConfigId" placeholder="请选择学历" style="width: 100%">
<el-option
v-for="item in qualificationList"
:key="item.id"
:label="item.qualificationName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="学位" prop="degreeConfigId">
<el-select v-model="waitShenheForm.form.degreeConfigId" placeholder="请选择学位" style="width: 100%">
<el-option
v-for="item in degreeList"
:key="item.id"
:label="item.degreeName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="毕业学校" prop="graduateSchool">
<el-input v-model="waitShenheForm.form.graduateSchool" placeholder="请输入毕业学校" />
</el-form-item>
<el-form-item label="所学专业" prop="major">
<el-input v-model="waitShenheForm.form.major" placeholder="请输入所学专业" />
</el-form-item>
<el-form-item label="证书编码" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编码" />
</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>
</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>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="dialogSubmit(1)">提交</el-button>
<el-button @click="educationDialogFromVisible = false">取消</el-button>
</el-form-item>
</el-form>
<!--2.3 职称-->
<el-form v-if="waitShenheForm.c" ref="proFormRef" :model="waitShenheForm.form" :rules="proRules" label-width="120px">
<el-form-item label="职称等级" prop="professionalTitleConfigId">
<el-select v-model="waitShenheForm.form.professionalTitleConfigId" placeholder="请选择职称等级" style="width: 100%">
<el-option
v-for="item in baseInfoAbout.proTitleList"
:key="item.id"
:label="item.professionalTitle"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="专业技术职务" prop="majorStation">
<el-select v-model="waitShenheForm.form.majorStation" placeholder="请选择专业技术职务" style="width: 100%">
<el-option
v-for="item in baseInfoAbout.majorStationList"
:key="item.id"
:label="item.majorStationName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="取证时间" prop="certificateTime">
<el-date-picker
v-model="waitShenheForm.form.certificateTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="职称任职时间" prop="inOfficeDate">
<el-date-picker
v-model="waitShenheForm.form.inOfficeDate"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="证书编号" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编号" />
</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>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="dialogSubmit(2)">提交</el-button>
<el-button @click="educationDialogFromVisible = false">取消</el-button>
</el-form-item>
</el-form>
<!--2.4 职业-->
<el-form v-if="waitShenheForm.d" ref="workFormRef" :model="waitShenheForm.form" :rules="workRules" label-width="120px">
<el-form-item label="职业工种" prop="worker">
<el-select v-model="waitShenheForm.form.worker" filterable placeholder="请选择职业工种" style="width: 100%">
<el-option
v-for="item in baseInfoAbout.workTypeList"
:key="item.id"
:label="item.workName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="等级" prop="qualificationConfigId">
<el-select v-model="waitShenheForm.form.qualificationConfigId" placeholder="请选择等级" style="width: 100%">
<el-option
v-for="item in baseInfoAbout.qualificationList"
:key="item.id"
:label="item.levelName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="取证时间" prop="certificateTime">
<el-date-picker
v-model="waitShenheForm.form.certificateTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="证书编号" prop="certificateNumber">
<el-input v-model="waitShenheForm.form.certificateNumber" placeholder="请输入证书编号" />
</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>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="dialogSubmit(3)">提交</el-button>
<el-button @click="educationDialogFromVisible = false">取消</el-button>
</el-form-item>
</el-form>
<!--2.5 综合表彰-->
<el-form v-if="waitShenheForm.e" ref="honorFormRef" :model="waitShenheForm.form" :rules="honorRules" label-width="120px">
<el-form-item label="荣誉" prop="honor">
<el-input v-model="waitShenheForm.form.honor" placeholder="请填写荣誉" />
</el-form-item>
<el-form-item label="表彰单位" prop="honorCompany">
<el-input v-model="waitShenheForm.form.honorCompany" placeholder="请填写表彰单位" />
</el-form-item>
<el-form-item label="年份" prop="year">
<el-date-picker
v-model="waitShenheForm.form.year"
type="year"
placeholder="选择年份"
format="yyyy"
value-format="yyyy"
style="width: 100%"
/>
</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="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>
</el-upload>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="dialogSubmit(4)">提交</el-button>
<el-button @click="educationDialogFromVisible = false">取消</el-button>
</el-form-item>
</el-form>
<!--2.6 人员调动-->
<el-form v-if="waitShenheForm.f" ref="stationChangeFormRef" :model="waitShenheForm.form" :rules="stationChangeRules" label-width="120px">
<el-form-item label="工号">
<el-tag>{{waitShenheForm.form.teacherNo}}</el-tag>
</el-form-item>
<el-form-item label="姓名">
<el-tag>{{waitShenheForm.form.realName}}</el-tag>
</el-form-item>
<el-form-item label="原部门名称">
<el-tag disabled>{{waitShenheForm.form.deptName}}</el-tag>
</el-form-item>
<el-form-item label="现二级部门*">
<el-select v-model="newSecDeptCode" @change="getDeptListByParent" placeholder="请选择二级部门" style="width: 100%">
<el-option v-for="item in secDeptList"
:key="item.deptCode"
:label="item.deptName"
:value="item.deptCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="现子级部门">
<el-select v-model="newSecChildDeptCode" placeholder="请选择下级部门" clearable style="width: 100%">
<el-option v-for="item in newSecChildDeptCodeList"
:key="item.deptCode"
:label="item.deptName"
:value="item.deptCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="调令日期" prop="changeDate">
<el-date-picker
v-model="waitShenheForm.form.changeDate"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="岗位类型" prop="pos">
<el-select v-model="waitShenheForm.form.pos" placeholder="请选择岗位类型" style="width: 100%">
<el-option
v-for="item in global.STATION_TYPE"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="waitShenheForm.form.remarks" type="textarea" :rows="3" placeholder="请输入备注" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="dialogSubmit(5)">提交</el-button>
<el-button @click="educationDialogFromVisible = false">取消</el-button>
</el-form-item>
</el-form>
<!--2.7 党员调动-->
<el-form v-if="waitShenheForm.g" ref="partChangeFormRef" :model="waitShenheForm.form" :rules="partChangeRules" label-width="120px">
<el-form-item label="工号">
<el-tag>{{waitShenheForm.form.teacherNo}}</el-tag>
</el-form-item>
<el-form-item label="用户名">
<el-tag>{{waitShenheForm.form.realName}}</el-tag>
</el-form-item>
<el-form-item label="原支部名">
<el-select disabled v-model="waitShenheForm.form.oldBranchName" style="width: 100%">
<el-option
v-for="item in baseInfoAbout.partBranchList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="现支部名" prop="branchName">
<el-select clearable v-model="waitShenheForm.form.branchName" placeholder="请选择现支部" style="width: 100%">
<el-option
v-for="item in baseInfoAbout.partBranchList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="党费" prop="partyFee">
<el-input-number v-model="waitShenheForm.form.partyFee" :precision="2" :min="0" style="width: 100%" />
</el-form-item>
<el-form-item label="变动时间" prop="changeTime">
<el-date-picker
v-model="waitShenheForm.form.changeTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="waitShenheForm.form.remarks" placeholder="请输入备注" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="dialogSubmit(6)">提交</el-button>
<el-button @click="educationDialogFromVisible = false">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
</template>
<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 { checkLocked } from '/@/api/professional/professionalstatuslock'
import { getDeptListByLevelTwo, getDeptListByParent as getDeptListByParentApi } from '/@/api/basic/basicdept'
import { getTeacherCertificateList } from '/@/api/professional/rsbase/professionalteachercertificateconf'
import { getAllTypeList } from '/@/api/professional/rsbase/professionalacademiceducationtypeconfig'
import { getQualificationList } from '/@/api/professional/rsbase/academicqualificationsconfig'
import { getDegreeList } from '/@/api/professional/rsbase/professionalacademicdegreeconfig'
import global from '/@/components/tools/commondict.vue'
import { Session } from '/@/utils/storage'
// 字典数据
const certificateTypeList = ref<any[]>([])
const educationTypeList = ref<any[]>([])
const qualificationList = ref<any[]>([])
const degreeList = ref<any[]>([])
// 表单 ref
const teacherCertificateFormRef = ref()
const educationFormRef = ref()
const proFormRef = ref()
const workFormRef = ref()
const honorFormRef = ref()
const stationChangeFormRef = ref()
const partChangeFormRef = ref()
// 表单验证规则
const teacherCertificateRules = {
certificateConfId: [{ required: true, message: '请选择类型', trigger: 'change' }],
certificateNumber: [{ required: true, message: '请输入证书编号', trigger: 'blur' }]
}
const educationRules = {
graduateTime: [{ required: true, message: '请输入毕业时间', trigger: 'change' }],
type: [{ required: true, message: '请选择教育类型', trigger: 'change' }],
graduateSchool: [{ required: true, message: '请输入毕业学校', trigger: 'blur' }],
major: [{ required: true, message: '请输入所学专业', trigger: 'blur' }],
certificateNumber: [{ required: true, 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' }]
}
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' }]
}
const honorRules = {
honor: [{ required: true, message: '请填写荣誉', trigger: 'blur' }],
honorCompany: [{ required: true, message: '请填写表彰单位', trigger: 'blur' }],
year: [{ required: true, message: '请输入年份', trigger: 'change' }]
}
const stationChangeRules = {
changeDate: [{ required: true, message: '请选择日期', trigger: 'change' }],
pos: [{ required: true, message: '请选择岗位类型', trigger: 'change' }]
}
const partChangeRules = {
branchName: [{ required: true, message: '请选择现支部', trigger: 'change' }],
changeTime: [{ required: true, message: '请选择变动时间', trigger: 'change' }]
}
// 获取字典数据
const loadCertificateTypeList = async () => {
try {
const res = await getTeacherCertificateList()
certificateTypeList.value = res.data || []
} catch (err) {
// 获取证书类型列表失败
}
}
const loadEducationTypeList = async () => {
try {
const res = await getAllTypeList()
educationTypeList.value = res.data || []
} catch (err) {
// 获取教育类型列表失败
}
}
const loadQualificationList = async () => {
try {
const res = await getQualificationList()
qualificationList.value = res.data || []
} catch (err) {
// 获取学历列表失败
}
}
const loadDegreeList = async () => {
try {
const res = await getDegreeList()
degreeList.value = res.data || []
} catch (err) {
// 获取学位列表失败
}
}
// Props
const props = defineProps<{
page: any
nowRow: any
}>()
// Emits
const emit = defineEmits(['getList'])
// 消息提示 hooks
const message = useMessage()
const messageBox = useMessageBox()
// 响应式数据
const educationDialogFromVisible = ref(false)
const waitShenheForm = reactive({
form: {
newDeptCodeList: [] as any[],
deptCodeList: [] as any[]
} as any,
title: '',
a: false,
b: false,
c: false,
d: false,
e: false,
f: false,
g: false
})
const materialUrlFrom = reactive({
url: '/professional/file/teacherAboutInfoUpload',
fileListA: [] as any[],
fileListB: [] as any[],
fileListC: [] as any[]
})
const baseInfoAbout = reactive({
stationTypeList: [] as any[],
atStationList: [] as any[],
teacherTypeList: [] as any[],
partBranchList: [] as any[],
employmentNatureList: [] as any[],
stationLevelList: [] as any[],
stationDutyLevelList: [] as any[],
workTypeList: [] as any[],
proTitleList: [] as any[],
majorStationList: [] as any[],
qualificationList: [] as any[]
})
const secDeptList = ref<any[]>([])
const newSecChildDeptCodeList = ref<any[]>([])
const newSecDeptCode = ref('')
const newSecChildDeptCode = ref('')
const teacherNo = ref('')
// Computed
const headers = computed(() => {
return {
"Authorization": 'Bearer ' + Session.getToken()
}
})
// 方法定义
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']
})
// 加载字典数据
loadCertificateTypeList()
loadEducationTypeList()
loadQualificationList()
loadDegreeList()
}
const init = (val: number) => {
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] = ''
}
}
waitShenheForm.form.newDeptCodeList = []
waitShenheForm.form.deptCodeList = []
materialUrlFrom.fileListA = []
materialUrlFrom.fileListB = []
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 handleWaitExam = (val: number) => {
materialUrlFrom.url = '/professional/file/teacherAboutInfoUpload'
waitShenheForm.a = false
waitShenheForm.b = false
waitShenheForm.c = false
waitShenheForm.d = false
waitShenheForm.e = false
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 = "综合表彰"
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
waitShenheForm.form = { ...props.nowRow }
waitShenheForm.form.newDeptCodeList = []
waitShenheForm.form.deptCodeList = []
newSecDeptCode.value = ''
newSecChildDeptCode.value = ''
getDeptListByLevelTwo().then((res: any) => {
secDeptList.value = res.data.data
educationDialogFromVisible.value = true
})
break
case 6:
waitShenheForm.title = "党员调动"
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) {
educationDialogFromVisible.value = true
}
}
const materiaUploadSuccessA = (response: any, file: any, fileList: any) => {
if (response.data.code == "-1") {
message.error("当前不允许上传文件")
return
}
waitShenheForm.form.mateA = response.data.url
}
const materiaUploadSuccessB = (response: any, file: any, fileList: any) => {
if (response.data.code == "-1") {
message.error("当前不允许上传文件")
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
if (val == 0) {
formRef = teacherCertificateFormRef.value
if (undefined == waitShenheForm.form.mateA || 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 == "")) {
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
if (!newSecDeptCode.value) {
message.info("请选择要调入的部门")
return
}
waitShenheForm.form.newDeptCode = newSecDeptCode.value
waitShenheForm.form.newSecDeptCode = newSecChildDeptCode.value ? newSecChildDeptCode.value : newSecDeptCode.value
} else if (val == 6) {
formRef = partChangeFormRef.value
}
// 验证表单
if (formRef) {
try {
await formRef.validate()
} catch (err) {
return
}
}
try {
await messageBox.confirm('确认提交?')
const res = await updateOtherInfo(waitShenheForm.form)
if (res.data.data == '-1') {
message.success("当前不允许提交")
} else {
message.success("提交成功")
}
emit("getList", props.page)
educationDialogFromVisible.value = false
} catch (err) {
// 用户取消
}
}
const getDeptListByParent = () => {
newSecChildDeptCode.value = ''
newSecChildDeptCodeList.value = []
getDeptListByParentApi(newSecDeptCode.value).then((res: any) => {
newSecChildDeptCodeList.value = res.data.data
})
}
// 暴露方法
defineExpose({
init
})
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,92 @@
<template>
<el-dialog v-model="visible" title="政治面貌" width="600px" @close="handleClose">
<el-form :model="form" label-width="120px" ref="formRef">
<el-form-item label="政治面貌" required>
<el-select v-model="form.politicsStatusId" placeholder="请选择政治面貌" style="width: 100%">
<el-option
v-for="item in politicsStatusList"
:key="item.id"
:label="item.politicsStatus"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="加入时间" required>
<el-date-picker
v-model="form.joinTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="转正时间" required>
<el-date-picker
v-model="form.correctionTime"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
interface Props {
modelValue: boolean
formData?: any
politicsStatusList?: any[]
}
interface Emits {
(e: 'update:modelValue', value: boolean): void
(e: 'submit', data: any): void
}
const props = withDefaults(defineProps<Props>(), {
formData: () => ({}),
politicsStatusList: () => []
})
const emit = defineEmits<Emits>()
const visible = ref(false)
const formRef = ref()
const form = ref<any>({})
watch(() => props.modelValue, (val) => {
visible.value = val
if (val && props.formData) {
form.value = { ...props.formData }
} else {
form.value = {}
}
})
watch(visible, (val) => {
emit('update:modelValue', val)
})
const handleClose = () => {
visible.value = false
form.value = {}
}
const handleSubmit = () => {
emit('submit', { ...form.value })
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,113 @@
<template>
<el-dialog v-model="visible" title="社会关系" width="600px" @close="handleClose">
<el-form :model="form" label-width="120px" ref="formRef">
<el-form-item label="称谓" required>
<el-select v-model="form.title" placeholder="请选择称谓" style="width: 100%">
<el-option
v-for="item in titleOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="姓名" required>
<el-input v-model="form.realName" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="出生年月" required>
<el-date-picker
v-model="form.birthday"
type="date"
placeholder="选择日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%"
/>
</el-form-item>
<el-form-item label="政治面貌">
<el-select v-model="form.politicsStatusId" placeholder="请选择政治面貌" style="width: 100%">
<el-option
v-for="item in politicsStatusList"
:key="item.id"
:label="item.politicsStatus"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="工作单位及职务">
<el-input
v-model="form.workStation"
type="textarea"
:rows="2"
placeholder="请输入工作单位及职务"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="handleSubmit">确定</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
interface Props {
modelValue: boolean
formData?: any
politicsStatusList?: any[]
}
interface Emits {
(e: 'update:modelValue', value: boolean): void
(e: 'submit', data: any): void
}
const props = withDefaults(defineProps<Props>(), {
formData: () => ({}),
politicsStatusList: () => []
})
const emit = defineEmits<Emits>()
const visible = ref(false)
const formRef = ref()
const form = ref<any>({})
// 称谓选项
const titleOptions = [
{ label: '父亲', value: '父亲' },
{ label: '母亲', value: '母亲' },
{ label: '配偶', value: '配偶' },
{ label: '子女', value: '子女' },
{ label: '兄弟姐妹', value: '兄弟姐妹' },
{ label: '其他', value: '其他' }
]
watch(() => props.modelValue, (val) => {
visible.value = val
if (val && props.formData) {
form.value = { ...props.formData }
} else {
form.value = {}
}
})
watch(visible, (val) => {
emit('update:modelValue', val)
})
const handleClose = () => {
visible.value = false
form.value = {}
}
const handleSubmit = () => {
emit('submit', { ...form.value })
}
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,214 @@
<template>
<el-dialog
v-model="visible"
title="锁定状态管理"
width="600px"
class="status-lock-dialog"
@close="handleClose">
<div class="status-lock-content">
<div class="status-lock-description">
<el-icon class="status-lock-icon"><Lock /></el-icon>
<span>请选择需要锁定的模块锁定后将无法进行编辑操作</span>
</div>
<el-form :model="form" label-width="120px" class="status-lock-form">
<el-row :gutter="24">
<el-col :span="12">
<el-form-item label="职称管理">
<el-switch
inline-prompt
v-model="form.title"
active-text="已锁定"
inactive-text="未锁定"
active-color="#f56c6c"
inactive-color="#67c23a">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职业资格">
<el-switch
inline-prompt
v-model="form.job"
active-text="已锁定"
inactive-text="未锁定"
active-color="#f56c6c"
inactive-color="#67c23a">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="教师资格证">
<el-switch
inline-prompt
v-model="form.teacherTitle"
active-text="已锁定"
inactive-text="未锁定"
active-color="#f56c6c"
inactive-color="#67c23a">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学历学位">
<el-switch
inline-prompt
v-model="form.acade"
active-text="已锁定"
inactive-text="未锁定"
active-color="#f56c6c"
inactive-color="#67c23a">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="综合表彰">
<el-switch
inline-prompt
v-model="form.remix"
active-text="已锁定"
inactive-text="未锁定"
active-color="#f56c6c"
inactive-color="#67c23a">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位晋升">
<el-switch
inline-prompt
v-model="form.work"
active-text="已锁定"
inactive-text="未锁定"
active-color="#f56c6c"
inactive-color="#67c23a">
</el-switch>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<template #footer>
<div class="status-lock-footer">
<el-button @click="handleClose">取消</el-button>
<el-button
type="primary"
v-if="canEdit"
@click="handleSubmit">保存</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, watch } from 'vue'
import { Lock } from '@element-plus/icons-vue'
interface Props {
modelValue: boolean
formData?: any
canEdit?: boolean
}
interface Emits {
(e: 'update:modelValue', value: boolean): void
(e: 'submit', data: any): void
}
const props = withDefaults(defineProps<Props>(), {
formData: () => ({
title: false,
job: true,
teacherTitle: true,
acade: true,
remix: true,
work: true
}),
canEdit: false
})
const emit = defineEmits<Emits>()
const visible = ref(false)
const form = ref<any>({
title: false,
job: true,
teacherTitle: true,
acade: true,
remix: true,
work: true
})
watch(() => props.modelValue, (val) => {
visible.value = val
if (val && props.formData) {
form.value = { ...props.formData }
} else {
form.value = {
title: false,
job: true,
teacherTitle: true,
acade: true,
remix: true,
work: true
}
}
})
watch(visible, (val) => {
emit('update:modelValue', val)
})
const handleClose = () => {
visible.value = false
}
const handleSubmit = () => {
emit('submit', { ...form.value })
}
</script>
<style scoped lang="scss">
.status-lock-dialog {
.status-lock-content {
padding: 20px 0;
}
.status-lock-description {
display: flex;
align-items: center;
padding: 16px;
margin-bottom: 24px;
background: #fef0f0;
border: 1px solid #fbc4c4;
border-radius: 6px;
color: #f56c6c;
font-size: 14px;
.status-lock-icon {
margin-right: 8px;
font-size: 18px;
color: #f56c6c;
}
}
.status-lock-form {
:deep(.el-form-item) {
margin-bottom: 24px;
}
}
.status-lock-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
}
</style>