买家退款时应能把现货退回仓库继续匹配;卖家押金只在客服显式选择扣除时才没收。 Co-authored-by: Cursor <cursoragent@cursor.com>
86 lines
3.5 KiB
TypeScript
86 lines
3.5 KiB
TypeScript
/**
|
|
* 寄卖撤销时的押金处置策略。
|
|
*
|
|
* 撤销寄售履约会牵动两笔钱:接单打手的履约押金、寄卖卖家的发布押金。
|
|
* 默认都由规则自动判定(`auto`),运营也可以显式覆盖;覆盖时必须填撤销原因,
|
|
* 便于事后对账和追责。
|
|
*/
|
|
|
|
export const WORKER_DEPOSIT_HANDLING = {
|
|
/** 按规则自动:全额退还。要扣除必须显式选择 forfeit */
|
|
AUTO: 'auto',
|
|
REFUND: 'refund',
|
|
FORFEIT: 'forfeit',
|
|
} as const
|
|
|
|
export const CONSIGNMENT_DEPOSIT_HANDLING = {
|
|
/** 按规则自动:作废退还、回库继续冻结。买家退款不因加过好友而没收,要扣必须显式选择 forfeit */
|
|
AUTO: 'auto',
|
|
/** 保持冻结(既不退还也不没收,留给后续人工处理) */
|
|
KEEP_FROZEN: 'keep_frozen',
|
|
FORFEIT: 'forfeit',
|
|
} as const
|
|
|
|
export type WorkerDepositHandling =
|
|
(typeof WORKER_DEPOSIT_HANDLING)[keyof typeof WORKER_DEPOSIT_HANDLING]
|
|
export type ConsignmentDepositHandling =
|
|
(typeof CONSIGNMENT_DEPOSIT_HANDLING)[keyof typeof CONSIGNMENT_DEPOSIT_HANDLING]
|
|
|
|
/** 打手履约押金的最终处置动作 */
|
|
export type WorkerDepositMode = 'release' | 'forfeit'
|
|
/** 卖家发布押金的最终处置动作;keep_frozen 表示本次不动这笔押金 */
|
|
export type ConsignmentDepositAction = 'release' | 'forfeit' | 'keep_frozen'
|
|
|
|
export function normalizeWorkerDepositHandling(value: unknown): WorkerDepositHandling {
|
|
const raw = String(value ?? '').trim()
|
|
if (raw === WORKER_DEPOSIT_HANDLING.REFUND) return WORKER_DEPOSIT_HANDLING.REFUND
|
|
if (raw === WORKER_DEPOSIT_HANDLING.FORFEIT) return WORKER_DEPOSIT_HANDLING.FORFEIT
|
|
return WORKER_DEPOSIT_HANDLING.AUTO
|
|
}
|
|
|
|
export function normalizeConsignmentDepositHandling(value: unknown): ConsignmentDepositHandling {
|
|
const raw = String(value ?? '').trim()
|
|
if (raw === CONSIGNMENT_DEPOSIT_HANDLING.KEEP_FROZEN) {
|
|
return CONSIGNMENT_DEPOSIT_HANDLING.KEEP_FROZEN
|
|
}
|
|
if (raw === CONSIGNMENT_DEPOSIT_HANDLING.FORFEIT) return CONSIGNMENT_DEPOSIT_HANDLING.FORFEIT
|
|
return CONSIGNMENT_DEPOSIT_HANDLING.AUTO
|
|
}
|
|
|
|
/**
|
|
* 打手履约押金:`auto` 与 `refund` 都全额退还。
|
|
* 已确认加好友不再自动没收;要扣必须显式选择 `forfeit`。
|
|
*/
|
|
export function resolveWorkerDepositMode(handling: unknown): WorkerDepositMode {
|
|
const normalized = normalizeWorkerDepositHandling(handling)
|
|
if (normalized === WORKER_DEPOSIT_HANDLING.FORFEIT) return 'forfeit'
|
|
return 'release'
|
|
}
|
|
|
|
/**
|
|
* 卖家发布押金:`auto` 只看现货去向,不看是否加过好友。
|
|
* 作废(货不再挂卖)退还,回库(继续挂卖)保持冻结。买家退款走回库时不扣卖家押金。
|
|
* 要扣除必须显式选择 `forfeit`。
|
|
*/
|
|
export function resolveConsignmentDepositAction(
|
|
handling: unknown,
|
|
input: { archive: boolean },
|
|
): ConsignmentDepositAction {
|
|
const normalized = normalizeConsignmentDepositHandling(handling)
|
|
if (normalized === CONSIGNMENT_DEPOSIT_HANDLING.KEEP_FROZEN) return 'keep_frozen'
|
|
if (normalized === CONSIGNMENT_DEPOSIT_HANDLING.FORFEIT) return 'forfeit'
|
|
return input.archive ? 'release' : 'keep_frozen'
|
|
}
|
|
|
|
/** 显式覆盖了押金处置(非 auto)时必须留原因。 */
|
|
export function isDepositHandlingOverridden(input: {
|
|
workerDeposit?: unknown
|
|
consignmentDeposit?: unknown
|
|
}): boolean {
|
|
return (
|
|
normalizeWorkerDepositHandling(input.workerDeposit) !== WORKER_DEPOSIT_HANDLING.AUTO ||
|
|
normalizeConsignmentDepositHandling(input.consignmentDeposit) !==
|
|
CONSIGNMENT_DEPOSIT_HANDLING.AUTO
|
|
)
|
|
}
|