From 0b73bba28e2a8473ab71f5c8b4760c1995ff4fc1 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期二, 21 十月 2025 18:29:07 +0800
Subject: [PATCH] fix: s

---
 src/constants/fourStreams.ts                                     |   13 +
 src/views/MaterialReview/MaterialReview.vue                      |    2 
 src/views/Reward/components/BatchRegisterDialog.vue              |   10 +
 src/constants/dic.ts                                             |    2 
 src/components/commonView/FourStreamsBatchMaterialFileDialog.vue |   13 +
 src/services/api/typings.d.ts                                    |   12 +
 src/components/commonView/MateriaDetailDialog.vue                |    2 
 src/hooks/fourStreams.ts                                         |  164 +++++++++++++-------
 src/components/commonView/SettlementMaterialInfoView.vue         |   14 +
 src/views/Reward/components/RewardApplyTradeCheckDialog.vue      |   14 +
 src/utils/request/index.ts                                       |    1 
 src/views/MaterialReview/MaterialReviewAudit.vue                 |   14 +
 src/components/commonView/MaterialInfoView.vue                   |    8 
 src/components/commonView/DetailView.vue                         |   16 +
 src/components/commonView/BatchInfoView.vue                      |   15 +
 src/views/Reward/RewardGrant.vue                                 |    2 
 src/components/commonView/types.ts                               |    2 
 src/components/commonView/utils/index.ts                         |   81 +++++++--
 src/components/commonView/FourStreamsMaterialFileTable.vue       |   16 +
 src/views/Reward/RewardDeclareDetail.vue                         |    8 
 src/components/commonView/ExtraMaterialInfoView.vue              |   42 +++++
 src/views/MaterialReview/MaterialReviewDetail.vue                |    9 +
 src/views/Reward/RewardGrantRegister.vue                         |   18 +
 23 files changed, 367 insertions(+), 111 deletions(-)

diff --git a/src/components/commonView/BatchInfoView.vue b/src/components/commonView/BatchInfoView.vue
index b7fc1ca..3433574 100644
--- a/src/components/commonView/BatchInfoView.vue
+++ b/src/components/commonView/BatchInfoView.vue
@@ -1,22 +1,22 @@
 <template>
   <ProFormCol>
     <ProFormColItem :span="12">
-      <ProFormItemV2 label="鐢虫姤鎵规鍙�:" prop="batchNo">
+      <ProFormItemV2 label="鐢虫姤鎵规鍙�:" prop="batchNo" :mode="mode">
         <ProFormText v-model.trim="form.batchNo" />
       </ProFormItemV2>
     </ProFormColItem>
     <ProFormColItem :span="12">
-      <ProFormItemV2 label="鐢宠濂栧姳閲戞湀浠�:" prop="applyMonth">
+      <ProFormItemV2 label="鐢宠濂栧姳閲戞湀浠�:" prop="applyMonth" :mode="mode">
         <ProFormDatePicker v-model="form.applyMonth" format="YYYY骞碝M鏈�" type="month" />
       </ProFormItemV2>
     </ProFormColItem>
     <ProFormColItem :span="12">
-      <ProFormItemV2 label="鐢虫姤鍥尯:" prop="parkName">
+      <ProFormItemV2 label="鐢虫姤鍥尯:" prop="parkName" :mode="mode">
         <ProFormText v-model.trim="form.parkName" />
       </ProFormItemV2>
     </ProFormColItem>
     <ProFormColItem :span="12">
-      <ProFormItemV2 label="鍥尯绫诲瀷:">
+      <ProFormItemV2 label="鍥尯绫诲瀷:" :mode="mode">
         <ProFormText v-model.trim="form.parkTypeName" />
       </ProFormItemV2>
     </ProFormColItem>
@@ -41,6 +41,7 @@
 });
 
 type Props = {
+  isEdit?: boolean;
   form: {
     batchNo: string;
     parkName: string;
@@ -50,7 +51,11 @@
   };
 };
 
