6bac509f8e6efc205d9f37a84c9b019ec828467a..763bec8077191e42a779e8f77e5126e5dd09b27f
8 天以前 wupengfei
feat: 接口
763bec 对比 | 目录
8 天以前 wupengfei
feat: 接口
aea28d 对比 | 目录
8 天以前 wupengfei
feat: 接口
96e58f 对比 | 目录
8个文件已添加
16个文件已修改
1884 ■■■■■ 已修改文件
src/components/Table/PortraitTableWithAttachment.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/DetailView.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/MaterialInfoView.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/SettlementMaterialInfoView.vue 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/common.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/reward.ts 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/portraitTable.ts 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/EnterpriseApplyFile.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/ParkBountyApply.ts 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EnterpriseInfo/EnterpriseInfo.vue 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EnterpriseInfo/EnterpriseInfoDetail.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EnterpriseInfo/components/WithdrawalRecordView.vue 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReviewAudit.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReviewDetail.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/RewardDeclareDetail.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/RewardGrant.vue 250 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/WithdrawalApproval.vue 240 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/components/RegisterDialog.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/components/UploadCertRewardDialog.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/components/WithdrawalApprovalAuditDialog.vue 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Table/PortraitTableWithAttachment.vue
New file
@@ -0,0 +1,72 @@
<template>
  <PortraitTable v-bind="portraitTableProps" :label-width="labelWidth"> </PortraitTable>
  <div class="enclosure-list-title">附件列表</div>
  <ProTableV2
    :table-data="annexList"
    :columns="CommonAnnexTableColumns"
    :operation-btns="operationListBtns"
    :show-pagination="false"
    :show-no-data="false"
    :auto-height="false"
    :show-table-column-setting="false"
    :table-props="{ maxHeight: '400px' }"
    :column-render-map="columnsRenderProps"
  >
  </ProTableV2>
</template>
<script setup lang="ts" generic="TAnnexItem">
import { downloadFileByUrl } from '@bole-core/core';
import { CommonAnnexTableColumns } from '@/constants';
import { ProTableV2, ProTableV2Props } from '@bole-core/components';
defineOptions({
  name: 'PortraitTableWithAttachment',
});
type Props = {
  annexList: TAnnexItem[];
  customDownLoad?: (row: TAnnexItem) => Promise<any>;
  labelWidth?: string;
  portraitTableProps: any;
  columnsRenderProps?: ProTableV2Props['columnRenderMap'];
  downloadFileKey?: keyof TAnnexItem;
};
const props = withDefaults(defineProps<Props>(), {
  labelWidth: '180px',
  columnsRenderProps: () => ({}),
  downloadFileKey: 'url' as any,
});
const operationListBtns = [
  {
    data: {
      enCode: 'downloadBtn',
      name: '下载',
    },
    emits: {
      onClick: (row) => handleDownload(row),
    },
  },
];
function handleDownload(row: TAnnexItem) {
  if (props.customDownLoad) {
    props.customDownLoad(row);
  } else {
    downloadFileByUrl(row[props.downloadFileKey] as any);
  }
}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.enclosure-list-title {
  padding: 16px 0;
  font-size: 14px;
  color: getCssVar('text-color', 'primary');
  line-height: 19px;
}
</style>
src/components/commonView/DetailView.vue
@@ -34,10 +34,12 @@
    applyMonth: string;
    applySumAmount: number;
    /** 奖励金分配表 */
    bountyAssignFileUlr: UploadUserFile[];
    // bountyAssignFileUlr: UploadUserFile[];
    /** 奖励金汇总表 */
    bountyCollectFileUrl: UploadUserFile[];
    // bountyCollectFileUrl: UploadUserFile[];
    parkCollectFileList: CustomerApplyFileTypeListItem[];
    /**汇算材料 */
    calculationFileList: CustomerApplyFileTypeListItem[];
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
  };
src/components/commonView/MaterialInfoView.vue
@@ -1,10 +1,7 @@
<template>
  <!-- <ProFormCol>
    <ProFormColItem :span="12"> -->
  <ProFormItemV2
    :label="`${item.fileTypeName}:`"
    :prop="`parkCollectFileList.${index}.listFiles`"
    :check-rules="[{ message: `请上传${item.fileTypeName}`, type: 'upload' }]"
    :label-width="160"
    :style="{ marginBottom: index === form.parkCollectFileList.length - 1 ? 0 : '22px' }"
    v-for="(item, index) in form.parkCollectFileList"
@@ -18,18 +15,10 @@
      accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
    ></ProFormUpload>
  </ProFormItemV2>
  <!-- </ProFormColItem>
  </ProFormCol> -->
