From 96e58ff6d672dba3565e864bed059d4ced5c2f73 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期三, 14 五月 2025 13:39:31 +0800
Subject: [PATCH] feat: 接口

---
 src/views/EnterpriseInfo/EnterpriseInfoDetail.vue             |    4 
 src/views/Reward/components/WithdrawalApprovalAuditDialog.vue |  255 ++++++++
 src/services/api/typings.d.ts                                 |  186 +++++
 src/views/EnterpriseInfo/EnterpriseInfo.vue                   |   49 +
 src/components/commonView/SettlementMaterialInfoView.vue      |   57 -
 src/views/Reward/components/RegisterDialog.vue                |  116 +++
 src/hooks/index.ts                                            |    1 
 src/services/api/EnterpriseApplyFile.ts                       |   15 
 src/views/MaterialReview/MaterialReviewAudit.vue              |   36 
 src/components/commonView/MaterialInfoView.vue                |   13 
 src/components/commonView/DetailView.vue                      |    6 
 src/constants/common.ts                                       |    9 
 src/hooks/portraitTable.ts                                    |   50 +
 src/views/Reward/RewardGrant.vue                              |  241 ++++++-
 src/views/Reward/WithdrawalApproval.vue                       |  240 +++++++
 src/constants/reward.ts                                       |   57 +
 src/views/Reward/RewardDeclareDetail.vue                      |   34 
 src/views/Reward/components/UploadCertRewardDialog.vue        |  107 +++
 src/views/EnterpriseInfo/components/WithdrawalRecordView.vue  |  118 +++
 src/components/Table/PortraitTableWithAttachment.vue          |   72 ++
 src/router/index.ts                                           |   15 
 src/constants/index.ts                                        |    1 
 src/services/api/ParkBountyApply.ts                           |  137 ++++
 src/views/MaterialReview/MaterialReviewDetail.vue             |   36 
 24 files changed, 1,678 insertions(+), 177 deletions(-)

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/components/commonView/DetailView.vue b/src/components/commonView/DetailView.vue
index 40ca771..31fef11 100644
--- a/src/components/commonView/DetailView.vue
+++ b/src/components/commonView/DetailView.vue
@@ -34,10 +34,12 @@
     applyMonth: string;
     applySumAmount: number;
     /** 濂栧姳閲戝垎閰嶈〃 */
-    bountyAssignFileUlr: UploadUserFile[];
+    // bountyAssignFileUlr: UploadUserFile[];
     /** 濂栧姳閲戞眹鎬昏〃 */
-    bountyCollectFileUrl: UploadUserFile[];
+    // bountyCollectFileUrl: UploadUserFile[];
     parkCollectFileList: CustomerApplyFileTypeListItem[];
+    /**姹囩畻鏉愭枡 */
+    calculationFileList: CustomerApplyFileTypeListItem[];
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
   };
diff --git a/src/components/commonView/MaterialInfoView.vue b/src/components/commonView/MaterialInfoView.vue
index 5308a1b..09df816 100644
--- a/src/components/commonView/MaterialInfoView.vue
+++ b/src/components/commonView/MaterialInfoView.vue
@@ -1,10 +1,7 @@
 <template>
-  <!-- <ProFormCol>
-    <ProFormColItem :span="12"> -->
   <ProFormItemV2
     :label="`${item.fileTypeName}:`"
     :prop="`parkCollectFileList.${index}.listFiles`"
-    :check-rules="[{ message: `璇蜂笂浼�${item.fileTypeName}`, type: 'upload' }]"
     :label-width="160"
     :style="{ marginBottom: index === form.parkCollectFileList.length - 1 ? 0 : '22px' }"
     v-for="(item, index) in form.parkCollectFileList"
@@ -18,18 +15,10 @@
       accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
     ></ProFormUpload>
   </ProFormItemV2>
-  <!-- </ProFormColItem>
-  </ProFormCol> -->
 </template>
 
 <script setup lang="ts">
-import {
-  ProFormCol,
-  ProFormColItem,
-  ProFormItemV2,
-  ProFormUpload,
-  UploadUserFile,
-} from '@bole-core/components';
+import { ProFormItemV2, ProFormUpload } from '@bole-core/components';
 import { CustomerApplyFileTypeListItem } from './utils';
 
 defineOptions({
diff --git a/src/components/commonView/SettlementMaterialInfoView.vue b/src/components/commonView/SettlementMaterialInfoView.vue
index a81a5f5..6fb7d33 100644
--- a/src/components/commonView/SettlementMaterialInfoView.vue
+++ b/src/components/commonView/SettlementMaterialInfoView.vue
@@ -1,46 +1,34 @@
 <template>
-  <ProFormCol>
-    <ProFormColItem :span="12">
-      <ProFormItemV2 label="鏈鐢虫姤濂栧姳閲戞�婚:" prop="applySumAmount">
-        <ProFormInputNumber v-model="form.applySumAmount" formatValue="money" unit="鍏�" />
-      </ProFormItemV2>
-    </ProFormColItem>
-  </ProFormCol>
-  <ProFormCol>
-    <ProFormColItem :span="12">
-      <ProFormItemV2
-        label="濂栧姳閲戝垎閰嶆槑缁嗚〃:"
-        prop="bountyAssignFileUlr"
-        style="margin-bottom: 22px"
-      >
-        <ProFormUpload
-          v-model:file-url="form.bountyAssignFileUlr"
-          :limitShowViewMoreBtnCount="4"
-        ></ProFormUpload>
-      </ProFormItemV2>
-    </ProFormColItem>
-  </ProFormCol>
-  <ProFormCol>
-    <ProFormColItem :span="12">
-      <ProFormItemV2 label="濂栧姳閲戞眹鎬昏〃:" prop="bountyCollectFileUrl">
-        <ProFormUpload
-          v-model:file-url="form.bountyCollectFileUrl"
-          :limitShowViewMoreBtnCount="4"
-        ></ProFormUpload>
-      </ProFormItemV2>
-    </ProFormColItem>
-  </ProFormCol>
+  <ProFormItemV2 label="鏈鐢虫姤濂栧姳閲戞�婚:" prop="applySumAmount">
+    <ProFormInputNumber v-model="form.applySumAmount" formatValue="money" unit="鍏�" />
+  </ProFormItemV2>
+  <ProFormItemV2
+    :label="`${item.fileTypeName}:`"
+    :prop="`calculationFileList.${index}.listFiles`"
+    :label-width="160"
+    :style="{ marginBottom: index === form.calculationFileList.length - 1 ? 0 : '22px' }"
+    v-for="(item, index) in form.calculationFileList"
+    :key="item.fileSearchTypeId"
+  >
+    <ProFormUpload
+      v-model:file-url="item.listFiles"
+      :limit="1"
+      :limitFileSize="50"
+      :showTip="false"
+      :limitShowViewMoreBtnCount="4"
+      accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
+    ></ProFormUpload>
+  </ProFormItemV2>
 </template>
 
 <script setup lang="ts">
 import {
-  ProFormCol,
-  ProFormColItem,
   ProFormItemV2,
   ProFormUpload,
   UploadUserFile,
   ProFormInputNumber,
 } from '@bole-core/components';
+import { CustomerApplyFileTypeListItem } from './utils';
 
 defineOptions({
   name: 'SettlementMaterialInfoView',
@@ -49,8 +37,7 @@
 type Props = {
   form: {
     applySumAmount: number;
-    bountyAssignFileUlr: UploadUserFile[];
-    bountyCollectFileUrl: UploadUserFile[];
+    calculationFileList: CustomerApplyFileTypeListItem[];
   };
 };
 
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/index.ts b/src/constants/index.ts
index 195d367..649a1be 100644
--- a/src/constants/index.ts
+++ b/src/constants/index.ts
@@ -1,4 +1,5 @@
 export * from './enum';
+export * from './common';
 export * from './oss';
 export * from './module';
 export * from './editor';
diff --git a/src/constants/reward.ts b/src/constants/reward.ts
index 966f1e5..85294f9 100644
--- a/src/constants/reward.ts
+++ b/src/constants/reward.ts
@@ -56,6 +56,11 @@
   [SettleStatusEnum.HasSettle]: '宸插厖鍊�',
   [SettleStatusEnum.NoNeed]: '鏃犻渶鍏呭��',
 };
+export const SettleStatusEnumTextV2 = {
+  [SettleStatusEnum.WaitForSettle]: '寰呯櫥璁�',
+  [SettleStatusEnum.HasSettle]: '宸茬櫥璁�',
+  [SettleStatusEnum.NoNeed]: '鏃犻渶鐧昏',
+};
 
 export enum FinanceStatusEnum {
   /**
@@ -71,6 +76,11 @@
 export const FinanceStatusEnumText = {
   [FinanceStatusEnum.WaitForIncome]: '寰呮嫧浠�',
   [FinanceStatusEnum.HasIncome]: '宸叉嫧浠�',
+};
+
+export const FinanceStatusEnumTextV2 = {
+  [FinanceStatusEnum.WaitForIncome]: '寰呯櫥璁�',
+  [FinanceStatusEnum.HasIncome]: '宸茬櫥璁�',
 };
 
 export enum IncomeStatusEnum {
@@ -100,3 +110,50 @@
   [EnterpriseBountyPayTypeEnum.PayOut]: '鍑洪噾',
   [EnterpriseBountyPayTypeEnum.PayIn]: '鍏ラ噾',
 };
+
+export enum IncomeTypeEnum {
+  /**璐㈡斂鎷ㄤ粯 */
+  Fiscal = 10,
+  /**骞冲彴鍏呭�� */
+  Platform = 20,
+}
+
+export const IncomeTypeEnumText = {
+  [IncomeTypeEnum.Fiscal]: '璐㈡斂鎷ㄤ粯',
+  [IncomeTypeEnum.Platform]: '骞冲彴鍏呭��',
+};
+
+export enum EnterpriseRechargeStatusEnum {
+  /**寰呭鏍� */
+  WaitCheck = 10,
+  /**瀹℃牳閫氳繃 */
+  CheckPassed = 20,
+  /**椹冲洖 */
+  CheckReject = 30,
+}
+
+export const EnterpriseRechargeStatusEnumText = {
+  [EnterpriseRechargeStatusEnum.WaitCheck]: '寰呭鏍�',
+  [EnterpriseRechargeStatusEnum.CheckPassed]: '瀹℃牳閫氳繃',
+  [EnterpriseRechargeStatusEnum.CheckReject]: '椹冲洖',
+};
+
+export const EnterpriseRechargeStatusEnumTextForAdudit = {
+  [EnterpriseRechargeStatusEnum.CheckPassed]: '閫氳繃',
+  [EnterpriseRechargeStatusEnum.CheckReject]: '椹冲洖',
+};
+
+export enum BillStatusEnum {
+  /**鏈笂浼� */
+  NotUpload = 10,
+  /**寰呭畬鍠� */
+  NeedUpload = 20,
+  /**宸蹭笂浼� */
+  HasUpload = 30,
+}
+
+export const BillStatusEnumText = {
+  [BillStatusEnum.NotUpload]: '鏈笂浼�',
+  [BillStatusEnum.NeedUpload]: '寰呭畬鍠�',
+  [BillStatusEnum.HasUpload]: '宸蹭笂浼�',
+};
diff --git a/src/hooks/index.ts b/src/hooks/index.ts
index efd8b4b..e101419 100644
--- a/src/hooks/index.ts
+++ b/src/hooks/index.ts
@@ -3,6 +3,7 @@
 export * from './useAccess';
 export * from './useRouteView';
 // export * from './useArea';
+export * from './portraitTable';
 export * from './useEvent';
 export * from './useUser';
 export * from './help';
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 627583d..cb3837d 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -205,7 +205,7 @@
         component: () => import('@/views/Reward/RewardGrant.vue'),
         meta: {
           rank: 10031,
-          title: '濂栧姳鍙戞斁',
+          title: '濂栧姳鍙戞斁鐧昏',
           // rootMenu: true,
           icon: 'home',
         },
@@ -221,6 +221,19 @@
           rootMenu: false,
         },
       },
+      {
+        path: '/WithdrawalApproval',
+        name: 'WithdrawalApproval',
+        hidden: false,
+        alwaysShow: true,
+        component: () => import('@/views/Reward/WithdrawalApproval.vue'),
+        meta: {
+          rank: 10033,
+          title: '鎻愮幇瀹℃壒',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
     ],
   },
   // {
diff --git a/src/services/api/EnterpriseApplyFile.ts b/src/services/api/EnterpriseApplyFile.ts
index 3013b93..90bd80f 100644
--- a/src/services/api/EnterpriseApplyFile.ts
+++ b/src/services/api/EnterpriseApplyFile.ts
@@ -2,6 +2,21 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
+/** 鎵归噺寮曠敤浼佷笟璧勬枡 GET /api/EnterpriseApplyFile/BatchQuoteEnterpriseApplyFile */
+export async function batchQuoteEnterpriseApplyFile(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIbatchQuoteEnterpriseApplyFileParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/EnterpriseApplyFile/BatchQuoteEnterpriseApplyFile', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
 /** 纭鎻愪氦鏉愭枡涓婁紶 POST /api/EnterpriseApplyFile/CustomerUploadMonthApplyFile */
 export async function customerUploadMonthApplyFile(
   body: API.CustomerUploadMonthApplyFileInput,
diff --git a/src/services/api/ParkBountyApply.ts b/src/services/api/ParkBountyApply.ts
index fbe0aa0..e75e6e9 100644
--- a/src/services/api/ParkBountyApply.ts
+++ b/src/services/api/ParkBountyApply.ts
@@ -32,6 +32,21 @@
   });
 }
 
