feat: 支持退出后补告衣物处理结果
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
// 衣物处理状态语义的单一事实来源。
|
||||
//
|
||||
// 后端 image_process_status:1=抠图中 2=分类中 3=排队中 4=成功 5=失败,
|
||||
// 列表与详情响应都会带出(老响应无该字段时做降级推断)。
|
||||
// 这里把「状态 → 标识文案与样式」的判定收敛到一处,避免同一语义在衣橱、
|
||||
// 衣物详情、上传页各写一遍 if-else 而逐渐分叉。
|
||||
//
|
||||
// 零彩色纪律下的映射:需要用户关注的失败 = 实心黑标识(ink);中性处理中 = 玻璃灰标识(plain)。
|
||||
import { ProcessStatus } from './config'
|
||||
|
||||
export interface ClothesStatusLike {
|
||||
image_process_status?: number
|
||||
category_main?: string
|
||||
processed_image?: string
|
||||
}
|
||||
|
||||
export interface ClothesStatusFlag {
|
||||
text: string
|
||||
type: '' | 'plain' | 'ink'
|
||||
}
|
||||
|
||||
// 处理中:排队中 / 抠图中 / 分类中。
|
||||
// 老响应无状态字段时沿用旧推断:既无属性也无抠图结果,视为仍在处理。
|
||||
export function isProcessing(c: ClothesStatusLike): boolean {
|
||||
const status = Number(c.image_process_status)
|
||||
if (
|
||||
status === ProcessStatus.QUEUED ||
|
||||
status === ProcessStatus.MATTING ||
|
||||
status === ProcessStatus.CLASSIFYING
|
||||
) {
|
||||
return true
|
||||
}
|
||||
if (!status && !c.category_main && !c.processed_image) return true
|
||||
return false
|
||||
}
|
||||
|
||||
// 处理失败:后端已确认失败(该路径下额度已自动退回)
|
||||
export function isProcessFailed(c: ClothesStatusLike): boolean {
|
||||
return Number(c.image_process_status) === ProcessStatus.FAILED
|
||||
}
|
||||
|
||||
// 终态:成功或失败,无需继续轮询
|
||||
export function isProcessTerminal(c: ClothesStatusLike): boolean {
|
||||
const status = Number(c.image_process_status)
|
||||
return status === ProcessStatus.SUCCESS || status === ProcessStatus.FAILED
|
||||
}
|
||||
|
||||
// 列表标识:处理失败(实心,需用户关注)> 处理中(玻璃,中性)> 无
|
||||
export function clothesStatusFlag(c: ClothesStatusLike): ClothesStatusFlag {
|
||||
if (isProcessFailed(c)) return { text: '处理失败', type: 'ink' }
|
||||
if (isProcessing(c)) return { text: 'AI 处理中', type: 'plain' }
|
||||
return { text: '', type: '' }
|
||||
}
|
||||
Reference in New Issue
Block a user