Files
zkxw/web-admin/src/utils/qc-work-order-groups.ts
T
2026-06-16 19:24:53 +08:00

98 lines
3.2 KiB
TypeScript

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<string, QcWorkOrder[]>()
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<string, QcWorkOrder[]>()
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
}