diff --git a/backend/app/api/menu.py b/backend/app/api/menu.py index 812879af..d527b080 100644 --- a/backend/app/api/menu.py +++ b/backend/app/api/menu.py @@ -53,6 +53,13 @@ STATIC_MENU_TREE = [ "component": "/cell-storage/protocol-audit/index", "meta": {"title": "采集协议单", "keepAlive": True, "menuCode": "biz:cellStorageProtocolAudit:list"}, }, + { + "id": "50000000000000000000000000000020", + "name": "CellStoragePresignOrder", + "path": "presign-order", + "component": "/cell-storage/presign-order/index", + "meta": {"title": "预签约订单", "keepAlive": True, "menuCode": "cell-storage:presign-order:list"}, + }, { "id": "50000000000000000000000000000013", "name": "CellStorageSampleInfo", diff --git a/web-admin/src/api/presign-order.ts b/web-admin/src/api/presign-order.ts new file mode 100644 index 00000000..b4a99804 --- /dev/null +++ b/web-admin/src/api/presign-order.ts @@ -0,0 +1,108 @@ +import request from '@/utils/http' + +type PageList = { + list: T[] + total: number + page: number + pageSize: number +} + +export function fetchPresignOrderList(params?: { + page?: number + pageSize?: number + keyword?: string + orderStatus?: string +}) { + return request.get>>({ + url: '/web/admin/presign-orders', + params + }) +} + +export function fetchPresignOrderDetail(id: string) { + return request.get>({ + url: `/web/admin/presign-orders/${id}` + }) +} + +export function fetchCreatePresignOrder(data: Record) { + return request.post({ + url: '/web/admin/presign-orders', + data, + showSuccessMessage: true + }) +} + +export function fetchUpdatePresignOrder(id: string, data: Record) { + return request.put({ + url: `/web/admin/presign-orders/${id}`, + data, + showSuccessMessage: true + }) +} + +export function fetchDeletePresignOrder(id: string) { + return request.del({ + url: `/web/admin/presign-orders/${id}`, + showSuccessMessage: true + }) +} + +export function fetchConvertPresignOrder(id: string) { + return request.post({ + url: `/web/admin/presign-orders/${id}/convert`, + showSuccessMessage: true + }) +} + +export function fetchCreatePresignTransfer(orderId: string, data: Record) { + return request.post({ + url: `/web/admin/presign-orders/${orderId}/transfers`, + data, + showSuccessMessage: true + }) +} + +export function fetchUpdatePresignTransfer(transferId: string, data: Record) { + return request.put({ + url: `/web/admin/presign-transfers/${transferId}`, + data, + showSuccessMessage: false + }) +} + +export function fetchSubmitPresignTransferFinance(transferId: string) { + return request.post({ + url: `/web/admin/presign-transfers/${transferId}/submit-receipt-finance`, + showSuccessMessage: true + }) +} + +export function fetchPresignTransferReceiptConfirmList(params?: { + page?: number + pageSize?: number + keyword?: string +}) { + return request.get>>({ + url: '/web/admin/presign-transfers/receipt-confirm', + params + }) +} + +export function fetchConfirmPresignTransfer( + transferId: string, + data?: { financeConfirmAttachments?: string; financeRemark?: string } +) { + return request.post({ + url: `/web/admin/presign-transfers/${transferId}/receipt-confirm`, + data: data || {}, + showSuccessMessage: true + }) +} + +export function fetchRejectPresignTransfer(transferId: string) { + return request.post({ + url: `/web/admin/presign-transfers/${transferId}/receipt-reject`, + showSuccessMessage: true + }) +} diff --git a/web-admin/src/router/modules/sqxp.ts b/web-admin/src/router/modules/sqxp.ts index e26a5268..c614711a 100644 --- a/web-admin/src/router/modules/sqxp.ts +++ b/web-admin/src/router/modules/sqxp.ts @@ -60,6 +60,17 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [ menuCode: 'biz:cellStorageProtocolAudit:list' } }, + { + id: '50000000000000000000000000000020', + name: 'CellStoragePresignOrder', + path: 'presign-order', + component: '/cell-storage/presign-order/index', + meta: { + title: '预签约订单', + keepAlive: true, + menuCode: 'cell-storage:presign-order:list' + } + }, { id: '50000000000000000000000000000013', name: 'CellStorageSampleInfo', diff --git a/web-admin/src/utils/status-tag-registry.ts b/web-admin/src/utils/status-tag-registry.ts index 9ab600d6..c27206ed 100644 --- a/web-admin/src/utils/status-tag-registry.ts +++ b/web-admin/src/utils/status-tag-registry.ts @@ -381,6 +381,16 @@ export const sex: StatusRegistry = { export const sexLabel = createLabelGetter(sex) export const sexTagType = createTagTypeGetter(sex) +/** 预签约订单状态 */ +export const presignOrderStatus: StatusRegistry = { + draft: { label: '草稿', tagType: 'info' }, + active: { label: '进行中', tagType: 'warning' }, + converted: { label: '已转正式', tagType: 'success' }, + void: { label: '已作废', tagType: 'danger' } +} +export const presignOrderStatusLabel = createLabelGetter(presignOrderStatus) +export const presignOrderStatusTagType = createTagTypeGetter(presignOrderStatus) + /** 请假状态 */ export const leaveStatus: StatusRegistry = { draft: { label: '草稿', tagType: 'info' }, diff --git a/web-admin/src/views/cell-storage/payment-confirm/index.vue b/web-admin/src/views/cell-storage/payment-confirm/index.vue index 7cb6a689..fb92b029 100644 --- a/web-admin/src/views/cell-storage/payment-confirm/index.vue +++ b/web-admin/src/views/cell-storage/payment-confirm/index.vue @@ -530,6 +530,11 @@ fetchConfirmPaymentTransfer, fetchRejectPaymentTransfer } from '@/api/protocol-sample-payment' + import { + fetchPresignTransferReceiptConfirmList, + fetchConfirmPresignTransfer, + fetchRejectPresignTransfer + } from '@/api/presign-order' import ProtocolFinanceConfirmFields from '@/components/business/protocol-finance-confirm-fields/index.vue' import ClinicalPaymentConfirmTimeline from '@/components/business/clinical-payment-confirm-timeline/index.vue' import { @@ -621,11 +626,12 @@ async function loadTabPendingCounts() { try { - const [paymentRes, invRes] = await Promise.all([ + const [paymentRes, presignRes, invRes] = await Promise.all([ fetchPaymentTransferReceiptConfirmList({ page: 1, pageSize: 1 }), + fetchPresignTransferReceiptConfirmList({ page: 1, pageSize: 1 }), fetchProtocolInvoicePendingCount() ]) - paymentPendingBadge.value = paymentRes.total ?? 0 + paymentPendingBadge.value = (paymentRes.total ?? 0) + (presignRes.total ?? 0) invoicePendingBadge.value = Number(invRes?.count ?? 0) } catch { // 角标加载失败时保留上次数值,避免干扰主流程 @@ -635,9 +641,18 @@ async function loadPending() { pendingLoading.value = true try { - const res = await fetchPaymentTransferReceiptConfirmList(buildPendingParams()) - pendingData.value = res.list || [] - pendingPagination.total = res.total ?? 0 + // 正式 + 预签约意向金待办合并(前端 merge,分页近似:各取一页后合并) + const [formal, presign] = await Promise.all([ + fetchPaymentTransferReceiptConfirmList(buildPendingParams()), + fetchPresignTransferReceiptConfirmList({ + page: pendingPagination.page, + pageSize: pendingPagination.pageSize, + keyword: pendingSearchForm.keyword || undefined + }) + ]) + const merged = [...(formal.list || []), ...(presign.list || [])] + pendingData.value = merged + pendingPagination.total = (formal.total ?? 0) + (presign.total ?? 0) } finally { pendingLoading.value = false } @@ -703,10 +718,15 @@ } submitLoading.value = true try { - await fetchConfirmPaymentTransfer(currentDetailId.value, { + const payload = { financeConfirmAttachments: financeAttachmentsToUrlString(attachments.value) || undefined, financeRemark: financeRemark.value.trim() || undefined - }) + } + if (confirmRow.value?.source === 'presign') { + await fetchConfirmPresignTransfer(currentDetailId.value, payload) + } else { + await fetchConfirmPaymentTransfer(currentDetailId.value, payload) + } dialogVisible.value = false await loadAll() await loadTabPendingCounts() @@ -726,7 +746,11 @@ } rejectLoading.value = true try { - await fetchRejectPaymentTransfer(currentDetailId.value) + if (confirmRow.value?.source === 'presign') { + await fetchRejectPresignTransfer(currentDetailId.value) + } else { + await fetchRejectPaymentTransfer(currentDetailId.value) + } dialogVisible.value = false await loadAll() await loadTabPendingCounts() diff --git a/web-admin/src/views/cell-storage/presign-order/PresignOrderFormDialog.vue b/web-admin/src/views/cell-storage/presign-order/PresignOrderFormDialog.vue new file mode 100644 index 00000000..29dbad45 --- /dev/null +++ b/web-admin/src/views/cell-storage/presign-order/PresignOrderFormDialog.vue @@ -0,0 +1,492 @@ + + + + + + + diff --git a/web-admin/src/views/cell-storage/presign-order/index.vue b/web-admin/src/views/cell-storage/presign-order/index.vue new file mode 100644 index 00000000..24bbbef6 --- /dev/null +++ b/web-admin/src/views/cell-storage/presign-order/index.vue @@ -0,0 +1,290 @@ + + + + +