</template>
<script setup lang="ts">
import {
  ProFormCol,
  ProFormColItem,
  ProFormItemV2,
  ProFormUpload,
  UploadUserFile,
} from '@bole-core/components';
import { ProFormItemV2, ProFormUpload } from '@bole-core/components';
import { CustomerApplyFileTypeListItem } from './utils';
defineOptions({
src/components/commonView/SettlementMaterialInfoView.vue
@@ -1,46 +1,34 @@
<template>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="本次申报奖励金总额:" prop="applySumAmount">
        <ProFormInputNumber v-model="form.applySumAmount" formatValue="money" unit="元" />
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2
        label="奖励金分配明细表:"
        prop="bountyAssignFileUlr"
        style="margin-bottom: 22px"
      >
        <ProFormUpload
          v-model:file-url="form.bountyAssignFileUlr"
          :limitShowViewMoreBtnCount="4"
        ></ProFormUpload>
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="奖励金汇总表:" prop="bountyCollectFileUrl">
        <ProFormUpload
          v-model:file-url="form.bountyCollectFileUrl"
          :limitShowViewMoreBtnCount="4"
        ></ProFormUpload>
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
  <ProFormItemV2 label="本次申报奖励金总额:" prop="applySumAmount">
    <ProFormInputNumber v-model="form.applySumAmount" formatValue="money" unit="元" />
  </ProFormItemV2>
  <ProFormItemV2
    :label="`${item.fileTypeName}:`"
    :prop="`calculationFileList.${index}.listFiles`"
    :label-width="160"
    :style="{ marginBottom: index === form.calculationFileList.length - 1 ? 0 : '22px' }"
    v-for="(item, index) in form.calculationFileList"
    :key="item.fileSearchTypeId"
  >
    <ProFormUpload
      v-model:file-url="item.listFiles"
      :limit="1"
      :limitFileSize="50"
      :showTip="false"
      :limitShowViewMoreBtnCount="4"
      accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
    ></ProFormUpload>
  </ProFormItemV2>
</template>
<script setup lang="ts">
import {
  ProFormCol,
  ProFormColItem,
  ProFormItemV2,
  ProFormUpload,
  UploadUserFile,
  ProFormInputNumber,
} from '@bole-core/components';
import { CustomerApplyFileTypeListItem } from './utils';
defineOptions({
  name: 'SettlementMaterialInfoView',
@@ -49,8 +37,7 @@
type Props = {
  form: {
    applySumAmount: number;
    bountyAssignFileUlr: UploadUserFile[];
    bountyCollectFileUrl: UploadUserFile[];
    calculationFileList: CustomerApplyFileTypeListItem[];
  };
};
src/constants/common.ts
New file
@@ -0,0 +1,9 @@
import { defineColumns } from '@bole-core/components';
export const CommonAnnexTableColumns = defineColumns([
  {
    id: '1',
    enCode: 'name',
    name: '文件名',
  },
]);
src/constants/index.ts
@@ -1,4 +1,5 @@
export * from './enum';
export * from './common';
export * from './oss';
export * from './module';
export * from './editor';
src/constants/reward.ts
@@ -46,6 +46,10 @@
   */
  HasSettle = 2,
  /**
   * 已上传凭证
   */
  HasBill = 3,
  /**
   * 无需充值
   */
  NoNeed = -1,
@@ -55,6 +59,17 @@
  [SettleStatusEnum.WaitForSettle]: '待充值',
  [SettleStatusEnum.HasSettle]: '已充值',
  [SettleStatusEnum.NoNeed]: '无需充值',
};
export const SettleStatusEnumTextV2Query = {
  [SettleStatusEnum.WaitForSettle]: '待登记',
  [SettleStatusEnum.HasSettle]: '已登记',
};
export const SettleStatusEnumTextV2 = {
  [SettleStatusEnum.WaitForSettle]: '待登记',
  [SettleStatusEnum.HasSettle]: '已登记',
  [SettleStatusEnum.HasBill]: '已登记',
  [SettleStatusEnum.NoNeed]: '无需登记',
};
export enum FinanceStatusEnum {
@@ -66,11 +81,26 @@
   * 已拨付
   */
  HasIncome = 2,
  /**
   * 已上传凭证
   */
  HasBill = 3,
}
export const FinanceStatusEnumText = {
  [FinanceStatusEnum.WaitForIncome]: '待拨付',
  [FinanceStatusEnum.HasIncome]: '已拨付',
};
export const FinanceStatusEnumTextV2 = {
  [FinanceStatusEnum.WaitForIncome]: '待登记',
  [FinanceStatusEnum.HasIncome]: '已登记',
  [FinanceStatusEnum.HasBill]: '已登记',
};
export const FinanceStatusEnumTextV2Query = {
  [FinanceStatusEnum.WaitForIncome]: '待登记',
  [FinanceStatusEnum.HasIncome]: '已登记',
};
export enum IncomeStatusEnum {
@@ -100,3 +130,50 @@
  [EnterpriseBountyPayTypeEnum.PayOut]: '出金',
  [EnterpriseBountyPayTypeEnum.PayIn]: '入金',
};
export enum IncomeTypeEnum {
  /**财政拨付 */
  Fiscal = 10,
  /**平台充值 */
  Platform = 20,
}
export const IncomeTypeEnumText = {
  [IncomeTypeEnum.Fiscal]: '财政拨付',
  [IncomeTypeEnum.Platform]: '平台充值',
};
export enum EnterpriseRechargeStatusEnum {
  /**待审核 */
  WaitCheck = 10,
  /**审核通过 */
  CheckPassed = 20,
  /**驳回 */
  CheckReject = 30,
}
export const EnterpriseRechargeStatusEnumText = {
  [EnterpriseRechargeStatusEnum.WaitCheck]: '待审核',
  [EnterpriseRechargeStatusEnum.CheckPassed]: '审核通过',
  [EnterpriseRechargeStatusEnum.CheckReject]: '驳回',
};
export const EnterpriseRechargeStatusEnumTextForAdudit = {
  [EnterpriseRechargeStatusEnum.CheckPassed]: '通过',
  [EnterpriseRechargeStatusEnum.CheckReject]: '驳回',
};
export enum BillStatusEnum {
  /**未上传 */
  NotUpload = 10,
  /**待完善 */
  NeedUpload = 20,
  /**已上传 */
  HasUpload = 30,
}
export const BillStatusEnumText = {
  [BillStatusEnum.NotUpload]: '未上传',
  [BillStatusEnum.NeedUpload]: '待完善',
  [BillStatusEnum.HasUpload]: '已上传',
};
src/hooks/index.ts
@@ -3,6 +3,7 @@
export * from './useAccess';
export * from './useRouteView';
// export * from './useArea';
export * from './portraitTable';
export * from './useEvent';
export * from './useUser';
export * from './help';
src/hooks/portraitTable.ts
New file
@@ -0,0 +1,50 @@
import { ColumnsRenderProps } from '@bole-core/components';
import { MaybeRef } from 'vue';
export type UsePortraitTableColumnsItem<TData extends object = object> = ColumnsRenderProps & {
  label?: string;
  key?: keyof TData;
};
export type UsePortraitTableOptions<TData extends object> = {
  data: Ref<TData>;
  columns?: UsePortraitTableColumnsItem<TData>[];
};
export function usePortraitTable<TData extends object>(options: UsePortraitTableOptions<TData>) {
  const portraitTableProps = computed(
    () =>
      ({
        data: options.data.value,
        columns: options.columns ?? [],
      } as any)
  );
  return {
    portraitTableProps,
  };
}
type UsePortraitTableWithAttachmentOptions<
  TData extends object,
  TAnnexItem extends object = object
> = UsePortraitTableOptions<TData> & {
  annexList: Ref<TAnnexItem[]>;
  columnsRenderProps?: { [key in keyof TAnnexItem]?: ColumnsRenderProps };
};
export function usePortraitTableWithAttachment<
  TData extends object,
  TAnnexItem extends object = object
>(options: UsePortraitTableWithAttachmentOptions<TData, TAnnexItem>) {
  const { annexList, columnsRenderProps } = options;
  const { portraitTableProps } = usePortraitTable(options);
  const portraitTableWithAttachmentProps = computed(() => ({
    annexList: annexList.value,
    portraitTableProps: portraitTableProps.value,
    columnsRenderProps,
  }));
  return { portraitTableWithAttachmentProps };
}
src/router/index.ts
@@ -205,7 +205,7 @@
        component: () => import('@/views/Reward/RewardGrant.vue'),
        meta: {
          rank: 10031,
          title: '奖励发放',
          title: '奖励发放登记',
          // rootMenu: true,
          icon: 'home',
        },
@@ -221,6 +221,19 @@
          rootMenu: false,
        },
      },
      {
        path: '/WithdrawalApproval',
        name: 'WithdrawalApproval',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/Reward/WithdrawalApproval.vue'),
        meta: {
          rank: 10033,
          title: '提现审批',
          // rootMenu: true,
          icon: 'home',
        },
      },
    ],
  },
  // {
