| | |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { getAccountSimpleList } from '#/api/erp/finance/account'; |
| | | import { getSaleOrderItemListByOrderId, getSaleOrderPage } from '#/api/erp/sale/order'; |
| | | import { |
| | | createSaleReturn, |
| | | getSaleReturn, |
| | |
| | | }); |
| | | const formType = ref<FormType>('create'); // 表单类型:'create' | 'edit' | 'detail' |
| | | const itemFormRef = ref<InstanceType<typeof ItemForm>>(); |
| | | const orderItems = ref<ErpSaleOrderApi.SaleOrderItem[]>([]); |
| | | |
| | | const getTitle = computed(() => { |
| | | if (formType.value === 'create') { |
| | |
| | | } |
| | | |
| | | /** 选择销售订单 */ |
| | | function handleUpdateOrder(order: ErpSaleOrderApi.SaleOrder) { |
| | | async function handleUpdateOrder(order: ErpSaleOrderApi.SaleOrder) { |
| | | formData.value = { |
| | | ...formData.value, |
| | | orderId: order.id, |
| | |
| | | remark: order.remark!, |
| | | discountPercent: order.discountPercent!, |
| | | }; |
| | | // 将订单项设置到退货单项 |
| | | order.items!.forEach((item: any) => { |
| | | item.totalCount = item.count; |
| | | item.count = item.totalCount - item.returnCount; |
| | | item.orderItemId = item.id; |
| | | item.id = undefined; |
| | | }); |
| | | formData.value.items = order.items!.filter( |
| | | (item) => item.count && item.count > 0, |
| | | ) as ErpSaleReturnApi.SaleReturnItem[]; |
| | | // 加载关联销售订单的物料列表 |
| | | const items = await getSaleOrderItemListByOrderId(order.id!); |
| | | orderItems.value = items; |
| | | // 将订单项转换为退货单项(仅保留可退货数量 > 0 的项) |
| | | const returnItems: ErpSaleReturnApi.SaleReturnItem[] = []; |
| | | for (const item of items) { |
| | | const returnCount = (item as { returnCount?: number }).returnCount ?? 0; |
| | | const remainingCount = (item.count ?? 0) - returnCount; |
| | | if (remainingCount <= 0) continue; |
| | | |
| | | returnItems.push({ |
| | | orderItemId: item.id, |
| | | productId: item.productId, |
| | | productName: item.productName || '', |
| | | productPrice: item.productPrice || 0, |
| | | productUnitId: item.productUnitId, |
| | | productUnitName: item.productUnitName, |
| | | productBarCode: item.productBarCode, |
| | | totalCount: item.count, |
| | | count: remainingCount, |
| | | taxPercent: item.taxPercent || 0, |
| | | remark: item.remark || '', |
| | | totalProductPrice: 0, |
| | | taxPrice: 0, |
| | | totalPrice: 0, |
| | | }); |
| | | } |
| | | formData.value.items = returnItems; |
| | | formApi.setValues(formData.value, false); |
| | | } |
| | | |
| | |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | formData.value = {} as ErpSaleReturnApi.SaleReturn; |
| | | orderItems.value = []; |
| | | return; |
| | | } |
| | | // 加载数据 |
| | | const data = modalApi.getData<{ formType: FormType; id?: number }>(); |
| | | formType.value = data.formType; |
| | | const modalData = modalApi.getData<{ formType: FormType; id?: number }>(); |
| | | formType.value = modalData.formType; |
| | | |
| | | // 编辑/详情模式:先加载数据,再更新 schema,确保渲染时 orderNo 已就绪 |
| | | if (modalData?.id) { |
| | | modalApi.lock(); |
| | | try { |
| | | const apiData = await getSaleReturn(modalData.id); |
| | | const raw = apiData as Record<string, unknown>; |
| | | |
| | | // 提取订单号(尝试多种可能的字段名 / 嵌套结构) |
| | | const getOrderNo = (): string => { |
| | | if (raw.orderNo) return raw.orderNo as string; |
| | | if (raw.salesOrderCode) return raw.salesOrderCode as string; |
| | | if (raw.salesOrderNo) return raw.salesOrderNo as string; |
| | | const so = raw.salesOrder as Record<string, unknown> | undefined; |
| | | if (so?.no) return so.no as string; |
| | | const o = raw.order as Record<string, unknown> | undefined; |
| | | if (o?.no) return o.no as string; |
| | | return ''; |
| | | }; |
| | | |
| | | // 提取订单ID(尝试多种可能的字段名 / 嵌套结构) |
| | | const getOrderId = (): number | undefined => { |
| | | if (raw.orderId) return raw.orderId as number; |
| | | if (raw.salesOrderId) return raw.salesOrderId as number; |
| | | const so = raw.salesOrder as Record<string, unknown> | undefined; |
| | | if (so?.id) return so.id as number; |
| | | const o = raw.order as Record<string, unknown> | undefined; |
| | | if (o?.id) return o.id as number; |
| | | return undefined; |
| | | }; |
| | | |
| | | let orderNo = getOrderNo(); |
| | | let orderId = getOrderId(); |
| | | |
| | | // 如果有订单号但没有订单ID,通过订单号反查订单ID |
| | | if (orderNo && !orderId) { |
| | | const orderPage = await getSaleOrderPage({ |
| | | pageNo: 1, |
| | | pageSize: 1, |
| | | no: orderNo, |
| | | } as Record<string, unknown> as never); |
| | | const list = (orderPage as Record<string, unknown>)?.list as Array<Record<string, unknown>> | undefined; |
| | | if (list?.length) { |
| | | orderId = list[0].id as number; |
| | | } |
| | | } |
| | | |
| | | formData.value = { ...apiData, orderNo, orderId }; |
| | | if (orderId) { |
| | | orderItems.value = await getSaleOrderItemListByOrderId(orderId); |
| | | } |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | } |
| | | |
| | | // 数据就绪后再更新 schema 和设置表单值 |
| | | formApi.setDisabled(formType.value === 'detail'); |
| | | formApi.updateSchema(useFormSchema(formType.value)); |
| | | if (!data || !data.id) { |
| | | |
| | | if (!modalData?.id) { |
| | | // 新增时,默认选中账户 |
| | | const accountList = await getAccountSimpleList(); |
| | | const defaultAccount = accountList.find((item) => item.defaultStatus); |
| | |
| | | } |
| | | return; |
| | | } |
| | | modalApi.lock(); |
| | | try { |
| | | formData.value = await getSaleReturn(data.id); |
| | | if (formData.value?.attachmentList?.length) { |
| | | const blobIds = formData.value.attachmentList.map((item) => ({ |
| | | uid: String(item.id), |
| | | name: item.name || '', |
| | | url: item.url || '', |
| | | status: 'done', |
| | | id: item.id, |
| | | })); |
| | | formApi.setFieldValue('blobIds', blobIds); |
| | | } |
| | | // 设置到 values |
| | | await formApi.setValues(formData.value, false); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | |
| | | await formApi.setValues(formData.value, false); |
| | | if (formData.value?.attachmentList?.length) { |
| | | const blobIds = formData.value.attachmentList.map((item) => ({ |
| | | uid: String(item.id), |
| | | name: item.name || '', |
| | | url: item.url || '', |
| | | status: 'done', |
| | | id: item.id, |
| | | })); |
| | | await formApi.setFieldValue('blobIds', blobIds); |
| | | } |
| | | }, |
| | | }); |
| | |
| | | :disabled="formType === 'detail'" |
| | | :discount-percent="formData?.discountPercent ?? 0" |
| | | :other-price="formData?.otherPrice ?? 0" |
| | | :order-items="orderItems" |
| | | @update:items="handleUpdateItems" |
| | | @update:discount-price="handleUpdateDiscountPrice" |
| | | @update:other-price="handleUpdateOtherPrice" |
| | |
| | | </template> |
| | | <template #orderNo> |
| | | <SaleOrderSelect |
| | | :key="formData?.orderNo ?? 'empty'" |
| | | :order-no="formData?.orderNo" |
| | | @update:order="handleUpdateOrder" |
| | | /> |