Merge branch 'claude/gallant-shamir': fix 销售订单新增页面3个Bug

This commit is contained in:
panchengyong
2026-03-11 12:59:54 +08:00
2 changed files with 46 additions and 32 deletions

View File

@@ -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<MaterialLi
if (params.itemOrProduct) {
query.itemOrProduct = params.itemOrProduct
}
if (params.enableFlag) {
query.enableFlag = params.enableFlag
}
const res = await listMdItem(query)
// 返回所有物料,让用户自行选择

View File

@@ -118,21 +118,17 @@
</el-col>
<el-col :span="6">
<el-form-item label="销售部门" prop="deptId">
<el-select
<el-tree-select
v-model="formData.deptId"
:data="deptOptions"
:props="{ value: 'deptId', label: 'deptName', children: 'children' }"
placeholder="请选择销售部门"
clearable
check-strictly
filterable
style="width: 100%"
@change="onDeptChange"
>
<el-option
v-for="item in deptOptions"
:key="item.deptId"
:label="item.deptName"
:value="item.deptId"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
@@ -509,10 +505,18 @@
/>
<el-table-column
v-else
type="index"
width="55"
align="center"
>
<template #default="{ row }">
<el-radio
v-model="selectedRadioId"
:value="row.id"
@change="handleRadioSelect(row)"
/>
<el-table-column prop="code" label="物料编码" width="120" />
</template>
</el-table-column>
<el-table-column prop="code" label="物料编码" min-width="160" show-overflow-tooltip />
<el-table-column prop="name" label="物料名称" min-width="180" show-overflow-tooltip />
<el-table-column prop="spec" label="规格型号" width="150" show-overflow-tooltip />
<el-table-column prop="unit" label="单位" width="80" />
@@ -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<Material[]>([])
const currentEditingRow = ref<SalesOrderLine | null>(null)
const materialTableRef = ref()
const selectedRadioId = ref<number | undefined>(undefined)
/** 销售部门、销售人员选项 */
const deptOptions = ref<Dept[]>([])
@@ -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 = ''
}