import request from '@/utils/http' export function fetchCellProductList(params?: { page?: number pageSize?: number keyword?: string productStatus?: string passage?: string sourceType?: string }) { return request.get<{ list: any[] total: number page: number pageSize: number totalPages: number }>({ url: '/web/admin/cell-products', params }) } export function fetchCellProductDetail(id: string) { return request.get({ url: `/web/admin/cell-products/${id}` }) } export function fetchCreateCellProduct(data: Record) { return request.post({ url: '/web/admin/cell-products', params: data }) } export function fetchUpdateCellProduct(id: string, data: Record) { return request.put({ url: `/web/admin/cell-products/${id}`, params: data }) } export function fetchDeleteCellProduct(id: string) { return request.del({ url: `/web/admin/cell-products/${id}` }) } export function fetchNextCellProductCode(count = 1) { return request.get<{ code: string; codes?: string[] }>({ url: '/web/admin/cell-products/next-code', params: count > 1 ? { count } : undefined }) } export function fetchMaxPassageProductSeq(productCode: string, passages: string[]) { const normalized = [...new Set(passages.map((p) => p.trim()).filter(Boolean))] return request.get<{ maxSeq?: number nextSeq?: number maxSeqByPassage?: Record nextSeqByPassage?: Record }>({ url: '/web/admin/cell-products/max-passage-seq', params: { productCode: productCode.trim(), passages: normalized.join(',') } }) } export function fetchMaxProductSuffixSeq(productCode: string) { return request.get<{ maxSeq?: number; nextSeq?: number }>({ url: '/web/admin/cell-products/max-suffix-seq', params: { productCode: productCode.trim() } }) } export function fetchCheckCellProductCode(productCode: string, excludeId?: string) { return request.get<{ exists?: boolean; productCode?: string }>({ url: '/web/admin/cell-products/check-code', params: { productCode: productCode.trim(), ...(excludeId ? { excludeId } : {}) } }) } export function fetchCellProductChain(productId: string) { return request.get({ url: `/web/admin/cell-products/${productId}/chain` }) } export type CellProductLineageQcTask = { id?: string taskNo?: string itemName?: string itemCode?: string taskType?: string taskStatus?: string taskStatusLabel?: string conclusion?: string conclusionLabel?: string remark?: string completedTime?: string companyName?: string results?: Array<{ paramName?: string; paramValue?: string; paramUnit?: string }> attachmentFiles?: Array<{ fileName?: string; fileUrl?: string; fileType?: string }> } export type CellProductLineageQcWorkOrder = { id?: string workOrderNo?: string workOrderType?: string workOrderStatus?: string workOrderStatusLabel?: string tasks?: CellProductLineageQcTask[] } export type CellProductLineageQcNode = { nodeType?: 'sample' | 'cell_product' | string id?: string label?: string productName?: string passage?: string | null receptionSource?: string | null receptionSourceLabel?: string | null isCurrent?: boolean workOrders?: CellProductLineageQcWorkOrder[] } export type CellProductLineageQc = { productId?: string productCode?: string productName?: string nodes?: CellProductLineageQcNode[] } export function fetchCellProductLineageQc(productId: string) { return request.get({ url: `/web/admin/cell-products/${productId}/lineage-qc` }) }