From 052a1c6f01420d695cb3c251619249725181ff02 Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期二, 22 七月 2025 09:32:38 +0800 Subject: [PATCH] feat: 页面 --- src/constants/fourStreams.ts | 3 src/views/Reward/components/RegisterGrantDialog.vue | 121 ++++ src/views/Reward/components/BatchRegisterDialog.vue | 214 +++++++ src/views/Reward/RewardApplyTradeCheck.vue | 31 + src/hooks/fourStreams.ts | 175 ++++++ src/views/Reward/components/UploadFileDialog.vue | 86 +++ src/constants/enum.ts | 2 src/views/Reward/components/RewardApplyTradeCheckDialog.vue | 50 + src/views/Reward/constants/columns.ts | 26 src/hooks/index.ts | 1 src/views/MaterialReview/MaterialReviewAudit.vue | 108 --- src/views/Reward/RewardGrant.vue | 11 src/components/commonView/DeclareEnterpriseTableView.vue | 16 src/constants/reward.ts | 2 src/views/Reward/RewardDeclareDetail.vue | 135 ---- src/components/Table/PortraitTableWithAttachment.vue | 1 src/router/index.ts | 28 src/views/MaterialReview/MaterialReviewDetail.vue | 124 ---- src/views/Reward/FinancialApproval.vue | 257 +++++++++ src/views/Reward/RewardGrantRegister.vue | 282 ++++++++++ 20 files changed, 1,293 insertions(+), 380 deletions(-) diff --git a/src/components/Table/PortraitTableWithAttachment.vue b/src/components/Table/PortraitTableWithAttachment.vue index cefb234..ab47935 100644 --- a/src/components/Table/PortraitTableWithAttachment.vue +++ b/src/components/Table/PortraitTableWithAttachment.vue @@ -1,4 +1,5 @@ <template> + <slot name="title"></slot> <PortraitTable v-bind="portraitTableProps" :label-width="labelWidth"> </PortraitTable> <div class="enclosure-list-title">闄勪欢鍒楄〃</div> <ProTableV2 diff --git a/src/components/commonView/DeclareEnterpriseTableView.vue b/src/components/commonView/DeclareEnterpriseTableView.vue index 8fdd4d1..d3e38de 100644 --- a/src/components/commonView/DeclareEnterpriseTableView.vue +++ b/src/components/commonView/DeclareEnterpriseTableView.vue @@ -11,6 +11,9 @@ </SearchInput> </QueryFilterItem> </template> + <template #btn> + <slot name="btn"></slot> + </template> </ProTableQueryFilterBar> <ProTableV2 v-bind="proTableProps" @@ -53,23 +56,12 @@ }; openDialog?: (row) => void; column?: API.ModuleColumnDto[]; + operationBtns?: OperationBtnType[]; }; const props = withDefaults(defineProps<Props>(), { column: () => BaseDeclareEnterpriseTableViewColumns, }); - -const operationBtns = defineOperationBtns([ - { - data: { - enCode: 'detailBtn', - name: '璇︽儏', - }, - emits: { - onClick: (role) => props.openDialog(role), - }, - }, -]); </script> <style lang="scss" scoped> diff --git a/src/constants/enum.ts b/src/constants/enum.ts index bf513f0..2c5984b 100644 --- a/src/constants/enum.ts +++ b/src/constants/enum.ts @@ -49,3 +49,5 @@ Warning: 'var(--el-color-warning)', Danger: 'var(--el-color-danger)', }; + +export const TempFolderPath = 'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/12333/temp'; diff --git a/src/constants/fourStreams.ts b/src/constants/fourStreams.ts index 59a436b..4b6fcf8 100644 --- a/src/constants/fourStreams.ts +++ b/src/constants/fourStreams.ts @@ -1,4 +1,5 @@ import { defineColumns } from '@bole-core/components'; +import { TempFolderPath } from './enum'; export enum FourStreamsMaterialFileBusinessTypeEnum { /** 鍥尯鍏ラ┗鍗忚 */ @@ -136,3 +137,5 @@ return { addRewardApplyStep3Columns }; } + +export const BountyBatchApplyTransferTemp = `${TempFolderPath}/%E5%85%A5%E8%B4%A6%E6%A8%A1%E6%9D%BF.xlsx`; diff --git a/src/constants/reward.ts b/src/constants/reward.ts index ce66d20..49d6dd0 100644 --- a/src/constants/reward.ts +++ b/src/constants/reward.ts @@ -134,7 +134,7 @@ export enum IncomeTypeEnum { /**璐㈡斂鎷ㄤ粯 */ Fiscal = 10, - /**骞冲彴鍏呭�� */ + /**骞冲彴鎷ㄤ粯 */ Platform = 20, } diff --git a/src/hooks/fourStreams.ts b/src/hooks/fourStreams.ts new file mode 100644 index 0000000..b312d80 --- /dev/null +++ b/src/hooks/fourStreams.ts @@ -0,0 +1,175 @@ +import { defineColumns, defineOperationBtns, useFormDialog, useTable } from '@bole-core/components'; +import { OrderInputType } from '@bole-core/core'; +import { useQueryClient } from '@tanstack/vue-query'; +import { setOSSLink } from '@/utils'; +import { + CustomerApplyFileTypeListItem, + EnterpriseApplyFileUtils, +} from '@/components/commonView/utils'; +import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; +import * as enterpriseApplyFileServices from '@/services/api/EnterpriseApplyFile'; +import { BaseDeclareEnterpriseTableViewColumns, EnterpriseTypeText } from '@/constants'; + +export const rewardGrantRegisterColumns = computed(() => + defineColumns([ + ...BaseDeclareEnterpriseTableViewColumns, + { + id: '9', + enCode: 'a', + name: '璐㈡斂鎷ㄤ粯閲戦', + }, + { + id: '10', + enCode: 'a', + name: '璐㈡斂鎷ㄤ粯宸茬櫥璁�', + }, + { + id: '11', + enCode: 'a', + name: '鏈�杩戠櫥璁版棩鏈�', + }, + { + id: '12', + enCode: 'a', + name: '璐㈡斂鎷ㄤ粯鐧昏鐘舵��', + }, + { + id: '13', + enCode: 'a', + name: '骞冲彴鎷ㄤ粯閲戦', + }, + { + id: '14', + enCode: 'a', + name: '骞冲彴鎷ㄤ粯宸茬櫥璁�', + }, + { + id: '15', + enCode: 'a', + name: '鏈�杩戠櫥璁版棩鏈�', + }, + { + id: '16', + enCode: 'a', + name: '骞冲彴鎷ㄤ粯鐧昏鐘舵��', + }, + ]) +); + +type UseDeclareEnterpriseTableOptions = { + id?: Ref<string>; + applyMonth?: Ref<string>; +}; + +export function useDeclareEnterpriseTable(options: UseDeclareEnterpriseTableOptions = {}) { + const { id, applyMonth } = options; + + const { + getDataSource: getList, + proTableProps, + paginationState, + extraParamState, + reset, + } = useTable( + async ({ pageIndex, pageSize }, extraParamState) => { + try { + let params: API.GetParkBountyApplyInfoInput = { + pageModel: { + rows: pageSize, + page: pageIndex, + orderInput: extraParamState.orderInput, + }, + searchKeyWord: extraParamState.searchKeyWord, + parkBountyApplyId: id.value, + }; + let res = await parkBountyApplyServices.getOutCheckParkBountyApplyDetailList(params); + return res; + } catch (error) {} + }, + { + defaultExtraParams: { + orderInput: [{ property: 'parkBountyApplyId', order: OrderInputType.Desc }], + searchKeyWord: '', + }, + columnsRenderProps: { + authType: { type: 'enum', valueEnum: EnterpriseTypeText }, + licenseUrl: { + type: 'urlV2', + formatter: (row: API.UserCertificationAuditListDto) => setOSSLink(row.licenseUrl), + }, + applyAmount: { type: 'money' }, + }, + } + ); + + const queryClient = useQueryClient(); + const { dialogProps, handleAdd, editForm, dialogState } = useFormDialog({ + defaultFormParams: { + list: [] as CustomerApplyFileTypeListItem[], + companyId: '', + }, + }); + async function openDialog(row: API.ParkBountyApplyDetailInfo) { + try { + const applyFilesRes = await queryClient.ensureQueryData({ + queryKey: [ + 'enterpriseApplyFileServices/getCustomerUploadApplyFiles', + row.enterpriseId, + applyMonth.value, + ], + queryFn: async () => { + return await enterpriseApplyFileServices.getCustomerUploadApplyFiles({ + enterpriseId: row.enterpriseId, + withMonth: applyMonth.value, + }); + }, + }); + const lastUploadEnterPactFile = await queryClient.ensureQueryData({ + queryKey: ['enterpriseApplyFileServices/getCustomerUploadApplyFiles', row.enterpriseId], + queryFn: async () => { + return await parkBountyApplyServices.getEnterpriseLastUploadEnterPactFileNew({ + companyId: row.enterpriseId, + }); + }, + }); + + const applyUploadFiles = await parkBountyApplyServices.getEnterpriseParkApplyUploadFiles({ + companyId: row.enterpriseId, + parkBountyApplyId: id.value, + }); + handleAdd({ + list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles( + applyUploadFiles, + applyFilesRes.items, + lastUploadEnterPactFile + ), + companyId: row.enterpriseId, + }); + } catch (error) {} + } + + const operationBtns = defineOperationBtns([ + { + data: { + enCode: 'detailBtn', + name: '璇︽儏', + }, + emits: { + onClick: (row) => openDialog(row), + }, + }, + ]); + + return { + getList, + proTableProps, + paginationState, + extraParamState, + reset, + openDialog, + dialogProps, + dialogState, + editForm, + operationBtns, + }; +} diff --git a/src/hooks/index.ts b/src/hooks/index.ts index e101419..40bb2cf 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -9,3 +9,4 @@ export * from './help'; export * from './dic'; export * from './table'; +export * from './fourStreams'; diff --git a/src/router/index.ts b/src/router/index.ts index 6314848..23d6f7b 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -222,13 +222,24 @@ }, }, { + path: '/RewardGrantRegister/:id', + name: 'RewardGrantRegister', + hidden: true, + component: () => import('@/views/Reward/RewardGrantRegister.vue'), + meta: { + rank: 10033, + title: '濂栧姳閲戠櫥璁�', + rootMenu: false, + }, + }, + { path: '/WithdrawalApproval', name: 'WithdrawalApproval', hidden: false, alwaysShow: true, component: () => import('@/views/Reward/WithdrawalApproval.vue'), meta: { - rank: 10033, + rank: 10040, title: '鎻愮幇瀹℃壒', // rootMenu: true, icon: 'home', @@ -241,12 +252,25 @@ alwaysShow: true, component: () => import('@/views/Reward/RewardApplyTradeCheck.vue'), meta: { - rank: 10034, + rank: 10050, title: '鍑鸿处瀹℃壒', // rootMenu: true, icon: 'home', }, }, + { + path: '/FinancialApproval', + name: 'FinancialApproval', + hidden: false, + alwaysShow: true, + component: () => import('@/views/Reward/FinancialApproval.vue'), + meta: { + rank: 10060, + title: '璐㈠姟瀹℃壒', + // rootMenu: true, + icon: 'home', + }, + }, ], }, // { diff --git a/src/views/MaterialReview/MaterialReviewAudit.vue b/src/views/MaterialReview/MaterialReviewAudit.vue index fcb7d90..7773e91 100644 --- a/src/views/MaterialReview/MaterialReviewAudit.vue +++ b/src/views/MaterialReview/MaterialReviewAudit.vue @@ -9,7 +9,7 @@ :extra-param-state="extraParamState" :pro-table-props="proTableProps" :reset="reset" - :open-dialog="openDialog" + :operationBtns="operationBtns" ></DeclareEnterpriseTableView> <MateriaDetailDialog v-bind="dialogProps" @@ -91,7 +91,7 @@ import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; import * as enterpriseApplyFileServices from '@/services/api/EnterpriseApplyFile'; import { convertApi2FormUrlObjectBySeparator, setOSSLink } from '@/utils'; -import { useGlobalEventContext, useRouteView } from '@/hooks'; +import { useDeclareEnterpriseTable, useGlobalEventContext, useRouteView } from '@/hooks'; import { FormInstance } from 'element-plus'; import { Message, OrderInputType } from '@bole-core/core'; import { FourStreamsMaterialFileTableItem } from '@/components/commonView/types'; @@ -116,17 +116,18 @@ parkTypeName: '', applyMonth: '', applySumAmount: 0, - // enterpriseTaxSubFileUrl: [] as UploadUserFile[], - // enterpriseOperateFileUrl: [] as UploadUserFile[], - // enterpriseRelateFileUrl: [] as UploadUserFile[], - // bountyAssignFileUlr: [] as UploadUserFile[], - // bountyCollectFileUrl: [] as UploadUserFile[], parkCollectFileList: [] as CustomerApplyFileTypeListItem[], calculationFileList: [] as CustomerApplyFileTypeListItem[], status: '' as any as BountyCheckStatusEnum, remark: '', }); + +const { extraParamState, getList, reset, proTableProps, operationBtns, dialogProps } = + useDeclareEnterpriseTable({ + id: ref(id), + applyMonth: toRef(form, 'applyMonth'), + }); const { data: detail, isLoading } = useQuery({ queryKey: ['parkBountyApplyServices/getOutCheckParkBountyApplyDetailBaseInfo', id], @@ -145,17 +146,6 @@ 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.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList( data.listFiles ); @@ -166,43 +156,6 @@ getList(); }, }); - -const { - getDataSource: getList, - proTableProps, - paginationState, - extraParamState, - reset, -} = useTable( - async ({ pageIndex, pageSize }, extraParamState) => { - try { - let params: API.GetParkBountyApplyInfoInput = { - pageModel: { - rows: pageSize, - page: pageIndex, - orderInput: extraParamState.orderInput, - }, - searchKeyWord: extraParamState.searchKeyWord, - parkBountyApplyId: id, - }; - let res = await parkBountyApplyServices.getOutCheckParkBountyApplyDetailList(params); - return res; - } catch (error) {} - }, - { - defaultExtraParams: { - orderInput: [{ property: 'enterpriseId', order: OrderInputType.Desc }], - searchKeyWord: '', - }, - columnsRenderProps: { - authType: { type: 'enum', valueEnum: EnterpriseTypeText }, - licenseUrl: { - type: 'urlV2', - formatter: (row: API.UserCertificationAuditListDto) => setOSSLink(row.licenseUrl), - }, - }, - } -); function handleBack() { closeViewPush(route, { @@ -242,52 +195,7 @@ } catch (error) {} } -const { dialogProps, handleAdd, editForm } = useFormDialog({ - defaultFormParams: { - list: [] as CustomerApplyFileTypeListItem[], - companyId: '', - }, -}); const { getIndustrialParkTypeNameById } = useIndustrialParkDropDownList(); - -async function openDialog(row: API.ParkBountyApplyDetailInfo) { - try { - const applyFilesRes = await queryClient.ensureQueryData({ - queryKey: [ - 'enterpriseApplyFileServices/getCustomerUploadApplyFiles', - row.enterpriseId, - form.applyMonth, - ], - queryFn: async () => { - return await enterpriseApplyFileServices.getCustomerUploadApplyFiles({ - enterpriseId: row.enterpriseId, - withMonth: form.applyMonth, - }); - }, - }); - const lastUploadEnterPactFile = await queryClient.ensureQueryData({ - queryKey: ['enterpriseApplyFileServices/getCustomerUploadApplyFiles', row.enterpriseId], - queryFn: async () => { - return await parkBountyApplyServices.getEnterpriseLastUploadEnterPactFileNew({ - companyId: row.enterpriseId, - }); - }, - }); - - const applyUploadFiles = await parkBountyApplyServices.getEnterpriseParkApplyUploadFiles({ - companyId: row.enterpriseId, - parkBountyApplyId: id, - }); - handleAdd({ - list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles( - applyUploadFiles, - applyFilesRes.items, - lastUploadEnterPactFile - ), - companyId: row.enterpriseId, - }); - } catch (error) {} -} </script> <style lang="scss" scoped> diff --git a/src/views/MaterialReview/MaterialReviewDetail.vue b/src/views/MaterialReview/MaterialReviewDetail.vue index 3a27e09..8a0f348 100644 --- a/src/views/MaterialReview/MaterialReviewDetail.vue +++ b/src/views/MaterialReview/MaterialReviewDetail.vue @@ -24,8 +24,8 @@ :extra-param-state="extraParamState" :pro-table-props="proTableProps" :reset="reset" - :open-dialog="openDialog" :column="addRewardApplyStep3Columns" + :operationBtns="operationBtns" ></DeclareEnterpriseTableView> <MateriaDetailDialog v-bind="dialogProps" @@ -47,34 +47,25 @@ import { AppContainer, LoadingLayout, - UploadUserFile, PageFormLayout, - useTable, - useFormDialog, TextOverTooltip, } from '@bole-core/components'; import ChunkCellV2 from '@/components/Layout/ChunkCellV2.vue'; import DetailView from '@/components/commonView/DetailView.vue'; import MateriaDetailDialog from '@/components/commonView/MateriaDetailDialog.vue'; import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue'; -import { useQuery, useQueryClient } from '@tanstack/vue-query'; +import { useQuery } from '@tanstack/vue-query'; import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; -import * as enterpriseApplyFileServices from '@/services/api/EnterpriseApplyFile'; -import { convertApi2FormUrlObjectBySeparator, setOSSLink } from '@/utils'; -import { useRouteView } from '@/hooks'; -import { OrderInputType } from '@bole-core/core'; +import { useDeclareEnterpriseTable, useRouteView } from '@/hooks'; import { - EnterpriseTypeText, BountyCheckStatusEnum, BountyCheckStatusEnumText, BountyCheckStatusEnumColor, useAddRewardApplyStep3Columns, } from '@/constants'; -import { FourStreamsMaterialFileTableItem } from '@/components/commonView/types'; import { CustomerApplyFileTypeListItem, EnterpriseApplyFileUtils, - FourStreamsMaterialUtils, } from '@/components/commonView/utils'; import { useIndustrialParkDropDownList } from '@/hooks/industrialPark'; @@ -91,11 +82,6 @@ parkTypeName: '', applyMonth: '', applySumAmount: 0, - // enterpriseTaxSubFileUrl: [] as UploadUserFile[], - // enterpriseOperateFileUrl: [] as UploadUserFile[], - // enterpriseRelateFileUrl: [] as UploadUserFile[], - // bountyAssignFileUlr: [] as UploadUserFile[], - // bountyCollectFileUrl: [] as UploadUserFile[], parkCollectFileList: [] as CustomerApplyFileTypeListItem[], calculationFileList: [] as CustomerApplyFileTypeListItem[], @@ -108,6 +94,12 @@ const { addRewardApplyStep3Columns } = useAddRewardApplyStep3Columns({ suportEnterpriseUpload: toRef(form, 'suportEnterpriseUpload'), }); + +const { extraParamState, getList, reset, proTableProps, operationBtns, dialogProps } = + useDeclareEnterpriseTable({ + id: ref(id), + applyMonth: toRef(form, 'applyMonth'), + }); const tableRef = ref<InstanceType<typeof DeclareEnterpriseTableView>>(); @@ -130,17 +122,6 @@ 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.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList( data.listFiles ); @@ -154,94 +135,7 @@ }, }); -const { - getDataSource: getList, - proTableProps, - paginationState, - extraParamState, - reset, -} = useTable( - async ({ pageIndex, pageSize }, extraParamState) => { - try { - let params: API.GetParkBountyApplyInfoInput = { - pageModel: { - rows: pageSize, - page: pageIndex, - orderInput: extraParamState.orderInput, - }, - searchKeyWord: extraParamState.searchKeyWord, - parkBountyApplyId: id, - }; - let res = await parkBountyApplyServices.getOutCheckParkBountyApplyDetailList(params); - return res; - } catch (error) {} - }, - { - defaultExtraParams: { - orderInput: [{ property: 'parkBountyApplyId', order: OrderInputType.Desc }], - searchKeyWord: '', - }, - columnsRenderProps: { - authType: { type: 'enum', valueEnum: EnterpriseTypeText }, - applyAmount: { type: 'money' }, - }, - } -); - -const { dialogProps, handleAdd, editForm } = useFormDialog({ - defaultFormParams: { - list: [] as CustomerApplyFileTypeListItem[], - companyId: '', - }, -}); - const { getIndustrialParkTypeNameById } = useIndustrialParkDropDownList(); -const queryClient = useQueryClient(); -async function openDialog(row: API.ParkBountyApplyDetailInfo) { - try { - const applyFilesRes = await queryClient.ensureQueryData({ - queryKey: [ - 'enterpriseApplyFileServices/getCustomerUploadApplyFiles', - row.enterpriseId, - form.applyMonth, - ], - queryFn: async () => { - return await enterpriseApplyFileServices.getCustomerUploadApplyFiles({ - enterpriseId: row.enterpriseId, - withMonth: form.applyMonth, - }); - }, - }); - const lastUploadEnterPactFile = await queryClient.ensureQueryData({ - queryKey: ['enterpriseApplyFileServices/getCustomerUploadApplyFiles', row.enterpriseId], - queryFn: async () => { - return await parkBountyApplyServices.getEnterpriseLastUploadEnterPactFileNew({ - companyId: row.enterpriseId, - }); - }, - }); - - const applyUploadFiles = await parkBountyApplyServices.getEnterpriseParkApplyUploadFiles({ - companyId: row.enterpriseId, - parkBountyApplyId: id, - }); - handleAdd({ - list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles( - applyUploadFiles, - applyFilesRes.items, - lastUploadEnterPactFile - ), - companyId: row.enterpriseId, - }); - } catch (error) {} - // handleAdd({ - // list: FourStreamsMaterialUtils.initFourStreamsMaterialFileList( - // row, - // getIndustrialParkTypeNameById(detail.value?.parkId) - // ), - // companyId: row.enterpriseId, - // }); -} function handleBack() { closeViewPush(route, { diff --git a/src/views/Reward/FinancialApproval.vue b/src/views/Reward/FinancialApproval.vue new file mode 100644 index 0000000..59c2461 --- /dev/null +++ b/src/views/Reward/FinancialApproval.vue @@ -0,0 +1,257 @@ +<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.auditStatus" + :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: 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, + 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, +} from '@/constants'; +import { ModelValueType } from 'element-plus'; +import RewardApplyTradeCheckDialog from './components/RewardApplyTradeCheckDialog.vue'; +import { convertApi2FormUrlOnlyOne, format } from '@/utils'; +import { RewardApplyTradeCheckColumns } 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.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 }); +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, + // 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: '', + enterpriseId: '', + auditStatus: '' as any as EnumParkBountyTradeDetailAuditStatus, + 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/RewardApplyTradeCheck.vue b/src/views/Reward/RewardApplyTradeCheck.vue index 32b478b..9c7a057 100644 --- a/src/views/Reward/RewardApplyTradeCheck.vue +++ b/src/views/Reward/RewardApplyTradeCheck.vue @@ -3,6 +3,26 @@ <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.auditStatus" + :value-enum="EnumParkBountyTradeDetailAuditStatusText" + buttonStyle + showAllBtn + @change="getList()" + ></FieldRadio> + </QueryFilterItem> <QueryFilterItem tip-content="鐢宠鍑鸿处鏃ユ湡"> <FieldDatePicker v-model="extraParamState.creationTime" @@ -39,7 +59,7 @@ <script setup lang="ts"> import { ProTableQueryFilterBar, - OperationBtnType, + FieldSelect, ProTableV2, SearchInput, LoadingLayout, @@ -50,6 +70,7 @@ useFormDialog, UploadUserFile, defineOperationBtns, + FieldRadio, } from '@bole-core/components'; import { Message, OrderInputType } from '@bole-core/core'; import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; @@ -64,6 +85,7 @@ import RewardApplyTradeCheckDialog from './components/RewardApplyTradeCheckDialog.vue'; import { convertApi2FormUrlOnlyOne, format } from '@/utils'; import { RewardApplyTradeCheckColumns } from './constants'; +import { useIndustrialParkDropDownList } from '@/hooks/industrialPark'; defineOptions({ name: 'RewardApplyTradeCheck', @@ -103,6 +125,11 @@ }; const state = reactive({ ...BaseState }); +const { industrialParkList } = useIndustrialParkDropDownList(); + +const fourStreamsIndustrialParkList = computed(() => { + return industrialParkList.value.filter((x) => !!x.rewardEnable); +}); onMounted(async () => { await getList(); @@ -141,6 +168,8 @@ { defaultExtraParams: { searchKeyWord: '', + enterpriseId: '', + auditStatus: '' as any as EnumParkBountyTradeDetailAuditStatus, creationTime: [] as unknown as ModelValueType, orderInput: [{ property: 'tradeTime', order: OrderInputType.Desc }], }, diff --git a/src/views/Reward/RewardDeclareDetail.vue b/src/views/Reward/RewardDeclareDetail.vue index 1bf9d08..6c481f1 100644 --- a/src/views/Reward/RewardDeclareDetail.vue +++ b/src/views/Reward/RewardDeclareDetail.vue @@ -9,8 +9,8 @@ :extra-param-state="extraParamState" :pro-table-props="proTableProps" :reset="reset" - :open-dialog="openDialog" :column="addRewardApplyStep3Columns" + :operationBtns="operationBtns" ></DeclareEnterpriseTableView> <MateriaDetailDialog v-bind="dialogProps" @@ -29,31 +29,19 @@ </template> <script setup lang="ts"> -import { - AppContainer, - LoadingLayout, - UploadUserFile, - PageFormLayout, - useTable, - useFormDialog, -} from '@bole-core/components'; +import { AppContainer, LoadingLayout, PageFormLayout } from '@bole-core/components'; import DetailView from '@/components/commonView/DetailView.vue'; import ChunkCellV2 from '@/components/Layout/ChunkCellV2.vue'; import MateriaDetailDialog from '@/components/commonView/MateriaDetailDialog.vue'; import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue'; -import { useQuery, useQueryClient } from '@tanstack/vue-query'; +import { useQuery } from '@tanstack/vue-query'; import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; -import * as enterpriseApplyFileServices from '@/services/api/EnterpriseApplyFile'; -import { convertApi2FormUrlObjectBySeparator, setOSSLink } from '@/utils'; -import { useRouteView } from '@/hooks'; -import { OrderInputType } from '@bole-core/core'; -import { EnterpriseTypeText, useAddRewardApplyStep3Columns } from '@/constants'; -import { FourStreamsMaterialFileTableItem } from '@/components/commonView/types'; +import { useDeclareEnterpriseTable, useRouteView } from '@/hooks'; +import { useAddRewardApplyStep3Columns } from '@/constants'; import { useIndustrialParkDropDownList } from '@/hooks/industrialPark'; import { CustomerApplyFileTypeListItem, EnterpriseApplyFileUtils, - FourStreamsMaterialUtils, } from '@/components/commonView/utils'; defineOptions({ @@ -69,19 +57,20 @@ parkTypeName: '', applyMonth: '', applySumAmount: 0, - // enterpriseTaxSubFileUrl: [] as UploadUserFile[], - // enterpriseOperateFileUrl: [] as UploadUserFile[], - // enterpriseRelateFileUrl: [] as UploadUserFile[], parkCollectFileList: [] as CustomerApplyFileTypeListItem[], calculationFileList: [] as CustomerApplyFileTypeListItem[], - // bountyAssignFileUlr: [] as UploadUserFile[], - // bountyCollectFileUrl: [] as UploadUserFile[], suportEnterpriseUpload: false, }); const { addRewardApplyStep3Columns } = useAddRewardApplyStep3Columns({ suportEnterpriseUpload: toRef(form, 'suportEnterpriseUpload'), }); + +const { extraParamState, getList, reset, proTableProps, operationBtns, dialogProps } = + useDeclareEnterpriseTable({ + id: ref(id), + applyMonth: toRef(form, 'applyMonth'), + }); const { data: detail, isLoading } = useQuery({ queryKey: ['parkBountyApplyServices/getParkBountyApplyDetailBaseInfo', id], @@ -100,121 +89,19 @@ form.parkTypeName = data.parkTypeName; form.applyMonth = data.applyMonth; form.applySumAmount = data.applySumAmount; - // form.enterpriseTaxSubFileUrl = convertApi2FormUrlObjectBySeparator( - // data?.enterpriseTaxSubFileUrl - // ); - // form.enterpriseOperateFileUrl = convertApi2FormUrlObjectBySeparator( - // data?.enterpriseOperateFileUrl - // ); form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList( data.listFiles ); form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList( data.collectCountListFiles ); - // form.bountyAssignFileUlr = convertApi2FormUrlObjectBySeparator(data?.bountyAssignFileUlr); - // form.bountyCollectFileUrl = convertApi2FormUrlObjectBySeparator(data?.bountyCollectFileUrl); - // form.enterpriseRelateFileUrl = convertApi2FormUrlObjectBySeparator( - // data?.enterpriseRelateFileUrl - // ); form.suportEnterpriseUpload = data.suportEnterpriseUpload; getList(); }, }); -const { - getDataSource: getList, - proTableProps, - paginationState, - extraParamState, - reset, -} = useTable( - async ({ pageIndex, pageSize }, extraParamState) => { - try { - let params: API.GetParkBountyApplyInfoInput = { - pageModel: { - rows: pageSize, - page: pageIndex, - orderInput: extraParamState.orderInput, - }, - searchKeyWord: extraParamState.searchKeyWord, - parkBountyApplyId: id, - }; - let res = await parkBountyApplyServices.getOutCheckParkBountyApplyDetailList(params); - return res; - } catch (error) {} - }, - { - defaultExtraParams: { - orderInput: [{ property: 'parkBountyApplyId', order: OrderInputType.Desc }], - searchKeyWord: '', - }, - columnsRenderProps: { - authType: { type: 'enum', valueEnum: EnterpriseTypeText }, - licenseUrl: { - type: 'urlV2', - formatter: (row: API.UserCertificationAuditListDto) => setOSSLink(row.licenseUrl), - }, - applyAmount: { type: 'money' }, - }, - } -); - -const { dialogProps, handleAdd, editForm } = useFormDialog({ - defaultFormParams: { - list: [] as CustomerApplyFileTypeListItem[], - companyId: '', - }, -}); - const { getIndustrialParkTypeNameById } = useIndustrialParkDropDownList(); -const queryClient = useQueryClient(); -async function openDialog(row: API.ParkBountyApplyDetailInfo) { - try { - const applyFilesRes = await queryClient.ensureQueryData({ - queryKey: [ - 'enterpriseApplyFileServices/getCustomerUploadApplyFiles', - row.enterpriseId, - form.applyMonth, - ], - queryFn: async () => { - return await enterpriseApplyFileServices.getCustomerUploadApplyFiles({ - enterpriseId: row.enterpriseId, - withMonth: form.applyMonth, - }); - }, - }); - const lastUploadEnterPactFile = await queryClient.ensureQueryData({ - queryKey: ['enterpriseApplyFileServices/getCustomerUploadApplyFiles', row.enterpriseId], - queryFn: async () => { - return await parkBountyApplyServices.getEnterpriseLastUploadEnterPactFileNew({ - companyId: row.enterpriseId, - }); - }, - }); - - const applyUploadFiles = await parkBountyApplyServices.getEnterpriseParkApplyUploadFiles({ - companyId: row.enterpriseId, - parkBountyApplyId: id, - }); - handleAdd({ - list: EnterpriseApplyFileUtils.initParkCollectFileListApplyFiles( - applyUploadFiles, - applyFilesRes.items, - lastUploadEnterPactFile - ), - companyId: row.enterpriseId, - }); - } catch (error) {} - // handleEdit({ - // list: FourStreamsMaterialUtils.initFourStreamsMaterialFileList( - // row, - // getIndustrialParkTypeNameById(detail.value?.parkId) - // ), - // companyId: row.enterpriseId, - // }); -} function handleBack() { closeViewPush(route, { diff --git a/src/views/Reward/RewardGrant.vue b/src/views/Reward/RewardGrant.vue index e6b15e0..27e2812 100644 --- a/src/views/Reward/RewardGrant.vue +++ b/src/views/Reward/RewardGrant.vue @@ -233,7 +233,7 @@ name: '鐧昏', }, emits: { - onClick: (role) => openRegisterDialog(role), + onClick: (role) => goRewardGrantRegister(role), }, extraProps: { hide: (row: API.GetParkBountyApplyListOutput) => @@ -544,6 +544,15 @@ } } catch (error) {} } + +function goRewardGrantRegister(row: API.GetParkBountyApplyListOutput) { + router.push({ + name: 'RewardGrantRegister', + params: { + id: row.id, + }, + }); +} </script> <style lang="scss" scoped> diff --git a/src/views/Reward/RewardGrantRegister.vue b/src/views/Reward/RewardGrantRegister.vue new file mode 100644 index 0000000..c096eb3 --- /dev/null +++ b/src/views/Reward/RewardGrantRegister.vue @@ -0,0 +1,282 @@ +<template> + <LoadingLayout> + <AppContainer> + <PageFormLayout title="濂栧姳閲戠櫥璁�"> + <DetailView :form="form"> + <ChunkCellV2 title="鐢虫姤浼佷笟鍚嶅崟"> + <DeclareEnterpriseTableView + :getList="getList" + :extra-param-state="extraParamState" + :pro-table-props="proTableProps" + :reset="reset" + :operationBtns="registerOperationBtns" + :column="rewardGrantRegisterColumns" + > + <template #btn> + <el-button type="primary" link @click="downloadTemp()">涓嬭浇妯℃澘</el-button> + <el-button icon="Upload" type="primary" @click="openUploadFileDialog()" + >瀵煎叆</el-button + > + <el-button icon="Plus" type="primary" @click="openBatchRegisterDialog()" + >鎵归噺鐧昏</el-button + > + </template> + </DeclareEnterpriseTableView> + <FourStreamsMaterialFileDialogV2 + v-bind="dialogMaterialFileProps" + :show-upload-btn="false" + :show-delete-btn="false" + :show-check-btn="false" + downloadBtnText="鏌ョ湅" + title="鏌ョ湅鍑瘉" + :BusinessTypeEnumText="TransferFileEnumInRewardGrandText" + /> + </ChunkCellV2> + </DetailView> + <template #footer> + <el-button @click="handleBack">鍙栨秷</el-button> + <el-button @click="handleBack" type="primary">纭</el-button> + </template> + </PageFormLayout> + </AppContainer> + <RegisterGrantDialog v-bind="dialogRegisterGrantProps" /> + <UploadFileDialog v-bind="dialogUploadFileProps" /> + <BatchRegisterDialog v-bind="dialogBatchRegisterProps" /> + </LoadingLayout> +</template> + +<script setup lang="ts"> +import { + AppContainer, + defineOperationBtns, + LoadingLayout, + PageFormLayout, + UploadUserFile, + useFormDialog, + XLSXUtils, +} from '@bole-core/components'; +import DetailView from '@/components/commonView/DetailView.vue'; +import ChunkCellV2 from '@/components/Layout/ChunkCellV2.vue'; +import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue'; +import { useQuery } from '@tanstack/vue-query'; +import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; +import { useRouteView } from '@/hooks'; +import { useIndustrialParkDropDownList } from '@/hooks/industrialPark'; +import { + CustomerApplyFileTypeListItem, + EnterpriseApplyFileUtils, + FourStreamsMaterialUtils, +} from '@/components/commonView/utils'; +import { + BountyBatchApplyTransferTemp, + FinanceStatusEnum, + IncomeTypeEnum, + SettleStatusEnum, + TransferFileEnumInRewardGrandText, +} from '@/constants'; +import { useDeclareEnterpriseTable, rewardGrantRegisterColumns } from '@/hooks'; +import { TransferFileEnumInRewardGrandTableItem } from '@/components/commonView/types'; +import RegisterGrantDialog from './components/RegisterGrantDialog.vue'; +import BatchRegisterDialog from './components/BatchRegisterDialog.vue'; +import UploadFileDialog from './components/UploadFileDialog.vue'; +import { downloadFileByUrl } from '@/utils'; +import { Message } from '@bole-core/core'; +import { ImportParkBountyDataHeaderMap } from './constants'; + +defineOptions({ + name: 'RewardGrantRegister', +}); + +const route = useRoute(); +const { closeViewPush } = useRouteView(); +const id = route.params?.id as string; +const form = reactive({ + batchNo: '', + parkName: '', + parkTypeName: '', + applyMonth: '', + applySumAmount: 0, + parkCollectFileList: [] as CustomerApplyFileTypeListItem[], + calculationFileList: [] as CustomerApplyFileTypeListItem[], + suportEnterpriseUpload: false, +}); + +const { extraParamState, paginationState, getList, reset, proTableProps } = + useDeclareEnterpriseTable({ + id: ref(id), + applyMonth: toRef(form, 'applyMonth'), + }); + +const registerOperationBtns = defineOperationBtns([ + { + data: { + enCode: 'registerGrantBtn', + name: '鐧昏', + }, + emits: { + onClick: (row) => openRegisterGrantDialog(row), + }, + }, + { + data: { + enCode: 'checkBtn', + name: '鏌ョ湅鍑瘉', + }, + emits: { + onClick: (row) => openMaterialFileDialog(row), + }, + }, +]); + +const { data: detail, isLoading } = useQuery({ + queryKey: ['parkBountyApplyServices/getParkBountyApplyDetailBaseInfo', id], + queryFn: async () => { + return await parkBountyApplyServices.getParkBountyApplyDetailBaseInfo( + { parkBountyApplyId: id }, + { + showLoading: false, + } + ); + }, + placeholderData: () => ({} as API.ParkBountyApplyBaseInfo), + onSuccess(data) { + form.batchNo = data.batchNo; + form.parkName = data.parkName; + form.parkTypeName = data.parkTypeName; + form.applyMonth = data.applyMonth; + form.applySumAmount = data.applySumAmount; + form.parkCollectFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList( + data.listFiles + ); + form.calculationFileList = EnterpriseApplyFileUtils.convertApiFileToParkCollectFileList( + data.collectCountListFiles + ); + form.suportEnterpriseUpload = data.suportEnterpriseUpload; + + getList(); + }, +}); + +const { getIndustrialParkTypeNameById } = useIndustrialParkDropDownList(); + +const { dialogProps: dialogMaterialFileProps, handleAdd: handleMaterialFileAdd } = useFormDialog({ + defaultFormParams: { + list: [] as TransferFileEnumInRewardGrandTableItem[], + }, +}); +function openMaterialFileDialog(row: API.GetParkBountyApplyListOutput) { + handleMaterialFileAdd({ + list: FourStreamsMaterialUtils.initApplyRewardGrandFileList(row), + }); +} + +const { + dialogProps: dialogRegisterGrantProps, + handleEdit: handleRegisterGrantEdit, + editForm: editRegisterForm, +} = useFormDialog({ + onConfirm: handleRegisterGrant, + defaultFormParams: { + incomeType: '' as any as IncomeTypeEnum, + parkBountyApplyId: '', + fileUrl: [] as UploadUserFile[], + financeSumAmount: 0, + showSuportPlatRecharge: false, + showSuportFiscalRecharge: false, + }, +}); + +function openRegisterGrantDialog(row?: API.GetParkBountyApplyListOutput) { + handleRegisterGrantEdit({ + incomeType: '' as any as IncomeTypeEnum, + fileUrl: [] as UploadUserFile[], + showSuportPlatRecharge: row.settleStatus === SettleStatusEnum.WaitForSettle, + showSuportFiscalRecharge: row.financeStatus === FinanceStatusEnum.WaitForIncome, + parkBountyApplyId: row.id, + financeSumAmount: 0, + }); +} + +async function handleRegisterGrant() {} + +const { dialogProps: dialogUploadFileProps, handleAdd: handleUploadFileAdd } = useFormDialog({ + onConfirm: handleImportParkBountyData, + defaultFormParams: { + parkBountyApplyId: '', + url: [] as UploadUserFile[], + certificateUrl: [] as UploadUserFile[], + }, +}); + +async function handleImportParkBountyData(response: UploadUserFile) { + try { + let params: API.ImportBountyApplyDataInput = { + parkBountyApplyId: id, + url: response.url, + }; + let res = await parkBountyApplyServices.importParkBountyData(params, { + timeout: 100000000, + }); + if (res.error.length > 0) { + await Message.tipMessage('瀛樺湪閿欒鏁版嵁,鏄惁瀵煎嚭'); + XLSXUtils.exportToXLSX({ + workbookDataList: res.error, + fileName: '鎵归噺瀵煎叆鍏ヨ处-閿欒鏁版嵁', + workbookHeaderMap: ImportParkBountyDataHeaderMap, + }); + } + getList(paginationState.pageIndex); + } catch (error) {} +} + +function openUploadFileDialog() { + handleUploadFileAdd({ + parkBountyApplyId: id, + url: [] as UploadUserFile[], + certificateUrl: [] as UploadUserFile[], + }); +} + +async function openBatchRegisterDialog() { + try { + handleBatchRegisterAdd({ + parkBountyApplyId: id, + showSuportPlatRecharge: false, + }); + } catch (error) {} +} + +const { + dialogProps: dialogBatchRegisterProps, + handleAdd: handleBatchRegisterAdd, + editForm: batchRegisterEditForm, +} = useFormDialog({ + onConfirm: handleBatchRegister, + defaultFormParams: { + parkBountyApplyDetailIds: [] as string[], + amount: 0, + companyList: [] as API.GetNotTransferCompanyNameListOutput[], + incomeType: IncomeTypeEnum.Fiscal, + parkBountyApplyId: '', + showSuportPlatRecharge: false, + + certificateUrl: [] as UploadUserFile[], + }, +}); + +async function handleBatchRegister() {} + +function downloadTemp() { + downloadFileByUrl(BountyBatchApplyTransferTemp, '鐧昏妯℃澘'); +} + +function handleBack() { + closeViewPush(route, { + name: 'RewardGrant', + }); +} +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/Reward/components/BatchRegisterDialog.vue b/src/views/Reward/components/BatchRegisterDialog.vue new file mode 100644 index 0000000..a3f1014 --- /dev/null +++ b/src/views/Reward/components/BatchRegisterDialog.vue @@ -0,0 +1,214 @@ +<template> + <ProDialog + title="鎵归噺鐧昏" + v-model="visible" + @close="onDialogClose" + destroy-on-close + draggable + width="700px" + > + <ProForm :model="form" ref="dialogForm" label-width="120px"> + <ProFormItemV2 prop="ids" class="pro-form-item-label-hidden"> + <div class="batchEntryRewardBody"> + <el-transfer + v-model="deleteList" + filterable + :filter-method="filterMethod" + filter-placeholder="璇疯緭鍏ユ悳绱㈠唴瀹�" + :data="form.companyList" + :titles="['鐧昏', '涓嶇櫥璁�']" + :props="prop" + @change="handleChange" + /> + </div> + </ProFormItemV2> + <ProFormItemV2 label="鐧昏绫诲瀷:" prop="incomeType" required> + <ProFormRadio + v-model="form.incomeType" + :value-enum="incomeTypeEnum" + :button-style="false" + @change="handleIncomeTypeChange" + /> + </ProFormItemV2> + <ProFormItemV2 + label="鐧昏閲戦:" + prop="amount" + :check-rules="[{ message: '璇疯緭鍏ョ櫥璁伴噾棰�', type: 'number' }]" + > + <ProFormInputNumber + v-model="form.amount" + :controls="false" + :min="0" + unit="鍏�" + :precision="2" + ></ProFormInputNumber> + </ProFormItemV2> + <ProFormItemV2 + label="涓婁紶鐧昏鍑瘉:" + prop="certificateUrl" + :check-rules="[{ message: '璇蜂笂浼犵櫥璁板嚟璇�', type: 'upload' }]" + > + <ProFormUpload + v-model:file-url="form.certificateUrl" + :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, TransferPropsAlias } from 'element-plus'; +import { + ProDialog, + ProForm, + ProFormItemV2, + ProFormInputNumber, + ProFormRadio, + ProFormUpload, + UploadUserFile, +} from '@bole-core/components'; +import { Message } from '@bole-core/core'; +import { IncomeTypeEnumText, IncomeTypeEnum } from '@/constants'; +import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; + +defineOptions({ + name: 'BatchRegisterDialog', +}); + +type Props = { + /** + * @deprecated + */ + financeSumAmount?: number; +}; + +const props = withDefaults(defineProps<Props>(), {}); + +const visible = defineModel({ type: Boolean }); + +type Form = { + title?: string; + parkBountyApplyDetailIds: string[]; + amount: number; + companyList: API.GetNotTransferCompanyNameListOutput[]; + incomeType: IncomeTypeEnum; + parkBountyApplyId: string; + showSuportPlatRecharge: boolean; + + certificateUrl: UploadUserFile[]; +}; + +const form = defineModel<Form>('form'); + +const incomeTypeEnum = computed(() => { + return [ + { + label: IncomeTypeEnumText[IncomeTypeEnum.Fiscal], + value: IncomeTypeEnum.Fiscal, + }, + form.value.showSuportPlatRecharge && { + label: IncomeTypeEnumText[IncomeTypeEnum.Platform], + value: IncomeTypeEnum.Platform, + }, + ].filter(Boolean); +}); + +const deleteList = ref<string[]>([]); + +watch(visible, (value, oldValue) => { + if (value && !oldValue) { + getParkBountyApplyBatchFinanceEnterprise(); + } +}); + +async function getParkBountyApplyBatchTransferEnterprise() { + try { + let res = await parkBountyApplyServices.getParkBountyApplyBatchTransferEnterprise({ + parkBountyApplyId: form.value.parkBountyApplyId, + }); + if (res) { + form.value.companyList = res; + form.value.parkBountyApplyDetailIds = res.map((x) => x.parkBountyApplyDetailId); + deleteList.value = []; + } + } catch (error) {} +} + +async function getParkBountyApplyBatchFinanceEnterprise() { + try { + let res = await parkBountyApplyServices.getParkBountyApplyBatchFinanceEnterprise({ + parkBountyApplyId: form.value.parkBountyApplyId, + }); + if (res) { + form.value.companyList = res; + form.value.parkBountyApplyDetailIds = res.map((x) => x.parkBountyApplyDetailId); + deleteList.value = []; + } + } catch (error) {} +} +function handleIncomeTypeChange() { + if (form.value.incomeType === IncomeTypeEnum.Fiscal) { + getParkBountyApplyBatchFinanceEnterprise(); + } else { + getParkBountyApplyBatchTransferEnterprise(); + } +} + +function handleChange(ids: string[]) { + form.value.parkBountyApplyDetailIds = form.value.companyList + .filter((item) => !ids.includes(item.companyId)) + .map((item) => item.parkBountyApplyDetailId); +} + +const emit = defineEmits<{ + (e: 'onConfirm'): void; + (e: 'onCancel'): void; +}>(); + +const dialogForm = ref<FormInstance>(); + +function onDialogClose() { + if (!dialogForm.value) return; + dialogForm.value.resetFields(); +} + +function handleConfirm() { + if (!form.value.parkBountyApplyDetailIds.length) { + Message.warnMessage('璇烽�夋嫨鍏ヨ处浼佷笟'); + return; + } + if (!dialogForm.value) return; + dialogForm.value.validate((valid) => { + if (valid) { + emit('onConfirm'); + } else { + return; + } + }); +} + +const prop = { + label: 'name', + key: 'companyId', +} as TransferPropsAlias; + +const filterMethod = (query: string, item: API.GetCompanyNameListOutput) => { + return item.name.toLowerCase().includes(query.toLowerCase()); +}; +</script> + +<style lang="scss" scoped> +.batchEntryRewardBody { + display: flex; + justify-content: center; + width: 100%; +} +</style> diff --git a/src/views/Reward/components/RegisterGrantDialog.vue b/src/views/Reward/components/RegisterGrantDialog.vue new file mode 100644 index 0000000..4a135dc --- /dev/null +++ b/src/views/Reward/components/RegisterGrantDialog.vue @@ -0,0 +1,121 @@ +<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> + <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, + ProFormInputNumber, + ProFormRadio, + ProFormUpload, + UploadUserFile, +} from '@bole-core/components'; +import { IncomeTypeEnumText, IncomeTypeEnum, FinanceStatusEnum } from '@/constants'; + +defineOptions({ + name: 'RegisterGrantDialog', +}); + +const visible = defineModel({ type: Boolean }); + +type Form = { + title?: string; + financeSumAmount: number; + fileUrl: UploadUserFile[]; + 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> diff --git a/src/views/Reward/components/RewardApplyTradeCheckDialog.vue b/src/views/Reward/components/RewardApplyTradeCheckDialog.vue index 42d82a7..92e94dc 100644 --- a/src/views/Reward/components/RewardApplyTradeCheckDialog.vue +++ b/src/views/Reward/components/RewardApplyTradeCheckDialog.vue @@ -1,6 +1,13 @@ <template> <ProDialog title="鍑鸿处瀹℃壒" v-model="visible" @close="onDialogClose" destroy-on-close draggable> - <PortraitTableWithAttachment v-bind="portraitTableWithAttachmentProps" /> + <PortraitTableWithAttachment v-bind="portraitTableWithAttachmentProps"> + <template #title> + <el-row class="portrait-table-with-attachment-title"> + <el-text style="color: #333333">鎵撴淇℃伅</el-text> + <el-button type="primary" link @click="handleApply">澶嶅埗</el-button> + </el-row> + </template> + </PortraitTableWithAttachment> <ProForm :model="form" ref="dialogForm" @@ -103,7 +110,7 @@ UploadUserFile, } from '@bole-core/components'; import * as parkBountyApplyServices from '@/services/api/ParkBountyApply'; -import { usePortraitTableWithAttachment } from '@/hooks'; +import { copyTextToClipboard, usePortraitTableWithAttachment } from '@/hooks'; import { convertApi2FormUrl, convertApi2FormUrlOnlyOne } from '@/utils'; import { useQuery } from '@tanstack/vue-query'; import { @@ -157,11 +164,6 @@ annexList: computed(() => form.value?.payFileUrl), columns: [ { - label: '寮�鎴疯处鍙�', - key: 'userName', - formatter: () => '1511 2001 2920 0156 069', - }, - { label: '杩涜处鍗曚綅', key: 'enterpriseName', formatter: () => '澶钩璐骇淇濋櫓鏈夐檺鍏徃鎶氬窞涓績鏀叕鍙�', @@ -175,6 +177,11 @@ label: '寮�鎴烽摱琛�', key: 'contactPhone', formatter: () => '涓浗宸ュ晢閾惰鑲′唤鏈夐檺鍏徃鎶氬窞璧d笢鏀', + }, + { + label: '寮�鎴疯处鍙�', + key: 'userName', + formatter: () => '1511 2001 2920 0156 069', }, // { // label: '浼佷笟绫诲瀷', @@ -190,19 +197,19 @@ // label: '鍥尯绫诲瀷', // key: 'parkTypeName', // }, - // { - // label: '娑堣垂绫诲瀷', - // key: 'payRemark', - // }, { - label: '鐢宠鍑鸿处閲戦', - key: 'tradeAmount', - type: 'money', + label: '娑堣垂绫诲瀷', + key: 'payRemark', }, { - label: '鐢宠鍑鸿处鏃堕棿', + label: '鍑鸿处瀹℃牳鏃ユ湡', key: 'tradeTime', type: 'date', + }, + { + label: '鍑鸿处閲戦', + key: 'tradeAmount', + type: 'money', }, { label: '璧勯噾浣欓', @@ -233,4 +240,17 @@ } }); } + +function handleApply() { + copyTextToClipboard( + `寮�鎴峰悕绉帮細${form.value?.societyCreditCode}\n寮�鎴烽摱琛岋細${form.value?.contactPhone}\n寮�鎴疯处鍙凤細${form.value?.userName}` + ); +} </script> +<style lang="scss" scoped> +@use '@/style/common.scss' as *; + +.portrait-table-with-attachment-title { + justify-content: space-between; +} +</style> diff --git a/src/views/Reward/components/UploadFileDialog.vue b/src/views/Reward/components/UploadFileDialog.vue new file mode 100644 index 0000000..23785ab --- /dev/null +++ b/src/views/Reward/components/UploadFileDialog.vue @@ -0,0 +1,86 @@ +<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="url" + :check-rules="[{ message: '璇蜂笂浼犳枃浠�', type: 'upload' }]" + > + <ProFormUpload v-model:file-url="form.url" accept="xlsx,xls"></ProFormUpload> + </ProFormItemV2> + <ProFormItemV2 + label="涓婁紶鍑瘉:" + prop="certificateUrl" + :check-rules="[{ message: '璇蜂笂浼犲嚟璇�', type: 'upload' }]" + > + <ProFormUpload + v-model:file-url="form.certificateUrl" + :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, +} from '@bole-core/components'; + +defineOptions({ + name: 'UploadCertRewardDialog', +}); + +const visible = defineModel({ type: Boolean }); + +type Form = { + title?: string; + certificateUrl: UploadUserFile[]; + url: UploadUserFile[]; + parkBountyApplyId: string; +}; + +const form = defineModel<Form>('form'); + +const emit = defineEmits<{ + (e: 'onConfirm'): void; + (e: 'onCancel'): void; +}>(); + +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> diff --git a/src/views/Reward/constants/columns.ts b/src/views/Reward/constants/columns.ts index 58aab3c..0aac26b 100644 --- a/src/views/Reward/constants/columns.ts +++ b/src/views/Reward/constants/columns.ts @@ -43,13 +43,13 @@ name: '鍥尯绫诲瀷', }, { - id: '22', + id: '8', enCode: 'auditStatus', name: '瀹℃牳鐘舵��', width: 160, }, { - id: '21', + id: '9', enCode: 'payRemark', name: '娑堣垂绫诲瀷', width: 160, @@ -66,16 +66,24 @@ name: '鐢宠鍑鸿处鏃堕棿', width: 160, }, - // { - // id: '12', - // enCode: 'payFileUrl', - // name: '鍑鸿处鍑瘉', - // width: 160, - // }, { - id: '9', + id: '12', enCode: 'remianAmount', name: '璧勯噾浣欓', width: 160, }, + { + id: '13', + enCode: 'a', + name: '瀹℃牳鏃堕棿', + width: 160, + }, ]); + +export const ImportParkBountyDataHeaderMap = { + enterpriseName: '浼佷笟鍚嶇О', + societyCreditCode: '淇$敤浠g爜', + financeToAmount: '璐㈡斂鎷ㄤ粯閲戦', + transferToAmount: '骞冲彴鎷ㄤ粯閲戦', + remark: '澶囨敞', +}; -- Gitblit v1.9.1