import type { QcWorkOrder } from '@/api/qc-work-order' export type QcWorkOrderSampleGroupModel = { groupKey: string /** 入库:样本编码;出库:申请单号等分组主标题 */ sampleCode: string groupTitle?: string workOrders: QcWorkOrder[] } function triggerSortWeight(row: QcWorkOrder) { const ts = row.triggerSource || 'reception' if (ts === 'production') return 1 return 0 } function sortWorkOrdersInGroup(rows: QcWorkOrder[]) { return [...rows].sort((a, b) => { const byTrigger = triggerSortWeight(a) - triggerSortWeight(b) if (byTrigger !== 0) return byTrigger return String(a.createTime || '').localeCompare(String(b.createTime || '')) }) } /** 入库 Tab:按样本编码分组(前端分组,分页仍按工单条数) */ export function groupInboundQcWorkOrders(rows: QcWorkOrder[]): QcWorkOrderSampleGroupModel[] { const map = new Map() for (const row of rows) { const key = (row.sampleCode || '').trim() || row.id const list = map.get(key) if (list) list.push(row) else map.set(key, [row]) } return Array.from(map.entries()).map(([groupKey, workOrders]) => { const sorted = sortWorkOrdersInGroup(workOrders) return { groupKey, sampleCode: sorted[0]?.sampleCode || '', workOrders: sorted } }) } /** 出库 Tab:按输注计划分组 */ export function groupOutboundQcWorkOrders(rows: QcWorkOrder[]): QcWorkOrderSampleGroupModel[] { const map = new Map() for (const row of rows) { const key = (row.infusionScheduleId || '').trim() || row.id const list = map.get(key) if (list) list.push(row) else map.set(key, [row]) } return Array.from(map.entries()).map(([groupKey, workOrders]) => { const sorted = sortWorkOrdersInGroup(workOrders) const head = sorted[0] const groupTitle = (head?.applicationNo || head?.workOrderNo || groupKey).trim() return { groupKey, sampleCode: groupTitle, groupTitle, workOrders: sorted } }) } export function triggerSourceTabLabel(row: QcWorkOrder) { if (row.triggerSourceLabel) return row.triggerSourceLabel const ts = row.triggerSource || 'reception' if (ts === 'production') return '生产过程' if (ts === 'schedule') return '计划质检' return '样本接收' } export function isGateTriggerSource(source?: string | null) { const ts = (source || 'reception').trim() return ts === 'reception' || ts === 'schedule' } /** 临时质检:是否由生产工单派发 */ export function isTemporaryQcFromProduction(row: QcWorkOrder) { return (row.triggerSource || '') === 'production' || !!(row.productionWorkOrderId || '').trim() } export function temporaryQcSourceLabel(row: QcWorkOrder) { return isTemporaryQcFromProduction(row) ? '生产派发' : '手动创建' } export function temporaryQcSourceTagType(row: QcWorkOrder): 'warning' | 'info' { return isTemporaryQcFromProduction(row) ? 'warning' : 'info' } export function matchesTemporaryQcSourceFilter(row: QcWorkOrder, filterValue?: string) { if (!filterValue) return true if (filterValue === 'production') return isTemporaryQcFromProduction(row) if (filterValue === 'manual') return !isTemporaryQcFromProduction(row) return (row.triggerSource || '') === filterValue }