merge: 合并 main 并保留寄卖内部匹配与客户退款

This commit is contained in:
2026-11-05 18:02:47 +08:00
105 changed files with 7248 additions and 665 deletions
+3
View File
@@ -225,6 +225,7 @@ export function resolveOrderFulfillmentMode(row: {
| 'affiliate_dash'
| 'third_party_voucher'
| 'manual'
| 'on_account'
| 'pending'
| 'archived'
| 'mixed'
@@ -240,6 +241,8 @@ export function resolveOrderFulfillmentMode(row: {
return { label: '🗄 历史归档', color: 'default' }
case 'manual':
return { label: '🙋 人工履约', color: 'orange' }
case 'on_account':
return { label: '统一结算', color: 'gold' }
case 'mixed':
return { label: '🔀 混合履约', color: 'geekblue' }
default:
+1
View File
@@ -34,6 +34,7 @@ export const adminOrderFulfillmentModeOptions = [
{ label: '接单平台', value: 'work_order' },
{ label: '第三方卡券', value: 'third_party_voucher' },
{ label: '人工履约', value: 'manual' },
{ label: '统一结算', value: 'on_account' },
{ label: '混合履约', value: 'mixed' },
{ label: '待判定', value: 'pending' },
{ label: '历史归档', value: 'archived' },
@@ -0,0 +1,16 @@
/** 分 → 元,用于统一展示积分换算率。 */
export function formatCreditUnitPriceYuan(value: number | string | null | undefined) {
const fen = Number(value)
return `${(Number.isFinite(fen) ? fen / 100 : 0).toFixed(2)}元`
}
export function formatCreditUnitPriceLabel(value: number | string | null | undefined) {
return `1积分=${formatCreditUnitPriceYuan(value)}`
}
/** 配置金额最多 2 位小数,去掉无意义的尾随 0。 */
export function formatCreditQuantity(value: number | string | null | undefined) {
const quantity = Number(value)
if (!Number.isFinite(quantity)) return '0'
return String(Number(quantity.toFixed(2)))
}
+10 -11
View File
@@ -2,22 +2,21 @@ import { message } from 'antd'
import type { WorkOrderVoucherConsumeResult } from '@/services/admin/consignment'
/**
* 电子凭证核销结果必须如实反馈:核销失败时后端已经改完状态,但凭证没消耗,
* 之前有调用方无条件弹"成功",运营会以为凭证已核销而漏掉人工处理。
* 统一出口:所有履约/指派/手动匹配的调用方都用这一个,避免文案与口径各自漂移。
*/
export function notifyVoucherConsume(voucherConsume?: WorkOrderVoucherConsumeResult) {
if (!voucherConsume || voucherConsume.ok) {
if (voucherConsume?.alreadyConsumedCount) {
message.info(`电子凭证已提前核销 ${voucherConsume.alreadyConsumedCount} 张,本次未重复核销`)
}
if (!voucherConsume) return
if (voucherConsume.queuedCount > 0) {
message.success(`自动核销已排队 ${voucherConsume.queuedCount} 个任务`)
return
}
if (voucherConsume.status === 'already_scheduled') {
message.info('核销任务已在队列中,本次未重复安排')
return
}
if (voucherConsume.ok) return
message.warning({
content: `状态已变更,但电子凭证核销失败:${
content: `状态已变更,但自动核销未安排成功:${
voucherConsume.errorMessage || '未知错误'
}。请到「抖音券核销」或快手电子凭证后台人工核销后再发货`,
}。请在核销任务或平台券后台人工处理`,
duration: 8,
})
}