src/services/api/EnterpriseApplyFile.ts
@@ -2,6 +2,21 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 批量引用企业资料 GET /api/EnterpriseApplyFile/BatchQuoteEnterpriseApplyFile */
export async function batchQuoteEnterpriseApplyFile(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIbatchQuoteEnterpriseApplyFileParams,
  options?: API.RequestConfig
) {
  return request<number>('/api/EnterpriseApplyFile/BatchQuoteEnterpriseApplyFile', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
/** 确认提交材料上传 POST /api/EnterpriseApplyFile/CustomerUploadMonthApplyFile */
export async function customerUploadMonthApplyFile(
  body: API.CustomerUploadMonthApplyFileInput,
src/services/api/ParkBountyApply.ts
@@ -32,6 +32,21 @@
  });
}
/** 提现审核 POST /api/ParkBountyApply/CheckEnterpriseApplyDrawWith */
export async function checkEnterpriseApplyDrawWith(
  body: API.CheckEnterpriseApplyDrawWithInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/ParkBountyApply/CheckEnterpriseApplyDrawWith', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 预充值审核 POST /api/ParkBountyApply/CheckUserEnterpriseRecharge */
export async function checkUserEnterpriseRecharge(
  body: API.CheckUserEnterpriseRechargeInput,
@@ -77,6 +92,21 @@
  });
}
/** 客户端-申请提现 POST /api/ParkBountyApply/EnterpriseApplyDrawWith */
export async function enterpriseApplyDrawWith(
  body: API.EnterpriseApplyDrawWithInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/ParkBountyApply/EnterpriseApplyDrawWith', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 获取可选择公司和已剔除公司 POST /api/ParkBountyApply/GetCompanyNameList */
export async function getCompanyNameList(
  body: API.GetCompanyNameListInput,
@@ -99,6 +129,42 @@
) {
  return request<API.GetParkBountyApplyListOutputPageOutput>(
    '/api/ParkBountyApply/GetCustmoerParkBountyApplyList',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** 获取提现申请详情 GET /api/ParkBountyApply/GetEnterpriseDrawWithDetail */
export async function getEnterpriseDrawWithDetail(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetEnterpriseDrawWithDetailParams,
  options?: API.RequestConfig
) {
  return request<API.GetEnterpriseDrawWithDetailOutput>(
    '/api/ParkBountyApply/GetEnterpriseDrawWithDetail',
    {
      method: 'GET',
      params: {
        ...params,
      },
      ...(options || {}),
    }
  );
}
/** 获取提现申请记录列表 POST /api/ParkBountyApply/GetEnterpriseDrawWithList */
export async function getEnterpriseDrawWithList(
  body: API.GetEnterpriseDrawWithListInput,
  options?: API.RequestConfig
) {
  return request<API.GetEnterpriseDrawWithListOutputPageOutput>(
    '/api/ParkBountyApply/GetEnterpriseDrawWithList',
    {
      method: 'POST',
      headers: {
@@ -168,6 +234,21 @@
) {
  return request<API.GetEnterprisePreChargeCheckListOutputPageOutput>(
    '/api/ParkBountyApply/GetEnterprisePreChargeCheckList',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** 获取充值记录列表 POST /api/ParkBountyApply/GetEnterprisePrechargeList */
export async function getEnterprisePrechargeList(body: API.PageInput, options?: API.RequestConfig) {
  return request<API.GetEnterprisePrechargeListOutputPageOutput>(
    '/api/ParkBountyApply/GetEnterprisePrechargeList',
    {
      method: 'POST',
      headers: {
@@ -508,13 +589,31 @@
  );
}
/** 运营端一园区客户管理详情一奖励金发放记录 POST /api/ParkBountyApply/GetParkCustomerBountyGrantList */
export async function getParkCustomerBountyGrantList(
/** 拨付记录 POST /api/ParkBountyApply/GetParkCustomerBountyFinanceList */
export async function getParkCustomerBountyFinanceList(
  body: API.QueryParkCustomerBountyApplyInput,
  options?: API.RequestConfig
) {
  return request<API.GetParkCustomerBountyGrantOutputPageOutput>(
    '/api/ParkBountyApply/GetParkCustomerBountyGrantList',
  return request<API.GetParkCustomerBountyFinanceOutputPageOutput>(
    '/api/ParkBountyApply/GetParkCustomerBountyFinanceList',
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      data: body,
      ...(options || {}),
    }
  );
}
/** 运营端一园区客户管理详情一奖励金发放记录 POST /api/ParkBountyApply/GetParkCustomerBountySettleList */
export async function getParkCustomerBountySettleList(
  body: API.QueryParkCustomerBountyApplyInput,
  options?: API.RequestConfig
) {
  return request<API.GetParkCustomerBountySettleOutputPageOutput>(
    '/api/ParkBountyApply/GetParkCustomerBountySettleList',
    {
      method: 'POST',
      headers: {
@@ -649,6 +748,21 @@
  });
}
/** 上传财政拨付登记金额 POST /api/ParkBountyApply/ParkBountyApplyFinanceBillAmount */
export async function parkBountyApplyFinanceBillAmount(
  body: API.ParkBountyApplyFinanceFileInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/ParkBountyApply/ParkBountyApplyFinanceBillAmount', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 财政入账上传凭证 POST /api/ParkBountyApply/ParkBountyApplyFinanceFile */
export async function parkBountyApplyFinanceFile(
  body: API.ParkBountyApplyRechargeFileInput,
@@ -679,6 +793,21 @@
  });
}
/** 上传充值登记金额 POST /api/ParkBountyApply/ParkBountyApplySettleAmount */
export async function parkBountyApplySettleAmount(
  body: API.ParkBountyApplySettleInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/ParkBountyApply/ParkBountyApplySettleAmount', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 运营端—奖励金-出账 POST /api/ParkBountyApply/ParkBountyApplyTrade */
export async function parkBountyApplyTrade(
  body: API.CreateParkBountyTradeInput,
src/services/api/typings.d.ts
@@ -235,6 +235,8 @@
    suportEnterpriseUpload?: boolean;
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
    /** 是否支持用户提现 */
    suportWithDraw?: boolean;
    /** 文件 */
    industrialParkApplyFileFile?: IndustrialParkApplyFileFile[];
  }
@@ -958,6 +960,10 @@
    productId?: string;
  }
  interface APIbatchQuoteEnterpriseApplyFileParams {
    parkBountyApplyId?: string;
  }
  interface APIcalculationWalletBatchImportTempPayFeeParams {
    walletAccountType?: WalletAccountTypeEnum;
  }
@@ -1352,6 +1358,10 @@
  interface APIgetElecBillInfoParams {
    transactionDetailId?: string;
  }
  interface APIgetEnterpriseDrawWithDetailParams {
    drawWithId?: string;
  }
  interface APIgetEnterpriseLastUploadEnterPactFileNewParams {
@@ -2725,6 +2735,8 @@
  type BestSignUserSignStatusEunm = 1 | 5 | 10 | 20 | 30 | 40 | 50 | 90;
  type BillStatusEnum = 10 | 20 | 30;
  interface BindUserEmailInput {
    /** 邮箱 */
    bindEmailAddress: string;
@@ -3022,6 +3034,14 @@
    circleFriendReplyId?: string;
    /** 审核状态 通过:10 驳回:-10 */
    status?: number;
  }
  interface CheckEnterpriseApplyDrawWithInput {
    applyDrawWithId?: string;
    checkStatus?: EnterpriseRechargeStatusEnum;
    /** 提现凭证 */
    checkFileUrl?: string;
    checkRemark?: string;
  }
  interface CheckInsureCityIsAllowInput {
@@ -5648,6 +5668,11 @@
    freeCount?: number;
  }
  interface EnterpriseApplyDrawWithInput {
    amount?: number;
    invoiceUrl?: string;
  }
  interface EnterpriseBatchRefundInput {
    guid?: string;
    listOrderNo?: number[];
@@ -5739,6 +5764,8 @@
  type EnterpriseMonthApplyStatusEnum = 10 | 20;
  type EnterpriseMonthUploadStatusEnum = 10 | 20 | 30;
  type EnterprisePrechargeInComeStatusEnum = 10 | 20;
  type EnterpriseRechargeStatusEnum = 10 | 20 | 30;
@@ -5967,7 +5994,7 @@
    fileId?: string;
  }
  type FinanceStatusEnum = 1 | 2;
  type FinanceStatusEnum = 1 | 2 | 3;
  type FinanceTypeEnum = 10 | 20;
@@ -6823,6 +6850,57 @@
    data?: GetEnterpriseCredentialDataResponse;
  }
  interface GetEnterpriseDrawWithDetailOutput {
    id?: string;
    enterpriseId?: string;
    enterpriseName?: string;
    societyCreditCode?: string;
    creationTime?: string;
    accountName?: string;
    bankNumber?: string;
    bankName?: string;
    bankResumeName?: string;
    amount?: number;
    remainAmount?: number;
    invoiceUrl?: string;
    checkStatus?: EnterpriseRechargeStatusEnum;
    checkTime?: string;
    checkUserId?: string;
    checkRemark?: string;
    checkFileUrl?: string;
  }
  interface GetEnterpriseDrawWithListInput {
    pageModel?: Pagination;
    keyWord?: string;
    beginDateTime?: string;
    endDateTime?: string;
    checkStatus?: EnterpriseRechargeStatusEnum;
  }
  interface GetEnterpriseDrawWithListOutput {
    drawWithId?: string;
    enterpriseId?: string;
    enterpriseName?: string;
    societyCreditCode?: string;
    creationTime?: string;
    enterpriseType?: string;
    parkName?: string;
    parkType?: string;
    amount?: number;
    remainAmount?: number;
    checkStatus?: EnterpriseRechargeStatusEnum;
    checkTime?: string;
    checkRemark?: string;
    checkFileUrl?: string;
  }
  interface GetEnterpriseDrawWithListOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: GetEnterpriseDrawWithListOutput[];
  }
  interface GetEnterpriseMonthApplyFileOutput {
    id?: string;
    enterpriseId?: string;
@@ -6884,6 +6962,26 @@
    pageModel?: Pagination;
    objectData?: any;
    data?: GetEnterprisePreChargeCheckListOutput[];
  }
  interface GetEnterprisePrechargeListOutput {
    id?: string;
    /** 充值金额 */
    prechargeAmount?: number;
    /** 充值凭证 */
    rechargeVoucherFileUrl?: string;
    /** 审核备注 */
    checkRemark?: string;
    checkStatus?: EnterpriseRechargeStatusEnum;
    inComeStatus?: EnterprisePrechargeInComeStatusEnum;
    /** 提交日期 */
    creationTime?: string;
  }
  interface GetEnterprisePrechargeListOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: GetEnterprisePrechargeListOutput[];
  }
  interface GetEnterpriseRechargeDetail {
@@ -8146,6 +8244,10 @@
    financeTimeEnd?: string;
    /** 入账起始日期 */
    incomeTimeBegin?: string;
    /** 拨付入账结束日期 */
    financeIncomeTimeEnd?: string;
    /** 拨付入账起始日期 */
    financeIncomeTimeBegin?: string;
    /** 入账结束日期 */
    incomeTimeEnd?: string;
    /** 外部审核起始日期 */
@@ -8184,6 +8286,7 @@
    inCheckStatus?: BountyCheckStatusEnum;
    /** 财政入账时间 */
    financeIncomeTime?: string;
    billStatus?: BillStatusEnum;
    financeIncomeStatus?: IncomeStatusEnum;
    /** 内部审核日期 */
    inCheckTime?: string;
@@ -8209,6 +8312,8 @@
    suportEnterpriseUpload?: boolean;
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
    /** 是否支持用户提现 */
    suportWithDraw?: boolean;
  }
  interface GetParkBountyApplyListOutputPageOutput {
@@ -8343,6 +8448,7 @@
    /** 凭证 */
    payFileUrl?: string;
    payFileUrls?: string[];
    financeType?: FinanceTypeEnum;
  }
  interface GetParkCustomerBountyConsumptionOutputPageOutput {
@@ -8351,7 +8457,34 @@
    data?: GetParkCustomerBountyConsumptionOutput[];
  }
  interface GetParkCustomerBountyGrantOutput {
  interface GetParkCustomerBountyFinanceOutput {
    id?: string;
    /** 申请批次号 */
    batchNo?: string;
    /** 申报月份 */
    applyMonth?: string;
    /** 申报总额 */
    applySumAmount?: number;
    /** 财政拨付金额 */
    financeToAmount?: number;
    /** 财政拨付入账时间 */
    financeToTime?: string;
    /** 财政拨付发放日期 */
    financeTime?: string;
    financeToStatus?: FinanceStatusEnum;
    /** 拨付入账凭证 */
    financeToFileUrl?: string;
    inCheckStatus?: BountyCheckStatusEnum;
    outCheckStatus?: BountyCheckStatusEnum;
  }
  interface GetParkCustomerBountyFinanceOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: GetParkCustomerBountyFinanceOutput[];
  }
  interface GetParkCustomerBountySettleOutput {
    id?: string;
    /** 申请批次号 */
    batchNo?: string;
@@ -8368,21 +8501,17 @@
    transferToFileUrl?: string;
    /** 财政拨付金额 */
    financeToAmount?: number;
    /** 财政拨付入账时间 */
    financeToTime?: string;
    /** 财政拨付发放日期 */
    financeTime?: string;
    /** 平台充值发放日期 */
    settleTime?: string;
    financeToStatus?: FinanceStatusEnum;
    /** 拨付入账凭证 */
    financeToFileUrl?: string;
    inCheckStatus?: BountyCheckStatusEnum;
    outCheckStatus?: BountyCheckStatusEnum;
  }
  interface GetParkCustomerBountyGrantOutputPageOutput {
  interface GetParkCustomerBountySettleOutputPageOutput {
    pageModel?: Pagination;
    objectData?: any;
    data?: GetParkCustomerBountyGrantOutput[];
    data?: GetParkCustomerBountySettleOutput[];
  }
  interface GetParkCustomerManageDetailOutput {
@@ -8440,11 +8569,17 @@
    /** 最近申报 */
    lastApplyTime?: string;
    /** 发放次数 */
    payCount?: number;
    financeCount?: number;
    /** 最近发放时间 */
    lastPayTime?: string;
    lastFinanceTime?: string;
    /** 平台充值次数 */
    settleCount?: number;
    /** 最近充值日期 */
    lastSettleTime?: string;
    /** 发放总额 */
    bountySumAmount?: number;
    settleSumAmount?: number;
    /** 充值总额 */
    financeSumAmount?: number;
    /** 奖励金余额 */
    bountyAmount?: number;
  }
@@ -8944,6 +9079,8 @@
    bountyAmount?: number;
    /** 充值余额 */
    rechargeAmount?: number;
    /** 财政拨付余额 */
    financeAmount?: number;
    enterpriseName?: string;
    societyCreditCode?: string;
    licenseUrl?: string;
@@ -9963,6 +10100,8 @@
    suportEnterpriseUpload?: boolean;
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
    /** 是否支持用户提现 */
    suportWithDraw?: boolean;
    /** 注册地址 */
    registerAddress?: string;
    /** 备注 */
@@ -9978,6 +10117,12 @@
    parkTypeId?: string;
    /** 园区类型名称 */
    parkTypeName?: string;
    /** 是否已经启用奖励金申报 */
    rewardEnable?: boolean;
    /** 是否支持企业自主上传 */
    suportEnterpriseUpload?: boolean;
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
  }
  interface IndustrialParkFileTypeOutput {
@@ -10012,6 +10157,8 @@
    suportEnterpriseUpload?: boolean;
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
    /** 是否支持用户提现 */
    suportWithDraw?: boolean;
  }
  interface IndustrialParkListOutputPageOutput {
@@ -14602,7 +14749,10 @@
    suportEnterpriseUpload?: boolean;
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
    /** 是否支持用户提现 */
    suportWithDraw?: boolean;
    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
    collectCountListFiles?: CustomerUploadMonthApplyFileTypeDto[];
  }
  interface OutcheckParkBountyApplyInput {
@@ -14675,6 +14825,7 @@
    /** 财政发放金额 */
    financeSumAmount?: number;
    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
    collectCountListFiles?: CustomerUploadMonthApplyFileTypeDto[];
  }
  interface ParkBountyApplyBatchFinanceInput {
@@ -18107,6 +18258,7 @@
    bountyCollectFileUrl?: string;
    /** 申报总额 */
    applySumAmount?: number;
    listFiles?: CustomerUploadMonthApplyFileTypeDto[];
  }
  interface SaveParkBountyApplyGatherFileInput {
@@ -18504,7 +18656,7 @@
    type?: number;
  }
  type SettleStatusEnum = 1 | 2 | -1;
  type SettleStatusEnum = 1 | 2 | 3 | -1;
  interface SetUserCertificationAuditStatusInput {
    /** 审核Id */
@@ -19726,6 +19878,8 @@
    suportEnterpriseUpload?: boolean;
    /** 是否支持平台充值 */
    suportPlatRecharge?: boolean;
    /** 是否支持用户提现 */
    suportWithDraw?: boolean;
    /** 文件 */
    industrialParkApplyFileFile?: IndustrialParkApplyFileFile[];
    id?: string;
@@ -21287,8 +21441,12 @@
    signatureImageStatus?: number;
    certificationChannel?: UserCertificationChannelEnum;
    industrialParkId?: string;
    industrialParkName?: string;
    suportEnterpriseUpload?: boolean;
    suportPlatRecharge?: boolean;
    rewardEnable?: boolean;
    suportWithDraw?: boolean;
    isHasBountyApply?: boolean;
  }
  interface UserMessageInfo {
src/views/EnterpriseInfo/EnterpriseInfo.vue
@@ -14,7 +14,18 @@
              @change="getList()"
            ></FieldDatePicker>
          </QueryFilterItem>
          <QueryFilterItem tip-content="最近发放日期">
          <QueryFilterItem tip-content="最近拨付日期">
            <FieldDatePicker
              v-model="extraParamState.lastPayTime"
              type="daterange"
              range-separator="~"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              clearable
              @change="getList()"
            ></FieldDatePicker>
          </QueryFilterItem>
          <QueryFilterItem tip-content="最近充值日期">
            <FieldDatePicker
              v-model="extraParamState.lastPayTime"
              type="daterange"
@@ -111,24 +122,42 @@
  },
  {
    id: '8',
    enCode: 'payCount',
    name: '发放次数',
    enCode: 'financeCount',
    name: '财政拨付次数',
    width: 150,
  },
  {
    id: '9',
    enCode: 'lastPayTime',
    name: '最近发放日期',
    enCode: 'lastFinanceTime',
    name: '最近拨付日期',
    width: 180,
  },
  {
    id: '10',
    enCode: 'bountySumAmount',
    name: '发放总额',
    enCode: 'financeSumAmount',
    name: '拨付总额',
    width: 150,
  },
  {
    id: '11',
    enCode: 'settleCount',
    name: '平台充值次数',
    width: 150,
  },
  {
    id: '12',
    enCode: 'lastSettleTime',
    name: '最近充值日期',
    width: 180,
  },
  {
    id: '13',
    enCode: 'settleSumAmount',
    name: '充值总额',
    width: 150,
  },
  {
    id: '14',
    enCode: 'bountyAmount',
    name: '平台充值余额',
    width: 150,
@@ -195,8 +224,10 @@
    },
    columnsRenderProps: {
      lastApplyTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      lastPayTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      bountySumAmount: { type: 'money' },
      lastFinanceTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      financeSumAmount: { type: 'money' },
      lastSettleTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      settleSumAmount: { type: 'money' },
      bountyAmount: { type: 'money' },
      enterpriseType: { type: 'enum', valueEnum: EnterpriseTypeText },
    },
src/views/EnterpriseInfo/EnterpriseInfoDetail.vue
@@ -14,6 +14,9 @@
        <ProTabPane lazy label="消费记录" name="rewardConsumeRecord">
          <RewardConsumeRecordView></RewardConsumeRecordView>
        </ProTabPane>
        <ProTabPane lazy label="提现记录" name="withdrawalRecord">
          <WithdrawalRecordView></WithdrawalRecordView>
        </ProTabPane>
      </ProTabs>
    </AppContainer>
  </LoadingLayout>
@@ -25,6 +28,7 @@
import EnterpriseDeclareRecordView from './components/EnterpriseDeclareRecordView.vue';
import RewardGrantRecordView from './components/RewardGrantRecordView.vue';
import RewardConsumeRecordView from './components/RewardConsumeRecordView.vue';
import WithdrawalRecordView from './components/WithdrawalRecordView.vue';
defineOptions({
  name: 'EnterpriseInfoDetail',
src/views/EnterpriseInfo/components/WithdrawalRecordView.vue
New file
@@ -0,0 +1,118 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppContainer>
      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
        <template #operationBtn-checkBtn="{ data, row }">
          <PreviewBtnV2
            class="pro-table-operation-btn"
            :url="convertApi2FormUrlBySeparator(row.checkFileUrl ?? '')"
            preview-btn-text="查看凭证"
          />
        </template>
      </ProTableV2>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import {
  AppContainer,
  useTable,
  ProTableV2,
  defineOperationBtns,
  PreviewBtnV2,
} from '@bole-core/components';
import { convertApi2FormUrlBySeparator } from '@/utils';
import { OrderInputType } from '@bole-core/core';
import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
import { EnterpriseRechargeStatusEnum } from '@/constants';
defineOptions({
  name: 'WithdrawalRecordView',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'creationTime',
    name: '申请提现日期',
  },
  {
    id: '2',
    enCode: 'checkTime',
    name: '审核通过日期',
  },
  {
    id: '3',
    enCode: 'amount',
    name: '提现金额',
  },
  {
    id: '4',
    enCode: 'remainAmount',
    name: '资金余额',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'checkBtn',
      name: '查看凭证',
    },
  },
]);
const route = useRoute();
const router = useRouter();
const id = route.params.id as string;
const BaseState = {
  loading: true,
};
const state = reactive({ ...BaseState });
const {
  getDataSource: getList,
  proTableProps,
  paginationState,
  extraParamState,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.GetEnterpriseDrawWithListInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        checkStatus: EnterpriseRechargeStatusEnum.CheckPassed,
      };
      let res = await parkBountyApplyServices.getEnterpriseDrawWithList(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }],
    },
    columnsRenderProps: {
      creationTime: { type: 'date', format: 'YYYY-MM-DD' },
      checkTime: { type: 'date', format: 'YYYY-MM-DD' },
      amount: { type: 'money' },
      remainAmount: { type: 'money' },
    },
  }
);
onMounted(async () => {
  await getList();
  state.loading = false;
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/views/MaterialReview/MaterialReviewAudit.vue
@@ -116,12 +116,13 @@
  parkTypeName: '',
  applyMonth: '',
  applySumAmount: 0,
  enterpriseTaxSubFileUrl: [] as UploadUserFile[],
  enterpriseOperateFileUrl: [] as UploadUserFile[],
  enterpriseRelateFileUrl: [] as UploadUserFile[],
  // enterpriseTaxSubFileUrl: [] as UploadUserFile[],
  // enterpriseOperateFileUrl: [] as UploadUserFile[],
  // enterpriseRelateFileUrl: [] as UploadUserFile[],
  // bountyAssignFileUlr: [] as UploadUserFile[],
  // bountyCollectFileUrl: [] as UploadUserFile[],
  parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
  bountyAssignFileUlr: [] as UploadUserFile[],
  bountyCollectFileUrl: [] as UploadUserFile[],
  calculationFileList: [] as CustomerApplyFileTypeListItem[],
  status: '' as any as BountyCheckStatusEnum,
  remark: '',
@@ -144,20 +145,23 @@
    form.parkTypeName = data.parkTypeName;
    form.applyMonth = data.applyMonth;
    form.applySumAmount = data.applySumAmount;
    form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseTaxSubFileUrl
    );
    form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseOperateFileUrl
    );
    form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
    form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
    form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseRelateFileUrl
    );
    // form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseTaxSubFileUrl
    // );
    // form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseOperateFileUrl
    // );
    // form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
    // form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
    // form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseRelateFileUrl
    // );
    form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
      data.listFiles
    );
    form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
      data.collectCountListFiles
    );
    getList();
  },
src/views/MaterialReview/MaterialReviewDetail.vue
@@ -89,12 +89,13 @@
  parkTypeName: '',
  applyMonth: '',
  applySumAmount: 0,
  enterpriseTaxSubFileUrl: [] as UploadUserFile[],
  enterpriseOperateFileUrl: [] as UploadUserFile[],
  enterpriseRelateFileUrl: [] as UploadUserFile[],
  // enterpriseTaxSubFileUrl: [] as UploadUserFile[],
  // enterpriseOperateFileUrl: [] as UploadUserFile[],
  // enterpriseRelateFileUrl: [] as UploadUserFile[],
  // bountyAssignFileUlr: [] as UploadUserFile[],
  // bountyCollectFileUrl: [] as UploadUserFile[],
  parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
  bountyAssignFileUlr: [] as UploadUserFile[],
  bountyCollectFileUrl: [] as UploadUserFile[],
  calculationFileList: [] as CustomerApplyFileTypeListItem[],
  outCheckStatus: '' as any as BountyCheckStatusEnum,
  outCheckRemark: '',
@@ -121,20 +122,23 @@
    form.applySumAmount = data.applySumAmount;
    form.outCheckStatus = data.outCheckStatus;
    form.outCheckRemark = data.outCheckRemark;
    form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseTaxSubFileUrl
    );
    form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseOperateFileUrl
    );
    form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
    form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
    form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseRelateFileUrl
    );
    // form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseTaxSubFileUrl
    // );
    // form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseOperateFileUrl
    // );
    // form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
    // form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
    // form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseRelateFileUrl
    // );
    form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
      data.listFiles
    );
    form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
      data.collectCountListFiles
    );
    getList();
  },