-const props = withDefaults(defineProps<Props>(), {});
+const props = withDefaults(defineProps<Props>(), {
+  isEdit: false,
+});
+
+const mode = computed(() => (props.isEdit ? 'read' : 'edit'));
 
 const { allSearchSettingList: parkTypeList } = useAllSearchSettingList({
   searchType: SearchType.Park,
diff --git a/src/components/commonView/DetailView.vue b/src/components/commonView/DetailView.vue
index a1c8ab8..5e6c408 100644
--- a/src/components/commonView/DetailView.vue
+++ b/src/components/commonView/DetailView.vue
@@ -1,17 +1,20 @@
 <template>
-  <ProForm :model="form" label-width="160px" label-position="left" is-read>
+  <ProForm :model="form" label-width="160px" label-position="left">
     <ChunkCellV2 title="鎵规淇℃伅" style="margin-bottom: 0">
-      <BatchInfoView :form="form"></BatchInfoView>
+      <BatchInfoView :form="form" isEdit></BatchInfoView>
     </ChunkCellV2>
     <ChunkCellV2
       title="姹囨�绘潗鏂�"
       style="margin-bottom: 0"
       v-if="form.parkCollectFileList.length > 0"
     >
-      <MaterialInfoView :form="form"></MaterialInfoView>
+      <MaterialInfoView :form="form" isEdit></MaterialInfoView>
     </ChunkCellV2>
     <ChunkCellV2 title="姹囩畻鏉愭枡" style="margin-bottom: 0">
-      <SettlementMaterialInfoView :form="form"></SettlementMaterialInfoView>
+      <SettlementMaterialInfoView :form="form" isEdit></SettlementMaterialInfoView>
+    </ChunkCellV2>
+    <ChunkCellV2 title="琛ュ厖鏉愭枡" style="margin-bottom: 0">
+      <ExtraMaterialInfoView :form="form" :is-edit="isEdit"></ExtraMaterialInfoView>
     </ChunkCellV2>
     <slot></slot>
   </ProForm>
@@ -23,6 +26,7 @@
 import BatchInfoView from './BatchInfoView.vue';
 import MaterialInfoView from './MaterialInfoView.vue';
 import SettlementMaterialInfoView from './SettlementMaterialInfoView.vue';
+import ExtraMaterialInfoView from './ExtraMaterialInfoView.vue';
 import { CustomerApplyFileTypeListItem } from './utils';
 
 defineOptions({
@@ -31,6 +35,7 @@
 
 type Props = {
   hasForm?: boolean;
+  isEdit?: boolean;
   form?: {
     batchNo: string;
     parkName: string;
@@ -46,6 +51,8 @@
     parkCollectFileList: CustomerApplyFileTypeListItem[];
     /**姹囩畻鏉愭枡 */
     calculationFileList: CustomerApplyFileTypeListItem[];
+    /** 琛ュ厖鏉愭枡 */
+    extraListFiles: CustomerApplyFileTypeListItem[];
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
   };
@@ -53,6 +60,7 @@
 
 const props = withDefaults(defineProps<Props>(), {
   hasForm: false,
+  isEdit: true,
 });
 </script>
 
diff --git a/src/components/commonView/ExtraMaterialInfoView.vue b/src/components/commonView/ExtraMaterialInfoView.vue
new file mode 100644
index 0000000..bc5ce9a
--- /dev/null
+++ b/src/components/commonView/ExtraMaterialInfoView.vue
@@ -0,0 +1,42 @@
+<template>
+  <ProFormItemV2
+    :label="`${item.fileTypeName}:`"
+    :prop="`extraListFiles.${index}.listFiles`"
+    :label-width="160"
+    :mode="mode"
+    class="pro-form-item-label-hidden"
+    :style="{ marginBottom: index === form.extraListFiles.length - 1 ? 0 : '22px' }"
+    v-for="(item, index) in form.extraListFiles"
+    :key="item.fileSearchTypeId"
+    v-if="form.extraListFiles.length > 0"
+  >
+    <ProFormUpload
+      v-model:file-url="item.listFiles"
+      :showTip="false"
+      :limitShowViewMoreBtnCount="4"
+      accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
+    ></ProFormUpload>
+  </ProFormItemV2>
+</template>
+
+<script setup lang="ts">
+import { ProFormItemV2, ProFormUpload } from '@bole-core/components';
+import { CustomerApplyFileTypeListItem } from './utils';
+
+defineOptions({
+  name: 'ExtraMaterialInfoView',
+});
+
+type Props = {
+  isEdit?: boolean;
+  form: {
+    extraListFiles: CustomerApplyFileTypeListItem[];
+  };
+};
+
+const props = withDefaults(defineProps<Props>(), {
+  isEdit: false,
+});
+
+const mode = computed(() => (props.isEdit ? 'read' : 'edit'));
+</script>
diff --git a/src/components/commonView/FourStreamsBatchMaterialFileDialog.vue b/src/components/commonView/FourStreamsBatchMaterialFileDialog.vue
index 3039c0c..73a57d8 100644
--- a/src/components/commonView/FourStreamsBatchMaterialFileDialog.vue
+++ b/src/components/commonView/FourStreamsBatchMaterialFileDialog.vue
@@ -53,6 +53,8 @@
 } from '@bole-core/components';
 import { format, downloadFileByUrl, formatFileSize } from '@/utils';
 import { downloadWithZip, Message, isFileCanPreview } from '@bole-core/core';
+import { CustomerApplyFileTypeListItem, EnterpriseApplyFileUtils } from './utils';
+import { FourStreamsExtraMaterialFileSearchType, SearchType } from '@/constants';
 
 defineOptions({
   name: 'FourStreamsBatchMaterialFileDialog',
@@ -62,10 +64,13 @@
   name?: string;
   zipName?: string;
   showDeleteBtn?: boolean;
+  showMaterialExtraFileDeleteBtn?: boolean;
+  fileSearchTypeId?: string;
 };
 
 const props = withDefaults(defineProps<Props>(), {
   showDeleteBtn: true,
+  showMaterialExtraFileDeleteBtn: false,
 });
 
 const visible = defineModel<boolean>('visible');
@@ -120,7 +125,13 @@
       onClick: (row) => handleDelete(row),
     },
     extraProps: {
-      hide: (row) => !props.showDeleteBtn,
+      hide: (row: API.CustomerUploadMonthApplyFileTypeDto) => {
+        if (EnterpriseApplyFileUtils.isApplyUploadExtraFileSearchTypeId(props.fileSearchTypeId)) {
+          return !props.showMaterialExtraFileDeleteBtn;
+        } else {
+          return !props.showDeleteBtn;
+        }
+      },
     },
   },
 ]);
diff --git a/src/components/commonView/FourStreamsMaterialFileTable.vue b/src/components/commonView/FourStreamsMaterialFileTable.vue
index 606f5de..8272334 100644
--- a/src/components/commonView/FourStreamsMaterialFileTable.vue
+++ b/src/components/commonView/FourStreamsMaterialFileTable.vue
@@ -26,8 +26,10 @@
       v-bind="dialogProps"
       :name="''"
       :zipName="currentFourStreamsMaterialFileTableItem.fileTypeName"
+      :fileSearchTypeId="currentFourStreamsMaterialFileTableItem.fileSearchTypeId"
       v-model:fileList="currentFourStreamsMaterialFileTableItem.listFiles"
       :showDeleteBtn="showDeleteBtn"
+      :showMaterialExtraFileDeleteBtn="showMaterialExtraFileDeleteBtn"
       :yearMonth="date"
       :onDelete="(file) => handleDialogDelete(currentFourStreamsMaterialFileTableItem, file)"
     />
@@ -49,7 +51,8 @@
 import { Message, isFileCanPreview, downloadWithZip } from '@bole-core/core';
 import { useDefineColumns } from '@/hooks';
 import FourStreamsBatchMaterialFileDialog from './FourStreamsBatchMaterialFileDialog.vue';
-import { CustomerApplyFileTypeListItem } from './utils';
+import { CustomerApplyFileTypeListItem, EnterpriseApplyFileUtils } from './utils';
+import { FourStreamsExtraMaterialFileSearchType, SearchType } from '@/constants';
 
 defineOptions({
   name: 'FourStreamsMaterialFileTable',
@@ -57,9 +60,11 @@
 
 const props = withDefaults(defineProps<FourStreamsMaterialFileTableProps>(), {
   showUploadBtn: true,
+  showMaterialExtraFileUploadBtn: false,
   showCheckBtn: true,
   showDownloadBtn: true,
   showDeleteBtn: true,
+  showMaterialExtraFileDeleteBtn: false,
   downloadBtnText: '涓嬭浇',
 });
 
@@ -82,6 +87,9 @@
       },
       extraProps: {
         hide: (row: CustomerApplyFileTypeListItem) => {
+          if (EnterpriseApplyFileUtils.isApplyUploadExtraFileSearchTypeId(row.fileSearchTypeId)) {
+            return !props.showMaterialExtraFileUploadBtn;
+          }
           return !props.showUploadBtn;
           // if (!props.showUploadBtn) return true;
           // let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
@@ -143,7 +151,11 @@
       },
       extraProps: {
         hide: (row: CustomerApplyFileTypeListItem) => {
-          if (!props.showDeleteBtn) return true;
+          if (EnterpriseApplyFileUtils.isApplyUploadExtraFileSearchTypeId(row.fileSearchTypeId)) {
+            if (!props.showMaterialExtraFileDeleteBtn) return true;
+          } else {
+            if (!props.showDeleteBtn) return true;
+          }
           let fileList = row?.listFiles?.filter?.((item) => item.status === 'success');
           return !fileList?.length;
         },
diff --git a/src/components/commonView/MateriaDetailDialog.vue b/src/components/commonView/MateriaDetailDialog.vue
index dff1e54..3ff57a8 100644
--- a/src/components/commonView/MateriaDetailDialog.vue
+++ b/src/components/commonView/MateriaDetailDialog.vue
@@ -23,9 +23,11 @@
 
 const props = withDefaults(defineProps<Props>(), {
   showUploadBtn: true,
+  showMaterialExtraFileUploadBtn: false,
   showCheckBtn: true,
   showDownloadBtn: true,
   showDeleteBtn: true,
+  showMaterialExtraFileDeleteBtn: false,
 });
 
 const visible = defineModel({ type: Boolean });
diff --git a/src/components/commonView/MaterialInfoView.vue b/src/components/commonView/MaterialInfoView.vue
index 09df816..402c453 100644
--- a/src/components/commonView/MaterialInfoView.vue
+++ b/src/components/commonView/MaterialInfoView.vue
@@ -3,6 +3,7 @@
     :label="`${item.fileTypeName}:`"
     :prop="`parkCollectFileList.${index}.listFiles`"
     :label-width="160"
+    :mode="mode"
     :style="{ marginBottom: index === form.parkCollectFileList.length - 1 ? 0 : '22px' }"
     v-for="(item, index) in form.parkCollectFileList"
     :key="item.fileSearchTypeId"
@@ -26,12 +27,17 @@
 });
 
 type Props = {
+  isEdit?: boolean;
   form: {
     parkCollectFileList: CustomerApplyFileTypeListItem[];
   };
 };
 
-const props = withDefaults(defineProps<Props>(), {});
+const props = withDefaults(defineProps<Props>(), {
+  isEdit: false,
+});
+
+const mode = computed(() => (props.isEdit ? 'read' : 'edit'));
 </script>
 
 <style lang="scss" scoped>
diff --git a/src/components/commonView/SettlementMaterialInfoView.vue b/src/components/commonView/SettlementMaterialInfoView.vue
index ad836fe..cc5fb6d 100644
--- a/src/components/commonView/SettlementMaterialInfoView.vue
+++ b/src/components/commonView/SettlementMaterialInfoView.vue
@@ -1,17 +1,18 @@
 <template>
-  <ProFormItemV2 label="鏈鐢虫姤濂栧姳閲戞�婚:" prop="applySumAmount">
+  <ProFormItemV2 label="鏈鐢虫姤濂栧姳閲戞�婚:" prop="applySumAmount" :mode="mode">
     <ProFormInputNumber v-model="form.applySumAmount" formatValue="money" unit="鍏�" />
   </ProFormItemV2>
-  <ProFormItemV2 label="璐㈡斂鎷ㄤ粯鎬婚:" prop="financeSumAmount">
+  <ProFormItemV2 label="璐㈡斂鎷ㄤ粯鎬婚:" prop="financeSumAmount" :mode="mode">
     <ProFormInputNumber v-model="form.financeSumAmount" formatValue="money" unit="鍏�" />
   </ProFormItemV2>
-  <ProFormItemV2 label="骞冲彴鎷ㄤ粯鎬婚:" prop="settleSumAmount">
+  <ProFormItemV2 label="骞冲彴鎷ㄤ粯鎬婚:" prop="settleSumAmount" :mode="mode">
     <ProFormInputNumber v-model="form.settleSumAmount" formatValue="money" unit="鍏�" />
   </ProFormItemV2>
   <ProFormItemV2
     :label="`${item.fileTypeName}:`"
     :prop="`calculationFileList.${index}.listFiles`"
     :label-width="160"
+    :mode="mode"
     :style="{ marginBottom: index === form.calculationFileList.length - 1 ? 0 : '22px' }"
     v-for="(item, index) in form.calculationFileList"
     :key="item.fileSearchTypeId"
@@ -42,6 +43,7 @@
 });
 
 type Props = {
+  isEdit?: boolean;
   form: {
     applySumAmount: number;
     financeSumAmount: number;
@@ -50,7 +52,11 @@
   };
 };
 
