diff --git a/packages/service/support/permission/app/auth.ts b/packages/service/support/permission/app/auth.ts index 03bc7a83e..0257405ab 100644 --- a/packages/service/support/permission/app/auth.ts +++ b/packages/service/support/permission/app/auth.ts @@ -38,11 +38,13 @@ export const authPluginByTmbId = async ({ export const authAppByTmbId = async ({ tmbId, appId, - per + per, + isRoot }: { tmbId: string; appId: string; per: PermissionValueType; + isRoot?: boolean; }): Promise<{ app: AppDetailType; }> => { @@ -55,6 +57,14 @@ export const authAppByTmbId = async ({ return Promise.reject(AppErrEnum.unExist); } + if (isRoot) { + return { + ...app, + defaultPermission: app.defaultPermission, + permission: new AppPermission({ isOwner: true }) + }; + } + if (String(app.teamId) !== teamId) { return Promise.reject(AppErrEnum.unAuthApp); } @@ -136,7 +146,8 @@ export const authApp = async ({ const { app } = await authAppByTmbId({ tmbId, appId, - per + per, + isRoot: result.isRoot }); return { diff --git a/packages/service/support/permission/controller.ts b/packages/service/support/permission/controller.ts index f96b5ffda..c3d689597 100644 --- a/packages/service/support/permission/controller.ts +++ b/packages/service/support/permission/controller.ts @@ -78,13 +78,18 @@ export const delResourcePermission = ({ /* 下面代码等迁移 */ /* create token */ -export function createJWT(user: { _id?: string; team?: { teamId?: string; tmbId: string } }) { +export function createJWT(user: { + _id?: string; + team?: { teamId?: string; tmbId: string }; + isRoot?: boolean; +}) { const key = process.env.TOKEN_KEY as string; const token = jwt.sign( { userId: String(user._id), teamId: String(user.team?.teamId), tmbId: String(user.team?.tmbId), + isRoot: user.isRoot, exp: Math.floor(Date.now() / 1000) + 60 * 60 * 24 * 7 }, key @@ -98,6 +103,7 @@ export function authJWT(token: string) { userId: string; teamId: string; tmbId: string; + isRoot: boolean; }>((resolve, reject) => { const key = process.env.TOKEN_KEY as string; @@ -110,7 +116,8 @@ export function authJWT(token: string) { resolve({ userId: decoded.userId, teamId: decoded.teamId || '', - tmbId: decoded.tmbId + tmbId: decoded.tmbId, + isRoot: decoded.isRoot }); }); }); @@ -183,7 +190,7 @@ export async function parseHeaderCert({ const { cookie, token, rootkey, authorization } = (req.headers || {}) as ReqHeaderAuthType; - const { uid, teamId, tmbId, appId, openApiKey, authType } = await (async () => { + const { uid, teamId, tmbId, appId, openApiKey, authType, isRoot } = await (async () => { if (authApiKey && authorization) { // apikey from authorization const authResponse = await parseAuthorization(authorization); @@ -205,7 +212,8 @@ export async function parseHeaderCert({ tmbId: res.tmbId, appId: '', openApiKey: '', - authType: AuthUserTypeEnum.token + authType: AuthUserTypeEnum.token, + isRoot: res.isRoot }; } if (authRoot && rootkey) { @@ -217,7 +225,8 @@ export async function parseHeaderCert({ tmbId: '', appId: '', openApiKey: '', - authType: AuthUserTypeEnum.root + authType: AuthUserTypeEnum.root, + isRoot: true }; } @@ -234,7 +243,8 @@ export async function parseHeaderCert({ tmbId: String(tmbId), appId, authType, - apikey: openApiKey + apikey: openApiKey, + isRoot: !!isRoot }; } diff --git a/packages/service/support/permission/dataset/auth.ts b/packages/service/support/permission/dataset/auth.ts index 77b532c4f..91e41c72e 100644 --- a/packages/service/support/permission/dataset/auth.ts +++ b/packages/service/support/permission/dataset/auth.ts @@ -24,11 +24,13 @@ import { ParentIdType } from '@fastgpt/global/common/parentFolder/type'; export const authDatasetByTmbId = async ({ tmbId, datasetId, - per + per, + isRoot = false }: { tmbId: string; datasetId: string; per: PermissionValueType; + isRoot?: boolean; }): Promise<{ dataset: DatasetSchemaType & { permission: DatasetPermission; @@ -44,6 +46,15 @@ export const authDatasetByTmbId = async ({ return Promise.reject(DatasetErrEnum.unExist); } + if (isRoot) { + return { + ...dataset, + permission: new DatasetPermission({ + isOwner: true + }) + }; + } + if (String(dataset.teamId) !== teamId) { return Promise.reject(DatasetErrEnum.unAuthDataset); } @@ -131,7 +142,8 @@ export const authDataset = async ({ const { dataset } = await authDatasetByTmbId({ tmbId, datasetId, - per + per, + isRoot: result.isRoot }); return { @@ -144,15 +156,17 @@ export const authDataset = async ({ export async function authDatasetCollection({ collectionId, per = NullPermission, + isRoot = false, ...props }: AuthModeType & { collectionId: string; + isRoot?: boolean; }): Promise< AuthResponseType & { collection: CollectionWithDatasetType; } > { - const { teamId, tmbId } = await parseHeaderCert(props); + const { teamId, tmbId, isRoot: isRootFromHeader } = await parseHeaderCert(props); const collection = await getCollectionWithDataset(collectionId); if (!collection) { @@ -162,7 +176,8 @@ export async function authDatasetCollection({ const { dataset } = await authDatasetByTmbId({ tmbId, datasetId: collection.datasetId._id, - per + per, + isRoot: isRootFromHeader || isRoot }); return { @@ -184,7 +199,7 @@ export async function authDatasetFile({ file: DatasetFileSchema; } > { - const { teamId, tmbId } = await parseHeaderCert(props); + const { teamId, tmbId, isRoot } = await parseHeaderCert(props); const [file, collection] = await Promise.all([ getFileById({ bucketName: BucketNameEnum.dataset, fileId }), @@ -206,7 +221,8 @@ export async function authDatasetFile({ const { permission } = await authDatasetCollection({ ...props, collectionId: collection._id, - per + per, + isRoot }); return { diff --git a/packages/service/support/permission/user/auth.ts b/packages/service/support/permission/user/auth.ts index 4946239ff..78855b443 100644 --- a/packages/service/support/permission/user/auth.ts +++ b/packages/service/support/permission/user/auth.ts @@ -4,6 +4,7 @@ import { getTmbInfoByTmbId } from '../../user/team/controller'; import { TeamErrEnum } from '@fastgpt/global/common/error/code/team'; import { AuthModeType, AuthResponseType } from '../type'; import { NullPermission } from '@fastgpt/global/support/permission/constant'; +import { TeamPermission } from '@fastgpt/global/support/permission/user/controller'; /* auth user role */ export async function authUserPer(props: AuthModeType): Promise< @@ -14,6 +15,15 @@ export async function authUserPer(props: AuthModeType): Promise< const result = await parseHeaderCert(props); const tmb = await getTmbInfoByTmbId({ tmbId: result.tmbId }); + if (result.isRoot) { + return { + ...result, + permission: new TeamPermission({ + isOwner: true + }), + tmb + }; + } if (!tmb.permission.checkPer(props.per ?? NullPermission)) { return Promise.reject(TeamErrEnum.unAuthTeam); } diff --git a/packages/web/hooks/usePagination.tsx b/packages/web/hooks/usePagination.tsx index 231bfcf87..26e467c3d 100644 --- a/packages/web/hooks/usePagination.tsx +++ b/packages/web/hooks/usePagination.tsx @@ -16,7 +16,7 @@ type PagingData = { total?: number; }; -export function usePagination({ +export function usePagination({ api, pageSize = 10, params = {}, @@ -25,7 +25,7 @@ export function usePagination({ onChange, elementRef }: { - api: (data: any) => any; + api: (data: any) => Promise>; pageSize?: number; params?: Record; defaultRequest?: boolean; @@ -41,7 +41,7 @@ export function usePagination({ const [total, setTotal] = useState(0); const totalRef = useRef(total); totalRef.current = total; - const [data, setData] = useState([]); + const [data, setData] = useState([]); const dataLengthRef = useRef(data.length); dataLengthRef.current = data.length; const maxPage = useMemo(() => Math.ceil(total / pageSize) || 1, [pageSize, total]); @@ -49,7 +49,7 @@ export function usePagination({ const { mutate, isLoading } = useMutation({ mutationFn: async (num: number = pageNum) => { try { - const res: PagingData = await api({ + const res: PagingData = await api({ pageNum: num, pageSize, ...params @@ -107,7 +107,7 @@ export function usePagination({ onKeyDown={(e) => { // @ts-ignore const val = +e.target.value; - if (val && e.keyCode === 13) { + if (val && e.key === 'Enter') { if (val === pageNum) return; if (val >= maxPage) { mutate(maxPage); diff --git a/packages/web/i18n/zh/app.json b/packages/web/i18n/zh/app.json index 637ff8f75..2fe7b13f0 100644 --- a/packages/web/i18n/zh/app.json +++ b/packages/web/i18n/zh/app.json @@ -72,6 +72,7 @@ "logs_empty": "还没有日志噢~", "logs_message_total": "消息总数", "logs_title": "标题", + "logs_chat_user": "使用者", "mark_count": "标注答案数量", "module": { "Confirm Sync": "将会更新至最新的模板配置,不存在模板中的字段将会被删除(包括所有自定义字段),建议您先复制一份节点,再更新原来节点的版本。", diff --git a/projects/app/src/pages/account/components/Promotion.tsx b/projects/app/src/pages/account/components/Promotion.tsx index 7543f4566..255e3cdd1 100644 --- a/projects/app/src/pages/account/components/Promotion.tsx +++ b/projects/app/src/pages/account/components/Promotion.tsx @@ -20,7 +20,6 @@ import { getPromotionInitData, getPromotionRecords } from '@/web/support/activit import { useUserStore } from '@/web/support/user/useUserStore'; import { useCopyData } from '@/web/common/hooks/useCopyData'; -import type { PromotionRecordType } from '@/global/support/api/userRes.d'; import dayjs from 'dayjs'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import { useLoading } from '@fastgpt/web/hooks/useLoading'; @@ -40,7 +39,7 @@ const Promotion = () => { total, pageSize, Pagination - } = usePagination({ + } = usePagination({ api: getPromotionRecords, pageSize: 20 }); diff --git a/projects/app/src/pages/account/components/bill/BillTable.tsx b/projects/app/src/pages/account/components/bill/BillTable.tsx index 55620cfc7..2345ad58e 100644 --- a/projects/app/src/pages/account/components/bill/BillTable.tsx +++ b/projects/app/src/pages/account/components/bill/BillTable.tsx @@ -62,7 +62,7 @@ const BillTable = () => { Pagination, getData, total - } = usePagination({ + } = usePagination({ api: getBills, pageSize: 20, params: { diff --git a/projects/app/src/pages/account/components/bill/InvoiceTable.tsx b/projects/app/src/pages/account/components/bill/InvoiceTable.tsx index 563a51afe..b9bed4bbf 100644 --- a/projects/app/src/pages/account/components/bill/InvoiceTable.tsx +++ b/projects/app/src/pages/account/components/bill/InvoiceTable.tsx @@ -31,7 +31,7 @@ const InvoiceTable = () => { Pagination, getData, total - } = usePagination({ + } = usePagination({ api: getInvoiceRecords, pageSize: 20, defaultRequest: false diff --git a/projects/app/src/pages/api/core/app/getChatLogs.ts b/projects/app/src/pages/api/core/app/getChatLogs.ts index 8149f413b..e625e0262 100644 --- a/projects/app/src/pages/api/core/app/getChatLogs.ts +++ b/projects/app/src/pages/api/core/app/getChatLogs.ts @@ -13,7 +13,7 @@ import { readFromSecondary } from '@fastgpt/service/common/mongo/utils'; async function handler( req: NextApiRequest, - res: NextApiResponse + _res: NextApiResponse ): Promise> { const { pageNum = 1, @@ -131,7 +131,9 @@ async function handler( userGoodFeedbackCount: 1, userBadFeedbackCount: 1, customFeedbacksCount: 1, - markCount: 1 + markCount: 1, + outLinkUid: 1, + tmbId: 1 } } ], diff --git a/projects/app/src/pages/api/support/user/account/loginByPassword.ts b/projects/app/src/pages/api/support/user/account/loginByPassword.ts index d34272a86..5a165b572 100644 --- a/projects/app/src/pages/api/support/user/account/loginByPassword.ts +++ b/projects/app/src/pages/api/support/user/account/loginByPassword.ts @@ -6,7 +6,6 @@ import { connectToDatabase } from '@/service/mongo'; import { getUserDetail } from '@fastgpt/service/support/user/controller'; import type { PostLoginProps } from '@fastgpt/global/support/user/api.d'; import { UserStatusEnum } from '@fastgpt/global/support/user/constant'; -import { checkTeamAiPointsAndLock } from '@/service/events/utils'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { try { @@ -50,7 +49,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) lastLoginTmbId: userDetail.team.tmbId }); - const token = createJWT(userDetail); + const token = createJWT({ + ...userDetail, + isRoot: username === 'root' + }); + setCookie(res, token); jsonRes(res, { diff --git a/projects/app/src/pages/app/detail/components/Logs/index.tsx b/projects/app/src/pages/app/detail/components/Logs/index.tsx index 97fd2358b..3c2776928 100644 --- a/projects/app/src/pages/app/detail/components/Logs/index.tsx +++ b/projects/app/src/pages/app/detail/components/Logs/index.tsx @@ -13,13 +13,12 @@ import { ModalBody, HStack } from '@chakra-ui/react'; +import Avatar from '@fastgpt/web/components/common/Avatar'; import MyIcon from '@fastgpt/web/components/common/Icon'; import { useTranslation } from 'next-i18next'; import { getAppChatLogs } from '@/web/core/app/api'; import dayjs from 'dayjs'; import { ChatSourceMap } from '@fastgpt/global/core/chat/constants'; -import { AppLogsListItemType } from '@/types/app'; -import { useSystemStore } from '@/web/common/system/useSystemStore'; import MyModal from '@fastgpt/web/components/common/MyModal'; import { addDays } from 'date-fns'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; @@ -32,6 +31,8 @@ import { cardStyles } from '../constants'; import dynamic from 'next/dynamic'; import { useSystem } from '@fastgpt/web/hooks/useSystem'; +import { useUserStore } from '@/web/support/user/useUserStore'; +import Tag from '@fastgpt/web/components/common/Tag'; const DetailLogsModal = dynamic(() => import('./DetailLogsModal')); const Logs = () => { @@ -40,6 +41,7 @@ const Logs = () => { const { isPc } = useSystem(); const appId = useContextSelector(AppContext, (v) => v.appId); + const { teamMembers } = useUserStore(); const [dateRange, setDateRange] = useState({ from: addDays(new Date(), -7), @@ -58,7 +60,7 @@ const Logs = () => { Pagination, getData, pageNum - } = usePagination({ + } = usePagination({ api: getAppChatLogs, pageSize: 20, params: { @@ -107,11 +109,12 @@ const Logs = () => { {t('common:core.app.logs.Source And Time')} - {appT('logs_title')} - {appT('logs_message_total')} - {appT('feedback_count')} + {t('app:logs_chat_user')} + {t('app:logs_title')} + {t('app:logs_message_total')} + {t('app:feedback_count')} {t('common:core.app.feedback.Custom feedback')} - {appT('mark_count')} + {t('app:mark_count')} @@ -127,6 +130,23 @@ const Logs = () => { {t(ChatSourceMap[item.source]?.name || ('UnKnow' as any))} {dayjs(item.time).format('YYYY/MM/DD HH:mm')} + + + {item.source === 'share' ? ( + item.outLinkUid + ) : ( + + v.tmbId === item.tmbId)?.avatar} + w="1.25rem" + /> + + {teamMembers.find((v) => v.tmbId === item.tmbId)?.memberName} + + + )} + + {item.title} diff --git a/projects/app/src/pages/dataset/detail/components/DataCard.tsx b/projects/app/src/pages/dataset/detail/components/DataCard.tsx index a0d0d0fd3..2ae8b97e9 100644 --- a/projects/app/src/pages/dataset/detail/components/DataCard.tsx +++ b/projects/app/src/pages/dataset/detail/components/DataCard.tsx @@ -1,22 +1,11 @@ -import React, { useState, useRef, useMemo, useCallback } from 'react'; -import { - Box, - Card, - IconButton, - Flex, - Grid, - Button, - useTheme, - useDisclosure, - HStack -} from '@chakra-ui/react'; +import React, { useState, useRef, useMemo } from 'react'; +import { Box, Card, IconButton, Flex, Button, useTheme } from '@chakra-ui/react'; import { getDatasetDataList, delOneDatasetDataById, getDatasetCollectionById, putDatasetDataById } from '@/web/core/dataset/api'; -import { DeleteIcon } from '@chakra-ui/icons'; import { useQuery } from '@tanstack/react-query'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; @@ -27,16 +16,8 @@ import MyIcon from '@fastgpt/web/components/common/Icon'; import MyInput from '@/components/MyInput'; import InputDataModal from '../components/InputDataModal'; import RawSourceBox from '@/components/core/dataset/RawSourceBox'; -import type { DatasetDataListItemType } from '@/global/core/dataset/type.d'; -import { TabEnum } from '..'; -import { DatasetCollectionTypeMap, TrainingTypeMap } from '@fastgpt/global/core/dataset/constants'; -import { formatTime2YMDHM } from '@fastgpt/global/common/string/time'; -import { formatFileSize } from '@fastgpt/global/common/file/tools'; -import { getCollectionSourceAndOpen } from '@/web/core/dataset/hooks/readCollectionSource'; -import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; import { usePagination } from '@fastgpt/web/hooks/usePagination'; import { getCollectionSourceData } from '@fastgpt/global/core/dataset/collection/utils'; -import { useI18n } from '@/web/context/I18n'; import EmptyTip from '@fastgpt/web/components/common/EmptyTip'; import { DatasetPageContext } from '@/web/core/dataset/context/datasetPageContext'; import { useContextSelector } from 'use-context-selector'; @@ -78,7 +59,7 @@ const DataCard = () => { pageNum, pageSize, isLoading: isRequesting - } = usePagination({ + } = usePagination({ api: getDatasetDataList, pageSize: 24, defaultRequest: false, @@ -125,7 +106,7 @@ const DataCard = () => { const canWrite = useMemo(() => datasetDetail.permission.hasWritePer, [datasetDetail]); - const { run: onUpdate, loading } = useRequest2(putDatasetDataById, { + const { loading } = useRequest2(putDatasetDataById, { onSuccess() { getData(pageNum); } diff --git a/projects/app/src/types/app.d.ts b/projects/app/src/types/app.d.ts index 21fc52f73..28253d1a4 100644 --- a/projects/app/src/types/app.d.ts +++ b/projects/app/src/types/app.d.ts @@ -43,4 +43,6 @@ export type AppLogsListItemType = { userBadFeedbackCount: number; customFeedbacksCount: number; markCount: number; + outLinkUid?: string; + tmbId: string; }; diff --git a/projects/app/src/web/core/app/api.ts b/projects/app/src/web/core/app/api.ts index c44832c62..700fb6e97 100644 --- a/projects/app/src/web/core/app/api.ts +++ b/projects/app/src/web/core/app/api.ts @@ -4,6 +4,8 @@ import type { GetAppChatLogsParams } from '@/global/core/api/appReq.d'; import { AppUpdateParams, AppChangeOwnerBody } from '@/global/core/app/api'; import type { CreateAppBody } from '@/pages/api/core/app/create'; import type { ListAppBody } from '@/pages/api/core/app/list'; +import { AppLogsListItemType } from '@/types/app'; +import { PagingData } from '@/types'; /** * 获取模型列表 @@ -36,7 +38,8 @@ export const putAppById = (id: string, data: AppUpdateParams) => PUT(`/core/app/update?appId=${id}`, data); // =================== chat logs -export const getAppChatLogs = (data: GetAppChatLogsParams) => POST(`/core/app/getChatLogs`, data); +export const getAppChatLogs = (data: GetAppChatLogsParams) => + POST>(`/core/app/getChatLogs`, data); export const resumeInheritPer = (appId: string) => GET(`/core/app/resumeInheritPermission`, { appId }); diff --git a/projects/app/src/web/core/dataset/api.ts b/projects/app/src/web/core/dataset/api.ts index 81d758d0d..80d02695b 100644 --- a/projects/app/src/web/core/dataset/api.ts +++ b/projects/app/src/web/core/dataset/api.ts @@ -34,7 +34,10 @@ import type { CreateDatasetParams, InsertOneDatasetDataProps } from '@/global/co import type { DatasetCollectionItemType } from '@fastgpt/global/core/dataset/type'; import { DatasetCollectionSyncResultEnum } from '@fastgpt/global/core/dataset/constants'; import type { DatasetDataItemType } from '@fastgpt/global/core/dataset/type'; -import type { DatasetCollectionsListItemType } from '@/global/core/dataset/type.d'; +import type { + DatasetCollectionsListItemType, + DatasetDataListItemType +} from '@/global/core/dataset/type.d'; import { PagingData } from '@/types'; import type { getDatasetTrainingQueueResponse } from '@/pages/api/core/dataset/training/getDatasetTrainingQueue'; import type { rebuildEmbeddingBody } from '@/pages/api/core/dataset/training/rebuildEmbedding'; @@ -153,7 +156,7 @@ export const getScrollCollectionList = (data: GetScrollCollectionsProps) => /* =============================== data ==================================== */ /* get dataset list */ export const getDatasetDataList = (data: GetDatasetDataListProps) => - POST(`/core/dataset/data/list`, data); + POST>(`/core/dataset/data/list`, data); export const getDatasetDataItemById = (id: string) => GET(`/core/dataset/data/detail`, { id }); diff --git a/projects/app/src/web/support/activity/promotion/api.ts b/projects/app/src/web/support/activity/promotion/api.ts index 51778e651..b44cf67cb 100644 --- a/projects/app/src/web/support/activity/promotion/api.ts +++ b/projects/app/src/web/support/activity/promotion/api.ts @@ -1,6 +1,6 @@ import { GET, POST, PUT } from '@/web/common/api/request'; import type { PromotionRecordType } from '@/global/support/api/userRes.d'; -import type { RequestPaging } from '@/types'; +import { PagingData, type RequestPaging } from '@/types'; /* get promotion init data */ export const getPromotionInitData = () => @@ -11,4 +11,4 @@ export const getPromotionInitData = () => /* promotion records */ export const getPromotionRecords = (data: RequestPaging) => - POST(`/proApi/support/activity/promotion/getPromotions`, data); + POST>(`/proApi/support/activity/promotion/getPromotions`, data); diff --git a/projects/app/src/web/support/wallet/bill/api.ts b/projects/app/src/web/support/wallet/bill/api.ts index ce178f38a..a04de528c 100644 --- a/projects/app/src/web/support/wallet/bill/api.ts +++ b/projects/app/src/web/support/wallet/bill/api.ts @@ -1,4 +1,4 @@ -import { RequestPaging } from '@/types'; +import { PagingData, RequestPaging } from '@/types'; import { GET, POST } from '@/web/common/api/request'; import { CreateBillProps, CreateBillResponse } from '@fastgpt/global/support/wallet/bill/api'; import { BillTypeEnum } from '@fastgpt/global/support/wallet/bill/constants'; @@ -8,7 +8,7 @@ export const getBills = ( data: RequestPaging & { type?: BillTypeEnum; } -) => POST(`/proApi/support/wallet/bill/list`, data); +) => POST>(`/proApi/support/wallet/bill/list`, data); export const getWxPayQRCode = (data: CreateBillProps) => POST(`/proApi/support/wallet/bill/create`, data); diff --git a/projects/app/src/web/support/wallet/bill/invoice/api.ts b/projects/app/src/web/support/wallet/bill/invoice/api.ts index 74c0572be..eed4d7176 100644 --- a/projects/app/src/web/support/wallet/bill/invoice/api.ts +++ b/projects/app/src/web/support/wallet/bill/invoice/api.ts @@ -1,4 +1,4 @@ -import { RequestPaging } from '@/types'; +import { PagingData, RequestPaging } from '@/types'; import { GET, POST } from '@/web/common/api/request'; import { BillTypeEnum } from '@fastgpt/global/support/wallet/bill/constants'; import { InvoiceType } from '@fastgpt/global/support/wallet/bill/type'; @@ -17,4 +17,4 @@ export const submitInvoice = (data: InvoiceType) => POST(`/proApi/support/wallet/bill/invoice/submit`, data); export const getInvoiceRecords = (data: RequestPaging) => - POST(`/proApi/support/wallet/bill/invoice/records`, data); + POST>(`/proApi/support/wallet/bill/invoice/records`, data);