+/** 鎻愮幇瀹℃牳 POST /api/ParkBountyApply/CheckEnterpriseApplyDrawWith */
+export async function checkEnterpriseApplyDrawWith(
+  body: API.CheckEnterpriseApplyDrawWithInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/ParkBountyApply/CheckEnterpriseApplyDrawWith', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 棰勫厖鍊煎鏍� POST /api/ParkBountyApply/CheckUserEnterpriseRecharge */
 export async function checkUserEnterpriseRecharge(
   body: API.CheckUserEnterpriseRechargeInput,
@@ -77,6 +92,21 @@
   });
 }
 
+/** 瀹㈡埛绔�-鐢宠鎻愮幇 POST /api/ParkBountyApply/EnterpriseApplyDrawWith */
+export async function enterpriseApplyDrawWith(
+  body: API.EnterpriseApplyDrawWithInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/ParkBountyApply/EnterpriseApplyDrawWith', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鑾峰彇鍙�夋嫨鍏徃鍜屽凡鍓旈櫎鍏徃 POST /api/ParkBountyApply/GetCompanyNameList */
 export async function getCompanyNameList(
   body: API.GetCompanyNameListInput,
@@ -99,6 +129,42 @@
 ) {
   return request<API.GetParkBountyApplyListOutputPageOutput>(
     '/api/ParkBountyApply/GetCustmoerParkBountyApplyList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇鎻愮幇鐢宠璇︽儏 GET /api/ParkBountyApply/GetEnterpriseDrawWithDetail */
+export async function getEnterpriseDrawWithDetail(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetEnterpriseDrawWithDetailParams,
+  options?: API.RequestConfig
+) {
+  return request<API.GetEnterpriseDrawWithDetailOutput>(
+    '/api/ParkBountyApply/GetEnterpriseDrawWithDetail',
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇鎻愮幇鐢宠璁板綍鍒楄〃 POST /api/ParkBountyApply/GetEnterpriseDrawWithList */
+export async function getEnterpriseDrawWithList(
+  body: API.GetEnterpriseDrawWithListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetEnterpriseDrawWithListOutputPageOutput>(
+    '/api/ParkBountyApply/GetEnterpriseDrawWithList',
     {
       method: 'POST',
       headers: {
@@ -168,6 +234,21 @@
 ) {
   return request<API.GetEnterprisePreChargeCheckListOutputPageOutput>(
     '/api/ParkBountyApply/GetEnterprisePreChargeCheckList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇鍏呭�艰褰曞垪琛� POST /api/ParkBountyApply/GetEnterprisePrechargeList */
+export async function getEnterprisePrechargeList(body: API.PageInput, options?: API.RequestConfig) {
+  return request<API.GetEnterprisePrechargeListOutputPageOutput>(
+    '/api/ParkBountyApply/GetEnterprisePrechargeList',
     {
       method: 'POST',
       headers: {
@@ -508,13 +589,31 @@
   );
 }
 
-/** 杩愯惀绔竴鍥尯瀹㈡埛绠$悊璇︽儏涓�濂栧姳閲戝彂鏀捐褰� POST /api/ParkBountyApply/GetParkCustomerBountyGrantList */
-export async function getParkCustomerBountyGrantList(
+/** 鎷ㄤ粯璁板綍 POST /api/ParkBountyApply/GetParkCustomerBountyFinanceList */
+export async function getParkCustomerBountyFinanceList(
   body: API.QueryParkCustomerBountyApplyInput,
   options?: API.RequestConfig
 ) {
-  return request<API.GetParkCustomerBountyGrantOutputPageOutput>(
-    '/api/ParkBountyApply/GetParkCustomerBountyGrantList',
+  return request<API.GetParkCustomerBountyFinanceOutputPageOutput>(
+    '/api/ParkBountyApply/GetParkCustomerBountyFinanceList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 杩愯惀绔竴鍥尯瀹㈡埛绠$悊璇︽儏涓�濂栧姳閲戝彂鏀捐褰� POST /api/ParkBountyApply/GetParkCustomerBountySettleList */
+export async function getParkCustomerBountySettleList(
+  body: API.QueryParkCustomerBountyApplyInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetParkCustomerBountySettleOutputPageOutput>(
+    '/api/ParkBountyApply/GetParkCustomerBountySettleList',
     {
       method: 'POST',
       headers: {
@@ -649,6 +748,21 @@
   });
 }
 
+/** 涓婁紶璐㈡斂鎷ㄤ粯鐧昏閲戦 POST /api/ParkBountyApply/ParkBountyApplyFinanceBillAmount */
+export async function parkBountyApplyFinanceBillAmount(
+  body: API.ParkBountyApplyFinanceFileInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/ParkBountyApply/ParkBountyApplyFinanceBillAmount', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 璐㈡斂鍏ヨ处涓婁紶鍑瘉 POST /api/ParkBountyApply/ParkBountyApplyFinanceFile */
 export async function parkBountyApplyFinanceFile(
   body: API.ParkBountyApplyRechargeFileInput,
@@ -679,6 +793,21 @@
   });
 }
 
+/** 涓婁紶鍏呭�肩櫥璁伴噾棰� POST /api/ParkBountyApply/ParkBountyApplySettleAmount */
+export async function parkBountyApplySettleAmount(
+  body: API.ParkBountyApplySettleInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/ParkBountyApply/ParkBountyApplySettleAmount', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 杩愯惀绔�斿鍔遍噾-鍑鸿处 POST /api/ParkBountyApply/ParkBountyApplyTrade */
 export async function parkBountyApplyTrade(
   body: API.CreateParkBountyTradeInput,
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index b759d38..84afdc7 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -235,6 +235,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔鐢ㄦ埛鎻愮幇 */
+    suportWithDraw?: boolean;
     /** 鏂囦欢 */
     industrialParkApplyFileFile?: IndustrialParkApplyFileFile[];
   }
@@ -958,6 +960,10 @@
     productId?: string;
   }
 
+  interface APIbatchQuoteEnterpriseApplyFileParams {
+    parkBountyApplyId?: string;
+  }
+
   interface APIcalculationWalletBatchImportTempPayFeeParams {
     walletAccountType?: WalletAccountTypeEnum;
   }
@@ -1352,6 +1358,10 @@
 
   interface APIgetElecBillInfoParams {
     transactionDetailId?: string;
+  }
+
+  interface APIgetEnterpriseDrawWithDetailParams {
+    drawWithId?: string;
   }
 
   interface APIgetEnterpriseLastUploadEnterPactFileNewParams {
@@ -2725,6 +2735,8 @@
 
   type BestSignUserSignStatusEunm = 1 | 5 | 10 | 20 | 30 | 40 | 50 | 90;
 
+  type BillStatusEnum = 10 | 20 | 30;
+
   interface BindUserEmailInput {
     /** 閭 */
     bindEmailAddress: string;
@@ -3022,6 +3034,14 @@
     circleFriendReplyId?: string;
     /** 瀹℃牳鐘舵�� 閫氳繃锛�10 椹冲洖锛�-10 */
     status?: number;
+  }
+
+  interface CheckEnterpriseApplyDrawWithInput {
+    applyDrawWithId?: string;
+    checkStatus?: EnterpriseRechargeStatusEnum;
+    /** 鎻愮幇鍑瘉 */
+    checkFileUrl?: string;
+    checkRemark?: string;
   }
 
   interface CheckInsureCityIsAllowInput {
@@ -5648,6 +5668,11 @@
     freeCount?: number;
   }
 
+  interface EnterpriseApplyDrawWithInput {
+    amount?: number;
+    invoiceUrl?: string;
+  }
+
   interface EnterpriseBatchRefundInput {
     guid?: string;
     listOrderNo?: number[];
@@ -5739,6 +5764,8 @@
   type EnterpriseMonthApplyStatusEnum = 10 | 20;
 
   type EnterpriseMonthUploadStatusEnum = 10 | 20 | 30;
+
+  type EnterprisePrechargeInComeStatusEnum = 10 | 20;
 
   type EnterpriseRechargeStatusEnum = 10 | 20 | 30;
 
@@ -5967,7 +5994,7 @@
     fileId?: string;
   }
 
-  type FinanceStatusEnum = 1 | 2;
+  type FinanceStatusEnum = 1 | 2 | 3;
 
   type FinanceTypeEnum = 10 | 20;
 
@@ -6823,6 +6850,57 @@
     data?: GetEnterpriseCredentialDataResponse;
   }
 
+  interface GetEnterpriseDrawWithDetailOutput {
+    id?: string;
+    enterpriseId?: string;
+    enterpriseName?: string;
+    societyCreditCode?: string;
+    creationTime?: string;
+    accountName?: string;
+    bankNumber?: string;
+    bankName?: string;
+    bankResumeName?: string;
+    amount?: number;
+    remainAmount?: number;
+    invoiceUrl?: string;
+    checkStatus?: EnterpriseRechargeStatusEnum;
+    checkTime?: string;
+    checkUserId?: string;
+    checkRemark?: string;
+    checkFileUrl?: string;
+  }
+
+  interface GetEnterpriseDrawWithListInput {
+    pageModel?: Pagination;
+    keyWord?: string;
+    beginDateTime?: string;
+    endDateTime?: string;
+    checkStatus?: EnterpriseRechargeStatusEnum;
+  }
+
+  interface GetEnterpriseDrawWithListOutput {
+    drawWithId?: string;
+    enterpriseId?: string;
+    enterpriseName?: string;
+    societyCreditCode?: string;
+    creationTime?: string;
+    enterpriseType?: string;
+    parkName?: string;
+    parkType?: string;
+    amount?: number;
+    remainAmount?: number;
+    checkStatus?: EnterpriseRechargeStatusEnum;
+    checkTime?: string;
+    checkRemark?: string;
+    checkFileUrl?: string;
+  }
+
+  interface GetEnterpriseDrawWithListOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetEnterpriseDrawWithListOutput[];
+  }
+
   interface GetEnterpriseMonthApplyFileOutput {
     id?: string;
     enterpriseId?: string;
@@ -6884,6 +6962,26 @@
     pageModel?: Pagination;
     objectData?: any;
     data?: GetEnterprisePreChargeCheckListOutput[];
+  }
+
+  interface GetEnterprisePrechargeListOutput {
+    id?: string;
+    /** 鍏呭�奸噾棰� */
+    prechargeAmount?: number;
+    /** 鍏呭�煎嚟璇� */
+    rechargeVoucherFileUrl?: string;
+    /** 瀹℃牳澶囨敞 */
+    checkRemark?: string;
+    checkStatus?: EnterpriseRechargeStatusEnum;
+    inComeStatus?: EnterprisePrechargeInComeStatusEnum;
+    /** 鎻愪氦鏃ユ湡 */
+    creationTime?: string;
+  }
+
+  interface GetEnterprisePrechargeListOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetEnterprisePrechargeListOutput[];
   }
 
   interface GetEnterpriseRechargeDetail {
@@ -8146,6 +8244,10 @@
     financeTimeEnd?: string;
     /** 鍏ヨ处璧峰鏃ユ湡 */
     incomeTimeBegin?: string;
+    /** 鎷ㄤ粯鍏ヨ处缁撴潫鏃ユ湡 */
+    financeIncomeTimeEnd?: string;
+    /** 鎷ㄤ粯鍏ヨ处璧峰鏃ユ湡 */
+    financeIncomeTimeBegin?: string;
     /** 鍏ヨ处缁撴潫鏃ユ湡 */
     incomeTimeEnd?: string;
     /** 澶栭儴瀹℃牳璧峰鏃ユ湡 */
@@ -8184,6 +8286,7 @@
     inCheckStatus?: BountyCheckStatusEnum;
     /** 璐㈡斂鍏ヨ处鏃堕棿 */
     financeIncomeTime?: string;
+    billStatus?: BillStatusEnum;
     financeIncomeStatus?: IncomeStatusEnum;
     /** 鍐呴儴瀹℃牳鏃ユ湡 */
     inCheckTime?: string;
@@ -8209,6 +8312,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔鐢ㄦ埛鎻愮幇 */
+    suportWithDraw?: boolean;
   }
 
   interface GetParkBountyApplyListOutputPageOutput {
@@ -8343,6 +8448,7 @@
     /** 鍑瘉 */
     payFileUrl?: string;
     payFileUrls?: string[];
+    financeType?: FinanceTypeEnum;
   }
 
   interface GetParkCustomerBountyConsumptionOutputPageOutput {
@@ -8351,7 +8457,34 @@
     data?: GetParkCustomerBountyConsumptionOutput[];
   }
 
-  interface GetParkCustomerBountyGrantOutput {
+  interface GetParkCustomerBountyFinanceOutput {
+    id?: string;
+    /** 鐢宠鎵规鍙� */
+    batchNo?: string;
+    /** 鐢虫姤鏈堜唤 */
+    applyMonth?: string;
+    /** 鐢虫姤鎬婚 */
+    applySumAmount?: number;
+    /** 璐㈡斂鎷ㄤ粯閲戦 */
+    financeToAmount?: number;
+    /** 璐㈡斂鎷ㄤ粯鍏ヨ处鏃堕棿 */
+    financeToTime?: string;
+    /** 璐㈡斂鎷ㄤ粯鍙戞斁鏃ユ湡 */
+    financeTime?: string;
+    financeToStatus?: FinanceStatusEnum;
+    /** 鎷ㄤ粯鍏ヨ处鍑瘉 */
+    financeToFileUrl?: string;
+    inCheckStatus?: BountyCheckStatusEnum;
+    outCheckStatus?: BountyCheckStatusEnum;
+  }
+
+  interface GetParkCustomerBountyFinanceOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetParkCustomerBountyFinanceOutput[];
+  }
+
+  interface GetParkCustomerBountySettleOutput {
     id?: string;
     /** 鐢宠鎵规鍙� */
     batchNo?: string;
@@ -8368,21 +8501,17 @@
     transferToFileUrl?: string;
     /** 璐㈡斂鎷ㄤ粯閲戦 */
     financeToAmount?: number;
-    /** 璐㈡斂鎷ㄤ粯鍏ヨ处鏃堕棿 */
-    financeToTime?: string;
-    /** 璐㈡斂鎷ㄤ粯鍙戞斁鏃ユ湡 */
-    financeTime?: string;
     /** 骞冲彴鍏呭�煎彂鏀炬棩鏈� */
     settleTime?: string;
     financeToStatus?: FinanceStatusEnum;
-    /** 鎷ㄤ粯鍏ヨ处鍑瘉 */
-    financeToFileUrl?: string;
+    inCheckStatus?: BountyCheckStatusEnum;
+    outCheckStatus?: BountyCheckStatusEnum;
   }
 
-  interface GetParkCustomerBountyGrantOutputPageOutput {
+  interface GetParkCustomerBountySettleOutputPageOutput {
     pageModel?: Pagination;
     objectData?: any;
-    data?: GetParkCustomerBountyGrantOutput[];
+    data?: GetParkCustomerBountySettleOutput[];
   }
 
   interface GetParkCustomerManageDetailOutput {
@@ -8440,11 +8569,17 @@
     /** 鏈�杩戠敵鎶� */
     lastApplyTime?: string;
     /** 鍙戞斁娆℃暟 */
-    payCount?: number;
+    financeCount?: number;
     /** 鏈�杩戝彂鏀炬椂闂� */
-    lastPayTime?: string;
+    lastFinanceTime?: string;
+    /** 骞冲彴鍏呭�兼鏁� */
+    settleCount?: number;
+    /** 鏈�杩戝厖鍊兼棩鏈� */
+    lastSettleTime?: string;
     /** 鍙戞斁鎬婚 */
-    bountySumAmount?: number;
+    settleSumAmount?: number;
+    /** 鍏呭�兼�婚 */
+    financeSumAmount?: number;
     /** 濂栧姳閲戜綑棰� */
     bountyAmount?: number;
   }
@@ -8944,6 +9079,8 @@
     bountyAmount?: number;
     /** 鍏呭�间綑棰� */
     rechargeAmount?: number;
+    /** 璐㈡斂鎷ㄤ粯浣欓 */
+    financeAmount?: number;
     enterpriseName?: string;
     societyCreditCode?: string;
     licenseUrl?: string;
@@ -9963,6 +10100,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔鐢ㄦ埛鎻愮幇 */
+    suportWithDraw?: boolean;
     /** 娉ㄥ唽鍦板潃 */
     registerAddress?: string;
     /** 澶囨敞 */
@@ -9978,6 +10117,12 @@
     parkTypeId?: string;
     /** 鍥尯绫诲瀷鍚嶇О */
     parkTypeName?: string;
+    /** 鏄惁宸茬粡鍚敤濂栧姳閲戠敵鎶� */
+    rewardEnable?: boolean;
+    /** 鏄惁鏀寔浼佷笟鑷富涓婁紶 */
+    suportEnterpriseUpload?: boolean;
+    /** 鏄惁鏀寔骞冲彴鍏呭�� */
+    suportPlatRecharge?: boolean;
   }
 
   interface IndustrialParkFileTypeOutput {
@@ -10012,6 +10157,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔鐢ㄦ埛鎻愮幇 */
+    suportWithDraw?: boolean;
   }
 
   interface IndustrialParkListOutputPageOutput {
@@ -14602,7 +14749,10 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔鐢ㄦ埛鎻愮幇 */
+    suportWithDraw?: boolean;
     listFiles?: CustomerUploadMonthApplyFileTypeDto[];
+    collectCountListFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
   interface OutcheckParkBountyApplyInput {
@@ -14675,6 +14825,7 @@
     /** 璐㈡斂鍙戞斁閲戦 */
     financeSumAmount?: number;
     listFiles?: CustomerUploadMonthApplyFileTypeDto[];
+    collectCountListFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
   interface ParkBountyApplyBatchFinanceInput {
@@ -18107,6 +18258,7 @@
     bountyCollectFileUrl?: string;
     /** 鐢虫姤鎬婚 */
     applySumAmount?: number;
+    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
   interface SaveParkBountyApplyGatherFileInput {
@@ -18504,7 +18656,7 @@
     type?: number;
   }
 
-  type SettleStatusEnum = 1 | 2 | -1;
+  type SettleStatusEnum = 1 | 2 | 3 | -1;
 
   interface SetUserCertificationAuditStatusInput {
     /** 瀹℃牳Id */
@@ -19726,6 +19878,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔鐢ㄦ埛鎻愮幇 */
+    suportWithDraw?: boolean;
     /** 鏂囦欢 */
     industrialParkApplyFileFile?: IndustrialParkApplyFileFile[];
     id?: string;
@@ -21287,8 +21441,12 @@
     signatureImageStatus?: number;
     certificationChannel?: UserCertificationChannelEnum;
     industrialParkId?: string;
+    industrialParkName?: string;
     suportEnterpriseUpload?: boolean;
     suportPlatRecharge?: boolean;
+    rewardEnable?: boolean;
+    suportWithDraw?: boolean;
+    isHasBountyApply?: boolean;
   }
 
   interface UserMessageInfo {
diff --git a/src/views/EnterpriseInfo/EnterpriseInfo.vue b/src/views/EnterpriseInfo/EnterpriseInfo.vue
index 10434a9..4867cce 100644
--- a/src/views/EnterpriseInfo/EnterpriseInfo.vue
+++ b/src/views/EnterpriseInfo/EnterpriseInfo.vue
@@ -14,7 +14,18 @@
               @change="getList()"
             ></FieldDatePicker>
           </QueryFilterItem>
-          <QueryFilterItem tip-content="鏈�杩戝彂鏀炬棩鏈�">
+          <QueryFilterItem tip-content="鏈�杩戞嫧浠樻棩鏈�">
+            <FieldDatePicker
+              v-model="extraParamState.lastPayTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鏈�杩戝厖鍊兼棩鏈�">
             <FieldDatePicker
               v-model="extraParamState.lastPayTime"
               type="daterange"
@@ -111,24 +122,42 @@
   },
   {
     id: '8',
-    enCode: 'payCount',
-    name: '鍙戞斁娆℃暟',
+    enCode: 'financeCount',
+    name: '璐㈡斂鎷ㄤ粯娆℃暟',
     width: 150,
   },
   {
     id: '9',
-    enCode: 'lastPayTime',
-    name: '鏈�杩戝彂鏀炬棩鏈�',
+    enCode: 'lastFinanceTime',
+    name: '鏈�杩戞嫧浠樻棩鏈�',
     width: 180,
   },
   {
     id: '10',
-    enCode: 'bountySumAmount',
-    name: '鍙戞斁鎬婚',
+    enCode: 'financeSumAmount',
+    name: '鎷ㄤ粯鎬婚',
     width: 150,
   },
   {
     id: '11',
+    enCode: 'settleCount',
+    name: '骞冲彴鍏呭�兼鏁�',
+    width: 150,
+  },
+  {
+    id: '12',
+    enCode: 'lastSettleTime',
+    name: '鏈�杩戝厖鍊兼棩鏈�',
+    width: 180,
+  },
+  {
+    id: '13',
+    enCode: 'settleSumAmount',
+    name: '鍏呭�兼�婚',
+    width: 150,
+  },
+  {
+    id: '14',
     enCode: 'bountyAmount',
     name: '骞冲彴鍏呭�间綑棰�',
     width: 150,
@@ -195,8 +224,10 @@
     },
     columnsRenderProps: {
       lastApplyTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
-      lastPayTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
-      bountySumAmount: { type: 'money' },
+      lastFinanceTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      financeSumAmount: { type: 'money' },
+      lastSettleTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      settleSumAmount: { type: 'money' },
       bountyAmount: { type: 'money' },
       enterpriseType: { type: 'enum', valueEnum: EnterpriseTypeText },
     },
diff --git a/src/views/EnterpriseInfo/EnterpriseInfoDetail.vue b/src/views/EnterpriseInfo/EnterpriseInfoDetail.vue
index 09968dc..3092c68 100644
--- a/src/views/EnterpriseInfo/EnterpriseInfoDetail.vue
+++ b/src/views/EnterpriseInfo/EnterpriseInfoDetail.vue
@@ -14,6 +14,9 @@
         <ProTabPane lazy label="娑堣垂璁板綍" name="rewardConsumeRecord">
           <RewardConsumeRecordView></RewardConsumeRecordView>
         </ProTabPane>
+        <ProTabPane lazy label="鎻愮幇璁板綍" name="rewardConsumeRecord">
+          <WithdrawalRecordView></WithdrawalRecordView>
+        </ProTabPane>
       </ProTabs>
     </AppContainer>
   </LoadingLayout>
@@ -25,6 +28,7 @@
 import EnterpriseDeclareRecordView from './components/EnterpriseDeclareRecordView.vue';
 import RewardGrantRecordView from './components/RewardGrantRecordView.vue';
 import RewardConsumeRecordView from './components/RewardConsumeRecordView.vue';
+import WithdrawalRecordView from './components/WithdrawalRecordView.vue';
 
 defineOptions({
   name: 'EnterpriseInfoDetail',
diff --git a/src/views/EnterpriseInfo/components/WithdrawalRecordView.vue b/src/views/EnterpriseInfo/components/WithdrawalRecordView.vue
new file mode 100644
index 0000000..0be78b4
--- /dev/null
+++ b/src/views/EnterpriseInfo/components/WithdrawalRecordView.vue
@@ -0,0 +1,118 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+        <template #operationBtn-checkBtn="{ data, row }">
+          <PreviewBtnV2
+            class="pro-table-operation-btn"
+            :url="convertApi2FormUrlBySeparator(row.checkFileUrl ?? '')"
+            preview-btn-text="鏌ョ湅鍑瘉"
+          />
+        </template>
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  AppContainer,
+  useTable,
+  ProTableV2,
+  defineOperationBtns,
+  PreviewBtnV2,
+} from '@bole-core/components';
+import { convertApi2FormUrlBySeparator } from '@/utils';
+import { OrderInputType } from '@bole-core/core';
+import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import { EnterpriseRechargeStatusEnum } from '@/constants';
+
+defineOptions({
+  name: 'WithdrawalRecordView',
+});
+
+const column: API.CustomModuleColumnDto[] = [
+  {
+    id: '1',
+    enCode: 'creationTime',
+    name: '鐢宠鎻愮幇鏃ユ湡',
+  },
+  {
+    id: '2',
+    enCode: 'checkTime',
+    name: '瀹℃牳閫氳繃鏃ユ湡',
+  },
+  {
+    id: '3',
+    enCode: 'amount',
+    name: '鎻愮幇閲戦',
+  },
+  {
+    id: '4',
+    enCode: 'remainAmount',
+    name: '璧勯噾浣欓',
+  },
+];
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'checkBtn',
+      name: '鏌ョ湅鍑瘉',
+    },
+  },
+]);
+
+const route = useRoute();
+const router = useRouter();
+const id = route.params.id as string;
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetEnterpriseDrawWithListInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        checkStatus: EnterpriseRechargeStatusEnum.CheckPassed,
+      };
+      let res = await parkBountyApplyServices.getEnterpriseDrawWithList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }],
+    },
+    columnsRenderProps: {
+      creationTime: { type: 'date', format: 'YYYY-MM-DD' },
+      checkTime: { type: 'date', format: 'YYYY-MM-DD' },
+      amount: { type: 'money' },
+      remainAmount: { type: 'money' },
+    },
+  }
+);
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/MaterialReview/MaterialReviewAudit.vue b/src/views/MaterialReview/MaterialReviewAudit.vue
index e5b1d4b..d7986e5 100644
--- a/src/views/MaterialReview/MaterialReviewAudit.vue
+++ b/src/views/MaterialReview/MaterialReviewAudit.vue
@@ -116,12 +116,13 @@
   parkTypeName: '',
   applyMonth: '',
   applySumAmount: 0,
-  enterpriseTaxSubFileUrl: [] as UploadUserFile[],
-  enterpriseOperateFileUrl: [] as UploadUserFile[],
-  enterpriseRelateFileUrl: [] as UploadUserFile[],
+  // enterpriseTaxSubFileUrl: [] as UploadUserFile[],
+  // enterpriseOperateFileUrl: [] as UploadUserFile[],
+  // enterpriseRelateFileUrl: [] as UploadUserFile[],
+  // bountyAssignFileUlr: [] as UploadUserFile[],
+  // bountyCollectFileUrl: [] as UploadUserFile[],
   parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
-  bountyAssignFileUlr: [] as UploadUserFile[],
-  bountyCollectFileUrl: [] as UploadUserFile[],
+  calculationFileList: [] as CustomerApplyFileTypeListItem[],
 
   status: '' as any as BountyCheckStatusEnum,
   remark: '',
@@ -144,20 +145,23 @@
     form.parkTypeName = data.parkTypeName;
     form.applyMonth = data.applyMonth;
     form.applySumAmount = data.applySumAmount;
-    form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseTaxSubFileUrl
-    );
-    form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseOperateFileUrl
-    );
-    form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
-    form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
-    form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseRelateFileUrl
-    );
+    // form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseTaxSubFileUrl
+    // );
+    // form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseOperateFileUrl
+    // );
+    // form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
+    // form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
+    // form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseRelateFileUrl
+    // );
     form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
       data.listFiles
     );
+    form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
+      data.collectCountListFiles
+    );
 
     getList();
   },
diff --git a/src/views/MaterialReview/MaterialReviewDetail.vue b/src/views/MaterialReview/MaterialReviewDetail.vue
index b6d0263..78258d5 100644
--- a/src/views/MaterialReview/MaterialReviewDetail.vue
+++ b/src/views/MaterialReview/MaterialReviewDetail.vue
@@ -89,12 +89,13 @@
   parkTypeName: '',
   applyMonth: '',
   applySumAmount: 0,
-  enterpriseTaxSubFileUrl: [] as UploadUserFile[],
-  enterpriseOperateFileUrl: [] as UploadUserFile[],
-  enterpriseRelateFileUrl: [] as UploadUserFile[],
+  // enterpriseTaxSubFileUrl: [] as UploadUserFile[],
+  // enterpriseOperateFileUrl: [] as UploadUserFile[],
+  // enterpriseRelateFileUrl: [] as UploadUserFile[],
+  // bountyAssignFileUlr: [] as UploadUserFile[],
+  // bountyCollectFileUrl: [] as UploadUserFile[],
   parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
-  bountyAssignFileUlr: [] as UploadUserFile[],
-  bountyCollectFileUrl: [] as UploadUserFile[],
+  calculationFileList: [] as CustomerApplyFileTypeListItem[],
 
   outCheckStatus: '' as any as BountyCheckStatusEnum,
   outCheckRemark: '',
@@ -121,20 +122,23 @@
     form.applySumAmount = data.applySumAmount;
     form.outCheckStatus = data.outCheckStatus;
     form.outCheckRemark = data.outCheckRemark;
-    form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseTaxSubFileUrl
-    );
-    form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseOperateFileUrl
-    );
-    form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
-    form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
-    form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseRelateFileUrl
-    );
+    // form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseTaxSubFileUrl
+    // );
+    // form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseOperateFileUrl
+    // );
+    // form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
+    // form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
+    // form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseRelateFileUrl
+    // );
     form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
       data.listFiles
     );
