| <template> | 
|   <LoadingLayout :loading="state.loading"> | 
|     <AppContainer> | 
|       <ProTableQueryFilterBar @on-reset="reset"> | 
|         <template #query> | 
|           <QueryFilterItem tip-content="验收状态"> | 
|             <FieldRadio | 
|               v-model="extraParamState.checkReceiveStatus" | 
|               :value-enum="EnumTaskCheckReceiveStatusTextForFilter" | 
|               buttonStyle | 
|               showAllBtn | 
|               @change="getList()" | 
|             /> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem tip-content="结算状态"> | 
|             <FieldRadio | 
|               v-model="extraParamState.settlementStatus" | 
|               :value-enum="EnumTaskSettlementStatusText" | 
|               buttonStyle | 
|               showAllBtn | 
|               @change="getList()" | 
|             /> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <FieldDatePicker | 
|               v-model="extraParamState.time" | 
|               type="daterange" | 
|               range-separator="~" | 
|               start-placeholder="起始日期" | 
|               end-placeholder="截止日期" | 
|               clearable | 
|               @change="getList()" | 
|               tooltipContent="结算时间" | 
|             ></FieldDatePicker> | 
|           </QueryFilterItem> | 
|           <QueryFilterItem> | 
|             <SearchInput | 
|               v-model="extraParamState.keywords" | 
|               style="width: 250px" | 
|               placeholder="任务名称" | 
|               @on-click-search="getList()" | 
|               @keyup.enter="getList()" | 
|             > | 
|             </SearchInput> | 
|           </QueryFilterItem> | 
|         </template> | 
|         <template #btn> | 
|           <!-- <el-button type="primary" link @click="handleDownloadTemplate()">结算单模板</el-button> --> | 
|           <!-- <el-button type="primary" @click="handleAdd()">上传结算单</el-button> --> | 
|           <!-- <el-button type="primary" @click="handleDownloadTemplate()">导出</el-button> --> | 
|         </template> | 
|       </ProTableQueryFilterBar> | 
|       <ProTableV2 | 
|         v-bind="proTableProps" | 
|         :columns="ServiceChargeManageColumns" | 
|         :operationBtns="operationBtns" | 
|       > | 
|         <!-- <template #operationBtn-uploadBtn="{ row }"> | 
|           <BlFileUpload | 
|             v-model:file-url="editForm.settlementUrl" | 
|             ref="uploadRef" | 
|             :showTip="false" | 
|             :show-file-list="false" | 
|             class="pro-table-operation-btn upload-style-btn" | 
|             :on-success="(event) => handleUploadSuccess(event, row)" | 
|             :limitFileSize="null" | 
|             :limit="1" | 
|             accept="xlsx,xls" | 
|           > | 
|             <el-button text type="primary" class="pro-table-operation-btn">上传</el-button> | 
|           </BlFileUpload> | 
|         </template> | 
|         <template #operationBtn-reUploadBtn="{ data, row }"> | 
|           <BlFileUpload | 
|             v-model:file-url="editForm.settlementUrl" | 
|             ref="uploadRef" | 
|             :showTip="false" | 
|             :show-file-list="false" | 
|             class="pro-table-operation-btn upload-style-btn" | 
|             :on-success="(event) => handleUploadSuccess(event, row)" | 
|             :limitFileSize="null" | 
|             :limit="1" | 
|             accept="xlsx,xls" | 
|           > | 
|             <el-button text type="primary" class="pro-table-operation-btn">重新上传</el-button> | 
|           </BlFileUpload> | 
|         </template> --> | 
|       </ProTableV2> | 
|     </AppContainer> | 
|     <UploadStatementDialog v-bind="dialogProps" /> | 
|     <!-- <SettleDetailDialog v-bind="dialogSettleProps" /> --> | 
|     <RechargeEnterpriseWalletDialog v-bind="dialogRechargeProps" /> | 
|     <SettlMethodDialog v-bind="dialogSettlMethodProps" /> | 
|   </LoadingLayout> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
| import { | 
|   ProTableQueryFilterBar, | 
|   ProTableV2, | 
|   SearchInput, | 
|   LoadingLayout, | 
|   AppContainer, | 
|   QueryFilterItem, | 
|   useTable, | 
|   FieldDatePicker, | 
|   FieldRadio, | 
|   defineOperationBtns, | 
|   useFormDialog, | 
|   UploadUserFile, | 
|   BlFileUpload, | 
| } from '@bole-core/components'; | 
| import { ServiceChargeManageColumns } from './constants'; | 
| import { | 
|   EnumTaskSettlementStatusText, | 
|   EnumTaskSettlementOrderStatusText, | 
|   EnumTaskSettlementOrderStatus, | 
|   EnumTaskSettlementStatus, | 
|   EnumTaskCheckReceiveStatusText, | 
|   EnumTaskCheckReceiveStatusTextForFilter, | 
|   EnumTaskCheckReceiveStatus, | 
| } from '@/constants'; | 
| import { downloadFileByUrl, format, setOssFileName } from '@/utils'; | 
| import * as taskServices from '@/services/api/task'; | 
| import { ModelValueType } from 'element-plus'; | 
| import UploadStatementDialog from './components/UploadStatementDialog.vue'; | 
| import SettleDetailDialog from './components/SettleDetailDialog.vue'; | 
| import SettlMethodDialog from './components/SettlMethodDialog.vue'; | 
| import RechargeEnterpriseWalletDialog from './components/RechargeEnterpriseWalletDialog.vue'; | 
| import { Message } from '@bole-core/core'; | 
|   | 
| defineOptions({ | 
|   name: 'ServiceChargeManageList', | 
| }); | 
|   | 
| const operationBtns = defineOperationBtns([ | 
|   // { | 
|   //   data: { | 
|   //     enCode: 'uploadBtn', | 
|   //     name: '上传', | 
|   //   }, | 
|   //   extraProps: { | 
|   //     hide: (row: API.GetSettlementTasksQueryResultItem) => | 
|   //       row.settlementOrderStatus !== EnumTaskSettlementOrderStatus.Wait, | 
|   //   }, | 
|   // }, | 
|   // { | 
|   //   data: { | 
|   //     enCode: 'reUploadBtn', | 
|   //     name: '重新上传', | 
|   //   }, | 
|   //   extraProps: { | 
|   //     hide: (row: API.GetSettlementTasksQueryResultItem) => | 
|   //       !( | 
|   //         row.settlementOrderStatus === EnumTaskSettlementOrderStatus.Completed && | 
|   //         row.settlementStatus === EnumTaskSettlementStatus.Wait | 
|   //       ), | 
|   //   }, | 
|   // }, | 
|   { | 
|     data: { | 
|       enCode: 'settleBtn', | 
|       name: '结算', | 
|     }, | 
|     emits: { | 
|       onClick: (role: API.GetSettlementTasksQueryResultItem) => openSettleMethodDialog(role), | 
|     }, | 
|     extraProps: { | 
|       hide: (role: API.GetSettlementTasksQueryResultItem) => | 
|         !( | 
|           role.settlementStatus === EnumTaskSettlementStatus.Wait && | 
|           role.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed | 
|         ), | 
|     }, | 
|   }, | 
|   { | 
|     data: { | 
|       enCode: 'recallBtn', | 
|       name: '撤回', | 
|     }, | 
|     emits: { | 
|       onClick: (role) => handleRecall(role), | 
|     }, | 
|     extraProps: { | 
|       hide: (role: API.GetSettlementTasksQueryResultItem) => | 
|         !( | 
|           role.settlementStatus === EnumTaskSettlementStatus.InProcess && | 
|           role.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed | 
|         ), | 
|     }, | 
|   }, | 
|   // { | 
|   //   data: { | 
|   //     enCode: 'settleAuditBtn', | 
|   //     name: '结算审核', | 
|   //   }, | 
|   //   emits: { | 
|   //     onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role.id, 'settlement'), | 
|   //   }, | 
|   //   extraProps: { | 
|   //     hide: (role: API.GetSettlementTasksQueryResultItem) => role.auditStatus !== null, | 
|   //   }, | 
|   // }, | 
|   { | 
|     data: { | 
|       enCode: 'detailBtn', | 
|       name: '详情', | 
|     }, | 
|     emits: { | 
|       onClick: (role: API.GetSettlementTasksQueryResultItem) => goDetail(role.id), | 
|     }, | 
|     // extraProps: { | 
|     //   hide: (role: API.GetSettlementTasksQueryResultItem) => | 
|     //     role.settlementOrderStatus === EnumTaskSettlementOrderStatus.Wait, | 
|     // }, | 
|   }, | 
|   { | 
|     data: { | 
|       enCode: 'exportBtn', | 
|       name: '导出', | 
|     }, | 
|     emits: { | 
|       onClick: (role) => handleExport(role), | 
|     }, | 
|     extraProps: { | 
|       hide: () => true, | 
|     }, | 
|   }, | 
| ]); | 
|   | 
| const router = useRouter(); | 
|   | 
| const { userDetail } = useUser(); | 
|   | 
| const eventContext = useGlobalEventContext(); | 
|   | 
| eventContext.addEvent('sureTaskSettlementOrder', () => { | 
|   getList(paginationState.pageIndex); | 
| }); | 
|   | 
| const BaseState = { | 
|   loading: true, | 
| }; | 
|   | 
| const state = reactive({ ...BaseState }); | 
|   | 
| onMounted(async () => { | 
|   await getList(); | 
|   state.loading = false; | 
| }); | 
|   | 
| const { | 
|   getDataSource: getList, | 
|   proTableProps, | 
|   paginationState, | 
|   extraParamState, | 
|   reset, | 
| } = useTable( | 
|   async ({ pageIndex, pageSize }, extraParamState) => { | 
|     try { | 
|       let params: API.GetSettlementTasksQuery = { | 
|         pageModel: { | 
|           rows: pageSize, | 
|           page: pageIndex, | 
|           orderInput: extraParamState.orderInput, | 
|         }, | 
|         keywords: extraParamState.keywords, | 
|         checkReceiveStatus: extraParamState.checkReceiveStatus, | 
|         settlementStatus: extraParamState.settlementStatus, | 
|         settlementTimeBegin: format(extraParamState.time?.[0] ?? '', 'YYYY-MM-DD 00:00:00'), | 
|         settlementTimeEnd: format(extraParamState.time?.[1] ?? '', 'YYYY-MM-DD 23:59:59'), | 
|       }; | 
|   | 
|       let res = await taskServices.getSettlementTasks(params, { | 
|         showLoading: !state.loading, | 
|       }); | 
|       return res; | 
|     } catch (error) { | 
|       console.log('error: ', error); | 
|     } | 
|   }, | 
|   { | 
|     defaultExtraParams: { | 
|       keywords: '', | 
|       settlementOrderStatus: '' as any as EnumTaskSettlementOrderStatus, | 
|       checkReceiveStatus: '' as any as EnumTaskCheckReceiveStatus, | 
|       settlementStatus: '' as any as EnumTaskSettlementStatus, | 
|       time: [] as unknown as ModelValueType, | 
|       orderInput: [{ property: 'id', order: EnumPagedListOrder.Desc }], | 
|     }, | 
|     queryKey: ['taskServices/getSettlementTasks'], | 
|     columnsRenderProps: { | 
|       settlementOrderStatus: { type: 'enum', valueEnum: EnumTaskSettlementOrderStatusText }, | 
|       settlementStatus: { type: 'enum', valueEnum: EnumTaskSettlementStatusText }, | 
|       checkReceiveStatus: { type: 'enum', valueEnum: EnumTaskCheckReceiveStatusText }, | 
|       auditStatus: { type: 'enum', valueEnum: EnumTaskSettlementAuditStatusText }, | 
|       actualSettlementAmount: { type: 'money' }, | 
|       settlementAmount: { type: 'money' }, | 
|       settlementTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, | 
|       createdTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, | 
|       settlementOrderTime: { type: 'date', format: 'YYYY-MM-DD HH:mm:ss' }, | 
|       settlementOrderName: { | 
|         formatter: (row: API.GetSettlementTasksQueryResultItem) => | 
|           row.settlementOrderName && setOssFileName(row.settlementOrderName), | 
|       }, | 
|     }, | 
|   } | 
| ); | 
|   | 
| const { dialogProps, handleAdd, editForm } = useFormDialog({ | 
|   onConfirm: handleAddOrEdit, | 
|   defaultFormParams: { | 
|     code: '', | 
|     id: '', | 
|     name: '', | 
|     settlementUrl: [] as UploadUserFile[], | 
|   }, | 
| }); | 
|   | 
| async function handleAddOrEdit() { | 
|   try { | 
|     let params: API.ImportTaskSettlementOrderRostersCommand = { | 
|       id: editForm.id, | 
|       url: editForm.settlementUrl[0]?.path, | 
|     }; | 
|     let res = await taskServices.importTaskSettlementOrderRosters(params); | 
|     if (res) { | 
|       goSettlementDetail(editForm.id, editForm.settlementUrl[0]?.path); | 
|     } | 
|   } catch (error) {} | 
| } | 
|   | 
| 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, | 
|     }; | 
|     let res = await taskServices.sureTaskSettlement(params, { | 
|       skipErrorHandler: true, | 
|     }); | 
|     if (res) { | 
|       Message.successMessage('操作成功'); | 
|       getList(paginationState.pageIndex); | 
|     } | 
|   } catch (error) { | 
|     if (error?.info?.errorCode == 's510') { | 
|       handleRechargeAdd(); | 
|     } | 
|   } | 
| } | 
|   | 
| const { | 
|   dialogProps: dialogRechargeProps, | 
|   handleAdd: handleRechargeAdd, | 
|   editForm: rechargeEditForm, | 
| } = useFormDialog({ | 
|   defaultFormParams: { | 
|     access: EnumEnterpriseWalletAccess.Alipay, | 
|     amount: null as number, | 
|     remark: '', | 
|   }, | 
| }); | 
|   | 
| function openSettleDialog(row: API.GetSettlementTasksQueryResultItem) { | 
|   handleSettleEdit({ | 
|     id: row.id, | 
|     name: row.name, | 
|     code: row.code, | 
|     settlementUserCount: row.settlementUserCount ?? 0, | 
|     actualSettlementAmount: row.actualSettlementAmount ?? 0, | 
|   }); | 
| } | 
|   | 
| async function handleRecall(row: API.GetSettlementTasksQueryResultItem) { | 
|   try { | 
|     await Message.tipMessage('确认要撤回吗?'); | 
|     let params: API.RevokeTaskSettlementOrderCommand = { | 
|       taskInfoId: row.id, | 
|     }; | 
|     let res = await taskServices.revokeTaskSettlementOrder(params); | 
|     if (res) { | 
|       Message.successMessage('操作成功'); | 
|       getList(paginationState.pageIndex); | 
|     } | 
|   } catch (error) {} | 
| } | 
|   | 
| function handleUploadSuccess( | 
|   response: UploadUserFile & { file: File & { uid: number } }, | 
|   row: API.GetSettlementTasksQueryResultItem | 
| ) { | 
|   if (response.path) { | 
|     goSettlementDetail(row.id, response.path); | 
|   } | 
| } | 
|   | 
| async function goSettlementDetail(id: string, url?: string) { | 
|   await router.push({ | 
|     name: 'ServiceChargeDetail', | 
|     params: { | 
|       id: id, | 
|     }, | 
|   }); | 
|   editForm.settlementUrl = [] as UploadUserFile[]; | 
| } | 
|   | 
| const { | 
|   dialogProps: dialogSettlMethodProps, | 
|   handleAdd: handleSettlMethodAdd, | 
|   editForm: settlMethodEditForm, | 
| } = useFormDialog({ | 
|   onConfirm: handleSettlMethod, | 
|   defaultFormParams: { | 
|     id: '', | 
|     settlementAccess: '' as any as EnumEnterpriseWalletAccess, | 
|   }, | 
| }); | 
|   | 
| function openSettleMethodDialog(row: API.GetSettlementTasksQueryResultItem) { | 
|   // handleSettlMethodAdd({ | 
|   //   id: row.id, | 
|   //   settlementAccess: '' as any as EnumEnterpriseWalletAccess, | 
|   // }); | 
|   goDetail(row.id, 'settlement'); | 
| } | 
|   | 
| async function handleSettlMethod() { | 
|   goDetail(settlMethodEditForm.id, 'settlement'); | 
| } | 
|   | 
| function goDetail(id: string, settlement?: string) { | 
|   router.push({ | 
|     name: 'ServiceChargeDetail', | 
|     params: { | 
|       id: id ?? '', | 
|     }, | 
|     query: { | 
|       settlement: settlement ? settlement : '', | 
|       // settlementAccess: settlementAccess ? settlementAccess : '', | 
|     }, | 
|   }); | 
| } | 
|   | 
| function handleExport(val) { | 
|   console.log('val: ', val); | 
| } | 
|   | 
| function handleDownloadTemplate() { | 
|   downloadFileByUrl( | 
|     'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/FlexJob/temp/%E7%BB%93%E7%AE%97%E5%8D%95%E6%A8%A1%E6%9D%BF.xlsx', | 
|     '结算单模板' | 
|   ); | 
| } | 
| </script> |