| <template> | 
|   <LoadingLayout :loading="isLoading"> | 
|     <AppContainer> | 
|       <ChunkCell title="结算单详情"> | 
|         <ProForm :model="form" ref="formRef" label-width="120px" :is-read="true"> | 
|           <ProFormCol> | 
|             <ProFormColItem :span="8"> | 
|               <ProFormItemV2 label="所属任务:" prop="name"> | 
|                 <ProFormText v-model="form.name"> </ProFormText> | 
|               </ProFormItemV2> | 
|             </ProFormColItem> | 
|             <ProFormColItem :span="8"> | 
|               <ProFormItemV2 label="任务编号:" prop="code"> | 
|                 <ProFormText v-model="form.code"> </ProFormText> | 
|               </ProFormItemV2> | 
|             </ProFormColItem> | 
|           </ProFormCol> | 
|           <ProFormCol> | 
|             <ProFormColItem :span="8"> | 
|               <ProFormItemV2 label="结算单名称:" prop="settlementOrderName"> | 
|                 <ProFormText v-model="form.settlementOrderName"> </ProFormText> | 
|               </ProFormItemV2> | 
|             </ProFormColItem> | 
|             <ProFormColItem :span="8"> | 
|               <ProFormItemV2 label="上传时间:" prop="settlementOrderTime"> | 
|                 <ProFormDatePicker | 
|                   v-model="form.settlementOrderTime" | 
|                   type="date" | 
|                   format="YYYY-MM-DD HH:mm" | 
|                 ></ProFormDatePicker> | 
|               </ProFormItemV2> | 
|             </ProFormColItem> | 
|           </ProFormCol> | 
|           <ProFormCol> | 
|             <ProFormColItem :span="8"> | 
|               <ProFormItemV2 label="结算金额:" prop="settlementAmount"> | 
|                 <ProFormInputNumber v-model="form.settlementAmount" format-value="money"> | 
|                 </ProFormInputNumber> | 
|               </ProFormItemV2> | 
|             </ProFormColItem> | 
|             <ProFormColItem :span="8"> | 
|               <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="结算名单" style="flex: 1" class="settlement-user-list-chunk"> | 
|         <ProTableQueryFilterBar @on-reset="reset"> | 
|           <template #query> | 
|             <QueryFilterItem> | 
|               <SearchInput | 
|                 v-model="extraParamState.keywords" | 
|                 style="width: 300px" | 
|                 placeholder="姓名/手机/身份证号/客户" | 
|                 @on-click-search="getList" | 
|               > | 
|               </SearchInput> | 
|             </QueryFilterItem> | 
|           </template> | 
|         </ProTableQueryFilterBar> | 
|         <ProTableV2 | 
|           v-bind="proTableProps" | 
|           :columns="SettlementListColumns" | 
|           :show-operation-column="false" | 
|           :auto-height="false" | 
|           ref="proTable" | 
|           :tableProps="{ | 
|             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="!isDetail" | 
|             class="chuck-add-or-edit-actions" | 
|             type="primary" | 
|             @click="handleSubmit" | 
|             >确认</el-button | 
|           > | 
|         </div> | 
|       </ChunkCell> | 
|     </AppContainer> | 
|     <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog> | 
|   </LoadingLayout> | 
| </template> | 
| <script setup lang="ts"> | 
| import { | 
|   LoadingLayout, | 
|   AppContainer, | 
|   AppScrollContainer, | 
|   ChunkCell, | 
|   ProForm, | 
|   ProFormItemV2, | 
|   ProFormText, | 
|   ProFormCol, | 
|   ProFormColItem, | 
|   ProFormDatePicker, | 
|   ProFormInputNumber, | 
|   useTable, | 
|   ProTableV2, | 
|   defineOperationBtns, | 
|   SearchInput, | 
|   QueryFilterItem, | 
|   ProTableQueryFilterBar, | 
|   useFormDialog, | 
|   XLSXUtils, | 
| } 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 { Message } from '@bole-core/core'; | 
| import { paginateList, setOssFileName, toThousand } from '@/utils'; | 
|   | 
| defineOptions({ | 
|   name: 'ServiceChargeDetail', | 
| }); | 
|   | 
| const { closeViewPush } = useRouteView(); | 
| const eventContext = useGlobalEventContext(); | 
| const operationBtns = defineOperationBtns([ | 
|   { | 
|     data: { | 
|       enCode: 'editBtn', | 
|       name: '编辑', | 
|     }, | 
|     emits: { | 
|       onClick: (role) => openDialog(role), | 
|     }, | 
|   }, | 
| ]); | 
|   | 
| const route = useRoute(); | 
| const id = (route.params.id as string) ?? ''; | 
| const url = (route.query.url as string) ?? ''; | 
|   | 
| const isDetail = computed(() => !url); | 
|   | 
| const form = reactive({ | 
|   name: '', | 
|   settlementAmount: 0, | 
|   actualSettlementAmount: 0, | 
|   code: '', | 
|   settlementOrderName: '', | 
|   settlementOrderTime: '', | 
|   settlementTaskUsers: [] as API.GetSettlementTaskUsersQueryResultItem[], | 
| }); | 
|   | 
| const BaseState = { | 
|   loading: true, | 
| }; | 
|   | 
| 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], | 
|   queryFn: async () => { | 
|     return await taskUserServices.getSettlementTaskUsers( | 
|       { taskInfoId: id, settlementOrderUrl: url }, | 
|       { | 
|         showLoading: false, | 
|       } | 
|     ); | 
|   }, | 
|   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, | 
| }); | 
|   | 
| const { | 
|   getDataSource: getList, | 
|   proTableProps, | 
|   paginationState, | 
|   extraParamState, | 
|   reset, | 
| } = useTable( | 
|   async ({ pageIndex, pageSize }, extraParamState) => { | 
|     try { | 
|       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, | 
|           totalCount: list.length, | 
|         }, | 
|         data: paginateList(list, pageIndex, pageSize), | 
|       }); | 
|     } catch (error) { | 
|       console.log('error: ', error); | 
|     } | 
|   }, | 
|   { | 
|     defaultExtraParams: { | 
|       keywords: '', | 
|       orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }], | 
|     }, | 
|     queryKey: ['taskUserServices/getSettlementTaskUsers'], | 
|     columnsRenderProps: { | 
|       settlementTime: { type: 'date' }, | 
|       settlementAmount: { type: 'money' }, | 
|       actualSettlementAmount: { type: 'money' }, | 
|     }, | 
|   } | 
| ); | 
|   | 
| const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({ | 
|   onConfirm: handleAddOrEdit, | 
|   defaultFormParams: { | 
|     id: '', | 
|     name: '', | 
|   }, | 
| }); | 
|   | 
| function openDialog(row?) { | 
|   if (row) { | 
|     handleEdit({ | 
|       id: row?.id, | 
|       name: row?.name, | 
|     }); | 
|   } | 
| } | 
|   | 
| async function handleAddOrEdit() {} | 
|   | 
| async function handleSubmit() { | 
|   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 handleBack() { | 
|   closeViewPush(route, { | 
|     name: 'ServiceChargeManageList', | 
|   }); | 
| } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
| @use '@/style/common.scss' as *; | 
|   | 
| .step-wrapper { | 
|   margin: 0 auto; | 
|   padding: 24px 0; | 
| } | 
|   | 
| .settlement-user-list-chunk { | 
|   :deep() { | 
|     .no-data img { | 
|       width: 280px; | 
|     } | 
|   } | 
| } | 
| </style> | 
| <style lang="scss"> | 
| .text-over-tooltip-content { | 
|   max-width: 600px; | 
|   word-break: break-all; | 
| } | 
| </style> |