98 lines
3.2 KiB
TypeScript
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
|
|
}
|