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