117 lines
3.8 KiB
TypeScript
117 lines
3.8 KiB
TypeScript
import type { QcWorkOrder } from '@/api/qc-work-order'
|
||
import { isTemporaryQcFromProduction } from '@/utils/qc-work-order-groups'
|
||
import type { TagType } from '@/utils/status-tag-registry'
|
||
import {
|
||
resolveTabKeyFromWorkOrder,
|
||
type QcWorkOrderTabKey,
|
||
getQcWorkOrderTab,
|
||
QC_WORK_ORDER_VISIBLE_TABS
|
||
} from '@/utils/qc-work-order-tabs'
|
||
|
||
/** 「所有」Tab 内质检类型子筛选(不含 all / hidden clinical) */
|
||
export type QcWorkOrderCategoryKey = Exclude<
|
||
QcWorkOrderTabKey,
|
||
'all' | 'outbound_clinical_application'
|
||
>
|
||
|
||
export const QC_WORK_ORDER_CATEGORY_OPTIONS: { key: QcWorkOrderCategoryKey; label: string }[] =
|
||
QC_WORK_ORDER_VISIBLE_TABS.filter((t) => t.key !== 'all').map((t) => ({
|
||
key: t.key as QcWorkOrderCategoryKey,
|
||
label: t.label.replace(/质检$/, '')
|
||
}))
|
||
|
||
const CATEGORY_LABELS: Record<QcWorkOrderCategoryKey, string> = {
|
||
inbound_cell_storage: '细胞存储',
|
||
inbound_research_donation: '科研捐赠',
|
||
outbound_pilot_service: '中试服务',
|
||
outbound_basic_experiment: '基础实验',
|
||
temporary: '临时'
|
||
}
|
||
|
||
const CATEGORY_TAG_TYPES: Record<QcWorkOrderCategoryKey, TagType> = {
|
||
inbound_cell_storage: 'primary',
|
||
inbound_research_donation: 'primary',
|
||
outbound_pilot_service: 'info',
|
||
outbound_basic_experiment: 'info',
|
||
temporary: 'warning'
|
||
}
|
||
|
||
export function resolveWorkOrderCategoryKey(row: {
|
||
workOrderType?: string
|
||
receptionSource?: string
|
||
bizType?: string
|
||
}): QcWorkOrderCategoryKey {
|
||
const tabKey = resolveTabKeyFromWorkOrder(row)
|
||
if (tabKey === 'outbound_clinical_application') return 'outbound_pilot_service'
|
||
return tabKey as QcWorkOrderCategoryKey
|
||
}
|
||
|
||
export function qcWorkOrderCategoryLabel(row: QcWorkOrder): string {
|
||
return CATEGORY_LABELS[resolveWorkOrderCategoryKey(row)] || '—'
|
||
}
|
||
|
||
export function qcWorkOrderCategoryTagType(row: QcWorkOrder): TagType {
|
||
return CATEGORY_TAG_TYPES[resolveWorkOrderCategoryKey(row)] || 'info'
|
||
}
|
||
|
||
/** 「所有」Tab 工单来源筛选项 value(含临时专用值) */
|
||
export const QC_ALL_TAB_TRIGGER_SOURCE_OPTIONS = [
|
||
{ label: '样本接收', value: 'reception' },
|
||
{ label: '计划质检', value: 'schedule' },
|
||
{ label: '生产过程', value: 'production' },
|
||
{ label: '生产派发', value: 'temp_production' },
|
||
{ label: '手动创建', value: 'temp_manual' }
|
||
] as const
|
||
|
||
export type QcAllTabTriggerSource = (typeof QC_ALL_TAB_TRIGGER_SOURCE_OPTIONS)[number]['value']
|
||
|
||
export function toAllTabListQuery(categoryKey: string) {
|
||
const key = (categoryKey || '').trim()
|
||
if (!key) {
|
||
return {
|
||
workOrderType: undefined as string | undefined,
|
||
receptionSource: undefined as string | undefined,
|
||
bizType: undefined as string | undefined
|
||
}
|
||
}
|
||
const tab = getQcWorkOrderTab(key)
|
||
if (!tab || tab.key === 'all') {
|
||
return {
|
||
workOrderType: undefined,
|
||
receptionSource: undefined,
|
||
bizType: undefined
|
||
}
|
||
}
|
||
return {
|
||
workOrderType: tab.workOrderType,
|
||
receptionSource: tab.receptionSource,
|
||
bizType: tab.bizType
|
||
}
|
||
}
|
||
|
||
export function workOrderMatchesCategory(row: QcWorkOrder, categoryKey: string): boolean {
|
||
const key = (categoryKey || '').trim()
|
||
if (!key) return true
|
||
return resolveWorkOrderCategoryKey(row) === key
|
||
}
|
||
|
||
export function matchesAllTabTriggerSource(row: QcWorkOrder, value?: string): boolean {
|
||
const filterValue = (value || '').trim()
|
||
if (!filterValue) return true
|
||
const wt = row.workOrderType || 'inbound'
|
||
const ts = row.triggerSource || 'reception'
|
||
if (filterValue === 'reception' || filterValue === 'schedule') {
|
||
return ts === filterValue
|
||
}
|
||
if (filterValue === 'production') {
|
||
return wt !== 'temporary' && ts === 'production'
|
||
}
|
||
if (filterValue === 'temp_production') {
|
||
return wt === 'temporary' && isTemporaryQcFromProduction(row)
|
||
}
|
||
if (filterValue === 'temp_manual') {
|
||
return wt === 'temporary' && !isTemporaryQcFromProduction(row)
|
||
}
|
||
return ts === filterValue
|
||
}
|