From 81adf03a60f6b4452be4e3ad1f9e3915e0c78bf6 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期三, 17 九月 2025 17:25:00 +0800
Subject: [PATCH] Merge branch 'dev-v1.1' of http://120.26.58.240:8888/r/flexJobAdminBClient into dev-v1.1

---
 src/views/ServiceChargeManage/constants/columns.ts               |   11 
 src/views/ServiceChargeManage/ServiceChargeDetail.vue            |    2 
 src/views/ServiceChargeManage/components/BalanceDetailDialog.vue |   88 ++++-
 src/views/FinanceManage/components/DistributionDetailView.vue    |   36 +-
 src/hooks/index.ts                                               |    1 
 src/views/FinanceManage/constants/columns.ts                     |   18 
 src/views/ServiceChargeManage/components/FinanceDetailDialog.vue |  106 ++++++
 src/views/WithdrawManage/components/WithdrawalDetailDialog.vue   |  145 ++++++++
 src/views/WithdrawManage/constants/index.ts                      |    1 
 src/views/FinanceManage/components/UsageDetailView.vue           |   28 -
 src/views/FinanceManage/FinanceManage.vue                        |    4 
 auto-imports.d.ts                                                |   20 +
 src/components/Table/PortraitTableWithAttachment.vue             |   72 ++++
 src/router/index.ts                                              |   58 ++
 src/constants/apiEnum.ts                                         |   12 
 src/constants/index.ts                                           |    2 
 src/views/WithdrawManage/constants/columns.ts                    |   39 ++
 src/constants/task.ts                                            |    6 
 .eslintrc-auto-import.json                                       |    9 
 src/services/api/typings.d.ts                                    |   51 ++
 src/views/ServiceChargeManage/ServiceChargeManage.vue            |    2 
 src/views/WithdrawManage/WithdrawManageList.vue                  |  148 ++++++++
 src/constants/common.ts                                          |    9 
 src/views/ServiceChargeManage/BalanceManage.vue                  |   33 +
 src/hooks/portraitTable.ts                                       |   50 ++
 src/views/EmploymentManage/components/CheckManageDialog.vue      |    4 
 src/constants/finance.ts                                         |   13 
 27 files changed, 852 insertions(+), 116 deletions(-)

diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index 5760c41..76c9c1f 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,
@@ -132,6 +135,8 @@
     "OssUserSign": true,
     "PropType": true,
     "Ref": true,
+    "SettlementReceiveStatus": true,
+    "SettlementReceiveStatusText": true,
     "Slot": true,
     "Slots": true,
     "SubModuleKey": true,
@@ -143,6 +148,8 @@
     "ThemeColorName": true,
     "ThemeColors": true,
     "ThemeColorsType": true,
+    "UsePortraitTableColumnsItem": true,
+    "UsePortraitTableOptions": true,
     "VNode": true,
     "WelfareCodeEnum": true,
     "WritableComputedRef": true,
@@ -232,6 +239,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..44f22bb 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']
@@ -131,6 +133,8 @@
   const OssRich: typeof import('./src/constants/oss')['OssRich']
   const OssUser: typeof import('./src/constants/oss')['OssUser']
   const OssUserSign: typeof import('./src/constants/oss')['OssUserSign']
+  const SettlementReceiveStatus: typeof import('./src/constants/apiEnum')['SettlementReceiveStatus']
+  const SettlementReceiveStatusText: typeof import('./src/constants/task')['SettlementReceiveStatusText']
   const SubModuleKey: typeof import('./src/constants/module')['SubModuleKey']
   const SubModuleTitle: typeof import('./src/constants/module')['SubModuleTitle']
   const SubModuleType: typeof import('./src/constants/module')['SubModuleType']
@@ -224,6 +228,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']
@@ -248,7 +254,7 @@
   export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
   import('vue')
   // @ts-ignore
-  export type { EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton } from './src/constants/apiEnum'
+  export type { EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, SettlementReceiveStatus, EnumBillingMethod, EnumClientType, EnumCodeUrlScene, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseCostStatus, EnumEnterpriseCostType, EnumEnterpriseRealMethod, EnumEnterpriseWalletAccess, EnumEnterpriseWalletExpandindirectOrderFileType, EnumEnterpriseWalletExpandindirectOrderScene, EnumEnterpriseWalletExpandindirectOrderStatus, EnumEnterpriseWalletSignStatus, EnumEnterpriseWalletTransactionType, EnumGetEnterpriseEmployeesQuerySignContractStatus, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementOrderStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, EnumUserWalletTransactionType, EnumWalletTransactionStatus, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, SettlementReceiveStatus } from './src/constants/apiEnum'
   import('./src/constants/apiEnum')
   // @ts-ignore
   export type { CategoryCode, IdentityCodeEnum, EducationCodeEnum, CertificateTypeCodeEnum, WelfareCodeEnum } from './src/constants/dic'
