From e9dda9e6c52cb737267185f5118ded73c0053115 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期二, 06 五月 2025 17:13:41 +0800
Subject: [PATCH] feat: 接口

---
 src/constants/fourStreams.ts                                  |   73 +++
 src/views/EnterpriseInfo/components/RewardGrantRecordView.vue |    5 
 src/components/commonView/FourStreamsMaterialFileTableV2.vue  |  206 ++++++++++
 src/services/api/typings.d.ts                                 |   62 ++
 src/components/commonView/MateriaDetailDialog.vue             |    5 
 src/services/api/EnterpriseApplyFile.ts                       |   18 
 src/views/MaterialReview/MaterialReviewAudit.vue              |   61 ++
 src/components/commonView/MaterialInfoView.vue                |   64 +--
 src/components/commonView/DetailView.vue                      |   11 
 src/views/Reward/RewardGrant.vue                              |   20 
 src/constants/reward.ts                                       |    4 
 src/components/commonView/types.ts                            |   84 ---
 src/components/commonView/utils/index.ts                      |  131 ++++++
 src/components/commonView/FourStreamsMaterialFileTable.vue    |   89 ++-
 src/views/Reward/RewardDeclareDetail.vue                      |   71 +++
 src/constants/index.ts                                        |    1 
 src/services/api/ParkBountyApply.ts                           |   69 +++
 src/components/commonView/FourStreamsMaterialFileDialogV2.vue |   50 ++
 src/views/MaterialReview/MaterialReviewDetail.vue             |   69 +++
 19 files changed, 875 insertions(+), 218 deletions(-)

diff --git a/src/components/commonView/DetailView.vue b/src/components/commonView/DetailView.vue
index e0a4643..40ca771 100644
--- a/src/components/commonView/DetailView.vue
+++ b/src/components/commonView/DetailView.vue
@@ -1,6 +1,6 @@
 <template>
   <ProForm :model="form" label-width="160px" label-position="left" is-read>
-    <ChunkCellV2 title="鏉愭枡瀹℃牳" style="margin-bottom: 0">
+    <ChunkCellV2 title="鎵规淇℃伅" style="margin-bottom: 0">
       <BatchInfoView :form="form"></BatchInfoView>
     </ChunkCellV2>
     <ChunkCellV2 title="姹囨�绘潗鏂�" style="margin-bottom: 0">
@@ -19,6 +19,7 @@
 import BatchInfoView from './BatchInfoView.vue';
 import MaterialInfoView from './MaterialInfoView.vue';
 import SettlementMaterialInfoView from './SettlementMaterialInfoView.vue';
+import { CustomerApplyFileTypeListItem } from './utils';
 
 defineOptions({
   name: 'DetailView',
@@ -32,11 +33,13 @@
     parkTypeName: string;
     applyMonth: string;
     applySumAmount: number;
-    enterpriseTaxSubFileUrl: UploadUserFile[];
-    enterpriseOperateFileUrl: UploadUserFile[];
+    /** 濂栧姳閲戝垎閰嶈〃 */
     bountyAssignFileUlr: UploadUserFile[];
+    /** 濂栧姳閲戞眹鎬昏〃 */
     bountyCollectFileUrl: UploadUserFile[];
-    enterpriseRelateFileUrl: UploadUserFile[];
+    parkCollectFileList: CustomerApplyFileTypeListItem[];
+    /** 鏄惁鏀寔骞冲彴鍏呭�� */
+    suportPlatRecharge?: boolean;
   };
 };
 
diff --git a/src/components/commonView/FourStreamsMaterialFileDialogV2.vue b/src/components/commonView/FourStreamsMaterialFileDialogV2.vue
new file mode 100644
index 0000000..c4f28b0
--- /dev/null
+++ b/src/components/commonView/FourStreamsMaterialFileDialogV2.vue
@@ -0,0 +1,50 @@
+<template>
+  <ProDialog :title="title" v-model="visible" destroy-on-close draggable width="800px">
+    <FourStreamsMaterialFileTableV2 v-model:list="form.list" v-bind="props" />
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button type="primary" @click="handleConfirm">纭� 瀹�</el-button>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts" generic="T">
+import { ProDialog } from '@bole-core/components';
+import FourStreamsMaterialFileTableV2 from './FourStreamsMaterialFileTableV2.vue';
+import { FourStreamsMaterialFileTableProps, BaseMaterialFileTableItem } from './types';
+
+defineOptions({
+  name: 'FourStreamsMaterialFileDialogV2',
+});
+
+type Props = FourStreamsMaterialFileTableProps & {
+  title?: string;
+  BusinessTypeEnumText: { [key: number]: string };
+};
+
+const props = withDefaults(defineProps<Props>(), {
+  showUploadBtn: true,
+  showCheckBtn: true,
+  showDownloadBtn: true,
+  showDeleteBtn: true,
+  title: '鏉愭枡璇︽儏',
+});
+
+const visible = defineModel({ type: Boolean });
+
+type Form = {
+  list: BaseMaterialFileTableItem<T>[];
+};
+
+const form = defineModel<Form>('form');
+
+const emit = defineEmits<{
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+function handleConfirm() {
+  emit('onConfirm');
+}
+</script>
diff --git a/src/components/commonView/FourStreamsMaterialFileTable.vue b/src/components/commonView/FourStreamsMaterialFileTable.vue
index 2ed72e4..606f5de 100644
--- a/src/components/commonView/FourStreamsMaterialFileTable.vue
+++ b/src/components/commonView/FourStreamsMaterialFileTable.vue
@@ -8,14 +8,11 @@
       :operationColumnWidth="240"
       :showTableColumnSetting="false"
     >
-      <template #fileBusinessType="{ row }">
-        {{ BusinessTypeEnumText[row.fileBusinessType] }}
-      </template>
       <template #operationBtn-uploadBtn="{ data, row }">
         <BlFileUpload
-          v-model:file-url="row.fileList"
+          v-model:file-url="row.listFiles"
           multiple
-          :limit="1"
+          :limit="99"
           ref="uploadRef"
           :showTip="false"
           :show-file-list="false"
@@ -28,19 +25,17 @@
     <FourStreamsBatchMaterialFileDialog
       v-bind="dialogProps"
       :name="''"
-      :zipName="`${BusinessTypeEnumText[currentFourStreamsMaterialFileTableItem.fileBusinessType as any]}`"
-      v-model:fileList="currentFourStreamsMaterialFileTableItem.fileList"
+      :zipName="currentFourStreamsMaterialFileTableItem.fileTypeName"
+      v-model:fileList="currentFourStreamsMaterialFileTableItem.listFiles"
       :showDeleteBtn="showDeleteBtn"
+      :yearMonth="date"
+      :onDelete="(file) => handleDialogDelete(currentFourStreamsMaterialFileTableItem, file)"
     />
   </div>
 </template>
 
 <script setup lang="ts" generic="T">
-import {
-  FourStreamsMaterialFileTableProps,
-  BaseMaterialFileTableItem,
-  FourStreamsMaterialFileBusinessTypeEnumText,
-} from './types';
+import { FourStreamsMaterialFileTableProps } from './types';
 import {
   ProTableV2,
   defineColumns,
@@ -48,11 +43,13 @@
   BlFileUpload,
   bolePreview,
   useDialog,
+  UploadUserFile,
 } from '@bole-core/components';
 import { downloadFileByUrl } from '@/utils';
 import { Message, isFileCanPreview, downloadWithZip } from '@bole-core/core';
 import { useDefineColumns } from '@/hooks';
 import FourStreamsBatchMaterialFileDialog from './FourStreamsBatchMaterialFileDialog.vue';
+import { CustomerApplyFileTypeListItem } from './utils';
 
 defineOptions({
   name: 'FourStreamsMaterialFileTable',
@@ -64,15 +61,14 @@
   showDownloadBtn: true,
   showDeleteBtn: true,
   downloadBtnText: '涓嬭浇',
-  BusinessTypeEnumText: () => FourStreamsMaterialFileBusinessTypeEnumText,
 });
 
-const list = defineModel<BaseMaterialFileTableItem<T>[]>('list');
+const list = defineModel<CustomerApplyFileTypeListItem[]>('list');
 
 const columns = defineColumns([
   {
     id: '1',
-    enCode: 'fileBusinessType',
+    enCode: 'fileTypeName',
     name: '鏉愭枡鍚嶇О',
   },
 ]);
@@ -85,10 +81,11 @@
         name: '涓婁紶',
       },
       extraProps: {
-        hide: (row: BaseMaterialFileTableItem<T>) => {
-          if (!props.showUploadBtn) return true;
-          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
-          return fileList?.length > 0;
+        hide: (row: CustomerApplyFileTypeListItem) => {
+          return !props.showUploadBtn;
+          // if (!props.showUploadBtn) return true;
+          // let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
+          // return fileList?.length > 0;
         },
       },
     },
