Переглянути джерело

fix(@six/smart-pharmacy): 智慧药事系统第一版工具类单独抽出

cmj 1 місяць тому
батько
коміт
99bc320fc8

+ 7 - 70
apps/smart-pharmacy/src/api/index.ts

@@ -5,6 +5,11 @@ import { message } from 'ant-design-vue';
 
 import { useAuthStore } from '#/store';
 
+import {
+  transformDatabaseResponse,
+  transformHttpResponse,
+} from '#/api/utils/response-transform';
+
 import '@six/request/alova';
 
 export * from './method/access';
@@ -16,73 +21,7 @@ export * from './method/system';
 
 export const http = createRequestClient({
   id: import.meta.env.VITE_APP_NAMESPACE?.split('/').pop() ?? 'smart-pharmacy',
-  transform(body, method) {
-    /* prettier-ignore */
-    if (body === null || typeof body !== 'object') return { code: 0, data: body, message: 'ok' };
-
-    let code: number;
-    let message: string;
-    let data: Recordable;
-    let rest: Recordable = {};
-
-    if ('code' in body && ('msg' in body || 'message' in body)) {
-      const rawCode = body.code as number;
-      code = rawCode === 200 ? 0 : rawCode;
-      message = (body.msg ?? body.message ?? '') as string;
-      data = (body.data ?? (body.user ? body : void 0)) as Recordable;
-      if (!data && Array.isArray(body.rows)) {
-        data = {
-          total: body.total ?? 0,
-          items: body.rows,
-        };
-      }
-      // 角色菜单树等接口:menus、checkedKeys 可能与 data 平级返回
-      if (Array.isArray(body.menus) || Array.isArray(body.checkedKeys)) {
-        data = {
-          ...(data && typeof data === 'object' ? data : {}),
-          menus: body.menus ?? data?.menus,
-          checkedKeys: body.checkedKeys ?? data?.checkedKeys,
-        };
-      }
-      const { code: _c, msg: _m, message: _msg, data: _d, ...r } = body;
-      rest = r;
-    }
-    const result = { code, message, data, ...rest };
-
-    if (
-      result.data?.TotalPageCount !== void 0 &&
-      Array.isArray(result.data?.Items)
-    ) {
-      const {
-        TotalRecordCount: total,
-        PageIndex: page,
-        PageSize: size,
-        Items: items,
-      } = result.data;
-      result.data = {
-        total,
-        items,
-        data: { page, size, total },
-      };
-    }
-
-    /* 额外处理登录接口 */
-    if (method.meta?.login || method.meta?.authRole === 'login') {
-      const { access_token, token, expires_in, ...loginData } = result.data ?? {};
-      const accessToken = access_token ?? token;
-      result.data = {
-        accessToken: accessToken
-          ? String(accessToken).startsWith('Bearer ')
-            ? accessToken
-            : `Bearer ${accessToken}`
-          : '',
-        refreshToken: null,
-        expiresIn: expires_in,
-        ...loginData,
-      };
-    }
-    return result;
-  },
+  transform: transformHttpResponse,
 });
 http.interceptor('error', async (error) => {
   if (error?.code === 401) await useAuthStore().logout();
@@ -91,9 +30,7 @@ http.interceptor('error', async (error) => {
 
 export const database = createRequestClient({
   baseURL: `${import.meta.env.BASE_URL}database`,
-  transform(body) {
-    return { code: 0, data: body, message: 'ok' } as any;
-  },
+  transform: transformDatabaseResponse,
 });
 
 export type TransformData<T = any> = Recordable<T>;

+ 88 - 0
apps/smart-pharmacy/src/api/utils/response-transform.ts

@@ -0,0 +1,88 @@
+import type { Recordable } from '@vben-core/typings';
+
+export interface HttpTransformMethod {
+  meta?: {
+    authRole?: string;
+    login?: boolean;
+  };
+}
+
+/** 将后端响应体统一为 { code, message, data } */
+export function transformHttpResponse(
+  body: Recordable<any>,
+  method?: HttpTransformMethod,
+) {
+  /* prettier-ignore */
+  if (body === null || typeof body !== 'object') return { code: 0, data: body, message: 'ok' };
+
+  let code: number;
+  let message: string;
+  let data: Recordable<any>;
+  let rest: Recordable<any> = {};
+
+  if ('code' in body && ('msg' in body || 'message' in body)) {
+    const rawCode = body.code as number;
+    code = rawCode === 200 ? 0 : rawCode;
+    message = (body.msg ?? body.message ?? '') as string;
+    data = (body.data ?? (body.user ? body : void 0)) as Recordable<any>;
+    if (!data && Array.isArray(body.rows)) {
+      data = {
+        total: body.total ?? 0,
+        items: body.rows,
+      };
+    }
+    // 角色菜单树等接口:menus、checkedKeys 可能与 data 平级返回
+    if (Array.isArray(body.menus) || Array.isArray(body.checkedKeys)) {
+      data = {
+        ...(data && typeof data === 'object' ? data : {}),
+        menus: body.menus ?? data?.menus,
+        checkedKeys: body.checkedKeys ?? data?.checkedKeys,
+      };
+    }
+    const { code: _c, msg: _m, message: _msg, data: _d, ...r } = body;
+    rest = r;
+  } else {
+    code = 0;
+    message = 'ok';
+    data = body;
+  }
+  const result = { code, message, data, ...rest };
+
+  if (
+    result.data?.TotalPageCount !== void 0 &&
+    Array.isArray(result.data?.Items)
+  ) {
+    const {
+      TotalRecordCount: total,
+      PageIndex: page,
+      PageSize: size,
+      Items: items,
+    } = result.data;
+    result.data = {
+      total,
+      items,
+      data: { page, size, total },
+    };
+  }
+
+  /* 额外处理登录接口 */
+  if (method?.meta?.login || method?.meta?.authRole === 'login') {
+    const { access_token, token, expires_in, ...loginData } = result.data ?? {};
+    const accessToken = access_token ?? token;
+    result.data = {
+      accessToken: accessToken
+        ? String(accessToken).startsWith('Bearer ')
+          ? accessToken
+          : `Bearer ${accessToken}`
+        : '',
+      refreshToken: null,
+      expiresIn: expires_in,
+      ...loginData,
+    };
+  }
+  return result as any;
+}
+
+export function transformDatabaseResponse(body: Recordable<any>) {
+  return { code: 0, data: body, message: 'ok' } as any;
+}