From da9363290e99b960805b7dfdefef201f89d1dde0 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期三, 16 七月 2025 18:07:39 +0800
Subject: [PATCH] fix: 奖励金审核

---
 src/services/api/User.ts                                    |   14 +
 src/constants/reward.ts                                     |   28 ++
 src/services/api/typings.d.ts                               |   62 +++++
 src/views/Reward/RewardApplyTradeCheck.vue                  |  228 +++++++++++++++++++
 src/views/Reward/constants/index.ts                         |    1 
 src/router/index.ts                                         |   13 +
 src/services/api/ParkBountyApply.ts                         |   15 +
 src/views/Reward/components/RewardApplyTradeCheckDialog.vue |  236 +++++++++++++++++++
 src/views/Reward/constants/columns.ts                       |   81 ++++++
 9 files changed, 677 insertions(+), 1 deletions(-)

diff --git a/src/constants/reward.ts b/src/constants/reward.ts
index 8304a23..dde73a7 100644
--- a/src/constants/reward.ts
+++ b/src/constants/reward.ts
@@ -177,3 +177,31 @@
   [BillStatusEnum.NeedUpload]: '寰呭畬鍠�',
   [BillStatusEnum.HasUpload]: '宸蹭笂浼�',
 };
+
+export enum EnumParkBountyTradeDetailAuditStatus {
+  /// 寰呭鏍�
+  Wait = 10,
+
+  /// 瀹℃牳閫氳繃
+  Pass = 20,
+
+  /// 椹冲洖
+  Reject = 30,
+}
+
+export const EnumParkBountyTradeDetailAuditStatusText = {
+  [EnumParkBountyTradeDetailAuditStatus.Wait]: '寰呭鏍�',
+  [EnumParkBountyTradeDetailAuditStatus.Pass]: '瀹℃牳閫氳繃',
+  [EnumParkBountyTradeDetailAuditStatus.Reject]: '椹冲洖',
+};
+
+export const EnumParkBountyTradeDetailAuditStatusTextForAdudit = {
+  [EnumParkBountyTradeDetailAuditStatus.Pass]: '閫氳繃',
+  [EnumParkBountyTradeDetailAuditStatus.Reject]: '椹冲洖',
+};
+
+export const EnumParkBountyTradeDetailAuditStatusTag = {
+  [EnumParkBountyTradeDetailAuditStatus.Wait]: 'warning',
+  [EnumParkBountyTradeDetailAuditStatus.Pass]: 'success',
+  [EnumParkBountyTradeDetailAuditStatus.Reject]: 'danger',
+};
diff --git a/src/router/index.ts b/src/router/index.ts
index cb3837d..6314848 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -234,6 +234,19 @@
           icon: 'home',
         },
       },
+      {
+        path: '/RewardApplyTradeCheck',
+        name: 'RewardApplyTradeCheck',
+        hidden: false,
+        alwaysShow: true,
+        component: () => import('@/views/Reward/RewardApplyTradeCheck.vue'),
+        meta: {
+          rank: 10034,
+          title: '鍑鸿处瀹℃壒',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
     ],
   },
   // {
diff --git a/src/services/api/ParkBountyApply.ts b/src/services/api/ParkBountyApply.ts
index e5828b4..867b106 100644
--- a/src/services/api/ParkBountyApply.ts
+++ b/src/services/api/ParkBountyApply.ts
@@ -17,6 +17,21 @@
   });
 }
 
+/** 濂栧姳閲�-鍑鸿处 POST /api/ParkBountyApply/AuditParkBountyApplyTrade */
+export async function auditParkBountyApplyTrade(
+  body: API.AuditParkBountyTradeInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/ParkBountyApply/AuditParkBountyApplyTrade', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鎾ゅ洖鐢虫姤 GET /api/ParkBountyApply/CancelParkBountyApply */
 export async function cancelParkBountyApply(
   // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
diff --git a/src/services/api/User.ts b/src/services/api/User.ts
index 62c8e00..3e7a25b 100644
--- a/src/services/api/User.ts
+++ b/src/services/api/User.ts
@@ -306,6 +306,20 @@
   });
 }
 
