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

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
+30 -11
View File
@@ -60,18 +60,26 @@ class PayIncome {
$cash_stats = (array) ($stats['cash'] ?? []);
$points_stats = (array) ($stats['points'] ?? []);
$cash_amount = static function ($value): string {
try {
return \AKSRT\Ledger\AssetAmount::balance(is_string($value) ? $value : '')->formatted();
} catch (\InvalidArgumentException $e) {
return '0.00';
}
};
echo '<p>' . esc_html(sprintf(
__('现金:合计 ¥%1$s · 待结算 ¥%2$s · 已结算 ¥%3$s;积分:合计 %4$s · 待结算 %5$s · 已结算 %6$s', 'aksrt'),
number_format((float) ($cash_stats['total'] ?? 0), 2),
number_format((float) ($cash_stats['pending'] ?? 0), 2),
number_format((float) ($cash_stats['settled'] ?? 0), 2),
number_format((float) ($points_stats['total'] ?? 0), 0),
number_format((float) ($points_stats['pending'] ?? 0), 0),
number_format((float) ($points_stats['settled'] ?? 0), 0)
$cash_amount($cash_stats['total'] ?? '0'),
$cash_amount($cash_stats['pending'] ?? '0'),
$cash_amount($cash_stats['settled'] ?? '0'),
number_format_i18n(max(0, (int) ($points_stats['total'] ?? 0))),
number_format_i18n(max(0, (int) ($points_stats['pending'] ?? 0))),
number_format_i18n(max(0, (int) ($points_stats['settled'] ?? 0)))
)) . '</p>';
echo '<form id="aksrt-pay-batch-settle-income" method="post" action="' . esc_url(admin_url('admin-post.php')) . '" style="margin:12px 0;">';
echo '<input type="hidden" name="action" value="aksrt_pay_batch_settle_income" />';
echo '<input type="hidden" name="operation_key" value="' . esc_attr(wp_generate_uuid4()) . '" />';
wp_nonce_field('aksrt_pay_batch_settle_income');
submit_button(__('批量结算选中记录', 'aksrt'), 'secondary', '', false);
echo '</form>';
@@ -135,8 +143,10 @@ class PayIncome {
echo '<td><code>' . esc_html((string) ($row['order_number'] ?? '')) . '</code></td>';
$is_points = (string) ($row['currency'] ?? 'CNY') === 'points';
$row_currency = $is_points ? __('积分', 'aksrt') : '¥';
$row_decimals = $is_points ? 0 : 2;
echo '<td>' . esc_html(number_format((float) ($row['amount'] ?? 0), $row_decimals) . ' ' . $row_currency) . '</td>';
$row_amount = $is_points
? number_format_i18n(max(0, (int) ($row['amount'] ?? 0)))
: $cash_amount($row['amount'] ?? '0');
echo '<td>' . esc_html($row_amount . ' ' . $row_currency) . '</td>';
echo '<td>' . esc_html($st) . '</td>';
echo '<td>' . esc_html((string) ($row['created_at'] ?? '')) . '</td>';
echo '<td>';
@@ -144,6 +154,7 @@ class PayIncome {
echo '<form method="post" action="' . esc_url(admin_url('admin-post.php')) . '">';
echo '<input type="hidden" name="action" value="aksrt_pay_settle_income" />';
echo '<input type="hidden" name="revenue_id" value="' . esc_attr((string) $id) . '" />';
echo '<input type="hidden" name="operation_key" value="' . esc_attr(wp_generate_uuid4()) . '" />';
wp_nonce_field('aksrt_pay_settle_income_' . $id);
submit_button(__('结算', 'aksrt'), 'small', '', false);
echo '</form>';
@@ -163,7 +174,11 @@ class PayIncome {
}
$id = isset($_POST['revenue_id']) ? (int) $_POST['revenue_id'] : 0;
check_admin_referer('aksrt_pay_settle_income_' . $id);
$ok = $id > 0 && class_exists('\AKSRT\Payment\Revenue') && \AKSRT\Payment\Revenue::get_instance()->settle($id, get_current_user_id());
$request_key = sanitize_text_field((string) wp_unslash($_POST['operation_key'] ?? ''));
$operation_key = wp_is_uuid($request_key)
? \AKSRT\Ledger\OperationKey::deterministic('admin-revenue-settle', [get_current_user_id(), strtolower($request_key)])
: '';
$ok = $id > 0 && $operation_key !== '' && class_exists('\AKSRT\Payment\Revenue') && \AKSRT\Payment\Revenue::get_instance()->settle($id, get_current_user_id(), $operation_key);
wp_safe_redirect($this->page_url('aksrt_income', ['aksrt_pay_msg' => $ok ? 'income_settled' : 'income_failed']));
exit;
}
@@ -187,8 +202,12 @@ class PayIncome {
}
}
$ids = array_values(array_unique($ids));
$batch_result = !empty($ids) && class_exists('\\AKSRT\\Payment\\Revenue')
? \AKSRT\Payment\Revenue::get_instance()->settle_batch($ids, get_current_user_id())
$request_key = sanitize_text_field((string) wp_unslash($_POST['operation_key'] ?? ''));
$operation_key = wp_is_uuid($request_key)
? \AKSRT\Ledger\OperationKey::deterministic('admin-revenue-settle-batch', [get_current_user_id(), strtolower($request_key)])
: '';
$batch_result = !empty($ids) && $operation_key !== '' && class_exists('\\AKSRT\\Payment\\Revenue')
? \AKSRT\Payment\Revenue::get_instance()->settle_batch($ids, get_current_user_id(), $operation_key)
: ['settled' => [], 'failed' => $ids];
$message = empty($batch_result['settled'])
? 'income_failed'