@@ -274,6 +280,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 +295,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 +380,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']>
@@ -397,6 +409,8 @@
     readonly OssRich: UnwrapRef<typeof import('./src/constants/oss')['OssRich']>
     readonly OssUser: UnwrapRef<typeof import('./src/constants/oss')['OssUser']>
     readonly OssUserSign: UnwrapRef<typeof import('./src/constants/oss')['OssUserSign']>
+    readonly SettlementReceiveStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['SettlementReceiveStatus']>
+    readonly SettlementReceiveStatusText: UnwrapRef<typeof import('./src/constants/task')['SettlementReceiveStatusText']>
     readonly SubModuleKey: UnwrapRef<typeof import('./src/constants/module')['SubModuleKey']>
     readonly SubModuleTitle: UnwrapRef<typeof import('./src/constants/module')['SubModuleTitle']>
     readonly SubModuleType: UnwrapRef<typeof import('./src/constants/module')['SubModuleType']>
@@ -489,6 +503,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/apiEnum.ts b/src/constants/apiEnum.ts
index 0688d08..df166c7 100644
--- a/src/constants/apiEnum.ts
+++ b/src/constants/apiEnum.ts
@@ -417,6 +417,10 @@
   InProcess = 20,
   /**宸茬粨绠� */
   Completed = 30,
+  /**閮ㄥ垎缁撶畻 */
+  Part = 40,
+  /**缁撶畻澶辫触 */
+  Fail = 50,
 }
 
 /** 浠诲姟瀹夋帓鐘舵�� */
@@ -566,3 +570,11 @@
   /**宸插畬鎴� */
   Completed = 20,
 }
+
+/** 缁撶畻鍒拌处鐘舵�� */
+export enum SettlementReceiveStatus {
+  /**宸插埌璐� */
+  Completed = 10,
+  /**宸查��娆� */
+  Refunded = 20,
+}
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/constants/task.ts b/src/constants/task.ts
index 53fad8d..460cd3f 100644
--- a/src/constants/task.ts
+++ b/src/constants/task.ts
@@ -132,11 +132,17 @@
   [EnumTaskSettlementOrderStatus.Wait]: '寰呬笂浼�',
   [EnumTaskSettlementOrderStatus.Completed]: '宸蹭笂浼�',
 };
+export const SettlementReceiveStatusText = {
+  [SettlementReceiveStatus.Completed]: '宸插埌璐�',
+  [SettlementReceiveStatus.Refunded]: '宸查��娆�',
+};
 
 export const EnumTaskSettlementStatusText = {
   [EnumTaskSettlementStatus.Wait]: '寰呯粨绠�',
   [EnumTaskSettlementStatus.InProcess]: '缁撶畻涓�',
   [EnumTaskSettlementStatus.Completed]: '宸茬粨绠�',
+  [EnumTaskSettlementStatus.Part]: '閮ㄥ垎缁撶畻',
+  [EnumTaskSettlementStatus.Fail]: '缁撶畻澶辫触',
 };
 
 export const EnumPersonalFreeTimeText = {
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..bde91c4 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -900,6 +900,10 @@
     InProcess = 20,
     /**宸茬粨绠� */
     Completed = 30,
+    /**閮ㄥ垎缁撶畻 */
+    Part = 40,
+    /**缁撶畻澶辫触 */
+    Fail = 50,
   }
 
   enum EnumTaskStatus {
@@ -3286,6 +3290,7 @@
     enterpriseSignContractTime?: string;
     /** 鐢靛瓙鍚堝悓 */
     contractUrl?: string;
+    createdTime?: string;
   }
 
   type GetEnterpriseLoginInfoQuery = Record<string, any>;
@@ -4123,6 +4128,8 @@
     /** 鍒涘缓鏃堕棿-鎴 */
     createdTimeEnd?: string;
     type?: EnumUserWalletTransactionType;
+    /** 鐢ㄦ埛Id */
+    userId?: string;
     pageModel?: PagedListQueryPageModel;
   }
 
@@ -4145,6 +4152,13 @@
     balance?: number;
     /** 浼佷笟鍚嶇О */
     enterpriseName?: string;
