refactor(purchase): 替换OrgSelector为el-select远程搜索组件
- 业务分管处室及人员、业务分管校领导、采购分管领导、校党委人员表单 - 改用el-select + 远程搜索方式,不依赖upms模块权限 - 复用purchase模块的searchTeachers和getSecondDeptList接口 - 人员显示格式:部门名称 - 姓名 (工号)
This commit is contained in:
@@ -11,32 +11,58 @@
|
|||||||
:rules="dataRules"
|
:rules="dataRules"
|
||||||
label-width="120px"
|
label-width="120px"
|
||||||
v-loading="loading">
|
v-loading="loading">
|
||||||
<!-- 新增时先选取用户,选后自动带出姓名、工号 -->
|
<el-form-item label="选择人员" prop="userId">
|
||||||
<el-form-item label="选取用户" prop="userId">
|
<el-select
|
||||||
<org-selector
|
v-model="form.userId"
|
||||||
v-model:orgList="userList"
|
placeholder="请输入姓名或工号搜索"
|
||||||
type="user"
|
filterable
|
||||||
:multiple="false"
|
remote
|
||||||
@update:orgList="handleUserChange" />
|
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>
|
||||||
<el-form-item label="姓名" prop="name">
|
<el-form-item label="姓名" prop="name">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.name"
|
v-model="form.name"
|
||||||
placeholder="选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="用户工号" prop="username">
|
<el-form-item label="用户工号" prop="username">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.username"
|
v-model="form.username"
|
||||||
placeholder="选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="部门" prop="deptId">
|
<el-form-item label="部门" prop="deptId">
|
||||||
<org-selector
|
<el-select
|
||||||
v-model:orgList="deptList"
|
v-model="form.deptId"
|
||||||
type="dept"
|
placeholder="请选择部门"
|
||||||
:multiple="false"
|
filterable
|
||||||
@update:orgList="handleDeptChange" />
|
clearable
|
||||||
|
style="width: 100%"
|
||||||
|
@change="handleDeptChange"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in deptOptions"
|
||||||
|
:key="item.deptId"
|
||||||
|
:label="item.deptName"
|
||||||
|
:value="item.deptId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="部门名称" prop="deptName">
|
<el-form-item label="部门名称" prop="deptName">
|
||||||
<el-input
|
<el-input
|
||||||
@@ -65,16 +91,15 @@
|
|||||||
<script setup lang="ts" name="PurchasingBusinessDeptForm">
|
<script setup lang="ts" name="PurchasingBusinessDeptForm">
|
||||||
import { reactive, ref, nextTick } from 'vue'
|
import { reactive, ref, nextTick } from 'vue'
|
||||||
import { getObj, addObj, putObj } from '/@/api/purchase/purchasingBusinessDept';
|
import { getObj, addObj, putObj } from '/@/api/purchase/purchasingBusinessDept';
|
||||||
|
import { searchTeachers, getSecondDeptList } from '/@/api/purchase/purchasingrequisition';
|
||||||
import { useMessage } from '/@/hooks/message';
|
import { useMessage } from '/@/hooks/message';
|
||||||
import orgSelector from '/@/components/OrgSelector/index.vue';
|
|
||||||
|
|
||||||
// 定义子组件向父组件传值/事件
|
|
||||||
const emit = defineEmits(['refresh']);
|
const emit = defineEmits(['refresh']);
|
||||||
|
|
||||||
// 定义变量内容
|
|
||||||
const dataFormRef = ref();
|
const dataFormRef = ref();
|
||||||
const deptList = ref<any[]>([]);
|
const deptOptions = ref<any[]>([]);
|
||||||
const userList = ref<any[]>([]);
|
const userOptions = ref<any[]>([]);
|
||||||
|
const userLoading = ref(false);
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
id: '',
|
id: '',
|
||||||
deptId: '',
|
deptId: '',
|
||||||
@@ -89,46 +114,72 @@ const loading = ref(false);
|
|||||||
|
|
||||||
const dataRules = ref({
|
const dataRules = ref({
|
||||||
userId: [
|
userId: [
|
||||||
{ required: true, message: '请选取用户(分管负责人)', trigger: 'change' }
|
{ required: true, message: '请选择人员', trigger: 'change' }
|
||||||
],
|
],
|
||||||
deptId: [
|
deptId: [
|
||||||
{ required: true, message: '请选择部门', trigger: 'change' }
|
{ required: true, message: '请选择部门', trigger: 'change' }
|
||||||
],
|
],
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: '请先选取用户', trigger: 'blur' }
|
{ required: true, message: '请先选择人员', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
username: [
|
username: [
|
||||||
{ required: true, message: '请先选取用户', trigger: 'blur' }
|
{ required: true, message: '请先选择人员', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
// 处理部门选择变化
|
const loadDeptOptions = async () => {
|
||||||
const handleDeptChange = (list: any[]) => {
|
try {
|
||||||
if (list && list.length > 0) {
|
const res = await getSecondDeptList();
|
||||||
const dept = list[0];
|
deptOptions.value = res?.data || [];
|
||||||
form.deptId = dept.deptId || dept.id || '';
|
} catch (_) {
|
||||||
form.deptName = dept.name || dept.deptName || '';
|
deptOptions.value = [];
|
||||||
} else {
|
|
||||||
form.deptId = '';
|
|
||||||
form.deptName = '';
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 处理用户选择变化(选取用户后自动带出姓名、工号)
|
const searchUser = async (query: string) => {
|
||||||
const handleUserChange = (list: any[]) => {
|
if (!query) {
|
||||||
if (list && list.length > 0) {
|
userOptions.value = [];
|
||||||
const user = list[0];
|
return;
|
||||||
form.userId = user.userId || user.id || '';
|
}
|
||||||
form.username = user.username || user.userName || '';
|
userLoading.value = true;
|
||||||
form.name = user.name || user.realName || '';
|
try {
|
||||||
} else {
|
const res = await searchTeachers(query);
|
||||||
|
userOptions.value = res?.data || [];
|
||||||
|
} catch (_) {
|
||||||
|
userOptions.value = [];
|
||||||
|
} finally {
|
||||||
|
userLoading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleDeptChange = (deptId: string) => {
|
||||||
|
if (!deptId) {
|
||||||
|
form.deptId = '';
|
||||||
|
form.deptName = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const selected = deptOptions.value.find((item: any) => item.deptId === deptId);
|
||||||
|
if (selected) {
|
||||||
|
form.deptId = selected.deptId;
|
||||||
|
form.deptName = selected.deptName;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleUserChange = (teacherNo: string) => {
|
||||||
|
if (!teacherNo) {
|
||||||
form.userId = '';
|
form.userId = '';
|
||||||
form.username = '';
|
form.username = '';
|
||||||
form.name = '';
|
form.name = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const selected = userOptions.value.find((item: any) => item.teacherNo === teacherNo);
|
||||||
|
if (selected) {
|
||||||
|
form.userId = selected.teacherNo;
|
||||||
|
form.username = selected.teacherNo;
|
||||||
|
form.name = selected.realName || selected.name;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 打开弹窗
|
|
||||||
const openDialog = async (id?: string) => {
|
const openDialog = async (id?: string) => {
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
form.id = '';
|
form.id = '';
|
||||||
@@ -138,13 +189,13 @@ const openDialog = async (id?: string) => {
|
|||||||
form.username = '';
|
form.username = '';
|
||||||
form.name = '';
|
form.name = '';
|
||||||
form.remark = '';
|
form.remark = '';
|
||||||
deptList.value = [];
|
userOptions.value = [];
|
||||||
userList.value = [];
|
|
||||||
|
await loadDeptOptions();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
dataFormRef.value?.resetFields();
|
dataFormRef.value?.resetFields();
|
||||||
if (id) {
|
if (id) {
|
||||||
// 编辑时,先获取详情数据
|
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
getObj({ id }).then((res: any) => {
|
getObj({ id }).then((res: any) => {
|
||||||
if (res.data && res.data.length > 0) {
|
if (res.data && res.data.length > 0) {
|
||||||
@@ -158,26 +209,8 @@ const openDialog = async (id?: string) => {
|
|||||||
name: data.name || '',
|
name: data.name || '',
|
||||||
remark: data.remark || '',
|
remark: data.remark || '',
|
||||||
});
|
});
|
||||||
// 设置部门列表用于回显
|
if (form.userId) {
|
||||||
if (data.deptId) {
|
userOptions.value = [{ teacherNo: form.userId, realName: form.name, name: form.name }];
|
||||||
deptList.value = [{
|
|
||||||
deptId: data.deptId,
|
|
||||||
name: data.deptName,
|
|
||||||
id: data.deptId,
|
|
||||||
type: 'dept',
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
// 设置用户列表用于回显
|
|
||||||
if (data.userId) {
|
|
||||||
userList.value = [{
|
|
||||||
userId: data.userId,
|
|
||||||
username: data.username,
|
|
||||||
name: data.name,
|
|
||||||
id: data.userId,
|
|
||||||
userName: data.username,
|
|
||||||
realName: data.name,
|
|
||||||
type: 'user',
|
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@@ -189,9 +222,7 @@ const openDialog = async (id?: string) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 提交
|
|
||||||
const onSubmit = async () => {
|
const onSubmit = async () => {
|
||||||
// 立即设置 loading,防止重复点击
|
|
||||||
if (loading.value) return;
|
if (loading.value) return;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
@@ -218,7 +249,6 @@ const onSubmit = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 暴露变量
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
openDialog,
|
openDialog,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,23 +11,40 @@
|
|||||||
:rules="dataRules"
|
:rules="dataRules"
|
||||||
label-width="120px"
|
label-width="120px"
|
||||||
v-loading="loading">
|
v-loading="loading">
|
||||||
<el-form-item label="选取用户" prop="userId">
|
<el-form-item label="选择人员" prop="userId">
|
||||||
<org-selector
|
<el-select
|
||||||
v-model:orgList="userList"
|
v-model="form.userId"
|
||||||
type="user"
|
placeholder="请输入姓名或工号搜索"
|
||||||
:multiple="false"
|
filterable
|
||||||
@update:orgList="handleUserChange" />
|
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>
|
||||||
<el-form-item label="姓名" prop="name">
|
<el-form-item label="姓名" prop="name">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.name"
|
v-model="form.name"
|
||||||
placeholder="选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="用户工号" prop="username">
|
<el-form-item label="用户工号" prop="username">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.username"
|
v-model="form.username"
|
||||||
placeholder="选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
@@ -51,15 +68,14 @@
|
|||||||
<script setup lang="ts" name="PurchasingBusinessLeaderForm">
|
<script setup lang="ts" name="PurchasingBusinessLeaderForm">
|
||||||
import { reactive, ref, nextTick } from 'vue'
|
import { reactive, ref, nextTick } from 'vue'
|
||||||
import { getObj, addObj, putObj } from '/@/api/purchase/purchasingBusinessLeader';
|
import { getObj, addObj, putObj } from '/@/api/purchase/purchasingBusinessLeader';
|
||||||
|
import { searchTeachers } from '/@/api/purchase/purchasingrequisition';
|
||||||
import { useMessage } from '/@/hooks/message';
|
import { useMessage } from '/@/hooks/message';
|
||||||
import orgSelector from '/@/components/OrgSelector/index.vue';
|
|
||||||
|
|
||||||
// 定义子组件向父组件传值/事件
|
|
||||||
const emit = defineEmits(['refresh']);
|
const emit = defineEmits(['refresh']);
|
||||||
|
|
||||||
// 定义变量内容
|
|
||||||
const dataFormRef = ref();
|
const dataFormRef = ref();
|
||||||
const userList = ref<any[]>([]);
|
const userOptions = ref<any[]>([]);
|
||||||
|
const userLoading = ref(false);
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
id: '',
|
id: '',
|
||||||
userId: '',
|
userId: '',
|
||||||
@@ -72,31 +88,47 @@ const loading = ref(false);
|
|||||||
|
|
||||||
const dataRules = ref({
|
const dataRules = ref({
|
||||||
userId: [
|
userId: [
|
||||||
{ required: true, message: '请选取用户', trigger: 'change' }
|
{ required: true, message: '请选择人员', trigger: 'change' }
|
||||||
],
|
],
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: '请先选取用户', trigger: 'blur' }
|
{ required: true, message: '请先选择人员', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
username: [
|
username: [
|
||||||
{ required: true, message: '请先选取用户', trigger: 'blur' }
|
{ required: true, message: '请先选择人员', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
// 处理用户选择变化
|
const searchUser = async (query: string) => {
|
||||||
const handleUserChange = (list: any[]) => {
|
if (!query) {
|
||||||
if (list && list.length > 0) {
|
userOptions.value = [];
|
||||||
const user = list[0];
|
return;
|
||||||
form.userId = user.userId || user.id || '';
|
}
|
||||||
form.username = user.username || user.userName || '';
|
userLoading.value = true;
|
||||||
form.name = user.name || user.realName || '';
|
try {
|
||||||
} else {
|
const res = await searchTeachers(query);
|
||||||
form.userId = '';
|
userOptions.value = res?.data || [];
|
||||||
form.username = '';
|
} catch (_) {
|
||||||
form.name = '';
|
userOptions.value = [];
|
||||||
|
} finally {
|
||||||
|
userLoading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleUserChange = (teacherNo: string) => {
|
||||||
|
if (!teacherNo) {
|
||||||
|
form.userId = '';
|
||||||
|
form.username = '';
|
||||||
|
form.name = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const selected = userOptions.value.find((item: any) => item.teacherNo === teacherNo);
|
||||||
|
if (selected) {
|
||||||
|
form.userId = selected.teacherNo;
|
||||||
|
form.username = selected.teacherNo;
|
||||||
|
form.name = selected.realName || selected.name;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 打开弹窗
|
|
||||||
const openDialog = async (id?: string) => {
|
const openDialog = async (id?: string) => {
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
form.id = '';
|
form.id = '';
|
||||||
@@ -104,12 +136,11 @@ const openDialog = async (id?: string) => {
|
|||||||
form.username = '';
|
form.username = '';
|
||||||
form.name = '';
|
form.name = '';
|
||||||
form.remark = '';
|
form.remark = '';
|
||||||
userList.value = [];
|
userOptions.value = [];
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
dataFormRef.value?.resetFields();
|
dataFormRef.value?.resetFields();
|
||||||
if (id) {
|
if (id) {
|
||||||
// 编辑时,先获取详情数据
|
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
getObj(id).then((res: any) => {
|
getObj(id).then((res: any) => {
|
||||||
if (res.data && res.data.length > 0) {
|
if (res.data && res.data.length > 0) {
|
||||||
@@ -121,17 +152,8 @@ const openDialog = async (id?: string) => {
|
|||||||
name: data.name || '',
|
name: data.name || '',
|
||||||
remark: data.remark || '',
|
remark: data.remark || '',
|
||||||
});
|
});
|
||||||
// 设置用户列表用于回显
|
if (form.userId) {
|
||||||
if (data.userId) {
|
userOptions.value = [{ teacherNo: form.userId, realName: form.name, name: form.name }];
|
||||||
userList.value = [{
|
|
||||||
userId: data.userId,
|
|
||||||
username: data.username,
|
|
||||||
name: data.name,
|
|
||||||
id: data.userId,
|
|
||||||
userName: data.username,
|
|
||||||
realName: data.name,
|
|
||||||
type: 'user',
|
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@@ -143,9 +165,7 @@ const openDialog = async (id?: string) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 提交
|
|
||||||
const onSubmit = async () => {
|
const onSubmit = async () => {
|
||||||
// 立即设置 loading,防止重复点击
|
|
||||||
if (loading.value) return;
|
if (loading.value) return;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
@@ -172,7 +192,6 @@ const onSubmit = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 暴露变量
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
openDialog,
|
openDialog,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,32 +11,58 @@
|
|||||||
:rules="dataRules"
|
:rules="dataRules"
|
||||||
label-width="120px"
|
label-width="120px"
|
||||||
v-loading="loading">
|
v-loading="loading">
|
||||||
<!-- 新增时先选取用户,选后自动带出姓名、工号 -->
|
<el-form-item label="选择人员" prop="userId">
|
||||||
<el-form-item label="选取用户" prop="userId">
|
<el-select
|
||||||
<org-selector
|
v-model="form.userId"
|
||||||
v-model:orgList="userList"
|
placeholder="请输入姓名或工号搜索"
|
||||||
type="user"
|
filterable
|
||||||
:multiple="false"
|
remote
|
||||||
@update:orgList="handleUserChange" />
|
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>
|
||||||
<el-form-item label="姓名" prop="name">
|
<el-form-item label="姓名" prop="name">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.name"
|
v-model="form.name"
|
||||||
placeholder="选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="用户工号" prop="username">
|
<el-form-item label="用户工号" prop="username">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="form.username"
|
v-model="form.username"
|
||||||
placeholder="选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="部门" prop="deptId">
|
<el-form-item label="部门" prop="deptId">
|
||||||
<org-selector
|
<el-select
|
||||||
v-model:orgList="deptList"
|
v-model="form.deptId"
|
||||||
type="dept"
|
placeholder="请选择部门"
|
||||||
:multiple="false"
|
filterable
|
||||||
@update:orgList="handleDeptChange" />
|
clearable
|
||||||
|
style="width: 100%"
|
||||||
|
@change="handleDeptChange"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="item in deptOptions"
|
||||||
|
:key="item.deptId"
|
||||||
|
:label="item.deptName"
|
||||||
|
:value="item.deptId"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="部门名称" prop="deptName">
|
<el-form-item label="部门名称" prop="deptName">
|
||||||
<el-input
|
<el-input
|
||||||
@@ -65,16 +91,15 @@
|
|||||||
<script setup lang="ts" name="PurchasingPurchaseManagerForm">
|
<script setup lang="ts" name="PurchasingPurchaseManagerForm">
|
||||||
import { reactive, ref, nextTick } from 'vue'
|
import { reactive, ref, nextTick } from 'vue'
|
||||||
import { getObj, addObj, putObj } from '/@/api/purchase/purchasingPurchaseManager';
|
import { getObj, addObj, putObj } from '/@/api/purchase/purchasingPurchaseManager';
|
||||||
|
import { searchTeachers, getSecondDeptList } from '/@/api/purchase/purchasingrequisition';
|
||||||
import { useMessage } from '/@/hooks/message';
|
import { useMessage } from '/@/hooks/message';
|
||||||
import orgSelector from '/@/components/OrgSelector/index.vue';
|
|
||||||
|
|
||||||
// 定义子组件向父组件传值/事件
|
|
||||||
const emit = defineEmits(['refresh']);
|
const emit = defineEmits(['refresh']);
|
||||||
|
|
||||||
// 定义变量内容
|
|
||||||
const dataFormRef = ref();
|
const dataFormRef = ref();
|
||||||
const deptList = ref<any[]>([]);
|
const deptOptions = ref<any[]>([]);
|
||||||
const userList = ref<any[]>([]);
|
const userOptions = ref<any[]>([]);
|
||||||
|
const userLoading = ref(false);
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
id: '',
|
id: '',
|
||||||
deptId: '',
|
deptId: '',
|
||||||
@@ -89,46 +114,72 @@ const loading = ref(false);
|
|||||||
|
|
||||||
const dataRules = ref({
|
const dataRules = ref({
|
||||||
userId: [
|
userId: [
|
||||||
{ required: true, message: '请选取用户(分管负责人)', trigger: 'change' }
|
{ required: true, message: '请选择人员', trigger: 'change' }
|
||||||
],
|
],
|
||||||
deptId: [
|
deptId: [
|
||||||
{ required: true, message: '请选择部门', trigger: 'change' }
|
{ required: true, message: '请选择部门', trigger: 'change' }
|
||||||
],
|
],
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: '请先选取用户', trigger: 'blur' }
|
{ required: true, message: '请先选择人员', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
username: [
|
username: [
|
||||||
{ required: true, message: '请先选取用户', trigger: 'blur' }
|
{ required: true, message: '请先选择人员', trigger: 'blur' }
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
// 处理部门选择变化
|
const loadDeptOptions = async () => {
|
||||||
const handleDeptChange = (list: any[]) => {
|
try {
|
||||||
if (list && list.length > 0) {
|
const res = await getSecondDeptList();
|
||||||
const dept = list[0];
|
deptOptions.value = res?.data || [];
|
||||||
form.deptId = dept.deptId || dept.id || '';
|
} catch (_) {
|
||||||
form.deptName = dept.name || dept.deptName || '';
|
deptOptions.value = [];
|
||||||
} else {
|
|
||||||
form.deptId = '';
|
|
||||||
form.deptName = '';
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 处理用户选择变化(选取用户后自动带出姓名、工号)
|
const searchUser = async (query: string) => {
|
||||||
const handleUserChange = (list: any[]) => {
|
if (!query) {
|
||||||
if (list && list.length > 0) {
|
userOptions.value = [];
|
||||||
const user = list[0];
|
return;
|
||||||
form.userId = user.userId || user.id || '';
|
}
|
||||||
form.username = user.username || user.userName || '';
|
userLoading.value = true;
|
||||||
form.name = user.name || user.realName || '';
|
try {
|
||||||
} else {
|
const res = await searchTeachers(query);
|
||||||
|
userOptions.value = res?.data || [];
|
||||||
|
} catch (_) {
|
||||||
|
userOptions.value = [];
|
||||||
|
} finally {
|
||||||
|
userLoading.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleDeptChange = (deptId: string) => {
|
||||||
|
if (!deptId) {
|
||||||
|
form.deptId = '';
|
||||||
|
form.deptName = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const selected = deptOptions.value.find((item: any) => item.deptId === deptId);
|
||||||
|
if (selected) {
|
||||||
|
form.deptId = selected.deptId;
|
||||||
|
form.deptName = selected.deptName;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleUserChange = (teacherNo: string) => {
|
||||||
|
if (!teacherNo) {
|
||||||
form.userId = '';
|
form.userId = '';
|
||||||
form.username = '';
|
form.username = '';
|
||||||
form.name = '';
|
form.name = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const selected = userOptions.value.find((item: any) => item.teacherNo === teacherNo);
|
||||||
|
if (selected) {
|
||||||
|
form.userId = selected.teacherNo;
|
||||||
|
form.username = selected.teacherNo;
|
||||||
|
form.name = selected.realName || selected.name;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 打开弹窗
|
|
||||||
const openDialog = async (id?: string) => {
|
const openDialog = async (id?: string) => {
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
form.id = '';
|
form.id = '';
|
||||||
@@ -138,13 +189,13 @@ const openDialog = async (id?: string) => {
|
|||||||
form.username = '';
|
form.username = '';
|
||||||
form.name = '';
|
form.name = '';
|
||||||
form.remark = '';
|
form.remark = '';
|
||||||
deptList.value = [];
|
userOptions.value = [];
|
||||||
userList.value = [];
|
|
||||||
|
await loadDeptOptions();
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
dataFormRef.value?.resetFields();
|
dataFormRef.value?.resetFields();
|
||||||
if (id) {
|
if (id) {
|
||||||
// 编辑时,先获取详情数据
|
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
getObj(id).then((res: any) => {
|
getObj(id).then((res: any) => {
|
||||||
if (res.data && res.data.length > 0) {
|
if (res.data && res.data.length > 0) {
|
||||||
@@ -158,26 +209,8 @@ const openDialog = async (id?: string) => {
|
|||||||
name: data.name || '',
|
name: data.name || '',
|
||||||
remark: data.remark || '',
|
remark: data.remark || '',
|
||||||
});
|
});
|
||||||
// 设置部门列表用于回显
|
if (form.userId) {
|
||||||
if (data.deptId) {
|
userOptions.value = [{ teacherNo: form.userId, realName: form.name, name: form.name }];
|
||||||
deptList.value = [{
|
|
||||||
deptId: data.deptId,
|
|
||||||
name: data.deptName,
|
|
||||||
id: data.deptId,
|
|
||||||
type: 'dept',
|
|
||||||
}];
|
|
||||||
}
|
|
||||||
// 设置用户列表用于回显
|
|
||||||
if (data.userId) {
|
|
||||||
userList.value = [{
|
|
||||||
userId: data.userId,
|
|
||||||
username: data.username,
|
|
||||||
name: data.name,
|
|
||||||
id: data.userId,
|
|
||||||
userName: data.username,
|
|
||||||
realName: data.name,
|
|
||||||
type: 'user',
|
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@@ -189,9 +222,7 @@ const openDialog = async (id?: string) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 提交
|
|
||||||
const onSubmit = async () => {
|
const onSubmit = async () => {
|
||||||
// 立即设置 loading,防止重复点击
|
|
||||||
if (loading.value) return;
|
if (loading.value) return;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
@@ -218,7 +249,6 @@ const onSubmit = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 暴露变量
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
openDialog,
|
openDialog,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -11,23 +11,40 @@
|
|||||||
:rules="dataRules"
|
:rules="dataRules"
|
||||||
label-width="100px"
|
label-width="100px"
|
||||||
v-loading="loading">
|
v-loading="loading">
|
||||||
<el-form-item label="用户" prop="userId">
|
<el-form-item label="选择人员" prop="userId">
|
||||||
<org-selector
|
<el-select
|
||||||
v-model:orgList="userList"
|
v-model="dataForm.userId"
|
||||||
type="user"
|
placeholder="请输入姓名或工号搜索"
|
||||||
:multiple="false"
|
filterable
|
||||||
@update:orgList="handleUserChange" />
|
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>
|
||||||
<el-form-item label="姓名" prop="name">
|
<el-form-item label="姓名" prop="name">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="dataForm.name"
|
v-model="dataForm.name"
|
||||||
placeholder="请选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="用户工号" prop="username">
|
<el-form-item label="用户工号" prop="username">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="dataForm.username"
|
v-model="dataForm.username"
|
||||||
placeholder="请选择用户后自动填充"
|
placeholder="选择人员后自动填充"
|
||||||
readonly />
|
readonly />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
@@ -51,15 +68,14 @@
|
|||||||
<script setup lang="ts" name="PurchasingSchoolLeaderForm">
|
<script setup lang="ts" name="PurchasingSchoolLeaderForm">
|
||||||
import { reactive, ref, nextTick } from 'vue'
|
import { reactive, ref, nextTick } from 'vue'
|
||||||
import { getObj, addObj, editObj } from '/@/api/purchase/purchasingschoolleader';
|
import { getObj, addObj, editObj } from '/@/api/purchase/purchasingschoolleader';
|
||||||
|
import { searchTeachers } from '/@/api/purchase/purchasingrequisition';
|
||||||
import { useMessage } from '/@/hooks/message';
|
import { useMessage } from '/@/hooks/message';
|
||||||
import orgSelector from '/@/components/OrgSelector/index.vue';
|
|
||||||
|
|
||||||
// 定义子组件向父组件传值/事件
|
|
||||||
const emit = defineEmits(['refresh']);
|
const emit = defineEmits(['refresh']);
|
||||||
|
|
||||||
// 定义变量内容
|
|
||||||
const formRef = ref();
|
const formRef = ref();
|
||||||
const userList = ref<any[]>([]);
|
const userOptions = ref<any[]>([]);
|
||||||
|
const userLoading = ref(false);
|
||||||
const dataForm = reactive({
|
const dataForm = reactive({
|
||||||
id: '',
|
id: '',
|
||||||
userId: '',
|
userId: '',
|
||||||
@@ -72,7 +88,7 @@ const loading = ref(false);
|
|||||||
|
|
||||||
const dataRules = ref({
|
const dataRules = ref({
|
||||||
userId: [
|
userId: [
|
||||||
{ required: true, message: '请选择用户', trigger: 'change' }
|
{ required: true, message: '请选择人员', trigger: 'change' }
|
||||||
],
|
],
|
||||||
name: [
|
name: [
|
||||||
{ required: true, message: '姓名不能为空', trigger: 'blur' }
|
{ required: true, message: '姓名不能为空', trigger: 'blur' }
|
||||||
@@ -82,21 +98,37 @@ const dataRules = ref({
|
|||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
// 处理用户选择变化
|
const searchUser = async (query: string) => {
|
||||||
const handleUserChange = (list: any[]) => {
|
if (!query) {
|
||||||
if (list && list.length > 0) {
|
userOptions.value = [];
|
||||||
const user = list[0];
|
return;
|
||||||
dataForm.userId = user.userId || user.id || '';
|
}
|
||||||
dataForm.username = user.username || user.userName || '';
|
userLoading.value = true;
|
||||||
dataForm.name = user.name || user.realName || '';
|
try {
|
||||||
} else {
|
const res = await searchTeachers(query);
|
||||||
dataForm.userId = '';
|
userOptions.value = res?.data || [];
|
||||||
dataForm.username = '';
|
} catch (_) {
|
||||||
dataForm.name = '';
|
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) => {
|
const openDialog = async (type: string, rowData?: any) => {
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
dataForm.id = '';
|
dataForm.id = '';
|
||||||
@@ -104,12 +136,11 @@ const openDialog = async (type: string, rowData?: any) => {
|
|||||||
dataForm.username = '';
|
dataForm.username = '';
|
||||||
dataForm.name = '';
|
dataForm.name = '';
|
||||||
dataForm.remark = '';
|
dataForm.remark = '';
|
||||||
userList.value = [];
|
userOptions.value = [];
|
||||||
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
formRef.value?.resetFields();
|
formRef.value?.resetFields();
|
||||||
if (type === 'edit' && rowData?.id) {
|
if (type === 'edit' && rowData?.id) {
|
||||||
// 编辑时,先获取详情数据
|
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
getObj(rowData.id).then((res: any) => {
|
getObj(rowData.id).then((res: any) => {
|
||||||
if (res.data) {
|
if (res.data) {
|
||||||
@@ -120,16 +151,8 @@ const openDialog = async (type: string, rowData?: any) => {
|
|||||||
name: res.data.name || '',
|
name: res.data.name || '',
|
||||||
remark: res.data.remark || '',
|
remark: res.data.remark || '',
|
||||||
});
|
});
|
||||||
// 设置用户列表用于回显
|
if (dataForm.userId) {
|
||||||
if (res.data.userId) {
|
userOptions.value = [{ teacherNo: dataForm.userId, realName: dataForm.name, name: dataForm.name }];
|
||||||
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,
|
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@@ -141,9 +164,7 @@ const openDialog = async (type: string, rowData?: any) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 提交
|
|
||||||
const onSubmit = async () => {
|
const onSubmit = async () => {
|
||||||
// 立即设置 loading,防止重复点击
|
|
||||||
if (loading.value) return;
|
if (loading.value) return;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
@@ -170,7 +191,6 @@ const onSubmit = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 暴露变量
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
openDialog,
|
openDialog,
|
||||||
});
|
});
|
||||||
@@ -178,4 +198,3 @@ defineExpose({
|
|||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user