From 1233a9a3e7b2cdf30474ffb2a52a7c5f5be6df95 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期三, 17 九月 2025 14:31:40 +0800 Subject: [PATCH] fix: bug --- src/views/ServiceChargeManage/constants/columns.ts | 6 src/views/WithdrawManage/constants/columns.ts | 39 ++ src/views/ServiceChargeManage/components/BalanceDetailDialog.vue | 88 +++++- .eslintrc-auto-import.json | 7 src/services/api/typings.d.ts | 13 src/views/WithdrawManage/WithdrawManageList.vue | 148 ++++++++++ src/hooks/index.ts | 1 src/views/ServiceChargeManage/components/FinanceDetailDialog.vue | 106 +++++++ src/views/WithdrawManage/components/WithdrawalDetailDialog.vue | 145 ++++++++++ src/views/WithdrawManage/constants/index.ts | 1 src/constants/common.ts | 9 src/views/ServiceChargeManage/BalanceManage.vue | 33 +- src/hooks/portraitTable.ts | 50 +++ auto-imports.d.ts | 14 src/constants/finance.ts | 13 src/components/Table/PortraitTableWithAttachment.vue | 72 +++++ src/router/index.ts | 58 +++- src/constants/index.ts | 2 18 files changed, 748 insertions(+), 57 deletions(-) diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index 5760c41..5ad042c 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -5,6 +5,7 @@ "AreaType": true, "CategoryCode": true, "CertificateTypeCodeEnum": true, + "CommonAnnexTableColumns": true, "Component": true, "ComponentPublicInstance": true, "ComputedRef": true, @@ -93,7 +94,9 @@ "EnumUserType": true, "EnumUserTypeText": true, "EnumUserWalletTransactionType": true, + "EnumUserWalletTransactionTypeText": true, "EnumWalletTransactionStatus": true, + "EnumWalletTransactionStatusText": true, "ExtractDefaultPropTypes": true, "ExtractPropTypes": true, "ExtractPublicPropTypes": true, @@ -143,6 +146,8 @@ "ThemeColorName": true, "ThemeColors": true, "ThemeColorsType": true, + "UsePortraitTableColumnsItem": true, + "UsePortraitTableOptions": true, "VNode": true, "WelfareCodeEnum": true, "WritableComputedRef": true, @@ -232,6 +237,8 @@ "useModel": true, "useOmit": true, "useOmitProps": true, + "usePortraitTable": true, + "usePortraitTableWithAttachment": true, "useResizeHander": true, "useRoute": true, "useRouteView": true, diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 4c4aadc..0c564e8 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -11,7 +11,7 @@ const AreaType: typeof import('./src/constants/enum')['AreaType'] const CategoryCode: typeof import('./src/constants/dic')['CategoryCode'] const CertificateTypeCodeEnum: typeof import('./src/constants/dic')['CertificateTypeCodeEnum'] - const CommonAnnexTableColumns: typeof import('@/constants')['CommonAnnexTableColumns'] + const CommonAnnexTableColumns: typeof import('./src/constants/common')['CommonAnnexTableColumns'] const EditorType: typeof import('./src/constants/editor')['EditorType'] const EditorTypeText: typeof import('./src/constants/editor')['EditorTypeText'] const EducationCodeEnum: typeof import('./src/constants/dic')['EducationCodeEnum'] @@ -101,7 +101,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'] @@ -224,6 +226,8 @@ const useModel: typeof import('vue')['useModel'] const useOmit: typeof import('./src/hooks/help')['useOmit'] const useOmitProps: typeof import('./src/hooks/help')['useOmitProps'] + const usePortraitTable: typeof import('./src/hooks/portraitTable')['usePortraitTable'] + const usePortraitTableWithAttachment: typeof import('./src/hooks/portraitTable')['usePortraitTableWithAttachment'] const useResizeHander: typeof import('./src/hooks/useResizeHander')['useResizeHander'] const useRoute: typeof import('vue-router')['useRoute'] const useRouteView: typeof import('./src/hooks/useRouteView')['useRouteView'] @@ -274,6 +278,9 @@ // @ts-ignore export type { GlobalEvent, GlobalEventListener, GlobalEventContext } from './src/hooks/useEvent' import('./src/hooks/useEvent') + // @ts-ignore + export type { UsePortraitTableColumnsItem, UsePortraitTableOptions } from './src/hooks/portraitTable' + import('./src/hooks/portraitTable') } // for vue template auto import @@ -286,6 +293,7 @@ readonly AreaType: UnwrapRef<typeof import('./src/constants/enum')['AreaType']> readonly CategoryCode: UnwrapRef<typeof import('./src/constants/dic')['CategoryCode']> readonly CertificateTypeCodeEnum: UnwrapRef<typeof import('./src/constants/dic')['CertificateTypeCodeEnum']> + readonly CommonAnnexTableColumns: UnwrapRef<typeof import('./src/constants/common')['CommonAnnexTableColumns']> readonly EditorType: UnwrapRef<typeof import('./src/constants/editor')['EditorType']> readonly EditorTypeText: UnwrapRef<typeof import('./src/constants/editor')['EditorTypeText']> readonly EducationCodeEnum: UnwrapRef<typeof import('./src/constants/dic')['EducationCodeEnum']> @@ -370,7 +378,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']> @@ -489,6 +499,8 @@ readonly useModel: UnwrapRef<typeof import('vue')['useModel']> readonly useOmit: UnwrapRef<typeof import('./src/hooks/help')['useOmit']> readonly useOmitProps: UnwrapRef<typeof import('./src/hooks/help')['useOmitProps']> + readonly usePortraitTable: UnwrapRef<typeof import('./src/hooks/portraitTable')['usePortraitTable']> + readonly usePortraitTableWithAttachment: UnwrapRef<typeof import('./src/hooks/portraitTable')['usePortraitTableWithAttachment']> readonly useResizeHander: UnwrapRef<typeof import('./src/hooks/useResizeHander')['useResizeHander']> readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']> readonly useRouteView: UnwrapRef<typeof import('./src/hooks/useRouteView')['useRouteView']> diff --git a/src/components/Table/PortraitTableWithAttachment.vue b/src/components/Table/PortraitTableWithAttachment.vue new file mode 100644 index 0000000..cefb234 --- /dev/null +++ b/src/components/Table/PortraitTableWithAttachment.vue @@ -0,0 +1,72 @@ +<template> + <PortraitTable v-bind="portraitTableProps" :label-width="labelWidth"> </PortraitTable> + <div class="enclosure-list-title">闄勪欢鍒楄〃</div> + <ProTableV2 + :table-data="annexList" + :columns="CommonAnnexTableColumns" + :operation-btns="operationListBtns" + :show-pagination="false" + :show-no-data="false" + :auto-height="false" + :show-table-column-setting="false" + :table-props="{ maxHeight: '400px' }" + :column-render-map="columnsRenderProps" + > + </ProTableV2> +</template> + +<script setup lang="ts" generic="TAnnexItem"> +import { downloadFileByUrl } from '@bole-core/core'; +import { CommonAnnexTableColumns } from '@/constants'; +import { ProTableV2, ProTableV2Props } from '@bole-core/components'; + +defineOptions({ + name: 'PortraitTableWithAttachment', +}); + +type Props = { + annexList: TAnnexItem[]; + customDownLoad?: (row: TAnnexItem) => Promise<any>; + labelWidth?: string; + portraitTableProps: any; + columnsRenderProps?: ProTableV2Props['columnRenderMap']; + downloadFileKey?: keyof TAnnexItem; +}; + +const props = withDefaults(defineProps<Props>(), { + labelWidth: '180px', + columnsRenderProps: () => ({}), + downloadFileKey: 'url' as any, +}); + +const operationListBtns = [ + { + data: { + enCode: 'downloadBtn', + name: '涓嬭浇', + }, + emits: { + onClick: (row) => handleDownload(row), + }, + }, +]; + +function handleDownload(row: TAnnexItem) { + if (props.customDownLoad) { + props.customDownLoad(row); + } else { + downloadFileByUrl(row[props.downloadFileKey] as any); + } +} +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; + +.enclosure-list-title { + padding: 16px 0; + font-size: 14px; + color: getCssVar('text-color', 'primary'); + line-height: 19px; +} +</style> diff --git a/src/constants/common.ts b/src/constants/common.ts new file mode 100644 index 0000000..d2a756c --- /dev/null +++ b/src/constants/common.ts @@ -0,0 +1,9 @@ +import { defineColumns } from '@bole-core/components'; + +export const CommonAnnexTableColumns = defineColumns([ + { + id: '1', + enCode: 'name', + name: '鏂囦欢鍚�', + }, +]); 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 f466a6b..e1c7625 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -14,3 +14,5 @@ export * from './enterpriseEmployee'; export * from './electronSign'; export * from './enterpriseWallet'; +export * from './finance'; +export * from './common'; diff --git a/src/hooks/index.ts b/src/hooks/index.ts index bf536bc..5460294 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -10,3 +10,4 @@ export * from './dic'; export * from './sign'; export * from './settlement'; +export * from './portraitTable'; diff --git a/src/hooks/portraitTable.ts b/src/hooks/portraitTable.ts new file mode 100644 index 0000000..844586a --- /dev/null +++ b/src/hooks/portraitTable.ts @@ -0,0 +1,50 @@ +import { ColumnsRenderProps } from '@bole-core/components'; +import { MaybeRef } from 'vue'; + +export type UsePortraitTableColumnsItem<TData extends object = object> = ColumnsRenderProps & { + label?: string; + key?: keyof TData; +}; + +export type UsePortraitTableOptions<TData extends object> = { + data: Ref<TData>; + columns?: UsePortraitTableColumnsItem<TData>[]; +}; + +export function usePortraitTable<TData extends object>(options: UsePortraitTableOptions<TData>) { + const portraitTableProps = computed( + () => + ({ + data: options.data.value, + columns: options.columns ?? [], + } as any) + ); + + return { + portraitTableProps, + }; +} + +type UsePortraitTableWithAttachmentOptions< + TData extends object, + TAnnexItem extends object = object +> = UsePortraitTableOptions<TData> & { + annexList: Ref<TAnnexItem[]>; + columnsRenderProps?: { [key in keyof TAnnexItem]?: ColumnsRenderProps }; +}; + +export function usePortraitTableWithAttachment< + TData extends object, + TAnnexItem extends object = object +>(options: UsePortraitTableWithAttachmentOptions<TData, TAnnexItem>) { + const { annexList, columnsRenderProps } = options; + const { portraitTableProps } = usePortraitTable(options); + + const portraitTableWithAttachmentProps = computed(() => ({ + annexList: annexList.value, + portraitTableProps: portraitTableProps.value, + columnsRenderProps, + })); + + return { portraitTableWithAttachmentProps }; +} diff --git a/src/router/index.ts b/src/router/index.ts index aa8aa80..93b9621 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -256,19 +256,19 @@ icon: 'home', }, }, - // { - // path: '/BalanceManage', - // name: 'BalanceManage', - // hidden: false, - // alwaysShow: true, - // component: () => import('@/views/ServiceChargeManage/BalanceManage.vue'), - // meta: { - // rank: 10042, - // title: '浣欓绠$悊', - // // rootMenu: true, - // icon: 'home', - // }, - // }, + { + path: '/BalanceManage', + name: 'BalanceManage', + hidden: false, + alwaysShow: true, + component: () => import('@/views/ServiceChargeManage/BalanceManage.vue'), + meta: { + rank: 10042, + title: '浣欓绠$悊', + // rootMenu: true, + icon: 'home', + }, + }, { path: '/ServiceChargeDetail/:id', name: 'ServiceChargeDetail', @@ -312,6 +312,34 @@ }, ], }, + // { + // path: '/WithdrawManage', + // redirect: 'noRedirect', + // component: Layout, + // hidden: false, + // alwaysShow: true, + // meta: { + // rank: 10060, + // title: '鎻愮幇绠$悊', + // rootMenu: true, + // icon: 'home', + // }, + // children: [ + // { + // path: '/WithdrawManageList', + // name: 'WithdrawManageList', + // hidden: false, + // alwaysShow: true, + // component: () => import('@/views/WithdrawManage/WithdrawManageList.vue'), + // meta: { + // rank: 10061, + // title: '鎻愮幇绠$悊', + // // rootMenu: true, + // icon: 'home', + // }, + // }, + // ], + // }, { path: '/FinanceManage', redirect: 'noRedirect', @@ -319,7 +347,7 @@ hidden: false, alwaysShow: true, meta: { - rank: 10060, + rank: 10070, title: '璐㈠姟绠$悊', rootMenu: true, icon: 'home', @@ -332,7 +360,7 @@ alwaysShow: true, component: () => import('@/views/FinanceManage/FinanceManage.vue'), meta: { - rank: 10061, + rank: 10071, title: '璐㈠姟绠$悊', // rootMenu: true, icon: 'home', diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts index f72be6c..8950cd5 100644 --- a/src/services/api/typings.d.ts +++ b/src/services/api/typings.d.ts @@ -4123,6 +4123,8 @@ /** 鍒涘缓鏃堕棿-鎴 */ createdTimeEnd?: string; type?: EnumUserWalletTransactionType; + /** 鐢ㄦ埛Id */ + userId?: string; pageModel?: PagedListQueryPageModel; } @@ -4185,6 +4187,12 @@ } interface GetPersonalUserWalletBalancesQueryResult { + pageModel?: PagedListQueryResultPageModel; + /** 鏁版嵁 */ + data?: GetPersonalUserWalletBalancesQueryResultItem[]; + } + + interface GetPersonalUserWalletBalancesQueryResultItem { /** 鐢ㄦ埛Id */ id?: string; /** 濮撳悕 */ @@ -4195,12 +4203,7 @@ identity?: string; /** 浣欓 */ balance?: number; - pageModel?: PagedListQueryResultPageModel; - /** 鏁版嵁 */ - data?: GetPersonalUserWalletBalancesQueryResultItem[]; } - - type GetPersonalUserWalletBalancesQueryResultItem = Record<string, any>; interface GetResourceFieldsQueryResultItem { /** 缂栧彿 */ diff --git a/src/views/ServiceChargeManage/BalanceManage.vue b/src/views/ServiceChargeManage/BalanceManage.vue index e4fac28..c632be7 100644 --- a/src/views/ServiceChargeManage/BalanceManage.vue +++ b/src/views/ServiceChargeManage/BalanceManage.vue @@ -5,14 +5,14 @@ <template #query> <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" @@ -21,7 +21,7 @@ </QueryFilterItem> <QueryFilterItem> <SearchInput - v-model="extraParamState.keyword" + v-model="extraParamState.keywords" style="width: 260px" placeholder="濮撳悕/鎵嬫満鍙�/韬唤璇佸彿" @on-click-search="getList" @@ -53,12 +53,12 @@ useFormDialog, defineOperationBtns, } from '@bole-core/components'; -import * as enterpriseServices from '@/services/api/enterprise'; +import * as userServices from '@/services/api/user'; import BalanceDetailDialog from './components/BalanceDetailDialog.vue'; import { BalanceManageColumns } from './constants'; defineOptions({ - name: 'BalanceManage', + name: 'WithdrawManageList', }); const operationBtns = defineOperationBtns([ @@ -69,9 +69,6 @@ }, emits: { onClick: (role) => openDialog(role), - }, - extraProps: { - hide: () => false, }, }, ]); @@ -97,15 +94,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; @@ -113,13 +113,14 @@ }, { 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: {}, + columnsRenderProps: { + balance: { type: 'money' }, + }, } ); diff --git a/src/views/ServiceChargeManage/components/BalanceDetailDialog.vue b/src/views/ServiceChargeManage/components/BalanceDetailDialog.vue index a81d09f..0af6300 100644 --- a/src/views/ServiceChargeManage/components/BalanceDetailDialog.vue +++ b/src/views/ServiceChargeManage/components/BalanceDetailDialog.vue @@ -5,8 +5,8 @@ <template #query> <QueryFilterItem> <FieldSelect - v-model="extraParamState.status" - :valueEnum="[]" + v-model="extraParamState.type" + :valueEnum="EnumUserWalletTransactionTypeText" clearable filterable placeholder="浜ゆ槗绫诲瀷" @@ -25,9 +25,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 +58,14 @@ FieldSelect, ProTableV2, ProTableQueryFilterBar, + defineOperationBtns, + useFormDialog, } 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 { EnumUserWalletTransactionType, EnumUserWalletTransactionTypeText } from '@/constants'; +import FinanceDetailDialog from './FinanceDetailDialog.vue'; defineOptions({ name: 'FinanceDetailDialog', @@ -65,33 +86,48 @@ const columns = defineColumns([ { id: '1', - enCode: 'name', + enCode: 'transDate', name: '浜ゆ槗鏃堕棿', }, { id: '2', - enCode: 'name', + enCode: 'income', name: '鏀跺叆', + width: 100, }, { id: '3', - enCode: 'name', + enCode: 'outcome', name: '鏀嚭', + width: 100, }, { id: '4', - enCode: 'name', + enCode: 'balance', name: '璐︽埛浣欓', + width: 100, }, { - id: '4', - enCode: 'name', + id: '5', + enCode: 'account', name: '瀵规柟甯愬彿/鎴峰悕', }, { - id: '4', - enCode: 'name', + id: '6', + enCode: 'purpose', name: '鐢ㄩ��', + }, +]); + +const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'detailBtn', + name: '鏄庣粏', + }, + emits: { + onClick: (role) => openDialog(role), + }, }, ]); @@ -113,27 +149,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/ServiceChargeManage/components/FinanceDetailDialog.vue b/src/views/ServiceChargeManage/components/FinanceDetailDialog.vue new file mode 100644 index 0000000..b05ba85 --- /dev/null +++ b/src/views/ServiceChargeManage/components/FinanceDetailDialog.vue @@ -0,0 +1,106 @@ +<template> + <ProDialog title="鏄庣粏" v-model="visible" destroy-on-close draggable> + <PortraitTable v-bind="portraitTableProps" label-width="140px" :col-number="2"></PortraitTable> + <template #footer> + <span class="dialog-footer"> + <el-button @click="emit('onCancel')" type="primary">纭畾</el-button> + </span> + </template> + </ProDialog> +</template> + +<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', +}); + +type Form = { + id?: string; +}; + +const visible = defineModel({ type: Boolean }); +const form = defineModel<Form>('form'); + +const emit = defineEmits<{ + (e: 'update:modelValue', value: boolean): void; + (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: detail, + columns: [ + { + label: '浠樻浜鸿处鎴�', + key: 'payerAccount', + }, + { + label: '鏀舵浜鸿处鎴�', + key: 'receiveAccount', + }, + { + label: '浠樻浜哄悕绉�', + key: 'payerName', + }, + { + label: '鏀舵浜哄悕绉�', + key: 'receiveName', + }, + { + label: '浠樻浜哄紑鎴疯', + key: 'payerBank', + }, + { + label: '鏀舵浜哄紑鎴疯', + key: 'receiveBank', + }, + { + label: '甯佺', + key: 'currency', + }, + { + label: '浜ゆ槗閲戦', + key: 'actualAmount', + type: 'money', + }, + { + label: '鐢ㄩ��', + key: 'purpose', + }, + { + label: '鎽樿', + key: 'failReason', + }, + { + label: '浜ゆ槗鏃堕棿', + key: 'transDate', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + }, + { + label: '浜ゆ槗鐘舵��', + key: 'transactionStatus', + type: 'enum', + valueEnum: EnumWalletTransactionStatusText, + }, + ], +}); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/ServiceChargeManage/constants/columns.ts b/src/views/ServiceChargeManage/constants/columns.ts index 6e00484..7e45263 100644 --- a/src/views/ServiceChargeManage/constants/columns.ts +++ b/src/views/ServiceChargeManage/constants/columns.ts @@ -119,17 +119,17 @@ }, { id: '2', - enCode: 'name', + enCode: 'contactPhoneNumber', name: '鎵嬫満鍙�', }, { id: '3', - enCode: 'name', + enCode: 'identity', name: '韬唤璇佸彿', }, { id: '4', - enCode: 'name', + enCode: 'balance', name: '璐︽埛浣欓', }, ]); diff --git a/src/views/WithdrawManage/WithdrawManageList.vue b/src/views/WithdrawManage/WithdrawManageList.vue new file mode 100644 index 0000000..cee29e0 --- /dev/null +++ b/src/views/WithdrawManage/WithdrawManageList.vue @@ -0,0 +1,148 @@ +<template> + <LoadingLayout :loading="state.loading"> + <AppContainer> + <ProTableQueryFilterBar @on-reset="reset"> + <template #query> + <QueryFilterItem> + <FieldDatePicker + v-model="extraParamState.time" + type="daterange" + range-separator="~" + start-placeholder="璧峰鏃ユ湡" + end-placeholder="鎴鏃ユ湡" + clearable + @change="getList()" + tooltipContent="鐢宠鏃堕棿" + ></FieldDatePicker> + </QueryFilterItem> + <QueryFilterItem tip-content="鎻愮幇鐘舵��"> + <FieldRadio + v-model="extraParamState.status" + :value-enum="[]" + buttonStyle + showAllBtn + @change="getList()" + /> + </QueryFilterItem> + <QueryFilterItem> + <SearchInput + v-model="extraParamState.keywords" + style="width: 260px" + placeholder="濮撳悕/鐢佃瘽/韬唤璇佸彿" + @on-click-search="getList" + > + </SearchInput> + </QueryFilterItem> + </template> + </ProTableQueryFilterBar> + <ProTableV2 + v-bind="proTableProps" + :columns="WithdrawManageColumns" + :operationBtns="operationBtns" + > + </ProTableV2> + </AppContainer> + <WithdrawalDetailDialog v-bind="dialogProps" /> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + ProTableQueryFilterBar, + ProTableV2, + SearchInput, + LoadingLayout, + AppContainer, + QueryFilterItem, + useTable, + useFormDialog, + defineOperationBtns, + FieldDatePicker, + FieldRadio, +} from '@bole-core/components'; +import * as userServices from '@/services/api/user'; +import WithdrawalDetailDialog from './components/WithdrawalDetailDialog.vue'; +import { WithdrawManageColumns } from './constants'; +import { ModelValueType } from 'element-plus'; + +defineOptions({ + name: 'WithdrawManageList', +}); + +const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'detailBtn', + name: '璇︽儏', + }, + emits: { + onClick: (role) => openDialog(role), + }, + }, +]); + +const router = useRouter(); +const BaseState = { + loading: true, +}; + +const state = reactive({ ...BaseState }); + +onMounted(async () => { + await getList(); + state.loading = false; +}); + +const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, + reset, +} = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetPersonalUserWalletBalancesQuery = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + keywords: extraParamState.keywords, + }; + + let res = await userServices.getPersonalUserWalletBalances(params, { + showLoading: !state.loading, + }); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + keywords: '', + status: '', + time: [] as unknown as ModelValueType, + orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], + }, + columnsRenderProps: { + balance: { type: 'money' }, + }, + } +); + +const { dialogProps, handleEdit, editForm } = useFormDialog({ + defaultFormParams: { + id: '', + status: '', + time: '', + }, +}); + +function openDialog(row) { + handleEdit({ + id: row.id, + status: '', + time: '', + }); +} +</script> diff --git a/src/views/WithdrawManage/components/WithdrawalDetailDialog.vue b/src/views/WithdrawManage/components/WithdrawalDetailDialog.vue new file mode 100644 index 0000000..0afafd9 --- /dev/null +++ b/src/views/WithdrawManage/components/WithdrawalDetailDialog.vue @@ -0,0 +1,145 @@ +<template> + <ProDialog title="璇︽儏" v-model="visible" @close="onDialogClose" destroy-on-close draggable> + <!-- <PortraitTableWithAttachment v-bind="portraitTableWithAttachmentProps" /> --> + <ProForm :model="form" ref="dialogForm" label-width="90px" style="margin-top: 20px" is-read> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="鎻愮幇鐘舵��:" prop="status"> + <ProFormRadio v-model="form.status" :value-enum="[]" /> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + <ProFormCol> + <ProFormColItem :span="12"> + <ProFormItemV2 label="鎻愮幇鏃ユ湡:" prop="time"> + <ProFormDatePicker v-model="form.time" type="date" format="YYYY-MM-DD HH:mm" /> + </ProFormItemV2> + </ProFormColItem> + </ProFormCol> + </ProForm> + <template #footer> + <span class="dialog-footer"> + <el-button @click="emit('onCancel')">鍙� 娑�</el-button> + <el-button type="primary" @click="emit('onCancel')">纭� 瀹�</el-button> + </span> + </template> + </ProDialog> +</template> + +<script setup lang="ts"> +import { FormInstance } from 'element-plus'; +import { + ProDialog, + ProForm, + ProFormItemV2, + ProFormCol, + ProFormColItem, + ProFormRadio, + ProFormDatePicker, +} from '@bole-core/components'; +import { usePortraitTableWithAttachment } from '@/hooks'; +import { convertApi2FormUrl } from '@/utils'; +import { useQuery } from '@tanstack/vue-query'; + +defineOptions({ + name: 'WithdrawalDetailDialog', +}); + +const visible = defineModel({ type: Boolean }); + +type Form = { + title?: string; + id: string; + status: string; + time: string; +}; + +const form = defineModel<Form>('form'); + +const emit = defineEmits<{ + (e: 'onConfirm'): void; + (e: 'onCancel'): void; +}>(); + +watch( + () => visible.value, + (val) => { + if (val) { + // refetch(); + } + } +); + +// const { +// data: detail, +// refetch, +// isLoading, +// } = useQuery({ +// queryKey: ['parkBountyApplyServices/getEnterpriseDrawWithDetail', form.value?.id], +// queryFn: async () => { +// return await parkBountyApplyServices.getEnterpriseDrawWithDetail( +// { +// drawWithId: form.value?.id, +// }, +// { +// showLoading: true, +// } +// ); +// }, +// placeholderData: () => ({}), +// enabled: !!form.value?.id, +// onSuccess(data) {}, +// }); + +// const { portraitTableWithAttachmentProps } = usePortraitTableWithAttachment({ +// data: detail, +// annexList: computed(() => +// detail.value?.invoiceUrl +// ? detail.value?.invoiceUrl.split('|').map((item) => convertApi2FormUrl(item)) +// : [] +// ), +// columns: [ +// { +// label: '濮撳悕', +// key: 'enterpriseName', +// }, +// { +// label: '韬唤璇佸彿', +// key: 'societyCreditCode', +// }, +// { +// label: '璐︽埛鍚嶇О', +// key: 'accountName', +// }, +// { +// label: '閾惰甯愬彿', +// key: 'bankNumber', +// }, +// { +// label: '寮�鎴烽摱琛�', +// key: 'bankName', +// }, +// { +// label: '寮�鎴锋敮琛�', +// key: 'bankResumeName', +// }, +// { +// label: '鎻愮幇閲戦', +// key: 'amount', +// type: 'money', +// }, +// { +// label: '鐢宠鏃ユ湡', +// key: 'creationTime', +// type: 'date', +// }, +// ], +// }); + +const dialogForm = ref<FormInstance>(); + +function onDialogClose() { + if (!dialogForm.value) return; + dialogForm.value.resetFields(); +} +</script> diff --git a/src/views/WithdrawManage/constants/columns.ts b/src/views/WithdrawManage/constants/columns.ts new file mode 100644 index 0000000..1419ee6 --- /dev/null +++ b/src/views/WithdrawManage/constants/columns.ts @@ -0,0 +1,39 @@ +import { defineColumns } from '@bole-core/components'; + +export const WithdrawManageColumns = defineColumns([ + { + id: '1', + enCode: 'name', + name: '濮撳悕', + }, + { + id: '2', + enCode: 'code', + name: '韬唤璇佸彿', + }, + { + id: '3', + enCode: 'checkReceiveStatus', + name: '鐢佃瘽', + }, + { + id: '4', + enCode: 'settlementOrderStatus', + name: '鐢宠鏃堕棿', + }, + { + id: '5', + enCode: 'settlementOrderName', + name: '鐢宠鎻愮幇閲戦锛堝厓锛�', + }, + { + id: '6', + enCode: 'settlementOrderTime', + name: '鎻愮幇鐘舵��', + }, + { + id: '7', + enCode: 'actualSettlementAmount', + name: '鎻愮幇鏃堕棿', + }, +]); diff --git a/src/views/WithdrawManage/constants/index.ts b/src/views/WithdrawManage/constants/index.ts new file mode 100644 index 0000000..a7f066b --- /dev/null +++ b/src/views/WithdrawManage/constants/index.ts @@ -0,0 +1 @@ +export * from './columns'; -- Gitblit v1.9.1