积分与余额账务系统硬切重构

This commit is contained in:
2026-08-24 15:59:11 +08:00
parent ca12226b39
commit 5cae5b5c93
159 changed files with 7275 additions and 4718 deletions
+23 -9
View File
@@ -50,7 +50,6 @@ class PayChargeCards {
'balance' => __('余额', 'aksrt'),
'vip' => __('VIP', 'aksrt'),
'credits' => __('积分', 'aksrt'),
'points' => __('积分', 'aksrt'),
];
$status_labels = [
'active' => __('可用', 'aksrt'),
@@ -81,7 +80,7 @@ class PayChargeCards {
echo '<p><label>' . esc_html__('前缀', 'aksrt') . '<br><input type="text" name="prefix" value="" /></label></p>';
echo '<p><label>' . esc_html__('面额/积分', 'aksrt') . '<br><input type="number" step="0.01" name="amount" value="10" /></label></p>';
echo '<p><label>' . esc_html__('VIP等级', 'aksrt') . '<br><input type="number" name="vip_level" min="1" max="2" value="1" /></label></p>';
echo '<p><label>' . esc_html__('VIP天数', 'aksrt') . '<br><input type="number" name="vip_days" min="1" value="30" /></label></p>';
echo '<p><label>' . esc_html__('VIP天数', 'aksrt') . '<br><input type="number" name="days" min="1" value="30" /></label></p>';
echo '<p><label>' . esc_html__('过期时间', 'aksrt') . '<br><input type="datetime-local" name="expires_at" /></label></p>';
echo '<p><label>' . esc_html__('备注', 'aksrt') . '<br><input type="text" name="note" value="" /></label></p>';
submit_button(__('生成', 'aksrt'), 'primary', '', false);
@@ -179,7 +178,7 @@ class PayChargeCards {
echo '<tr>';
echo '<td>' . esc_html((string) $id) . '</td>';
echo '<td>' . esc_html($type_labels[$row_type] ?? $row_type) . '</td>';
echo '<td><code>' . esc_html((string) ($row['password'] ?? $row['code'] ?? '')) . '</code></td>';
echo '<td><code>' . esc_html((string) ($row['password'] ?? '')) . '</code></td>';
echo '<td>' . esc_html((string) ($row['amount'] ?? '')) . '</td>';
echo '<td>' . esc_html($status_labels[$st] ?? $st) . '</td>';
echo '<td>' . esc_html((string) ($row['expires_at'] ?? '—')) . '</td>';
@@ -252,10 +251,10 @@ class PayChargeCards {
$count = isset($_POST['count']) ? (int) $_POST['count'] : 10;
$length = isset($_POST['length']) ? (int) $_POST['length'] : 16;
$prefix = isset($_POST['prefix']) ? sanitize_text_field((string) wp_unslash($_POST['prefix'])) : '';
$amount = isset($_POST['amount']) ? (float) wp_unslash($_POST['amount']) : 0;
$amount = isset($_POST['amount']) ? trim(sanitize_text_field((string) wp_unslash($_POST['amount']))) : '';
$note = isset($_POST['note']) ? sanitize_textarea_field((string) wp_unslash($_POST['note'])) : '';
$level = isset($_POST['vip_level']) ? max(1, min(2, (int) $_POST['vip_level'])) : 1;
$days = isset($_POST['vip_days']) ? max(1, (int) $_POST['vip_days']) : 30;
$days = isset($_POST['days']) ? max(1, (int) $_POST['days']) : 30;
$expires = isset($_POST['expires_at']) ? sanitize_text_field((string) wp_unslash($_POST['expires_at'])) : '';
if ($expires !== '') {
$expires = str_replace('T', ' ', $expires);
@@ -264,15 +263,30 @@ class PayChargeCards {
}
}
if ($type === 'points') {
$type = 'credits';
if (!in_array($type, ['balance', 'vip', 'credits'], true)) {
wp_safe_redirect($this->page_url('aksrt_charge_cards', ['aksrt_pay_msg' => 'card_batch_failed']));
exit;
}
$meta = [];
if ($type === 'balance') {
$meta['amount'] = max(0, $amount);
try {
$balance_amount = \AKSRT\Ledger\AssetAmount::balance($amount);
} catch (\InvalidArgumentException $e) {
wp_safe_redirect($this->page_url('aksrt_charge_cards', ['aksrt_pay_msg' => 'card_batch_failed']));
exit;
}
if ($balance_amount->minor() <= 0) {
wp_safe_redirect($this->page_url('aksrt_charge_cards', ['aksrt_pay_msg' => 'card_batch_failed']));
exit;
}
$meta['amount'] = $balance_amount->decimal();
} elseif ($type === 'credits') {
$meta['points'] = max(0, (int) $amount);
if (!preg_match('/^[1-9]\d*$/', $amount)) {
wp_safe_redirect($this->page_url('aksrt_charge_cards', ['aksrt_pay_msg' => 'card_batch_failed']));
exit;
}
$meta['points'] = (int) $amount;
} elseif ($type === 'vip') {
$meta['level'] = $level;
$meta['days'] = $days;