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