From 7b989d6982a1cc76ce00880e850b0b7b786651cc Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期三, 17 九月 2025 10:57:27 +0800 Subject: [PATCH] feat: 资金管理 --- src/views/FinanceManage/FinanceManageList.vue | 17 +- .eslintrc-auto-import.json | 2 src/services/api/typings.d.ts | 97 +++++++++++++++ auto-imports.d.ts | 4 src/constants/finance.ts | 13 ++ src/views/FinanceManage/BalanceManage.vue | 32 ++--- src/constants/index.ts | 1 src/views/FinanceManage/components/BalanceDetailDialog.vue | 82 +++++++++++-- src/views/FinanceManage/components/FinanceDetailDialog.vue | 53 ++++---- src/services/api/user.ts | 18 +++ 10 files changed, 247 insertions(+), 72 deletions(-) diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index a41a329..47846f1 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -102,7 +102,9 @@ "EnumUserType": true, "EnumUserTypeText": true, "EnumUserWalletTransactionType": true, + "EnumUserWalletTransactionTypeText": true, "EnumWalletTransactionStatus": true, + "EnumWalletTransactionStatusText": true, "ExtractDefaultPropTypes": true, "ExtractPropTypes": true, "ExtractPublicPropTypes": true, diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 05cb3dc..28bd8b0 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -106,7 +106,9 @@ const EnumUserType: typeof import('./src/constants/apiEnum')['EnumUserType'] const EnumUserTypeText: typeof import('./src/constants/apiEnumText')['EnumUserTypeText'] const EnumUserWalletTransactionType: typeof import('./src/constants/apiEnum')['EnumUserWalletTransactionType'] + const EnumUserWalletTransactionTypeText: typeof import('./src/constants/finance')['EnumUserWalletTransactionTypeText'] const EnumWalletTransactionStatus: typeof import('./src/constants/apiEnum')['EnumWalletTransactionStatus'] + const EnumWalletTransactionStatusText: typeof import('./src/constants/finance')['EnumWalletTransactionStatusText'] const FastButtonMap: typeof import('./src/constants/module')['FastButtonMap'] const FastColumnList: typeof import('./src/constants/module')['FastColumnList'] const FastDataButtonList: typeof import('./src/constants/module')['FastDataButtonList'] @@ -407,7 +409,9 @@ readonly EnumUserType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumUserType']> readonly EnumUserTypeText: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumUserTypeText']> readonly EnumUserWalletTransactionType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumUserWalletTransactionType']> + readonly EnumUserWalletTransactionTypeText: UnwrapRef<typeof import('./src/constants/finance')['EnumUserWalletTransactionTypeText']> readonly EnumWalletTransactionStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumWalletTransactionStatus']> + readonly EnumWalletTransactionStatusText: UnwrapRef<typeof import('./src/constants/finance')['EnumWalletTransactionStatusText']> readonly FastButtonMap: UnwrapRef<typeof import('./src/constants/module')['FastButtonMap']> readonly FastColumnList: UnwrapRef<typeof import('./src/constants/module')['FastColumnList']> readonly FastDataButtonList: UnwrapRef<typeof import('./src/constants/module')['FastDataButtonList']> diff --git a/src/constants/finance.ts b/src/constants/finance.ts new file mode 100644 index 0000000..cee845d --- /dev/null +++ b/src/constants/finance.ts @@ -0,0 +1,13 @@ +export const EnumUserWalletTransactionTypeText = { + [EnumUserWalletTransactionType.Income]: '鏀跺叆', + [EnumUserWalletTransactionType.Withdraw]: '鎻愮幇', +}; + +export const EnumWalletTransactionStatusText = { + [EnumWalletTransactionStatus.WaitSubmit]: '寰呮彁浜�', + [EnumWalletTransactionStatus.WaitPay]: '寰呮敮浠�', + [EnumWalletTransactionStatus.Dealing]: '澶勭悊涓�', + [EnumWalletTransactionStatus.Success]: '鎴愬姛', + [EnumWalletTransactionStatus.Refund]: '閫�绁�', + [EnumWalletTransactionStatus.Fail]: '澶辫触', +}; diff --git a/src/constants/index.ts b/src/constants/index.ts index f578bc8..fb702a3 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -20,3 +20,4 @@ export * from './enterpriseEmployee'; export * from './electronSign'; export * from './enterpriseWallet'; +export * from './finance'; diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts index 64d7946..8950cd5 100644 --- a/src/services/api/typings.d.ts +++ b/src/services/api/typings.d.ts @@ -1732,6 +1732,24 @@ timestamp?: number; } + interface FriendlyResultGetPersonalUserWalletBalancesQueryResult { + /** 璺熻釜Id */ + traceId?: string; + /** 鐘舵�佺爜 */ + code?: number; + /** 閿欒鐮� */ + errorCode?: string; + data?: GetPersonalUserWalletBalancesQueryResult; + /** 鎵ц鎴愬姛 */ + success?: boolean; + /** 閿欒淇℃伅 */ + msg?: any; + /** 闄勫姞鏁版嵁 */ + extras?: any; + /** 鏃堕棿鎴� */ + timestamp?: number; + } + interface FriendlyResultGetResourceLogsQueryResult { /** 璺熻釜Id */ traceId?: string; @@ -3928,6 +3946,8 @@ interface GetPersonalUserInfoSignContractsQuery { /** 鐢ㄦ埛Id */ id?: string; + /** 鐏靛伐Id */ + enterpriseEmployeeId?: string; pageModel?: PagedListQueryPageModel; } @@ -4062,10 +4082,26 @@ settlementAmount?: number; /** 瀹炲彂閲戦/鎻愮幇閲戦 */ amount?: number; - /** 鏀舵浜哄鍚� */ - receiveName?: string; + /** 浠樻浜鸿处鎴� */ + payerAccount?: string; + /** 浠樻浜哄悕绉� */ + payerName?: string; + /** 浠樻浜哄紑鎴疯 */ + payerBank?: string; + /** 浠樻浜烘敮琛� */ + payerBankBranch?: string; /** 鏀舵璐︽埛 */ receiveAccount?: string; + /** 鏀舵浜哄悕绉� */ + receiveName?: string; + /** 鏀舵浜哄紑鎴疯 */ + receiveBank?: string; + /** 鏀舵浜烘敮琛� */ + receiveBankBranch?: string; + /** 甯佺 */ + currency?: string; + /** 鐢ㄩ�� */ + purpose?: string; /** 鏈嶅姟璐� */ serviceFee?: number; /** 瀹為檯鍒拌处 */ @@ -4076,6 +4112,7 @@ transDate?: string; /** 鍒涘缓鏃堕棿 */ createdTime?: string; + transactionStatus?: EnumWalletTransactionStatus; /** 澶辫触鍘熷洜 */ failReason?: string; } @@ -4086,6 +4123,8 @@ /** 鍒涘缓鏃堕棿-鎴 */ createdTimeEnd?: string; type?: EnumUserWalletTransactionType; + /** 鐢ㄦ埛Id */ + userId?: string; pageModel?: PagedListQueryPageModel; } @@ -4099,14 +4138,35 @@ interface GetPersonalUserTransactionsQueryResultItem { /** 鏀舵敮Id */ id?: string; + type?: EnumUserWalletTransactionType; /** 鏍囬 */ title?: string; - /** 鍒涘缓鏃堕棿 */ - createdTime?: string; /** 閲戦 */ amount?: number; /** 浣欓 */ balance?: number; + /** 浼佷笟鍚嶇О */ + enterpriseName?: string; + /** 浠樻浜鸿处鎴� */ + payerAccount?: string; + /** 浠樻浜哄悕绉� */ + payerName?: string; + /** 浠樻浜鸿处鍙� */ + payerUserName?: string; + /** 浠樻浜鸿仈绯讳汉 */ + payerContacts?: string; + /** 浠樻浜鸿仈绯荤數璇� */ + payerContactPhoneNumber?: string; + /** 鏀舵璐︽埛 */ + receiveAccount?: string; + /** 鏀舵浜哄悕绉� */ + receiveName?: string; + /** 鐢ㄩ�� */ + purpose?: string; + /** 鍒涘缓鏃堕棿 */ + createdTime?: string; + /** 浜ゆ槗鏃堕棿 */ + transDate?: string; } interface GetPersonalUserTransactionsQueryResultObjectData { @@ -4116,6 +4176,35 @@ sumWithdraw?: number; } + interface GetPersonalUserWalletBalancesQuery { + /** 鏈�灏忎綑棰� */ + balanceMin?: number; + /** 鏈�澶т綑棰� */ + balanceMax?: number; + /** 鍏抽敭瀛� */ + keywords?: string; + pageModel?: PagedListQueryPageModel; + } + + interface GetPersonalUserWalletBalancesQueryResult { + pageModel?: PagedListQueryResultPageModel; + /** 鏁版嵁 */ + data?: GetPersonalUserWalletBalancesQueryResultItem[]; + } + + interface GetPersonalUserWalletBalancesQueryResultItem { + /** 鐢ㄦ埛Id */ + id?: string; + /** 濮撳悕 */ + name?: string; + /** 鎵嬫満鍙� */ + contactPhoneNumber?: string; + /** 韬唤璇佸彿 */ + identity?: string; + /** 浣欓 */ + balance?: number; + } + interface GetResourceFieldsQueryResultItem { /** 缂栧彿 */ code?: string; diff --git a/src/services/api/user.ts b/src/services/api/user.ts index 5ea222a..d06c228 100644 --- a/src/services/api/user.ts +++ b/src/services/api/user.ts @@ -106,6 +106,24 @@ ); } +/** 鏌ヨ涓汉閽卞寘浣欓鍒嗛〉鍒楄〃 POST /api/user/user/getPersonalUserWalletBalances */ +export async function getPersonalUserWalletBalances( + body: API.GetPersonalUserWalletBalancesQuery, + options?: API.RequestConfig +) { + return request<API.GetPersonalUserWalletBalancesQueryResult>( + '/api/user/user/getPersonalUserWalletBalances', + { + method: 'POST', + headers: { + 'Content-Type': 'application/json-patch+json', + }, + data: body, + ...(options || {}), + } + ); +} + /** 鏌ヨ鐢ㄦ埛瑙掕壊鍒楄〃 GET /api/user/user/getUserInfoRoles */ export async function getUserInfoRoles( // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄) diff --git a/src/views/FinanceManage/BalanceManage.vue b/src/views/FinanceManage/BalanceManage.vue index 92ffa1d..e14f104 100644 --- a/src/views/FinanceManage/BalanceManage.vue +++ b/src/views/FinanceManage/BalanceManage.vue @@ -3,24 +3,16 @@ <AppContainer> <ProTableQueryFilterBar @on-reset="reset"> <template #query> - <QueryFilterItem> - <FieldSelect - placeholder="鎵�灞炲叕鍙�" - v-model="extraParamState.status" - :value-enum="[]" - @change="getList()" - /> - </QueryFilterItem> <QueryFilterItem tip-content="浣欓鑼冨洿"> <el-input-number - v-model="extraParamState.minAmount" + v-model="extraParamState.balanceMin" placeholder="浣欓鏈�灏忛噾棰�" size="small" style="width: 150px" :controls="false" />~ <el-input-number - v-model="extraParamState.maxAmount" + v-model="extraParamState.balanceMax" placeholder="浣欓鏈�澶ч噾棰�" size="small" style="width: 150px" @@ -29,7 +21,7 @@ </QueryFilterItem> <QueryFilterItem> <SearchInput - v-model="extraParamState.keyword" + v-model="extraParamState.keywords" style="width: 260px" placeholder="濮撳悕/鎵嬫満鍙�/韬唤璇佸彿" @on-click-search="getList" @@ -59,7 +51,7 @@ FieldSelect, } from '@bole-core/components'; import { useAccess } from '@/hooks'; -import * as enterpriseServices from '@/services/api/enterprise'; +import * as userServices from '@/services/api/user'; import BalanceDetailDialog from './components/BalanceDetailDialog.vue'; defineOptions({ @@ -95,15 +87,18 @@ } = useTable( async ({ pageIndex, pageSize }, extraParamState) => { try { - let params: API.GetEnterprisesQuery = { + let params: API.GetPersonalUserWalletBalancesQuery = { pageModel: { rows: pageSize, page: pageIndex, orderInput: extraParamState.orderInput, }, - // searchKeys: extraParamState.keyword, + keywords: extraParamState.keywords, + balanceMin: extraParamState.balanceMin, + balanceMax: extraParamState.balanceMax, }; - let res = await enterpriseServices.getEnterprises(params, { + + let res = await userServices.getPersonalUserWalletBalances(params, { showLoading: !state.loading, }); return res; @@ -111,10 +106,9 @@ }, { defaultExtraParams: { - keyword: '', - status: '', - minAmount: null as number, - maxAmount: null as number, + keywords: '', + balanceMin: null as number, + balanceMax: null as number, orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], }, columnsRenderProps: {}, diff --git a/src/views/FinanceManage/FinanceManageList.vue b/src/views/FinanceManage/FinanceManageList.vue index 183bcca..e51be1f 100644 --- a/src/views/FinanceManage/FinanceManageList.vue +++ b/src/views/FinanceManage/FinanceManageList.vue @@ -19,7 +19,7 @@ } from '@bole-core/components'; import { useAccess } from '@/hooks'; import { ModelValueType } from 'element-plus'; -import * as enterpriseServices from '@/services/api/enterprise'; +import * as userServices from '@/services/api/user'; import FinanceDetailDialog from './components/FinanceDetailDialog.vue'; defineOptions({ @@ -55,15 +55,15 @@ } = useTable( async ({ pageIndex, pageSize }, extraParamState) => { try { - let params: API.GetEnterprisesQuery = { + let params: API.GetPersonalUserTransactionsQuery = { pageModel: { rows: pageSize, page: pageIndex, orderInput: extraParamState.orderInput, }, - // searchKeys: extraParamState.keyword, + type: EnumUserWalletTransactionType.Income, }; - let res = await enterpriseServices.getEnterprises(params, { + let res = await userServices.getPersonalUserTransactions(params, { showLoading: !state.loading, }); return res; @@ -71,14 +71,11 @@ }, { defaultExtraParams: { - keyword: '', - pageType: '' as any as number, - status: '' as any as boolean, - beginDate: [] as unknown as ModelValueType, - endDate: [] as unknown as ModelValueType, orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], }, - columnsRenderProps: {}, + columnsRenderProps: { + transDate: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, + }, } ); diff --git a/src/views/FinanceManage/components/BalanceDetailDialog.vue b/src/views/FinanceManage/components/BalanceDetailDialog.vue index a81d09f..d18b592 100644 --- a/src/views/FinanceManage/components/BalanceDetailDialog.vue +++ b/src/views/FinanceManage/components/BalanceDetailDialog.vue @@ -5,11 +5,12 @@ <template #query> <QueryFilterItem> <FieldSelect - v-model="extraParamState.status" - :valueEnum="[]" + v-model="extraParamState.type" + :valueEnum="EnumUserWalletTransactionTypeText" clearable filterable placeholder="浜ゆ槗绫诲瀷" + @change="getList()" /> </QueryFilterItem> <QueryFilterItem tip-content="鏌ヨ鏃ユ湡"> @@ -25,9 +26,25 @@ </QueryFilterItem> </template> </ProTableQueryFilterBar> - <ProTableV2 v-bind="proTableProps" :columns="columns" :showOperationColumn="false"> + <ProTableV2 v-bind="proTableProps" :columns="columns" :operationBtns="operationBtns"> + <template #income="{ row }"> + <div style="color: #67c23a" v-if="row.type === EnumUserWalletTransactionType.Income"> + {{ `+${toThousand(row.amount)}` }} + </div> + <div v-else>/</div> + </template> + <template #outcome="{ row }"> + <div style="color: #f56c6c" v-if="row.type === EnumUserWalletTransactionType.Withdraw"> + {{ toThousand(row.amount) }} + </div> + <div v-else>/</div> + </template> + <template #account="{ row }"> + {{ `${row.receiveAccount} - ${row.receiveName}` }} + </template> </ProTableV2> </ProDialogTableWrapper> + <FinanceDetailDialog v-bind="dialogProps"></FinanceDetailDialog> </ProDialog> </template> @@ -42,9 +59,14 @@ FieldSelect, ProTableV2, ProTableQueryFilterBar, + useFormDialog, + defineOperationBtns, } from '@bole-core/components'; -import * as enterpriseServices from '@/services/api/enterprise'; +import * as userServices from '@/services/api/user'; import { ModelValueType } from 'element-plus'; +import { format, toThousand } from '@/utils'; +import { EnumUserWalletTransactionTypeText, EnumUserWalletTransactionType } from '@/constants'; +import FinanceDetailDialog from './FinanceDetailDialog.vue'; defineOptions({ name: 'FinanceDetailDialog', @@ -65,33 +87,45 @@ const columns = defineColumns([ { id: '1', - enCode: 'name', + enCode: 'transDate', name: '浜ゆ槗鏃堕棿', }, { id: '2', - enCode: 'name', + enCode: 'income', name: '鏀跺叆', }, { id: '3', - enCode: 'name', + enCode: 'outcome', name: '鏀嚭', }, { id: '4', - enCode: 'name', + enCode: 'balance', name: '璐︽埛浣欓', }, { id: '4', - enCode: 'name', + enCode: 'account', name: '瀵规柟甯愬彿/鎴峰悕', }, { id: '4', - enCode: 'name', + enCode: 'purpose', name: '鐢ㄩ��', + }, +]); + +const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'detailBtn', + name: '鏄庣粏', + }, + emits: { + onClick: (role) => openDialog(role), + }, }, ]); @@ -113,27 +147,45 @@ } = useTable( async ({ pageIndex, pageSize }, extraParamState) => { try { - let params: API.GetEnterprisesQuery = { + let params: API.GetPersonalUserTransactionsQuery = { pageModel: { rows: pageSize, page: pageIndex, orderInput: extraParamState.orderInput, }, - // searchKeys: extraParamState.keyword, + createdTimeStart: format(extraParamState.creationTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), + createdTimeEnd: format(extraParamState.creationTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), + type: extraParamState.type, + userId: form.value.id, }; - let res = await enterpriseServices.getEnterprises(params); + let res = await userServices.getPersonalUserTransactions(params); return res; } catch (error) {} }, { defaultExtraParams: { - status: '', + type: '' as any as EnumUserWalletTransactionType, creationTime: [] as unknown as ModelValueType, orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], }, - columnsRenderProps: {}, + columnsRenderProps: { + transDate: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, + balance: { type: 'money' }, + }, } ); + +const { dialogProps, handleEdit, editForm } = useFormDialog({ + defaultFormParams: { + id: '', + }, +}); + +function openDialog(row: API.GetPersonalUserTransactionsQueryResultItem) { + handleEdit({ + id: row.id, + }); +} </script> <style lang="scss" scoped> diff --git a/src/views/FinanceManage/components/FinanceDetailDialog.vue b/src/views/FinanceManage/components/FinanceDetailDialog.vue index ffa1459..b05ba85 100644 --- a/src/views/FinanceManage/components/FinanceDetailDialog.vue +++ b/src/views/FinanceManage/components/FinanceDetailDialog.vue @@ -12,6 +12,9 @@ <script setup lang="ts"> import { ProDialog, toThousand } from '@bole-core/components'; import { usePortraitTable } from '@/hooks'; +import * as userServices from '@/services/api/user'; +import { useQuery } from '@tanstack/vue-query'; +import { EnumWalletTransactionStatusText } from '@/constants'; defineOptions({ name: 'FinanceDetailDialog', @@ -29,68 +32,70 @@ (e: 'onCancel'): void; }>(); +const { data: detail } = useQuery({ + queryKey: ['userResumeServices/getUserResume', form.value.id], + queryFn: async () => { + return await userServices.getPersonalUserTransaction({ id: form.value.id }); + }, + placeholderData: () => ({} as API.GetPersonalUserTransactionQueryResult), + enabled: computed(() => !!form.value.id), +}); + const { portraitTableProps } = usePortraitTable({ - data: form, + data: detail, columns: [ { label: '浠樻浜鸿处鎴�', - key: 'id', - type: 'text', + key: 'payerAccount', }, { label: '鏀舵浜鸿处鎴�', - key: 'id', - type: 'text', + key: 'receiveAccount', }, { label: '浠樻浜哄悕绉�', - key: 'id', - type: 'text', + key: 'payerName', }, { label: '鏀舵浜哄悕绉�', - key: 'id', - type: 'text', + key: 'receiveName', }, { label: '浠樻浜哄紑鎴疯', - key: 'id', - type: 'text', + key: 'payerBank', }, { label: '鏀舵浜哄紑鎴疯', - key: 'id', - type: 'text', + key: 'receiveBank', }, { label: '甯佺', - key: 'id', - type: 'text', + key: 'currency', }, { label: '浜ゆ槗閲戦', - key: 'id', + key: 'actualAmount', type: 'money', }, { label: '鐢ㄩ��', - key: 'id', - type: 'text', + key: 'purpose', }, { label: '鎽樿', - key: 'id', - type: 'text', + key: 'failReason', }, { label: '浜ゆ槗鏃堕棿', - key: 'id', - type: 'text', + key: 'transDate', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', }, { label: '浜ゆ槗鐘舵��', - key: 'id', - type: 'text', + key: 'transactionStatus', + type: 'enum', + valueEnum: EnumWalletTransactionStatusText, }, ], }); -- Gitblit v1.9.1