@@ -101,9 +98,9 @@
         onClick: (row) => handlePreview(row),
       },
       extraProps: {
-        hide: (row: BaseMaterialFileTableItem<T>) => {
+        hide: (row: CustomerApplyFileTypeListItem) => {
           if (!props.showCheckBtn) return true;
-          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
+          let fileList = row?.listFiles?.filter?.((item) => item.status === 'success');
           if (!fileList?.length) {
             return true;
           } else {
@@ -125,10 +122,10 @@
         onClick: (row) => handleBatchDownload(row),
       },
       extraProps: {
-        hide: (row: BaseMaterialFileTableItem<T>) => {
+        hide: (row: CustomerApplyFileTypeListItem) => {
           return (
             !props.showDownloadBtn ||
-            !row?.fileList?.filter?.((item) => item.status === 'success')?.length
+            !row?.listFiles?.filter?.((item) => item.status === 'success')?.length
           );
         },
       },
@@ -145,9 +142,9 @@
         onClick: (row) => handleDelete(row),
       },
       extraProps: {
-        hide: (row: BaseMaterialFileTableItem<T>) => {
+        hide: (row: CustomerApplyFileTypeListItem) => {
           if (!props.showDeleteBtn) return true;
-          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
+          let fileList = row?.listFiles?.filter?.((item) => item.status === 'success');
           return !fileList?.length;
         },
       },
@@ -155,33 +152,53 @@
   ],
 });
 
-async function handleDelete(row: BaseMaterialFileTableItem<T>) {
+async function handleDelete(row: CustomerApplyFileTypeListItem) {
   try {
-    await Message.deleteMessage();
-    row.fileList = [];
+    if (row.listFiles.length > 1) {
+      currentFourStreamsMaterialFileTableItem.value = row;
+      await nextTick();
+      dialogState.dialogVisible = true;
+    } else {
+      await Message.deleteMessage();
+      if (props.onDelete) {
+        await props.onDelete(row, row.listFiles[0].id);
+      }
+      row.listFiles = [];
+    }
   } catch (error) {}
 }
 
-const currentFourStreamsMaterialFileTableItem = ref<BaseMaterialFileTableItem<T>>({
-  fileBusinessType: 0 as any,
-  fileList: [],
+async function handleDialogDelete(
+  row: CustomerApplyFileTypeListItem,
+  listFile: API.CustomerUploadMonthApplyFileTypeDto & UploadUserFile
+) {
+  if (props.onDelete) {
+    await props.onDelete(row, listFile.id);
+  }
+}
+
+const currentFourStreamsMaterialFileTableItem = ref<CustomerApplyFileTypeListItem>({
+  fileSearchTypeId: '',
+  fileTypeName: '',
+  lastUpdateTime: '',
+  listFiles: [],
 });
 const { dialogProps, dialogState } = useDialog();
 
-async function handlePreview(row: BaseMaterialFileTableItem<T>) {
-  if (row.fileList.length > 1) {
+async function handlePreview(row: CustomerApplyFileTypeListItem) {
+  if (row.listFiles.length > 1) {
     currentFourStreamsMaterialFileTableItem.value = row;
     await nextTick();
     dialogState.dialogVisible = true;
   } else {
     bolePreview({
-      fileUrl: row.fileList[0].url,
+      fileUrl: row.listFiles[0].url,
     });
   }
 }
 
-async function handleBatchDownload(row: BaseMaterialFileTableItem<T>) {
-  const successFileList = row.fileList.filter((item) => item.status === 'success');
+async function handleBatchDownload(row: CustomerApplyFileTypeListItem) {
+  const successFileList = row.listFiles.filter((item) => item.status === 'success');
   if (successFileList.length === 0) {
     Message.errorMessage('娌℃湁鍙笅杞界殑鏂囦欢');
     return;
diff --git a/src/components/commonView/FourStreamsMaterialFileTableV2.vue b/src/components/commonView/FourStreamsMaterialFileTableV2.vue
new file mode 100644
index 0000000..eff3fc1
--- /dev/null
+++ b/src/components/commonView/FourStreamsMaterialFileTableV2.vue
@@ -0,0 +1,206 @@
+<template>
+  <div>
+    <ProTableV2
+      :tableData="list"
+      :columns="columns"
+      :autoHeight="false"
+      :operationBtns="columnsProps.operationBtns"
+      :operationColumnWidth="240"
+      :showTableColumnSetting="false"
+    >
+      <template #fileBusinessType="{ row }">
+        {{ BusinessTypeEnumText[row.fileBusinessType] }}
+      </template>
+      <template #operationBtn-uploadBtn="{ data, row }">
+        <BlFileUpload
+          v-model:file-url="row.fileList"
+          multiple
+          :limit="1"
+          ref="uploadRef"
+          :showTip="false"
+          :show-file-list="false"
+          class="pro-table-operation-btn upload-style-btn"
+        >
+          <el-button text type="primary" class="pro-table-operation-btn">涓婁紶</el-button>
+        </BlFileUpload>
+      </template>
+    </ProTableV2>
+    <FourStreamsBatchMaterialFileDialog
+      v-bind="dialogProps"
+      :name="''"
+      :zipName="`${BusinessTypeEnumText[currentFourStreamsMaterialFileTableItem.fileBusinessType as any]}`"
+      v-model:fileList="currentFourStreamsMaterialFileTableItem.fileList"
+      :showDeleteBtn="showDeleteBtn"
+    />
+  </div>
+</template>
+
+<script setup lang="ts" generic="T">
+import { FourStreamsMaterialFileTableProps, BaseMaterialFileTableItem } from './types';
+import {
+  ProTableV2,
+  defineColumns,
+  defineOperationBtns,
+  BlFileUpload,
+  bolePreview,
+  useDialog,
+} from '@bole-core/components';
+import { downloadFileByUrl } from '@/utils';
+import { Message, isFileCanPreview, downloadWithZip } from '@bole-core/core';
+import { useDefineColumns } from '@/hooks';
+import FourStreamsBatchMaterialFileDialog from './FourStreamsBatchMaterialFileDialog.vue';
+import { FourStreamsMaterialFileBusinessTypeEnumText } from '@/constants';
+
+defineOptions({
+  name: 'FourStreamsMaterialFileTableV2',
+});
+
+type Props = FourStreamsMaterialFileTableProps & {
+  BusinessTypeEnumText: { [key: number]: string };
+};
+
+const props = withDefaults(defineProps<Props>(), {
+  showUploadBtn: true,
+  showCheckBtn: true,
+  showDownloadBtn: true,
+  showDeleteBtn: true,
+  downloadBtnText: '涓嬭浇',
+  BusinessTypeEnumText: () => FourStreamsMaterialFileBusinessTypeEnumText,
+});
+
+const list = defineModel<BaseMaterialFileTableItem<T>[]>('list');
+
+const columns = defineColumns([
+  {
+    id: '1',
+    enCode: 'fileBusinessType',
+    name: '鏉愭枡鍚嶇О',
+  },
+]);
+
+const columnsProps = useDefineColumns({
+  operationBtns: [
+    {
+      data: {
+        enCode: 'uploadBtn',
+        name: '涓婁紶',
+      },
+      extraProps: {
+        hide: (row: BaseMaterialFileTableItem<T>) => {
+          if (!props.showUploadBtn) return true;
+          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
+          return fileList?.length > 0;
+        },
+      },
+    },
+    {
+      data: {
+        enCode: 'detailBtn',
+        name: '鏌ョ湅',
+      },
+      emits: {
+        onClick: (row) => handlePreview(row),
+      },
+      extraProps: {
+        hide: (row: BaseMaterialFileTableItem<T>) => {
+          if (!props.showCheckBtn) return true;
+          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
+          if (!fileList?.length) {
+            return true;
+          } else {
+            if (fileList.length > 1) {
+              return false;
+            } else {
+              return !isFileCanPreview(fileList[0].path);
+            }
+          }
+        },
+      },
+    },
+    {
+      data: {
+        enCode: 'downloadBtn',
+        name: props.downloadBtnText,
+      },
+      emits: {
+        onClick: (row) => handleBatchDownload(row),
+      },
+      extraProps: {
+        hide: (row: BaseMaterialFileTableItem<T>) => {
+          return (
+            !props.showDownloadBtn ||
+            !row?.fileList?.filter?.((item) => item.status === 'success')?.length
+          );
+        },
+      },
+    },
+    {
+      data: {
+        enCode: 'delBtn',
+        name: '鍒犻櫎',
+      },
+      props: {
+        type: 'danger',
+      },
+      emits: {
+        onClick: (row) => handleDelete(row),
+      },
+      extraProps: {
+        hide: (row: BaseMaterialFileTableItem<T>) => {
+          if (!props.showDeleteBtn) return true;
+          let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
+          return !fileList?.length;
+        },
+      },
+    },
+  ],
+});
+
+async function handleDelete(row: BaseMaterialFileTableItem<T>) {
+  try {
+    await Message.deleteMessage();
+    row.fileList = [];
+  } catch (error) {}
+}
+
+const currentFourStreamsMaterialFileTableItem = ref<BaseMaterialFileTableItem<T>>({
+  fileBusinessType: 0 as any,
+  fileList: [],
+});
+const { dialogProps, dialogState } = useDialog();
+
+async function handlePreview(row: BaseMaterialFileTableItem<T>) {
+  if (row.fileList.length > 1) {
+    currentFourStreamsMaterialFileTableItem.value = row;
+    await nextTick();
+    dialogState.dialogVisible = true;
+  } else {
+    bolePreview({
+      fileUrl: row.fileList[0].url,
+    });
+  }
+}
+
+async function handleBatchDownload(row: BaseMaterialFileTableItem<T>) {
+  const successFileList = row.fileList.filter((item) => item.status === 'success');
+  if (successFileList.length === 0) {
+    Message.errorMessage('娌℃湁鍙笅杞界殑鏂囦欢');
+    return;
+  }
+  if (successFileList.length === 1) {
+    downloadFileByUrl(successFileList[0].url);
+  } else {
+    // downloadWithZip(
+    //   successFileList.map((item) => ({ data: item.url })),
+    //   `${props.BusinessTypeEnumText[row.fileBusinessType as any]}`
+    // );
+    currentFourStreamsMaterialFileTableItem.value = row;
+    await nextTick();
+    dialogState.dialogVisible = true;
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/components/commonView/MateriaDetailDialog.vue b/src/components/commonView/MateriaDetailDialog.vue
index 1ab3ce2..dff1e54 100644
--- a/src/components/commonView/MateriaDetailDialog.vue
+++ b/src/components/commonView/MateriaDetailDialog.vue
@@ -12,7 +12,8 @@
 <script setup lang="ts">
 import { ProDialog } from '@bole-core/components';
 import FourStreamsMaterialFileTable from './FourStreamsMaterialFileTable.vue';
-import { FourStreamsMaterialFileTableProps, FourStreamsMaterialFileTableItem } from './types';
+import { FourStreamsMaterialFileTableProps } from './types';
+import { CustomerApplyFileTypeListItem } from './utils';
 
 defineOptions({
   name: 'MateriaDetailDialog',
@@ -30,7 +31,7 @@
 const visible = defineModel({ type: Boolean });
 
 type Form = {
-  list: FourStreamsMaterialFileTableItem[];
+  list: CustomerApplyFileTypeListItem[];
 };
 
 const form = defineModel<Form>('form');
diff --git a/src/components/commonView/MaterialInfoView.vue b/src/components/commonView/MaterialInfoView.vue
index 4026f93..5308a1b 100644
--- a/src/components/commonView/MaterialInfoView.vue
+++ b/src/components/commonView/MaterialInfoView.vue
@@ -1,42 +1,25 @@
 <template>
-  <ProFormCol>
-    <ProFormColItem :span="12">
-      <ProFormItemV2
-        label="浼佷笟缂寸◣鏄庣粏姹囨�昏〃:"
-        prop="enterpriseTaxSubFileUrl"
-        style="margin-bottom: 22px"
-      >
-        <ProFormUpload
-          v-model:file-url="form.enterpriseTaxSubFileUrl"
-          :limitShowViewMoreBtnCount="4"
-        ></ProFormUpload>
-      </ProFormItemV2>
-    </ProFormColItem>
-  </ProFormCol>
-  <ProFormCol>
-    <ProFormColItem :span="12">
-      <ProFormItemV2
-        label="浼佷笟钀ユ敹姹囨�昏〃:"
-        prop="enterpriseOperateFileUrl"
-        style="margin-bottom: 22px"
-      >
-        <ProFormUpload
-          v-model:file-url="form.enterpriseOperateFileUrl"
-          :limitShowViewMoreBtnCount="4"
-        ></ProFormUpload>
-      </ProFormItemV2>
-    </ProFormColItem>
-  </ProFormCol>
-  <ProFormCol>
-    <ProFormColItem :span="12">
-      <ProFormItemV2 label="鍏ラ┗鎯呭喌鍏宠仈璇存槑:" prop="enterpriseRelateFileUrl">
-        <ProFormUpload
-          v-model:file-url="form.enterpriseRelateFileUrl"
-          :limitShowViewMoreBtnCount="4"
-        ></ProFormUpload>
-      </ProFormItemV2>
-    </ProFormColItem>
-  </ProFormCol>
+  <!-- <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"
+    :key="item.fileSearchTypeId"
+  >
+    <ProFormUpload
+      v-model:file-url="item.listFiles"
+      :limitFileSize="50"
+      :showTip="false"
+      :limitShowViewMoreBtnCount="4"
+      accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
+    ></ProFormUpload>
+  </ProFormItemV2>
+  <!-- </ProFormColItem>
+  </ProFormCol> -->
 </template>
 
 <script setup lang="ts">
@@ -47,6 +30,7 @@
   ProFormUpload,
   UploadUserFile,
 } from '@bole-core/components';
+import { CustomerApplyFileTypeListItem } from './utils';
 
 defineOptions({
   name: 'MaterialInfoView',
@@ -54,9 +38,7 @@
 
 type Props = {
   form: {
-    enterpriseTaxSubFileUrl: UploadUserFile[];
-    enterpriseOperateFileUrl: UploadUserFile[];
-    enterpriseRelateFileUrl: UploadUserFile[];
+    parkCollectFileList: CustomerApplyFileTypeListItem[];
   };
 };
 
diff --git a/src/components/commonView/types.ts b/src/components/commonView/types.ts
index f1415f0..89fd9f9 100644
--- a/src/components/commonView/types.ts
+++ b/src/components/commonView/types.ts
@@ -1,12 +1,20 @@
 import { UploadUserFile } from '@bole-core/components';
+import { CustomerApplyFileTypeListItem } from './utils';
+import {
+  ApplyTransferFileBusinessTypeEnum,
+  FourStreamsMaterialFileBusinessTypeEnum,
+  TransferFileEnumInRewardGrand,
+} from '@/constants';
 
 export type FourStreamsMaterialFileTableProps = {
+  date?: string;
   showUploadBtn?: boolean;
   showCheckBtn?: boolean;
   showDownloadBtn?: boolean;
   showDeleteBtn?: boolean;
   downloadBtnText?: string;
-  BusinessTypeEnumText?: { [key: number]: string };
+  onDelete?: (row: CustomerApplyFileTypeListItem, fileId: string) => Promise<any>;
+  onUpload?: (row: CustomerApplyFileTypeListItem, userFile: UploadUserFile) => Promise<any>;
 };
 
 export type BaseMaterialFileTableItem<T> = {
@@ -48,77 +56,3 @@
   [EnterpriseTypeEnum.IndustryMating]: '琛屼笟閰嶅',
   [EnterpriseTypeEnum.IndustryBody]: '琛屼笟鏈烘瀯',
 };
-
-export enum FourStreamsMaterialFileBusinessTypeEnum {
-  /** 鍥尯鍏ラ┗鍗忚 */
-  ParkEnterPactUrl = 10,
-  /** 浼佷笟瀹岀◣璇佹槑锛堢洊绔狅級 */
-  RatePaymentFileUrl = 20,
-  /** 浼佷笟缂寸◣鏄庣粏姹囨�昏〃锛堢洊绔狅級 */
-  TaxSubFileUrl = 30,
-  /** 浼佷笟钀ユ敹鍒╂鼎琛� */
-  OperateProfitesUrl = 40,
-  /**
-   * 鍏ラ┗鍏宠仈璇存槑
-   * @deprecated 宸茬粡涓嶇敤浜�
-   */
-  EnterRelateUrl = 50,
-  /** C绔釜绋庡畬绋庤瘉鏄� */
-  PersonTaxRatePayUrl = 60,
-  /** C绔畬绋庤鏄� */
-  PersonTaxInstructUrl = 70,
-}
-
-export const FourStreamsMaterialFileBusinessTypeEnumText = {
-  [FourStreamsMaterialFileBusinessTypeEnum.ParkEnterPactUrl]: '鍥尯鍏ラ┗鍗忚',
-  [FourStreamsMaterialFileBusinessTypeEnum.RatePaymentFileUrl]: '浼佷笟瀹岀◣璇佹槑(鐩栫珷)',
-  [FourStreamsMaterialFileBusinessTypeEnum.TaxSubFileUrl]: '浼佷笟缂寸◣鏄庣粏姹囨�昏〃(鐩栫珷)',
-  [FourStreamsMaterialFileBusinessTypeEnum.OperateProfitesUrl]: '浼佷笟钀ユ敹鍒╂鼎琛�',
-  [FourStreamsMaterialFileBusinessTypeEnum.EnterRelateUrl]: '鍏ラ┗鍏宠仈璇存槑',
-  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxRatePayUrl]: 'C绔釜绋庡畬绋庤瘉鏄�',
-  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxInstructUrl]: 'C绔畬绋庢儏鍐佃鏄�',
-};
-
-export const FourStreamsMaterialFileBusinessTypeEnumKey = {
-  [FourStreamsMaterialFileBusinessTypeEnum.ParkEnterPactUrl]: 'parkEnterPactUrl',
-  [FourStreamsMaterialFileBusinessTypeEnum.RatePaymentFileUrl]: 'ratePaymentFileUrl',
-  [FourStreamsMaterialFileBusinessTypeEnum.TaxSubFileUrl]: 'taxSubFileUrl',
-  [FourStreamsMaterialFileBusinessTypeEnum.OperateProfitesUrl]: 'operateProfitesUrl',
-  [FourStreamsMaterialFileBusinessTypeEnum.EnterRelateUrl]: 'enterRelateUrl',
-  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxRatePayUrl]: 'personTaxRatePayUrl',
-  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxInstructUrl]: 'personTaxInstructUrl',
-} as const;
-
-export enum ApplyTransferFileBusinessTypeEnum {
-  /** 鎷ㄤ粯鍑瘉*/
-  FinanceToFileUrl = 100,
-  /** 鍏呭�煎嚟璇�*/
-  TransferToFileUrl = 110,
-}
-
-export const ApplyTransferFileBusinessTypeEnumText = {
-  [ApplyTransferFileBusinessTypeEnum.FinanceToFileUrl]: '鎷ㄤ粯鍑瘉',
-  [ApplyTransferFileBusinessTypeEnum.TransferToFileUrl]: '鍏呭�煎嚟璇�',
-};
-
-export const ApplyTransferFileBusinessTypeEnumKey = {
-  [ApplyTransferFileBusinessTypeEnum.FinanceToFileUrl]: 'financeToFileUrl',
-  [ApplyTransferFileBusinessTypeEnum.TransferToFileUrl]: 'transferToFileUrl',
-} as const;
-
-export enum TransferFileEnumInRewardGrand {
-  /** 鎷ㄤ粯鍑瘉*/
-  FinanceFileUrl = 200,
-  /** 鍏呭�煎嚟璇�*/
-  SettleFileUrl = 210,
-}
-
-export const TransferFileEnumInRewardGrandText = {
-  [TransferFileEnumInRewardGrand.FinanceFileUrl]: '鎷ㄤ粯鍑瘉',
-  [TransferFileEnumInRewardGrand.SettleFileUrl]: '鍏呭�煎嚟璇�',
-};
-
-export const TransferFileEnumInRewardGrandKey = {
-  [TransferFileEnumInRewardGrand.FinanceFileUrl]: 'financeFileUrl',
-  [TransferFileEnumInRewardGrand.SettleFileUrl]: 'settleFileUrl',
-} as const;
diff --git a/src/components/commonView/utils/index.ts b/src/components/commonView/utils/index.ts
index 8918223..9550a10 100644
--- a/src/components/commonView/utils/index.ts
+++ b/src/components/commonView/utils/index.ts
@@ -1,15 +1,19 @@
 import { convertApi2FormUrl, convertApi2FormUrlOnlyOne } from '@/utils';
 import {
-  ApplyTransferFileBusinessTypeEnum,
-  ApplyTransferFileBusinessTypeEnumKey,
   ApplyTransferMaterialFileTableItem,
-  FourStreamsMaterialFileBusinessTypeEnum,
-  FourStreamsMaterialFileBusinessTypeEnumKey,
   FourStreamsMaterialFileTableItem,
-  TransferFileEnumInRewardGrand,
-  TransferFileEnumInRewardGrandKey,
   TransferFileEnumInRewardGrandTableItem,
 } from '../types';
+import { UploadUserFile } from '@bole-core/components';
+import _ from 'lodash';
+import {
+  ApplyTransferFileBusinessTypeEnum,
+  ApplyTransferFileBusinessTypeEnumKey,
+  FourStreamsMaterialFileBusinessTypeEnum,
+  FourStreamsMaterialFileBusinessTypeEnumKey,
+  TransferFileEnumInRewardGrand,
+  TransferFileEnumInRewardGrandKey,
+} from '@/constants';
 
 export class FourStreamsMaterialUtils {
   /**瀹炰綋浜т笟鍥潗鏂� */
@@ -112,3 +116,118 @@
     return parkTypeName === '鏁板瓧缁忔祹鍥�';
   }
 }
+
+export type CustomerApplyFileTypeListItem = {
+  id?: string;
+  fileSearchTypeId?: string;
+  fileTypeName?: string;
+  lastUpdateTime?: string;
+  listFiles?: (API.CustomerUploadMonthApplyFileTypeDto & UploadUserFile)[];
+};
+
+export class EnterpriseApplyFileUtils {
+  static convertApiFileToParkCollectFileList(listFiles: API.CustomerUploadMonthApplyFileTypeDto[]) {
+    const group = _.groupBy(listFiles, 'fileSearchTypeId');
+    return Object.keys(group).map(
+      (x) =>
+        ({
+          fileSearchTypeId: x,
+          fileTypeName: group[x][0].fileSearchTypeName,
+          listFiles: group[x]
+            .filter((x) => !!x.fileUrl)
+            .map((a) => ({
+              ...a,
+              ...convertApi2FormUrl(a.fileUrl),
+            })),
+        } as CustomerApplyFileTypeListItem)
+    );
+  }
+
+  static initParkCollectFileList(parkCollectFileTypeList: API.GetCustomerUploadApplyFilesOutput[]) {
+    return parkCollectFileTypeList.map(
+      (x) =>
+        ({
+          fileSearchTypeId: x.fileSearchTypeId,
+          fileTypeName: x.fileTypeName,
+          listFiles: [],
+        } as CustomerApplyFileTypeListItem)
+    );
+  }
+
+  static initParkCollectFileListApplyFiles(
+    applyUploadFiles: API.GetEnterpriseParkApplyUploadFileOutput[],
+    applyFiles: API.GetCustomerUploadApplyFilesOutput[],
+    lastUploadEnterPactFile: API.CustomerUploadMonthApplyFileTypeDto[]
+  ) {
+    return applyUploadFiles.map((x) => {
+      const applyFile = applyFiles.find((a) => a.fileSearchTypeId === x.fileSearchTypeId);
+      let listFiles: API.CustomerUploadMonthApplyFileTypeDto[];
+      if (x.fileSearchTypeName === '鍥尯鍏ラ┗鍗忚') {
+        listFiles = !x.listFiles.length ? lastUploadEnterPactFile : x.listFiles;
+      } else {
+        listFiles =
+          !x.listFiles.length && applyFile?.listFiles?.length > 0
+            ? applyFile.listFiles
+            : x.listFiles;
+      }
+
+      return {
+        fileSearchTypeId: x.fileSearchTypeId,
+        fileTypeName: x.fileSearchTypeName,
+        listFiles: listFiles.map((a) => ({ ...a, ...convertApi2FormUrl(a.fileUrl) })),
+      } as CustomerApplyFileTypeListItem;
+    });
+  }
+
+  static convertFileTableListToApi(fileTableList: CustomerApplyFileTypeListItem[]) {
+    return fileTableList.map(
+      (x) =>
+        ({
+          fileSearchTypeId: x.fileSearchTypeId,
+          listFiles: x.listFiles.map((a) => ({
+            fileSearchTypeId: x.fileSearchTypeId,
+            fileSearchTypeName: x.fileTypeName,
+            fileSize: a.fileSize || a.size,
+            fileUrl: a.path,
+          })),
+        } as API.CustomerUploadMonthApplyFileType)
+    );
+  }
+
+  static convertFileTableListToApplyCompanyFile(fileTableList: CustomerApplyFileTypeListItem[]) {
+    return fileTableList.map(
+      (x) =>
+        ({
+          fileSearchTypeId: x.fileSearchTypeId,
+          fileSearchTypeName: x.fileTypeName,
+          listFiles: x.listFiles.map((a) => ({
+            fileSearchTypeId: x.fileSearchTypeId,
+            fileSearchTypeName: x.fileTypeName,
+            fileSize: a.fileSize || a.size,
+            fileUrl: a.path,
+          })),
+        } as API.UploadParkApplyCustomerFileTypes)
+    );
+  }
+
+  static convertFileTableListToApiBatch(fileTableList: CustomerApplyFileTypeListItem[]) {
+    const applyFileTypeList = this.convertFileTableListToApi(fileTableList);
+    return _.flatMap(applyFileTypeList, (x) => x.listFiles);
+  }
+
+  static isFileTableListAllUploaded(fileTableList: CustomerApplyFileTypeListItem[]) {
+    return fileTableList.every((fileTableListItem) => {
+      return fileTableListItem.listFiles.every((fileItem) => {
+        return fileItem.status === 'success';
+      });
+    });
+  }
+
+  static isFileTableListExist(fileTableList: CustomerApplyFileTypeListItem[]) {
+    return fileTableList.some((fileTableListItem) => {
+      return fileTableListItem.listFiles.some((fileItem) => {
+        return fileItem.status === 'success';
+      });
+    });
+  }
+}
diff --git a/src/constants/fourStreams.ts b/src/constants/fourStreams.ts
new file mode 100644
index 0000000..e59f920
--- /dev/null
+++ b/src/constants/fourStreams.ts
@@ -0,0 +1,73 @@
+export enum FourStreamsMaterialFileBusinessTypeEnum {
+  /** 鍥尯鍏ラ┗鍗忚 */
+  ParkEnterPactUrl = 10,
+  /** 浼佷笟瀹岀◣璇佹槑锛堢洊绔狅級 */
+  RatePaymentFileUrl = 20,
+  /** 浼佷笟缂寸◣鏄庣粏姹囨�昏〃锛堢洊绔狅級 */
+  TaxSubFileUrl = 30,
+  /** 浼佷笟钀ユ敹鍒╂鼎琛� */
+  OperateProfitesUrl = 40,
+  /**
+   * 鍏ラ┗鍏宠仈璇存槑
+   * @deprecated 宸茬粡涓嶇敤浜�
+   */
+  EnterRelateUrl = 50,
+  /** C绔釜绋庡畬绋庤瘉鏄� */
+  PersonTaxRatePayUrl = 60,
+  /** C绔畬绋庤鏄� */
+  PersonTaxInstructUrl = 70,
+}
+
+export const FourStreamsMaterialFileBusinessTypeEnumText = {
+  [FourStreamsMaterialFileBusinessTypeEnum.ParkEnterPactUrl]: '鍥尯鍏ラ┗鍗忚',
+  [FourStreamsMaterialFileBusinessTypeEnum.RatePaymentFileUrl]: '浼佷笟瀹岀◣璇佹槑(鐩栫珷)',
+  [FourStreamsMaterialFileBusinessTypeEnum.TaxSubFileUrl]: '浼佷笟缂寸◣鏄庣粏姹囨�昏〃(鐩栫珷)',
+  [FourStreamsMaterialFileBusinessTypeEnum.OperateProfitesUrl]: '浼佷笟钀ユ敹鍒╂鼎琛�',
+  [FourStreamsMaterialFileBusinessTypeEnum.EnterRelateUrl]: '鍏ラ┗鍏宠仈璇存槑',
+  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxRatePayUrl]: 'C绔釜绋庡畬绋庤瘉鏄�',
+  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxInstructUrl]: 'C绔畬绋庢儏鍐佃鏄�',
+};
+
+export const FourStreamsMaterialFileBusinessTypeEnumKey = {
+  [FourStreamsMaterialFileBusinessTypeEnum.ParkEnterPactUrl]: 'parkEnterPactUrl',
+  [FourStreamsMaterialFileBusinessTypeEnum.RatePaymentFileUrl]: 'ratePaymentFileUrl',
+  [FourStreamsMaterialFileBusinessTypeEnum.TaxSubFileUrl]: 'taxSubFileUrl',
+  [FourStreamsMaterialFileBusinessTypeEnum.OperateProfitesUrl]: 'operateProfitesUrl',
+  [FourStreamsMaterialFileBusinessTypeEnum.EnterRelateUrl]: 'enterRelateUrl',
+  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxRatePayUrl]: 'personTaxRatePayUrl',
+  [FourStreamsMaterialFileBusinessTypeEnum.PersonTaxInstructUrl]: 'personTaxInstructUrl',
+} as const;
+
+export enum ApplyTransferFileBusinessTypeEnum {
+  /** 鎷ㄤ粯鍑瘉*/
+  FinanceToFileUrl = 100,
+  /** 鍏呭�煎嚟璇�*/
+  TransferToFileUrl = 110,
+}
+
+export const ApplyTransferFileBusinessTypeEnumText = {
+  [ApplyTransferFileBusinessTypeEnum.FinanceToFileUrl]: '鎷ㄤ粯鍑瘉',
+  [ApplyTransferFileBusinessTypeEnum.TransferToFileUrl]: '鍏呭�煎嚟璇�',
+};
+
+export const ApplyTransferFileBusinessTypeEnumKey = {
+  [ApplyTransferFileBusinessTypeEnum.FinanceToFileUrl]: 'financeToFileUrl',
+  [ApplyTransferFileBusinessTypeEnum.TransferToFileUrl]: 'transferToFileUrl',
+} as const;
+
+export enum TransferFileEnumInRewardGrand {
+  /** 鎷ㄤ粯鍑瘉*/
+  FinanceFileUrl = 200,
+  /** 鍏呭�煎嚟璇�*/
+  SettleFileUrl = 210,
+}
+
+export const TransferFileEnumInRewardGrandText = {
+  [TransferFileEnumInRewardGrand.FinanceFileUrl]: '鎷ㄤ粯鍑瘉',
+  [TransferFileEnumInRewardGrand.SettleFileUrl]: '鍏呭�煎嚟璇�',
+};
+
+export const TransferFileEnumInRewardGrandKey = {
+  [TransferFileEnumInRewardGrand.FinanceFileUrl]: 'financeFileUrl',
+  [TransferFileEnumInRewardGrand.SettleFileUrl]: 'settleFileUrl',
+} as const;
diff --git a/src/constants/index.ts b/src/constants/index.ts
index eb92ec8..195d367 100644
--- a/src/constants/index.ts
+++ b/src/constants/index.ts
@@ -12,3 +12,4 @@
 export * from './dic';
 export * from './enterpriseMaterial';
 export * from './reward';
+export * from './fourStreams';
diff --git a/src/constants/reward.ts b/src/constants/reward.ts
index 46016f6..966f1e5 100644
--- a/src/constants/reward.ts
+++ b/src/constants/reward.ts
@@ -48,13 +48,13 @@
   /**
    * 鏃犻渶鍏呭��
    */
-  NotSettle = 3,
+  NoNeed = -1,
 }
 
 export const SettleStatusEnumText = {
   [SettleStatusEnum.WaitForSettle]: '寰呭厖鍊�',
   [SettleStatusEnum.HasSettle]: '宸插厖鍊�',
-  [SettleStatusEnum.NotSettle]: '鏃犻渶鍏呭��',
+  [SettleStatusEnum.NoNeed]: '鏃犻渶鍏呭��',
 };
 
 export enum FinanceStatusEnum {
diff --git a/src/services/api/EnterpriseApplyFile.ts b/src/services/api/EnterpriseApplyFile.ts
index bc7de20..3013b93 100644
--- a/src/services/api/EnterpriseApplyFile.ts
+++ b/src/services/api/EnterpriseApplyFile.ts
@@ -122,6 +122,24 @@
   );
 }
 
+/** 鑾峰彇鍥尯姹囨�绘潗鏂欑被鍨� POST /api/EnterpriseApplyFile/GetParkCollectFileTypeList */
+export async function getParkCollectFileTypeList(
+  body: API.GetParkCollectFileTypeListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetCustomerUploadApplyFilesOutput[]>(
+    '/api/EnterpriseApplyFile/GetParkCollectFileTypeList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
 /** 涓婁紶鏉愭枡璇︽儏-缂栬緫-涓婁紶鏂囦欢 POST /api/EnterpriseApplyFile/UploadMonthApplySingleFiles */
 export async function uploadMonthApplySingleFiles(
   body: API.UploadMonthApplySingleFilesInput,
diff --git a/src/services/api/ParkBountyApply.ts b/src/services/api/ParkBountyApply.ts
index 58e1366..fbe0aa0 100644
--- a/src/services/api/ParkBountyApply.ts
+++ b/src/services/api/ParkBountyApply.ts
@@ -47,6 +47,21 @@
   });
 }
 
+/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 GET /api/ParkBountyApply/DeleteParkEnterpriseApplyFile */
+export async function deleteParkEnterpriseApplyFile(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIdeleteParkEnterpriseApplyFileParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/ParkBountyApply/DeleteParkEnterpriseApplyFile', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
 /** 缁х画鐢虫姤 POST /api/ParkBountyApply/EditParkBountyApply */
 export async function editParkBountyApply(
   body: API.EditParkBountyApplyStepOneInput,
@@ -108,6 +123,42 @@
     },
     ...(options || {}),
   });
+}
+
+/** 鑾峰彇浼佷笟鏈�鍚庝竴娆′笂浼犵殑鍥尯鍏ラ┗鍗忚鏂囦欢 GET /api/ParkBountyApply/GetEnterpriseLastUploadEnterPactFileNew */
+export async function getEnterpriseLastUploadEnterPactFileNew(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetEnterpriseLastUploadEnterPactFileNewParams,
+  options?: API.RequestConfig
+) {
+  return request<API.CustomerUploadMonthApplyFileTypeDto[]>(
+    '/api/ParkBountyApply/GetEnterpriseLastUploadEnterPactFileNew',
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇鐢虫姤涓嬩紒涓氫笂浼犵殑鏂囦欢 POST /api/ParkBountyApply/GetEnterpriseParkApplyUploadFiles */
+export async function getEnterpriseParkApplyUploadFiles(
+  body: API.GetEnterpriseParkApplyUploadFilesInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetEnterpriseParkApplyUploadFileOutput[]>(
+    '/api/ParkBountyApply/GetEnterpriseParkApplyUploadFiles',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
 }
 
 /** 鑾峰彇浼佷笟鍏呭�煎鏍稿垪琛� POST /api/ParkBountyApply/GetEnterprisePreChargeCheckList */
@@ -721,6 +772,24 @@
   );
 }
 
+/** 涓婁紶浼佷笟鏉愭枡 POST /api/ParkBountyApply/UploadParkBountyApplyCompanyFileNew */
+export async function uploadParkBountyApplyCompanyFileNew(
+  body: API.UploadParkApplyCustomerFilesInput,
+  options?: API.RequestConfig
+) {
+  return request<API.UploadParkBountyApplyCompanyFileOutput>(
+    '/api/ParkBountyApply/UploadParkBountyApplyCompanyFileNew',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
 /** 鐢ㄦ埛鍏呭�� POST /api/ParkBountyApply/UserEnterpiseRecharge */
 export async function userEnterpiseRecharge(
   body: API.UserEnterpiseRechargeInput,
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index 7df99f2..b759d38 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -1115,6 +1115,10 @@
     id?: string;
   }
 
+  interface APIdeleteParkEnterpriseApplyFileParams {
+    parkEnterpriseDetaiFileId?: string;
+  }
+
   interface APIdeleteParkRewardApplyParams {
     id?: string;
   }
@@ -1348,6 +1352,10 @@
 
   interface APIgetElecBillInfoParams {
     transactionDetailId?: string;
+  }
+
+  interface APIgetEnterpriseLastUploadEnterPactFileNewParams {
+    companyId?: string;
   }
 
   interface APIgetEnterpriseLastUploadEnterPactFileParams {
@@ -5423,9 +5431,12 @@
   interface CustomerUploadMonthApplyFileTypeDto {
     fileSearchTypeId?: string;
     id?: string;
+    fileSearchTypeName?: string;
     fileType?: string;
     fileSize?: number;
     fileUrl?: string;
+    sort?: number;
+    creationTime?: string;
   }
 
   interface DataprepareCreateExtInfo {
@@ -6759,6 +6770,7 @@
     lastUpdateTime?: string;
     monthApplyId?: string;
     withMonth?: string;
+    searchType?: number;
     enterpriseName?: string;
     parkName?: string;
     fileTypeName?: string;
@@ -6824,6 +6836,19 @@
     pageModel?: Pagination;
     objectData?: any;
     data?: GetEnterpriseMonthApplyFileOutput[];
+  }
+
+  interface GetEnterpriseParkApplyUploadFileOutput {
+    fileSearchTypeId?: string;
+    fileSearchTypeName?: string;
+    fileCount?: number;
+    sort?: number;
+    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
+  }
+
+  interface GetEnterpriseParkApplyUploadFilesInput {
+    parkBountyApplyId?: string;
+    companyId?: string;
   }
 
   interface GetEnterprisePreChargeCheckListInput {
@@ -8157,6 +8182,9 @@
     settleTime?: string;
     incomeStatus?: IncomeStatusEnum;
     inCheckStatus?: BountyCheckStatusEnum;
+    /** 璐㈡斂鍏ヨ处鏃堕棿 */
+    financeIncomeTime?: string;
+    financeIncomeStatus?: IncomeStatusEnum;
     /** 鍐呴儴瀹℃牳鏃ユ湡 */
     inCheckTime?: string;
     outCheckStatus?: BountyCheckStatusEnum;
@@ -8275,6 +8303,11 @@
     pageModel?: Pagination;
     objectData?: any;
     data?: GetParkBountyTradeOutput[];
+  }
+
+  interface GetParkCollectFileTypeListInput {
+    parkId?: string;
+    searchType?: number;
   }
 
   interface GetParkCustomerBountyApplyOutput {
@@ -14565,6 +14598,11 @@
     settleFileUrl?: string;
     /** 璐㈡斂鍙戞斁鍑瘉 */
     financeFileUrl?: string;
+    /** 鏄惁鏀寔浼佷笟涓婁紶 */
+    suportEnterpriseUpload?: boolean;
+    /** 鏄惁鏀寔骞冲彴鍏呭�� */
+    suportPlatRecharge?: boolean;
+    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
   interface OutcheckParkBountyApplyInput {
@@ -14636,6 +14674,7 @@
     settleSumAmount?: number;
     /** 璐㈡斂鍙戞斁閲戦 */
     financeSumAmount?: number;
+    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
   interface ParkBountyApplyBatchFinanceInput {
@@ -18072,12 +18111,7 @@
 
   interface SaveParkBountyApplyGatherFileInput {
     parkBountyApplyId?: string;
-    /** 浼佷笟钀ユ敹姹囨�昏〃 */
-    enterpriseOperateFileUrl?: string;
-    /** 浼佷笟缂寸◣鏄庣粏琛� */
-    enterpriseTaxSubFileUrl?: string;
-    /** 鍏ラ┗鍏宠仈璇存槑 */
-    enterpriseRelateFileUrl?: string;
+    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
   interface SaveWalletPayChannelFeeSettingInput {
@@ -18470,7 +18504,7 @@
     type?: number;
   }
 
-  type SettleStatusEnum = 1 | 2;
+  type SettleStatusEnum = 1 | 2 | -1;
 
   interface SetUserCertificationAuditStatusInput {
     /** 瀹℃牳Id */
@@ -20306,6 +20340,20 @@
     listFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
+  interface UploadParkApplyCustomerFilesInput {
+    parkBountyApplyId?: string;
+    companyId?: string;
+    fileTypes?: UploadParkApplyCustomerFileTypes[];
+  }
+
+  interface UploadParkApplyCustomerFileTypes {
+    fileSearchTypeId?: string;
+    fileSearchTypeName?: string;
+    fileCount?: number;
+    sort?: number;
+    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
+  }
+
   interface UploadParkBountyApplyCompanyFileInput {
     parkBountyApplyId?: string;
     companyId?: string;
diff --git a/src/views/EnterpriseInfo/components/RewardGrantRecordView.vue b/src/views/EnterpriseInfo/components/RewardGrantRecordView.vue
index 2f94db3..a7013dc 100644
--- a/src/views/EnterpriseInfo/components/RewardGrantRecordView.vue
+++ b/src/views/EnterpriseInfo/components/RewardGrantRecordView.vue
@@ -3,7 +3,7 @@
     <AppContainer>
       <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
       </ProTableV2>
-      <FourStreamsMaterialFileDialog
+      <FourStreamsMaterialFileDialogV2
         v-bind="dialogMaterialFileProps"
         :show-upload-btn="false"
         :show-delete-btn="false"
@@ -26,8 +26,7 @@
 } from '@bole-core/components';
 import { OrderInputType } from '@bole-core/core';
 import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
-import { IncomeStatusEnumText } from '@/constants';
-import { ApplyTransferFileBusinessTypeEnumText } from '@/components/commonView/types';
+import { ApplyTransferFileBusinessTypeEnumText } from '@/constants';
 import { FourStreamsMaterialUtils } from '@/components/commonView/utils';
 import { ApplyTransferMaterialFileTableItem } from '@/components/commonView/types';
 
diff --git a/src/views/MaterialReview/MaterialReviewAudit.vue b/src/views/MaterialReview/MaterialReviewAudit.vue
index ba8a828..e5b1d4b 100644
--- a/src/views/MaterialReview/MaterialReviewAudit.vue
+++ b/src/views/MaterialReview/MaterialReviewAudit.vue
@@ -89,13 +89,18 @@
 import MateriaDetailDialog from '@/components/commonView/MateriaDetailDialog.vue';
 import { useQuery, useQueryClient } from '@tanstack/vue-query';
 import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import * as enterpriseApplyFileServices from '@/services/api/EnterpriseApplyFile';
 import { convertApi2FormUrlObjectBySeparator, setOSSLink } from '@/utils';
 import { useGlobalEventContext, useRouteView } from '@/hooks';
 import { FormInstance } from 'element-plus';
 import { Message, OrderInputType } from '@bole-core/core';
 import { FourStreamsMaterialFileTableItem } from '@/components/commonView/types';
 import { useIndustrialParkDropDownList } from '@/hooks/industrialPark';
-import { FourStreamsMaterialUtils } from '@/components/commonView/utils';
+import {
+  CustomerApplyFileTypeListItem,
+  EnterpriseApplyFileUtils,
+  FourStreamsMaterialUtils,
+} from '@/components/commonView/utils';
 
 defineOptions({
   name: 'MaterialReviewAudit',
@@ -113,9 +118,10 @@
   applySumAmount: 0,
   enterpriseTaxSubFileUrl: [] as UploadUserFile[],
   enterpriseOperateFileUrl: [] as UploadUserFile[],
+  enterpriseRelateFileUrl: [] as UploadUserFile[],
+  parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
   bountyAssignFileUlr: [] as UploadUserFile[],
   bountyCollectFileUrl: [] as UploadUserFile[],
-  enterpriseRelateFileUrl: [] as UploadUserFile[],
 
   status: '' as any as BountyCheckStatusEnum,
   remark: '',
@@ -148,6 +154,9 @@
     form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
     form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
       data?.enterpriseRelateFileUrl
+    );
+    form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
+      data.listFiles
     );
 
     getList();
@@ -231,19 +240,49 @@
 
 const { dialogProps, handleAdd, editForm } = useFormDialog({
   defaultFormParams: {
-    list: [] as FourStreamsMaterialFileTableItem[],
+    list: [] as CustomerApplyFileTypeListItem[],
     companyId: '',
   },
 });
 const { getIndustrialParkTypeNameById } = useIndustrialParkDropDownList();
-function openDialog(row: API.ParkBountyApplyDetailInfo) {
-  handleAdd({
-    list: FourStreamsMaterialUtils.initFourStreamsMaterialFileList(
-      row,
-      getIndustrialParkTypeNameById(detail.value?.parkId)
-    ),
-    companyId: row.enterpriseId,
-  });
+
+async function openDialog(row: API.ParkBountyApplyDetailInfo) {
+  try {
+    const applyFiles = await queryClient.ensureQueryData({
+      queryKey: [
+        'enterpriseApplyFileServices/getCustomerUploadApplyFiles',
+        row.enterpriseId,
+        form.applyMonth,
+      ],
+      queryFn: async () => {
+        return await enterpriseApplyFileServices.getCustomerUploadApplyFiles({
+          enterpriseId: row.enterpriseId,
+          withMonth: form.applyMonth,
+        });
+      },
+    });
+    const lastUploadEnterPactFile = await queryClient.ensureQueryData({
+      queryKey: ['enterpriseApplyFileServices/getCustomerUploadApplyFiles', row.enterpriseId],
+      queryFn: async () => {
+        return await parkBountyApplyServices.getEnterpriseLastUploadEnterPactFileNew({
+          companyId: row.enterpriseId,
+        });
+      },
+    });
+
+    const applyUploadFiles = await parkBountyApplyServices.getEnterpriseParkApplyUploadFiles({
+      companyId: row.enterpriseId,
+      parkBountyApplyId: id,
+    });
+    handleAdd({
+      list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles(
+        applyUploadFiles,
+        applyFiles,
+        lastUploadEnterPactFile
+      ),
+      companyId: row.enterpriseId,
+    });
+  } catch (error) {}
 }
 </script>
 
diff --git a/src/views/MaterialReview/MaterialReviewDetail.vue b/src/views/MaterialReview/MaterialReviewDetail.vue
index 0bdeee5..b6d0263 100644
--- a/src/views/MaterialReview/MaterialReviewDetail.vue
+++ b/src/views/MaterialReview/MaterialReviewDetail.vue
@@ -56,8 +56,9 @@
 import DetailView from '@/components/commonView/DetailView.vue';
 import MateriaDetailDialog from '@/components/commonView/MateriaDetailDialog.vue';
 import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue';
-import { useQuery } from '@tanstack/vue-query';
+import { useQuery, useQueryClient } from '@tanstack/vue-query';
 import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import * as enterpriseApplyFileServices from '@/services/api/EnterpriseApplyFile';
 import { convertApi2FormUrlObjectBySeparator, setOSSLink } from '@/utils';
 import { useRouteView } from '@/hooks';
 import { OrderInputType } from '@bole-core/core';
@@ -68,7 +69,11 @@
   BountyCheckStatusEnumColor,
 } from '@/constants';
 import { FourStreamsMaterialFileTableItem } from '@/components/commonView/types';
-import { FourStreamsMaterialUtils } from '@/components/commonView/utils';
+import {
+  CustomerApplyFileTypeListItem,
+  EnterpriseApplyFileUtils,
+  FourStreamsMaterialUtils,
+} from '@/components/commonView/utils';
 import { useIndustrialParkDropDownList } from '@/hooks/industrialPark';
 
 defineOptions({
@@ -86,9 +91,10 @@
   applySumAmount: 0,
   enterpriseTaxSubFileUrl: [] as UploadUserFile[],
   enterpriseOperateFileUrl: [] as UploadUserFile[],
+  enterpriseRelateFileUrl: [] as UploadUserFile[],
+  parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
   bountyAssignFileUlr: [] as UploadUserFile[],
   bountyCollectFileUrl: [] as UploadUserFile[],
-  enterpriseRelateFileUrl: [] as UploadUserFile[],
 
   outCheckStatus: '' as any as BountyCheckStatusEnum,
   outCheckRemark: '',
@@ -125,6 +131,9 @@
     form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
     form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
       data?.enterpriseRelateFileUrl
+    );
+    form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
+      data.listFiles
     );
 
     getList();
@@ -166,21 +175,57 @@
 
 const { dialogProps, handleAdd, editForm } = useFormDialog({
   defaultFormParams: {
-    list: [] as FourStreamsMaterialFileTableItem[],
+    list: [] as CustomerApplyFileTypeListItem[],
     companyId: '',
   },
 });
 
 const { getIndustrialParkTypeNameById } = useIndustrialParkDropDownList();
+const queryClient = useQueryClient();
+async function openDialog(row: API.ParkBountyApplyDetailInfo) {
+  try {
+    const applyFiles = await queryClient.ensureQueryData({
+      queryKey: [
+        'enterpriseApplyFileServices/getCustomerUploadApplyFiles',
+        row.enterpriseId,
+        form.applyMonth,
+      ],
+      queryFn: async () => {
+        return await enterpriseApplyFileServices.getCustomerUploadApplyFiles({
+          enterpriseId: row.enterpriseId,
+          withMonth: form.applyMonth,
+        });
+      },
+    });
+    const lastUploadEnterPactFile = await queryClient.ensureQueryData({
+      queryKey: ['enterpriseApplyFileServices/getCustomerUploadApplyFiles', row.enterpriseId],
+      queryFn: async () => {
+        return await parkBountyApplyServices.getEnterpriseLastUploadEnterPactFileNew({
+          companyId: row.enterpriseId,
+        });
+      },
+    });
 
-function openDialog(row: API.ParkBountyApplyDetailInfo) {
-  handleAdd({
-    list: FourStreamsMaterialUtils.initFourStreamsMaterialFileList(
-      row,
-      getIndustrialParkTypeNameById(detail.value?.parkId)
-    ),
-    companyId: row.enterpriseId,
-  });
+    const applyUploadFiles = await parkBountyApplyServices.getEnterpriseParkApplyUploadFiles({
+      companyId: row.enterpriseId,
+      parkBountyApplyId: id,
+    });
+    handleAdd({
+      list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles(
+        applyUploadFiles,
+        applyFiles,
+        lastUploadEnterPactFile
+      ),
+      companyId: row.enterpriseId,
+    });
+  } catch (error) {}
+  // handleAdd({
+  //   list: FourStreamsMaterialUtils.initFourStreamsMaterialFileList(
+  //     row,
+  //     getIndustrialParkTypeNameById(detail.value?.parkId)
+  //   ),
+  //   companyId: row.enterpriseId,
+  // });
 }
 
 function handleBack() {
diff --git a/src/views/Reward/RewardDeclareDetail.vue b/src/views/Reward/RewardDeclareDetail.vue
index 02342ea..17df84a 100644
--- a/src/views/Reward/RewardDeclareDetail.vue
+++ b/src/views/Reward/RewardDeclareDetail.vue
@@ -40,15 +40,20 @@
 import ChunkCellV2 from '@/components/Layout/ChunkCellV2.vue';
 import MateriaDetailDialog from '@/components/commonView/MateriaDetailDialog.vue';
 import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue';
-import { useQuery } from '@tanstack/vue-query';
+import { useQuery, useQueryClient } from '@tanstack/vue-query';
 import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import * as enterpriseApplyFileServices from '@/services/api/EnterpriseApplyFile';
 import { convertApi2FormUrlObjectBySeparator, setOSSLink } from '@/utils';
 import { useRouteView } from '@/hooks';
 import { OrderInputType } from '@bole-core/core';
 import { EnterpriseTypeText } from '@/constants';
 import { FourStreamsMaterialFileTableItem } from '@/components/commonView/types';
 import { useIndustrialParkDropDownList } from '@/hooks/industrialPark';
-import { FourStreamsMaterialUtils } from '@/components/commonView/utils';
+import {
+  CustomerApplyFileTypeListItem,
+  EnterpriseApplyFileUtils,
+  FourStreamsMaterialUtils,
+} from '@/components/commonView/utils';
 
 defineOptions({
   name: 'RewardDeclareDetail',
@@ -65,9 +70,10 @@
   applySumAmount: 0,
   enterpriseTaxSubFileUrl: [] as UploadUserFile[],
   enterpriseOperateFileUrl: [] as UploadUserFile[],
+  enterpriseRelateFileUrl: [] as UploadUserFile[],
+  parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
   bountyAssignFileUlr: [] as UploadUserFile[],
   bountyCollectFileUrl: [] as UploadUserFile[],
-  enterpriseRelateFileUrl: [] as UploadUserFile[],
 });
 
 const { data: detail, isLoading } = useQuery({
@@ -92,6 +98,9 @@
     );
     form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
       data?.enterpriseOperateFileUrl
+    );
+    form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
+      data.listFiles
     );
     form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
     form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
@@ -140,23 +149,59 @@
   }
 );
 
-const { dialogProps, handleEdit, editForm } = useFormDialog({
+const { dialogProps, handleAdd, editForm } = useFormDialog({
   defaultFormParams: {
-    list: [] as FourStreamsMaterialFileTableItem[],
+    list: [] as CustomerApplyFileTypeListItem[],
     companyId: '',
   },
 });
 
 const { getIndustrialParkTypeNameById } = useIndustrialParkDropDownList();
+const queryClient = useQueryClient();
+async function openDialog(row: API.ParkBountyApplyDetailInfo) {
+  try {
+    const applyFiles = await queryClient.ensureQueryData({
+      queryKey: [
+        'enterpriseApplyFileServices/getCustomerUploadApplyFiles',
+        row.enterpriseId,
+        form.applyMonth,
+      ],
+      queryFn: async () => {
+        return await enterpriseApplyFileServices.getCustomerUploadApplyFiles({
+          enterpriseId: row.enterpriseId,
+          withMonth: form.applyMonth,
+        });
+      },
+    });
+    const lastUploadEnterPactFile = await queryClient.ensureQueryData({
+      queryKey: ['enterpriseApplyFileServices/getCustomerUploadApplyFiles', row.enterpriseId],
+      queryFn: async () => {
+        return await parkBountyApplyServices.getEnterpriseLastUploadEnterPactFileNew({
+          companyId: row.enterpriseId,
+        });
+      },
+    });
 
-function openDialog(row: API.ParkBountyApplyDetailInfo) {
-  handleEdit({
-    list: FourStreamsMaterialUtils.initFourStreamsMaterialFileList(
-      row,
-      getIndustrialParkTypeNameById(detail.value?.parkId)
-    ),
-    companyId: row.enterpriseId,
-  });
+    const applyUploadFiles = await parkBountyApplyServices.getEnterpriseParkApplyUploadFiles({
+      companyId: row.enterpriseId,
+      parkBountyApplyId: id,
+    });
+    handleAdd({
+      list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles(
+        applyUploadFiles,
+        applyFiles,
+        lastUploadEnterPactFile
+      ),
+      companyId: row.enterpriseId,
+    });
+  } catch (error) {}
+  // handleEdit({
+  //   list: FourStreamsMaterialUtils.initFourStreamsMaterialFileList(
+  //     row,
+  //     getIndustrialParkTypeNameById(detail.value?.parkId)
+  //   ),
+  //   companyId: row.enterpriseId,
+  // });
 }
 
 function handleBack() {
diff --git a/src/views/Reward/RewardGrant.vue b/src/views/Reward/RewardGrant.vue
index a576222..8716cc1 100644
--- a/src/views/Reward/RewardGrant.vue
+++ b/src/views/Reward/RewardGrant.vue
@@ -68,7 +68,7 @@
 
       <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
       </ProTableV2>
-      <FourStreamsMaterialFileDialog
+      <FourStreamsMaterialFileDialogV2
         v-bind="dialogMaterialFileProps"
         :show-upload-btn="false"
         :show-delete-btn="false"
@@ -105,6 +105,7 @@
   SettleStatusEnumText,
   FinanceStatusEnum,
   FinanceStatusEnumText,
+  TransferFileEnumInRewardGrandText,
 } from '@/constants';
 import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
 import FinancialDialog from './components/FinancialDialog.vue';
@@ -112,11 +113,8 @@
 import _ from 'lodash';
 import { ModelValueType } from 'element-plus';
 import { useQueryClient } from '@tanstack/vue-query';
+import { TransferFileEnumInRewardGrandTableItem } from '@/components/commonView/types';
 import { FourStreamsMaterialUtils } from '@/components/commonView/utils';
-import {
-  TransferFileEnumInRewardGrandText,
-  TransferFileEnumInRewardGrandTableItem,
-} from '@/components/commonView/types';
 
 defineOptions({
   name: 'RewardGrant',
@@ -127,51 +125,61 @@
     id: '1',
     enCode: 'batchNo',
     name: '鐢宠鎵规鍙�',
+    width: 160,
   },
   {
     id: '2',
     enCode: 'parkName',
     name: '鐢宠鍥尯',
+    width: 250,
   },
   {
     id: '3',
     enCode: 'parkTypeName',
     name: '鍥尯绫诲瀷',
+    width: 160,
   },
   {
     id: '4',
     enCode: 'applyMonth',
     name: '鐢宠骞冲彴濂栧姳鏈堜唤',
+    width: 160,
   },
   {
     id: '5',
     enCode: 'applySumAmount',
     name: '骞冲彴濂栧姳姹囨�婚噾棰濓紙鍏冿級',
+    width: 180,
   },
   {
     id: '6',
     enCode: 'creationTime',
     name: '鐢虫姤鏃ユ湡',
+    width: 180,
   },
   {
     id: '7',
     enCode: 'financeStatus',
     name: '璐㈡斂鎷ㄤ粯鐘舵��',
+    width: 160,
   },
   {
     id: '8',
     enCode: 'financeTime',
     name: '鎷ㄤ粯鏃ユ湡',
+    width: 180,
   },
   {
     id: '9',
     enCode: 'settleStatus',
     name: '骞冲彴鍏呭�肩姸鎬�',
+    width: 160,
   },
   {
     id: '10',
     enCode: 'settleTime',
     name: '鍏呭�兼棩鏈�',
+    width: 180,
   },
 ];
 
@@ -208,7 +216,7 @@
     },
     extraProps: {
       hide: (row: API.GetParkBountyApplyListOutput) =>
-        row.settleStatus === SettleStatusEnum.HasSettle,
+        row.settleStatus !== SettleStatusEnum.WaitForSettle,
     },
   },
   {

--
Gitblit v1.9.1