feat(M08-A): 接入权益和余额下单抵扣
This commit is contained in:
@@ -19,6 +19,7 @@ interface PaymentRow extends RowDataPacket {
|
||||
paidAmountCents: number;
|
||||
totalAmountCents: number;
|
||||
orderStatus: string;
|
||||
userId?: string;
|
||||
}
|
||||
|
||||
interface RefundRow extends RowDataPacket {
|
||||
@@ -419,44 +420,17 @@ export class WechatPaymentService {
|
||||
);
|
||||
return;
|
||||
}
|
||||
await connection.execute(
|
||||
`UPDATE qipai_payments
|
||||
SET status = 'SUCCEEDED', provider_payment_id = ?,
|
||||
paid_at = UTC_TIMESTAMP(3), raw_notify = JSON_OBJECT('verified', TRUE)
|
||||
WHERE tenant_id = ? AND id = ? AND status = 'PENDING'`,
|
||||
[transactionId, payment.tenantId, payment.id]
|
||||
);
|
||||
await connection.execute(
|
||||
`UPDATE qipai_orders SET paid_amount_cents = paid_amount_cents + ?
|
||||
WHERE tenant_id = ? AND id = ?`,
|
||||
[payment.amountCents, payment.tenantId, payment.orderId]
|
||||
);
|
||||
const nextPaid = Number(payment.paidAmountCents) + Number(payment.amountCents);
|
||||
if (nextPaid >= Number(payment.totalAmountCents)
|
||||
&& payment.orderStatus === 'PENDING_PAYMENT') {
|
||||
await connection.execute(
|
||||
`UPDATE qipai_orders
|
||||
SET status = 'PAID', status_version = status_version + 1,
|
||||
status_updated_at = UTC_TIMESTAMP(3)
|
||||
WHERE tenant_id = ? AND id = ?`,
|
||||
[payment.tenantId, payment.orderId]
|
||||
);
|
||||
await connection.execute(
|
||||
`UPDATE qipai_room_reservations
|
||||
SET status = 'CONSUMED', expires_at = GREATEST(expires_at, ends_at)
|
||||
WHERE tenant_id = ? AND order_id = ? AND status = 'HELD'`,
|
||||
[payment.tenantId, payment.orderId]
|
||||
);
|
||||
await connection.execute(
|
||||
`INSERT INTO qipai_order_status_history
|
||||
(tenant_id, order_id, from_status, to_status, action, actor_type,
|
||||
actor_id, source, reason, trace_id, metadata)
|
||||
VALUES (?, ?, 'PENDING_PAYMENT', 'PAID', 'CONFIRM_PAYMENT', 'SYSTEM',
|
||||
NULL, 'PAYMENT', 'Verified Wechat payment callback', ?,
|
||||
JSON_OBJECT('paymentId', ?))`,
|
||||
[payment.tenantId, payment.orderId, traceId, payment.id]
|
||||
);
|
||||
}
|
||||
const userId = await this.loadOrderUserId(connection, payment.tenantId, payment.orderId);
|
||||
await this.paymentRepository.applyPaymentSuccess(connection, {
|
||||
paymentId: payment.id,
|
||||
orderId: payment.orderId,
|
||||
tenantId: payment.tenantId,
|
||||
userId,
|
||||
amountCents: Number(payment.amountCents),
|
||||
providerPaymentId: transactionId,
|
||||
traceId,
|
||||
reason: 'Verified Wechat payment callback'
|
||||
});
|
||||
await connection.execute(
|
||||
`UPDATE qipai_payment_callbacks
|
||||
SET processing_status = 'PROCESSED', processed_at = UTC_TIMESTAMP(3)
|
||||
@@ -465,6 +439,16 @@ export class WechatPaymentService {
|
||||
);
|
||||
}
|
||||
|
||||
private async loadOrderUserId(connection: PoolConnection, tenantId: string, orderId: string) {
|
||||
const [rows] = await connection.execute<RowDataPacket[]>(
|
||||
`SELECT user_id AS userId FROM qipai_order_user_access
|
||||
WHERE tenant_id = ? AND order_id = ? AND revoked_at IS NULL
|
||||
ORDER BY id LIMIT 1`,
|
||||
[tenantId, orderId]
|
||||
);
|
||||
return rows[0]?.userId ? String(rows[0].userId) : undefined;
|
||||
}
|
||||
|
||||
private async rejectCallback(
|
||||
connection: PoolConnection, tenantId: string, callbackId: string, code: string
|
||||
) {
|
||||
|
||||
Reference in New Issue
Block a user