| <template> | 
|   <LoadingLayout :loading="state.loading"> | 
|     <AppContainer> | 
|       <ProTableQueryFilterBar @on-reset="reset"> | 
|         <template #query> | 
|           <QueryFilterItem> | 
|             <FieldSelect | 
|               v-model="extraParamState.enterpriseId" | 
|               placeholder="请选择园区" | 
|               :value-enum="fourStreamsIndustrialParkList" | 
|               enumLabelKey="parkName" | 
|               enum-value-key="id" | 
|               clearable | 
|               @change="getList()" | 
|             /> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem tip-content="审核状态"> | 
|             <FieldRadio | 
|               v-model="extraParamState.financeAuditStatus" | 
|               :value-enum="EnumParkBountyTradeDetailAuditStatusText" | 
|               buttonStyle | 
|               showAllBtn | 
|               @change="getList()" | 
|             ></FieldRadio> | 
|           </QueryFilterItem> | 
|           <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: 300px" | 
|               placeholder="企业名/信用代码/联系人/联系方式" | 
|               @on-click-search="getList" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|         </template> | 
|       </ProTableQueryFilterBar> | 
|       <ProTableV2 | 
|         v-bind="proTableProps" | 
|         :columns="FinancialApprovalColumns" | 
|         :operationBtns="operationBtns" | 
|       > | 
|       </ProTableV2> | 
|       <RewardApplyTradeCheckDialog v-bind="dialogProps"></RewardApplyTradeCheckDialog> | 
|     </AppContainer> | 
|   </LoadingLayout> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
| import { | 
|   ProTableQueryFilterBar, | 
|   FieldSelect, | 
|   ProTableV2, | 
|   SearchInput, | 
|   LoadingLayout, | 
|   AppContainer, | 
|   QueryFilterItem, | 
|   useTable, | 
|   FieldDatePicker, | 
|   useFormDialog, | 
|   UploadUserFile, | 
|   defineOperationBtns, | 
|   FieldRadio, | 
| } from '@bole-core/components'; | 
| import { Message, OrderInputType } from '@bole-core/core'; | 
| import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; | 
| import { | 
|   EnterpriseType, | 
|   EnterpriseTypeText, | 
|   EnumParkBountyTradeDetailAuditStatus, | 
|   EnumParkBountyTradeDetailAuditStatusTag, | 
|   EnumParkBountyTradeDetailAuditStatusText, | 
|   FinanceTypeEnum, | 
| } from '@/constants'; | 
| import { ModelValueType } from 'element-plus'; | 
| import RewardApplyTradeCheckDialog from './components/RewardApplyTradeCheckDialog.vue'; | 
| import { convertApi2FormUrlObjectBySeparator, convertApi2FormUrlOnlyOne, format } from '@/utils'; | 
| import { FinancialApprovalColumns } from './constants'; | 
| import { useIndustrialParkDropDownList } from '@/hooks/industrialPark'; | 
|   | 
| defineOptions({ | 
|   name: 'FinancialApproval', | 
| }); | 
|   | 
| const operationBtns = defineOperationBtns([ | 
|   { | 
|     data: { | 
|       enCode: 'detailBtn', | 
|       name: '详情', | 
|     }, | 
|     emits: { | 
|       onClick: (role) => openDialog(role, true), | 
|     }, | 
|     extraProps: { | 
|       hide: (row: API.GetParkBountyTradeDetailOutput) => | 
|         row.financeAuditStatus === EnumParkBountyTradeDetailAuditStatus.Wait, | 
|     }, | 
|   }, | 
|   { | 
|     data: { | 
|       enCode: 'checkBtn', | 
|       name: '审批', | 
|     }, | 
|     emits: { | 
|       onClick: (row) => openDialog(row), | 
|     }, | 
|     extraProps: { | 
|       hide: (row: API.GetParkBountyTradeDetailOutput) => | 
|         row.financeAuditStatus !== EnumParkBountyTradeDetailAuditStatus.Wait, | 
|     }, | 
|   }, | 
| ]); | 
|   | 
| const BaseState = { | 
|   loading: true, | 
| }; | 
|   | 
| const state = reactive({ ...BaseState }); | 
| const { industrialParkList } = useIndustrialParkDropDownList(); | 
|   | 
| const fourStreamsIndustrialParkList = computed(() => { | 
|   return industrialParkList.value.filter((x) => !!x.rewardEnable); | 
| }); | 
|   | 
| 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, | 
|         parkId: extraParamState.enterpriseId, | 
|         financeAuditStatus: extraParamState.financeAuditStatus, | 
|         auditTimeBegin: format(extraParamState.creationTime?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), | 
|         auditTimeEnd: format(extraParamState.creationTime?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), | 
|         auditStatus: EnumParkBountyTradeDetailAuditStatus.Pass, | 
|         selfAuditStatus: EnumParkBountyTradeDetailAuditStatus.Pass, | 
|         financeType: FinanceTypeEnum.PlatReward, | 
|       }; | 
|       let res = await parkBountyApplyServices.getParkBountyTradeDetailList(params, { | 
|         showLoading: !state.loading, | 
|       }); | 
|       return res; | 
|     } catch (error) {} | 
|   }, | 
|   { | 
|     defaultExtraParams: { | 
|       searchKeyWord: '', | 
|       enterpriseId: '', | 
|       financeAuditStatus: '' as any as EnumParkBountyTradeDetailAuditStatus, | 
|       creationTime: [] as unknown as ModelValueType, | 
|       orderInput: [{ property: 'auditTime', order: OrderInputType.Desc }], | 
|     }, | 
|     columnsRenderProps: { | 
|       authType: { type: 'enum', valueEnum: EnterpriseTypeText }, | 
|       tradeTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, | 
|       auditTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, | 
|       financeAuditTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, | 
|       tradeAmount: { type: 'money' }, | 
|       bountyAmount: { type: 'money' }, | 
|       financeAuditStatus: { | 
|         type: 'tag', | 
|         valueEnum: EnumParkBountyTradeDetailAuditStatusText, | 
|         tagTypeEnum: EnumParkBountyTradeDetailAuditStatusTag, | 
|       }, | 
|     }, | 
|   } | 
| ); | 
|   | 
| function openDialog(row: API.GetParkBountyTradeDetailOutput, isCheck = false) { | 
|   handleAdd({ | 
|     id: row.id, | 
|     isCheck, | 
|     auditStatus: | 
|       row.financeAuditStatus === EnumParkBountyTradeDetailAuditStatus.Reject | 
|         ? EnumParkBountyTradeDetailAuditStatus.Reject | 
|         : EnumParkBountyTradeDetailAuditStatus.Pass, | 
|     auditRemark: row.financeAuditRemark, | 
|     payAuditFileUrl: isCheck | 
|       ? convertApi2FormUrlObjectBySeparator(row.financeAuditFileUrl) | 
|       : ([] as UploadUserFile[]), | 
|     userName: row.userName, | 
|     enterpriseName: row.enterpriseName, | 
|     societyCreditCode: row.societyCreditCode, | 
|     contactPhone: row.contactPhone, | 
|     authType: row.authType, | 
|     parkName: row.parkName, | 
|     parkTypeName: row.parkTypeName, | 
|     tradeAmount: row.tradeAmount, | 
|     bountyAmount: row.bountyAmount, | 
|     tradeTime: row.tradeTime, | 
|     auditTime: row.auditTime, | 
|     financeAuditTime: row.financeAuditTime, | 
|     payRemark: row.payRemark, | 
|     payFileUrl: convertApi2FormUrlObjectBySeparator(row.payFileUrl), | 
|     title: isCheck ? '详情' : '财务审批', | 
|     incomeCompanyName: row.incomeCompanyName, | 
|     insureBillNo: row.insureBillNo, | 
|     incomeBankAccount: row.incomeBankAccount, | 
|     incomeBankCardNumber: row.incomeBankCardNumber, | 
|     incomeBankName: row.incomeBankName, | 
|     creationTime: row.creationTime, | 
|   }); | 
| } | 
|   | 
| 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, | 
|     bountyAmount: '' as any as number, | 
|     tradeTime: '', | 
|     auditTime: '', | 
|     financeAuditTime: '', | 
|     payRemark: '', | 
|     payFileUrl: [] as UploadUserFile[], | 
|     title: '', | 
|   | 
|     incomeCompanyName: '', | 
|     insureBillNo: '', | 
|     incomeBankAccount: '', | 
|     incomeBankCardNumber: '', | 
|     incomeBankName: '', | 
|     creationTime: '', | 
|   }, | 
| }); | 
|   | 
| 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.financeAuditParkBountyApplyTrade(params); | 
|     if (res) { | 
|       Message.successMessage('操作成功'); | 
|       getList(paginationState.pageIndex); | 
|     } | 
|   } catch (error) {} | 
| } | 
| </script> |