| | |
| | | import type { TicketFormType } from '../data'; |
| | | |
| | | import type { AftersalesTicketApi } from '#/api/aftersales/ticket'; |
| | | import type { ErpSaleOrderApi } from '#/api/erp/sale/order'; |
| | | import type { VxeTableGridOptions } from '#/adapter/vxe-table'; |
| | | |
| | | import { computed, nextTick, ref } from 'vue'; |
| | | import { useRouter } from 'vue-router'; |
| | | |
| | | import { useVbenModal } from '@vben/common-ui'; |
| | | import { AftersaleIssueTypeEnum, AftersaleTicketStatusEnum } from '@vben/constants'; |
| | | import { AftersaleIssueTypeEnum, AftersaleTicketStatusEnum, DICT_TYPE } from '@vben/constants'; |
| | | |
| | | import { Button, Divider, Input, message, Popconfirm, Select, Tag } from 'ant-design-vue'; |
| | | |
| | |
| | | resolveTicket, |
| | | updateTicket, |
| | | } from '#/api/aftersales/ticket'; |
| | | import { getSaleOrder } from '#/api/erp/sale/order'; |
| | | import { getDictLabel } from '#/packages/effects/hooks/src'; |
| | | import { $t } from '#/locales'; |
| | | |
| | | import { useTicketFormSchema, useTicketItemFormSchema, useTicketItemGridColumns } from '../data'; |
| | |
| | | return $t('ui.actionTitle.create', ['售后工单']); |
| | | }); |
| | | |
| | | // 销售订单物料过滤 |
| | | const orderItems = ref<ErpSaleOrderApi.SaleOrderItem[]>([]); |
| | | |
| | | function handleSaleOrderChange(item: Record<string, unknown> | undefined) { |
| | | if (!item?.id) { |
| | | orderItems.value = []; |
| | | return; |
| | | } |
| | | orderItems.value = (item.items as ErpSaleOrderApi.SaleOrderItem[]) || []; |
| | | } |
| | | |
| | | // 主表单 |
| | | const [Form, formApi] = useVbenForm({ |
| | | commonConfig: { componentProps: { class: 'w-full' }, formItemClass: 'col-span-1', labelWidth: 110 }, |
| | |
| | | // Modal(工单表单弹框)必须在 ItemModal 之前,确保 connectedComponent 注入到正确的弹框 |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { formData.value = undefined; items.value = []; orderItems.value = []; showClassify.value = false; return; } |
| | | if (!isOpen) { formData.value = undefined; items.value = []; showClassify.value = false; return; } |
| | | const data = modalApi.getData<{ formType: TicketFormType; id?: number }>(); |
| | | formType.value = data.formType; |
| | | itemsGridApi.setGridOptions({ columns: useTicketItemGridColumns(isEdit.value) }); |
| | | formApi.setState({ schema: useTicketFormSchema(formType.value, formApi, handleSaleOrderChange) }); |
| | | formApi.setState({ schema: useTicketFormSchema(formType.value) }); |
| | | formApi.setDisabled(!isEdit.value); |
| | | modalApi.setState({ showConfirmButton: false, showCancelButton: false }); |
| | | if (data?.id) { |
| | |
| | | status: 'done', id: item.id, |
| | | })); |
| | | await formApi.setFieldValue('blobIds', blobIds); |
| | | } |
| | | if (formData.value?.saleOrderId) { |
| | | const order = await getSaleOrder(formData.value.saleOrderId); |
| | | orderItems.value = (order as Record<string, unknown>).items as ErpSaleOrderApi.SaleOrderItem[] || []; |
| | | } |
| | | } finally { modalApi.unlock(); } |
| | | } else { |
| | |
| | | onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { editingItemIndex.value = null; return; } |
| | | const d = itemModalApi.getData<AftersalesTicketApi.TicketItem | null>(); |
| | | itemFormApi.setState({ schema: useTicketItemFormSchema(formData.value?.customerId, formData.value?.saleOrderNo, orderItems.value, itemFormApi) }); |
| | | itemFormApi.setState({ schema: useTicketItemFormSchema(formData.value?.customerId, undefined, [], itemFormApi) }); |
| | | if (d) { itemFormApi.setValues(d as Record<string, unknown>); } else { itemFormApi.resetForm(); } |
| | | }, |
| | | }); |
| | |
| | | <ItemsGrid> |
| | | <template #needRepair="{ row }"><Tag :color="row.needRepair ? 'blue' : 'default'">{{ row.needRepair ? '是' : '否' }}</Tag></template> |
| | | <template #needReturn="{ row }"><Tag :color="row.needReturn ? 'orange' : 'default'">{{ row.needReturn ? '是' : '否' }}</Tag></template> |
| | | <template #reasonType="{ row }">{{ getDictLabel(DICT_TYPE.AFTERSALE_REASON_TYPE, row.reasonType) }}</template> |
| | | <template v-if="isEdit" #itemActions="{ row, rowIndex }"> |
| | | <TableAction :actions="[ |
| | | { label: $t('common.edit'), type: 'link', icon: ACTION_ICON.EDIT, onClick: () => editItem(rowIndex) }, |