+    form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
+      data.collectCountListFiles
+    );
 
     getList();
   },
diff --git a/src/views/Reward/RewardDeclareDetail.vue b/src/views/Reward/RewardDeclareDetail.vue
index 17df84a..f975347 100644
--- a/src/views/Reward/RewardDeclareDetail.vue
+++ b/src/views/Reward/RewardDeclareDetail.vue
@@ -68,12 +68,13 @@
   parkTypeName: '',
   applyMonth: '',
   applySumAmount: 0,
-  enterpriseTaxSubFileUrl: [] as UploadUserFile[],
-  enterpriseOperateFileUrl: [] as UploadUserFile[],
-  enterpriseRelateFileUrl: [] as UploadUserFile[],
+  // enterpriseTaxSubFileUrl: [] as UploadUserFile[],
+  // enterpriseOperateFileUrl: [] as UploadUserFile[],
+  // enterpriseRelateFileUrl: [] as UploadUserFile[],
   parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
-  bountyAssignFileUlr: [] as UploadUserFile[],
-  bountyCollectFileUrl: [] as UploadUserFile[],
+  calculationFileList: [] as CustomerApplyFileTypeListItem[],
+  // bountyAssignFileUlr: [] as UploadUserFile[],
+  // bountyCollectFileUrl: [] as UploadUserFile[],
 });
 
 const { data: detail, isLoading } = useQuery({
@@ -93,20 +94,23 @@
     form.parkTypeName = data.parkTypeName;
     form.applyMonth = data.applyMonth;
     form.applySumAmount = data.applySumAmount;
-    form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseTaxSubFileUrl
-    );
-    form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseOperateFileUrl
-    );
+    // form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseTaxSubFileUrl
+    // );
+    // form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseOperateFileUrl
+    // );
     form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
       data.listFiles
     );
