feat(claim): 支持固定H5订单号领取与订单兑换有效性后台控制
- 数据库新增 099_order_claim_status.sql 迁移,扩展 claim_status、claim_status_reason 等字段 - 后端新增 /claims/h5/:orderNo、UID提交、分销提交接口,保留原有 token 接口双轨兼容 - 增加兑换有效性强拦截:暂停/关闭/退款/取消订单精准阻断并返回友好提示 - 后台新增 POST /admin/orders/:orderId/claim-status 接口与审计日志记录 - 前端管理后台(订单列表、详情页)支持 H5 兑换状态展示、一键复制链接及暂停/关闭/启用弹窗 - 前端领取页面适配 /h5/:orderNo 路由及暂停/关闭等状态的异常展示 - 验证方式:运行前后端类型检查、全量单元测试(后端 674、前端 132)及全量构建编译均通过
This commit is contained in:
@@ -9,6 +9,7 @@ import type {
|
||||
import type { OrderListQueryResult, OrderListRow, OrderRow } from '../types/repository/rows.js'
|
||||
import { isPlatformOrderIdLookupKeyword } from '../utils/platform-order-id.js'
|
||||
import { safeJsonStringify, sanitizeWellFormedUnicode } from '../utils/json.js'
|
||||
import { nowIso } from '../utils/time.js'
|
||||
|
||||
export type OrderQueryExecutor = <T extends QueryResultRow = QueryResultRow>(
|
||||
text: string,
|
||||
@@ -409,3 +410,34 @@ function appendProviderFilter(filters: string[], params: unknown[], provider: st
|
||||
params.push(provider)
|
||||
filters.push(`(o.provider = $${params.length} OR o.platform = $${params.length})`)
|
||||
}
|
||||
|
||||
export async function updateOrderClaimStatus(
|
||||
orderId: number | string,
|
||||
input: {
|
||||
claimStatus: 'active' | 'paused' | 'closed'
|
||||
reason?: string
|
||||
updatedAt?: string
|
||||
},
|
||||
): Promise<OrderRow | null> {
|
||||
const updatedAt = input.updatedAt || nowIso()
|
||||
const result = await query<OrderRow>(
|
||||
`
|
||||
UPDATE orders
|
||||
SET
|
||||
claim_status = $1,
|
||||
claim_status_reason = $2,
|
||||
claim_status_updated_at = $3,
|
||||
updated_at = $3
|
||||
WHERE id = $4
|
||||
RETURNING *
|
||||
`,
|
||||
[
|
||||
input.claimStatus,
|
||||
String(input.reason || '').trim(),
|
||||
updatedAt,
|
||||
Number(orderId),
|
||||
],
|
||||
)
|
||||
return result.rows[0] || null
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user