Files
zkxw/web-admin/src/api/cell-product.ts
T
zlwuandCursor 33c4408557 feat: expose lineage QC API and wire viewer in outbound material dialog
Add GET /cell-products/{id}/lineage-qc, frontend client, readonly dialog,
and a 查看质检 action on outbound cell rows.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-29 09:55:51 +08:00

130 lines
3.5 KiB
TypeScript

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<any>({ url: `/web/admin/cell-products/${id}` })
}
export function fetchCreateCellProduct(data: Record<string, any>) {
return request.post({ url: '/web/admin/cell-products', params: data })
}
export function fetchUpdateCellProduct(id: string, data: Record<string, any>) {
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<string, number>
nextSeqByPassage?: Record<string, number>
}>({
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<any>({ 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<CellProductLineageQc>({
url: `/web/admin/cell-products/${productId}/lineage-qc`
})
}