refactor(purchase): 替换OrgSelector为el-select远程搜索组件

- 业务分管处室及人员、业务分管校领导、采购分管领导、校党委人员表单
- 改用el-select + 远程搜索方式,不依赖upms模块权限
- 复用purchase模块的searchTeachers和getSecondDeptList接口
- 人员显示格式:部门名称 - 姓名 (工号)
This commit is contained in:
吴红兵
2026-03-04 12:45:17 +08:00
parent 849d5df857
commit b5f856ecaf
4 changed files with 317 additions and 219 deletions

View File

@@ -11,23 +11,40 @@
:rules="dataRules"
label-width="100px"
v-loading="loading">
<el-form-item label="用户" prop="userId">
<org-selector
v-model:orgList="userList"
type="user"
:multiple="false"
@update:orgList="handleUserChange" />
<el-form-item label="选择人员" prop="userId">
<el-select
v-model="dataForm.userId"
placeholder="请输入姓名或工号搜索"
filterable
remote
clearable
reserve-keyword
:remote-method="searchUser"
:loading="userLoading"
style="width: 100%"
@change="handleUserChange"
>
<el-option
v-for="item in userOptions"
:key="item.teacherNo"
:label="(item.commonDeptName ? item.commonDeptName + ' - ' : '') + (item.realName || item.name) + ' (' + item.teacherNo + ')'"
:value="item.teacherNo"
>
<span>{{ item.commonDeptName ? item.commonDeptName + ' - ' : '' }}{{ item.realName || item.name }}</span>
<span style="color: #999; font-size: 12px; margin-left: 8px;">{{ item.teacherNo }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input
v-model="dataForm.name"
placeholder="选择用户后自动填充"
placeholder="选择人员后自动填充"
readonly />
</el-form-item>
<el-form-item label="用户工号" prop="username">
<el-input
v-model="dataForm.username"
placeholder="选择用户后自动填充"
placeholder="选择人员后自动填充"
readonly />
</el-form-item>
<el-form-item label="备注" prop="remark">
@@ -51,15 +68,14 @@
<script setup lang="ts" name="PurchasingSchoolLeaderForm">
import { reactive, ref, nextTick } from 'vue'
import { getObj, addObj, editObj } from '/@/api/purchase/purchasingschoolleader';
import { searchTeachers } from '/@/api/purchase/purchasingrequisition';
import { useMessage } from '/@/hooks/message';
import orgSelector from '/@/components/OrgSelector/index.vue';
// 定义子组件向父组件传值/事件
const emit = defineEmits(['refresh']);
// 定义变量内容
const formRef = ref();
const userList = ref<any[]>([]);
const userOptions = ref<any[]>([]);
const userLoading = ref(false);
const dataForm = reactive({
id: '',
userId: '',
@@ -72,7 +88,7 @@ const loading = ref(false);
const dataRules = ref({
userId: [
{ required: true, message: '请选择用户', trigger: 'change' }
{ required: true, message: '请选择人员', trigger: 'change' }
],
name: [
{ required: true, message: '姓名不能为空', trigger: 'blur' }
@@ -82,21 +98,37 @@ const dataRules = ref({
],
});
// 处理用户选择变化
const handleUserChange = (list: any[]) => {
if (list && list.length > 0) {
const user = list[0];
dataForm.userId = user.userId || user.id || '';
dataForm.username = user.username || user.userName || '';
dataForm.name = user.name || user.realName || '';
} else {
dataForm.userId = '';
dataForm.username = '';
dataForm.name = '';
const searchUser = async (query: string) => {
if (!query) {
userOptions.value = [];
return;
}
userLoading.value = true;
try {
const res = await searchTeachers(query);
userOptions.value = res?.data || [];
} catch (_) {
userOptions.value = [];
} finally {
userLoading.value = false;
}
};
const handleUserChange = (teacherNo: string) => {
if (!teacherNo) {
dataForm.userId = '';
dataForm.username = '';
dataForm.name = '';
return;
}
const selected = userOptions.value.find((item: any) => item.teacherNo === teacherNo);
if (selected) {
dataForm.userId = selected.teacherNo;
dataForm.username = selected.teacherNo;
dataForm.name = selected.realName || selected.name;
}
};
// 打开弹窗
const openDialog = async (type: string, rowData?: any) => {
visible.value = true;
dataForm.id = '';
@@ -104,12 +136,11 @@ const openDialog = async (type: string, rowData?: any) => {
dataForm.username = '';
dataForm.name = '';
dataForm.remark = '';
userList.value = [];
userOptions.value = [];
nextTick(() => {
formRef.value?.resetFields();
if (type === 'edit' && rowData?.id) {
// 编辑时,先获取详情数据
loading.value = true;
getObj(rowData.id).then((res: any) => {
if (res.data) {
@@ -120,16 +151,8 @@ const openDialog = async (type: string, rowData?: any) => {
name: res.data.name || '',
remark: res.data.remark || '',
});
// 设置用户列表用于回显
if (res.data.userId) {
userList.value = [{
userId: res.data.userId,
username: res.data.username,
name: res.data.name,
id: res.data.userId,
userName: res.data.username,
realName: res.data.name,
}];
if (dataForm.userId) {
userOptions.value = [{ teacherNo: dataForm.userId, realName: dataForm.name, name: dataForm.name }];
}
}
loading.value = false;
@@ -141,9 +164,7 @@ const openDialog = async (type: string, rowData?: any) => {
});
};
// 提交
const onSubmit = async () => {
// 立即设置 loading防止重复点击
if (loading.value) return;
loading.value = true;
@@ -170,12 +191,10 @@ const onSubmit = async () => {
}
};
// 暴露变量
defineExpose({
openDialog,
});
</script>
<style scoped>
</style>
</style>