feat: 新增客服备用金台账与后台用户中文显示名

- 新增备用金账户、流水、支出、对账与权限
- 后台用户支持中文显示名并同步备用金姓名
- 审计、登录记录、任务及工单操作人优先展示中文名
- 补充备用金与人工支出方案文档
This commit is contained in:
yml2213
2026-10-18 13:55:24 +08:00
parent 7bacb7d5eb
commit 7542d547bf
55 changed files with 6557 additions and 105 deletions
+17 -1
View File
@@ -17,6 +17,7 @@ import {
TrophyOutlined,
UnorderedListOutlined,
UserOutlined,
WalletOutlined,
} from '@ant-design/icons'
import {
App,
@@ -45,10 +46,12 @@ import {
} from '@/services/admin'
import {
clearAdminSession,
getAdminDisplayName,
getAdminRole,
getAdminToken,
getAdminTokenExpiresAt,
getAdminUsername,
setAdminDisplayName,
setAdminPermissions,
} from '@/utils/admin-auth'
import { formatAdminDateTime } from '@/utils/admin-time'
@@ -89,9 +92,13 @@ export default function AdminLayout() {
const session = adminSessionQuery.data?.data
if (session?.authenticated && session.user) {
setAdminPermissions(session.user.permissions || [])
setAdminDisplayName(session.user.displayName || session.user.username)
}
}, [adminSessionQuery.data])
const displayName =
adminSessionQuery.data?.data.user?.displayName || getAdminDisplayName() || username
const devMockStatusQuery = useQuery({
queryKey: ['admin-dev-mock-status'],
queryFn: () => fetchDevMockStatus(),
@@ -124,11 +131,17 @@ export default function AdminLayout() {
role === 'finance'
? [
{ key: '/admin/finance', icon: <AccountBookOutlined />, label: '财务' },
{ key: '/admin/fund', icon: <WalletOutlined />, label: '备用金' },
{ key: '/admin/worker-platform', icon: <TrophyOutlined />, label: '资金审核' },
]
: [
{ key: '/admin/dashboard', icon: <DashboardOutlined />, label: '概览' },
{ key: '/admin/orders', icon: <OrderedListOutlined />, label: '订单' },
{
key: '/admin/fund',
icon: <WalletOutlined />,
label: role === 'support' ? '我的备用金' : '备用金',
},
...(role === 'support'
? []
: [{ key: '/admin/finance', icon: <AccountBookOutlined />, label: '财务' }]),
@@ -291,7 +304,10 @@ export default function AdminLayout() {
{!collapsed ? (
<div className="admin-sidebar-profile">
<Typography.Text strong>{username}</Typography.Text>
<Typography.Text strong>{displayName}</Typography.Text>
{displayName !== username ? (
<Typography.Text type="secondary">@{username}</Typography.Text>
) : null}
<Typography.Text type="secondary">{roleLabel(role)}</Typography.Text>
{expiresAt ? (
<Typography.Text type="secondary">