-const props = withDefaults(defineProps<Props>(), {});
+const props = withDefaults(defineProps<Props>(), {
+  isEdit: false,
+});
+
+const mode = computed(() => (props.isEdit ? 'read' : 'edit'));
 </script>
 
 <style lang="scss" scoped>
diff --git a/src/components/commonView/types.ts b/src/components/commonView/types.ts
index 89fd9f9..6941626 100644
--- a/src/components/commonView/types.ts
+++ b/src/components/commonView/types.ts
@@ -9,9 +9,11 @@
 export type FourStreamsMaterialFileTableProps = {
   date?: string;
   showUploadBtn?: boolean;
+  showMaterialExtraFileUploadBtn?: boolean;
   showCheckBtn?: boolean;
   showDownloadBtn?: boolean;
   showDeleteBtn?: boolean;
+  showMaterialExtraFileDeleteBtn?: boolean;
   downloadBtnText?: string;
   onDelete?: (row: CustomerApplyFileTypeListItem, fileId: string) => Promise<any>;
   onUpload?: (row: CustomerApplyFileTypeListItem, userFile: UploadUserFile) => Promise<any>;
diff --git a/src/components/commonView/utils/index.ts b/src/components/commonView/utils/index.ts
index 9550a10..2372a8d 100644
--- a/src/components/commonView/utils/index.ts
+++ b/src/components/commonView/utils/index.ts
@@ -13,6 +13,8 @@
   FourStreamsMaterialFileBusinessTypeEnumKey,
   TransferFileEnumInRewardGrand,
   TransferFileEnumInRewardGrandKey,
+  FourStreamsExtraMaterialFileSearchType,
+  SearchType,
 } from '@/constants';
 
 export class FourStreamsMaterialUtils {
@@ -120,6 +122,7 @@
 export type CustomerApplyFileTypeListItem = {
   id?: string;
   fileSearchTypeId?: string;
+  searchType?: number;
   fileTypeName?: string;
   lastUpdateTime?: string;
   listFiles?: (API.CustomerUploadMonthApplyFileTypeDto & UploadUserFile)[];
@@ -154,29 +157,71 @@
     );
   }
 