-    form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
-    form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
-    form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
-      data?.enterpriseRelateFileUrl
+    form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
+      data.collectCountListFiles
     );
+    // form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
+    // form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
+    // form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
+    //   data?.enterpriseRelateFileUrl
+    // );
 
     getList();
   },
diff --git a/src/views/Reward/RewardGrant.vue b/src/views/Reward/RewardGrant.vue
index 7c468ee..ab8d42f 100644
--- a/src/views/Reward/RewardGrant.vue
+++ b/src/views/Reward/RewardGrant.vue
@@ -39,7 +39,7 @@
           <QueryFilterItem tip-content="璐㈡斂鎷ㄤ粯鐘舵��">
             <FieldRadio
               v-model="extraParamState.financeStatus"
-              :value-enum="FinanceStatusEnumText"
+              :value-enum="FinanceStatusEnumTextV2"
               buttonStyle
               showAllBtn
               @change="getList()"
@@ -48,7 +48,7 @@
           <QueryFilterItem tip-content="骞冲彴鍏呭�肩姸鎬�">
             <FieldRadio
               v-model="extraParamState.settleStatus"
-              :value-enum="SettleStatusEnumText"
+              :value-enum="SettleStatusEnumTextV2"
               buttonStyle
               showAllBtn
               @change="getList()"
