From f94083df36452a5b5b2ba1bf43aa7e351ca10b91 Mon Sep 17 00:00:00 2001 From: hailin Date: Sun, 4 Jan 2026 07:27:36 -0800 Subject: [PATCH] feat(admin-web): support offline settlement in batch create MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When batch creating special deductions: - Amount empty or 0: auto-switch to offline settlement mode - Amount > 0: normal deduction mode (requires reason) - Add hint text in batch create modal for special deduction 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../app/(dashboard)/pending-actions/page.tsx | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/frontend/admin-web/src/app/(dashboard)/pending-actions/page.tsx b/frontend/admin-web/src/app/(dashboard)/pending-actions/page.tsx index b4e43655..fc726807 100644 --- a/frontend/admin-web/src/app/(dashboard)/pending-actions/page.tsx +++ b/frontend/admin-web/src/app/(dashboard)/pending-actions/page.tsx @@ -376,7 +376,45 @@ export default function PendingActionsPage() { } let actionParams: Record | undefined; - if (batchFormData.actionParams.trim()) { + + // 特殊扣减的特殊处理 + if (batchFormData.actionCode === ACTION_CODES.SPECIAL_DEDUCTION) { + // 尝试解析已有参数 + let parsedParams: Record = {}; + if (batchFormData.actionParams.trim()) { + try { + parsedParams = JSON.parse(batchFormData.actionParams); + } catch { + toast.error('操作参数格式错误,请输入有效的 JSON'); + return; + } + } + + const amount = typeof parsedParams.amount === 'number' ? parsedParams.amount : parseFloat(String(parsedParams.amount || '0')); + const reason = String(parsedParams.reason || '').trim(); + + // 金额为空、NaN 或 <= 0 时,自动切换为全额线下结算模式 + if (isNaN(amount) || amount <= 0) { + actionParams = { + amount: 0, + reason: reason || '该收益已由用户与上级间线下完成现金收付', + createdBy: 'admin', + isOfflineSettlement: true, + }; + } else { + // 普通模式需要填写原因 + if (!reason) { + toast.error('特殊扣减必须填写原因/备注'); + return; + } + actionParams = { + amount, + reason, + createdBy: 'admin', + isOfflineSettlement: false, + }; + } + } else if (batchFormData.actionParams.trim()) { try { actionParams = JSON.parse(batchFormData.actionParams); } catch { @@ -904,12 +942,28 @@ export default function PendingActionsPage() { + {/* 特殊扣减提示 */} + {batchFormData.actionCode === ACTION_CODES.SPECIAL_DEDUCTION && ( +
+
+
+ 特殊扣减参数说明 +

金额为空或0:全额线下结算模式,自动扣减用户所有已结算收益

+

金额大于0:普通扣减模式,扣减指定金额(需填写原因)

+
+
+ )} +
- +