src/views/Reward/RewardDeclareDetail.vue
@@ -68,12 +68,13 @@
  parkTypeName: '',
  applyMonth: '',
  applySumAmount: 0,
  enterpriseTaxSubFileUrl: [] as UploadUserFile[],
  enterpriseOperateFileUrl: [] as UploadUserFile[],
  enterpriseRelateFileUrl: [] as UploadUserFile[],
  // enterpriseTaxSubFileUrl: [] as UploadUserFile[],
  // enterpriseOperateFileUrl: [] as UploadUserFile[],
  // enterpriseRelateFileUrl: [] as UploadUserFile[],
  parkCollectFileList: [] as CustomerApplyFileTypeListItem[],
  bountyAssignFileUlr: [] as UploadUserFile[],
  bountyCollectFileUrl: [] as UploadUserFile[],
  calculationFileList: [] as CustomerApplyFileTypeListItem[],
  // bountyAssignFileUlr: [] as UploadUserFile[],
  // bountyCollectFileUrl: [] as UploadUserFile[],
});
const { data: detail, isLoading } = useQuery({
@@ -93,20 +94,23 @@
    form.parkTypeName = data.parkTypeName;
    form.applyMonth = data.applyMonth;
    form.applySumAmount = data.applySumAmount;
    form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseTaxSubFileUrl
    );
    form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseOperateFileUrl
    );
    // form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseTaxSubFileUrl
    // );
    // form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseOperateFileUrl
    // );
    form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
      data.listFiles
    );
    form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
    form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
    form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
      data?.enterpriseRelateFileUrl
    form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList(
      data.collectCountListFiles
    );
    // form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr);
    // form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl);
    // form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator(
    //   data?.enterpriseRelateFileUrl
    // );
    getList();
  },
