From 715d5d9675a524648b0aea2b961fe5a4430ea4fa Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期二, 16 九月 2025 13:24:32 +0800 Subject: [PATCH] feat: 接口对接 --- src/views/ServiceChargeManage/ServiceChargeDetail.vue | 262 +++++++++++++++++++++++++++++++++------------------- 1 files changed, 166 insertions(+), 96 deletions(-) diff --git a/src/views/ServiceChargeManage/ServiceChargeDetail.vue b/src/views/ServiceChargeManage/ServiceChargeDetail.vue index f608798..73a3b98 100644 --- a/src/views/ServiceChargeManage/ServiceChargeDetail.vue +++ b/src/views/ServiceChargeManage/ServiceChargeDetail.vue @@ -15,7 +15,7 @@ </ProFormItemV2> </ProFormColItem> </ProFormCol> - <ProFormCol> + <!-- <ProFormCol> <ProFormColItem :span="8"> <ProFormItemV2 label="缁撶畻鍗曞悕绉�:" prop="settlementOrderName"> <ProFormText v-model="form.settlementOrderName"> </ProFormText> @@ -30,7 +30,7 @@ ></ProFormDatePicker> </ProFormItemV2> </ProFormColItem> - </ProFormCol> + </ProFormCol> --> <ProFormCol> <ProFormColItem :span="8"> <ProFormItemV2 label="缁撶畻閲戦:" prop="settlementAmount"> @@ -47,29 +47,7 @@ </ProFormCol> </ProForm> </ChunkCell> - <!-- <ChunkCell title="缁撶畻娴佺▼"> - <div class="step-wrapper"> - <el-steps :active="1" align-center finish-status="process"> - <el-step title="缁撶畻鍗曚笂浼�" :icon="Edit"> - <template #description> - <div>鍒涘缓浜�:{{ form.name }}</div> - <div>鏃堕棿:{{ form.name }}</div> - <TextOverTooltip>澶囨敞:{{ form.name }}</TextOverTooltip> - </template> - </el-step> - <el-step title="缁撶畻浠樻" :icon="Upload"> - <template #description> - <div>鍒涘缓浜�:{{ form.name }}</div> - <div>鏃堕棿:{{ form.name }}</div> - <TextOverTooltip - >澶囨敞:{{ 'form.nameform.nameform.eform.nameform.nameform.name' }}</TextOverTooltip - > - </template> - </el-step> - </el-steps> - </div> - </ChunkCell> --> - <ChunkCell title="缁撶畻鍚嶅崟" style="flex: 1"> + <ChunkCell title="缁撶畻鍚嶅崟" style="flex: 1" class="settlement-user-list-chunk"> <ProTableQueryFilterBar @on-reset="reset"> <template #query> <QueryFilterItem> @@ -81,6 +59,22 @@ > </SearchInput> </QueryFilterItem> + </template> + <template #btn v-if="isSettlement"> + <BlFileUpload + v-model:file-url="form.settlementUrl" + ref="uploadRef" + :showTip="false" + :show-file-list="false" + class="pro-table-operation-btn upload-style-btn" + :on-success="(event) => handleUploadSuccess(event)" + :limitFileSize="null" + :limit="1" + accept="xlsx,xls" + > + <el-button text type="primary" class="pro-table-operation-btn">瀵煎叆</el-button> + </BlFileUpload> + <el-button type="primary" link @click="handleExport()">瀵煎嚭</el-button> </template> </ProTableQueryFilterBar> <ProTableV2 @@ -97,23 +91,23 @@ <div class="chuck-add-or-edit-actions"> <el-button class="chuck-add-or-edit-actions" @click="handleBack">鍙栨秷</el-button> <el-button - v-if="!isDetail" + v-if="isSettlement" class="chuck-add-or-edit-actions" type="primary" - @click="handleSubmit" - >纭</el-button + @click="handleSubmit()" + >缁撶畻</el-button > </div> </ChunkCell> </AppContainer> <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog> + <SettleDetailDialog v-bind="dialogSettleProps" /> </LoadingLayout> </template> <script setup lang="ts"> import { LoadingLayout, AppContainer, - AppScrollContainer, ChunkCell, ProForm, ProFormItemV2, @@ -130,14 +124,18 @@ ProTableQueryFilterBar, useFormDialog, XLSXUtils, + BlFileUpload, + UploadUserFile, } from '@bole-core/components'; import { SettlementListColumns } from './constants'; import { useQuery } from '@tanstack/vue-query'; import * as taskServices from '@/services/api/task'; import * as taskUserServices from '@/services/api/taskUser'; import EditAccountInfoDialog from './components/EditAccountInfoDialog.vue'; +import SettleDetailDialog from './components/SettleDetailDialog.vue'; import { Message } from '@bole-core/core'; -import { paginateList, setOssFileName, toThousand } from '@/utils'; +import { downloadFile, paginateList, setOssFileName, toThousand } from '@/utils'; +import _ from 'lodash'; defineOptions({ name: 'ServiceChargeDetail', @@ -156,12 +154,11 @@ }, }, ]); - const route = useRoute(); const id = (route.params.id as string) ?? ''; -const url = (route.query.url as string) ?? ''; +const settlement = (route.query.settlement as string) ?? ''; -const isDetail = computed(() => !url); +const isSettlement = computed(() => !!settlement); const form = reactive({ name: '', @@ -171,6 +168,8 @@ settlementOrderName: '', settlementOrderTime: '', settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[], + + settlementUrl: [] as UploadUserFile[], }); const BaseState = { @@ -179,37 +178,11 @@ const state = reactive({ ...BaseState }); -// onMounted(async () => { -// await getList(); -// state.loading = false; -// }); - -// const { isLoading } = useQuery({ -// queryKey: ['taskServices/getSettlementTask', id], -// queryFn: async () => { -// return await taskServices.getSettlementTask( -// { id: id }, -// { -// showLoading: false, -// } -// ); -// }, -// placeholderData: () => ({} as API.GetSettlementTaskQueryResult), -// onSuccess(data) { -// form.name = data.name; -// form.settlementAmount = data.settlementAmount ?? 0; -// form.actualSettlementAmount = data.actualSettlementAmount ?? 0; -// form.code = data.code; -// form.settlementOrderName = setOssFileName(data.settlementOrderName); -// form.settlementOrderTime = data.settlementOrderTime ?? ''; -// }, -// enabled: !!id, -// }); const { isLoading } = useQuery({ - queryKey: ['taskUserServices/getSettlementTaskUsers', id, url], + queryKey: ['taskUserServices/getSettlementTaskUsers', id], queryFn: async () => { return await taskUserServices.getSettlementTaskUsers( - { taskInfoId: id, settlementOrderUrl: url }, + { id: id }, { showLoading: false, } @@ -226,25 +199,25 @@ form.settlementOrderName = setOssFileName(res?.detail?.settlementOrderName); form.settlementOrderTime = res?.detail?.settlementOrderTime ?? ''; } - if (res?.errors?.length > 0) { - Message.tipMessage('瀛樺湪瀵煎叆閿欒鐨勬暟鎹紝鏄惁瀵煎嚭锛�').then(() => { - XLSXUtils.exportToXLSX({ - workbookDataList: res.errors, - fileName: '缁撶畻瀵煎叆-閿欒鏁版嵁', - workbookHeaderMap: { - name: '濮撳悕', - identity: '韬唤璇佸彿', - taskName: '浠诲姟鍚嶇О', - settlementAmount: '缁撶畻閲戦', - actualSettlementAmount: '瀹炲彂閲戦', - receiveAccount: '鏀舵璐︽埛', - bank: '鎵�灞為摱琛�', - bankBranch: '寮�鎴锋敮琛屽悕绉�', - errorMessage: '閿欒淇℃伅', - }, - }); - }); - } + // if (res?.errors?.length > 0) { + // Message.tipMessage('瀛樺湪瀵煎叆閿欒鐨勬暟鎹紝鏄惁瀵煎嚭锛�').then(() => { + // XLSXUtils.exportToXLSX({ + // workbookDataList: res.errors, + // fileName: '缁撶畻瀵煎叆-閿欒鏁版嵁', + // workbookHeaderMap: { + // name: '濮撳悕', + // identity: '韬唤璇佸彿', + // taskName: '浠诲姟鍚嶇О', + // settlementAmount: '缁撶畻閲戦', + // actualSettlementAmount: '瀹炲彂閲戦', + // receiveAccount: '鏀舵璐︽埛', + // bank: '鎵�灞為摱琛�', + // bankBranch: '寮�鎴锋敮琛屽悕绉�', + // errorMessage: '閿欒淇℃伅', + // }, + // }); + // }); + // } getList(); }, enabled: !!id, @@ -300,34 +273,100 @@ onConfirm: handleAddOrEdit, defaultFormParams: { id: '', - name: '', + settlementAmount: null as number, + actualSettlementAmount: null as number, + receiveAccount: '', + bank: '', + bankBranch: '', }, }); -function openDialog(row?) { +function openDialog(row?: API.GetSettlementTaskUsersQueryResultItem) { if (row) { handleEdit({ id: row?.id, - name: row?.name, + settlementAmount: row?.settlementAmount ?? null, + actualSettlementAmount: row?.actualSettlementAmount ?? null, + receiveAccount: row?.receiveAccount ?? '', + bank: row?.bank ?? '', + bankBranch: row?.bankBranch ?? '', }); } } -async function handleAddOrEdit() {} - -async function handleSubmit() { +async function handleAddOrEdit() { try { - let params: API.SureTaskSettlementOrderCommand = { - taskInfoId: id, - settlementOrderUrl: url, - taskInfoUsers: - proTableProps.value.tableData?.length > 0 - ? proTableProps.value.tableData.map( - (x) => ({ ...x } as API.SureTaskSettlementOrderCommandUser) - ) - : [], + let params: API.EditTaskSettlementOrderRosterCommand = { + id: editForm.id, + settlementAmount: editForm.settlementAmount, + actualSettlementAmount: editForm.actualSettlementAmount, + receiveAccount: editForm.receiveAccount, + bank: editForm.bank, + bankBranch: editForm.bankBranch, }; - let res = await taskServices.sureTaskSettlementOrder(params); + let res = await taskServices.editTaskSettlementOrderRoster(params); + if (res) { + Message.successMessage('鎿嶄綔鎴愬姛'); + getList(paginationState.pageIndex); + } + } catch (error) {} +} + +function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) { + if (response.path) { + importTaskSettlementOrderRosters(response.path); + } +} + +async function importTaskSettlementOrderRosters(url: string) { + try { + let params: API.ImportTaskSettlementOrderRostersCommand = { + id: id, + url: url, + }; + let res = await taskServices.importTaskSettlementOrderRosters(params); + if (res) { + Message.successMessage('鎿嶄綔鎴愬姛'); + getList(paginationState.pageIndex); + } + } catch (error) {} +} + +function handleSubmit() { + handleSettleEdit({ + id: id, + name: form.name, + code: form.code, + settlementUserCount: form.settlementTaskUsers.length, + actualSettlementAmount: form.actualSettlementAmount, + }); +} + +const { + dialogProps: dialogSettleProps, + handleEdit: handleSettleEdit, + editForm: settleEditForm, +} = useFormDialog({ + onConfirm: handleSettle, + defaultFormParams: { + id: '', + name: '', + code: '', + settlementUserCount: 0, + actualSettlementAmount: 0, + }, +}); + +async function handleSettle() { + sureTaskSettlementOrder(); +} + +async function sureTaskSettlementOrder() { + try { + let params: API.SureTaskSettlementCommand = { + taskInfoId: id, + }; + let res = await taskServices.sureTaskSettlement(params); if (res) { Message.successMessage('鎿嶄綔鎴愬姛'); eventContext.emit('sureTaskSettlementOrder'); @@ -335,6 +374,29 @@ } } catch (error) {} } + +const handleExport = _.debounce( + async () => { + if (paginationState.total === 0) { + Message.warnMessage('娌℃湁鏁版嵁鍙互瀵煎嚭鍝'); + return; + } + try { + let params: API.ExportTaskSettlementOrderRostersCommand = { + id: id, + }; + let res = await taskServices.exportTaskSettlementOrderRosters(params, { + responseType: 'blob', + getResponse: true, + }); + if (res) { + downloadFile(res, `${form.name}-${form.code}`, 'xlsx'); + } + } catch (error) {} + }, + 1000, + { leading: true, trailing: false } +); function handleBack() { closeViewPush(route, { @@ -350,6 +412,14 @@ margin: 0 auto; padding: 24px 0; } + +.settlement-user-list-chunk { + :deep() { + .no-data img { + width: 280px; + } + } +} </style> <style lang="scss"> .text-over-tooltip-content { -- Gitblit v1.9.1