+  static convertApiFileToExtraListFiles(listFiles: API.CustomerUploadMonthApplyFileTypeDto[]) {
+    if (listFiles.length > 0) {
+      return this.convertApiFileToParkCollectFileList(listFiles);
+    } else {
+      return [
+        {
+          fileSearchTypeId: FourStreamsExtraMaterialFileSearchType[SearchType.BountyExtraFileType],
+          fileTypeName: '琛ュ厖鏉愭枡',
+          listFiles: [],
+        } as CustomerApplyFileTypeListItem,
+      ];
+    }
+  }
+
   static initParkCollectFileListApplyFiles(
     applyUploadFiles: API.GetEnterpriseParkApplyUploadFileOutput[],
     applyFiles: API.GetCustomerUploadApplyFilesOutput[],
-    lastUploadEnterPactFile: API.CustomerUploadMonthApplyFileTypeDto[]
+    lastUploadEnterPactFile: API.CustomerUploadMonthApplyFileTypeDto[],
+    applyUploadExtraFiles: API.GetEnterpriseParkApplyUploadFileOutput[]
   ) {
-    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;
-      }
+    const extraFiles =
+      applyUploadExtraFiles.length > 0
+        ? applyUploadExtraFiles.map((x) => {
+            return {
+              fileSearchTypeId: x.fileSearchTypeId,
+              fileTypeName: x.fileSearchTypeName,
+              listFiles: x.listFiles.map((a) => ({ ...a, ...convertApi2FormUrl(a.fileUrl) })),
+            } as CustomerApplyFileTypeListItem;
+          })
+        : [
+            {
+              fileSearchTypeId:
+                FourStreamsExtraMaterialFileSearchType[SearchType.BountyApplyExtraFileType],
+              fileTypeName: '琛ュ厖鏉愭枡',
+              listFiles: [],
+            } as CustomerApplyFileTypeListItem,
+          ];
 