src/views/Reward/RewardGrant.vue
@@ -39,7 +39,7 @@
          <QueryFilterItem tip-content="财政拨付状态">
            <FieldRadio
              v-model="extraParamState.financeStatus"
              :value-enum="FinanceStatusEnumText"
              :value-enum="FinanceStatusEnumTextV2Query"
              buttonStyle
              showAllBtn
              @change="getList()"
@@ -48,7 +48,7 @@
          <QueryFilterItem tip-content="平台充值状态">
            <FieldRadio
              v-model="extraParamState.settleStatus"
              :value-enum="SettleStatusEnumText"
              :value-enum="SettleStatusEnumTextV2Query"
              buttonStyle
              showAllBtn
              @change="getList()"
@@ -77,8 +77,10 @@
        title="查看凭证"
        :BusinessTypeEnumText="TransferFileEnumInRewardGrandText"
      />
      <FinancialDialog v-bind="dialogFinancialProps"></FinancialDialog>
      <PlateformDialog v-bind="dialogPlateformProps"></PlateformDialog>
      <RegisterDialog v-bind="dialogRegisterProps"></RegisterDialog>
      <UploadCertRewardDialog v-bind="dialogCertRewardProps"></UploadCertRewardDialog>
      <!-- <FinancialDialog v-bind="dialogFinancialProps"></FinancialDialog>
      <PlateformDialog v-bind="dialogPlateformProps"></PlateformDialog> -->
    </AppContainer>
  </LoadingLayout>
