新增好友赠送验收模式支持打手资料提交加好友冷却与模板配置
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
export const WORK_ORDER_ACCEPTANCE_MODE = {
|
||||
STANDARD: 'standard',
|
||||
FRIEND_GIFT: 'friend_gift',
|
||||
} as const
|
||||
|
||||
export type WorkOrderAcceptanceMode =
|
||||
| (typeof WORK_ORDER_ACCEPTANCE_MODE)[keyof typeof WORK_ORDER_ACCEPTANCE_MODE]
|
||||
| (string & {})
|
||||
|
||||
export const DEFAULT_GIFT_COOLDOWN_HOURS = 72
|
||||
export const MAX_GIFT_COOLDOWN_HOURS = 24 * 30
|
||||
|
||||
/** 好友赠送模式的落库阶段;gift_ready 由 gift_available_at 到点后实时计算,不落库。 */
|
||||
export const WORK_ORDER_GIFT_PHASE = {
|
||||
MATERIAL_REQUIRED: 'material_required',
|
||||
MATERIAL_SUBMITTED: 'material_submitted',
|
||||
FRIEND_COUNTDOWN: 'friend_countdown',
|
||||
GIFT_READY: 'gift_ready',
|
||||
} as const
|
||||
|
||||
export type WorkOrderGiftPhase =
|
||||
| (typeof WORK_ORDER_GIFT_PHASE)[keyof typeof WORK_ORDER_GIFT_PHASE]
|
||||
| (string & {})
|
||||
|
||||
export function normalizeWorkOrderAcceptanceMode(value: unknown): WorkOrderAcceptanceMode {
|
||||
const mode = String(value || '').trim()
|
||||
return mode === WORK_ORDER_ACCEPTANCE_MODE.FRIEND_GIFT
|
||||
? WORK_ORDER_ACCEPTANCE_MODE.FRIEND_GIFT
|
||||
: WORK_ORDER_ACCEPTANCE_MODE.STANDARD
|
||||
}
|
||||
|
||||
export function isFriendGiftAcceptanceMode(value: unknown): boolean {
|
||||
return normalizeWorkOrderAcceptanceMode(value) === WORK_ORDER_ACCEPTANCE_MODE.FRIEND_GIFT
|
||||
}
|
||||
|
||||
/** 冷却小时数收敛到 [0, 30 天],默认 3 天。 */
|
||||
export function normalizeWorkOrderGiftCooldownHours(value: unknown): number {
|
||||
const hours = Number(value)
|
||||
if (!Number.isFinite(hours) || hours <= 0) return DEFAULT_GIFT_COOLDOWN_HOURS
|
||||
return Math.min(MAX_GIFT_COOLDOWN_HOURS, Math.max(1, Math.round(hours)))
|
||||
}
|
||||
|
||||
export type WorkOrderGiftSource = {
|
||||
acceptance_mode?: string | null
|
||||
gift_phase?: string | null
|
||||
gift_available_at?: string | null
|
||||
}
|
||||
|
||||
export function isWorkOrderGiftAvailable(source: WorkOrderGiftSource): boolean {
|
||||
if (!isFriendGiftAcceptanceMode(source.acceptance_mode)) return false
|
||||
const availableAt = Date.parse(String(source.gift_available_at || ''))
|
||||
return Number.isFinite(availableAt) && availableAt <= Date.now()
|
||||
}
|
||||
|
||||
/** 返回当前赠送阶段;冷却到点后返回实时计算的 gift_ready。 */
|
||||
export function resolveWorkOrderGiftPhase(source: WorkOrderGiftSource): string {
|
||||
if (!isFriendGiftAcceptanceMode(source.acceptance_mode)) return ''
|
||||
const phase = String(source.gift_phase || '').trim()
|
||||
if (phase === WORK_ORDER_GIFT_PHASE.FRIEND_COUNTDOWN && isWorkOrderGiftAvailable(source)) {
|
||||
return WORK_ORDER_GIFT_PHASE.GIFT_READY
|
||||
}
|
||||
return phase
|
||||
}
|
||||
Reference in New Issue
Block a user