diff --git a/erp-frontend-vue/src/api/material.ts b/erp-frontend-vue/src/api/material.ts index ef625c8..fbe43b0 100644 --- a/erp-frontend-vue/src/api/material.ts +++ b/erp-frontend-vue/src/api/material.ts @@ -16,6 +16,7 @@ export interface MaterialQuery { name?: string category?: string itemOrProduct?: string + enableFlag?: string page?: number pageSize?: number } @@ -51,6 +52,9 @@ export async function getMaterialList(params: MaterialQuery): Promise - - - + /> @@ -507,12 +503,20 @@ width="55" :reserve-selection="true" /> - - + align="center" + > + + + @@ -566,7 +570,7 @@ import PrintDialog from '@/components/print/PrintDialog.vue' import type { PrintConfig } from '@/components/print/types' import { getCustomerList, type Customer } from '@/api/customer' import { getMaterialList, type Material } from '@/api/material' -import { listDept, type Dept } from '@/api/system/dept' +import { listDept, handleTree, type Dept } from '@/api/system/dept' import { listUser, type User } from '@/api/system/user' const route = useRoute() @@ -662,6 +666,7 @@ const materialLoading = ref(false) const selectedMaterials = ref([]) const currentEditingRow = ref(null) const materialTableRef = ref() +const selectedRadioId = ref(undefined) /** 销售部门、销售人员选项 */ const deptOptions = ref([]) @@ -769,26 +774,25 @@ async function loadOrderData() { } } -/** 将部门树扁平化为列表(若接口返回树形) */ -function flattenDepts(list: Dept[]): Dept[] { - const out: Dept[] = [] - function walk(items: Dept[]) { - items.forEach(d => { - out.push(d) - if (d.children?.length) walk(d.children) - }) +/** 在部门树中递归查找指定部门 */ +function findDeptInTree(list: Dept[], deptId: number): Dept | undefined { + for (const d of list) { + if (d.deptId === deptId) return d + if (d.children?.length) { + const found = findDeptInTree(d.children, deptId) + if (found) return found + } } - walk(list) - return out + return undefined } -/** 加载部门列表 */ +/** 加载部门列表(树形结构) */ async function loadDeptList() { try { const res: any = await listDept() const data = res?.data ?? res const raw = Array.isArray(data) ? data : (data?.list ?? data?.rows ?? []) - deptOptions.value = flattenDepts(raw) + deptOptions.value = handleTree(raw) } catch (e) { console.error('加载部门列表失败', e) deptOptions.value = [] @@ -809,7 +813,7 @@ async function loadUserList() { /** 销售部门变更:同步名称,清空不在该部门下的销售人员 */ function onDeptChange(deptId: number | undefined) { if (deptId) { - const dept = deptOptions.value.find(d => d.deptId === deptId) + const dept = findDeptInTree(deptOptions.value, deptId) formData.deptName = dept?.deptName ?? '' const inDept = salesmanOptions.value.some(u => u.userId === formData.salesmanId) if (!inDept) { @@ -863,7 +867,8 @@ async function loadMaterials() { // 支持按编码或名称搜索;仅显示产品物料(产品物料标识=PRODUCT) const params: any = { pageSize: 100, // 物料选择对话框不分页,一次性加载更多 - itemOrProduct: 'PRODUCT' + itemOrProduct: 'PRODUCT', + enableFlag: 'Y' // 只显示启用状态的物料 } if (searchText) { @@ -899,14 +904,17 @@ function handleMaterialSelectionChange(rows: Material[]) { } } +/** 单选框选择(单行模式) */ +function handleRadioSelect(row: Material) { + selectedMaterials.value = [row] +} + /** 物料行点击(单行选择模式) */ function handleMaterialRowClick(row: Material) { if (currentEditingRow.value) { - // 单行选择模式:直接选中该行并高亮 + // 单行选择模式:选中该行并同步单选框 + selectedRadioId.value = row.id selectedMaterials.value = [row] - // 清除所有选择,然后选中当前行 - materialTableRef.value?.clearSelection() - materialTableRef.value?.toggleRowSelection(row, true) } } @@ -1206,6 +1214,7 @@ watch(showMaterialDialog, (val) => { loadMaterials() // 清空之前的选择 selectedMaterials.value = [] + selectedRadioId.value = undefined // 清空表格选择状态 nextTick(() => { materialTableRef.value?.clearSelection() @@ -1213,6 +1222,7 @@ watch(showMaterialDialog, (val) => { } else { // 关闭对话框时清空状态 selectedMaterials.value = [] + selectedRadioId.value = undefined currentEditingRow.value = null materialSearch.value = '' }