+/** 鑾峰彇姹熶綉淇濈敤鎴蜂俊鎭� GET /api/User/GetJybUserInfo/${param0} */
+export async function getJybUserInfoId(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetJybUserInfoIdParams,
+  options?: API.RequestConfig
+) {
+  const { id: param0, ...queryParams } = params;
+  return request<API.JybUserInfoDto>(`/api/User/GetJybUserInfo/${param0}`, {
+    method: 'GET',
+    params: { ...queryParams },
+    ...(options || {}),
+  });
+}
+
 /** 鑾峰彇浜掔浉鍏虫敞鍒嗛〉鍒楄〃 POST /api/User/GetMutualFollowUserPage */
 export async function getMutualFollowUserPage(body: API.PageInput, options?: API.RequestConfig) {
   return request<API.FollowUserListOutputPageOutput>('/api/User/GetMutualFollowUserPage', {
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index 289d356..75788fe 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -1535,6 +1535,10 @@
     suppierType?: number;
   }
 
+  interface APIgetJybUserInfoIdParams {
+    id: string;
+  }
+
   interface APIgetLgGigWorkUserDetailParams {
     id?: string;
   }
@@ -2368,6 +2372,16 @@
     auditNote?: string;
     /** 瀹℃牳浜� */
     checkUserId?: string;
+  }
+
+  interface AuditParkBountyTradeInput {
+    /** 鍑鸿处璁板綍Id */
+    id?: string;
+    auditStatus?: EnumParkBountyTradeDetailAuditStatus;
+    /** 瀹℃牳澶囨敞 */
+    auditRemark?: string;
+    /** 瀹℃牳鍑瘉 */
+    payAuditFileUrl?: string;
   }
 
   interface AuditWalletBatchTransferDetailInput {
@@ -5904,6 +5918,8 @@
     configuration?: Record<string, any>;
   }
 
+  type EnumParkBountyTradeDetailAuditStatus = 10 | 20 | 30;
+
   interface ExportBountyApplyData {
     /** 浼佷笟鍚嶇О */
     enterpriseName: string;
@@ -8429,11 +8445,26 @@
     /** 鍑鸿处缁撴潫鏃ユ湡 */
     transferTimeEnd?: string;
     enterpriseId?: string;
+    auditStatus?: EnumParkBountyTradeDetailAuditStatus;
   }
 
   interface GetParkBountyTradeDetailOutput {
+    enterpriseId?: string;
+    /** 璐﹀彿 */
+    userName?: string;
+    /** 浼佷笟鍚嶇О */
+    enterpriseName?: string;
+    /** 鐢佃瘽 */
+    contactPhone?: string;
+    /** 绀句細缁熶竴淇$敤浠g爜 */
+    societyCreditCode?: string;
+    authType?: EnterpriseTypeEnum;
+    /** 鐢宠鍥尯 */
+    parkName?: string;
+    /** 鐢宠鍥尯绫诲瀷 */
+    parkTypeName?: string;
     id?: string;
-    /** 鏈�杩戝嚭璐﹂噾棰� */
+    /** 鍑鸿处閲戦 */
     tradeAmount?: number;
     /** 鍑鸿处鍑瘉 */
     payFileUrl?: string;
@@ -8445,6 +8476,13 @@
     /** 濂栧姳閲戜綑棰� */
     remianAmount?: number;
     financeType?: FinanceTypeEnum;
+    auditStatus?: EnumParkBountyTradeDetailAuditStatus;
+    /** 瀹℃牳澶囨敞 */
+    auditRemark?: string;
+    /** 瀹℃牳鏃堕棿 */
+    auditTime?: string;
+    /** 瀹℃牳鍑瘉 */
+    payAuditFileUrl?: string;
   }
 
   interface GetParkBountyTradeDetailOutputPageOutput {
@@ -13003,6 +13041,28 @@
     properties?: Record<string, any>;
   }
 
+  interface JybUserInfoDto {
+    id?: string;
+    /** 浼佷笟鍚嶇О */
+    enterpriseName?: string;
+    /** 鑱旂郴浜� */
+    contact?: string;
+    /** 鑱旂郴鐢佃瘽 */
+    contactPhone?: string;
+    /** 缁熶竴绀句細淇$敤浠g爜 */
+    societyCreditCode?: string;
+    /** 璇︾粏鍦板潃 */
+    addressDetail?: string;
+    /** 鐢ㄦ埛鎵嬫満鍙� */
+    phoneNumber?: string;
+    /** 閾惰鎬昏鍚嶇О */
+    bankName?: string;
+    /** 閾惰鍗″彿 */
+    bankCardNumber?: string;
+    /** 缁戝畾閭鍦板潃 */
+    bindEmailAddress?: string;
+  }
+
   interface KeyInput {
     id?: string;
   }
diff --git a/src/views/Reward/RewardApplyTradeCheck.vue b/src/views/Reward/RewardApplyTradeCheck.vue
new file mode 100644
index 0000000..32b478b
--- /dev/null
+++ b/src/views/Reward/RewardApplyTradeCheck.vue
@@ -0,0 +1,228 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="鐢宠鍑鸿处鏃ユ湡">
+            <FieldDatePicker
+              v-model="extraParamState.creationTime"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="寮�濮嬫棩鏈�"
+              end-placeholder="缁撴潫鏃ユ湡"
+              clearable
+              @change="getList()"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.searchKeyWord"
+              style="width: 200px"
+              placeholder="浼佷笟鍚嶇О/淇$敤浠g爜"
+              @on-click-search="getList"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2
+        v-bind="proTableProps"
+        :columns="RewardApplyTradeCheckColumns"
+        :operationBtns="operationBtns"
+      >
+      </ProTableV2>
+      <RewardApplyTradeCheckDialog v-bind="dialogProps"></RewardApplyTradeCheckDialog>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  OperationBtnType,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  FieldDatePicker,
+  useFormDialog,
+  UploadUserFile,
+  defineOperationBtns,
+} from '@bole-core/components';
+import { Message, OrderInputType } from '@bole-core/core';
+import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
+import {
+  EnterpriseType,
+  EnterpriseTypeText,
+  EnumParkBountyTradeDetailAuditStatus,
+  EnumParkBountyTradeDetailAuditStatusTag,
+  EnumParkBountyTradeDetailAuditStatusText,
+} from '@/constants';
+import { ModelValueType } from 'element-plus';
+import RewardApplyTradeCheckDialog from './components/RewardApplyTradeCheckDialog.vue';
+import { convertApi2FormUrlOnlyOne, format } from '@/utils';
+import { RewardApplyTradeCheckColumns } from './constants';
+
+defineOptions({
+  name: 'RewardApplyTradeCheck',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '璇︽儏',
+    },
+    emits: {
+      onClick: (role) => openDialog(role, true),
+    },
+    extraProps: {
+      hide: (row: API.GetParkBountyTradeDetailOutput) =>
+        row.auditStatus === EnumParkBountyTradeDetailAuditStatus.Wait,
+    },
+  },
+  {
+    data: {
+      enCode: 'checkBtn',
+      name: '瀹℃壒',
+    },
+    emits: {
+      onClick: (row) => openDialog(row),
+    },
+    extraProps: {
+      hide: (row: API.GetParkBountyTradeDetailOutput) =>
+        row.auditStatus !== EnumParkBountyTradeDetailAuditStatus.Wait,
+    },
+  },
+]);
+
+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.GetParkBountyTradeDetailByIdInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        searchKeyWord: extraParamState.searchKeyWord,
+        // transferTimeBegin: format(extraParamState.transferTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
+        // transferTimeEnd: format(extraParamState.transferTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
+        creationTimeBegin: format(extraParamState.creationTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'),
+        creationTimeEnd: format(extraParamState.creationTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'),
+        // "enterpriseId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+        // "auditStatus": 10
+      };
+      let res = await parkBountyApplyServices.getParkBountyTradeDetailList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {}
+  },
+  {
+    defaultExtraParams: {
+      searchKeyWord: '',
+      creationTime: [] as unknown as ModelValueType,
+      orderInput: [{ property: 'tradeTime', order: OrderInputType.Desc }],
+    },
+    columnsRenderProps: {
+      authType: { type: 'enum', valueEnum: EnterpriseTypeText },
+      tradeTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' },
+      tradeAmount: { type: 'money' },
+      remianAmount: { type: 'money' },
+      auditStatus: {
+        type: 'tag',
+        valueEnum: EnumParkBountyTradeDetailAuditStatusText,
+        tagTypeEnum: EnumParkBountyTradeDetailAuditStatusTag,
+      },
+    },
+  }
+);
+
+function openDialog(row: API.GetParkBountyTradeDetailOutput, isCheck = false) {
+  handleAdd({
+    id: row.id,
+    isCheck,
+    auditStatus:
+      row.auditStatus === EnumParkBountyTradeDetailAuditStatus.Reject
+        ? EnumParkBountyTradeDetailAuditStatus.Reject
+        : EnumParkBountyTradeDetailAuditStatus.Pass,
+    auditRemark: row.auditRemark,
+    payAuditFileUrl: convertApi2FormUrlOnlyOne(row.payAuditFileUrl),
+    userName: row.userName,
+    enterpriseName: row.enterpriseName,
+    societyCreditCode: row.societyCreditCode,
+    contactPhone: row.contactPhone,
+    authType: row.authType,
+    parkName: row.parkName,
+    parkTypeName: row.parkTypeName,
+    tradeAmount: row.tradeAmount,
+    remianAmount: row.remianAmount,
+    tradeTime: row.tradeTime,
+    auditTime: row.auditTime,
+    payRemark: row.payRemark,
+    payFileUrl: convertApi2FormUrlOnlyOne(row.payFileUrl),
+  });
+}
+
+const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({
+  onConfirm: handleAddOrEdit,
+  defaultFormParams: {
+    id: '',
+    auditStatus: '' as any as EnumParkBountyTradeDetailAuditStatus,
+    auditRemark: '',
+    payAuditFileUrl: [] as UploadUserFile[],
+    isCheck: false,
+    userName: '',
+    enterpriseName: '',
+    societyCreditCode: '',
+    contactPhone: '',
+    authType: EnterpriseType.HREnterprise,
+    parkName: '',
+    parkTypeName: '',
+    tradeAmount: '' as any as number,
+    remianAmount: '' as any as number,
+    tradeTime: '',
+    auditTime: '',
+    payRemark: '',
+    payFileUrl: [] as UploadUserFile[],
+  },
+});
+
+async function handleAddOrEdit() {
+  try {
+    let params: API.AuditParkBountyTradeInput = {
+      id: editForm.id,
+      auditStatus: editForm.auditStatus,
+      /** 瀹℃牳澶囨敞 */
+      auditRemark: editForm.auditRemark,
+      /** 瀹℃牳鍑瘉 */
+      payAuditFileUrl: editForm.payAuditFileUrl?.[0]?.path ?? '',
+    };
+    let res = await parkBountyApplyServices.auditParkBountyApplyTrade(params);
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      getList(paginationState.pageIndex);
+    }
+  } catch (error) {}
+}
+</script>
diff --git a/src/views/Reward/components/RewardApplyTradeCheckDialog.vue b/src/views/Reward/components/RewardApplyTradeCheckDialog.vue
new file mode 100644
index 0000000..42d82a7
--- /dev/null
+++ b/src/views/Reward/components/RewardApplyTradeCheckDialog.vue
@@ -0,0 +1,236 @@
+<template>
+  <ProDialog 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="auditStatus"
+            :check-rules="[{ message: '璇烽�夋嫨瀹℃牳鐘舵��' }]"
+          >
+            <ProFormRadio
+              v-model="form.auditStatus"
+              :value-enum="EnumParkBountyTradeDetailAuditStatusTextForAdudit"
+            />
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+      <ProFormCol v-if="form.isCheck">
+        <ProFormColItem :span="12">
+          <ProFormItemV2 label="瀹℃牳鏃ユ湡:" prop="auditTime">
+            <ProFormDatePicker v-model="form.auditTime" type="date" format="YYYY-MM-DD HH:mm" />
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+      <ProFormCol>
+        <ProFormColItem :span="12">
+          <ProFormItemV2
+            label="涓婁紶鍑瘉:"
+            prop="payAuditFileUrl"
+            :check-rules="[
+              {
+                message: '璇蜂笂浼犲嚟璇�',
+                type: 'upload',
+              },
+            ]"
+          >
+            <ProFormUpload
+              v-model:file-url="form.payAuditFileUrl"
+              :limit="1"
+              :showTip="false"
+              :limitFileSize="50"
+            ></ProFormUpload>
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+
+      <ProFormCol>
+        <ProFormColItem>
+          <ProFormItemV2
+            label="瀹℃牳鐞嗙敱:"
+            prop="auditRemark"
+            :required="form.auditStatus === EnumParkBountyTradeDetailAuditStatus.Reject"
+            :check-rules="[
+              {
+                message: '璇疯緭鍏ュ鏍哥悊鐢�',
+                validator: (rule, value, callback) => {
+                  if (!value && form.auditStatus === EnumParkBountyTradeDetailAuditStatus.Reject) {
+                    callback(new Error('璇疯緭鍏ラ┏鍥炵悊鐢�'));
+                  }
+                  callback();
+                },
+              },
+            ]"
+          >
+            <ProFormTextArea
+              v-model="form.auditRemark"
+              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 {
+  EnumParkBountyTradeDetailAuditStatus,
+  EnumParkBountyTradeDetailAuditStatusTextForAdudit,
+  EnterpriseType,
+  EnterpriseTypeText,
+} from '@/constants';
+
+defineOptions({
+  name: 'WithdrawalApprovalAuditDialog',
+});
+
+// type Props = {};
+
+// const props = withDefaults(defineProps<Props>(), {});
+
+const visible = defineModel({ type: Boolean });
+
+type Form = {
+  title?: string;
+  id: string;
+  auditStatus: EnumParkBountyTradeDetailAuditStatus;
+  auditRemark: string;
+  payAuditFileUrl: UploadUserFile[];
+  isCheck: boolean;
+  userName: string;
+  enterpriseName: string;
+  societyCreditCode: string;
+  contactPhone: string;
+  authType: EnterpriseType;
+  parkName: string;
+  parkTypeName: string;
+  tradeAmount: number;
+  remianAmount: number;
+  tradeTime: string;
+  auditTime: string;
+  payRemark: string;
+  payFileUrl: UploadUserFile[];
+};
+
+const form = defineModel<Form>('form');
+
+const emit = defineEmits<{
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+const { portraitTableWithAttachmentProps } = usePortraitTableWithAttachment({
+  data: form,
+  annexList: computed(() => form.value?.payFileUrl),
+  columns: [
+    {
+      label: '寮�鎴疯处鍙�',
+      key: 'userName',
+      formatter: () => '1511 2001 2920 0156 069',
+    },
+    {
+      label: '杩涜处鍗曚綅',
+      key: 'enterpriseName',
+      formatter: () => '澶钩璐骇淇濋櫓鏈夐檺鍏徃鎶氬窞涓績鏀叕鍙�',
+    },
+    {
+      label: '寮�鎴峰悕绉�',
+      key: 'societyCreditCode',
+      formatter: () => '澶钩璐骇淇濋櫓鏈夐檺鍏徃鎶氬窞涓績鏀叕鍙�',
+    },
+    {
+      label: '寮�鎴烽摱琛�',
+      key: 'contactPhone',
+      formatter: () => '涓浗宸ュ晢閾惰鑲′唤鏈夐檺鍏徃鎶氬窞璧d笢鏀',
+    },
+    // {
+    //   label: '浼佷笟绫诲瀷',
+    //   key: 'authType',
+    //   type: 'enum',
+    //   valueEnum: EnterpriseTypeText,
+    // },
+    // {
+    //   label: '鎵�灞炲洯鍖�',
+    //   key: 'parkName',
+    // },
+    // {
+    //   label: '鍥尯绫诲瀷',
+    //   key: 'parkTypeName',
+    // },
+    // {
+    //   label: '娑堣垂绫诲瀷',
+    //   key: 'payRemark',
+    // },
+    {
+      label: '鐢宠鍑鸿处閲戦',
+      key: 'tradeAmount',
+      type: 'money',
+    },
+    {
+      label: '鐢宠鍑鸿处鏃堕棿',
+      key: 'tradeTime',
+      type: 'date',
+    },
+    {
+      label: '璧勯噾浣欓',
+      key: 'remianAmount',
+      type: 'money',
+    },
+  ],
+});
+
+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>
diff --git a/src/views/Reward/constants/columns.ts b/src/views/Reward/constants/columns.ts
new file mode 100644
index 0000000..58aab3c
--- /dev/null
+++ b/src/views/Reward/constants/columns.ts
@@ -0,0 +1,81 @@
+import { defineColumns } from '@bole-core/components';
+
+export const RewardApplyTradeCheckColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'userName',
+    name: '甯愬彿',
+    width: 160,
+  },
+  {
+    id: '2',
+    enCode: 'enterpriseName',
+    name: '浼佷笟鍚嶇О',
+    width: 160,
+  },
+  {
+    id: '3',
+    enCode: 'societyCreditCode',
+    name: '淇$敤浠g爜',
+    width: 160,
+  },
+  {
+    id: '4',
+    enCode: 'contactPhone',
+    name: '鐢佃瘽',
+    width: 160,
+  },
+  {
+    id: '5',
+    enCode: 'authType',
+    name: '浼佷笟绫诲瀷',
+    width: 160,
+  },
+  {
+    id: '6',
+    enCode: 'parkName',
+    name: '鎵�灞炲洯鍖�',
+    width: 160,
+  },
+  {
+    id: '7',
+    enCode: 'parkTypeName',
+    name: '鍥尯绫诲瀷',
+  },
+  {
+    id: '22',
+    enCode: 'auditStatus',
+    name: '瀹℃牳鐘舵��',
+    width: 160,
+  },
+  {
+    id: '21',
+    enCode: 'payRemark',
+    name: '娑堣垂绫诲瀷',
+    width: 160,
+  },
+  {
+    id: '10',
+    enCode: 'tradeAmount',
+    name: '鐢宠鍑鸿处閲戦',
+    width: 160,
+  },
+  {
+    id: '11',
+    enCode: 'tradeTime',
+    name: '鐢宠鍑鸿处鏃堕棿',
+    width: 160,
+  },
+  // {
+  //   id: '12',
+  //   enCode: 'payFileUrl',
+  //   name: '鍑鸿处鍑瘉',
+  //   width: 160,
+  // },
+  {
+    id: '9',
+    enCode: 'remianAmount',
+    name: '璧勯噾浣欓',
+    width: 160,
+  },
+]);
diff --git a/src/views/Reward/constants/index.ts b/src/views/Reward/constants/index.ts
new file mode 100644
index 0000000..a7f066b
--- /dev/null
+++ b/src/views/Reward/constants/index.ts
@@ -0,0 +1 @@
+export * from './columns';

--
Gitblit v1.9.1