-      return {
-        fileSearchTypeId: x.fileSearchTypeId,
-        fileTypeName: x.fileSearchTypeName,
-        listFiles: listFiles.map((a) => ({ ...a, ...convertApi2FormUrl(a.fileUrl) })),
-      } as CustomerApplyFileTypeListItem;
-    });
+    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;
+      })
+      .concat(extraFiles);
+  }
+
+  static isApplyUploadExtraFileSearchTypeId(fileSearchTypeId: string) {
+    return (
+      (fileSearchTypeId ?? '').toLowerCase() ===
+      FourStreamsExtraMaterialFileSearchType[SearchType.BountyApplyExtraFileType].toLowerCase()
+    );
   }
 
   static convertFileTableListToApi(fileTableList: CustomerApplyFileTypeListItem[]) {
diff --git a/src/constants/dic.ts b/src/constants/dic.ts
index 2bd2ed0..9436d0a 100644
--- a/src/constants/dic.ts
+++ b/src/constants/dic.ts
@@ -18,6 +18,8 @@
   FirstPartyIndustry = 170,
   MatingServiceType = 180,
   IndustryBodyType = 190,
+  BountyExtraFileType = 240,
+  BountyApplyExtraFileType = 250,
 }
 
 export const SearchTypeText = {
diff --git a/src/constants/fourStreams.ts b/src/constants/fourStreams.ts
index 795e448..e4d0897 100644
--- a/src/constants/fourStreams.ts
+++ b/src/constants/fourStreams.ts
@@ -1,5 +1,6 @@
 import { defineColumns } from '@bole-core/components';
 import { TempFolderPath } from './enum';
+import { SearchType } from './dic';
 
 export enum FourStreamsMaterialFileBusinessTypeEnum {
   /** 鍥尯鍏ラ┗鍗忚 */
@@ -121,18 +122,20 @@
 
 type UseAddRewardApplyStep3ColumnsOptions = {
   suportPlatRecharge: Ref<boolean>;
+  suportFinance: Ref<boolean>;
   baseColumns?: API.ModuleColumnDto[];
 };
 
 export function useAddRewardApplyStep3Columns({
   suportPlatRecharge,
+  suportFinance,
   baseColumns = BaseDeclareEnterpriseTableViewColumns,
 }: UseAddRewardApplyStep3ColumnsOptions) {
   const addRewardApplyStep3Columns = computed(() =>
     defineColumns(
       [
         ...baseColumns,
-        {
+        suportFinance.value && {
           id: '8',
           enCode: 'financeAmount',
           name: '璐㈡斂鎷ㄤ粯閲戦',
@@ -184,3 +187,11 @@
    */
   Trade = 5,
 }
+
+/**
+ * 娌℃湁鍦ㄥ瓧鍏搁厤缃瓼ileSearchType 鎵�浠ヨˉ鍏呮枃浠跺湪杩欓噷鍐欐
+ */
+export const FourStreamsExtraMaterialFileSearchType = {
+  [SearchType.BountyExtraFileType]: '0D85AE1F-0618-F43C-A762-3A197D83B471',
+  [SearchType.BountyApplyExtraFileType]: '0D85AE1F-0618-F43C-A762-3A197D83B472',
+};
diff --git a/src/hooks/fourStreams.ts b/src/hooks/fourStreams.ts
index 33182e8..0ea2acc 100644
--- a/src/hooks/fourStreams.ts
+++ b/src/hooks/fourStreams.ts
@@ -1,5 +1,5 @@
 import { defineColumns, defineOperationBtns, useFormDialog, useTable } from '@bole-core/components';
-import { OrderInputType } from '@bole-core/core';
+import { Message, OrderInputType } from '@bole-core/core';
 import { useQueryClient } from '@tanstack/vue-query';
 import { setOSSLink } from '@/utils';
 import {
@@ -15,72 +15,86 @@
   FinanceStatusEnumText,
   FinanceStatusEnumTextV2,
   FinanceStatusEnumTextV2Query,
+  FourStreamsExtraMaterialFileSearchType,
+  SearchType,
   SettleStatusEnumTextV2,
   TransferToStatusEnum,
   TransferToStatusEnumText,
 } from '@/constants';
 
-export const rewardGrantRegisterColumns = computed(() =>
-  defineColumns([
-    ...BaseDeclareEnterpriseTableViewColumns,
-    {
-      id: '9',
-      enCode: 'financeAmount',
-      name: '璐㈡斂鎷ㄤ粯閲戦',
-      width: 160,
-    },
-    {
-      id: '10',
-      enCode: 'financeSumAmount',
-      name: '璐㈡斂鎷ㄤ粯宸茬櫥璁�',
-      width: 160,
-    },
-    {
-      id: '11',
-      enCode: 'financeTime',
-      name: '鏈�杩戠櫥璁版棩鏈�',
-      width: 160,
-    },
-    {
-      id: '12',
-      enCode: 'financeStatus',
-      name: '璐㈡斂鎷ㄤ粯鐧昏鐘舵��',
-      width: 160,
-    },
-    {
-      id: '13',
-      enCode: 'transferAmount',
-      name: '骞冲彴鎷ㄤ粯閲戦',
-      width: 160,
-    },
-    {
-      id: '14',
-      enCode: 'settleSumAmount',
-      name: '骞冲彴鎷ㄤ粯宸茬櫥璁�',
-      width: 160,
-    },
-    {
-      id: '15',
-      enCode: 'settleTime',
-      name: '鏈�杩戠櫥璁版棩鏈�',
-      width: 160,
-    },
-    {
-      id: '16',
-      enCode: 'settleStatus',
-      name: '骞冲彴鎷ㄤ粯鐧昏鐘舵��',
-      width: 160,
-    },
-  ])
-);
+type UseRewardGrantRegisterColumnsOptions = {
+  suportPlatRecharge?: MaybeRef<boolean>;
+  suportFinance?: MaybeRef<boolean>;
+};
+
+export function useRewardGrantRegisterColumns(options: UseRewardGrantRegisterColumnsOptions = {}) {
+  const { suportPlatRecharge, suportFinance } = options;
+
+  const rewardGrantRegisterColumns = computed(() =>
+    defineColumns([
+      ...BaseDeclareEnterpriseTableViewColumns,
+      {
+        id: '9',
+        enCode: 'financeAmount',
+        name: '璐㈡斂鎷ㄤ粯閲戦',
+        width: 160,
+      },
+      {
+        id: '10',
+        enCode: 'financeSumAmount',
+        name: '璐㈡斂鎷ㄤ粯宸茬櫥璁�',
+        width: 160,
+      },
+      {
+        id: '11',
+        enCode: 'financeTime',
+        name: '鏈�杩戠櫥璁版棩鏈�',
+        width: 160,
+      },
+      {
+        id: '12',
+        enCode: 'financeStatus',
+        name: '璐㈡斂鎷ㄤ粯鐧昏鐘舵��',
+        width: 160,
+      },
+      {
+        id: '13',
+        enCode: 'transferAmount',
+        name: '骞冲彴鎷ㄤ粯閲戦',
+        width: 160,
+      },
+      {
+        id: '14',
+        enCode: 'settleSumAmount',
+        name: '骞冲彴鎷ㄤ粯宸茬櫥璁�',
+        width: 160,
+      },
+      {
+        id: '15',
+        enCode: 'settleTime',
+        name: '鏈�杩戠櫥璁版棩鏈�',
+        width: 160,
+      },
+      {
+        id: '16',
+        enCode: 'settleStatus',
+        name: '骞冲彴鎷ㄤ粯鐧昏鐘舵��',
+        width: 160,
+      },
+    ])
+  );
+
+  return { rewardGrantRegisterColumns };
+}
 
 type UseDeclareEnterpriseTableOptions = {
   id?: Ref<string>;
   applyMonth?: Ref<string>;
+  enableUploadExtraFiles?: boolean;
 };
 
 export function useDeclareEnterpriseTable(options: UseDeclareEnterpriseTableOptions = {}) {
-  const { id, applyMonth } = options;
+  const { id, applyMonth, enableUploadExtraFiles = false } = options;
 
   const {
     getDataSource: getList,
@@ -134,6 +148,7 @@
 
   const queryClient = useQueryClient();
   const { dialogProps, handleAdd, editForm, dialogState } = useFormDialog({
+    onConfirm: handleUpload,
     defaultFormParams: {
       list: [] as CustomerApplyFileTypeListItem[],
       companyId: '',
@@ -170,11 +185,18 @@
         companyId: row.enterpriseId,
         parkBountyApplyId: id.value,
       });
+
+      const applyUploadExtraFiles =
+        await parkBountyApplyServices.getEnterpriseParkApplyUploadExtraFiles({
+          companyId: row.enterpriseId,
+          parkBountyApplyId: id.value,
+        });
       handleAdd({
         list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles(
           applyUploadFiles,
           applyFilesRes.items,
-          lastUploadEnterPactFile
+          lastUploadEnterPactFile,
+          applyUploadExtraFiles
         ),
         companyId: row.enterpriseId,
       });
@@ -191,7 +213,35 @@
         onClick: (row) => openDialog(row),
       },
     },
-  ]);
+    enableUploadExtraFiles && {
+      data: {
+        enCode: 'uploadBtn',
+        name: '琛ュ厖鏉愭枡',
+      },
+      emits: {
+        onClick: (row) => openDialog(row),
+      },
+    },
+  ]).filter(Boolean);
+
+  async function handleUpload() {
+    try {
+      if (!enableUploadExtraFiles) return;
+      let params: API.UploadParkApplyCustomerFilesInput = {
+        parkBountyApplyId: id.value,
+        companyId: editForm.companyId,
+        fileTypes: EnterpriseApplyFileUtils.convertFileTableListToApplyCompanyFile(
+          editForm.list.filter((x) =>
+            EnterpriseApplyFileUtils.isApplyUploadExtraFileSearchTypeId(x.fileSearchTypeId)
+          )
+        ),
+      };
+      let res = await parkBountyApplyServices.uploadParkBountyApplyCompanyExtraFile(params);
+      if (res) {
+        Message.successMessage('鎿嶄綔鎴愬姛');
+      }
+    } catch (error) {}
+  }
 
   return {
     getList,
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index e346c7e..442c148 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -11316,6 +11316,8 @@
     suportWithDraw?: boolean;
     /** 鏃犻渶鏀垮姟绔鏍� */
     notNeedGovernmentAudit?: boolean;
+    /** 鏄惁鏀寔璐㈡斂鎷ㄤ粯 */
+    suportFinance?: boolean;
     /** 娉ㄥ唽鍦板潃 */
     registerAddress?: string;
     /** 澶囨敞 */
@@ -11337,6 +11339,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔璐㈡斂鎷ㄤ粯 */
+    suportFinance?: boolean;
   }
 
   interface IndustrialParkFileTypeOutput {
@@ -11376,6 +11380,8 @@
     suportWithDraw?: boolean;
     /** 鏃犻渶鏀垮姟绔鏍� */
     notNeedGovernmentAudit?: boolean;
+    /** 鏄惁鏀寔璐㈡斂鎷ㄤ粯 */
+    suportFinance?: boolean;
   }
 
   interface IndustrialParkListOutputPageOutput {
@@ -16263,6 +16269,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔璐㈡斂鎷ㄤ粯 */
+    suportFinance?: boolean;
     /** 鏄惁鏀寔鐢ㄦ埛鎻愮幇 */
     suportWithDraw?: boolean;
     listFiles?: CustomerUploadMonthApplyFileTypeDto[];
@@ -16350,6 +16358,8 @@
     suportEnterpriseUpload?: boolean;
     /** 鏄惁鏀寔骞冲彴鍏呭�� */
     suportPlatRecharge?: boolean;
+    /** 鏄惁鏀寔璐㈡斂鎷ㄤ粯 */
+    suportFinance?: boolean;
     /** 鐢宠鍥尯绫诲瀷 */
     parkTypeName?: string;
     /** 鐢宠濂栧姳閲戞湀浠� */
@@ -16376,6 +16386,8 @@
     financeSumAmount?: number;
     listFiles?: CustomerUploadMonthApplyFileTypeDto[];
     collectCountListFiles?: CustomerUploadMonthApplyFileTypeDto[];
+    /** 鎬荤殑棰濆琛ュ厖鏉愭枡 */
+    extraListFiles?: CustomerUploadMonthApplyFileTypeDto[];
   }
 
   interface ParkBountyApplyBatchFinanceInput {
diff --git a/src/utils/request/index.ts b/src/utils/request/index.ts
index 3c654d4..3ebb819 100644
--- a/src/utils/request/index.ts
+++ b/src/utils/request/index.ts
@@ -170,7 +170,6 @@
   requestInterceptors: [
     [
       (config) => {
-        console.log('req config: ', config);
         const $config = config;
         // 寮�鍚繘搴︽潯鍔ㄧ敾
         if (config.needNProcess) {
diff --git a/src/views/MaterialReview/MaterialReview.vue b/src/views/MaterialReview/MaterialReview.vue
index 1d6b544..15f6a7c 100644
--- a/src/views/MaterialReview/MaterialReview.vue
+++ b/src/views/MaterialReview/MaterialReview.vue
@@ -110,7 +110,7 @@
   },
   {
     id: '7',
-    enCode: 'a',
+    enCode: 'outCheckAuditOperator',
     name: '瀹℃牳浜�',
   },
   {
diff --git a/src/views/MaterialReview/MaterialReviewAudit.vue b/src/views/MaterialReview/MaterialReviewAudit.vue
index 6c5eb87..b31b81e 100644
--- a/src/views/MaterialReview/MaterialReviewAudit.vue
+++ b/src/views/MaterialReview/MaterialReviewAudit.vue
@@ -2,7 +2,7 @@
   <LoadingLayout>
     <AppContainer>
       <PageFormLayout title="鐢虫姤瀹℃牳">
-        <DetailView :form="form" :has-form="true">
+        <DetailView :form="form" :has-form="true" :isEdit="false">
           <ChunkCellV2 title="鐢虫姤浼佷笟鍚嶅崟" class="chunk-cell-table">
             <DeclareEnterpriseTableView
               :getList="getList"
@@ -16,7 +16,8 @@
               v-bind="dialogProps"
               :show-upload-btn="false"
               :show-delete-btn="false"
-              :show-check-btn="false"
+              showMaterialExtraFileUploadBtn
+              showMaterialExtraFileDeleteBtn
             />
           </ChunkCellV2>
           <ChunkCell>
@@ -114,21 +115,25 @@
   settleSumAmount: 0,
   parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
   calculationFileList: [] as CustomerApplyFileTypeListItem[],
+  extraListFiles: [] as CustomerApplyFileTypeListItem[],
 
   status: '' as any as BountyCheckStatusEnum,
   remark: '',
 
   suportPlatRecharge: false,
+  suportFinance: false,
 });
 
 const { addRewardApplyStep3Columns } = useAddRewardApplyStep3Columns({
   suportPlatRecharge: toRef(form, 'suportPlatRecharge'),
+  suportFinance: toRef(form, 'suportFinance'),
 });
 
 const { extraParamState, getList, reset, proTableProps, operationBtns, dialogProps } =
   useDeclareEnterpriseTable({
     id: ref(id),
     applyMonth: toRef(form, 'applyMonth'),
+    enableUploadExtraFiles: true,
   });
 
 const { data: detail, isLoading } = useQuery({
@@ -156,8 +161,12 @@
     form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
       data.collectCountListFiles
     );
+    form.extraListFiles = EnterpriseApplyFileUtils.convertApiFileToExtraListFiles(
+      data.extraListFiles
+    );
 
     form.suportPlatRecharge = data.suportPlatRecharge;
+    form.suportFinance = data.suportFinance;
 
     getList();
   },
@@ -188,6 +197,7 @@
       parkBountyApplyId: id,
       outCheckStatus: form.status,
       remark: form.remark,
+      extraListFiles: EnterpriseApplyFileUtils.convertFileTableListToApiBatch(form.extraListFiles),
     };
     let res = await parkBountyApplyServices.outcheckParkBountyApply(params);
     if (res) {
diff --git a/src/views/MaterialReview/MaterialReviewDetail.vue b/src/views/MaterialReview/MaterialReviewDetail.vue
index 5bf5369..1b3d8e9 100644
--- a/src/views/MaterialReview/MaterialReviewDetail.vue
+++ b/src/views/MaterialReview/MaterialReviewDetail.vue
@@ -31,7 +31,6 @@
               v-bind="dialogProps"
               :show-upload-btn="false"
               :show-delete-btn="false"
-              :show-check-btn="false"
             />
           </ChunkCellV2>
         </DetailView>
@@ -87,14 +86,18 @@
   parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
   calculationFileList: [] as CustomerApplyFileTypeListItem[],
 
+  extraListFiles: [] as CustomerApplyFileTypeListItem[],
+
   outCheckStatus: '' as any as BountyCheckStatusEnum,
   outCheckRemark: '',
 
   suportPlatRecharge: false,
+  suportFinance: false,
 });
 
 const { addRewardApplyStep3Columns } = useAddRewardApplyStep3Columns({
   suportPlatRecharge: toRef(form, 'suportPlatRecharge'),
+  suportFinance: toRef(form, 'suportFinance'),
 });
 
 const { extraParamState, getList, reset, proTableProps, operationBtns, dialogProps } =
@@ -132,8 +135,12 @@
     form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
       data.collectCountListFiles
     );
+    form.extraListFiles = EnterpriseApplyFileUtils.convertApiFileToExtraListFiles(
+      data.extraListFiles
+    );
 
     form.suportPlatRecharge = data.suportPlatRecharge;
+    form.suportFinance = data.suportFinance;
 
     getList();
   },
diff --git a/src/views/Reward/RewardDeclareDetail.vue b/src/views/Reward/RewardDeclareDetail.vue
index 6e9d5c5..28e9717 100644
--- a/src/views/Reward/RewardDeclareDetail.vue
+++ b/src/views/Reward/RewardDeclareDetail.vue
@@ -16,7 +16,6 @@
               v-bind="dialogProps"
               :show-upload-btn="false"
               :show-delete-btn="false"
-              :show-check-btn="false"
             />
           </ChunkCellV2>
         </DetailView>
@@ -61,11 +60,14 @@
   settleSumAmount: 0,
   parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
   calculationFileList: [] as CustomerApplyFileTypeListItem[],
+  extraListFiles: [] as CustomerApplyFileTypeListItem[],
   suportPlatRecharge: false,
+  suportFinance: false,
 });
 
 const { addRewardApplyStep3Columns } = useAddRewardApplyStep3Columns({
   suportPlatRecharge: toRef(form, 'suportPlatRecharge'),
+  suportFinance: toRef(form, 'suportFinance'),
 });
 
 const { extraParamState, getList, reset, proTableProps, operationBtns, dialogProps } =
@@ -99,7 +101,11 @@
     form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
       data.collectCountListFiles
     );
