| | |
| | | <script lang="ts" setup> |
| | | import type { FormType } from '../data'; |
| | | |
| | | import type { ErpPurchaseOrderApi, ProcessDefinition } from '#/api/erp/purchase/order'; |
| | | import type { ErpPurchaseOrderApi } from '#/api/erp/purchase/order'; |
| | | |
| | | import { computed, ref } from 'vue'; |
| | | |
| | | 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, |
| | | getPurchaseApproveProcessList, |
| | | getPurchaseOrder, |
| | | updatePurchaseOrder, |
| | | } from '#/api/erp/purchase/order'; |
| | |
| | | |
| | | import { useFormSchema } from '../data'; |
| | | import PurchaseOrderItemForm from './item-form.vue'; |
| | | import ProcessSelectModal from './process-select-modal.vue'; |
| | | |
| | | const emit = defineEmits(['success']); |
| | | const formData = ref<ErpPurchaseOrderApi.PurchaseOrder>(); |
| | | const formType = ref<FormType>('create'); |
| | | const itemFormRef = ref<InstanceType<typeof PurchaseOrderItemForm>>(); |
| | | const selectedProcessId = ref<string>(''); |
| | | |
| | | const getTitle = computed(() => { |
| | | if (formType.value === 'create') { |
| | |
| | | }, |
| | | }); |
| | | |
| | | const [ProcessModal, processModalApi] = useVbenModal({ |
| | | connectedComponent: ProcessSelectModal, |
| | | destroyOnClose: true, |
| | | }); |
| | | |
| | | /** 更新采购订单项 */ |
| | | function handleUpdateItems(items: ErpPurchaseOrderApi.PurchaseOrderItem[]) { |
| | | formData.value = modalApi.getData<ErpPurchaseOrderApi.PurchaseOrder>(); |
| | |
| | | }); |
| | | } |
| | | |
| | | /** 流程选择成功 */ |
| | | function handleProcessSelectSuccess(processId: string) { |
| | | selectedProcessId.value = processId; |
| | | submitOrder(); |
| | | } |
| | | |
| | | /** 提交订单 */ |
| | | async function submitOrder() { |
| | | const data = (await formApi.getValues()) as ErpPurchaseOrderApi.PurchaseOrder; |
| | |
| | | ...item, |
| | | id: undefined, |
| | | })); |
| | | if (data.fileUrl && Array.isArray(data.fileUrl)) { |
| | | data.fileUrl = data.fileUrl.length > 0 ? data.fileUrl[0] : ''; |
| | | } |
| | | if (selectedProcessId.value) { |
| | | data.processDefinitionId = selectedProcessId.value; |
| | | } |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | | /** 创建或更新采购订单 */ |
| | |
| | | } |
| | | |
| | | modalApi.lock(); |
| | | |
| | | if (formType.value === 'create') { |
| | | try { |
| | | const processes = await getPurchaseApproveProcessList(); |
| | | if (processes.length === 1) { |
| | | selectedProcessId.value = processes[0].id; |
| | | await submitOrder(); |
| | | } else if (processes.length > 1) { |
| | | processModalApi.setData(processes).open(); |
| | | } else { |
| | | message.error('采购审核分类下没有可用的流程模型,请先创建并发布流程'); |
| | | } |
| | | } catch (error: any) { |
| | | message.error(error.message || '获取流程列表失败'); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | } else { |
| | | try { |
| | | await submitOrder(); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | try { |
| | | await submitOrder(); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | | }, |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | formData.value = undefined; |
| | | selectedProcessId.value = ''; |
| | | return; |
| | | } |
| | | const data = modalApi.getData<{ formType: FormType; id?: number }>(); |
| | |
| | | modalApi.lock(); |
| | | try { |
| | | formData.value = await getPurchaseOrder(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); |
| | | } |
| | | await formApi.setValues(formData.value); |
| | | } finally { |
| | | modalApi.unlock(); |
| | |
| | | class="w-3/4" |
| | | :show-confirm-button="formType !== 'detail'" |
| | | > |
| | | <ProcessModal @success="handleProcessSelectSuccess" /> |
| | | <Form class="mx-3"> |
| | | <template #items> |
| | | <PurchaseOrderItemForm |
| | |
| | | /> |
| | | </template> |
| | | </Form> |
| | | <template v-if="formType === 'detail' && formData?.status === 20 && formData?.inStatus !== 2" #prepend-footer> |
| | | <Button type="primary" @click="handleConfirmReceipt">确认收货</Button> |
| | | </template> |
| | | </Modal> |
| | | </template> |