修复两个问题
This commit is contained in:
1 parent
48a82403b2
commit
58f3f42bf8
15 files changed
+173
-23
No files matched your search
@@ -714,6 +714,7 @@ class ChargeCard {
|
||||
$amount = $parsed_amount->decimal();
|
||||
$currency = 'CNY';
|
||||
} elseif ($type === self::TYPE_CREDITS) {
|
||||
$product_type = \AKSRT\Core\DomainModel::ORDER_PRODUCT_POINTS;
|
||||
$amount = (int) ($meta['points'] ?? 0);
|
||||
$currency = 'points';
|
||||
}
|
||||
|
||||
@@ -28,9 +28,9 @@ final class CommissionLedger {
|
||||
? true
|
||||
: new \WP_Error('aksrt_commission_write_failed', __('返佣记录写入失败', 'aksrt'), ['status' => 500]);
|
||||
}
|
||||
public function record_points_exchange(int $user_id, string $amount, int $points, string $operation_key): bool {
|
||||
public function record_points_exchange(int $user_id, string $amount, int $points, string $operation_key, string $order_number): bool {
|
||||
$result = $this->record_paid_order([
|
||||
'order_number' => 'PX' . substr(hash('sha256', $operation_key), 0, 30),
|
||||
'order_number' => $order_number,
|
||||
'product_type' => 'credits',
|
||||
'user_id' => $user_id,
|
||||
'amount' => $amount,
|
||||
|
||||
@@ -89,14 +89,29 @@ final class OrderCenterQuery {
|
||||
public function database_statuses(): array {
|
||||
return match ($this->status()) {
|
||||
self::STATUS_PENDING => [Order::STATUS_CREATED, Order::STATUS_PENDING],
|
||||
self::STATUS_COMPLETED => [Order::STATUS_PAID],
|
||||
self::STATUS_CLOSED => [Order::STATUS_CANCELLED, Order::STATUS_EXPIRED],
|
||||
self::STATUS_COMPLETED => [
|
||||
Order::STATUS_PAID,
|
||||
Order::STATUS_DELIVERED,
|
||||
Order::STATUS_COMPLETED,
|
||||
Order::STATUS_PENDING_REVIEW,
|
||||
],
|
||||
self::STATUS_CLOSED => [
|
||||
Order::STATUS_CANCELLED,
|
||||
Order::STATUS_EXPIRED,
|
||||
Order::STATUS_REFUNDING,
|
||||
Order::STATUS_REFUNDED,
|
||||
],
|
||||
default => [
|
||||
Order::STATUS_CREATED,
|
||||
Order::STATUS_PENDING,
|
||||
Order::STATUS_PAID,
|
||||
Order::STATUS_DELIVERED,
|
||||
Order::STATUS_COMPLETED,
|
||||
Order::STATUS_PENDING_REVIEW,
|
||||
Order::STATUS_CANCELLED,
|
||||
Order::STATUS_EXPIRED,
|
||||
Order::STATUS_REFUNDING,
|
||||
Order::STATUS_REFUNDED,
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
@@ -59,9 +59,10 @@ trait OrderRepositoryCore {
|
||||
'payment_transaction_id' => sanitize_text_field((string) ($data['payment_transaction_id'] ?? '')),
|
||||
'created_at' => $data['created_at'] ?? current_time('mysql'),
|
||||
'paid_at' => $data['paid_at'] ?? null,
|
||||
'completed_at' => $data['completed_at'] ?? null,
|
||||
'note' => $note,
|
||||
];
|
||||
$formats = ['%s', '%d', '%s', '%d', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'];
|
||||
$formats = ['%s', '%d', '%s', '%d', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'];
|
||||
|
||||
// Pending orders always receive an expiry. Explicit caller values remain
|
||||
// supported for compatibility, while new flows use the shared runtime policy.
|
||||
@@ -204,20 +205,22 @@ trait OrderRepositoryCore {
|
||||
|
||||
$parts = $this->get_user_order_query_parts($user_id, $args);
|
||||
$pending_statuses = [Order::STATUS_CREATED, Order::STATUS_PENDING];
|
||||
$paid_status = Order::STATUS_PAID;
|
||||
$completed_statuses = [Order::STATUS_PAID, Order::STATUS_DELIVERED, Order::STATUS_COMPLETED, Order::STATUS_PENDING_REVIEW];
|
||||
$completed_placeholders = implode(', ', array_fill(0, count($completed_statuses), '%s'));
|
||||
$known_statuses = OrderCenterQuery::from_array([])->database_statuses();
|
||||
$known_placeholders = implode(', ', array_fill(0, count($known_statuses), '%s'));
|
||||
$sql = "SELECT
|
||||
(SELECT COUNT(*) FROM {$this->table()} {$parts['where']}) AS filtered_total,
|
||||
COUNT(*) AS known_total,
|
||||
SUM(CASE WHEN status IN (%s, %s) THEN 1 ELSE 0 END) AS pending,
|
||||
SUM(CASE WHEN status = %s THEN 1 ELSE 0 END) AS completed
|
||||
SUM(CASE WHEN status IN ({$completed_placeholders}) THEN 1 ELSE 0 END) AS completed
|
||||
FROM {$this->table()}
|
||||
WHERE user_id = %d AND status IN ({$known_placeholders})";
|
||||
$params = array_merge(
|
||||
$parts['params'],
|
||||
$pending_statuses,
|
||||
[$paid_status, $user_id],
|
||||
$completed_statuses,
|
||||
[$user_id],
|
||||
$known_statuses
|
||||
);
|
||||
$row = $wpdb->get_row($wpdb->prepare($sql, $params), ARRAY_A);
|
||||
|
||||
@@ -286,8 +286,8 @@ class UserOrders {
|
||||
private function status_group(string $status): string {
|
||||
return match ($status) {
|
||||
Order::STATUS_CREATED, Order::STATUS_PENDING => OrderCenterQuery::STATUS_PENDING,
|
||||
Order::STATUS_PAID => OrderCenterQuery::STATUS_COMPLETED,
|
||||
Order::STATUS_CANCELLED, Order::STATUS_EXPIRED => OrderCenterQuery::STATUS_CLOSED,
|
||||
Order::STATUS_PAID, Order::STATUS_DELIVERED, Order::STATUS_COMPLETED, Order::STATUS_PENDING_REVIEW => OrderCenterQuery::STATUS_COMPLETED,
|
||||
Order::STATUS_CANCELLED, Order::STATUS_EXPIRED, Order::STATUS_REFUNDING, Order::STATUS_REFUNDED => OrderCenterQuery::STATUS_CLOSED,
|
||||
default => OrderCenterQuery::STATUS_CLOSED,
|
||||
};
|
||||
}
|
||||
@@ -313,6 +313,9 @@ class UserOrders {
|
||||
if ($type === DomainModel::ORDER_PRODUCT_RECHARGE) {
|
||||
return __('余额充值', 'aksrt');
|
||||
}
|
||||
if ($type === DomainModel::ORDER_PRODUCT_POINTS) {
|
||||
return __('积分购买', 'aksrt');
|
||||
}
|
||||
if ($product_id > 0) {
|
||||
$cache_key = (string) $product_id;
|
||||
if (!array_key_exists($cache_key, $this->post_title_cache)) {
|
||||
@@ -354,7 +357,7 @@ class UserOrders {
|
||||
|
||||
if ($type === DomainModel::ORDER_PRODUCT_VIP) {
|
||||
$url = function_exists('aksrt_get_user_center_tab_url') ? aksrt_get_user_center_tab_url('vip') : '';
|
||||
} elseif ($type === DomainModel::ORDER_PRODUCT_RECHARGE) {
|
||||
} elseif (in_array($type, [DomainModel::ORDER_PRODUCT_RECHARGE, DomainModel::ORDER_PRODUCT_POINTS], true)) {
|
||||
$url = function_exists('aksrt_get_user_center_tab_url') ? aksrt_get_user_center_tab_url('credits') : '';
|
||||
} else {
|
||||
$url = $post_id > 0 ? get_permalink($post_id) : '';
|
||||
@@ -368,6 +371,7 @@ class UserOrders {
|
||||
return match ($type) {
|
||||
DomainModel::ORDER_PRODUCT_VIP => __('查看会员权益', 'aksrt'),
|
||||
DomainModel::ORDER_PRODUCT_RECHARGE => __('查看余额', 'aksrt'),
|
||||
DomainModel::ORDER_PRODUCT_POINTS => __('查看积分', 'aksrt'),
|
||||
default => __('打开已购内容', 'aksrt'),
|
||||
};
|
||||
}
|
||||
@@ -421,7 +425,7 @@ class UserOrders {
|
||||
if (!$order) {
|
||||
return ['success' => false, 'message' => __('当前订单状态不可支付。', 'aksrt')];
|
||||
}
|
||||
if ($this->status_group((string) ($order['status'] ?? '')) === OrderCenterQuery::STATUS_PAID) {
|
||||
if ($this->status_group((string) ($order['status'] ?? '')) === OrderCenterQuery::STATUS_COMPLETED) {
|
||||
$ledger_key = \AKSRT\Ledger\OperationKey::deterministic('order-payment', [$order_number]);
|
||||
$history = \AKSRT\Ledger\LedgerQuery::get_instance()->history(['operation_key' => $ledger_key, 'page' => 1, 'per_page' => 1]);
|
||||
if (!empty($history['items'][0])) {
|
||||
|
||||
Reference in new issue
Block a user