+    form.extraListFiles = EnterpriseApplyFileUtils.convertApiFileToExtraListFiles(
+      data.extraListFiles
+    );
     form.suportPlatRecharge = data.suportPlatRecharge;
+    form.suportFinance = data.suportFinance;
 
     getList();
   },
diff --git a/src/views/Reward/RewardGrant.vue b/src/views/Reward/RewardGrant.vue
index ced8dc8..3a18a2b 100644
--- a/src/views/Reward/RewardGrant.vue
+++ b/src/views/Reward/RewardGrant.vue
@@ -189,7 +189,7 @@
   },
   {
     id: '11',
-    enCode: 'a',
+    enCode: 'settleAndFinanceOperator',
     name: '鐧昏浜�',
   },
 ];
diff --git a/src/views/Reward/RewardGrantRegister.vue b/src/views/Reward/RewardGrantRegister.vue
index 98939eb..bd2dfa9 100644
--- a/src/views/Reward/RewardGrantRegister.vue
+++ b/src/views/Reward/RewardGrantRegister.vue
@@ -71,7 +71,7 @@
   SettleStatusEnum,
   TransferFileEnumInRewardGrandText,
 } from '@/constants';
-import { useDeclareEnterpriseTable, rewardGrantRegisterColumns } from '@/hooks';
+import { useDeclareEnterpriseTable, useRewardGrantRegisterColumns } from '@/hooks';
 import { TransferFileEnumInRewardGrandTableItem } from '@/components/commonView/types';
 import RegisterGrantDialog from './components/RegisterGrantDialog.vue';
 import BatchRegisterDialog from './components/BatchRegisterDialog.vue';
