gongxiangp2/lib/task-detail-full-set.ts
chenpei 4712175cb0 feat(素材链路): 发布白底图双轨与AI生图回传能力
- 完成白底图 WebP 双轨接口、上传链路与预览缓存改造
- 新增 AI 生图平台成品回传接口、任务状态与表单规则
- 补齐 AI 生成标签、任务详情补全、相关测试与对接文档
2026-03-25 10:28:02 +08:00

90 lines
2.1 KiB
TypeScript

import { isProductPackageType } from '@/lib/material-type-mapper'
type TaskDetailAssetLike = {
assetType?: string | null
}
type TaskDetailUploadGroups = {
main?: ArrayLike<unknown> | null
sku?: ArrayLike<unknown> | null
detail?: ArrayLike<unknown> | null
}
const TASK_DETAIL_FULL_SET_GROUPS = {
main: new Set(['main-preview', 'main']),
sku: new Set(['sku-preview', 'sku']),
detail: new Set(['detail-preview', 'detail']),
} as const
function hasUploadItems(items: ArrayLike<unknown> | null | undefined): boolean {
return Boolean(items && typeof items.length === 'number' && items.length > 0)
}
export function isTaskDetailFullSetFromUploadGroups(
groups: TaskDetailUploadGroups | null | undefined,
): boolean {
return (
hasUploadItems(groups?.main) &&
hasUploadItems(groups?.sku) &&
hasUploadItems(groups?.detail)
)
}
export function isTaskDetailFullSetFromAssetTypes(
assetTypes: Array<string | null | undefined>,
): boolean {
let hasMain = false
let hasSku = false
let hasDetail = false
for (const assetType of assetTypes) {
if (!assetType) {
continue
}
if (TASK_DETAIL_FULL_SET_GROUPS.main.has(assetType as 'main-preview' | 'main')) {
hasMain = true
}
if (TASK_DETAIL_FULL_SET_GROUPS.sku.has(assetType as 'sku-preview' | 'sku')) {
hasSku = true
}
if (TASK_DETAIL_FULL_SET_GROUPS.detail.has(assetType as 'detail-preview' | 'detail')) {
hasDetail = true
}
if (hasMain && hasSku && hasDetail) {
return true
}
}
return false
}
export function isTaskDetailFullSetFromAssets(
assets: TaskDetailAssetLike[] | null | undefined,
): boolean {
if (!Array.isArray(assets) || assets.length === 0) {
return false
}
return isTaskDetailFullSetFromAssetTypes(assets.map((asset) => asset?.assetType))
}
export function deriveTaskDetailIsFullSet(
materialType: string | null | undefined,
assets: TaskDetailAssetLike[] | null | undefined,
fallback = false,
): boolean {
if (!isProductPackageType(materialType || '')) {
return false
}
if (Array.isArray(assets)) {
return isTaskDetailFullSetFromAssets(assets)
}
return Boolean(fallback)
}