@@ -77,8 +77,10 @@
         title="鏌ョ湅鍑瘉"
         :BusinessTypeEnumText="TransferFileEnumInRewardGrandText"
       />
-      <FinancialDialog v-bind="dialogFinancialProps"></FinancialDialog>
-      <PlateformDialog v-bind="dialogPlateformProps"></PlateformDialog>
+      <RegisterDialog v-bind="dialogRegisterProps"></RegisterDialog>
+      <UploadCertRewardDialog v-bind="dialogCertRewardProps"></UploadCertRewardDialog>
+      <!-- <FinancialDialog v-bind="dialogFinancialProps"></FinancialDialog>
+      <PlateformDialog v-bind="dialogPlateformProps"></PlateformDialog> -->
     </AppContainer>
   </LoadingLayout>
 </template>
@@ -102,12 +104,16 @@
 import { format } from '@/utils';
 import {
   SettleStatusEnum,
-  SettleStatusEnumText,
   FinanceStatusEnum,
-  FinanceStatusEnumText,
   TransferFileEnumInRewardGrandText,
+  FinanceStatusEnumTextV2,
+  SettleStatusEnumTextV2,
+  IncomeTypeEnum,
+  BillStatusEnum,
 } from '@/constants';
 import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import RegisterDialog from './components/RegisterDialog.vue';
+import UploadCertRewardDialog from './components/UploadCertRewardDialog.vue';
 import FinancialDialog from './components/FinancialDialog.vue';
 import PlateformDialog from './components/PlateformDialog.vue';
 import _ from 'lodash';
@@ -160,25 +166,25 @@
   {
     id: '7',
     enCode: 'financeStatus',
-    name: '璐㈡斂鎷ㄤ粯鐘舵��',
+    name: '璐㈡斂鎷ㄤ粯鐧昏鐘舵��',
     width: 160,
   },
   {
     id: '8',
     enCode: 'financeTime',
-    name: '鎷ㄤ粯鏃ユ湡',
+    name: '鐧昏鎷ㄤ粯鏃ユ湡',
     width: 180,
   },
   {
     id: '9',
     enCode: 'settleStatus',
-    name: '骞冲彴鍏呭�肩姸鎬�',
+    name: '骞冲彴鍏呭�肩櫥璁扮姸鎬�',
     width: 160,
   },
   {
     id: '10',
     enCode: 'settleTime',
-    name: '鍏呭�兼棩鏈�',
+    name: '鐧昏鍏呭�兼棩鏈�',
     width: 180,
   },
 ];
@@ -193,30 +199,62 @@
       onClick: (role) => goDetail(role),
     },
   },