@@ -97,9 +97,13 @@
   settleSumAmount: 0,
   parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
   calculationFileList: [] as CustomerApplyFileTypeListItem[],
+  extraListFiles: [] as CustomerApplyFileTypeListItem[],
 
   suportPlatRecharge: false,
+  suportFinance: false,
 });
+
+const { rewardGrantRegisterColumns } = useRewardGrantRegisterColumns();
 
 const { extraParamState, paginationState, getList, reset, proTableProps } =
   useDeclareEnterpriseTable({
@@ -160,7 +164,11 @@
     form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
       data.collectCountListFiles
     );
+    form.extraListFiles = EnterpriseApplyFileUtils.convertApiFileToExtraListFiles(
+      data.extraListFiles
+    );
     form.suportPlatRecharge = data.suportPlatRecharge;
+    form.suportFinance = data.suportFinance;
 
     getList();
   },
@@ -192,6 +200,7 @@
     amount: 0,
     showSuportPlatRecharge: false,
     showSuportFiscalRecharge: false,
+    // showSuportFinance: false,
   },
 });
 
@@ -200,7 +209,8 @@
     incomeType: '' as any as IncomeTypeEnum,
     fileUrl: [] as UploadUserFile[],
     showSuportPlatRecharge: row.settleStatus === SettleStatusEnum.WaitForSettle,
