feat(finance): 积分钱包操作 + 客服「确认履约」闭环
把「配置 → 待办 → 确认履约 → 扣额度 → 写成本快照」整条链路打通, 客服点一下就完成履约,不需要填复杂的东西。 积分钱包(P1.3): - platform-credit-service.ts:充值 / 调整 / 消耗 / 流水查询。 - 三平台积分互不通用,每客服每平台一个账户;余额只能由流水产生, 消耗不足直接拒绝(409),不允许负余额,与备用金口径一致。 - 换算率按平台:南航、乐玩 1 积分 = 1 分,ROCK 1 积分 = 1 元。 - 充值 / 调整只对 admin/operator/finance 开放;客服只能看自己的钱包。 - 备用金现金不在这里,走现有 fund_* 链路。 确认履约(P1.4): - manual-fulfillment-service.ts:待办列表 + 确认履约。 - 待办口径:order_items.fulfillment_mode='manual' 且已配 fulfillment_config_id。 人工单**不建 fulfillment_tasks**——那是自动发货通道的体系,人工单历来不走它 (本地 102,955 个人工单的任务行数为 0)。 - 「已履约」判定:该订单项存在有效 manual_case 成本快照。 - 固定成本(消耗积分 > 0)→ 零输入;成本不固定(= 0)→ 只填实际成本金额。 - 确认时:积分平台扣积分钱包、备用金现金走 writeFundExpense, 随后写 actual 成本快照(主体 = 积分流水 id 或备用金支出单 id)。 - 渠道与消耗积分永远提前配好,客服不选;重复履约直接拒绝。 前端: - 新增「人工履约」页(客服菜单):待确认 / 已履约 / 全部,确认履约弹窗。 - 备用金页新增「平台积分」Tab(客服端与管理端各一份): 余额卡片、积分流水、管理员充值与调整。 E2E 实测:配置 ROCK 100 积分 → 成本 ¥100.00(1 积分 = 1 元);充值 5000 积分 = ¥5000;确认履约后积分 5000 → 4900,成本快照 actual ¥100.00 写入; 重复履约被拒绝。测试数据已清理,登记表保留 357 条扫描结果供运营使用。 校验:后端 765 项 / 0 失败,前端 143 项全通过(含 tsc -b 与 build)。 Co-Authored-By: Claude Opus 4.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.5
parent
4bcb4e6b57
commit
d07d88e25c
@@ -12,7 +12,11 @@ import type {
|
||||
CostVersion,
|
||||
CostVersionListResult,
|
||||
ManualFulfillmentConfig,
|
||||
ManualFulfillmentConfirmResult,
|
||||
ManualFulfillmentPendingListResult,
|
||||
ManualPlatformOption,
|
||||
PlatformCreditAccountListResult,
|
||||
PlatformCreditEntryListResult,
|
||||
ManualRematchResult,
|
||||
ManualSkuListResult,
|
||||
ManualSkuOverview,
|
||||
@@ -283,3 +287,87 @@ export function deleteAdminManualConfig(skuKey: string) {
|
||||
export function rematchAdminManualFulfillments(payload: { skuKey?: string } = {}) {
|
||||
return apiPost<ManualRematchResult>('/api/v1/admin/cost-center/manual-configs/rematch', payload)
|
||||
}
|
||||
|
||||
/**
|
||||
* 客服平台积分钱包(南航 / 乐玩 / ROCK)。
|
||||
* 三平台积分互不通用,每客服每平台一个账户;备用金现金走备用金页。
|
||||
*/
|
||||
export function fetchAdminPlatformCreditAccounts() {
|
||||
return apiGet<PlatformCreditAccountListResult>(
|
||||
'/api/v1/admin/cost-center/platform-credits/accounts',
|
||||
)
|
||||
}
|
||||
|
||||
export function fetchAdminPlatformCreditEntries(
|
||||
params: {
|
||||
page?: number
|
||||
pageSize?: number
|
||||
platformKey?: string
|
||||
entryType?: string
|
||||
keyword?: string
|
||||
} = {},
|
||||
) {
|
||||
return apiGet<PlatformCreditEntryListResult>(
|
||||
'/api/v1/admin/cost-center/platform-credits/entries',
|
||||
params,
|
||||
)
|
||||
}
|
||||
|
||||
export function grantAdminPlatformCredit(payload: {
|
||||
ownerAdminUserId: number
|
||||
platformKey: string
|
||||
quantity: number
|
||||
platformRef?: string
|
||||
note?: string
|
||||
}) {
|
||||
return apiPost<{
|
||||
accountId: number
|
||||
platformKey: string
|
||||
quantity: number
|
||||
balanceAfter: number
|
||||
amountFen: number
|
||||
entryId: number
|
||||
}>('/api/v1/admin/cost-center/platform-credits/grant', payload)
|
||||
}
|
||||
|
||||
export function adjustAdminPlatformCredit(payload: {
|
||||
ownerAdminUserId: number
|
||||
platformKey: string
|
||||
quantity: number
|
||||
note?: string
|
||||
}) {
|
||||
return apiPost<{
|
||||
accountId: number
|
||||
platformKey: string
|
||||
quantity: number
|
||||
balanceAfter: number
|
||||
amountFen: number
|
||||
entryId: number
|
||||
}>('/api/v1/admin/cost-center/platform-credits/adjust', payload)
|
||||
}
|
||||
|
||||
/**
|
||||
* 人工履约待办与确认履约。
|
||||
* 客服点「确认履约」即扣额度 + 写成本快照;固定成本零输入,
|
||||
* 成本不固定时只填金额。
|
||||
*/
|
||||
export function fetchAdminManualFulfillmentPending(
|
||||
params: { page?: number; pageSize?: number; keyword?: string; status?: string } = {},
|
||||
) {
|
||||
return apiGet<ManualFulfillmentPendingListResult>(
|
||||
'/api/v1/admin/finance/manual-fulfillment/pending',
|
||||
params,
|
||||
)
|
||||
}
|
||||
|
||||
export function confirmAdminManualFulfillment(payload: {
|
||||
orderItemId: number
|
||||
costFen?: number
|
||||
payeeName?: string
|
||||
note?: string
|
||||
}) {
|
||||
return apiPost<ManualFulfillmentConfirmResult>(
|
||||
'/api/v1/admin/finance/manual-fulfillment/confirm',
|
||||
payload,
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user