|
@@ -97,6 +97,12 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
}) => {
|
|
}) => {
|
|
|
const queryClient = useQueryClient();
|
|
const queryClient = useQueryClient();
|
|
|
const [activeTab, setActiveTab] = useState('overview');
|
|
const [activeTab, setActiveTab] = useState('overview');
|
|
|
|
|
+
|
|
|
|
|
+ // 包装setActiveTab以添加调试日志
|
|
|
|
|
+ const wrappedSetActiveTab = (value: string) => {
|
|
|
|
|
+ console.debug('CreditBalanceDialog: 切换标签页', { from: activeTab, to: value });
|
|
|
|
|
+ setActiveTab(value);
|
|
|
|
|
+ };
|
|
|
const [logsQueryParams, setLogsQueryParams] = useState<CreditBalanceLogsQueryParams>({
|
|
const [logsQueryParams, setLogsQueryParams] = useState<CreditBalanceLogsQueryParams>({
|
|
|
page: 1,
|
|
page: 1,
|
|
|
limit: 10
|
|
limit: 10
|
|
@@ -106,11 +112,15 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
const { data: balanceData, isLoading: isLoadingBalance, refetch: refetchBalance } = useQuery({
|
|
const { data: balanceData, isLoading: isLoadingBalance, refetch: refetchBalance } = useQuery({
|
|
|
queryKey: ['credit-balance', userId, tenantId],
|
|
queryKey: ['credit-balance', userId, tenantId],
|
|
|
queryFn: async () => {
|
|
queryFn: async () => {
|
|
|
|
|
+ console.debug('CreditBalanceDialog: 开始获取信用额度数据', { userId, tenantId });
|
|
|
const res = await creditBalanceClient[':userId'].$get({
|
|
const res = await creditBalanceClient[':userId'].$get({
|
|
|
param: { userId: userId.toString() }
|
|
param: { userId: userId.toString() }
|
|
|
});
|
|
});
|
|
|
|
|
+ console.debug('CreditBalanceDialog: API响应状态', res.status);
|
|
|
if (res.status !== 200) throw new Error('获取信用额度失败');
|
|
if (res.status !== 200) throw new Error('获取信用额度失败');
|
|
|
- return await res.json();
|
|
|
|
|
|
|
+ const data = await res.json();
|
|
|
|
|
+ console.debug('CreditBalanceDialog: 获取到的数据', data);
|
|
|
|
|
+ return data;
|
|
|
},
|
|
},
|
|
|
enabled: open && !!userId,
|
|
enabled: open && !!userId,
|
|
|
staleTime: 5 * 60 * 1000,
|
|
staleTime: 5 * 60 * 1000,
|
|
@@ -278,6 +288,13 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
|
|
|
|
|
if (!open) return null;
|
|
if (!open) return null;
|
|
|
|
|
|
|
|
|
|
+ console.debug('CreditBalanceDialog: 渲染组件', {
|
|
|
|
|
+ activeTab,
|
|
|
|
|
+ isLoadingBalance,
|
|
|
|
|
+ balanceData: !!balanceData,
|
|
|
|
|
+ logsData: !!logsData
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
const balance = balanceData;
|
|
const balance = balanceData;
|
|
|
const logs = logsData?.data || [];
|
|
const logs = logsData?.data || [];
|
|
|
const logsPagination = logsData?.pagination;
|
|
const logsPagination = logsData?.pagination;
|
|
@@ -350,7 +367,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
</Card>
|
|
</Card>
|
|
|
|
|
|
|
|
{/* 标签页 */}
|
|
{/* 标签页 */}
|
|
|
- <Tabs value={activeTab} onValueChange={setActiveTab}>
|
|
|
|
|
|
|
+ <Tabs value={activeTab} onValueChange={wrappedSetActiveTab}>
|
|
|
<TabsList className="grid grid-cols-3">
|
|
<TabsList className="grid grid-cols-3">
|
|
|
<TabsTrigger value="overview">额度概览</TabsTrigger>
|
|
<TabsTrigger value="overview">额度概览</TabsTrigger>
|
|
|
<TabsTrigger value="operations">额度操作</TabsTrigger>
|
|
<TabsTrigger value="operations">额度操作</TabsTrigger>
|
|
@@ -368,7 +385,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
<>
|
|
<>
|
|
|
{/* 额度统计卡片 */}
|
|
{/* 额度统计卡片 */}
|
|
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
|
- <Card>
|
|
|
|
|
|
|
+ <Card data-testid="total-limit-card">
|
|
|
<CardHeader className="pb-2">
|
|
<CardHeader className="pb-2">
|
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
|
<DollarSign className="h-4 w-4" />
|
|
<DollarSign className="h-4 w-4" />
|
|
@@ -385,7 +402,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
</CardContent>
|
|
</CardContent>
|
|
|
</Card>
|
|
</Card>
|
|
|
|
|
|
|
|
- <Card>
|
|
|
|
|
|
|
+ <Card data-testid="used-amount-card">
|
|
|
<CardHeader className="pb-2">
|
|
<CardHeader className="pb-2">
|
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
|
<TrendingUp className="h-4 w-4" />
|
|
<TrendingUp className="h-4 w-4" />
|
|
@@ -402,7 +419,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
</CardContent>
|
|
</CardContent>
|
|
|
</Card>
|
|
</Card>
|
|
|
|
|
|
|
|
- <Card>
|
|
|
|
|
|
|
+ <Card data-testid="available-amount-card">
|
|
|
<CardHeader className="pb-2">
|
|
<CardHeader className="pb-2">
|
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
|
<TrendingDown className="h-4 w-4" />
|
|
<TrendingDown className="h-4 w-4" />
|
|
@@ -469,7 +486,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
<TabsContent value="operations" className="space-y-4">
|
|
<TabsContent value="operations" className="space-y-4">
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
|
{/* 设置额度表单 */}
|
|
{/* 设置额度表单 */}
|
|
|
- <Card>
|
|
|
|
|
|
|
+ <Card data-testid="set-limit-form-card">
|
|
|
<CardHeader>
|
|
<CardHeader>
|
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
|
<Settings className="h-4 w-4" />
|
|
<Settings className="h-4 w-4" />
|
|
@@ -493,6 +510,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
type="number"
|
|
type="number"
|
|
|
step="0.01"
|
|
step="0.01"
|
|
|
placeholder="请输入总额度"
|
|
placeholder="请输入总额度"
|
|
|
|
|
+ data-testid="total-limit-input"
|
|
|
{...field}
|
|
{...field}
|
|
|
onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)}
|
|
onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)}
|
|
|
/>
|
|
/>
|
|
@@ -530,7 +548,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
</Card>
|
|
</Card>
|
|
|
|
|
|
|
|
{/* 调整额度表单 */}
|
|
{/* 调整额度表单 */}
|
|
|
- <Card>
|
|
|
|
|
|
|
+ <Card data-testid="adjust-limit-form-card">
|
|
|
<CardHeader>
|
|
<CardHeader>
|
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
|
<Edit className="h-4 w-4" />
|
|
<Edit className="h-4 w-4" />
|
|
@@ -554,6 +572,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
type="number"
|
|
type="number"
|
|
|
step="0.01"
|
|
step="0.01"
|
|
|
placeholder="正数增加,负数减少"
|
|
placeholder="正数增加,负数减少"
|
|
|
|
|
+ data-testid="adjust-amount-input"
|
|
|
{...field}
|
|
{...field}
|
|
|
onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)}
|
|
onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)}
|
|
|
/>
|
|
/>
|
|
@@ -582,6 +601,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
type="submit"
|
|
type="submit"
|
|
|
className="w-full"
|
|
className="w-full"
|
|
|
disabled={adjustLimitMutation.isPending}
|
|
disabled={adjustLimitMutation.isPending}
|
|
|
|
|
+ data-testid="adjust-limit-button"
|
|
|
>
|
|
>
|
|
|
{adjustLimitMutation.isPending ? '调整中...' : '调整额度'}
|
|
{adjustLimitMutation.isPending ? '调整中...' : '调整额度'}
|
|
|
</Button>
|
|
</Button>
|
|
@@ -592,7 +612,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
{/* 结账恢复额度表单 */}
|
|
{/* 结账恢复额度表单 */}
|
|
|
- <Card>
|
|
|
|
|
|
|
+ <Card data-testid="checkout-form-card">
|
|
|
<CardHeader>
|
|
<CardHeader>
|
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
<CardTitle className="text-sm font-medium flex items-center gap-2">
|
|
|
<CheckCircle className="h-4 w-4" />
|
|
<CheckCircle className="h-4 w-4" />
|
|
@@ -616,6 +636,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
type="number"
|
|
type="number"
|
|
|
step="0.01"
|
|
step="0.01"
|
|
|
placeholder="请输入恢复金额"
|
|
placeholder="请输入恢复金额"
|
|
|
|
|
+ data-testid="checkout-amount-input"
|
|
|
{...field}
|
|
{...field}
|
|
|
onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)}
|
|
onChange={(e) => field.onChange(parseFloat(e.target.value) || 0)}
|
|
|
/>
|
|
/>
|
|
@@ -644,6 +665,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
|
|
|
type="submit"
|
|
type="submit"
|
|
|
className="w-full"
|
|
className="w-full"
|
|
|
disabled={checkoutMutation.isPending}
|
|
disabled={checkoutMutation.isPending}
|
|
|
|
|
+ data-testid="checkout-button"
|
|
|
>
|
|
>
|
|
|
{checkoutMutation.isPending ? '恢复中...' : '结账恢复额度'}
|
|
{checkoutMutation.isPending ? '恢复中...' : '结账恢复额度'}
|
|
|
</Button>
|
|
</Button>
|