wupengfei
2025-05-06 e9dda9e6c52cb737267185f5118ded73c0053115
feat: 接口
16个文件已修改
3个文件已添加
1093 ■■■■ 已修改文件
src/components/commonView/DetailView.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/FourStreamsMaterialFileDialogV2.vue 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/FourStreamsMaterialFileTable.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/FourStreamsMaterialFileTableV2.vue 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/MateriaDetailDialog.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/MaterialInfoView.vue 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/types.ts 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/utils/index.ts 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/fourStreams.ts 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/reward.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/EnterpriseApplyFile.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/ParkBountyApply.ts 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EnterpriseInfo/components/RewardGrantRecordView.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReviewAudit.vue 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReviewDetail.vue 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/RewardDeclareDetail.vue 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/RewardGrant.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
  };
};
src/components/commonView/FourStreamsMaterialFileDialogV2.vue
New file
@@ -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>
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;
src/components/commonView/FourStreamsMaterialFileTableV2.vue
New file
@@ -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>
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');
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[];
  };
};
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;
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';
      });
    });
  }
}
src/constants/fourStreams.ts
New file
@@ -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;
src/constants/index.ts
@@ -12,3 +12,4 @@
export * from './dic';
export * from './enterpriseMaterial';
export * from './reward';
export * from './fourStreams';
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 {
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,
src/services/api/ParkBountyApply.ts
@@ -47,6 +47,21 @@
  });
}
/** 此处后端没有提供注释 GET /api/ParkBountyApply/DeleteParkEnterpriseApplyFile */
export async function deleteParkEnterpriseApplyFile(
  // 叠加生成的Param类型 (非body参数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(
  // 叠加生成的Param类型 (非body参数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,
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;
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';
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>
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() {
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() {
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,
    },
  },
  {