+    /** 浠诲姟鍚嶇О */
+    taskName?: string;
+    /** 缁撶畻鍗曞悕绉� */
+    settlementOrderName?: string;
+    settlementStatus?: EnumTaskSettlementStatus;
+    /** 缁撶畻鏃堕棿 */
+    settlementTime?: string;
     /** 浠樻浜鸿处鎴� */
     payerAccount?: string;
     /** 浠樻浜哄悕绉� */
@@ -4185,6 +4199,12 @@
   }
 
   interface GetPersonalUserWalletBalancesQueryResult {
+    pageModel?: PagedListQueryResultPageModel;
+    /** 鏁版嵁 */
+    data?: GetPersonalUserWalletBalancesQueryResultItem[];
+  }
+
+  interface GetPersonalUserWalletBalancesQueryResultItem {
     /** 鐢ㄦ埛Id */
     id?: string;
     /** 濮撳悕 */
@@ -4195,12 +4215,7 @@
     identity?: string;
     /** 浣欓 */
     balance?: number;
-    pageModel?: PagedListQueryResultPageModel;
-    /** 鏁版嵁 */
-    data?: GetPersonalUserWalletBalancesQueryResultItem[];
   }
-
-  type GetPersonalUserWalletBalancesQueryResultItem = Record<string, any>;
 
   interface GetResourceFieldsQueryResultItem {
     /** 缂栧彿 */
@@ -4467,7 +4482,6 @@
     identity?: string;
     /** 鎵嬫満鍙� */
     contactPhoneNumber?: string;
-    settlementStatus?: EnumTaskSettlementStatus;
     /** 鎵�灞為摱琛� */
     bank?: string;
     /** 寮�鎴锋敮琛屽悕绉� */
@@ -4478,6 +4492,8 @@
     settlementAmount?: number;
     /** 瀹炲彂閲戦 */
     actualSettlementAmount?: number;
+    settlementReceiveStatus?: SettlementReceiveStatus;
+    settlementStatus?: EnumTaskSettlementStatus;
     /** 缁撶畻鏃堕棿 */
     settlementTime?: string;
   }
@@ -5108,18 +5124,18 @@
     name?: string;
     /** 韬唤璇佸彿 */
     identity?: string;
-    /** 缁撶畻閲戦 */
-    settlementAmount?: number;
-    /** 瀹炲彂閲戦 */
-    actualSettlementAmount?: number;
-    /** 鏀舵璐︽埛 */
-    receiveAccount?: string;
+    /** 鎵嬫満鍙� */
+    contactPhoneNumber?: string;
     /** 鎵�灞為摱琛� */
     bank?: string;
     /** 寮�鎴锋敮琛屽悕绉� */
     bankBranch?: string;
-    /** 浠诲姟鍚嶇О */
-    taskName?: string;
+    /** 鏀舵璐︽埛 */
+    receiveAccount?: string;
+    /** 缁撶畻閲戦 */
+    settlementAmount?: number;
+    /** 瀹炲彂閲戦 */
+    actualSettlementAmount?: number;
   }
 
   interface InviteElectronSignCommand {
@@ -5816,6 +5832,13 @@
     hireStatus?: EnumTaskUserHireStatus;
   }
 
+  enum SettlementReceiveStatus {
+    /**宸插埌璐� */
+    Completed = 10,
+    /**宸查��娆� */
+    Refunded = 20,
+  }
+
   interface SetUserInfoRolesCommand {
     /** 鐢ㄦ埛Id */
     userInfoId?: string;
diff --git a/src/views/EmploymentManage/components/CheckManageDialog.vue b/src/views/EmploymentManage/components/CheckManageDialog.vue
index 6c82f86..e128516 100644
--- a/src/views/EmploymentManage/components/CheckManageDialog.vue
+++ b/src/views/EmploymentManage/components/CheckManageDialog.vue
@@ -155,7 +155,7 @@
   },
   {
     defaultExtraParams: {
-      orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
+      orderInput: [{ property: 'date', order: EnumPagedListOrder.Desc }],
     },
     queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmits'],
     columnsRenderProps: {
@@ -167,7 +167,7 @@
         type: 'url',
         //@ts-ignore
         formatter: (row: API.GetCheckReceiveTaskUserSubmitsQueryResultItem) =>
-          (row.files ?? []).map((x) => setOSSLink(x)),
+          row.files?.length > 0 && (row.files ?? []).map((x) => setOSSLink(x)),
         showDownloadBtn: false,
       },
     },
