diff --git a/src/Admin/Native/PayOrders.php b/src/Admin/Native/PayOrders.php
index 0bd290d7..f77d0e79 100644
--- a/src/Admin/Native/PayOrders.php
+++ b/src/Admin/Native/PayOrders.php
@@ -31,6 +31,7 @@ class PayOrders {
add_action('admin_post_aksrt_pay_clear_closed_orders', [$this, 'handle_clear_closed_orders']);
add_action('admin_post_aksrt_pay_delete_order', [$this, 'handle_delete_order']);
add_action('admin_post_aksrt_after_sale_review', [$this, 'handle_after_sale_review']);
+ add_action('admin_post_aksrt_after_sale_bulk', [$this, 'handle_after_sale_bulk']);
}
public function render_orders_page(): void {
@@ -401,8 +402,15 @@ class PayOrders {
foreach ([\AKSRT\Payment\AfterSaleService::STATUS_PENDING => '待审核', \AKSRT\Payment\AfterSaleService::STATUS_PROCESSING => '处理中', \AKSRT\Payment\AfterSaleService::STATUS_APPROVED => '已通过', \AKSRT\Payment\AfterSaleService::STATUS_REJECTED => '已拒绝', \AKSRT\Payment\AfterSaleService::STATUS_CANCELLED => '已取消', \AKSRT\Payment\AfterSaleService::STATUS_COMPLETED => '已完成'] as $key => $label) echo '';
echo ' ';
submit_button(__('筛选', 'aksrt'), 'secondary', '', false);
- echo '
| ID | 订单号 | 用户 | 原因 | 申请资料 | 申请说明 | 举证图片 | 退款金额 | 状态 | 操作 / 处理记录 |
';
- if (!$items) echo '| ' . esc_html__('暂无售后申请', 'aksrt') . ' |
';
+ echo '';
+ echo '';
echo '';
+ . '});});'
+ . 'var selAll=document.querySelector(".aksrt-select-all");'
+ . 'if(selAll){selAll.addEventListener("change",function(){'
+ . 'document.querySelectorAll(".aksrt-row-check").forEach(function(c){c.checked=selAll.checked;});});}'
+ . 'var bulkForm=document.getElementById("aksrt-after-sale-bulk-form");'
+ . 'if(bulkForm){bulkForm.addEventListener("submit",function(e){'
+ . 'var checked=document.querySelectorAll(".aksrt-row-check:checked");'
+ . 'var decision=document.getElementById("aksrt-bulk-decision").value;'
+ . 'if(!checked.length){e.preventDefault();alert(' . wp_json_encode(__('请先勾选要操作的售后记录。', 'aksrt')) . ');return;}'
+ . 'if(!decision){e.preventDefault();alert(' . wp_json_encode(__('请选择批量操作。', 'aksrt')) . ');return;}'
+ . 'if(decision==="reject"){var note=prompt(tReject,"");if(note===null){e.preventDefault();return;}document.getElementById("aksrt-bulk-note").value=note;}'
+ . 'else if(!confirm(' . wp_json_encode(__('确认批量通过选中的记录吗?', 'aksrt')) . ')){e.preventDefault();return;}'
+ . '});}'
+ . '})();';
}
public function handle_after_sale_review(): void {
@@ -498,6 +527,31 @@ class PayOrders {
wp_safe_redirect($this->page_url(self::PAGE_AFTER_SALES_SLUG, $args)); exit;
}
+ /**
+ * 批量审核售后申请(仅对待审核/处理中有效,其余由 review() 校验拒绝并计入失败)。
+ */
+ public function handle_after_sale_bulk(): void {
+ if (!current_user_can(self::CAPABILITY)) wp_die(esc_html__('权限不足', 'aksrt'));
+ check_admin_referer('aksrt_after_sale_bulk');
+ $decision = isset($_POST['bulk_decision']) ? sanitize_key((string) wp_unslash($_POST['bulk_decision'])) : '';
+ if (!in_array($decision, ['approve', 'reject'], true)) {
+ wp_safe_redirect($this->page_url(self::PAGE_AFTER_SALES_SLUG, ['aksrt_pay_msg' => 'after_sale_review_failed'])); exit;
+ }
+ $note = isset($_POST['bulk_note']) ? sanitize_textarea_field((string) wp_unslash($_POST['bulk_note'])) : '';
+ $ids = array_values(array_unique(array_map('absint', (array) ($_POST['after_sale_ids'] ?? []))));
+ $service = \AKSRT\Payment\AfterSaleService::get_instance();
+ $done = 0; $failed = 0;
+ foreach ($ids as $id) {
+ if ($id <= 0) continue;
+ $result = $service->review($id, $decision, $note);
+ if (is_wp_error($result)) $failed++; else $done++;
+ }
+ $args = ['aksrt_pay_msg' => $failed > 0 ? 'after_sale_review_failed' : 'after_sale_reviewed'];
+ if ($done > 0) $args['aksrt_bulk_done'] = $done;
+ if ($failed > 0) $args['aksrt_bulk_failed'] = $failed;
+ wp_safe_redirect($this->page_url(self::PAGE_AFTER_SALES_SLUG, $args)); exit;
+ }
+
public function handle_update_order_status(): void {
if (!current_user_can(self::CAPABILITY)) {
wp_die(esc_html__('权限不足', 'aksrt'));