</template>
@@ -102,12 +104,18 @@
import { format } from '@/utils';
import {
  SettleStatusEnum,
  SettleStatusEnumText,
  FinanceStatusEnum,
  FinanceStatusEnumText,
  TransferFileEnumInRewardGrandText,
  FinanceStatusEnumTextV2,
  FinanceStatusEnumTextV2Query,
  SettleStatusEnumTextV2,
  SettleStatusEnumTextV2Query,
  IncomeTypeEnum,
  BillStatusEnum,
} from '@/constants';
import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
import RegisterDialog from './components/RegisterDialog.vue';
import UploadCertRewardDialog from './components/UploadCertRewardDialog.vue';
import FinancialDialog from './components/FinancialDialog.vue';
import PlateformDialog from './components/PlateformDialog.vue';
import _ from 'lodash';
@@ -160,25 +168,25 @@
  {
    id: '7',
    enCode: 'financeStatus',
    name: '财政拨付状态',
    name: '财政拨付登记状态',
    width: 160,
  },
  {
    id: '8',
    enCode: 'financeTime',
    name: '拨付日期',
    name: '登记拨付日期',
    width: 180,
  },
  {
    id: '9',
    enCode: 'settleStatus',
    name: '平台充值状态',
    name: '平台充值登记状态',
    width: 160,
  },
  {
    id: '10',
    enCode: 'settleTime',
    name: '充值日期',
    name: '登记充值日期',
    width: 180,
  },
];
@@ -193,30 +201,62 @@
      onClick: (role) => goDetail(role),
    },
  },
  // {
  //   data: {
  //     enCode: 'financialBtn',
  //     name: '财政拨付',
  //   },
  //   emits: {
  //     onClick: (role) => openFinancialDialog(role),
  //   },
  //   extraProps: {
  //     hide: (row: API.GetParkBountyApplyListOutput) =>
  //       row.financeStatus === FinanceStatusEnum.HasIncome,
  //   },
  // },
  // {
  //   data: {
  //     enCode: 'plateformBtn',
  //     name: '平台充值',
  //   },
  //   emits: {
  //     onClick: (role) => openPlateformDialog(role),
  //   },
  //   extraProps: {
  //     hide: (row: API.GetParkBountyApplyListOutput) =>
  //       row.settleStatus !== SettleStatusEnum.WaitForSettle,
  //   },
  // },
  {
    data: {
      enCode: 'financialBtn',
      name: '财政拨付',
      enCode: 'registerBtn',
      name: '登记',
    },
    emits: {
      onClick: (role) => openFinancialDialog(role),
      onClick: (role) => openRegisterDialog(role),
    },
    extraProps: {
      hide: (row: API.GetParkBountyApplyListOutput) =>
        row.financeStatus === FinanceStatusEnum.HasIncome,
        !(
          row.settleStatus === SettleStatusEnum.WaitForSettle ||
          row.financeStatus === FinanceStatusEnum.WaitForIncome
        ),
    },
  },
  {
    data: {
      enCode: 'plateformBtn',
      name: '平台充值',
      enCode: 'uploadCertBtn',
      name: '上传凭证',
    },
    emits: {
      onClick: (role) => openPlateformDialog(role),
      onClick: (role) => openCertRewardDialog(role),
    },
    extraProps: {
      hide: (row: API.GetParkBountyApplyListOutput) =>
        row.settleStatus !== SettleStatusEnum.WaitForSettle,
        !(
          row.settleStatus === SettleStatusEnum.HasSettle ||
          row.financeStatus === FinanceStatusEnum.HasIncome
        ),
    },
  },
  {
@@ -229,8 +269,10 @@
    },
    extraProps: {
      hide: (row: API.GetParkBountyApplyListOutput) =>
        row.settleStatus !== SettleStatusEnum.HasSettle &&
        row.financeStatus === FinanceStatusEnum.WaitForIncome,
        !(
          row.settleStatus === SettleStatusEnum.HasBill ||
          row.financeStatus === FinanceStatusEnum.HasBill
        ),
    },
  },
]);
@@ -294,8 +336,8 @@
      settleTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      financeTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      applySumAmount: { type: 'money' },
      settleStatus: { type: 'enum', valueEnum: SettleStatusEnumText },
      financeStatus: { type: 'enum', valueEnum: FinanceStatusEnumText },
      settleStatus: { type: 'enum', valueEnum: SettleStatusEnumTextV2 },
      financeStatus: { type: 'enum', valueEnum: FinanceStatusEnumTextV2 },
    },
  }
);
@@ -322,34 +364,84 @@
});
const queryClient = useQueryClient();
// const {
//   dialogProps: dialogFinancialProps,
//   handleEdit: handleFinancialEdit,
//   editForm: editFinancialForm,
// } = useFormDialog({
//   onConfirm: handleFinancial,
//   defaultFormParams: {
//     parkBountyApplyId: '',
//     financeSumAmount: 0,
//     financeFileUrl: [] as UploadUserFile[],
//   },
// });
// function openFinancialDialog(row?: API.GetParkBountyApplyListOutput) {
//   handleFinancialEdit({
//     parkBountyApplyId: row.id,
//     financeSumAmount: 0,
//     financeFileUrl: [] as UploadUserFile[],
//   });
// }
// async function handleFinancial() {
//   try {
//     let params: API.ParkBountyApplyFinanceFileInput = {
//       parkBountyApplyId: editFinancialForm.parkBountyApplyId,
//       financeSumAmount: editFinancialForm.financeSumAmount,
//       financeFileUrl: editFinancialForm.financeFileUrl.map((x) => x.path).join('|'),
//     };
//     let res = await parkBountyApplyServices.parkBountyApplyFinanceBill(params);
//     if (res) {
//       Message.successMessage('操作成功');
//       getList(paginationState.pageIndex);
//       queryClient.invalidateQueries({
//         queryKey: ['parkBountyApplyServices/getGoverDataBoard'],
//       });
//     }
//   } catch (error) {}
// }
const {
  dialogProps: dialogFinancialProps,
  handleEdit: handleFinancialEdit,
  editForm: editFinancialForm,
  dialogProps: dialogRegisterProps,
  handleEdit: handleRegisterEdit,
  editForm: editRegisterForm,
} = useFormDialog({
  onConfirm: handleFinancial,
  onConfirm: handleRegister,
  defaultFormParams: {
    incomeType: '' as any as IncomeTypeEnum,
    parkBountyApplyId: '',
    financeSumAmount: 0,
    financeFileUrl: [] as UploadUserFile[],
    showSuportPlatRecharge: false,
    showSuportFiscalRecharge: false,
  },
});
function openFinancialDialog(row?: API.GetParkBountyApplyListOutput) {
  handleFinancialEdit({
function openRegisterDialog(row?: API.GetParkBountyApplyListOutput) {
  handleRegisterEdit({
    incomeType: '' as any as IncomeTypeEnum,
    showSuportPlatRecharge: row.settleStatus === SettleStatusEnum.WaitForSettle,
    showSuportFiscalRecharge: row.financeStatus === FinanceStatusEnum.WaitForIncome,
    parkBountyApplyId: row.id,
    financeSumAmount: 0,
    financeFileUrl: [] as UploadUserFile[],
  });
}
async function handleFinancial() {
async function handleRegister() {
  try {
    let params: API.ParkBountyApplyFinanceFileInput = {
      parkBountyApplyId: editFinancialForm.parkBountyApplyId,
      financeSumAmount: editFinancialForm.financeSumAmount,
      financeFileUrl: editFinancialForm.financeFileUrl.map((x) => x.path).join('|'),
    let params = {
      parkBountyApplyId: editRegisterForm.parkBountyApplyId,
    };
    let res = await parkBountyApplyServices.parkBountyApplyFinanceBill(params);
    let res;
    if (editRegisterForm.incomeType === IncomeTypeEnum.Fiscal) {
      (params as API.ParkBountyApplyFinanceFileInput).financeSumAmount =
        editRegisterForm.financeSumAmount;
      res = await parkBountyApplyServices.parkBountyApplyFinanceBillAmount(params);
    }
    if (editRegisterForm.incomeType === IncomeTypeEnum.Platform) {
      (params as API.ParkBountyApplySettleInput).settleSumAmount =
        editRegisterForm.financeSumAmount;
      res = await parkBountyApplyServices.parkBountyApplySettleAmount(params);
    }
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
@@ -360,35 +452,87 @@
  } catch (error) {}
}
// const {
//   dialogProps: dialogPlateformProps,
//   handleEdit: handlePlateformEdit,
//   editForm: editPlateformForm,
// } = useFormDialog({
//   onConfirm: handlePlateform,
//   defaultFormParams: {
//     parkBountyApplyId: '',
//     settleSumAmount: 0,
//     settleFileUrl: [] as UploadUserFile[],
//   },
// });
// function openPlateformDialog(row?: API.GetParkBountyApplyListOutput) {
//   handlePlateformEdit({
//     parkBountyApplyId: row.id,
//     settleSumAmount: 0,
//     settleFileUrl: [] as UploadUserFile[],
//   });
// }
// async function handlePlateform() {
//   try {
//     let params: API.ParkBountyApplySettleInput = {
//       parkBountyApplyId: editPlateformForm.parkBountyApplyId,
//       settleSumAmount: editPlateformForm.settleSumAmount,
//       settleFileUrl: editPlateformForm.settleFileUrl.map((x) => x.path).join('|'),
//     };
//     let res = await parkBountyApplyServices.parkBountyApplySettle(params);
//     if (res) {
//       Message.successMessage('操作成功');
//       getList(paginationState.pageIndex);
//       queryClient.invalidateQueries({
//         queryKey: ['parkBountyApplyServices/getGoverDataBoard'],
//       });
//     }
//   } catch (error) {}
// }
const {
  dialogProps: dialogPlateformProps,
  handleEdit: handlePlateformEdit,
  editForm: editPlateformForm,
  dialogProps: dialogCertRewardProps,
  handleEdit: handleCertRewardEdit,
  editForm: editCertRewardForm,
} = useFormDialog({
  onConfirm: handlePlateform,
  onConfirm: handleCertReward,
  defaultFormParams: {
    incomeType: '' as any as IncomeTypeEnum,
    parkBountyApplyId: '',
    settleSumAmount: 0,
    settleFileUrl: [] as UploadUserFile[],
    fileUrl: [] as UploadUserFile[],
    showSuportPlatRecharge: false,
    showSuportFiscalRecharge: false,
  },
});
function openPlateformDialog(row?: API.GetParkBountyApplyListOutput) {
  handlePlateformEdit({
function openCertRewardDialog(row?: API.GetParkBountyApplyListOutput) {
  handleCertRewardEdit({
    incomeType: '' as any as IncomeTypeEnum,
    showSuportPlatRecharge: row.settleStatus === SettleStatusEnum.HasSettle,
    showSuportFiscalRecharge: row.financeStatus === FinanceStatusEnum.HasIncome,
    parkBountyApplyId: row.id,
    settleSumAmount: 0,
    settleFileUrl: [] as UploadUserFile[],
    fileUrl: [] as UploadUserFile[],
  });
}
async function handlePlateform() {
async function handleCertReward() {
  try {
    let params: API.ParkBountyApplySettleInput = {
      parkBountyApplyId: editPlateformForm.parkBountyApplyId,
      settleSumAmount: editPlateformForm.settleSumAmount,
      settleFileUrl: editPlateformForm.settleFileUrl.map((x) => x.path).join('|'),
    let params: API.ParkBountyApplyFinanceFileInput = {
      parkBountyApplyId: editCertRewardForm.parkBountyApplyId,
    };
    let res = await parkBountyApplyServices.parkBountyApplySettle(params);
    let res;
    if (editCertRewardForm.incomeType === IncomeTypeEnum.Fiscal) {
      (params as API.ParkBountyApplyFinanceFileInput).financeFileUrl = editCertRewardForm.fileUrl
        .map((x) => x.path)
        .join('|');
      res = await parkBountyApplyServices.parkBountyApplyFinanceBill(params);
    }
    if (editCertRewardForm.incomeType === IncomeTypeEnum.Platform) {
      (params as API.ParkBountyApplySettleInput).settleFileUrl = editCertRewardForm.fileUrl
        .map((x) => x.path)
        .join('|');
      res = await parkBountyApplyServices.parkBountyApplySettle(params);
    }
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
src/views/Reward/WithdrawalApproval.vue
New file
@@ -0,0 +1,240 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppContainer>
      <ProTableQueryFilterBar @on-reset="reset">
        <template #query>
          <QueryFilterItem tip-content="申请时间">
            <FieldDatePicker
              v-model="extraParamState.dateTime"
              type="daterange"
              range-separator="~"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              clearable
              @change="getList()"
            ></FieldDatePicker>
          </QueryFilterItem>
          <QueryFilterItem tip-content="审核状态">
            <FieldRadio
              v-model="extraParamState.checkStatus"
              :value-enum="EnterpriseRechargeStatusEnumText"
              buttonStyle
              showAllBtn
              @change="getList()"
            />
          </QueryFilterItem>
          <QueryFilterItem>
            <SearchInput
              v-model="extraParamState.keyWord"
              style="width: 300px"
              placeholder="企业名称/园区/信用代码"
              @on-click-search="getList"
            >
            </SearchInput>
          </QueryFilterItem>
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2 v-bind="proTableProps" :columns="column" :operationBtns="operationBtns">
      </ProTableV2>
      <WithdrawalApprovalAuditDialog v-bind="dialogProps"></WithdrawalApprovalAuditDialog>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import {
  LoadingLayout,
  AppContainer,
  useTable,
  ProTableQueryFilterBar,
  ProTableV2,
  defineOperationBtns,
  SearchInput,
  FieldRadio,
  QueryFilterItem,
  FieldDatePicker,
  useFormDialog,
  UploadUserFile,
} from '@bole-core/components';
import { Message, OrderInputType } from '@bole-core/core';
import { format } from '@/utils';
import { EnterpriseRechargeStatusEnum, EnterpriseRechargeStatusEnumText } from '@/constants';
import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
import WithdrawalApprovalAuditDialog from './components/WithdrawalApprovalAuditDialog.vue';
import _ from 'lodash';
import { ModelValueType } from 'element-plus';
defineOptions({
  name: 'WithdrawalApproval',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'enterpriseName',
    name: '企业名称',
  },
  {
    id: '2',
    enCode: 'societyCreditCode',
    name: '统一社会信用代码',
  },
  {
    id: '3',
    enCode: 'enterpriseType',
    name: '企业类型',
  },
  {
    id: '4',
    enCode: 'parkName',
    name: '所属园区',
  },
  {
    id: '5',
    enCode: 'parkType',
    name: '园区类型',
  },
  {
    id: '6',
    enCode: 'creationTime',
    name: '申请时间',
  },
  {
    id: '7',
    enCode: 'amount',
    name: '申请提现金额(元)',
  },
  {
    id: '8',
    enCode: 'checkStatus',
    name: '审核状态',
  },
  {
    id: '9',
    enCode: 'checkTime',
    name: '审核时间',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
    emits: {
      onClick: (role) => openDialog(role, true),
    },
    extraProps: {
      hide: (row: API.GetEnterpriseDrawWithListOutput) =>
        row.checkStatus === EnterpriseRechargeStatusEnum.WaitCheck,
    },
  },
  {
    data: {
      enCode: 'auditBtn',
      name: '审核',
    },
    emits: {
      onClick: (role) => openDialog(role),
    },
    extraProps: {
      hide: (row: API.GetEnterpriseDrawWithListOutput) =>
        row.checkStatus !== EnterpriseRechargeStatusEnum.WaitCheck,
    },
  },
]);
const router = useRouter();
const BaseState = {
  loading: true,
};
const state = reactive({ ...BaseState });
onMounted(async () => {
  await getList();
  state.loading = false;
});
const {
  getDataSource: getList,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.GetEnterpriseDrawWithListInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        keyWord: extraParamState.keyWord,
        checkStatus: extraParamState.checkStatus,
        beginDateTime: format(extraParamState.dateTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
        endDateTime: format(extraParamState.dateTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
      };
      let res = await parkBountyApplyServices.getEnterpriseDrawWithList(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      keyWord: '',
      checkStatus: '' as any as EnterpriseRechargeStatusEnum,
      dateTime: [] as unknown as ModelValueType,
      orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }],
    },
    columnsRenderProps: {
      creationTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      checkTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
      amount: { type: 'money' },
      checkStatus: { type: 'enum', valueEnum: EnterpriseRechargeStatusEnumText },
    },
  }
);
function openDialog(row: API.GetEnterpriseDrawWithListOutput, isCheck = false) {
  handleAdd({
    drawWithId: row.drawWithId,
    isCheck,
  });
}
const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({
  onConfirm: handleAddOrEdit,
  defaultFormParams: {
    drawWithId: '',
    checkStatus: '' as any as EnterpriseRechargeStatusEnum,
    checkRemark: '',
    isCheck: false,
    checkFileUrl: [] as UploadUserFile[],
  },
});
async function handleAddOrEdit() {
  try {
    let params: API.CheckEnterpriseApplyDrawWithInput = {
      applyDrawWithId: editForm.drawWithId,
      checkStatus: editForm.checkStatus,
      checkFileUrl: editForm.checkFileUrl?.length > 0 ? editForm.checkFileUrl[0].path : '',
      checkRemark: editForm.checkRemark,
    };
    let res = await parkBountyApplyServices.checkEnterpriseApplyDrawWith(params);
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
    }
  } catch (error) {}
}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/views/Reward/components/RegisterDialog.vue
New file
@@ -0,0 +1,116 @@
<template>
  <ProDialog
    title="登记"
    v-model="visible"
    @close="onDialogClose"
    destroy-on-close
    draggable
    width="700px"
  >
    <ProForm :model="form" ref="dialogForm" label-width="120px">
      <ProFormItemV2
        label="登记类型:"
        prop="incomeType"
        :check-rules="[{ message: '请选择登记类型' }]"
      >
        <ProFormRadio
          v-model="form.incomeType"
          :value-enum="incomeTypeEnum"
          :button-style="false"
        />
      </ProFormItemV2>
      <ProFormItemV2
        label="输入金额:"
        prop="financeSumAmount"
        :check-rules="[{ message: '请输入金额', type: 'number' }]"
      >
        <ProFormInputNumber
          v-model="form.financeSumAmount"
          :controls="false"
          :min="0"
          unit="元"
          :precision="2"
        ></ProFormInputNumber>
      </ProFormItemV2>
    </ProForm>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="emit('onCancel')">取 消</el-button>
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import { FormInstance } from 'element-plus';
import {
  ProDialog,
  ProForm,
  ProFormItemV2,
  ProFormInputNumber,
  ProFormRadio,
} from '@bole-core/components';
import { IncomeTypeEnumText, IncomeTypeEnum, FinanceStatusEnum } from '@/constants';
defineOptions({
  name: 'RegisterDialog',
});
type Props = {
  /**
   * @deprecated
   */
  financeSumAmount?: number;
};
const props = withDefaults(defineProps<Props>(), {});
const visible = defineModel({ type: Boolean });
type Form = {
  title?: string;
  financeSumAmount: number;
  incomeType: IncomeTypeEnum;
  showSuportPlatRecharge: boolean;
  showSuportFiscalRecharge: boolean;
};
const form = defineModel<Form>('form');
const emit = defineEmits<{
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
const incomeTypeEnum = computed(() => {
  return [
    form.value.showSuportFiscalRecharge && {
      label: IncomeTypeEnumText[IncomeTypeEnum.Fiscal],
      value: IncomeTypeEnum.Fiscal,
    },
    form.value.showSuportPlatRecharge && {
      label: IncomeTypeEnumText[IncomeTypeEnum.Platform],
      value: IncomeTypeEnum.Platform,
    },
  ].filter(Boolean);
});
const dialogForm = ref<FormInstance>();
function onDialogClose() {
  if (!dialogForm.value) return;
  dialogForm.value.resetFields();
}
function handleConfirm() {
  if (!dialogForm.value) return;
  dialogForm.value.validate((valid) => {
    if (valid) {
      emit('onConfirm');
    } else {
      return;
    }
  });
}
</script>
src/views/Reward/components/UploadCertRewardDialog.vue
New file
@@ -0,0 +1,107 @@
<template>
  <ProDialog
    title="上传凭证"
    v-model="visible"
    @close="onDialogClose"
    destroy-on-close
    draggable
    width="700px"
  >
    <ProForm :model="form" ref="dialogForm" label-width="120px">
      <ProFormItemV2
        label="入账类型:"
        prop="incomeType"
        :check-rules="[{ message: '请选择入账类型' }]"
      >
        <ProFormRadio
          v-model="form.incomeType"
          :value-enum="incomeTypeEnum"
          :button-style="false"
        />
      </ProFormItemV2>
      <ProFormItemV2
        label="上传入账凭证:"
        prop="fileUrl"
        :check-rules="[{ message: '请上传入账凭证', type: 'upload' }]"
      >
        <ProFormUpload
          v-model:file-url="form.fileUrl"
          :limitFileSize="50"
          accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
        ></ProFormUpload>
      </ProFormItemV2>
    </ProForm>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="emit('onCancel')">取 消</el-button>
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import { FormInstance } from 'element-plus';
import {
  ProDialog,
  ProForm,
  ProFormItemV2,
  UploadUserFile,
  ProFormUpload,
  ProFormRadio,
} from '@bole-core/components';
import { IncomeTypeEnumText, IncomeTypeEnum } from '@/constants';
defineOptions({
  name: 'UploadCertRewardDialog',
});
const visible = defineModel({ type: Boolean });
type Form = {
  title?: string;
  fileUrl: UploadUserFile[];
  parkBountyApplyId: string;
  incomeType: IncomeTypeEnum;
  showSuportPlatRecharge: boolean;
  showSuportFiscalRecharge: boolean;
};
const form = defineModel<Form>('form');
const emit = defineEmits<{
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
const incomeTypeEnum = computed(() => {
  return [
    form.value.showSuportFiscalRecharge && {
      label: IncomeTypeEnumText[IncomeTypeEnum.Fiscal],
      value: IncomeTypeEnum.Fiscal,
    },
    form.value.showSuportPlatRecharge && {
      label: IncomeTypeEnumText[IncomeTypeEnum.Platform],
      value: IncomeTypeEnum.Platform,
    },
  ].filter(Boolean);
});
const dialogForm = ref<FormInstance>();
function onDialogClose() {
  if (!dialogForm.value) return;
  dialogForm.value.resetFields();
}
function handleConfirm() {
  if (!dialogForm.value) return;
  dialogForm.value.validate((valid) => {
    if (valid) {
      emit('onConfirm');
    } else {
      return;
    }
  });
}
</script>
src/views/Reward/components/WithdrawalApprovalAuditDialog.vue
New file
@@ -0,0 +1,255 @@
<template>
  <ProDialog :title="title" v-model="visible" @close="onDialogClose" destroy-on-close draggable>
    <PortraitTableWithAttachment v-bind="portraitTableWithAttachmentProps" />
    <ProForm
      :model="form"
      ref="dialogForm"
      label-width="90px"
      style="margin-top: 20px"
      :is-read="form.isCheck"
    >
      <ProFormCol>
        <ProFormColItem :span="12">
          <ProFormItemV2
            label="审核:"
            prop="checkStatus"
            :check-rules="[{ message: '请选择审核状态' }]"
          >
            <ProFormRadio
              v-model="form.checkStatus"
              :value-enum="EnterpriseRechargeStatusEnumTextForAdudit"
            />
          </ProFormItemV2>
        </ProFormColItem>
      </ProFormCol>
      <ProFormCol v-if="form.isCheck">
        <ProFormColItem :span="12">
          <ProFormItemV2 label="审核日期:" prop="creationTime">
            <ProFormDatePicker v-model="form.creationTime" type="date" format="YYYY-MM-DD HH:mm" />
          </ProFormItemV2>
        </ProFormColItem>
      </ProFormCol>
      <ProFormCol>
        <ProFormColItem :span="12">
          <ProFormItemV2
            label="上传凭证:"
            prop="checkFileUrl"
            :required="form.checkStatus === EnterpriseRechargeStatusEnum.CheckPassed"
            :check-rules="[
              {
                message: '请上传凭证',
                validator: (rule, value, callback) => {
                  if (
                    value?.length === 0 &&
                    form.checkStatus === EnterpriseRechargeStatusEnum.CheckPassed
                  ) {
                    callback(new Error('请上传凭证'));
                  }
                  callback();
                },
              },
            ]"
          >
            <ProFormUpload
              v-model:file-url="form.checkFileUrl"
              :limit="1"
              :showTip="false"
              :limitFileSize="50"
            ></ProFormUpload>
          </ProFormItemV2>
        </ProFormColItem>
      </ProFormCol>
      <ProFormCol>
        <ProFormColItem>
          <ProFormItemV2
            label="审核理由:"
            prop="checkRemark"
            :required="form.checkStatus === EnterpriseRechargeStatusEnum.CheckReject"
            :check-rules="[
              {
                message: '请输入审核理由',
                validator: (rule, value, callback) => {
                  if (!value && form.checkStatus === EnterpriseRechargeStatusEnum.CheckReject) {
                    callback(new Error('请输入驳回理由'));
                  }
                  callback();
                },
              },
            ]"
          >
            <ProFormTextArea
              v-model="form.checkRemark"
              placeholder="请输入"
              show-word-limit
              :maxlength="150"
            ></ProFormTextArea>
          </ProFormItemV2>
        </ProFormColItem>
      </ProFormCol>
    </ProForm>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="emit('onCancel')">取 消</el-button>
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import { FormInstance } from 'element-plus';
import {
  ProDialog,
  ProForm,
  ProFormItemV2,
  ProFormTextArea,
  ProFormCol,
  ProFormColItem,
  ProFormRadio,
  ProFormUpload,
  ProFormDatePicker,
  UploadUserFile,
} from '@bole-core/components';
import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
import { usePortraitTableWithAttachment } from '@/hooks';
import { convertApi2FormUrl, convertApi2FormUrlOnlyOne } from '@/utils';
import { useQuery } from '@tanstack/vue-query';
import {
  EnterpriseRechargeStatusEnum,
  EnterpriseRechargeStatusEnumTextForAdudit,
} from '@/constants';
defineOptions({
  name: 'WithdrawalApprovalAuditDialog',
});
// type Props = {};
// const props = withDefaults(defineProps<Props>(), {});
const visible = defineModel({ type: Boolean });
type Form = {
  title?: string;
  drawWithId: string;
  checkStatus: EnterpriseRechargeStatusEnum;
  checkRemark: string;
  creationTime?: string;
  isCheck: boolean;
  checkFileUrl: UploadUserFile[];
};
const form = defineModel<Form>('form');
const title = computed(() => (form.value?.isCheck ? '详情' : '提现审批'));
const emit = defineEmits<{
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
watch(
  () => visible.value,
  (val) => {
    if (val) {
      refetch();
    }
  }
);
const {
  data: detail,
  refetch,
  isLoading,
} = useQuery({
  queryKey: ['parkBountyApplyServices/getEnterpriseDrawWithDetail', form.value?.drawWithId],
  queryFn: async () => {
    return await parkBountyApplyServices.getEnterpriseDrawWithDetail(
      {
        drawWithId: form.value?.drawWithId,
      },
      {
        showLoading: true,
      }
    );
  },
  placeholderData: () => ({} as API.GetEnterpriseDrawWithDetailOutput),
  enabled: !!form.value?.drawWithId,
  onSuccess(data) {
    form.value.checkRemark = data.checkRemark ?? '';
    form.value.creationTime = data.creationTime ?? '';
    form.value.checkStatus = form.value?.isCheck
      ? data.checkStatus
      : ('' as any as EnterpriseRechargeStatusEnum);
    form.value.checkFileUrl = convertApi2FormUrlOnlyOne(data.checkFileUrl);
  },
});
const { portraitTableWithAttachmentProps } = usePortraitTableWithAttachment({
  data: detail,
  annexList: computed(() =>
    detail.value?.invoiceUrl
      ? detail.value?.invoiceUrl.split('|').map((item) => convertApi2FormUrl(item))
      : []
  ),
  columns: [
    {
      label: '企业名称',
      key: 'enterpriseName',
    },
    {
      label: '统一社会信用代码',
      key: 'societyCreditCode',
    },
    {
      label: '账户名称',
      key: 'accountName',
    },
    {
      label: '银行帐号',
      key: 'bankNumber',
    },
    {
      label: '开户银行',
      key: 'bankName',
    },
    {
      label: '开户支行',
      key: 'bankResumeName',
    },
    {
      label: '提现金额',
      key: 'amount',
      type: 'money',
    },
    {
      label: '申请日期',
      key: 'creationTime',
      type: 'date',
    },
  ],
});
const dialogForm = ref<FormInstance>();
function onDialogClose() {
  if (!dialogForm.value) return;
  dialogForm.value.resetFields();
}
function handleConfirm() {
  if (!dialogForm.value) return;
  if (form.value?.isCheck) {
    emit('onCancel');
    return;
  }
  dialogForm.value.validate((valid) => {
    if (valid) {
      emit('onConfirm');
    } else {
      return;
    }
  });
}
</script>