diff --git a/src/views/FinanceManage/FinanceManage.vue b/src/views/FinanceManage/FinanceManage.vue
index 9d5dfeb..4396f5b 100644
--- a/src/views/FinanceManage/FinanceManage.vue
+++ b/src/views/FinanceManage/FinanceManage.vue
@@ -4,9 +4,9 @@
       <ProTabPane lazy label="鍙戞斁鏄庣粏" :name="FinanceTabType.DistributionDetail">
         <DistributionDetailView />
       </ProTabPane>
-      <ProTabPane lazy label="鐢ㄩ噺鏄庣粏" :name="FinanceTabType.UsageDetail">
+      <!-- <ProTabPane lazy label="鐢ㄩ噺鏄庣粏" :name="FinanceTabType.UsageDetail">
         <UsageDetailView />
-      </ProTabPane>
+      </ProTabPane> -->
     </ProTabs>
   </AppContainer>
 </template>
diff --git a/src/views/FinanceManage/components/DistributionDetailView.vue b/src/views/FinanceManage/components/DistributionDetailView.vue
index bb7857d..be7aa59 100644
--- a/src/views/FinanceManage/components/DistributionDetailView.vue
+++ b/src/views/FinanceManage/components/DistributionDetailView.vue
@@ -4,7 +4,7 @@
       <ProTableV2
         v-bind="proTableProps"
         :columns="DistributionDetailColumns"
-        :operationBtns="operationBtns"
+        :showOperationColumn="false"
       >
       </ProTableV2>
     </AppContainer>
@@ -20,7 +20,8 @@
   defineOperationBtns,
 } from '@bole-core/components';
 import { DistributionDetailColumns } from '../constants';
-import * as taskServices from '@/services/api/task';
+import * as userServices from '@/services/api/user';
+import { EnumTaskSettlementStatusText } from '@/constants';
 
 defineOptions({
   name: 'DistributionDetailView',
@@ -34,11 +35,6 @@
 
 const state = reactive({ ...BaseState });
 
-onMounted(async () => {
-  await getList();
-  state.loading = false;
-});
-
 const {
   getDataSource: getList,
   proTableProps,
@@ -48,28 +44,32 @@
 } = useTable(
   async ({ pageIndex, pageSize }, extraParamState) => {
     try {
-      let params: API.GetOpenTaskInfosQuery = {
+      let params: API.GetPersonalUserTransactionsQuery = {
         pageModel: {
           rows: pageSize,
           page: pageIndex,
           orderInput: extraParamState.orderInput,
         },
+        type: EnumUserWalletTransactionType.Income,
       };
-
-      let res = await taskServices.getOpenTaskInfos(params, {
-        showLoading: !state.loading,
-      });
+      let res = await userServices.getPersonalUserTransactions(params);
       return res;
-    } catch (error) {
-      console.log('error: ', error);
-    }
+    } catch (error) {}
   },
   {
     defaultExtraParams: {
-      orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
+      orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }],
     },
-    queryKey: ['taskServices/getOpenTaskInfos'],
-    columnsRenderProps: {},
+    columnsRenderProps: {
+      amount: { type: 'money' },
+      settlementStatus: { type: 'enum', valueEnum: EnumTaskSettlementStatusText },
+      settlementTime: { type: 'date' },
+    },
   }
 );
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
 </script>
diff --git a/src/views/FinanceManage/components/UsageDetailView.vue b/src/views/FinanceManage/components/UsageDetailView.vue
index fd56379..f48a6e0 100644
--- a/src/views/FinanceManage/components/UsageDetailView.vue
+++ b/src/views/FinanceManage/components/UsageDetailView.vue
@@ -10,7 +10,7 @@
 <script setup lang="ts">
 import { ProTableV2, LoadingLayout, AppContainer, useTable } from '@bole-core/components';
 import { UsageDetailColumns } from '../constants';
-import * as taskServices from '@/services/api/task';
+import * as userServices from '@/services/api/user';
 
 defineOptions({
   name: 'UsageDetailView',
@@ -21,12 +21,6 @@
 };
 
 const state = reactive({ ...BaseState });
-
-onMounted(async () => {
-  await getList();
-  state.loading = false;
-});
-
 const {
   getDataSource: getList,
   proTableProps,
@@ -36,28 +30,28 @@
 } = useTable(
   async ({ pageIndex, pageSize }, extraParamState) => {
     try {
-      let params: API.GetOpenTaskInfosQuery = {
+      let params: API.GetPersonalUserTransactionsQuery = {
         pageModel: {
           rows: pageSize,
           page: pageIndex,
           orderInput: extraParamState.orderInput,
         },
+        type: EnumUserWalletTransactionType.Income,
       };
-
-      let res = await taskServices.getOpenTaskInfos(params, {
-        showLoading: !state.loading,
-      });
+      let res = await userServices.getPersonalUserTransactions(params);
       return res;
-    } catch (error) {
-      console.log('error: ', error);
-    }
+    } catch (error) {}
   },
   {
     defaultExtraParams: {
-      orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }],
+      orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }],
     },
