5 天以前 91c82965b2d987452ca276e3a03b48c8dcda2ae9
src/views/erp/purchase/order/modules/form.vue
@@ -5,13 +5,14 @@
import { computed, ref } from 'vue';
import { useVbenModal } from '../../../../../packages/effects/common-ui/src';
import { useVbenModal } from '@vben/common-ui';
import { message } from 'ant-design-vue';
import { message, Button } from 'ant-design-vue';
import { useVbenForm } from '#/adapter/form';
import { getAccountSimpleList } from '#/api/erp/finance/account';
import {
  confirmReceipt,
  createPurchaseOrder,
  getPurchaseOrder,
  updatePurchaseOrder,
@@ -23,7 +24,7 @@
const emit = defineEmits(['success']);
const formData = ref<ErpPurchaseOrderApi.PurchaseOrder>();
const formType = ref<FormType>('create'); // 表单类型:'create' | 'edit' | 'detail'
const formType = ref<FormType>('create');
const itemFormRef = ref<InstanceType<typeof PurchaseOrderItemForm>>();
const getTitle = computed(() => {
@@ -48,7 +49,6 @@
  schema: useFormSchema(formType.value),
  showDefaultActions: false,
  handleValuesChange: (values, changedFields) => {
    // 目的:同步到 item-form 组件,触发整体的价格计算
    if (formData.value && changedFields.includes('discountPercent')) {
      formData.value.discountPercent = values.discountPercent;
    }
@@ -78,6 +78,35 @@
  });
}
/** 提交订单 */
async function submitOrder() {
  const data = (await formApi.getValues()) as ErpPurchaseOrderApi.PurchaseOrder;
  data.items = formData.value?.items?.map((item) => ({
    ...item,
    id: undefined,
  }));
  await (formType.value === 'create'
    ? createPurchaseOrder(data)
    : updatePurchaseOrder(data));
  await modalApi.close();
  emit('success');
  message.success($t('ui.actionMessage.operationSuccess'));
}
/** 确认收货 */
async function handleConfirmReceipt() {
  if (!formData.value?.id) return;
  const hideLoading = message.loading({ content: '确认收货中...', duration: 0 });
  try {
    await confirmReceipt(formData.value.id);
    message.success('确认收货成功,已生成到货通知单');
    await modalApi.close();
    emit('success');
  } finally {
    hideLoading();
  }
}
/** 创建或更新采购订单 */
const [Modal, modalApi] = useVbenModal({
  async onConfirm() {
@@ -96,26 +125,8 @@
    }
    modalApi.lock();
    // 提交表单
    const data =
      (await formApi.getValues()) as ErpPurchaseOrderApi.PurchaseOrder;
    data.items = formData.value?.items?.map((item) => ({
      ...item,
      // 解决新增采购订单报错
      id: undefined,
    }));
    // 将文件数组转换为字符串
    if (data.fileUrl && Array.isArray(data.fileUrl)) {
      data.fileUrl = data.fileUrl.length > 0 ? data.fileUrl[0] : '';
    }
    try {
      await (formType.value === 'create'
        ? createPurchaseOrder(data)
        : updatePurchaseOrder(data));
      // 关闭并提示
      await modalApi.close();
      emit('success');
      message.success($t('ui.actionMessage.operationSuccess'));
      await submitOrder();
    } finally {
      modalApi.unlock();
    }
@@ -125,13 +136,11 @@
      formData.value = undefined;
      return;
    }
    // 加载数据
    const data = modalApi.getData<{ formType: FormType; id?: number }>();
    formType.value = data.formType;
    formApi.setDisabled(formType.value === 'detail');
    formApi.updateSchema(useFormSchema(formType.value));
    if (!data || !data.id) {
      // 新增时,默认选中账户
      const accountList = await getAccountSimpleList();
      const defaultAccount = accountList.find((item) => item.defaultStatus);
      if (defaultAccount) {
@@ -142,8 +151,17 @@
    modalApi.lock();
    try {
      formData.value = await getPurchaseOrder(data.id);
      // 设置到 values
      await formApi.setValues(formData.value);
      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);
      }
    } finally {
      modalApi.unlock();
    }
@@ -170,5 +188,8 @@
        />
      </template>
    </Form>
    <template v-if="formType === 'detail' && formData?.status === 20 && formData?.inStatus !== 2" #prepend-footer>
      <Button type="primary" @click="handleConfirmReceipt">确认收货</Button>
    </template>
  </Modal>
</template>