feat(topology): 房间新增/编辑弹窗增加所属客户部门选择项 - 按当前客户加载部门下拉,提交与编辑回填deptId

This commit is contained in:
wk committed 2026-10-08 11:07:34 +08:00
1 parent 737244fa9e
commit d12fa91ec2
1 file changed
+37
@@ -159,6 +159,16 @@
<a-form-item label="所属建筑" name="buildingId">
<a-select v-model:value="formData.buildingId" :options="buildingOptions" :not-found-content="null" />
</a-form-item>
<a-form-item label="所属客户部门" name="deptId">
<a-select
v-model:value="formData.deptId"
:options="departmentOptions"
:loading="departmentLoading"
allow-clear
:not-found-content="departmentLoading ? null : (departmentOptions.length ? null : '暂无部门')"
placeholder="请选择所属客户部门"
/>
</a-form-item>
<a-form-item label="房间编码" name="roomCode">
<a-input v-model:value="formData.roomCode" placeholder="请输入房间编码" maxlength="64" />
</a-form-item>
@@ -192,6 +202,7 @@ import {
import { customerApi } from '@/api/customer';
import { customerBuildingApi, type CustomerBuildingInfo } from '@/api/customerBuilding';
import { customerRoomApi, type CustomerRoomInfo } from '@/api/customerRoom';
import { customerDepartmentApi } from '@/api/customerDepartment';
type NodeType = 'customer' | 'building' | 'room';
@@ -231,6 +242,7 @@ const formData = reactive({
roomName: '',
floorNo: '',
roomPurpose: '',
deptId: undefined as number | undefined,
});
const buildingCount = computed(() => {
@@ -248,6 +260,9 @@ const buildingOptions = computed<{ label: string; value: number }[]>(() => {
return root.children.map((node) => ({ label: node.title, value: node.data.id as number }));
});
const departmentOptions = ref<{ label: string; value: number }[]>([]);
const departmentLoading = ref(false);
const formRules = computed(() => {
if (modalType.value === 'building') {
return {
@@ -358,6 +373,19 @@ async function loadTree() {
}
}
async function loadDepartments(customerId: number) {
departmentLoading.value = true;
try {
const res: any = await customerDepartmentApi.getDepartmentList({ customerId, page: 1, pageSize: 999 });
departmentOptions.value =
res.code === 200 ? res.data.list.map((d: any) => ({ label: d.deptName, value: d.id })) : [];
} catch {
departmentOptions.value = [];
} finally {
departmentLoading.value = false;
}
}
function handleAddBuilding() {
modalType.value = 'building';
isEdit.value = false;
@@ -391,6 +419,9 @@ function handleAddRoom(node: TreeNode) {
resetForm();
formData.customerId = selectedCustomerId.value;
formData.buildingId = node.data.id;
if (selectedCustomerId.value !== undefined) {
loadDepartments(selectedCustomerId.value);
}
modalVisible.value = true;
}
@@ -407,6 +438,10 @@ function handleEditRoom(node: TreeNode) {
formData.roomName = r.roomName;
formData.floorNo = r.floorNo || '';
formData.roomPurpose = r.roomPurpose || '';
formData.deptId = r.deptId;
if (r.customerId !== undefined) {
loadDepartments(r.customerId);
}
modalVisible.value = true;
}
@@ -421,6 +456,7 @@ function resetForm() {
formData.roomName = '';
formData.floorNo = '';
formData.roomPurpose = '';
formData.deptId = undefined;
if (formRef.value) {
formRef.value.clearValidate();
}
@@ -457,6 +493,7 @@ async function handleSubmit() {
roomName: formData.roomName,
floorNo: formData.floorNo,
roomPurpose: formData.roomPurpose,
deptId: formData.deptId,
};
if (isEdit.value && editId.value != null) {
res = await customerRoomApi.update(editId.value, payload);