2940 lines
111 KiB
Vue
2940 lines
111 KiB
Vue
|
||
<template>
|
||
<div class="layout-padding">
|
||
<div class="layout-padding-auto layout-padding-view">
|
||
<!-- 搜索表单 -->
|
||
<search-form
|
||
v-show="showSearch"
|
||
:model="search"
|
||
ref="searchFormRef"
|
||
@keyup-enter="handleFilter(search)"
|
||
>
|
||
<template #default="{ visible }">
|
||
<!-- 直接展示的常用筛选条件 -->
|
||
<template v-if="visible">
|
||
<el-form-item label="姓名" prop="realName">
|
||
<el-input
|
||
v-model="search.realName"
|
||
clearable
|
||
placeholder="请输入姓名"
|
||
/>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="工号" prop="teacherNo">
|
||
<el-input
|
||
v-model="search.teacherNo"
|
||
clearable
|
||
placeholder="请输入工号"
|
||
/>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="部门" prop="deptCode">
|
||
<el-select
|
||
v-model="search.deptCode"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
@change="chooseSecDept"
|
||
placeholder="请选择部门"
|
||
>
|
||
<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="子部门" prop="secDeptCode">
|
||
<el-select
|
||
v-model="search.secDeptCode"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
placeholder="请选择子部门"
|
||
>
|
||
<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="tied">
|
||
<el-select
|
||
v-model="search.tied"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
placeholder="请选择"
|
||
>
|
||
<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>
|
||
</template>
|
||
|
||
<!-- 折叠的高级筛选条件 -->
|
||
<template v-if="!visible">
|
||
<el-form-item label="退休年份" prop="retireDate">
|
||
<el-date-picker
|
||
v-model="search.retireDate"
|
||
type="year"
|
||
format="YYYY"
|
||
value-format="YYYY-MM-DD HH:mm:ss"
|
||
clearable
|
||
placeholder="请选择退休年份"
|
||
/>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="职称等级" prop="pfTitleId">
|
||
<el-select
|
||
v-model="search.pfTitleId"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
placeholder="请选择职称等级"
|
||
>
|
||
<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="stationDutyLevelId">
|
||
<el-select
|
||
v-model="search.stationDutyLevelId"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
placeholder="请选择职务等级"
|
||
>
|
||
<el-option
|
||
v-for="item in baseInfoAbout.stationDutyLevelList"
|
||
:key="item.id"
|
||
:label="item.stationDutyLevelName"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="政治面貌" prop="politicsStatus">
|
||
<el-select
|
||
v-model="search.politicsStatus"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
placeholder="请选择政治面貌"
|
||
>
|
||
<el-option
|
||
v-for="item in searchPoliticsStatusList"
|
||
:key="item.id"
|
||
:label="item.politicsStatus"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="授课类型" prop="teacherCate">
|
||
<el-select
|
||
v-model="search.teacherCate"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
placeholder="请选择授课类型"
|
||
>
|
||
<el-option
|
||
v-for="item in searchTeacherCateList"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
<el-form-item label="允许进出" prop="inoutFlag">
|
||
<el-select
|
||
v-model="search.inoutFlag"
|
||
filterable
|
||
reserve-keyword
|
||
clearable
|
||
placeholder="请选择"
|
||
>
|
||
<el-option
|
||
v-for="item in inoutFlagOptions"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
|
||
|
||
</template>
|
||
</template>
|
||
|
||
<!-- 操作按钮(始终在最后) -->
|
||
<template #actions>
|
||
<el-form-item>
|
||
<el-button type="primary" @click="handleFilter(search)" icon="Search">查询</el-button>
|
||
<el-button @click="resetQuery" icon="Refresh">重置</el-button>
|
||
</el-form-item>
|
||
</template>
|
||
</search-form>
|
||
|
||
<!-- 操作按钮 -->
|
||
<el-row>
|
||
<div class="mb15" style="width: 100%; display: flex; justify-content: space-between; align-items: center;">
|
||
<div>
|
||
<!-- 主要操作:新增 -->
|
||
<el-button
|
||
type="primary"
|
||
icon="FolderAdd"
|
||
@click="handleAdd"
|
||
v-if="permissions.professional_teacherbase_add">新 增
|
||
</el-button>
|
||
|
||
<!-- 查询操作:使用 primary plain 样式,统一协调 -->
|
||
<!-- <el-button
|
||
type="primary"
|
||
plain
|
||
icon="User"
|
||
class="ml10"
|
||
v-if="permissions.professional_teacherbase_status_lock"
|
||
@click="handelQuickSeach(4)">双师
|
||
</el-button> -->
|
||
|
||
<!-- 设置操作:使用默认样式,中性灰色 -->
|
||
<el-button
|
||
icon="Lock"
|
||
class="ml10"
|
||
v-if="permissions.professional_teacherbase_status_lock"
|
||
@click="dialogVisible.statusDialogFormVisible=true">状态锁定
|
||
</el-button>
|
||
|
||
<!-- 导出操作:使用 warning plain 样式,橙色边框,表示数据导出 -->
|
||
<el-button
|
||
type="warning"
|
||
plain
|
||
icon="Download"
|
||
class="ml10"
|
||
v-if="permissions.professional_teacherbase_export"
|
||
@click="handleDownLoadWord('')"
|
||
:loading="exportLoading">导出WORD
|
||
</el-button>
|
||
<el-button
|
||
type="warning"
|
||
plain
|
||
icon="Download"
|
||
class="ml10"
|
||
v-if="permissions.professional_teacherbase_export"
|
||
@click="handleExportDialog"
|
||
:loading="exportLoading">自定义导出
|
||
</el-button>
|
||
|
||
<!-- 导入操作:使用 primary plain 样式,蓝色边框,保持项目默认样式 -->
|
||
<el-button
|
||
type="primary"
|
||
plain
|
||
icon="UploadFilled"
|
||
class="ml10"
|
||
v-if="permissions.professional_teacherinfo_import"
|
||
@click="handleImportDialog"
|
||
:loading="exportLoading">导入信息
|
||
</el-button>
|
||
</div>
|
||
|
||
<!-- 列显示控制 - 使用自动提取,靠右显示 -->
|
||
<TableColumnControl
|
||
ref="tableColumnControlRef"
|
||
:table-ref="tableRef"
|
||
v-model="visibleTableColumns"
|
||
storage-key="teacherbase-table-columns"
|
||
trigger-type="default"
|
||
trigger-link
|
||
>
|
||
</TableColumnControl>
|
||
</div>
|
||
</el-row>
|
||
|
||
<!-- 表格 -->
|
||
<el-table
|
||
ref="tableRef"
|
||
:data="state.dataList"
|
||
v-loading="state.loading"
|
||
border
|
||
>
|
||
<!-- 调试:检查 tableRef -->
|
||
<!-- tableRef 会在组件挂载后自动赋值 -->
|
||
<!-- <TableColumn type="index" label="序号" width="60" align="center" /> -->
|
||
|
||
<TableColumnProvider :is-column-visible="isColumnVisible">
|
||
<TableColumn prop="tied" label="是否退休" width="100" align="center">
|
||
<template #default="scope">
|
||
<StatusTag
|
||
:value="scope.row.tied"
|
||
:options="YES_OR_NO"
|
||
/>
|
||
</template>
|
||
</TableColumn>
|
||
|
||
<TableColumn label="姓名/工号" min-width="150" align="center" fixed>
|
||
<template #default="scope">
|
||
<TeacherNameNo :name="scope.row.realName" :no="scope.row.teacherNo" />
|
||
</template>
|
||
</TableColumn>
|
||
|
||
<TableColumn prop="sex" label="性别" width="80" align="center">
|
||
<template #default="scope">
|
||
<GenderTag :sex="scope.row.sex" />
|
||
</template>
|
||
</TableColumn>
|
||
|
||
<TableColumn prop="deptName" label="部门" width="150" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="dgreeName" label="学历学位" width="120" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="titleName" label="职称等级" width="120" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="stationLevelName" label="岗位级别" width="120" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="workLevelName" label="职业资格等级" width="120" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="teacherCer" label="教师上岗证" width="120" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="midCer" label="中等教师资格证" width="150" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="highCer" label="高校教师资格证" width="150" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="employmentNature" label="用工性质" width="120" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="telPhone" label="手机" width="120" align="center" />
|
||
|
||
<TableColumn prop="homeAddress" label="家庭住址" width="200" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn prop="teacherCate" label="授课类型" width="120" align="center" show-overflow-tooltip />
|
||
|
||
<TableColumn label="操作" width="150" align="center" fixed="right">
|
||
<template #default="scope">
|
||
<div style="display: flex; align-items: center; justify-content: center; flex-wrap: nowrap; white-space: nowrap;">
|
||
<el-button
|
||
v-if="permissions.professional_teacherbase_edit"
|
||
type="primary"
|
||
link
|
||
icon="Document"
|
||
@click="handleEdit(scope.row, scope.$index)">查看
|
||
</el-button>
|
||
|
||
<ActionDropdown
|
||
:items="getActionMenuItems(scope.row)"
|
||
@command="(command) => handleMoreCommand(command, scope.row, scope.$index)"
|
||
/>
|
||
</div>
|
||
</template>
|
||
</TableColumn>
|
||
</TableColumnProvider>
|
||
</el-table>
|
||
|
||
<!-- 分页 -->
|
||
<pagination
|
||
:current="state.pagination?.current"
|
||
:size="state.pagination?.size"
|
||
:total="state.pagination?.total"
|
||
@currentChange="currentChangeHandle"
|
||
@sizeChange="sizeChangeHandle"
|
||
/>
|
||
</div>
|
||
|
||
|
||
<!--1 职工基础信息-->
|
||
<el-dialog v-model="dialogFromVisible" width="90%" :title="nowUserInfo.userName" class="employee-info-dialog">
|
||
|
||
<el-dialog v-model="preImgDialog" title="职称材料" append-to-body>
|
||
<div class="contentA">
|
||
<viewer :images="preImgUrl">
|
||
<auth-img v-for="src in preImgUrl" :authSrc="src.url" :key="src.title" style="width:200px;height:200px;"></auth-img>
|
||
</viewer>
|
||
</div>
|
||
</el-dialog>
|
||
|
||
<el-tabs v-model="activeName" type="border-card" tab-position="left">
|
||
<el-tab-pane label="基本信息" name="first">
|
||
<div class="base-info-form">
|
||
<el-form ref="baseForm" :model="form" label-width="120px" :rules="mergedRules">
|
||
<!-- 子标签页 -->
|
||
<el-tabs v-model="subActiveName" type="card" class="sub-tabs">
|
||
<!-- 基本信息子标签 -->
|
||
<el-tab-pane label="基本信息" name="subBaseInfo">
|
||
<!-- 照片区域和基本信息分组 -->
|
||
<div class="base-info-layout">
|
||
<!-- 左侧:照片区域 -->
|
||
<div v-if="isAdd==false && imageUrl" class="photo-section">
|
||
<div class="photo-wrapper">
|
||
<img :src="imageUrl" class="avatar-photo" alt="照片">
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 右侧:基本信息分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><User /></el-icon>
|
||
<span>基本信息</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="姓名" prop="baseInfo.realName">
|
||
<el-input
|
||
type="text"
|
||
v-model="form.baseInfo.realName"
|
||
:disabled="isAdd==false"
|
||
placeholder="请输入姓名"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="工号" prop="baseInfo.teacherNo">
|
||
<el-input
|
||
v-model="form.baseInfo.teacherNo"
|
||
:disabled="isAdd==false"
|
||
placeholder="请输入工号"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="性别" prop="baseInfo.sex">
|
||
<el-select clearable disabled v-model="form.baseInfo.sex" placeholder="请选择性别">
|
||
<el-option
|
||
v-for="item in sexyList"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="身份证" prop="baseInfo.idCard">
|
||
<el-input
|
||
v-model="form.baseInfo.idCard"
|
||
:disabled="isAdd==false && auditAll==false"
|
||
placeholder="请输入身份证号"
|
||
maxlength="18"
|
||
@input="handleIdCardInput"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="出生年月" prop="baseInfo.birthday">
|
||
<el-input disabled v-model="form.baseInfo.birthday" placeholder="自动计算" />
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="年龄" prop="baseInfo.age">
|
||
<el-input disabled v-model="form.baseInfo.age" placeholder="自动计算" />
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 联系方式分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><Phone /></el-icon>
|
||
<span>联系方式</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="手机" prop="baseInfo.telPhone">
|
||
<el-input
|
||
v-model="form.baseInfo.telPhone"
|
||
type="number"
|
||
placeholder="请输入手机号"
|
||
maxlength="11"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="手机2" prop="baseInfo.telPhoneTwo">
|
||
<el-input
|
||
v-model="form.baseInfo.telPhoneTwo"
|
||
type="number"
|
||
placeholder="请输入备用手机号"
|
||
maxlength="11"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="宅电">
|
||
<el-input
|
||
v-model="form.baseInfo.homePhone"
|
||
type="number"
|
||
placeholder="请输入宅电"
|
||
maxlength="20"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
|
||
<!-- 个人资料分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><Document /></el-icon>
|
||
<span>个人资料</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="民族" prop="baseInfo.national">
|
||
<el-select clearable v-model="form.baseInfo.national" placeholder="请选择民族" style="width: 100%">
|
||
<el-option
|
||
v-for="item in nationalList"
|
||
:key="item.nationCode"
|
||
:label="item.nationName"
|
||
:value="item.nationCode">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="宗教信仰" prop="baseInfo.religiousBelief">
|
||
<el-select clearable v-model="form.baseInfo.religiousBelief" placeholder="请选择宗教信仰" style="width: 100%">
|
||
<el-option
|
||
v-for="item in religiousBeliefDic"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="健康状况">
|
||
<el-select clearable v-model="form.baseInfo.health" placeholder="请选择健康状况" style="width: 100%">
|
||
<el-option
|
||
v-for="item in healthList"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="籍贯" prop="baseInfo.nativePlace">
|
||
<el-input v-model="form.baseInfo.nativePlace" placeholder="请输入籍贯" />
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
<el-row :gutter="16">
|
||
<el-col :span="12">
|
||
<el-form-item label="出生地">
|
||
<el-input
|
||
v-model="form.baseInfo.birthPlace"
|
||
type="textarea"
|
||
:rows="2"
|
||
placeholder="请输入出生地"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="12">
|
||
<el-form-item label="特长">
|
||
<el-input
|
||
v-model="form.baseInfo.speciality"
|
||
type="textarea"
|
||
:rows="2"
|
||
placeholder="请输入特长"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
|
||
<!-- 银行信息分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><CreditCard /></el-icon>
|
||
<span>银行信息</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6" v-if="auditAll=='1'">
|
||
<el-form-item label="银行卡号" prop="baseInfo.bankNo" :rules="{required: true, message: '请输入银行卡号', trigger: 'blur'}">
|
||
<el-input
|
||
v-model="form.baseInfo.bankNo"
|
||
type="number"
|
||
placeholder="请输入银行卡号"
|
||
maxlength="30"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="开户行" prop="baseInfo.bankOpen">
|
||
<el-input v-model="form.baseInfo.bankOpen" placeholder="请输入开户行" />
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="12">
|
||
<el-form-item label="家庭住址" prop="baseInfo.homeAddress">
|
||
<el-input
|
||
v-model="form.baseInfo.homeAddress"
|
||
type="textarea"
|
||
:rows="2"
|
||
placeholder="请输入家庭住址"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
|
||
<!-- 工作信息分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><Briefcase /></el-icon>
|
||
<span>工作信息</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="允许进出">
|
||
<el-select v-model="form.baseInfo.inoutFlag" :disabled="auditAll!='1'" placeholder="请选择" style="width: 100%">
|
||
<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-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="授课类型">
|
||
<el-select v-model="form.baseInfo.teacherCate" :disabled="auditAll!='1'" placeholder="请选择授课类型" style="width: 100%">
|
||
<el-option
|
||
v-for="item in teacherCateList"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
<el-row :gutter="16" v-if="auditAll=='1'">
|
||
<el-col :span="24">
|
||
<el-form-item label="进出情况备注">
|
||
<el-input
|
||
v-model="form.baseInfo.inoutRemarks"
|
||
type="textarea"
|
||
:rows="3"
|
||
placeholder="请输入进出情况备注"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<!-- 岗位信息子标签 -->
|
||
<el-tab-pane label="岗位信息" name="subStation">
|
||
<!-- 岗位信息分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><Briefcase /></el-icon>
|
||
<span>岗位信息</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="岗位类别" prop="professionalStationRelation.stationTypeId">
|
||
<el-select clearable v-model="form.professionalStationRelation.stationTypeId" placeholder="请选择岗位类别" style="width: 100%">
|
||
<el-option
|
||
v-for="item in baseInfoAbout.stationTypeList"
|
||
:key="item.id"
|
||
:label="item.typeName"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="职务级别" prop="professionalStationRelation.stationDutyLevelId">
|
||
<el-select clearable v-model="form.professionalStationRelation.stationDutyLevelId" placeholder="请选择职务级别" style="width: 100%">
|
||
<el-option
|
||
v-for="item in baseInfoAbout.stationDutyLevelList"
|
||
:key="item.id"
|
||
:label="item.stationDutyLevelName"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="岗位级别" prop="professionalStationRelation.stationLevel">
|
||
<el-select clearable v-model="form.professionalStationRelation.stationLevel" placeholder="请选择岗位级别" style="width: 100%">
|
||
<el-option
|
||
v-for="item in baseInfoAbout.stationLevelList"
|
||
:key="item.id"
|
||
:label="item.levelName"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="在职情况" prop="professionalStationRelation.atStation">
|
||
<el-select clearable v-model="form.professionalStationRelation.atStation" placeholder="请选择在职情况" style="width: 100%">
|
||
<el-option
|
||
v-for="item in baseInfoAbout.atStationList"
|
||
:key="item.id"
|
||
:label="item.atStationName"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="任现职级时间" prop="professionalStationRelation.stationDate">
|
||
<el-date-picker
|
||
type="date"
|
||
v-model="form.professionalStationRelation.stationDate"
|
||
value-format="YYYY-MM-DD"
|
||
format="YYYY-MM-DD"
|
||
placeholder="请选择时间"
|
||
style="width: 100%"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<!-- 新增时可编辑 编辑时不可编辑 -->
|
||
<el-form-item label="部门" prop="professionalStationRelation.deptCodeList">
|
||
<el-cascader
|
||
:disabled="!isAdd"
|
||
v-model="form.professionalStationRelation.deptCodeList"
|
||
:options="deptTreeList"
|
||
filterable
|
||
placeholder="请选择部门"
|
||
style="width: 100%"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="12">
|
||
<el-form-item label="职务">
|
||
<el-input
|
||
v-model="form.professionalStationRelation.dutyDesc"
|
||
type="textarea"
|
||
:rows="2"
|
||
placeholder="请输入职务"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
|
||
<!-- 工作时间分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><Clock /></el-icon>
|
||
<span>工作时间</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="参加工作时间">
|
||
<el-date-picker
|
||
type="date"
|
||
v-model="form.professionalStationRelation.workDate"
|
||
value-format="YYYY-MM-DD"
|
||
format="YYYY-MM-DD"
|
||
placeholder="请选择时间"
|
||
style="width: 100%"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="退休时间">
|
||
<el-date-picker
|
||
type="date"
|
||
readonly
|
||
v-model="form.professionalStationRelation.retireDate"
|
||
value-format="YYYY-MM-DD"
|
||
format="YYYY-MM-DD"
|
||
placeholder="自动计算"
|
||
style="width: 100%"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6" v-if="isShow">
|
||
<el-form-item label="职位类别">
|
||
<el-select clearable v-model="form.professionalStationRelation.teacherClassify" placeholder="请选择职位类别" style="width: 100%">
|
||
<el-option
|
||
v-for="item in teacherClassifyData"
|
||
:key="item.value"
|
||
:label="item.label"
|
||
:value="item.value">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="任现职务时间">
|
||
<el-date-picker
|
||
type="date"
|
||
v-model="form.professionalStationRelation.dutyDate"
|
||
value-format="YYYY-MM-DD"
|
||
format="YYYY-MM-DD"
|
||
placeholder="请选择时间"
|
||
style="width: 100%"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="进校时间" prop="professionalStationRelation.entrySchoolDate">
|
||
<el-date-picker
|
||
type="date"
|
||
v-model="form.professionalStationRelation.entrySchoolDate"
|
||
value-format="YYYY-MM-DD"
|
||
format="YYYY-MM-DD"
|
||
placeholder="请选择时间"
|
||
style="width: 100%"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6" v-if="isShow">
|
||
<el-form-item label="进编时间" prop="entryDutyDate">
|
||
<el-date-picker
|
||
type="date"
|
||
v-model="form.professionalStationRelation.entryDutyDate"
|
||
value-format="YYYY-MM-DD"
|
||
format="YYYY-MM-DD"
|
||
placeholder="请选择时间"
|
||
style="width: 100%"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
|
||
<!-- 其他信息分组 -->
|
||
<div class="form-section">
|
||
<div class="section-title">
|
||
<el-icon><Setting /></el-icon>
|
||
<span>其他信息</span>
|
||
</div>
|
||
<el-row :gutter="16">
|
||
<el-col :span="6">
|
||
<el-form-item label="用工性质" prop="professionalStationRelation.employmentNature">
|
||
<el-select clearable v-model="form.professionalStationRelation.employmentNature" placeholder="请选择用工性质" style="width: 100%">
|
||
<el-option
|
||
v-for="item in baseInfoAbout.employmentNatureList"
|
||
:key="item.id"
|
||
:label="item.employmentNatureName"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="教师类型">
|
||
<el-select clearable v-model="form.professionalStationRelation.teacherType" placeholder="请选择教师类型" style="width: 100%">
|
||
<el-option
|
||
v-for="item in baseInfoAbout.teacherTypeList"
|
||
:key="item.id"
|
||
:label="item.typeName"
|
||
:value="item.id">
|
||
</el-option>
|
||
</el-select>
|
||
</el-form-item>
|
||
</el-col>
|
||
<el-col :span="6">
|
||
<el-form-item label="党支部">
|
||
<el-select clearable v-model="form.professionalStationRelation.branchId" disabled 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-col>
|
||
</el-row>
|
||
<el-row :gutter="16">
|
||
<el-col :span="24">
|
||
<el-form-item label="备注">
|
||
<el-input
|
||
v-model="form.baseInfo.remarks"
|
||
type="textarea"
|
||
:rows="2"
|
||
placeholder="请输入备注"
|
||
/>
|
||
</el-form-item>
|
||
</el-col>
|
||
</el-row>
|
||
</div>
|
||
</el-tab-pane>
|
||
</el-tabs>
|
||
</el-form>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<el-tab-pane label="政治面貌" name="politicsPane">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Flag /></el-icon>
|
||
<span>政治面貌信息</span>
|
||
</div>
|
||
<el-button v-if="permissions.politics_edit" type="primary" size="default" @click="handleAddPolitics">
|
||
<el-icon><Plus /></el-icon>
|
||
<span>新增</span>
|
||
</el-button>
|
||
</div>
|
||
<el-table :data="dataPolitics" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="politicsStatus" label="政治面貌" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(searchPoliticsStatusList, scope.row.politicsStatusId || scope.row.politicsStatus, 'politicsStatus') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="joinTime" label="加入时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.joinTime ? new Date(scope.row.joinTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="correctionTime" label="转正时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.correctionTime ? new Date(scope.row.correctionTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="createTime" label="更新时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.createTime ? new Date(scope.row.createTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="操作" width="150" align="center" v-if="permissions.politics_edit">
|
||
<template #default="scope">
|
||
<el-button type="primary" link @click="handleEditPolitics(scope.row, scope.$index)">
|
||
<el-icon><EditPen /></el-icon>
|
||
<span>编辑</span>
|
||
</el-button>
|
||
<el-button type="primary" link @click="handleDeletePolitics(scope.row, scope.$index)">
|
||
<el-icon><Delete /></el-icon>
|
||
<span>删除</span>
|
||
</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<el-tab-pane label="社会关系" name="third">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Connection /></el-icon>
|
||
<span>社会关系信息</span>
|
||
</div>
|
||
<el-button v-if="permissions.professionalsocial_add" type="primary" size="default" @click="handleAddRelation">
|
||
<el-icon><Plus /></el-icon>
|
||
<span>新增</span>
|
||
</el-button>
|
||
</div>
|
||
<el-table :data="relationData" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="title" label="称谓" min-width="100" align="center" />
|
||
<el-table-column prop="realName" label="姓名" min-width="100" align="center" />
|
||
<el-table-column prop="birthday" label="出生年月" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.birthday ? new Date(scope.row.birthday).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="politicsStatus" label="政治面貌" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(searchPoliticsStatusList, scope.row.politicsStatusId || scope.row.politicsStatus, 'politicsStatus') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="workStation" label="工作单位及职务" min-width="200" align="center" show-overflow-tooltip />
|
||
<el-table-column label="操作" width="150" align="center" v-if="permissions.professionalsocial_edit">
|
||
<template #default="scope">
|
||
<el-button type="primary" link @click="handleEditRelation(scope.row, scope.$index)">
|
||
<el-icon><EditPen /></el-icon>
|
||
<span>编辑</span>
|
||
</el-button>
|
||
<el-button type="primary" link @click="handleDeleteRelation(scope.row, scope.$index)">
|
||
<el-icon><Delete /></el-icon>
|
||
<span>删除</span>
|
||
</el-button>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<el-tab-pane label="学历" name="second">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><School /></el-icon>
|
||
<span>学历信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="dataEducation" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="graduateTime" label="毕业时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.graduateTime ? new Date(scope.row.graduateTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="qualificationConfigId" label="学历" min-width="100" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(baseInfoAbout.academicQualificationList, scope.row.qualificationConfigId, 'qualificationName') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="degreeConfigId" label="学位" min-width="100" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(baseInfoAbout.degreeList, scope.row.degreeConfigId, 'degreeName') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="graduateSchool" label="毕业学校" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="major" label="所学专业" min-width="150" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="certificateNumber" label="证书编码" min-width="120" align="center" />
|
||
<el-table-column label="学历证书" min-width="150" align="center">
|
||
<template #default="scope">
|
||
<el-button
|
||
v-if="scope.row.qiList && scope.row.qiList.length > 0"
|
||
type="primary"
|
||
link
|
||
size="small"
|
||
icon="Document"
|
||
@click="handlePreviewFiles(scope.row.qiList)"
|
||
>查看</el-button>
|
||
<span v-else class="text-placeholder">-</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column label="学位证书" min-width="150" align="center">
|
||
<template #default="scope">
|
||
<el-button
|
||
v-if="scope.row.deList && scope.row.deList.length > 0"
|
||
type="primary"
|
||
link
|
||
size="small"
|
||
icon="Document"
|
||
@click="handlePreviewFiles(scope.row.deList)"
|
||
>查看</el-button>
|
||
<span v-else class="text-placeholder">-</span>
|
||
</template>
|
||
</el-table-column>
|
||
<!-- <el-table-column prop="createTime" label="更新时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.createTime ? new Date(scope.row.createTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column> -->
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<!--职称表单-->
|
||
<el-tab-pane label="职称" name="fourth">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Medal /></el-icon>
|
||
<span>职称信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="proData" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="professionalTitleConfigId" label="职称等级" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(baseInfoAbout.proTitleList, scope.row.professionalTitleConfigId, 'professionalTitle') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="majorStation" label="专业技术职务" min-width="150" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(baseInfoAbout.majorStationList, scope.row.majorStation, 'majorStationName') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="certificateTime" label="取证时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.certificateTime ? new Date(scope.row.certificateTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="inOfficeDate" label="职称任职时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.inOfficeDate ? new Date(scope.row.inOfficeDate).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="certificateNumber" label="证书编号" min-width="120" align="center" />
|
||
<el-table-column label="证明材料" min-width="120" align="center">
|
||
<template #default="scope">
|
||
<el-button
|
||
v-if="scope.row.srcList && scope.row.srcList.length > 0"
|
||
type="primary"
|
||
link
|
||
size="small"
|
||
icon="Document"
|
||
@click="handlePreviewFiles(scope.row.srcList)"
|
||
>查看</el-button>
|
||
<span v-else class="text-placeholder">-</span>
|
||
</template>
|
||
</el-table-column>
|
||
<!-- <el-table-column prop="createTime" label="更新时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.createTime ? new Date(scope.row.createTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column> -->
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<!--职业资格表单-->
|
||
<el-tab-pane label="职业资格" name="five">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Medal /></el-icon>
|
||
<span>职业资格信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="workData" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="worker" label="职业工种" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(baseInfoAbout.workTypeList, scope.row.worker, 'workName') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="qualificationConfigId" label="等级" min-width="100" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(baseInfoAbout.qualificationList, scope.row.qualificationConfigId, 'levelName') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="certificateTime" label="取证时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.certificateTime ? new Date(scope.row.certificateTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="certificateNumber" label="证书编号" min-width="120" align="center" />
|
||
<el-table-column label="证明材料" min-width="120" align="center">
|
||
<template #default="scope">
|
||
<el-button
|
||
v-if="scope.row.srcList && scope.row.srcList.length > 0"
|
||
type="primary"
|
||
link
|
||
size="small"
|
||
icon="Document"
|
||
@click="handlePreviewFiles(scope.row.srcList)"
|
||
>查看</el-button>
|
||
<span v-else class="text-placeholder">-</span>
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="createTime" label="更新时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.createTime ? new Date(scope.row.createTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<!--教师证表单-->
|
||
<el-tab-pane label="教师证" name="six">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Files /></el-icon>
|
||
<span>教师证信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="zgzData" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="certificateConfId" label="证书名称" min-width="200" align="center">
|
||
<template #default="scope">
|
||
{{ getNameById(certificateList, scope.row.certificateConfId, 'cretificateName') }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="certificateNumber" label="证书编号" min-width="150" align="center" />
|
||
<el-table-column label="证明材料" min-width="120" align="center">
|
||
<template #default="scope">
|
||
<el-button
|
||
v-if="scope.row.srcList && scope.row.srcList.length > 0"
|
||
type="primary"
|
||
link
|
||
size="small"
|
||
icon="Document"
|
||
@click="handlePreviewFiles(scope.row.srcList)"
|
||
>查看</el-button>
|
||
<span v-else class="text-placeholder">-</span>
|
||
</template>
|
||
</el-table-column>
|
||
<!-- <el-table-column prop="createTime" label="更新时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.createTime ? new Date(scope.row.createTime).toLocaleDateString() : '-' }}
|
||
</template>
|
||
</el-table-column> -->
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
|
||
|
||
<el-tab-pane label="岗位变更" name="stationChange">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Switch /></el-icon>
|
||
<span>岗位变更信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="stationChange" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="oldDeptName" label="原部门名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="newDeptName" label="现部门名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="changeDate" label="调令日期" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.changeDate ? new Date(scope.row.changeDate).toLocaleDateString() : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<el-tab-pane label="党员调动" name="partyChange">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Flag /></el-icon>
|
||
<span>党员调动信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="partyChange" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="oldBranchName" label="原支部名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="branchName" label="现支部名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="partyFee" label="党费" min-width="100" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.partyFee ? scope.row.partyFee.toFixed(2) : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="changeTime" label="变动时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.changeTime ? new Date(scope.row.changeTime).toLocaleDateString() : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="createTime" label="创建时间" min-width="120" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="remarks" label="备注" min-width="150" align="center" show-overflow-tooltip />
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<!--综合表彰-->
|
||
<el-tab-pane label="综合表彰" name="teacherHonor">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Medal /></el-icon>
|
||
<span>综合表彰信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="honorVOList" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="honor" label="荣誉" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="honorCompany" label="表彰单位" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="year" label="年份" min-width="100" align="center" />
|
||
<el-table-column label="证明材料" width="150" align="center">
|
||
<template #default="scope">
|
||
<el-button
|
||
v-if="scope.row.attachment"
|
||
type="primary"
|
||
link
|
||
size="small"
|
||
icon="Document"
|
||
@click="handlePreviewFiles([{ url: scope.row.attachment, title: '' }])"
|
||
>查看</el-button>
|
||
<span v-else class="text-placeholder">-</span>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
<el-tab-pane label="教师论文" name="nine">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Document /></el-icon>
|
||
<span>教师论文信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="paperVOList" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="author" label="作者" min-width="100" align="center" />
|
||
<el-table-column prop="secondAuthor" label="第二作者" min-width="100" align="center" />
|
||
<el-table-column prop="title" label="论文名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="paperTypeName" label="论文类型" min-width="120" align="center" />
|
||
<el-table-column prop="nameOfPublication" label="发表刊物名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="dateOfPublication" label="发表时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.dateOfPublication ? new Date(scope.row.dateOfPublication).toLocaleDateString() : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="publicationsCompetentUnit" label="刊物主办单位" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="publicationsManageUnit" label="刊物主管单位" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="awardingUnit" label="颁奖单位" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="rewardLevel" label="获奖等级" min-width="100" align="center" />
|
||
<el-table-column prop="rewardTime" label="获奖时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.rewardTime ? new Date(scope.row.rewardTime).toLocaleDateString() : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="remarks" label="备注" min-width="120" align="center" show-overflow-tooltip />
|
||
<el-table-column label="证明材料" width="150" align="center">
|
||
<template #default="scope">
|
||
<el-button type="primary" size="small" @click="openShowEvidence(scope.row)">证明材料</el-button>
|
||
<ShowEvidence ref="evidenceDialogRef" :row="edviceForm"></ShowEvidence>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<el-tab-pane label="教材列表" name="ten">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Document /></el-icon>
|
||
<span>教材列表信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="materialVOList" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="materialName" label="教材名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="materialTypeName" label="教材类别" min-width="120" align="center" />
|
||
<el-table-column prop="editor" label="主编" min-width="100" align="center" />
|
||
<el-table-column prop="secondEditor" label="副主编" min-width="100" align="center" />
|
||
<el-table-column prop="joinEditor" label="参编" min-width="100" align="center" />
|
||
<el-table-column prop="words" label="编写字数(千字)" min-width="120" align="center" />
|
||
<el-table-column prop="publishCompany" label="出版单位" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="publishTime" label="出版时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.publishTime ? new Date(scope.row.publishTime).toLocaleDateString() : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="remarks" label="备注" min-width="120" align="center" show-overflow-tooltip />
|
||
<el-table-column label="证明材料" width="150" align="center">
|
||
<template #default="scope">
|
||
<el-button type="primary" size="small" @click="openShowEvidence(scope.row)">证明材料</el-button>
|
||
<ShowEvidence ref="evidenceDialogRef" :row="edviceForm"></ShowEvidence>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
|
||
<el-tab-pane label="课题列表" name="eleven">
|
||
<div class="table-section">
|
||
<div class="table-header">
|
||
<div class="table-title">
|
||
<el-icon><Document /></el-icon>
|
||
<span>课题列表信息</span>
|
||
</div>
|
||
</div>
|
||
<el-table :data="topicListVOList" border stripe class="data-table">
|
||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||
<el-table-column prop="deptName" label="课题所属部门" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="topicName" label="课题名称" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="topicLeader" label="课题负责人" min-width="120" align="center" />
|
||
<el-table-column prop="topicJoiner" label="课题参与人" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="topicSourceName" label="课题来源" min-width="120" align="center" />
|
||
<el-table-column prop="topicLevelName" label="级别" min-width="100" align="center" />
|
||
<el-table-column prop="finishTime" label="结题时间" min-width="120" align="center">
|
||
<template #default="scope">
|
||
{{ scope.row.finishTime ? new Date(scope.row.finishTime).toLocaleDateString() : '' }}
|
||
</template>
|
||
</el-table-column>
|
||
<el-table-column prop="awardingUnit" label="颁奖单位" min-width="180" align="center" show-overflow-tooltip />
|
||
<el-table-column prop="awardingLevel" label="获奖等级" min-width="100" align="center" />
|
||
<el-table-column prop="remarks" label="备注" min-width="120" align="center" show-overflow-tooltip />
|
||
<el-table-column label="证明材料" width="150" align="center">
|
||
<template #default="scope">
|
||
<el-button type="primary" size="small" @click="openShowEvidence(scope.row)">证明材料</el-button>
|
||
<ShowEvidence ref="evidenceDialogRef" :row="edviceForm"></ShowEvidence>
|
||
</template>
|
||
</el-table-column>
|
||
</el-table>
|
||
</div>
|
||
</el-tab-pane>
|
||
</el-tabs>
|
||
|
||
<template #footer>
|
||
<div class="dialog-footer">
|
||
<el-button
|
||
v-if="activeName === 'first'"
|
||
type="primary"
|
||
@click="saveSubmit"
|
||
:disabled="!canSave"
|
||
:loading="!canSave">基本信息保存</el-button>
|
||
<el-button @click="dialogFromVisible=false">关 闭</el-button>
|
||
</div>
|
||
</template>
|
||
</el-dialog>
|
||
|
||
<!-- 政治面貌编辑对话框 -->
|
||
<PoliticsDialog
|
||
v-model="politicsDialogVisible"
|
||
:form-data="politicsForm"
|
||
:politics-status-list="searchPoliticsStatusList"
|
||
@submit="handlePoliticsSubmit"
|
||
/>
|
||
|
||
<!-- 社会关系编辑对话框 -->
|
||
<RelationDialog
|
||
v-model="relationDialogVisible"
|
||
:form-data="relationForm"
|
||
:politics-status-list="searchPoliticsStatusList"
|
||
@submit="handleRelationSubmit"
|
||
/>
|
||
|
||
<!-- 锁定状态管理对话框 -->
|
||
<StatusLockDialog
|
||
v-model="dialogVisible.statusDialogFormVisible"
|
||
:form-data="statusForm"
|
||
:can-edit="permissions.professional_teacherbase_edit"
|
||
@submit="handleStatusLockSubmit"
|
||
/>
|
||
|
||
|
||
<MultiDialog ref="multiDialogRef" @getList="getDataList" :page="state.pagination" :nowRow="nowRow"></MultiDialog>
|
||
|
||
<ImportTeacherInfo ref="importTeacherInfoRef"></ImportTeacherInfo>
|
||
|
||
<ExportTeacherInfoDialog ref="exportTeacherInfoDialogRef" :search="params"></ExportTeacherInfoDialog>
|
||
|
||
<!-- 证书预览 -->
|
||
<preview-file
|
||
v-for="src in certificateImgUrl"
|
||
:key="src.title || src.url"
|
||
:authSrc="src.url"
|
||
dialog-title="证书预览"
|
||
/>
|
||
|
||
</div>
|
||
</template>
|
||
|
||
|
||
<script setup lang="ts">
|
||
// Vue 3 Composition API
|
||
import { ref, reactive, computed, watch, onMounted, nextTick, defineAsyncComponent, unref, type Ref } from 'vue'
|
||
import { storeToRefs } from 'pinia'
|
||
import { useUserInfo } from '/@/stores/userInfo'
|
||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||
import axios from 'axios'
|
||
// 导入图标
|
||
import { User, Phone, Document, CreditCard, Briefcase, Flag, Plus, Delete, Connection, School, Medal, Files, Clock, Setting, Switch, CircleCheck, CircleClose, Refresh, Download } from '@element-plus/icons-vue'
|
||
|
||
// 导入api(统一使用 /@/ 路径别名)
|
||
import {
|
||
fetchList,
|
||
getObj,
|
||
addObj,
|
||
putObj,
|
||
addInformation,
|
||
getAllInfoAboutList,
|
||
updateInout,
|
||
exportTeacherInfo as exportTeacherInfoApi
|
||
} from '/@/api/professional/professionaluser/teacherbase'
|
||
import {getDictsByTypes} from '/@/api/admin/dict'
|
||
import {getNationalList} from '/@/api/basic/basicnation'
|
||
import {addPoliticssStatus, dePoObj} from '/@/api/professional/professionaluser/professionalpoliticsstatus'
|
||
import {addSocialObj, delSocialObj as delSocialObjApi} from '/@/api/professional/professionaluser/professionalsocial'
|
||
import {getPoliticsStatusList} from '/@/api/basic/basicpoliticsstatusbase'
|
||
import {getTeacherCertificateList} from '/@/api/professional/rsbase/professionalteachercertificateconf'
|
||
import {
|
||
treeForCascader,
|
||
getDeptByCode,
|
||
getDeptListByLevelTwo,
|
||
getDeptListByParent
|
||
} from '/@/api/basic/basicdept'
|
||
import {updateStatus} from '/@/api/professional/professionalstatuslock'
|
||
import {resetPassWord} from "/@/api/professional/professionaluser/teacherbase"
|
||
// 组件配置已不再需要(已从 avue-crud 迁移到 el-table)
|
||
import global from '/@/components/tools/commondict.vue'
|
||
import authImg from "/@/components/tools/auth-img.vue"
|
||
|
||
// 导入工具
|
||
import { Session } from '/@/utils/storage'
|
||
// 导入 composables(已移除,改为通过 TableColumnControl 组件暴露)
|
||
// 导入组件(使用 defineAsyncComponent 异步加载,优化性能)
|
||
const TeacherNameNo = defineAsyncComponent(() => import('/@/components/TeacherNameNo/index.vue'))
|
||
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue'))
|
||
const StatusTag = defineAsyncComponent(() => import('/@/components/StatusTag/index.vue'))
|
||
const ShowEvidence = defineAsyncComponent(() => import("../common/showEvidence.vue"));
|
||
const ExportTeacherInfoDialog = defineAsyncComponent(() => import('./export-teacher-info.vue'));
|
||
const ImportTeacherInfo = defineAsyncComponent(() => import('./import-teacherInfo.vue'));
|
||
const MultiDialog = defineAsyncComponent(() => import("./multiDialog.vue"));
|
||
const PoliticsDialog = defineAsyncComponent(() => import('./politics-dialog.vue'));
|
||
const RelationDialog = defineAsyncComponent(() => import('./relation-dialog.vue'));
|
||
const StatusLockDialog = defineAsyncComponent(() => import('./status-lock-dialog.vue'));
|
||
const ActionDropdown = defineAsyncComponent(() => import('/@/components/tools/action-dropdown.vue'));
|
||
const TableColumnControl = defineAsyncComponent(() => import('/@/components/TableColumnControl/index.vue'));
|
||
const TableColumn = defineAsyncComponent(() => import('/@/components/TableColumn/index.vue'));
|
||
const TableColumnProvider = defineAsyncComponent(() => import('/@/components/TableColumn/Provider.vue'));
|
||
const previewFile = defineAsyncComponent(() => import('/@/components/tools/preview-file.vue'));
|
||
// Pagination 组件已在模板中使用,无需导入(全局组件)
|
||
// 导入工具
|
||
import {validateNull} from "/@/utils/validate";
|
||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||
|
||
// 使用 Pinia store
|
||
const userInfoStore = useUserInfo()
|
||
const { userInfos } = storeToRefs(userInfoStore)
|
||
|
||
// 创建权限对象,将 authBtnList 转换为 permissions 对象格式
|
||
const permissions = computed(() => {
|
||
const perms: Record<string, boolean> = {}
|
||
userInfos.value.authBtnList.forEach((perm: string) => {
|
||
perms[perm] = true
|
||
})
|
||
return perms
|
||
})
|
||
|
||
// 消息提示 hooks
|
||
const message = useMessage()
|
||
const messageBox = useMessageBox()
|
||
// 响应式数据
|
||
const canSave = ref(true)
|
||
const nowRow = ref<any>({})
|
||
const edviceForm = ref<any>({})
|
||
const dialogFromVisible = ref(false)
|
||
const searchFormRef = ref()
|
||
const showSearch = ref(true)
|
||
|
||
// 搜索表单数据
|
||
const search = reactive({
|
||
deptCode: '',
|
||
secDeptCode: '',
|
||
tied: '',
|
||
realName: '',
|
||
teacherNo: '',
|
||
retireDate: '',
|
||
pfTitleId: '',
|
||
stationDutyLevelId: '',
|
||
politicsStatus: '',
|
||
teacherCate: '',
|
||
inoutFlag: ''
|
||
})
|
||
|
||
// 配置 useTable
|
||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||
queryForm: search, // 将 search 作为 queryForm
|
||
createdIsNeed: false, // 不在 onMounted 时自动加载,等 init 完成后再加载
|
||
pageList: async (queryParams: any) => {
|
||
// 合并额外参数(如 flag、tied)
|
||
params.value.tied = search.tied
|
||
const requestParams = {
|
||
...queryParams,
|
||
...params.value
|
||
}
|
||
const response = await fetchList(requestParams)
|
||
|
||
// 处理数据转换
|
||
let records = response.data.record.records
|
||
records = convertDictData(records)
|
||
|
||
// 处理 auditAll
|
||
if (response.data.auditAll == '0') {
|
||
auditAll.value = false
|
||
} else {
|
||
auditAll.value = true
|
||
}
|
||
|
||
// 返回 useTable 期望的数据结构:{ data: { records: [...], total: ... } }
|
||
return {
|
||
...response,
|
||
data: {
|
||
records: records, // 转换后的数据列表
|
||
total: response.data.record.total // 总数
|
||
}
|
||
}
|
||
},
|
||
onLoaded: (state: any) => {
|
||
// onLoaded 回调,可以在这里进行额外的数据处理
|
||
// 数据已经在 pageList 中处理过了
|
||
}
|
||
})
|
||
|
||
// 使用 useTable hook
|
||
const { getDataList, sizeChangeHandle, currentChangeHandle } = useTable(state)
|
||
// 各种option配置(这些是静态配置,直接使用导入的值)
|
||
|
||
// 响应式数据
|
||
const form = reactive<{
|
||
baseInfo: any,
|
||
professionalStationRelation: any
|
||
}>({
|
||
baseInfo: {},
|
||
professionalStationRelation: {}
|
||
})
|
||
const healthList = ref([])
|
||
const YES_OR_NO = global.YES_OR_NO
|
||
const teacherCateList = ref([])
|
||
const baseInfoAbout = reactive({
|
||
stationTypeList: [],
|
||
atStationList: [],
|
||
teacherTypeList: [],
|
||
partBranchList: [],
|
||
employmentNatureList: [],
|
||
stationLevelList: [],
|
||
stationDutyLevelList: [],
|
||
workTypeList: [],
|
||
proTitleList: [],
|
||
majorStationList: [],
|
||
qualificationList: [], // 职业资格等级列表
|
||
academicQualificationList: [], // 学历列表
|
||
degreeList: []
|
||
})
|
||
const activeName = ref('')
|
||
const subActiveName = ref('subBaseInfo') // 子标签页当前激活的标签
|
||
const dialogImageUrl = ref('')
|
||
const nationalList = ref([])
|
||
const imgList = ref([])
|
||
const deptTreeList = ref([])
|
||
const relationData = ref([])
|
||
const dataEducation = ref([])
|
||
const workData = ref([])
|
||
const honorVOList = ref([])
|
||
const paperVOList = ref([])
|
||
const materialVOList = ref([])
|
||
const topicListVOList = ref([])
|
||
const partyChange = ref([])
|
||
const stationChange = ref([])
|
||
const proData = ref([])
|
||
const zgzData = ref([])
|
||
const nowImage = ref("")
|
||
const dataPolitics = ref([])
|
||
|
||
// 表格引用
|
||
const tableRef = ref()
|
||
// TableColumnControl 组件引用
|
||
const tableColumnControlRef = ref()
|
||
|
||
// 从 TableColumnControl 获取 isColumnVisible 和 visibleTableColumns
|
||
const isColumnVisible = (propOrLabel: string) => {
|
||
if (tableColumnControlRef.value?.isColumnVisible) {
|
||
return tableColumnControlRef.value.isColumnVisible(propOrLabel)
|
||
}
|
||
// 默认显示所有列(在 TableColumnControl 初始化之前)
|
||
return true
|
||
}
|
||
|
||
const visibleTableColumns = ref<string[]>([])
|
||
|
||
// 静态配置数据
|
||
const sexyList = [
|
||
{
|
||
label: '男',
|
||
value: '1'
|
||
},
|
||
{
|
||
label: '女',
|
||
value: '0'
|
||
}
|
||
]
|
||
const teacherClassifyData = ref([])
|
||
const stationFormValidate = {
|
||
stationTypeId: [
|
||
{required: true, message: '请选择类别', trigger: 'blur'},
|
||
],
|
||
stationDutyLevelId: [
|
||
{required: true, message: '请选择职务级别', trigger: 'blur'},
|
||
],
|
||
stationLevel: [
|
||
{required: true, message: '请选择岗位级别', trigger: 'blur'},
|
||
],
|
||
stationDate: [
|
||
{required: true, message: '请选择任现岗位职级时间', trigger: 'blur'},
|
||
],
|
||
atStation: [
|
||
{required: true, message: '请选择在职情况', trigger: 'blur'},
|
||
],
|
||
employmentNature: [
|
||
{required: true, message: '请选择用工性质', trigger: 'blur'},
|
||
],
|
||
entrySchoolDate: [
|
||
{required: true, message: '请选进校时间', trigger: 'blur'},
|
||
],
|
||
deptCodeList: [
|
||
{required: true, message: '请选择部门', trigger: 'change'},
|
||
{
|
||
validator: (rule: any, value: any, callback: any) => {
|
||
if (!value || !Array.isArray(value) || value.length === 0) {
|
||
callback(new Error('请选择部门'))
|
||
} else {
|
||
callback()
|
||
}
|
||
},
|
||
trigger: 'change'
|
||
}
|
||
]
|
||
}
|
||
const rules = {
|
||
realName: [
|
||
{required: true, message: '请输入姓名', trigger: 'blur'},
|
||
],
|
||
telPhone: [
|
||
{required: true, message: '请输入正确的电话号码', trigger: 'blur'},
|
||
{pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur'}
|
||
],
|
||
idCard: [
|
||
{required: true, message: '请输入正确身份证', trigger: 'blur'},
|
||
{min: 15, max: 18, message: '长度在 15 到 18 个字符', trigger: 'blur'},
|
||
{pattern: /^(\d{15}|\d{17}[\dXx])$/, message: '身份证号格式不正确(15位或18位,18位最后一位可以是X)', trigger: 'blur'}
|
||
],
|
||
telPhoneTwo: [
|
||
{required: false, pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur'}
|
||
],
|
||
bankNo: [
|
||
{required: true, message: '请输入银行卡号', trigger: 'blur'},
|
||
{pattern: /^\d{16,30}$/, message: '银行卡号格式不正确(16-30位数字)', trigger: 'blur'},
|
||
{min: 16, max: 30, message: '银行卡号长度为 16 到 30 位', trigger: 'blur'}
|
||
],
|
||
bankOpen: [
|
||
{required: true, message: '请输入开户行', trigger: 'blur'}
|
||
],
|
||
teacherNo: [
|
||
{required: true, message: '请输入工号', trigger: 'blur'},
|
||
],
|
||
national: [
|
||
{required: true, message: '请选择民族', trigger: 'change'},
|
||
],
|
||
religiousBelief:[
|
||
{required: true, message: '请选择宗教信仰', trigger: 'change'},
|
||
],
|
||
homeAddress: [
|
||
{required: true, message: '请输入家庭地址', trigger: 'blur'},
|
||
],
|
||
nativePlace: [
|
||
{required: true, message: '请输入籍贯', trigger: 'blur'},
|
||
]
|
||
}
|
||
|
||
// 响应式数据
|
||
const nowUserInfo = reactive({
|
||
userName: '',
|
||
teacherNo: '',
|
||
uploadUrl: ''
|
||
})
|
||
const dialogVisible = reactive({
|
||
statusDialogFormVisible: false
|
||
})
|
||
const params = ref<any>({})
|
||
const statusForm = reactive({
|
||
title: false,
|
||
job: true,
|
||
teacherTitle: true,
|
||
acade: true,
|
||
remix: true,
|
||
work: true
|
||
})
|
||
const isAdd = ref(true)
|
||
const dialogForListVisible = ref(false)
|
||
const dialogForListImageUrl = ref('')
|
||
const auditAll = ref(false)
|
||
const preImgDialog = ref(false)
|
||
const preImgUrl = ref([])
|
||
const imageUrl = ref('')
|
||
const certificateImgUrl = ref<Array<{ title: string; url: string }>>([]) // 证书预览URL列表
|
||
const certificateList = ref<any[]>([]) // 教师资格证列表
|
||
const secDeptList = ref([])
|
||
const newSecChildDeptCodeList = ref([])
|
||
|
||
// 搜索条件字典数据
|
||
const searchPoliticsStatusList = ref([])
|
||
const searchTeacherCateList = ref([])
|
||
const inoutFlagOptions = ref([])
|
||
const exportLoading = ref(false)
|
||
const isShow = ref(false)
|
||
const religiousBeliefDic = ref([])
|
||
|
||
// 模板引用
|
||
const baseForm = ref()
|
||
const evidenceDialogRef = ref()
|
||
const importTeacherInfoRef = ref()
|
||
const exportTeacherInfoDialogRef = ref()
|
||
const multiDialogRef = ref()
|
||
|
||
// 合并表单验证规则
|
||
const mergedRules = computed(() => {
|
||
// 将 baseInfo 的规则加上 baseInfo 前缀
|
||
const baseInfoRules: Record<string, any> = {}
|
||
Object.keys(rules).forEach(key => {
|
||
// 在编辑模式下,某些字段被禁用(如 realName, teacherNo),不需要验证
|
||
// 根据 isAdd 状态动态调整验证规则
|
||
if (isAdd.value) {
|
||
// 新增模式:使用原始规则
|
||
baseInfoRules[`baseInfo.${key}`] = rules[key]
|
||
} else {
|
||
// 编辑模式:对于被禁用的字段,移除必填验证
|
||
if (key === 'realName' || key === 'teacherNo') {
|
||
// 这些字段在编辑模式下被禁用,移除必填验证
|
||
const rule = rules[key]
|
||
if (Array.isArray(rule)) {
|
||
baseInfoRules[`baseInfo.${key}`] = rule.filter((r: any) => !r.required)
|
||
} else {
|
||
baseInfoRules[`baseInfo.${key}`] = rule
|
||
}
|
||
} else {
|
||
baseInfoRules[`baseInfo.${key}`] = rules[key]
|
||
}
|
||
}
|
||
})
|
||
|
||
// 岗位信息规则:始终包含所有岗位信息规则,以便在保存时能够验证
|
||
const stationRules: Record<string, any> = {}
|
||
Object.keys(stationFormValidate).forEach(key => {
|
||
stationRules[`professionalStationRelation.${key}`] = stationFormValidate[key]
|
||
})
|
||
|
||
return {
|
||
// baseInfo 的规则(加上 baseInfo 前缀)
|
||
...baseInfoRules,
|
||
// professionalStationRelation 的规则(始终包含)
|
||
...stationRules
|
||
}
|
||
})
|
||
|
||
// 生命周期
|
||
onMounted(async () => {
|
||
// 先初始化基础数据
|
||
await init()
|
||
// 加载搜索条件字典数据
|
||
await loadSearchDictData()
|
||
// 初始化完成后加载表格数据
|
||
getDataList()
|
||
})
|
||
|
||
// 加载搜索条件字典数据
|
||
const loadSearchDictData = async () => {
|
||
try {
|
||
// 加载政治面貌列表
|
||
const politicsRes: any = await getPoliticsStatusList()
|
||
if (politicsRes && politicsRes.data) {
|
||
searchPoliticsStatusList.value = politicsRes.data
|
||
}
|
||
} catch (error) {
|
||
console.error('加载搜索字典数据失败:', error)
|
||
}
|
||
}
|
||
|
||
// 暴露方法给模板使用(如果需要)
|
||
// watch 监听器
|
||
watch(activeName, (val, oldVal) => {
|
||
//监听切换状态-计划单
|
||
// 从其他标签页切换到非"first"标签页时检查基础信息
|
||
// 避免在初始化时触发检查(oldVal 为空字符串表示初始化)
|
||
// 同时需要确保对话框已打开(dialogFromVisible 为 true)
|
||
if (val != "first" && oldVal && oldVal !== '' && dialogFromVisible.value) {
|
||
setTimeout(() => {
|
||
if (!form.baseInfo.id || form.baseInfo.id == '') {
|
||
message.info("请先完善基础信息")
|
||
activeName.value = "first"
|
||
}
|
||
}, 500)
|
||
}
|
||
})
|
||
|
||
watch(() => form.professionalStationRelation.employmentNature, (newVal) => {
|
||
if (newVal == '7b89e20d84ded4afe5bd97d9b42c5705'){
|
||
isShow.value = true
|
||
}else {
|
||
isShow.value = false
|
||
}
|
||
})
|
||
// 方法定义
|
||
const openShowEvidence = (row: any) => {
|
||
edviceForm.value = row
|
||
nextTick(() => {
|
||
evidenceDialogRef.value?.init()
|
||
})
|
||
}
|
||
|
||
const exportTeacherInfo = () => {
|
||
const obj = {}
|
||
exportTeacherInfoApi(obj).then((res: any) => {
|
||
import('/@/excel/Export2Excel.js').then(({ export_json_to_excel }) => {
|
||
const tHeader = ['工号', '岗位级别', '姓名', '性别', '学历', '学位', '政治面貌', '出生年月', '参加工作时间',
|
||
'专业技术职务', '职称任职时间', '进校时间', '进校年份', '校龄', '职业工种', '等级', '高校职业资格证', '中等教师资格证', '教师上岗证', '家庭住址', '宅电', '手机', '身份证号码'];
|
||
const filterVal = ['teacherNo', 'levelName', 'realName', 'sex', 'dgreeName', 'dgreeNameA', 'politicsStatus', 'birthday', 'workDate',
|
||
'titleName', 'inOfficeDate', 'entrySchoolDate', 'entryYear', 'schoolYears', 'quaLevelWorkName', 'quaLevelName', 'highCer', 'midCer', 'teacherCer', 'homeAddress', 'homePhone', 'telPhone', 'idCard']
|
||
const list = res.data.data
|
||
const data = formatJson(filterVal, list);
|
||
export_json_to_excel(tHeader, data, '人员信息');
|
||
})
|
||
})
|
||
}
|
||
const formatJson = (filterVal: string[], jsonData: any[]) => {
|
||
return jsonData.map(v => filterVal.map(j => v[j]))
|
||
}
|
||
|
||
// 获取二级部门树
|
||
const fetchSecondTree = () => {
|
||
getDeptListByLevelTwo().then(res => {
|
||
secDeptList.value = res.data
|
||
})
|
||
}
|
||
|
||
const chooseSecDept = () => {
|
||
search.secDeptCode = ''
|
||
newSecChildDeptCodeList.value = []
|
||
getDeptListByParent(search.deptCode).then(res => {
|
||
let obj: any = {}
|
||
obj.deptName = "--全部子部门--"
|
||
obj.deptCode = "-2"
|
||
newSecChildDeptCodeList.value.push(obj)
|
||
|
||
let objA: any = {}
|
||
objA.deptName = "--只查父级部门--"
|
||
objA.deptCode = "-1"
|
||
newSecChildDeptCodeList.value.push(objA)
|
||
for (let i in res.data) {
|
||
newSecChildDeptCodeList.value.push(res.data[i])
|
||
}
|
||
})
|
||
}
|
||
const handleAvatarSuccess = (res: any, file: any) => {
|
||
imageUrl.value = URL.createObjectURL(file.raw);
|
||
}
|
||
|
||
// 通用预览函数(用于证书、证明材料等)
|
||
const handlePreviewFiles = (list: Array<{ title?: string; url: string }>) => {
|
||
certificateImgUrl.value = []
|
||
nextTick(() => {
|
||
list.forEach(v => {
|
||
certificateImgUrl.value.push({
|
||
title: v.title || '',
|
||
url: v.url
|
||
})
|
||
})
|
||
})
|
||
}
|
||
|
||
|
||
const handleStatusLockSubmit = (formData: any) => {
|
||
const data = {"statusMap": formData};
|
||
updateStatus(data).then((response: any) => {
|
||
message.success("修改成功")
|
||
// 更新本地状态
|
||
Object.assign(statusForm, formData)
|
||
}).catch(() => {
|
||
// 错误处理
|
||
})
|
||
}
|
||
|
||
|
||
const handleWaitExam = (row: any, val: any) => {
|
||
nowRow.value = row
|
||
nextTick(() => {
|
||
multiDialogRef.value?.init(val)
|
||
})
|
||
}
|
||
|
||
// 获取操作菜单项配置
|
||
const getActionMenuItems = (row: any) => {
|
||
return [
|
||
{
|
||
command: 'export',
|
||
label: '导出信息',
|
||
icon: Download,
|
||
visible: () => permissions.value.professional_teacherbase_export
|
||
},
|
||
{
|
||
command: 'personnel-transfer',
|
||
label: '人员调动',
|
||
icon: Switch,
|
||
visible: () => permissions.value.professional_teacherbase_status_lock
|
||
},
|
||
{
|
||
command: 'party-transfer',
|
||
label: '党员调动',
|
||
icon: Switch,
|
||
visible: () => permissions.value.professional_teacherbase_status_lock
|
||
},
|
||
{
|
||
command: 'allow-inout',
|
||
label: '允许进出',
|
||
icon: CircleCheck,
|
||
visible: () => permissions.value.professional_teacherbase_inout && row.inoutFlag == '0'
|
||
},
|
||
{
|
||
command: 'forbid-inout',
|
||
label: '禁止进出',
|
||
icon: CircleClose,
|
||
visible: () => permissions.value.professional_teacherbase_inout && row.inoutFlag == '1'
|
||
},
|
||
{
|
||
command: 'reset-password',
|
||
label: '重置密码',
|
||
icon: Refresh,
|
||
visible: () => permissions.value.professional_teacherbase_resetpw
|
||
}
|
||
]
|
||
}
|
||
|
||
// 处理更多操作下拉菜单命令
|
||
const handleMoreCommand = (command: string, row: any, index: number) => {
|
||
switch (command) {
|
||
case 'export':
|
||
handleDownLoadWord(row.teacherNo)
|
||
break
|
||
case 'personnel-transfer':
|
||
handleWaitExam(row, 5)
|
||
break
|
||
case 'party-transfer':
|
||
handleWaitExam(row, 6)
|
||
break
|
||
case 'allow-inout':
|
||
updateInoutFlag(row, 1)
|
||
break
|
||
case 'forbid-inout':
|
||
updateInoutFlag(row, 0)
|
||
break
|
||
case 'reset-password':
|
||
resetPassword(row)
|
||
break
|
||
}
|
||
}
|
||
|
||
// 分页处理方法已由 useTable 提供,无需手动实现
|
||
// tableRef 已在上面定义(用于 useTableColumns)
|
||
|
||
const exportExcel = (form: any, url: string) => {
|
||
return axios({
|
||
method: 'post',
|
||
url: url,
|
||
data: form,
|
||
responseType: 'blob',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
}
|
||
})
|
||
}
|
||
|
||
|
||
/**
|
||
* 基本信息保存
|
||
*/
|
||
const saveSubmit = () => {
|
||
canSave.value = false
|
||
if (activeName.value == "first") {
|
||
// 构建基本信息需要验证的字段列表(始终包含所有基本信息字段)
|
||
const baseInfoFields = Object.keys(rules).map(key => `baseInfo.${key}`)
|
||
|
||
// 构建岗位信息需要验证的字段列表(始终包含所有岗位信息字段)
|
||
const stationFields = Object.keys(stationFormValidate).map(key => `professionalStationRelation.${key}`)
|
||
|
||
// 根据当前子标签页决定先验证哪个
|
||
const currentFields = subActiveName.value === 'subBaseInfo'
|
||
? baseInfoFields
|
||
: stationFields
|
||
|
||
const otherFields = subActiveName.value === 'subBaseInfo'
|
||
? stationFields
|
||
: baseInfoFields
|
||
|
||
// 先验证当前子标签页的字段
|
||
baseForm.value?.validateField(currentFields, (isCurrentValid: boolean, currentInvalidFields: any) => {
|
||
if (!isCurrentValid) {
|
||
// 当前子标签页验证失败,提示用户
|
||
console.log('当前子标签页验证失败的字段:', currentInvalidFields);
|
||
if (subActiveName.value === 'subBaseInfo') {
|
||
message.info("请完善基本信息");
|
||
} else {
|
||
message.info("请完善岗位信息");
|
||
}
|
||
setTimeout(() => {
|
||
canSave.value = true
|
||
}, 1000)
|
||
return
|
||
}
|
||
|
||
// 当前子标签页验证通过,继续验证另一个子标签页
|
||
baseForm.value?.validateField(otherFields, (isOtherValid: boolean, otherInvalidFields: any) => {
|
||
if (!isOtherValid) {
|
||
// 另一个子标签页验证失败,跳转到那个子标签页
|
||
console.log('另一个子标签页验证失败的字段:', otherInvalidFields);
|
||
if (subActiveName.value === 'subBaseInfo') {
|
||
subActiveName.value = 'subStation'
|
||
message.info("基本信息已完善,请完善岗位信息");
|
||
} else {
|
||
subActiveName.value = 'subBaseInfo'
|
||
message.info("岗位信息已完善,请完善基本信息");
|
||
}
|
||
setTimeout(() => {
|
||
canSave.value = true
|
||
}, 1000)
|
||
return
|
||
}
|
||
|
||
// 两个子标签页都验证通过,处理数据并执行保存
|
||
// 将 deptCodeList 数组的最后一项赋值给 form.baseInfo.deptCode
|
||
if (form.professionalStationRelation.deptCodeList &&
|
||
Array.isArray(form.professionalStationRelation.deptCodeList) &&
|
||
form.professionalStationRelation.deptCodeList.length > 0) {
|
||
form.baseInfo.deptCode = form.professionalStationRelation.deptCodeList[form.professionalStationRelation.deptCodeList.length - 1]
|
||
}
|
||
|
||
addInformation(form).then((response: any) => {
|
||
const data = response.data;
|
||
message.success('保存成功')
|
||
form.baseInfo.id = data.baseId;
|
||
form.professionalStationRelation.id = data.relationId;
|
||
getDataList()
|
||
}).catch((err: any) => {
|
||
// 处理业务错误
|
||
message.error(err.msg)
|
||
});
|
||
setTimeout(() => {
|
||
canSave.value = true
|
||
}, 1000)
|
||
})
|
||
})
|
||
}
|
||
}
|
||
// getNodeData 方法已移除,如需要请重新实现
|
||
// 政治面貌相关
|
||
const politicsDialogVisible = ref(false)
|
||
const politicsForm = ref<any>({})
|
||
const politicsEditIndex = ref(-1)
|
||
|
||
// 通用函数:根据ID从列表中获取名称
|
||
const getNameById = (
|
||
list: any[] | Ref<any[]>,
|
||
id: string | number | undefined,
|
||
nameField: string
|
||
): string => {
|
||
if (!id) return '-'
|
||
const listData = unref(list)
|
||
if (!Array.isArray(listData)) return '-'
|
||
const item = listData.find((item: any) => item.id === id || item.id === String(id))
|
||
return item?.[nameField] || '-'
|
||
}
|
||
|
||
// 政治面貌新增
|
||
const handleAddPolitics = () => {
|
||
politicsForm.value = {}
|
||
politicsEditIndex.value = -1
|
||
politicsDialogVisible.value = true
|
||
}
|
||
|
||
// 政治面貌编辑
|
||
const handleEditPolitics = (row: any, index: number) => {
|
||
politicsForm.value = { ...row }
|
||
politicsEditIndex.value = index
|
||
politicsDialogVisible.value = true
|
||
}
|
||
|
||
// 政治面貌删除
|
||
const handleDeletePolitics = (row: any, index: number) => {
|
||
messageBox.confirm('确认删除该条记录?').then(() => {
|
||
dePoObj(row.id).then(() => {
|
||
dataPolitics.value.splice(index, 1)
|
||
message.success("删除成功");
|
||
}).catch((err: any) => {
|
||
// 处理业务错误
|
||
message.error(err.msg)
|
||
})
|
||
}).catch(() => {})
|
||
}
|
||
|
||
// 政治面貌保存
|
||
const handlePoliticsSubmit = (data: any) => {
|
||
if (!form.baseInfo.id || form.baseInfo.id == '') {
|
||
message.info("请完善基础信息");
|
||
activeName.value = 'first';
|
||
politicsDialogVisible.value = false
|
||
return
|
||
}
|
||
const submitData = { ...data };
|
||
submitData.teacherNo = form.baseInfo.teacherNo;
|
||
addPoliticssStatus(submitData).then((response: any) => {
|
||
message.success("保存成功");
|
||
politicsDialogVisible.value = false
|
||
// 刷新数据
|
||
getObj(form.baseInfo.id).then((res: any) => {
|
||
const baseInfo = res.data;
|
||
if (!baseInfo) return;
|
||
dataPolitics.value = baseInfo.poList;
|
||
})
|
||
}).catch((err: any) => {
|
||
// 处理业务错误
|
||
if (err && err.msg) {
|
||
message.error(err.msg)
|
||
}
|
||
});
|
||
}
|
||
|
||
|
||
// 社会关系相关
|
||
const relationDialogVisible = ref(false)
|
||
const relationForm = ref<any>({})
|
||
const relationEditIndex = ref(-1)
|
||
|
||
const handleAddRelation = () => {
|
||
relationForm.value = {}
|
||
relationEditIndex.value = -1
|
||
relationDialogVisible.value = true
|
||
}
|
||
|
||
const handleEditRelation = (row: any, index: number) => {
|
||
relationForm.value = { ...row }
|
||
relationEditIndex.value = index
|
||
relationDialogVisible.value = true
|
||
}
|
||
|
||
const handleDeleteRelation = (row: any, index: number) => {
|
||
messageBox.confirm('确认删除该条记录?').then(() => {
|
||
delSocialObjApi(row.id).then(() => {
|
||
relationData.value.splice(index, 1)
|
||
message.success("删除成功");
|
||
}).catch((err: any) => {
|
||
// 处理业务错误
|
||
message.error(err.msg)
|
||
})
|
||
}).catch(() => {})
|
||
}
|
||
|
||
const handleRelationSubmit = (data: any) => {
|
||
if (!form.baseInfo.id || form.baseInfo.id == '') {
|
||
message.info("请完善基础信息");
|
||
activeName.value = 'first';
|
||
relationDialogVisible.value = false
|
||
return
|
||
}
|
||
const submitData = { ...data };
|
||
submitData.teacherNo = form.baseInfo.teacherNo;
|
||
addSocialObj(submitData).then((response: any) => {
|
||
message.success("保存成功");
|
||
relationDialogVisible.value = false
|
||
// 刷新数据
|
||
getObj(form.baseInfo.id).then((res: any) => {
|
||
const baseInfo = res.data;
|
||
if (!baseInfo) return;
|
||
relationData.value = baseInfo.socialList;
|
||
})
|
||
}).catch((err: any) => {
|
||
// 处理业务错误
|
||
message.error(err.msg)
|
||
})
|
||
}
|
||
|
||
|
||
const init = async () => {
|
||
// 获取一级部门
|
||
fetchSecondTree()
|
||
await Promise.all([
|
||
// 批量获取字典数据 religious_belief宗教信仰 health健康状况 teacher_cate授课类型 teacher_classify职位类别 yes_no_type是否类型
|
||
getDictsByTypes(['religious_belief', 'heath', 'teacher_cate', 'teacher_classify', 'yes_no_type']).then((response: any) => {
|
||
religiousBeliefDic.value = response.data.religious_belief;
|
||
healthList.value = response.data.heath;
|
||
teacherCateList.value = response.data.teacher_cate;
|
||
teacherClassifyData.value = response.data.teacher_classify || [];
|
||
inoutFlagOptions.value = response.data.yes_no_type || [];
|
||
}),
|
||
// 民族
|
||
getNationalList().then((response: any) => {
|
||
nationalList.value = response.data;
|
||
}),
|
||
// 岗位类型部门树
|
||
treeForCascader().then((response: any) => {
|
||
deptTreeList.value = response.data;
|
||
}),
|
||
// 锁定状态列表
|
||
// getAllList().then((response: any) => {
|
||
// Object.assign(statusForm, response.data)
|
||
// }),
|
||
getAllInfoAboutList().then((response: any) => {
|
||
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.academicQualificationList = map['academicQuaList'] || []
|
||
// 学位列表
|
||
baseInfoAbout.degreeList = map['academicDegreeList'] || []
|
||
baseInfoAbout.partBranchList = map['partBranchList']
|
||
Object.assign(statusForm, map['allStatusList'])
|
||
}),
|
||
// 加载教师资格证列表
|
||
getTeacherCertificateList().then((response: any) => {
|
||
if (response && response.data) {
|
||
certificateList.value = response.data
|
||
}
|
||
})
|
||
])
|
||
}
|
||
|
||
// 字典数据转换函数
|
||
const convertDictData = (records: any[]) => {
|
||
if (!records || records.length === 0) {
|
||
return records
|
||
}
|
||
|
||
return records.map((record: any) => {
|
||
const newRecord = { ...record }
|
||
|
||
// 转换职称等级 (pfTitleId -> professionalTitle)
|
||
if (newRecord.pfTitleId && baseInfoAbout.proTitleList && baseInfoAbout.proTitleList.length > 0) {
|
||
const titleItem = baseInfoAbout.proTitleList.find((item: any) => item.id === newRecord.pfTitleId || item.id === String(newRecord.pfTitleId))
|
||
if (titleItem && titleItem.professionalTitle) {
|
||
newRecord.professionalTitle = titleItem.professionalTitle
|
||
}
|
||
}
|
||
|
||
// 转换职业资格等级 (workId -> levelName, workName)
|
||
if (newRecord.workId && baseInfoAbout.qualificationList && baseInfoAbout.qualificationList.length > 0) {
|
||
const qualItem = baseInfoAbout.qualificationList.find((item: any) => item.id === newRecord.workId || item.id === String(newRecord.workId))
|
||
if (qualItem) {
|
||
if (qualItem.levelName) {
|
||
newRecord.levelName = qualItem.levelName
|
||
}
|
||
if (qualItem.workName) {
|
||
newRecord.workName = qualItem.workName
|
||
}
|
||
}
|
||
}
|
||
|
||
// 转换用工性质 (employmentNature -> employmentNatureName)
|
||
if (newRecord.employmentNature && baseInfoAbout.employmentNatureList && baseInfoAbout.employmentNatureList.length > 0) {
|
||
const empItem = baseInfoAbout.employmentNatureList.find((item: any) => item.id === newRecord.employmentNature || item.id === String(newRecord.employmentNature))
|
||
if (empItem && empItem.employmentNatureName) {
|
||
newRecord.employmentNatureName = empItem.employmentNatureName
|
||
}
|
||
}
|
||
|
||
return newRecord
|
||
})
|
||
}
|
||
|
||
// getList 方法已由 useTable 的 getDataList 替代,无需手动实现
|
||
/**
|
||
* @title 打开新增窗口
|
||
* @detail 调用crud的handleadd方法即可
|
||
**/
|
||
const handleAdd = () => {
|
||
nowImage.value = ''
|
||
isAdd.value = true
|
||
activeName.value = "first";
|
||
form.professionalStationRelation = {};
|
||
form.baseInfo = {};
|
||
dataPolitics.value = [];
|
||
dataEducation.value = [];
|
||
relationData.value = [];
|
||
proData.value = [];
|
||
workData.value = [];
|
||
dialogFromVisible.value = true;
|
||
// 清除表单验证提示
|
||
nextTick(() => {
|
||
baseForm.value?.clearValidate()
|
||
})
|
||
}
|
||
|
||
const handleEdit = (row: any, index: any) => {
|
||
isAdd.value = false
|
||
nowUserInfo.uploadUrl = '/professional/file/upload?teacherNo=' + row.teacherNo;
|
||
nowUserInfo.userName = row.realName;
|
||
nowUserInfo.teacherNo = row.teacherNo;
|
||
activeName.value = "first";
|
||
dialogForListImageUrl.value = ''
|
||
imageUrl.value = ''
|
||
//查询基础信息
|
||
getObj(row.id).then((response: any) => {
|
||
const baseInfo = response.data;
|
||
if (!baseInfo || !baseInfo.teacherBase) {
|
||
console.error('[teacherbase] 获取教师详情失败,返回数据异常:', response);
|
||
message.error('获取教师详情失败,请稍后重试');
|
||
return;
|
||
}
|
||
form.baseInfo.teacherPhoto = "";
|
||
nowImage.value = baseInfo.teacherBase.teacherPhoto;
|
||
imgList.value = [];
|
||
form.baseInfo = baseInfo.teacherBase;
|
||
dialogForListImageUrl.value = "/professional/minio/show?fileName=base-teach_photo/" + baseInfo.teacherBase.teacherNo + "/" + baseInfo.teacherBase.teacherNo + ".jpg"
|
||
imageUrl.value = dialogForListImageUrl.value
|
||
dataPolitics.value = baseInfo.poList;
|
||
//资格证
|
||
zgzData.value = baseInfo.certList;
|
||
zgzData.value.forEach((v: any) => {
|
||
v.srcList = []
|
||
if (v.evidenceA != null) {
|
||
const obj: any = {}
|
||
obj.url = v.evidenceA
|
||
obj.title = ""
|
||
v.srcList.push(obj)
|
||
}
|
||
if (v.evidenceB != null) {
|
||
const obj: any = {}
|
||
obj.url = v.evidenceB
|
||
obj.title = ""
|
||
v.srcList.push(obj)
|
||
}
|
||
})
|
||
//学历
|
||
dataEducation.value = baseInfo.acadeList
|
||
dataEducation.value.forEach((v: any) => {
|
||
v.qiList = []
|
||
v.deList = []
|
||
if (v.qualificationImg != null) {
|
||
const obj: any = {}
|
||
obj.url = v.qualificationImg
|
||
obj.title = ""
|
||
v.qiList.push(obj)
|
||
}
|
||
if (v.degreeImg != null) {
|
||
const obj: any = {}
|
||
obj.url = v.degreeImg
|
||
obj.title = ""
|
||
v.deList.push(obj)
|
||
}
|
||
})
|
||
|
||
//社会关系
|
||
relationData.value = baseInfo.socialList;
|
||
//职称
|
||
proData.value = baseInfo.titleList
|
||
proData.value.forEach((v: any) => {
|
||
v.srcList = []
|
||
if (v.evidence != null) {
|
||
const obj: any = {}
|
||
obj.url = v.evidence
|
||
obj.title = ""
|
||
v.srcList.push(obj)
|
||
}
|
||
})
|
||
//职业
|
||
workData.value = baseInfo.quaList
|
||
workData.value.forEach((v: any) => {
|
||
v.srcList = []
|
||
if (v.evidenceA != null) {
|
||
const obj: any = {}
|
||
obj.url = v.evidenceA
|
||
obj.title = ""
|
||
v.srcList.push(obj)
|
||
}
|
||
if (v.evidenceB != null) {
|
||
const obj: any = {}
|
||
obj.url = v.evidenceB
|
||
obj.title = ""
|
||
v.srcList.push(obj)
|
||
}
|
||
if (v.evidenceC != null) {
|
||
const obj: any = {}
|
||
obj.url = v.evidenceC
|
||
obj.title = ""
|
||
v.srcList.push(obj)
|
||
}
|
||
})
|
||
|
||
//综合表彰
|
||
honorVOList.value = baseInfo.honorVOList
|
||
//教师论文
|
||
paperVOList.value = baseInfo.paperVOList
|
||
//教材管理
|
||
materialVOList.value = baseInfo.materialVOList
|
||
//课题列表
|
||
topicListVOList.value = baseInfo.topicListVOList
|
||
|
||
stationChange.value = baseInfo.stationChangeList
|
||
partyChange.value = baseInfo.partyChangeList
|
||
|
||
if (baseInfo.professionalStationRelation != null) {
|
||
form.professionalStationRelation = baseInfo.professionalStationRelation;
|
||
} else {
|
||
form.professionalStationRelation = {};
|
||
}
|
||
if (row.deptCode != null && row.deptCode != '') {
|
||
getDeptByCode(row.deptCode).then((response: any) => {
|
||
const dept = response.data
|
||
if (dept) {
|
||
form.professionalStationRelation.deptCodeList = [];
|
||
form.professionalStationRelation.deptCodeList[0] = dept.parentCode
|
||
form.professionalStationRelation.deptCodeList[1] = dept.deptCode
|
||
}
|
||
dialogFromVisible.value = true
|
||
// 清除表单验证提示
|
||
nextTick(() => {
|
||
baseForm.value?.clearValidate()
|
||
})
|
||
})
|
||
} else {
|
||
dialogFromVisible.value = true
|
||
// 清除表单验证提示
|
||
nextTick(() => {
|
||
baseForm.value?.clearValidate()
|
||
})
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* @title 数据更新
|
||
* @param row 为当前的数据
|
||
* @param index 为当前更新数据的行数
|
||
* @param done 为表单关闭函数
|
||
**/
|
||
const handleUpdate = (row: any, index: any, done: any) => {
|
||
putObj(row).then((data: any) => {
|
||
message.success('修改成功')
|
||
done()
|
||
getDataList()
|
||
}).catch((err: any) => {
|
||
// 处理业务错误
|
||
message.error(err.msg)
|
||
})
|
||
}
|
||
|
||
/**
|
||
* @title 数据添加
|
||
* @param row 为当前的数据
|
||
* @param done 为表单关闭函数
|
||
**/
|
||
const handleSave = (row: any, done: any) => {
|
||
addObj(row).then((data: any) => {
|
||
message.success('添加成功')
|
||
done()
|
||
getDataList()
|
||
}).catch((err: any) => {
|
||
// 处理业务错误
|
||
message.error(err.msg)
|
||
})
|
||
}
|
||
//重置密码
|
||
const resetPassword = (row: any) => {
|
||
messageBox.confirm('是否确定重置密码?').then(() => {
|
||
resetPassWord(row).then((data: any) => {
|
||
const pw = data.data.data
|
||
if (!validateNull(pw)) {
|
||
messageBox.info('重置后密码为:' + pw)
|
||
} else {
|
||
messageBox.info('系统繁忙,请重试')
|
||
}
|
||
})
|
||
}).catch(() => {
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 刷新回调
|
||
*/
|
||
const refreshChange = () => {
|
||
getDataList()
|
||
}
|
||
|
||
// 重置查询条件
|
||
const resetQuery = () => {
|
||
searchFormRef.value?.formRef?.resetFields()
|
||
search.deptCode = ''
|
||
search.secDeptCode = ''
|
||
search.tied = ''
|
||
search.realName = ''
|
||
search.teacherNo = ''
|
||
search.retireDate = ''
|
||
search.pfTitleId = ''
|
||
search.stationDutyLevelId = ''
|
||
search.politicsStatus = ''
|
||
search.teacherCate = ''
|
||
search.inoutFlag = ''
|
||
handleFilter(search)
|
||
}
|
||
|
||
const handleFilter = (param: any) => {
|
||
params.value = { ...param };
|
||
params.value.deptCode = search.deptCode
|
||
params.value.secDeptCode = search.secDeptCode
|
||
params.value.tied = search.tied
|
||
params.value.realName = search.realName
|
||
params.value.teacherNo = search.teacherNo
|
||
params.value.retireDate = search.retireDate
|
||
params.value.pfTitleId = search.pfTitleId
|
||
params.value.stationDutyLevelId = search.stationDutyLevelId
|
||
params.value.politicsStatus = search.politicsStatus
|
||
params.value.teacherCate = search.teacherCate
|
||
params.value.inoutFlag = search.inoutFlag
|
||
// 重置到第一页并刷新数据
|
||
if (state.pagination) {
|
||
state.pagination.current = 1
|
||
}
|
||
getDataList();
|
||
}
|
||
|
||
//照片上传
|
||
const handleRemove = (file: any, fileList: any) => {
|
||
form.baseInfo.teacherPhoto = "";
|
||
}
|
||
|
||
const handlePictureCardPreview = (file: any) => {
|
||
dialogImageUrl.value = file.url;
|
||
dialogFromVisible.value = true;
|
||
}
|
||
|
||
const handleRemoveForList = (file: any, fileList: any) => {
|
||
console.log(file, fileList);
|
||
}
|
||
|
||
const handlePictureCardPreviewForList = (file: any) => {
|
||
dialogForListImageUrl.value = file.url;
|
||
dialogForListVisible.value = true;
|
||
}
|
||
|
||
const beforeAvatarUpload = (file: any) => {
|
||
const isJPG = file.type === 'image/jpeg';
|
||
const isLt2M = file.size / 1024 / 1024 < 2;
|
||
|
||
if (!isJPG) {
|
||
message.error('上传头像图片只能是 JPG 格式!');
|
||
}
|
||
if (!isLt2M) {
|
||
message.error('上传头像图片大小不能超过 1MB!');
|
||
}
|
||
return isJPG && isLt2M;
|
||
}
|
||
|
||
// 更新进出状态
|
||
const updateInoutFlag = (row: any, val: any) => {
|
||
const updateParams = {"teacherNo": row.teacherNo, "inoutFlag": val}
|
||
messageBox.confirm('确认操作?').then(() => {
|
||
updateInout(updateParams).then((res: any) => {
|
||
message.success("修改成功")
|
||
getDataList()
|
||
})
|
||
}).catch(() => {
|
||
});
|
||
}
|
||
const handleDownLoadWord = (teacherNo: string) => {
|
||
const formData: any = {}
|
||
let docName = "";
|
||
if(teacherNo){
|
||
formData.teacherNo=teacherNo
|
||
docName="人事信息.doc"
|
||
}else{
|
||
if(search.deptCode==''&&search.secDeptCode==''){
|
||
message.warning("请选择部门信息")
|
||
return
|
||
}
|
||
formData.deptCode=search.deptCode
|
||
formData.secDeptCode=search.secDeptCode
|
||
docName="人事信息.zip"
|
||
}
|
||
exportLoading.value=true
|
||
|
||
downLoadFile(formData, '/professional/file/exportTeacherBaseInfo').then((res: any) => {
|
||
const blob = new Blob([res.data]);
|
||
const elink = document.createElement('a');
|
||
elink.download =docName;
|
||
elink.style.display = 'none';
|
||
elink.href = URL.createObjectURL(blob);
|
||
document.body.appendChild(elink);
|
||
elink.click();
|
||
URL.revokeObjectURL(elink.href);
|
||
document.body.removeChild(elink);
|
||
exportLoading.value=false
|
||
})
|
||
}
|
||
|
||
const downLoadFile = (form: any, url: string) => {
|
||
return axios({
|
||
method: 'post',
|
||
url: url,
|
||
data: form,
|
||
responseType: 'blob',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
"Authorization": 'Bearer ' + Session.getToken()
|
||
}
|
||
})
|
||
}
|
||
|
||
const handleExportDialog = () => {
|
||
exportTeacherInfoDialogRef.value?.init()
|
||
}
|
||
|
||
const handleImportDialog = () => {
|
||
importTeacherInfoRef.value?.init()
|
||
}
|
||
|
||
// 身份证号输入限制:只允许数字和X/x,最大长度18
|
||
const handleIdCardInput = (value: string) => {
|
||
// 只保留数字和X/x
|
||
const filtered = value.replace(/[^\dXx]/g, '')
|
||
if (filtered !== value) {
|
||
form.baseInfo.idCard = filtered
|
||
}
|
||
}
|
||
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.avatar-uploader .el-upload {
|
||
border: 1px dashed #d9d9d9;
|
||
border-radius: 6px;
|
||
cursor: pointer;
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.avatar-uploader .el-upload:hover {
|
||
border-color: #409EFF;
|
||
}
|
||
|
||
.avatar-uploader-icon {
|
||
font-size: 28px;
|
||
color: #8c939d;
|
||
width: 178px;
|
||
height: 178px;
|
||
line-height: 178px;
|
||
text-align: center;
|
||
}
|
||
|
||
.avatar {
|
||
width: 178px;
|
||
height: 178px !important;
|
||
display: block;
|
||
}
|
||
|
||
// 基础信息表单样式优化
|
||
.base-info-form {
|
||
background: #ffffff;
|
||
|
||
// 基本信息布局(照片+表单)
|
||
.base-info-layout {
|
||
display: flex;
|
||
gap: 18px;
|
||
align-items: center;
|
||
margin-bottom: 16px;
|
||
|
||
// 照片区域
|
||
.photo-section {
|
||
flex-shrink: 0;
|
||
|
||
.photo-wrapper {
|
||
width: 120px;
|
||
height: 160px;
|
||
border-radius: 8px;
|
||
overflow: hidden;
|
||
border: 1px solid #e4e7ed;
|
||
background: #fafafa;
|
||
|
||
.avatar-photo {
|
||
width: 100%;
|
||
height: 100%;
|
||
object-fit: cover;
|
||
display: block;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 表单区域
|
||
.form-section {
|
||
flex: 1;
|
||
min-width: 0; // 防止 flex 子元素溢出
|
||
}
|
||
}
|
||
|
||
// 照片区域(独立显示,当没有表单时)
|
||
.photo-section {
|
||
display: flex;
|
||
justify-content: center;
|
||
|
||
.photo-wrapper {
|
||
width: 120px;
|
||
height: 160px;
|
||
border-radius: 8px;
|
||
overflow: hidden;
|
||
border: 1px solid #e4e7ed;
|
||
background: #fafafa;
|
||
|
||
.avatar-photo {
|
||
width: 100%;
|
||
height: 100%;
|
||
object-fit: cover;
|
||
display: block;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 子标签页样式优化 - 只优化外层容器,不修改组件内部样式
|
||
.sub-tabs {
|
||
margin-top: 0;
|
||
margin-bottom: 0;
|
||
|
||
|
||
|
||
:deep(.el-tab-pane) {
|
||
padding: 0;
|
||
}
|
||
}
|
||
|
||
// 表单分组样式优化 - 保持当前间距,添加背景
|
||
.form-section {
|
||
margin-bottom: 16px;
|
||
padding: 20px;
|
||
background: #fafbfc;
|
||
border-radius: 8px;
|
||
border: 1px solid #ebeef5;
|
||
|
||
&:last-child {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.section-title {
|
||
display: flex;
|
||
align-items: center;
|
||
margin-bottom: 16px;
|
||
padding-bottom: 10px;
|
||
border-bottom: 1px solid #e4e7ed;
|
||
font-size: 15px;
|
||
font-weight: 600;
|
||
|
||
|
||
.el-icon {
|
||
margin-right: 8px;
|
||
font-size: 16px;
|
||
color: var(--el-color-primary);
|
||
}
|
||
}
|
||
|
||
// 确保表单项之间有合适的间距(通过外层容器控制)
|
||
.el-row {
|
||
margin-bottom: 0;
|
||
|
||
+ .el-row {
|
||
margin-top: 18px;
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
// 表格模块样式优化
|
||
.table-section {
|
||
// padding: 24px;
|
||
background: #ffffff;
|
||
|
||
.table-header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
margin-bottom: 18px;
|
||
padding-bottom: 14px;
|
||
border-bottom: 1px solid #ebeef5;
|
||
|
||
.table-title {
|
||
display: flex;
|
||
align-items: center;
|
||
font-size: 15px;
|
||
font-weight: 600;
|
||
color: #303133;
|
||
|
||
.el-icon {
|
||
margin-right: 8px;
|
||
font-size: 16px;
|
||
color: var(--el-color-primary);
|
||
}
|
||
}
|
||
|
||
.el-button {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 6px;
|
||
}
|
||
}
|
||
|
||
.data-table {
|
||
// 操作按钮样式
|
||
:deep(.el-button--text) {
|
||
padding: 4px 8px;
|
||
display: inline-flex;
|
||
align-items: center;
|
||
gap: 4px;
|
||
|
||
.el-icon {
|
||
font-size: 14px;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 图片列表样式
|
||
.image-list {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 8px;
|
||
justify-content: center;
|
||
|
||
.cert-image {
|
||
width: 80px;
|
||
height: 50px;
|
||
border-radius: 4px;
|
||
border: 1px solid #e4e7ed;
|
||
object-fit: cover;
|
||
cursor: pointer;
|
||
transition: all 0.3s;
|
||
|
||
&:hover {
|
||
transform: scale(1.1);
|
||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 占位符文本
|
||
.text-placeholder {
|
||
color: #c0c4cc;
|
||
font-size: 14px;
|
||
}
|
||
|
||
}
|
||
|
||
// 弹窗内容区域样式优化 - 只优化外层容器,不修改组件内部样式
|
||
.employee-info-dialog {
|
||
// 只优化弹窗外层,不修改内部组件样式
|
||
}
|
||
|
||
// 响应式优化
|
||
@media (max-width: 1200px) {
|
||
.base-info-form {
|
||
padding: 20px;
|
||
|
||
.form-section {
|
||
padding: 16px;
|
||
margin-bottom: 24px;
|
||
|
||
.section-title {
|
||
font-size: 15px;
|
||
margin-bottom: 16px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
</style>
|
||
|