feat(payment): 新增「售后策略」配置与前台售后弹窗链路
- 后台「支付&付费 → 售后策略」:售后功能开关、申请时效、超时效提示(HTML)、 预置原因、申请售后说明、所需材料、申请说明占位文案、可上传图片开关; PHP schema 与 SPA schema 1:1 对齐,group 字段支持拖拽排序 - PaymentRuntime 新增售后设置解析(缺键回退 schema 默认、HTML 走 kses、 中文原因稳定 slug)与 after_sale_expired 时效判定(支付时间起算) - 售后工单支持举证图片(order_aftersale.images 列,最多 3 张, 复用评论图片上传校验)与上传路由;订单视图模型输出 after_sale 按钮状态 - 前台申请 / 超时效提示 / 售后详细三个独立弹窗(modal-mini + 蓝色炫彩头), 订单详情弹窗不再内嵌售后表单并清理相关死代码 - 新增 after-sale-policy 契约测试与运行时 harness,527 项契约测试通过
This commit is contained in:
1 parent
b447c41f13
commit
1a9a2762f3
19 files changed
+1835
-86
No files matched your search
@@ -211,6 +211,7 @@ trait DBMigratorPart2 {
|
||||
user_id BIGINT UNSIGNED NOT NULL,
|
||||
aftersale_type VARCHAR(24) NOT NULL DEFAULT 'refund',
|
||||
reason TEXT NOT NULL,
|
||||
images LONGTEXT DEFAULT NULL,
|
||||
refund_amount VARCHAR(32) NOT NULL DEFAULT '0',
|
||||
status VARCHAR(20) NOT NULL DEFAULT 'pending',
|
||||
admin_note TEXT DEFAULT NULL,
|
||||
|
||||
@@ -407,6 +407,18 @@ trait ScriptsPart1b {
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
// 售后弹窗(申请 / 超时效提示 / 售后详细):与订单中心同面板、同条件入队。
|
||||
$order_after_sale_js = get_template_directory() . '/assets/js/order-after-sale.js';
|
||||
if (file_exists($order_after_sale_js)) {
|
||||
wp_enqueue_script(
|
||||
'aksrt-order-after-sale',
|
||||
$base_uri . '/assets/js/order-after-sale.js',
|
||||
['loader_js'],
|
||||
(string) filemtime($order_after_sale_js),
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$identity_js = get_template_directory() . '/assets/js/routes/user-center-auth.js';
|
||||
|
||||
@@ -498,6 +498,24 @@ trait ScriptsPart1c {
|
||||
'desc' => (string) ($report['desc'] ?? ''),
|
||||
];
|
||||
})(),
|
||||
// 售后策略数据(order-after-sale.js):预置原因、所需材料、申请说明与
|
||||
// 占位文案、图片开关、超时效提示均读取后台「支付&付费 → 售后策略」。
|
||||
'afterSale' => (function () {
|
||||
if (!class_exists('\AKSRT\Settings\PaymentRuntime')) {
|
||||
return ['enabled' => false, 'reasons' => [], 'materials' => [], 'desc' => '', 'imgEnabled' => false, 'maxImages' => 3, 'reasonPlaceholder' => '', 'expiredText' => ''];
|
||||
}
|
||||
$after_sale = \AKSRT\Settings\PaymentRuntime::get_after_sale_settings();
|
||||
return [
|
||||
'enabled' => !empty($after_sale['enabled']),
|
||||
'reasons' => array_values((array) ($after_sale['reasons'] ?? [])),
|
||||
'materials' => array_values((array) ($after_sale['materials'] ?? [])),
|
||||
'desc' => (string) ($after_sale['desc'] ?? ''),
|
||||
'imgEnabled' => !empty($after_sale['img_enabled']),
|
||||
'maxImages' => 3,
|
||||
'reasonPlaceholder' => (string) ($after_sale['reason_placeholder'] ?? ''),
|
||||
'expiredText' => (string) ($after_sale['expired_text'] ?? ''),
|
||||
];
|
||||
})(),
|
||||
'stickyEnabled' => class_exists('\AKSRT\Settings\Settings') ? !empty(\AKSRT\Settings\Settings::get_post_list_style_settings()['sticky_s']) : true,
|
||||
'stickyPages' => class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_post_list_style_settings()['sticky_s'] : ['home', 'cat'],
|
||||
'badgeShow' => class_exists('\AKSRT\Settings\Settings') ? !empty(\AKSRT\Settings\Settings::get_post_list_style_settings()['list_badge_show']) : true,
|
||||
|
||||
Reference in new issue
Block a user