+  // {
+  //   data: {
+  //     enCode: 'financialBtn',
+  //     name: '璐㈡斂鎷ㄤ粯',
+  //   },
+  //   emits: {
+  //     onClick: (role) => openFinancialDialog(role),
+  //   },
+  //   extraProps: {
+  //     hide: (row: API.GetParkBountyApplyListOutput) =>
+  //       row.financeStatus === FinanceStatusEnum.HasIncome,
+  //   },
+  // },
+  // {
+  //   data: {
+  //     enCode: 'plateformBtn',
+  //     name: '骞冲彴鍏呭��',
+  //   },
+  //   emits: {
+  //     onClick: (role) => openPlateformDialog(role),
+  //   },
+  //   extraProps: {
+  //     hide: (row: API.GetParkBountyApplyListOutput) =>
+  //       row.settleStatus !== SettleStatusEnum.WaitForSettle,
+  //   },
+  // },
   {
     data: {
-      enCode: 'financialBtn',
-      name: '璐㈡斂鎷ㄤ粯',
+      enCode: 'registerBtn',
+      name: '鐧昏',
     },
     emits: {
-      onClick: (role) => openFinancialDialog(role),
+      onClick: (role) => openRegisterDialog(role),
     },
     extraProps: {
       hide: (row: API.GetParkBountyApplyListOutput) =>
-        row.financeStatus === FinanceStatusEnum.HasIncome,
+        !(
+          row.settleStatus === SettleStatusEnum.WaitForSettle ||
+          row.financeStatus === FinanceStatusEnum.WaitForIncome
+        ),
     },
   },
   {
     data: {
-      enCode: 'plateformBtn',
-      name: '骞冲彴鍏呭��',
+      enCode: 'uploadCertBtn',
+      name: '涓婁紶鍑瘉',
     },
     emits: {
-      onClick: (role) => openPlateformDialog(role),
+      onClick: (role) => openCertRewardDialog(role),
     },
     extraProps: {
       hide: (row: API.GetParkBountyApplyListOutput) =>
-        row.settleStatus !== SettleStatusEnum.WaitForSettle,
+        !(
+          row.settleStatus === SettleStatusEnum.HasSettle ||
+          row.financeStatus === FinanceStatusEnum.HasIncome
+        ),
     },
   },
   {
@@ -228,9 +266,7 @@
       onClick: (row) => openMaterialFileDialog(row),
     },
     extraProps: {
-      hide: (row: API.GetParkBountyApplyListOutput) =>
-        row.settleStatus !== SettleStatusEnum.HasSettle &&
-        row.financeStatus === FinanceStatusEnum.WaitForIncome,
+      hide: (row: API.GetParkBountyApplyListOutput) => row.billStatus !== BillStatusEnum.HasUpload,
     },
   },
 ]);
@@ -294,8 +330,8 @@
       settleTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
       financeTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
       applySumAmount: { type: 'money' },
-      settleStatus: { type: 'enum', valueEnum: SettleStatusEnumText },
-      financeStatus: { type: 'enum', valueEnum: FinanceStatusEnumText },
+      settleStatus: { type: 'enum', valueEnum: SettleStatusEnumTextV2 },
+      financeStatus: { type: 'enum', valueEnum: FinanceStatusEnumTextV2 },
     },
   }
 );
@@ -322,34 +358,81 @@
 });
 
 const queryClient = useQueryClient();
+
+// const {
+//   dialogProps: dialogFinancialProps,
+//   handleEdit: handleFinancialEdit,
+//   editForm: editFinancialForm,
+// } = useFormDialog({
+//   onConfirm: handleFinancial,
+//   defaultFormParams: {
+//     parkBountyApplyId: '',
+//     financeSumAmount: 0,
+//     financeFileUrl: [] as UploadUserFile[],
+//   },
+// });
+
+// function openFinancialDialog(row?: API.GetParkBountyApplyListOutput) {
+//   handleFinancialEdit({
+//     parkBountyApplyId: row.id,
+//     financeSumAmount: 0,
+//     financeFileUrl: [] as UploadUserFile[],
+//   });
+// }
+// async function handleFinancial() {
+//   try {
+//     let params: API.ParkBountyApplyFinanceFileInput = {
+//       parkBountyApplyId: editFinancialForm.parkBountyApplyId,
+//       financeSumAmount: editFinancialForm.financeSumAmount,
+//       financeFileUrl: editFinancialForm.financeFileUrl.map((x) => x.path).join('|'),
+//     };
+//     let res = await parkBountyApplyServices.parkBountyApplyFinanceBill(params);
+//     if (res) {
+//       Message.successMessage('鎿嶄綔鎴愬姛');
+//       getList(paginationState.pageIndex);
+//       queryClient.invalidateQueries({
+//         queryKey: ['parkBountyApplyServices/getGoverDataBoard'],
+//       });
+//     }
+//   } catch (error) {}
+// }
 const {
-  dialogProps: dialogFinancialProps,
-  handleEdit: handleFinancialEdit,
-  editForm: editFinancialForm,
+  dialogProps: dialogRegisterProps,
+  handleEdit: handleRegisterEdit,
+  editForm: editRegisterForm,
 } = useFormDialog({
-  onConfirm: handleFinancial,
+  onConfirm: handleRegister,
   defaultFormParams: {
+    incomeType: '' as any as IncomeTypeEnum,
     parkBountyApplyId: '',
     financeSumAmount: 0,
-    financeFileUrl: [] as UploadUserFile[],
+    showSuportPlatRecharge: false,
+    showSuportFiscalRecharge: false,
   },
 });
 
