2
0
Эх сурвалжийг харах

fix(credit-balance-ui): 修复RPC客户端管理器使用和清理调试信息

- 修复CreditBalanceDialog.tsx中的RPC客户端使用,符合`clientManager.get().api.$method`规范
- 类型推断继续使用`creditBalanceClient`确保类型安全
- 实际API调用改为使用`creditBalanceClientManager.get()`(共6处)
- 更新集成测试mock配置,同时mock `creditBalanceClient`和`creditBalanceClientManager`
- 清理组件中的console.debug调试信息
- 移除未使用的`wrappedSetActiveTab`函数,直接使用`setActiveTab`
- 更新故事004.002的Dev Agent Record和Completion Notes List
- 所有6个集成测试通过,类型检查通过

符合项目RPC客户端架构最佳实践,与用户管理UI包保持一致的客户端使用模式。

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 6 өдөр өмнө
parent
commit
dc72eabf25

+ 16 - 2
docs/stories/004.002.credit-balance-management-ui-mt.story.md

@@ -336,6 +336,16 @@ CREATE TABLE credit_balance_log_mt (
    - **依赖安装**: 在用户管理UI包目录运行`pnpm install`安装信用额度管理UI包依赖
    - **依赖安装**: 在用户管理UI包目录运行`pnpm install`安装信用额度管理UI包依赖
    - **类型检查**: 运行`pnpm typecheck`验证集成无类型错误
    - **类型检查**: 运行`pnpm typecheck`验证集成无类型错误
    - **构建验证**: 修复credit-balance-module-mt中的构建错误(`state`属性改为`isDisabled`)
    - **构建验证**: 修复credit-balance-module-mt中的构建错误(`state`属性改为`isDisabled`)
+9. **RPC客户端管理器使用修复**: 根据编码标准和RPC客户端架构最佳实践修复CreditBalanceDialog.tsx中的客户端使用
+   - **问题发现**: CreditBalanceDialog.tsx直接使用`creditBalanceClient`,不符合`clientManager.get().api.$method`规范
+   - **编码标准要求**: 根据`docs/architecture/coding-standards.md`第30行:"在组件中应使用`clientManager.get().api.$method`而非直接使用导出的客户端实例"
+   - **修复步骤**:
+     1. 更新CreditBalanceDialog.tsx导入:同时导入`creditBalanceClient`和`creditBalanceClientManager`
+     2. 类型推断继续使用`creditBalanceClient`确保类型安全
+     3. 实际API调用改为使用`creditBalanceClientManager.get()`(共6处)
+     4. 更新集成测试mock配置,同时mock `creditBalanceClient`和`creditBalanceClientManager`
+   - **测试验证**: 所有6个集成测试通过,类型检查通过
+   - **架构一致性**: 与用户管理UI包保持一致的客户端使用模式,符合项目RPC客户端架构最佳实践
 
 
 ### Completion Notes List
 ### Completion Notes List
 1. ✅ **包结构创建**: 完成credit-balance-management-ui-mt包的所有配置文件
 1. ✅ **包结构创建**: 完成credit-balance-management-ui-mt包的所有配置文件
@@ -387,6 +397,10 @@ CREATE TABLE credit_balance_log_mt (
       - 符合React表单最佳实践,代码更简洁
       - 符合React表单最佳实践,代码更简洁
     - **测试清理**: 移除测试中的调试信息,保持测试代码简洁
     - **测试清理**: 移除测试中的调试信息,保持测试代码简洁
     - **最终状态**: 所有6个测试通过,组件功能完整
     - **最终状态**: 所有6个测试通过,组件功能完整
+14. ✅ **RPC客户端管理器修复**: 根据编码标准修复CreditBalanceDialog.tsx中的客户端使用,符合`clientManager.get().api.$method`规范
+    - 修复CreditBalanceDialog.tsx:类型推断使用`creditBalanceClient`,实际调用使用`creditBalanceClientManager.get()`
+    - 更新集成测试mock配置,支持客户端管理器模式
+    - 所有测试通过,类型检查通过,符合RPC客户端架构最佳实践
 
 
 ### File List
 ### File List
 **已创建/修改的文件**:
 **已创建/修改的文件**:
@@ -394,13 +408,13 @@ CREATE TABLE credit_balance_log_mt (
 2. `packages/credit-balance-management-ui-mt/package.json` - 包配置和依赖
 2. `packages/credit-balance-management-ui-mt/package.json` - 包配置和依赖
 3. `packages/credit-balance-management-ui-mt/src/api/creditBalanceClient.ts` - API客户端
 3. `packages/credit-balance-management-ui-mt/src/api/creditBalanceClient.ts` - API客户端
 4. `packages/credit-balance-management-ui-mt/src/api/index.ts` - API导出文件
 4. `packages/credit-balance-management-ui-mt/src/api/index.ts` - API导出文件
-5. `packages/credit-balance-management-ui-mt/src/components/CreditBalanceDialog.tsx` - 主对话框组件(已优化:移除按钮多余的onClick处理程序)
+5. `packages/credit-balance-management-ui-mt/src/components/CreditBalanceDialog.tsx` - 主对话框组件(已优化:移除按钮多余的onClick处理程序,修复RPC客户端管理器使用
 6. `packages/credit-balance-management-ui-mt/src/components/index.ts` - 组件导出文件
 6. `packages/credit-balance-management-ui-mt/src/components/index.ts` - 组件导出文件
 7. `packages/credit-balance-management-ui-mt/src/hooks/index.ts` - Hooks导出文件
 7. `packages/credit-balance-management-ui-mt/src/hooks/index.ts` - Hooks导出文件
 8. `packages/credit-balance-management-ui-mt/src/types/creditBalance.ts` - 类型定义
 8. `packages/credit-balance-management-ui-mt/src/types/creditBalance.ts` - 类型定义
 9. `packages/credit-balance-management-ui-mt/src/types/index.ts` - 类型导出文件
 9. `packages/credit-balance-management-ui-mt/src/types/index.ts` - 类型导出文件
 10. `packages/credit-balance-management-ui-mt/src/index.ts` - 主导出文件
 10. `packages/credit-balance-management-ui-mt/src/index.ts` - 主导出文件
-11. `packages/credit-balance-management-ui-mt/tests/integration/creditBalanceDialog.integration.test.tsx` - 集成测试(已修复表单验证测试,清理调试信息)
+11. `packages/credit-balance-management-ui-mt/tests/integration/creditBalanceDialog.integration.test.tsx` - 集成测试(已修复表单验证测试,清理调试信息,更新客户端mock配置
 12. `packages/credit-balance-management-ui-mt/tests/setup.ts` - 测试配置
 12. `packages/credit-balance-management-ui-mt/tests/setup.ts` - 测试配置
 13. `packages/credit-balance-management-ui-mt/tests/unit/CreditBalanceDialog.test.tsx` - 单元测试
 13. `packages/credit-balance-management-ui-mt/tests/unit/CreditBalanceDialog.test.tsx` - 单元测试
 14. `packages/credit-balance-management-ui-mt/tsconfig.json` - TypeScript配置
 14. `packages/credit-balance-management-ui-mt/tsconfig.json` - TypeScript配置

+ 9 - 25
packages/credit-balance-management-ui-mt/src/components/CreditBalanceDialog.tsx

@@ -13,7 +13,7 @@ import {
   Settings,
   Settings,
   AlertCircle
   AlertCircle
 } from 'lucide-react';
 } from 'lucide-react';
-import { creditBalanceClient } from '../api/creditBalanceClient';
+import { creditBalanceClient, creditBalanceClientManager } from '../api/creditBalanceClient';
 import type {
 import type {
   CreditBalanceDialogProps,
   CreditBalanceDialogProps,
   CreditBalanceLogsQueryParams
   CreditBalanceLogsQueryParams
@@ -98,11 +98,6 @@ 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
@@ -112,15 +107,11 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
   const { data: balanceData, isLoading: isLoadingBalance, refetch: refetchBalance, error: balanceError } = useQuery({
   const { data: balanceData, isLoading: isLoadingBalance, refetch: refetchBalance, error: balanceError } = 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 creditBalanceClientManager.get()[':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('获取信用额度失败');
-      const data = await res.json();
-      console.debug('CreditBalanceDialog: 获取到的数据', data);
-      return data;
+      return await res.json();
     },
     },
     enabled: open && !!userId,
     enabled: open && !!userId,
     staleTime: 5 * 60 * 1000,
     staleTime: 5 * 60 * 1000,
@@ -138,7 +129,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
   const { data: logsData, isLoading: isLoadingLogs, error: logsError } = useQuery({
   const { data: logsData, isLoading: isLoadingLogs, error: logsError } = useQuery({
     queryKey: ['credit-balance-logs', userId, logsQueryParams, tenantId],
     queryKey: ['credit-balance-logs', userId, logsQueryParams, tenantId],
     queryFn: async () => {
     queryFn: async () => {
-      const res = await creditBalanceClient[':userId'].logs.$get({
+      const res = await creditBalanceClientManager.get()[':userId'].logs.$get({
         param: { userId: userId.toString() },
         param: { userId: userId.toString() },
         query: {
         query: {
           page: logsQueryParams.page || 1,
           page: logsQueryParams.page || 1,
@@ -192,7 +183,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
   // 设置额度mutation
   // 设置额度mutation
   const setLimitMutation = useMutation({
   const setLimitMutation = useMutation({
     mutationFn: async (data: SetLimitFormData) => {
     mutationFn: async (data: SetLimitFormData) => {
-      const res = await creditBalanceClient[':userId'].$put({
+      const res = await creditBalanceClientManager.get()[':userId'].$put({
         param: { userId: userId.toString() },
         param: { userId: userId.toString() },
         json: data
         json: data
       });
       });
@@ -212,7 +203,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
   // 调整额度mutation
   // 调整额度mutation
   const adjustLimitMutation = useMutation({
   const adjustLimitMutation = useMutation({
     mutationFn: async (data: AdjustLimitFormData) => {
     mutationFn: async (data: AdjustLimitFormData) => {
-      const res = await creditBalanceClient[':userId'].adjust.$post({
+      const res = await creditBalanceClientManager.get()[':userId'].adjust.$post({
         param: { userId: userId.toString() },
         param: { userId: userId.toString() },
         json: data
         json: data
       });
       });
@@ -232,7 +223,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
   // 结账恢复额度mutation
   // 结账恢复额度mutation
   const checkoutMutation = useMutation({
   const checkoutMutation = useMutation({
     mutationFn: async (data: CheckoutFormData) => {
     mutationFn: async (data: CheckoutFormData) => {
-      const res = await creditBalanceClient.checkout.$post({
+      const res = await creditBalanceClientManager.get().checkout.$post({
         json: data
         json: data
       });
       });
       if (res.status !== 200) throw new Error('结账恢复额度失败');
       if (res.status !== 200) throw new Error('结账恢复额度失败');
@@ -303,13 +294,6 @@ 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;
@@ -382,7 +366,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
           </Card>
           </Card>
 
 
           {/* 标签页 */}
           {/* 标签页 */}
-          <Tabs value={activeTab} onValueChange={wrappedSetActiveTab}>
+          <Tabs value={activeTab} onValueChange={setActiveTab}>
             <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>
@@ -513,7 +497,7 @@ export const CreditBalanceDialog: React.FC<CreditBalanceDialogProps> = ({
                   </CardHeader>
                   </CardHeader>
                   <CardContent>
                   <CardContent>
                     <Form {...setLimitForm}>
                     <Form {...setLimitForm}>
-                      <form onSubmit={setLimitForm.handleSubmit(onSetLimitSubmit, (errors) => console.debug('设置额度表单验证错误:', errors))} className="space-y-4">
+                      <form onSubmit={setLimitForm.handleSubmit(onSetLimitSubmit)} className="space-y-4">
                         <FormField
                         <FormField
                           control={setLimitForm.control}
                           control={setLimitForm.control}
                           name="totalLimit"
                           name="totalLimit"

+ 9 - 1
packages/credit-balance-management-ui-mt/tests/integration/creditBalanceDialog.integration.test.tsx

@@ -1,5 +1,5 @@
 import { describe, it, expect, vi, beforeEach } from 'vitest';
 import { describe, it, expect, vi, beforeEach } from 'vitest';
-import { render, screen, fireEvent, waitFor, act } from '@testing-library/react';
+import { render, screen, fireEvent, waitFor } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import userEvent from '@testing-library/user-event';
 import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
 import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
 import { CreditBalanceDialog } from '../../src/components/CreditBalanceDialog';
 import { CreditBalanceDialog } from '../../src/components/CreditBalanceDialog';
@@ -41,8 +41,16 @@ vi.mock('../../src/api/creditBalanceClient', () => {
       $post: vi.fn(() => Promise.resolve({ status: 200, json: async () => ({}) }))
       $post: vi.fn(() => Promise.resolve({ status: 200, json: async () => ({}) }))
     }
     }
   };
   };
+
+  const mockCreditBalanceClientManager = {
+    get: vi.fn(() => mockCreditBalanceClient),
+    init: vi.fn(() => mockCreditBalanceClient),
+    reset: vi.fn(),
+  };
+
   return {
   return {
     creditBalanceClient: mockCreditBalanceClient,
     creditBalanceClient: mockCreditBalanceClient,
+    creditBalanceClientManager: mockCreditBalanceClientManager,
   };
   };
 });
 });