From b331f884097a2dc5086c8cf043c8c8f52e7640fe Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期五, 12 九月 2025 17:34:39 +0800 Subject: [PATCH] Merge branch 'master' into dev-v1.1 --- src/views/ServiceChargeManage/ServiceChargeDetail.vue | 275 ++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 210 insertions(+), 65 deletions(-) diff --git a/src/views/ServiceChargeManage/ServiceChargeDetail.vue b/src/views/ServiceChargeManage/ServiceChargeDetail.vue index 0f4c891..72b74e5 100644 --- a/src/views/ServiceChargeManage/ServiceChargeDetail.vue +++ b/src/views/ServiceChargeManage/ServiceChargeDetail.vue @@ -1,6 +1,6 @@ <template> <LoadingLayout :loading="isLoading"> - <AppScrollContainer> + <AppContainer> <ChunkCell title="缁撶畻鍗曡鎯�"> <ProForm :model="form" ref="formRef" label-width="120px" :is-read="true"> <ProFormCol> @@ -10,65 +10,44 @@ </ProFormItemV2> </ProFormColItem> <ProFormColItem :span="8"> - <ProFormItemV2 label="浠诲姟缂栧彿:" prop="name"> - <ProFormText v-model="form.name"> </ProFormText> + <ProFormItemV2 label="浠诲姟缂栧彿:" prop="code"> + <ProFormText v-model="form.code"> </ProFormText> </ProFormItemV2> </ProFormColItem> - <ProFormColItem :span="8"></ProFormColItem> </ProFormCol> - <ProFormCol> + <!-- <ProFormCol> <ProFormColItem :span="8"> - <ProFormItemV2 label="缁撶畻鍗曞悕绉�:" prop="name"> - <ProFormText v-model="form.name"> </ProFormText> + <ProFormItemV2 label="缁撶畻鍗曞悕绉�:" prop="settlementOrderName"> + <ProFormText v-model="form.settlementOrderName"> </ProFormText> </ProFormItemV2> </ProFormColItem> <ProFormColItem :span="8"> - <ProFormItemV2 label="涓婁紶鏃堕棿:" prop="name"> + <ProFormItemV2 label="涓婁紶鏃堕棿:" prop="settlementOrderTime"> <ProFormDatePicker - v-model="form.name" + v-model="form.settlementOrderTime" type="date" format="YYYY-MM-DD HH:mm" ></ProFormDatePicker> </ProFormItemV2> </ProFormColItem> - </ProFormCol> + </ProFormCol> --> <ProFormCol> <ProFormColItem :span="8"> - <ProFormItemV2 label="缁撶畻閲戦:" prop="money"> - <ProFormInputNumber v-model="form.money"> </ProFormInputNumber> + <ProFormItemV2 label="缁撶畻閲戦:" prop="settlementAmount"> + <ProFormInputNumber v-model="form.settlementAmount" format-value="money"> + </ProFormInputNumber> </ProFormItemV2> </ProFormColItem> <ProFormColItem :span="8"> - <ProFormItemV2 label="瀹炲彂閲戦:" prop="money"> - <ProFormInputNumber v-model="form.money"> </ProFormInputNumber> + <ProFormItemV2 label="瀹炲彂閲戦:" prop="actualSettlementAmount"> + <ProFormInputNumber v-model="form.actualSettlementAmount" format-value="money"> + </ProFormInputNumber> </ProFormItemV2> </ProFormColItem> </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="缁撶畻鍚嶅崟"> + <ChunkCell title="缁撶畻鍚嶅崟" style="flex: 1" class="settlement-user-list-chunk"> <ProTableQueryFilterBar @on-reset="reset"> <template #query> <QueryFilterItem> @@ -81,27 +60,54 @@ </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="handleDownload()">瀵煎嚭</el-button> + </template> </ProTableQueryFilterBar> <ProTableV2 v-bind="proTableProps" :columns="SettlementListColumns" - :operationBtns="operationBtns" + :show-operation-column="false" :auto-height="false" ref="proTable" :tableProps="{ - maxHeight: '400px', + maxHeight: '250px', }" > </ProTableV2> + <div class="chuck-add-or-edit-actions"> + <el-button class="chuck-add-or-edit-actions" @click="handleBack">鍙栨秷</el-button> + <el-button + v-if="isSettlement" + class="chuck-add-or-edit-actions" + type="primary" + @click="handleSubmit" + >缁撶畻</el-button + > + </div> </ChunkCell> - </AppScrollContainer> + </AppContainer> <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog> + <SettleDetailDialog v-bind="dialogSettleProps" /> </LoadingLayout> </template> <script setup lang="ts"> import { LoadingLayout, - AppScrollContainer, + AppContainer, ChunkCell, ProForm, ProFormItemV2, @@ -110,27 +116,32 @@ ProFormColItem, ProFormDatePicker, ProFormInputNumber, - ProFormRadio, useTable, ProTableV2, defineOperationBtns, SearchInput, QueryFilterItem, ProTableQueryFilterBar, - TextOverTooltip, useFormDialog, + XLSXUtils, + BlFileUpload, + UploadUserFile, } from '@bole-core/components'; -import { Edit, Upload } from '@element-plus/icons-vue'; import { SettlementListColumns } from './constants'; import { useQuery } from '@tanstack/vue-query'; -import { downloadFileByUrl } from '@bole-core/core'; 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'; defineOptions({ name: 'ServiceChargeDetail', }); +const { closeViewPush } = useRouteView(); +const eventContext = useGlobalEventContext(); const operationBtns = defineOperationBtns([ { data: { @@ -142,29 +153,72 @@ }, }, ]); - 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 isSettlement = computed(() => !!url || !!settlement); const form = reactive({ name: '', - money: 0, - status: 1, + settlementAmount: 0, + actualSettlementAmount: 0, + code: '', + settlementOrderName: '', + settlementOrderTime: '', + settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[], + + settlementUrl: [] as UploadUserFile[], }); +const BaseState = { + loading: true, +}; + +const state = reactive({ ...BaseState }); + const { isLoading } = useQuery({ - queryKey: ['taskServices/getTaskInfo', id], + queryKey: ['taskUserServices/getSettlementTaskUsers', id, url], queryFn: async () => { - return await taskServices.getTaskInfo( - { id: id }, + return await taskUserServices.getSettlementTaskUsers( + { taskInfoId: id, settlementOrderUrl: url }, { showLoading: false, } ); }, - placeholderData: () => ({} as API.GetTaskInfoQueryResult), - onSuccess(data) { - form.name = data.name; + placeholderData: () => ({} as API.GetSettlementTaskUsersQueryResult), + onSuccess(res) { + form.settlementTaskUsers = res?.data ?? []; + if (res?.detail) { + form.name = res?.detail?.name; + form.settlementAmount = res?.detail?.settlementAmount ?? 0; + form.actualSettlementAmount = res?.detail?.actualSettlementAmount ?? 0; + form.code = res?.detail?.code; + 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: '閿欒淇℃伅', + }, + }); + }); + } + getList(); }, enabled: !!id, }); @@ -178,17 +232,25 @@ } = useTable( async ({ pageIndex, pageSize }, extraParamState) => { try { - let params: API.GetOpenTaskInfosQuery = { + let list = [...form.settlementTaskUsers]; + if (extraParamState.keywords) { + list = list?.filter((item) => { + return ( + item.name.includes(extraParamState.keywords) || + item.contactPhoneNumber.includes(extraParamState.keywords) || + item.identity.includes(extraParamState.keywords) + ); + }); + } + + return Promise.resolve({ pageModel: { rows: pageSize, page: pageIndex, - orderInput: extraParamState.orderInput, + totalCount: list.length, }, - keywords: extraParamState.keywords, - }; - - let res = await taskServices.getOpenTaskInfos(params); - return res; + data: paginateList(list, pageIndex, pageSize), + }); } catch (error) { console.log('error: ', error); } @@ -198,8 +260,12 @@ keywords: '', orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }], }, - queryKey: ['taskServices/getOpenTaskInfos'], - columnsRenderProps: {}, + queryKey: ['taskUserServices/getSettlementTaskUsers'], + columnsRenderProps: { + settlementTime: { type: 'date' }, + settlementAmount: { type: 'money' }, + actualSettlementAmount: { type: 'money' }, + }, } ); @@ -222,9 +288,80 @@ async function handleAddOrEdit() {} -onMounted(() => { - getList(); +async function sureTaskSettlementOrder() { + 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 res = await taskServices.sureTaskSettlementOrder(params); + if (res) { + Message.successMessage('鎿嶄綔鎴愬姛'); + eventContext.emit('sureTaskSettlementOrder'); + handleBack(); + } + } catch (error) {} +} + +function handleUploadSuccess(response: UploadUserFile & { file: File & { uid: number } }) { + if (response.path) { + // sureTaskSettlementOrder(); + } +} + +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() { + try { + let params: API.SureTaskSettlementCommand = { + taskInfoId: settleEditForm.id, + }; + console.log('params: ', params); + // let res = await taskServices.sureTaskSettlement(params); + // if (res) { + // Message.successMessage('鎿嶄綔鎴愬姛'); + // eventContext.emit('sureTaskSettlementOrder'); + // handleBack(); + // } + } catch (error) {} +} + +function handleDownload() {} + +function handleBack() { + closeViewPush(route, { + name: 'ServiceChargeManageList', + }); +} </script> <style lang="scss" scoped> @@ -234,6 +371,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