-function openFinancialDialog(row?: API.GetParkBountyApplyListOutput) {
-  handleFinancialEdit({
+function openRegisterDialog(row?: API.GetParkBountyApplyListOutput) {
+  handleRegisterEdit({
+    incomeType: '' as any as IncomeTypeEnum,
+    showSuportPlatRecharge: row.settleStatus === SettleStatusEnum.WaitForSettle,
+    showSuportFiscalRecharge: row.financeStatus === FinanceStatusEnum.WaitForIncome,
     parkBountyApplyId: row.id,
     financeSumAmount: 0,
-    financeFileUrl: [] as UploadUserFile[],
   });
 }
-async function handleFinancial() {
+async function handleRegister() {
   try {
     let params: API.ParkBountyApplyFinanceFileInput = {
-      parkBountyApplyId: editFinancialForm.parkBountyApplyId,
-      financeSumAmount: editFinancialForm.financeSumAmount,
-      financeFileUrl: editFinancialForm.financeFileUrl.map((x) => x.path).join('|'),
+      parkBountyApplyId: editRegisterForm.parkBountyApplyId,
+      financeSumAmount: editRegisterForm.financeSumAmount,
     };
-    let res = await parkBountyApplyServices.parkBountyApplyFinanceBill(params);
+    let res;
+    if (editRegisterForm.incomeType === IncomeTypeEnum.Fiscal) {
+      res = await parkBountyApplyServices.parkBountyApplyFinanceBillAmount(params);
+    }
+    if (editRegisterForm.incomeType === IncomeTypeEnum.Platform) {
+      res = await parkBountyApplyServices.parkBountyApplySettleAmount(params);
+    }
     if (res) {
       Message.successMessage('鎿嶄綔鎴愬姛');
       getList(paginationState.pageIndex);
@@ -360,35 +443,87 @@
   } catch (error) {}
 }
 
+// const {
+//   dialogProps: dialogPlateformProps,
+//   handleEdit: handlePlateformEdit,
+//   editForm: editPlateformForm,
+// } = useFormDialog({
+//   onConfirm: handlePlateform,
+//   defaultFormParams: {
+//     parkBountyApplyId: '',
+//     settleSumAmount: 0,
+//     settleFileUrl: [] as UploadUserFile[],
+//   },
+// });
+
+// function openPlateformDialog(row?: API.GetParkBountyApplyListOutput) {
+//   handlePlateformEdit({
+//     parkBountyApplyId: row.id,
+//     settleSumAmount: 0,
+//     settleFileUrl: [] as UploadUserFile[],
+//   });
+// }
+
+// async function handlePlateform() {
+//   try {
+//     let params: API.ParkBountyApplySettleInput = {
+//       parkBountyApplyId: editPlateformForm.parkBountyApplyId,
+//       settleSumAmount: editPlateformForm.settleSumAmount,
+//       settleFileUrl: editPlateformForm.settleFileUrl.map((x) => x.path).join('|'),
+//     };
+//     let res = await parkBountyApplyServices.parkBountyApplySettle(params);
+//     if (res) {
+//       Message.successMessage('鎿嶄綔鎴愬姛');
+//       getList(paginationState.pageIndex);
+//       queryClient.invalidateQueries({
+//         queryKey: ['parkBountyApplyServices/getGoverDataBoard'],
+//       });
+//     }
+//   } catch (error) {}
+// }
+
 const {
-  dialogProps: dialogPlateformProps,
-  handleEdit: handlePlateformEdit,
-  editForm: editPlateformForm,
+  dialogProps: dialogCertRewardProps,
+  handleEdit: handleCertRewardEdit,
+  editForm: editCertRewardForm,
 } = useFormDialog({
-  onConfirm: handlePlateform,
+  onConfirm: handleCertReward,
   defaultFormParams: {
+    incomeType: '' as any as IncomeTypeEnum,
     parkBountyApplyId: '',
-    settleSumAmount: 0,
-    settleFileUrl: [] as UploadUserFile[],
+    fileUrl: [] as UploadUserFile[],
+    showSuportPlatRecharge: false,
+    showSuportFiscalRecharge: false,
   },
 });
 
-function openPlateformDialog(row?: API.GetParkBountyApplyListOutput) {
-  handlePlateformEdit({
+function openCertRewardDialog(row?: API.GetParkBountyApplyListOutput) {
+  handleCertRewardEdit({
+    incomeType: '' as any as IncomeTypeEnum,
+    showSuportPlatRecharge: row.settleStatus === SettleStatusEnum.HasSettle,
+    showSuportFiscalRecharge: row.financeStatus === FinanceStatusEnum.HasIncome,
     parkBountyApplyId: row.id,
-    settleSumAmount: 0,
-    settleFileUrl: [] as UploadUserFile[],
+    fileUrl: [] as UploadUserFile[],
   });
 }
-
-async function handlePlateform() {
+async function handleCertReward() {
   try {
-    let params: API.ParkBountyApplySettleInput = {
-      parkBountyApplyId: editPlateformForm.parkBountyApplyId,
-      settleSumAmount: editPlateformForm.settleSumAmount,
-      settleFileUrl: editPlateformForm.settleFileUrl.map((x) => x.path).join('|'),
+    let params: API.ParkBountyApplyFinanceFileInput = {
+      parkBountyApplyId: editCertRewardForm.parkBountyApplyId,
     };
-    let res = await parkBountyApplyServices.parkBountyApplySettle(params);
+    let res;
+    if (editCertRewardForm.incomeType === IncomeTypeEnum.Fiscal) {
+      (params as API.ParkBountyApplyFinanceFileInput).financeFileUrl = editCertRewardForm.fileUrl
+        .map((x) => x.path)
+        .join('|');
+      res = await parkBountyApplyServices.parkBountyApplyFinanceBill(params);
+    }
+    if (editCertRewardForm.incomeType === IncomeTypeEnum.Platform) {
+      (params as API.ParkBountyApplySettleInput).settleFileUrl = editCertRewardForm.fileUrl
+        .map((x) => x.path)
+        .join('|');
+      res = await parkBountyApplyServices.parkBountyApplySettle(params);
+    }
     if (res) {
       Message.successMessage('鎿嶄綔鎴愬姛');
       getList(paginationState.pageIndex);
diff --git a/src/views/Reward/WithdrawalApproval.vue b/src/views/Reward/WithdrawalApproval.vue
new file mode 100644
index 0000000..a575e10
--- /dev/null
+++ b/src/views/Reward/WithdrawalApproval.vue
@@ -0,0 +1,240 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="鐢宠鏃堕棿">
+            <FieldDatePicker
+              v-model="extraParamState.dateTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="瀹℃牳鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.checkStatus"
+              :value-enum="EnterpriseRechargeStatusEnumText"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.keyWord"
+              style="width: 300px"
+              placeholder="浼佷笟鍚嶇О/鍥尯/淇$敤浠g爜"
+              @on-click-search="getList"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+
+      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
+      </ProTableV2>
+      <WithdrawalApprovalAuditDialog v-bind="dialogProps"></WithdrawalApprovalAuditDialog>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  LoadingLayout,
+  AppContainer,
+  useTable,
+  ProTableQueryFilterBar,
+  ProTableV2,
+  defineOperationBtns,
+  SearchInput,
+  FieldRadio,
+  QueryFilterItem,
+  FieldDatePicker,
+  useFormDialog,
+  UploadUserFile,
+} from '@bole-core/components';
+import { Message, OrderInputType } from '@bole-core/core';
+import { format } from '@/utils';
+import { EnterpriseRechargeStatusEnum, EnterpriseRechargeStatusEnumText } from '@/constants';
+import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import WithdrawalApprovalAuditDialog from './components/WithdrawalApprovalAuditDialog.vue';
+import _ from 'lodash';
+import { ModelValueType } from 'element-plus';
+
+defineOptions({
+  name: 'WithdrawalApproval',
+});
+
+const column: API.CustomModuleColumnDto[] = [
+  {
+    id: '1',
+    enCode: 'enterpriseName',
+    name: '浼佷笟鍚嶇О',
+  },
+  {
+    id: '2',
+    enCode: 'societyCreditCode',
+    name: '缁熶竴绀句細淇$敤浠g爜',
+  },
+  {
+    id: '3',
+    enCode: 'enterpriseType',
+    name: '浼佷笟绫诲瀷',
+  },
+  {
+    id: '4',
+    enCode: 'parkName',
+    name: '鎵�灞炲洯鍖�',
+  },
+  {
+    id: '5',
+    enCode: 'parkType',
+    name: '鍥尯绫诲瀷',
+  },
+  {
+    id: '6',
+    enCode: 'creationTime',
+    name: '鐢宠鏃堕棿',
+  },
+  {
+    id: '7',
+    enCode: 'amount',
+    name: '鐢宠鎻愮幇閲戦锛堝厓锛�',
+  },
+  {
+    id: '8',
+    enCode: 'checkStatus',
+    name: '瀹℃牳鐘舵��',
+  },
+  {
+    id: '9',
+    enCode: 'checkTime',
+    name: '瀹℃牳鏃堕棿',
+  },
+];
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '璇︽儏',
+    },
+    emits: {
+      onClick: (role) => openDialog(role, true),
+    },
+    extraProps: {
+      hide: (row: API.GetEnterpriseDrawWithListOutput) =>
+        row.checkStatus === EnterpriseRechargeStatusEnum.WaitCheck,
+    },
+  },
+  {
+    data: {
+      enCode: 'auditBtn',
+      name: '瀹℃牳',
+    },
+    emits: {
+      onClick: (role) => openDialog(role),
+    },
+    extraProps: {
+      hide: (row: API.GetEnterpriseDrawWithListOutput) =>
+        row.checkStatus !== EnterpriseRechargeStatusEnum.WaitCheck,
+    },
+  },
+]);
+
+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.GetEnterpriseDrawWithListInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        keyWord: extraParamState.keyWord,
+        checkStatus: extraParamState.checkStatus,
+        beginDateTime: format(extraParamState.dateTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
+        endDateTime: format(extraParamState.dateTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
+      };
+      let res = await parkBountyApplyServices.getEnterpriseDrawWithList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      keyWord: '',
+      checkStatus: '' as any as EnterpriseRechargeStatusEnum,
+      dateTime: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }],
+    },
+    columnsRenderProps: {
+      creationTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      checkTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      amount: { type: 'money' },
+      checkStatus: { type: 'enum', valueEnum: EnterpriseRechargeStatusEnumText },
+    },
+  }
+);
+
+function openDialog(row: API.GetEnterpriseDrawWithListOutput, isCheck = false) {
+  handleAdd({
+    drawWithId: row.drawWithId,
+    isCheck,
+  });
+}
+
+const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({
+  onConfirm: handleAddOrEdit,
+  defaultFormParams: {
+    drawWithId: '',
+    checkStatus: '' as any as EnterpriseRechargeStatusEnum,
+    checkRemark: '',
+    isCheck: false,
+    checkFileUrl: [] as UploadUserFile[],
+  },
+});
+
+async function handleAddOrEdit() {
+  try {
+    let params: API.CheckEnterpriseApplyDrawWithInput = {
+      applyDrawWithId: editForm.drawWithId,
+      checkStatus: editForm.checkStatus,
+      checkFileUrl: editForm.checkFileUrl?.length > 0 ? editForm.checkFileUrl[0].path : '',
+      checkRemark: editForm.checkRemark,
+    };
+    let res = await parkBountyApplyServices.checkEnterpriseApplyDrawWith(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+    }
+  } catch (error) {}
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/Reward/components/RegisterDialog.vue b/src/views/Reward/components/RegisterDialog.vue
new file mode 100644
index 0000000..902453b
--- /dev/null
+++ b/src/views/Reward/components/RegisterDialog.vue
@@ -0,0 +1,116 @@
+<template>
+  <ProDialog
+    title="鐧昏"
+    v-model="visible"
+    @close="onDialogClose"
+    destroy-on-close
+    draggable
+    width="700px"
+  >
+    <ProForm :model="form" ref="dialogForm" label-width="120px">
+      <ProFormItemV2
+        label="鐧昏绫诲瀷:"
+        prop="incomeType"
+        :check-rules="[{ message: '璇烽�夋嫨鐧昏绫诲瀷' }]"
+      >
+        <ProFormRadio
+          v-model="form.incomeType"
+          :value-enum="incomeTypeEnum"
+          :button-style="false"
+        />
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="杈撳叆閲戦:"
+        prop="financeSumAmount"
+        :check-rules="[{ message: '璇疯緭鍏ラ噾棰�', type: 'number' }]"
+      >
+        <ProFormInputNumber
+          v-model="form.financeSumAmount"
+          :controls="false"
+          :min="0"
+          unit="鍏�"
+          :precision="2"
+        ></ProFormInputNumber>
+      </ProFormItemV2>
+    </ProForm>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="emit('onCancel')">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import { FormInstance } from 'element-plus';
+import {
+  ProDialog,
+  ProForm,
+  ProFormItemV2,
+  ProFormInputNumber,
+  ProFormRadio,
+} from '@bole-core/components';
+import { IncomeTypeEnumText, IncomeTypeEnum, FinanceStatusEnum } from '@/constants';
+
+defineOptions({
+  name: 'RegisterDialog',
+});
+
+type Props = {
+  /**
+   * @deprecated
+   */
+  financeSumAmount?: number;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+
+const visible = defineModel({ type: Boolean });
+
+type Form = {
+  title?: string;
+  financeSumAmount: number;
+  incomeType: IncomeTypeEnum;
+  showSuportPlatRecharge: boolean;
+  showSuportFiscalRecharge: boolean;
+};
+
+const form = defineModel<Form>('form');
+
+const emit = defineEmits<{
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+const incomeTypeEnum = computed(() => {
+  return [
+    form.value.showSuportFiscalRecharge && {
+      label: IncomeTypeEnumText[IncomeTypeEnum.Fiscal],
+      value: IncomeTypeEnum.Fiscal,
+    },
+    form.value.showSuportPlatRecharge && {
+      label: IncomeTypeEnumText[IncomeTypeEnum.Platform],
+      value: IncomeTypeEnum.Platform,
+    },
+  ].filter(Boolean);
+});
+
+const dialogForm = ref<FormInstance>();
+
+function onDialogClose() {
+  if (!dialogForm.value) return;
+  dialogForm.value.resetFields();
+}
+
+function handleConfirm() {
+  if (!dialogForm.value) return;
+  dialogForm.value.validate((valid) => {
+    if (valid) {
+      emit('onConfirm');
+    } else {
+      return;
+    }
+  });
+}
+</script>
diff --git a/src/views/Reward/components/UploadCertRewardDialog.vue b/src/views/Reward/components/UploadCertRewardDialog.vue
new file mode 100644
index 0000000..3829d81
--- /dev/null
+++ b/src/views/Reward/components/UploadCertRewardDialog.vue
@@ -0,0 +1,107 @@
+<template>
+  <ProDialog
+    title="涓婁紶鍑瘉"
+    v-model="visible"
+    @close="onDialogClose"
+    destroy-on-close
+    draggable
+    width="700px"
+  >
+    <ProForm :model="form" ref="dialogForm" label-width="120px">
+      <ProFormItemV2
+        label="鍏ヨ处绫诲瀷:"
+        prop="incomeType"
+        :check-rules="[{ message: '璇烽�夋嫨鍏ヨ处绫诲瀷' }]"
+      >
+        <ProFormRadio
+          v-model="form.incomeType"
+          :value-enum="incomeTypeEnum"
+          :button-style="false"
+        />
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="涓婁紶鍏ヨ处鍑瘉:"
+        prop="fileUrl"
+        :check-rules="[{ message: '璇蜂笂浼犲叆璐﹀嚟璇�', type: 'upload' }]"
+      >
+        <ProFormUpload
+          v-model:file-url="form.fileUrl"
+          :limitFileSize="50"
+          accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
+        ></ProFormUpload>
+      </ProFormItemV2>
+    </ProForm>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="emit('onCancel')">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import { FormInstance } from 'element-plus';
+import {
+  ProDialog,
+  ProForm,
+  ProFormItemV2,
+  UploadUserFile,
+  ProFormUpload,
+  ProFormRadio,
+} from '@bole-core/components';
+import { IncomeTypeEnumText, IncomeTypeEnum } from '@/constants';
+
+defineOptions({
+  name: 'UploadCertRewardDialog',
+});
+
+const visible = defineModel({ type: Boolean });
+
+type Form = {
+  title?: string;
+  fileUrl: UploadUserFile[];
+  parkBountyApplyId: string;
+  incomeType: IncomeTypeEnum;
+  showSuportPlatRecharge: boolean;
+  showSuportFiscalRecharge: boolean;
+};
+
+const form = defineModel<Form>('form');
+
+const emit = defineEmits<{
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+const incomeTypeEnum = computed(() => {
+  return [
+    form.value.showSuportFiscalRecharge && {
+      label: IncomeTypeEnumText[IncomeTypeEnum.Fiscal],
+      value: IncomeTypeEnum.Fiscal,
+    },
+    form.value.showSuportPlatRecharge && {
+      label: IncomeTypeEnumText[IncomeTypeEnum.Platform],
+      value: IncomeTypeEnum.Platform,
+    },
+  ].filter(Boolean);
+});
+
+const dialogForm = ref<FormInstance>();
+
+function onDialogClose() {
+  if (!dialogForm.value) return;
+  dialogForm.value.resetFields();
+}
+
+function handleConfirm() {
+  if (!dialogForm.value) return;
+  dialogForm.value.validate((valid) => {
+    if (valid) {
+      emit('onConfirm');
+    } else {
+      return;
+    }
+  });
+}
+</script>
diff --git a/src/views/Reward/components/WithdrawalApprovalAuditDialog.vue b/src/views/Reward/components/WithdrawalApprovalAuditDialog.vue
new file mode 100644
index 0000000..bdb9a5a
--- /dev/null
+++ b/src/views/Reward/components/WithdrawalApprovalAuditDialog.vue
@@ -0,0 +1,255 @@
+<template>
+  <ProDialog :title="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="form.isCheck"
+    >
+      <ProFormCol>
+        <ProFormColItem :span="12">
+          <ProFormItemV2
+            label="瀹℃牳:"
+            prop="checkStatus"
+            :check-rules="[{ message: '璇烽�夋嫨瀹℃牳鐘舵��' }]"
+          >
+            <ProFormRadio
+              v-model="form.checkStatus"
+              :value-enum="EnterpriseRechargeStatusEnumTextForAdudit"
+            />
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+      <ProFormCol v-if="form.isCheck">
+        <ProFormColItem :span="12">
+          <ProFormItemV2 label="瀹℃牳鏃ユ湡:" prop="creationTime">
+            <ProFormDatePicker v-model="form.creationTime" type="date" format="YYYY-MM-DD HH:mm" />
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+      <ProFormCol>
+        <ProFormColItem :span="12">
+          <ProFormItemV2
+            label="涓婁紶鍑瘉:"
+            prop="checkFileUrl"
+            :required="form.checkStatus === EnterpriseRechargeStatusEnum.CheckPassed"
+            :check-rules="[
+              {
+                message: '璇蜂笂浼犲嚟璇�',
+                validator: (rule, value, callback) => {
+                  if (
+                    value?.length === 0 &&
+                    form.checkStatus === EnterpriseRechargeStatusEnum.CheckPassed
+                  ) {
+                    callback(new Error('璇蜂笂浼犲嚟璇�'));
+                  }
+                  callback();
+                },
+              },
+            ]"
+          >
+            <ProFormUpload
+              v-model:file-url="form.checkFileUrl"
+              :limit="1"
+              :showTip="false"
+              :limitFileSize="50"
+            ></ProFormUpload>
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+
+      <ProFormCol>
+        <ProFormColItem>
+          <ProFormItemV2
+            label="瀹℃牳鐞嗙敱:"
+            prop="checkRemark"
+            :required="form.checkStatus === EnterpriseRechargeStatusEnum.CheckReject"
+            :check-rules="[
+              {
+                message: '璇疯緭鍏ュ鏍哥悊鐢�',
+                validator: (rule, value, callback) => {
+                  if (!value && form.checkStatus === EnterpriseRechargeStatusEnum.CheckReject) {
+                    callback(new Error('璇疯緭鍏ラ┏鍥炵悊鐢�'));
+                  }
+                  callback();
+                },
+              },
+            ]"
+          >
+            <ProFormTextArea
+              v-model="form.checkRemark"
+              placeholder="璇疯緭鍏�"
+              show-word-limit
+              :maxlength="150"
+            ></ProFormTextArea>
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+    </ProForm>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="emit('onCancel')">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import { FormInstance } from 'element-plus';
+import {
+  ProDialog,
+  ProForm,
+  ProFormItemV2,
+  ProFormTextArea,
+  ProFormCol,
+  ProFormColItem,
+  ProFormRadio,
+  ProFormUpload,
+  ProFormDatePicker,
+  UploadUserFile,
+} from '@bole-core/components';
+import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import { usePortraitTableWithAttachment } from '@/hooks';
+import { convertApi2FormUrl, convertApi2FormUrlOnlyOne } from '@/utils';
+import { useQuery } from '@tanstack/vue-query';
+import {
+  EnterpriseRechargeStatusEnum,
+  EnterpriseRechargeStatusEnumTextForAdudit,
+} from '@/constants';
+
+defineOptions({
+  name: 'WithdrawalApprovalAuditDialog',
+});
+
+// type Props = {};
+
+// const props = withDefaults(defineProps<Props>(), {});
+
+const visible = defineModel({ type: Boolean });
+
+type Form = {
+  title?: string;
+  drawWithId: string;
+  checkStatus: EnterpriseRechargeStatusEnum;
+  checkRemark: string;
+  creationTime?: string;
+  isCheck: boolean;
+  checkFileUrl: UploadUserFile[];
+};
+
+const form = defineModel<Form>('form');
+
+const title = computed(() => (form.value?.isCheck ? '璇︽儏' : '鎻愮幇瀹℃壒'));
+
+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?.drawWithId],
+  queryFn: async () => {
+    return await parkBountyApplyServices.getEnterpriseDrawWithDetail(
+      {
+        drawWithId: form.value?.drawWithId,
+      },
+      {
+        showLoading: true,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetEnterpriseDrawWithDetailOutput),
+  enabled: !!form.value?.drawWithId,
+  onSuccess(data) {
+    form.value.checkRemark = data.checkRemark ?? '';
+    form.value.creationTime = data.creationTime ?? '';
+    form.value.checkStatus = form.value?.isCheck
+      ? data.checkStatus
+      : ('' as any as EnterpriseRechargeStatusEnum);
+    form.value.checkFileUrl = convertApi2FormUrlOnlyOne(data.checkFileUrl);
+  },
+});
+
+const { portraitTableWithAttachmentProps } = usePortraitTableWithAttachment({
+  data: detail,
+  annexList: computed(() =>
+    detail.value?.invoiceUrl
+      ? detail.value?.invoiceUrl.split('|').map((item) => convertApi2FormUrl(item))
+      : []
+  ),
+  columns: [
+    {
+      label: '浼佷笟鍚嶇О',
+      key: 'enterpriseName',
+    },
+    {
+      label: '缁熶竴绀句細淇$敤浠g爜',
+      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();
+}
+
+function handleConfirm() {
+  if (!dialogForm.value) return;
+  if (form.value?.isCheck) {
+    emit('onCancel');
+    return;
+  }
+  dialogForm.value.validate((valid) => {
+    if (valid) {
+      emit('onConfirm');
+    } else {
+      return;
+    }
+  });
+}
+</script>

--
Gitblit v1.9.1