-    queryKey: ['taskServices/getOpenTaskInfos'],
     columnsRenderProps: {},
   }
 );
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
 </script>
diff --git a/src/views/FinanceManage/constants/columns.ts b/src/views/FinanceManage/constants/columns.ts
index 37e7f25..7ed0674 100644
--- a/src/views/FinanceManage/constants/columns.ts
+++ b/src/views/FinanceManage/constants/columns.ts
@@ -3,42 +3,42 @@
 export const DistributionDetailColumns = defineColumns([
   {
     id: '1',
-    enCode: 'name',
+    enCode: 'enterpriseName',
     name: '鎵�灞炲鎴�',
   },
   {
     id: '2',
-    enCode: 'name',
+    enCode: 'taskName',
     name: '鎵�灞炰换鍔�',
   },
   {
     id: '3',
-    enCode: 'name',
+    enCode: 'settlementOrderName',
     name: '缁撶畻鍗曞悕绉�',
   },
   {
     id: '4',
-    enCode: 'name',
+    enCode: 'payerName',
     name: '濮撳悕',
   },
   {
     id: '5',
-    enCode: 'name',
+    enCode: 'payerContactPhoneNumber',
     name: '鎵嬫満鍙�',
   },
   {
     id: '6',
-    enCode: 'name',
+    enCode: 'amount',
     name: '缁撶畻閲戦',
   },
   {
     id: '7',
-    enCode: 'signNum',
+    enCode: 'settlementStatus',
     name: '缁撶畻鐘舵��',
   },
   {
     id: '8',
-    enCode: 'name',
+    enCode: 'settlementTime',
     name: '缁撶畻鏃ユ湡',
   },
 ]);
@@ -46,7 +46,7 @@
 export const UsageDetailColumns = defineColumns([
   {
     id: '1',
-    enCode: 'name',
+    enCode: 'transDate',
     name: '浣跨敤鏃堕棿',
   },
   {
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/ServiceChargeDetail.vue b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
index 80760a2..fd799fc 100644
--- a/src/views/ServiceChargeManage/ServiceChargeDetail.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -134,6 +134,7 @@
 import EditAccountInfoDialog from './components/EditAccountInfoDialog.vue';
 import SettleDetailDialog from './components/SettleDetailDialog.vue';
 import { Message } from '@bole-core/core';
+import { SettlementReceiveStatusText } from '@/constants';
 import {
   downloadFile,
   downloadFileByUrl,
@@ -274,6 +275,7 @@
       settlementTime: { type: 'date' },
       settlementAmount: { type: 'money' },
       actualSettlementAmount: { type: 'money' },
+      settlementReceiveStatus: { type: 'enum', valueEnum: SettlementReceiveStatusText },
     },
   }
 );
diff --git a/src/views/ServiceChargeManage/ServiceChargeManage.vue b/src/views/ServiceChargeManage/ServiceChargeManage.vue
index affb651..be4341d 100644
--- a/src/views/ServiceChargeManage/ServiceChargeManage.vue
+++ b/src/views/ServiceChargeManage/ServiceChargeManage.vue
@@ -45,7 +45,7 @@
           </QueryFilterItem>
         </template>
         <template #btn>
-          <el-button type="primary" link @click="handleDownloadTemplate()">缁撶畻鍗曟ā鏉�</el-button>
+          <!-- <el-button type="primary" link @click="handleDownloadTemplate()">缁撶畻鍗曟ā鏉�</el-button> -->
           <!-- <el-button type="primary" @click="handleAdd()">涓婁紶缁撶畻鍗�</el-button> -->
           <!-- <el-button type="primary" @click="handleDownloadTemplate()">瀵煎嚭</el-button> -->
         </template>
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..0c3f24a 100644
--- a/src/views/ServiceChargeManage/constants/columns.ts
+++ b/src/views/ServiceChargeManage/constants/columns.ts
@@ -106,6 +106,11 @@
   },
   {
     id: '9',
+    enCode: 'settlementReceiveStatus',
+    name: '鍒拌处鐘舵��',
+  },
+  {
+    id: '10',
     enCode: 'settlementTime',
     name: '缁撶畻鏃堕棿',
   },
@@ -119,17 +124,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