Files
school-developer/src/views/professional/teacherbase/multiDialog.vue
吴红兵 b997b3ba48 fix
2026-03-07 12:35:45 +08:00

360 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-dialog v-model="dialogVisible" width="600" :title="waitShenheForm.title" append-to-body>
<!--人员调动-->
<el-form
v-if="waitShenheForm.isPersonnelTransfer"
ref="stationChangeFormRef"
:model="waitShenheForm.form"
:rules="stationChangeRules"
label-width="120px"
>
<el-form-item label="工号 / 姓名">
<el-tag>{{ waitShenheForm.form.teacherNo }} - {{ waitShenheForm.form.realName }}</el-tag>
</el-form-item>
<el-form-item label="原部门名称">
<el-input v-model="waitShenheForm.form.deptName" disabled />
</el-form-item>
<el-form-item label="现二级部门" prop="newDeptCode">
<el-select v-model="newSecDeptCode" @change="getDeptListByParent" 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="现子级部门">
<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" />
</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>
<div style="text-align: right; width: 100%">
<el-button type="primary" @click="dialogSubmit(5)">提交</el-button>
<el-button @click="dialogVisible = false">取消</el-button>
</div>
</el-form-item>
</el-form>
<!--党员调动-->
<el-form v-if="waitShenheForm.isPartyTransfer" ref="partChangeFormRef" :model="waitShenheForm.form" :rules="partChangeRules" label-width="120px">
<el-form-item label="工号 / 用户名">
<el-tag>{{ waitShenheForm.form.teacherNo }} - {{ 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"
/>
</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>
<div style="text-align: right; width: 100%">
<el-button type="primary" @click="dialogSubmit(6)">提交</el-button>
<el-button @click="dialogVisible = false">取消</el-button>
</div>
</el-form-item>
</el-form>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, reactive, nextTick } from 'vue';
import { useMessage, useMessageBox } from '/@/hooks/message';
import { getAllInfoAboutList } from '/@/api/professional/professionaluser/teacherbase';
import { getDeptListByLevelTwo, getDeptListByParent as getDeptListByParentApi } from '/@/api/basic/basicdept';
import { addObj as addStationChangeObj } from '/@/api/professional/professionaluser/professionalteacherstationchange';
import { addObj as addPartyChangeObj } from '/@/api/professional/professionaluser/professionalpartychange';
import global from '/@/components/tools/commondict.vue';
import type { Pagination } from '/@/hooks/table';
// 表单类型常量
const FORM_TYPE = {
PERSONNEL_TRANSFER: 5, // 人员调动
PARTY_TRANSFER: 6, // 党员调动
} as const;
// 类型定义
interface FormData {
newDeptCodeList?: any[];
deptCodeList?: any[];
teacherNo?: string;
realName?: string;
userName?: string;
deptName?: string;
id?: string;
oldBranchId?: string;
oldBranchName?: string;
newDeptCode?: string;
newSecDeptCode?: string;
changeDate?: string;
pos?: string;
remarks?: string;
branchName?: string;
partyFee?: number;
changeTime?: string;
[key: string]: any;
}
interface WaitShenheForm {
form: FormData;
title: string;
isPersonnelTransfer: boolean;
isPartyTransfer: boolean;
}
// 表单 ref
const stationChangeFormRef = ref();
const partChangeFormRef = ref();
// 人员调动验证规则
const stationChangeRules = {
newDeptCode: [{ required: true, message: '请选择要调入的二级部门', trigger: 'blur' }],
changeDate: [{ required: true, message: '请选择调令日期', trigger: 'blur' }],
pos: [{ required: true, message: '请选择岗位类型', trigger: 'blur' }],
};
// 党员调动验证规则
const partChangeRules = {
branchName: [{ required: true, message: '请选择现支部', trigger: 'blur' }],
changeTime: [{ required: true, message: '请选择变动时间', trigger: 'blur' }],
};
/**
* 定义Props
* @param page 分页信息
* @param nowRow 当前行数据
*/
const props = defineProps<{
page?: Pagination;
nowRow: Record<string, any>;
}>();
/**
* 定义Emits
*/
const emit = defineEmits<{
(e: 'getList', page?: Pagination): void;
}>();
// 消息提示 hooks
const message = useMessage();
const messageBox = useMessageBox();
// 响应式数据
const dialogVisible = ref(false);
/**
* 等待审核表单
*/
const waitShenheForm = reactive<WaitShenheForm>({
form: {
newDeptCodeList: [],
deptCodeList: [],
},
title: '',
isPersonnelTransfer: false,
isPartyTransfer: false,
});
const baseInfoAbout = reactive({
partBranchList: [] as any[],
});
const secDeptList = ref<any[]>([]);
const newSecChildDeptCodeList = ref<any[]>([]);
const newSecDeptCode = ref('');
const newSecChildDeptCode = ref('');
const teacherNo = ref('');
// 方法定义
/**
* 初始化字典数据
*/
const initDicData = async () => {
const response = await getAllInfoAboutList();
const map = response.data;
baseInfoAbout.partBranchList = map['partBranchList'] || [];
};
/**
* 初始化对话框
* @param val 表单类型5-人员调动6-党员调动
*/
const init = async (val: number) => {
if (val !== FORM_TYPE.PERSONNEL_TRANSFER && val !== FORM_TYPE.PARTY_TRANSFER) {
return;
}
await initDicData();
teacherNo.value = props.nowRow.teacherNo;
handleFormType(val);
};
/**
* 处理表单类型显示
* @param val 表单类型
*/
const handleFormType = (val: number) => {
// 重置所有表单状态
waitShenheForm.isPersonnelTransfer = false;
waitShenheForm.isPartyTransfer = false;
if (val === FORM_TYPE.PERSONNEL_TRANSFER) {
// 人员调动:加载部门数据
waitShenheForm.title = '人员调动';
waitShenheForm.isPersonnelTransfer = true;
waitShenheForm.form = { ...props.nowRow };
waitShenheForm.form.id = '';
waitShenheForm.form.newDeptCodeList = [];
waitShenheForm.form.deptCodeList = [];
newSecDeptCode.value = '';
newSecChildDeptCode.value = '';
getDeptListByLevelTwo().then((res: any) => {
secDeptList.value = res.data || [];
dialogVisible.value = true;
// 弹窗打开后,清除表单验证状态,避免立即显示验证提示
nextTick(() => {
stationChangeFormRef.value?.clearValidate();
});
});
} else if (val === FORM_TYPE.PARTY_TRANSFER) {
// 党员调动:设置原支部
waitShenheForm.title = '党员调动';
waitShenheForm.isPartyTransfer = true;
waitShenheForm.form = { ...props.nowRow };
waitShenheForm.form.id = '';
waitShenheForm.form.realName = waitShenheForm.form.userName || waitShenheForm.form.realName;
waitShenheForm.form.oldBranchName = waitShenheForm.form.oldBranchId;
dialogVisible.value = true;
// 弹窗打开后,清除表单验证状态,避免立即显示验证提示
nextTick(() => {
partChangeFormRef.value?.clearValidate();
});
}
};
/**
* 提交表单
* @param val 表单类型5-人员调动6-党员调动
*/
const dialogSubmit = async (val: number) => {
if (val !== FORM_TYPE.PERSONNEL_TRANSFER && val !== FORM_TYPE.PARTY_TRANSFER) {
return;
}
waitShenheForm.form.teacherNo = teacherNo.value;
// 表单验证配置
const formRefMap: Record<number, any> = {
[FORM_TYPE.PERSONNEL_TRANSFER]: stationChangeFormRef.value,
[FORM_TYPE.PARTY_TRANSFER]: partChangeFormRef.value,
};
const formRef = formRefMap[val];
// 人员调动:在验证前同步数据
if (val === FORM_TYPE.PERSONNEL_TRANSFER) {
waitShenheForm.form.newDeptCode = newSecDeptCode.value;
waitShenheForm.form.newSecDeptCode = newSecChildDeptCode.value || newSecDeptCode.value;
}
// 验证表单
if (formRef) {
try {
await formRef.validate();
} catch (err) {
return;
}
}
// 先确认,用户取消时不执行后续操作
try {
await messageBox.confirm('确认提交?');
} catch (err: any) {
// 用户取消操作,直接返回,不显示错误提示
return;
}
// 用户确认后,执行提交操作
try {
let res: any;
if (val === FORM_TYPE.PERSONNEL_TRANSFER) {
// 人员调动:使用人员调动接口
res = await addStationChangeObj(waitShenheForm.form);
} else if (val === FORM_TYPE.PARTY_TRANSFER) {
// 党员调动:使用党员调动接口
res = await addPartyChangeObj(waitShenheForm.form);
}
if (res && res.data === '-1') {
message.warning('当前不允许提交');
} else if (res) {
message.success('提交成功');
emit('getList', props.page);
dialogVisible.value = false;
}
} catch (err: any) {
// 处理业务错误
message.error(err.msg);
}
};
/**
* 获取子部门列表
*/
const getDeptListByParent = async () => {
newSecChildDeptCode.value = '';
newSecChildDeptCodeList.value = [];
if (!newSecDeptCode.value) {
return;
}
const res = await getDeptListByParentApi(newSecDeptCode.value);
newSecChildDeptCodeList.value = res.data || [];
};
// 暴露方法
defineExpose({
init,
});
</script>