liu
8 天以前 5c124cdf26e4d749eae1e7fc9df366e9a5f4d259
src/views/erp/sale/return/modules/form.vue
@@ -13,6 +13,7 @@
import { useVbenForm } from '#/adapter/form';
import { getAccountSimpleList } from '#/api/erp/finance/account';
import { getSaleOrderItemListByOrderId, getSaleOrderPage } from '#/api/erp/sale/order';
import {
  createSaleReturn,
  getSaleReturn,
@@ -48,6 +49,7 @@
});
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') {
@@ -113,7 +115,7 @@
}
/** 选择销售订单 */
function handleUpdateOrder(order: ErpSaleOrderApi.SaleOrder) {
async function handleUpdateOrder(order: ErpSaleOrderApi.SaleOrder) {
  formData.value = {
    ...formData.value,
    orderId: order.id,
@@ -123,16 +125,34 @@
    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);
}
@@ -171,14 +191,72 @@
  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);
@@ -187,23 +265,17 @@
      }
      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);
    }
  },
});
@@ -224,6 +296,7 @@
          :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"
@@ -232,6 +305,7 @@
      </template>
      <template #orderNo>
        <SaleOrderSelect
          :key="formData?.orderNo ?? 'empty'"
          :order-no="formData?.orderNo"
          @update:order="handleUpdateOrder"
        />