-    showSuportFiscalRecharge: row.financeStatus === FinanceStatusEnum.WaitForIncome,
+    showSuportFiscalRecharge:
+      form.suportFinance && row.financeStatus === FinanceStatusEnum.WaitForIncome,
     parkBountyApplyId: row.parkBountyApplyId,
     parkBountyApplyDetailId: row.parkBountyApplyDetailId,
     amount: 0,
@@ -297,6 +307,7 @@
     handleBatchRegisterAdd({
       parkBountyApplyId: id,
       showSuportPlatRecharge: form.suportPlatRecharge,
+      showSuportFiscalRecharge: form.suportFinance,
     });
   } catch (error) {}
 }
@@ -311,9 +322,10 @@
     parkBountyApplyDetailIds: [] as string[],
     amount: 0,
     companyList: [] as API.GetNotTransferCompanyNameListOutput[],
-    incomeType: IncomeTypeEnum.Fiscal,
+    incomeType: '' as any as IncomeTypeEnum,
     parkBountyApplyId: '',
     showSuportPlatRecharge: false,
+    showSuportFiscalRecharge: false,
 
     fileUrl: [] as UploadUserFile[],
   },
diff --git a/src/views/Reward/components/BatchRegisterDialog.vue b/src/views/Reward/components/BatchRegisterDialog.vue
index 8154554..872ed88 100644
--- a/src/views/Reward/components/BatchRegisterDialog.vue
+++ b/src/views/Reward/components/BatchRegisterDialog.vue
@@ -22,7 +22,12 @@
           />
         </div>
       </ProFormItemV2>
-      <ProFormItemV2 label="鐧昏绫诲瀷:" prop="incomeType" required>
+      <ProFormItemV2
+        label="鐧昏绫诲瀷:"
+        prop="incomeType"
+        required
+        :check-rules="[{ message: '璇烽�夋嫨鐧昏绫诲瀷' }]"
+      >
         <ProFormRadio
           v-model="form.incomeType"
           :value-enum="incomeTypeEnum"
@@ -102,6 +107,7 @@
   incomeType: IncomeTypeEnum;
   parkBountyApplyId: string;
   showSuportPlatRecharge: boolean;
+  showSuportFiscalRecharge: boolean;
 
   fileUrl: UploadUserFile[];
 };
@@ -110,7 +116,7 @@
 
 const incomeTypeEnum = computed(() => {
   return [
-    {
+    form.value.showSuportFiscalRecharge && {
       label: IncomeTypeEnumText[IncomeTypeEnum.Fiscal],
       value: IncomeTypeEnum.Fiscal,
     },
diff --git a/src/views/Reward/components/RewardApplyTradeCheckDialog.vue b/src/views/Reward/components/RewardApplyTradeCheckDialog.vue
index 59deac6..01af4df 100644
--- a/src/views/Reward/components/RewardApplyTradeCheckDialog.vue
+++ b/src/views/Reward/components/RewardApplyTradeCheckDialog.vue
@@ -56,12 +56,14 @@
             prop="payAuditFileUrl"
             :required="!isApplyTrade"
             :check-rules="
-              !isApplyTrade && [
-                {
-                  message: '璇蜂笂浼犲嚟璇�',
-                  type: 'upload',
-                },
-              ]
+              !isApplyTrade
+                ? [
+                    {
+                      message: '璇蜂笂浼犲嚟璇�',
+                      type: 'upload',
+                    },
+                  ]
+                : undefined
             "
           >
             <ProFormUpload

--
Gitblit v1.9.1