|  |  | 
 |  |  | <template> | 
 |  |  |   <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> | 
 |  |  |   <LoadingLayout> | 
 |  |  |     <ContentView> | 
 |  |  |       <MyTaskCard :showMyTaskArrow="false" :showTime="false"></MyTaskCard> | 
 |  |  |       <MyTaskCard | 
 |  |  |         :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.name" | 
 |  |  |         :addressName="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.addressName" | 
 |  |  |         :showMyTaskArrow="false" | 
 |  |  |         :showTime="false" | 
 |  |  |       ></MyTaskCard> | 
 |  |  |       <ChunkTitle title="验收列表" /> | 
 |  |  |     </ContentView> | 
 |  |  |     <InfiniteLoading | 
 |  |  |       scrollViewClassName="common-infinite-scroll-list" | 
 |  |  |       v-bind="infiniteLoadingProps" | 
 |  |  |       :key="queryState.status" | 
 |  |  |     > | 
 |  |  |       <template #renderItem="{ item }"> | 
 |  |  |         <TaskCheckCard @click="goHandleTaskDetail(item)" /> | 
 |  |  |         <TaskCheckCard | 
 |  |  |           :avatar="setOSSLink(item.avatar)" | 
 |  |  |           :name="item.name" | 
 |  |  |           :gender="item.gender" | 
 |  |  |           :isReal="item.isReal" | 
 |  |  |           :checkInTime="item.checkInTime" | 
 |  |  |           :checkOutTime="item.checkOutTime" | 
 |  |  |           :contactPhoneNumber="item.contactPhoneNumber" | 
 |  |  |           :checkReceiveStatus="item.checkReceiveStatus" | 
 |  |  |           :checkReceiveMethod="detail?.checkReceiveMethod" | 
 |  |  |           :submitCheckReceiveStatus="item.submitCheckReceiveStatus" | 
 |  |  |           @checkReceive="goTaskDetail(item)" | 
 |  |  |           @checkInOrOut="(ev) => checkReceiveTask(ev, item)" | 
 |  |  |         /> | 
 |  |  |       </template> | 
 |  |  |     </InfiniteLoading> | 
 |  |  |     <nut-popup v-model:visible="dialogVisible"> | 
 |  |  |       <div class="payroll-form-wrapper"> | 
 |  |  |         <nut-form :model-value="form" ref="formRef"> | 
 |  |  |           <nut-form-item | 
 |  |  |             label="服务费:" | 
 |  |  |             class="bole-form-item" | 
 |  |  |             prop="serviceFee" | 
 |  |  |             label-width="90px" | 
 |  |  |           > | 
 |  |  |             <div class="bole-form-input-wrapper"> | 
 |  |  |               <NumberInput | 
 |  |  |                 v-model.trim="form.serviceFee" | 
 |  |  |                 class="nut-input-text bole-input-text" | 
 |  |  |                 placeholder="请输入服务费" | 
 |  |  |                 :min="0" | 
 |  |  |                 :max="999999999999" | 
 |  |  |                 :precision="2" | 
 |  |  |                 type="text" | 
 |  |  |                 disabled | 
 |  |  |               /> | 
 |  |  |               <div class="form-input-unit">元</div> | 
 |  |  |             </div> | 
 |  |  |           </nut-form-item> | 
 |  |  |           <nut-form-item | 
 |  |  |             label="超时:" | 
 |  |  |             class="bole-form-item" | 
 |  |  |             prop="timeoutHours" | 
 |  |  |             label-width="90px" | 
 |  |  |           > | 
 |  |  |             <div class="bole-form-input-wrapper"> | 
 |  |  |               <NumberInput | 
 |  |  |                 v-model.trim="form.timeoutHours" | 
 |  |  |                 class="nut-input-text bole-input-text" | 
 |  |  |                 placeholder="请输入超时时长" | 
 |  |  |                 :min="0" | 
 |  |  |                 :max="999999999999" | 
 |  |  |                 :precision="2" | 
 |  |  |                 type="text" | 
 |  |  |                 @change="onTimeoutHoursChange" | 
 |  |  |               /> | 
 |  |  |               <div class="form-input-unit">小时</div> | 
 |  |  |             </div> | 
 |  |  |           </nut-form-item> | 
 |  |  |           <nut-form-item | 
 |  |  |             label="超时费用:" | 
 |  |  |             class="bole-form-item" | 
 |  |  |             prop="timeoutFee" | 
 |  |  |             label-width="90px" | 
 |  |  |           > | 
 |  |  |             <div class="bole-form-input-wrapper"> | 
 |  |  |               <NumberInput | 
 |  |  |                 v-model.trim="form.timeoutFee" | 
 |  |  |                 class="nut-input-text bole-input-text" | 
 |  |  |                 placeholder="请输入超时费用" | 
 |  |  |                 :min="0" | 
 |  |  |                 :max="999999999999" | 
 |  |  |                 :precision="2" | 
 |  |  |                 type="text" | 
 |  |  |               /> | 
 |  |  |               <div class="form-input-unit">元</div> | 
 |  |  |             </div> | 
 |  |  |           </nut-form-item> | 
 |  |  |           <nut-form-item | 
 |  |  |             label="其他费用:" | 
 |  |  |             class="bole-form-item" | 
 |  |  |             prop="otherFee" | 
 |  |  |             label-width="90px" | 
 |  |  |           > | 
 |  |  |             <div class="bole-form-input-wrapper"> | 
 |  |  |               <NumberInput | 
 |  |  |                 v-model.trim="form.otherFee" | 
 |  |  |                 class="nut-input-text bole-input-text" | 
 |  |  |                 placeholder="请输入其他费用" | 
 |  |  |                 :max="999999999999" | 
 |  |  |                 :precision="2" | 
 |  |  |                 type="text" | 
 |  |  |               /> | 
 |  |  |               <div class="form-input-unit">元</div> | 
 |  |  |             </div> | 
 |  |  |           </nut-form-item> | 
 |  |  |           <nut-form-item | 
 |  |  |             label="结算金额:" | 
 |  |  |             class="bole-form-item" | 
 |  |  |             prop="settlementAmount" | 
 |  |  |             label-width="90px" | 
 |  |  |           > | 
 |  |  |             {{ `${settlementAmount}元` }} | 
 |  |  |           </nut-form-item> | 
 |  |  |           <nut-form-item | 
 |  |  |             label="备注:" | 
 |  |  |             class="bole-form-item alignTop" | 
 |  |  |             prop="remark" | 
 |  |  |             label-width="90px" | 
 |  |  |           > | 
 |  |  |             <nut-textarea v-model="form.remark" rows="4" placeholder="请输入备注"> </nut-textarea> | 
 |  |  |           </nut-form-item> | 
 |  |  |         </nut-form> | 
 |  |  |         <div class="payroll-form-footer"> | 
 |  |  |           <nut-button @click="handleCancel">取消</nut-button> | 
 |  |  |           <nut-button type="primary" @click="handleConfirm">确认</nut-button> | 
 |  |  |         </div> | 
 |  |  |       </div> | 
 |  |  |     </nut-popup> | 
 |  |  |   </LoadingLayout> | 
 |  |  | </template> | 
 |  |  |  | 
 |  |  | <script setup lang="ts"> | 
 |  |  | import Taro from '@tarojs/taro'; | 
 |  |  | import { useQuery } from '@tanstack/vue-query'; | 
 |  |  | import * as orderServices from '@12333/services/api/Order'; | 
 |  |  | import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive'; | 
 |  |  | import { useInfiniteLoading } from '@12333/hooks'; | 
 |  |  | import { OrderInputType } from '@12333/constants'; | 
 |  |  | import TaskCheckCard from '../components/TaskCheckCard.vue'; | 
 |  |  | import { MyTaskCard } from '@12333/components'; | 
 |  |  | import { MyTaskCard, NumberInput } from '@12333/components'; | 
 |  |  | import { | 
 |  |  |   EnumTaskCheckReceiveMethod, | 
 |  |  |   EnumTaskCheckReceiveStatus, | 
 |  |  |   EnumTaskUserSubmitCheckReceiveStatus, | 
 |  |  | } from '@12333/constants'; | 
 |  |  | import { Message, setOSSLink } from '@12333/utils'; | 
 |  |  | import dayjs from 'dayjs'; | 
 |  |  |  | 
 |  |  | defineOptions({ | 
 |  |  |   name: 'InnerPage', | 
 |  |  | }); | 
 |  |  |  | 
 |  |  | const router = Taro.useRouter(); | 
 |  |  | const taskId = router.params?.id ?? ''; | 
 |  |  | const id = router.params?.id ?? ''; | 
 |  |  | const date = router.params?.date ?? ''; | 
 |  |  | const checkReceiveStatus = Number(router.params?.checkReceiveStatus); | 
 |  |  |  | 
 |  |  | const { | 
 |  |  |   isLoading, | 
 |  |  |   isError, | 
 |  |  |   data: detail, | 
 |  |  |   refetch, | 
 |  |  | } = useQuery({ | 
 |  |  |   queryKey: ['orderServices/getOrdeForDetail', taskId], | 
 |  |  |   queryFn: async () => { | 
 |  |  |     return await orderServices.getOrdeForDetail( | 
 |  |  |       { id: taskId }, | 
 |  |  |       { | 
 |  |  |         showLoading: false, | 
 |  |  |       } | 
 |  |  |     ); | 
 |  |  |   }, | 
 |  |  |   placeholderData: () => ({} as API.OrderInfoDto), | 
 |  |  | const dialogVisible = ref(false); | 
 |  |  |  | 
 |  |  | const form = reactive({ | 
 |  |  |   serviceFee: 0, | 
 |  |  |   timeoutHours: 0, | 
 |  |  |   timeoutFee: 0, | 
 |  |  |   otherFee: 0, | 
 |  |  |   remark: '', | 
 |  |  |   timeoutServiceFee: 0, | 
 |  |  |  | 
 |  |  |   taskInfoId: '', | 
 |  |  |   checkInTime: '', | 
 |  |  |   checkoutTime: '', | 
 |  |  | }); | 
 |  |  |  | 
 |  |  | const queryState = reactive({ | 
 |  |  |   status: 10, | 
 |  |  | }); | 
 |  |  | const detail = ref<API.GetCheckReceiveTasksQueryResultItem>(); | 
 |  |  |  | 
 |  |  | const { infiniteLoadingProps } = useInfiniteLoading( | 
 |  |  |   ({ pageParam }) => { | 
 |  |  |     let params: API.FrontOrderListInput = { | 
 |  |  |   async ({ pageParam }) => { | 
 |  |  |     let params: API.GetCheckReceiveTaskQuery = { | 
 |  |  |       pageModel: { | 
 |  |  |         rows: 20, | 
 |  |  |         page: pageParam, | 
 |  |  |         orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }], | 
 |  |  |       }, | 
 |  |  |       taskInfoId: id, | 
 |  |  |       date: dayjs(date).format('YYYY-MM-DD'), | 
 |  |  |       checkReceiveStatus: checkReceiveStatus, | 
 |  |  |     }; | 
 |  |  |  | 
 |  |  |     return orderServices.getFrontOrderList(params, { | 
 |  |  |     let res = await taskCheckReceiveServices.getCheckReceiveTask(params, { | 
 |  |  |       showLoading: false, | 
 |  |  |     }); | 
 |  |  |     detail.value = res.objectData; | 
 |  |  |     return res; | 
 |  |  |   }, | 
 |  |  |   { | 
 |  |  |     queryKey: ['orderServices/getFrontOrderList', queryState], | 
 |  |  |     queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'], | 
 |  |  |   } | 
 |  |  | ); | 
 |  |  |  | 
 |  |  | function goHandleTaskDetail(item: API.FrontOrderList) { | 
 |  |  |   Taro.navigateTo({ | 
 |  |  |     url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}`, | 
 |  |  |   }); | 
 |  |  | const settlementAmount = computed(() => sumSettlementAmount()); | 
 |  |  |  | 
 |  |  | function onTimeoutHoursChange(event: any) { | 
 |  |  |   form.timeoutFee = Number(form.timeoutServiceFee) | 
 |  |  |     ? form.timeoutServiceFee * event.detail.value | 
 |  |  |     : 0; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function sumSettlementAmount() { | 
 |  |  |   return ( | 
 |  |  |     getFeeValue(Number(form.timeoutFee ?? 0)) + | 
 |  |  |     getFeeValue(Number(form.serviceFee ?? 0)) + | 
 |  |  |     getFeeValue(Number(form.otherFee ?? 0)) | 
 |  |  |   ); | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function getFeeValue(val: number) { | 
 |  |  |   return val || 0; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | async function openDialog(item: API.GetCheckReceiveTaskQueryResultItem) { | 
 |  |  |   let res = await calcTaskCheckReceive(item); | 
 |  |  |   if (res) { | 
 |  |  |     dialogVisible.value = true; | 
 |  |  |     form.taskInfoId = item.id; | 
 |  |  |     form.serviceFee = res.serviceFee ?? 0; | 
 |  |  |     form.timeoutHours = res.timeoutHours ?? 0; | 
 |  |  |     form.timeoutServiceFee = detail.value?.timeoutServiceFee ?? 0; | 
 |  |  |     form.otherFee = 0; | 
 |  |  |     form.timeoutFee = 0; | 
 |  |  |     form.remark = ''; | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function handleCancel() { | 
 |  |  |   dialogVisible.value = false; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | async function handleConfirm() { | 
 |  |  |   try { | 
 |  |  |     let params: API.CheckReceiveTaskCommand = { | 
 |  |  |       taskInfoUserId: form.taskInfoId, | 
 |  |  |       date: dayjs(date).format('YYYY-MM-DD'), | 
 |  |  |       checkOutTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), | 
 |  |  |       checkReceiveStatus: EnumTaskUserSubmitCheckReceiveStatus.Success, | 
 |  |  |       serviceFee: form.serviceFee, | 
 |  |  |       timeoutHours: form.timeoutHours, | 
 |  |  |       timeoutFee: form.timeoutFee, | 
 |  |  |       otherFee: form.otherFee, | 
 |  |  |       remark: form.remark, | 
 |  |  |       settlementAmount: settlementAmount.value, | 
 |  |  |     }; | 
 |  |  |     let res = await taskCheckReceiveServices.checkReceiveTask(params); | 
 |  |  |     if (res) { | 
 |  |  |       Message.success('提交成功'); | 
 |  |  |       dialogVisible.value = false; | 
 |  |  |       infiniteLoadingProps.value?.refetch?.(); | 
 |  |  |     } | 
 |  |  |   } catch (error) {} | 
 |  |  | } | 
 |  |  |  | 
 |  |  | async function calcTaskCheckReceive(item: API.GetCheckReceiveTaskQueryResultItem) { | 
 |  |  |   try { | 
 |  |  |     let params: API.CalcTaskCheckReceiveCommand = { | 
 |  |  |       taskInfoId: id, | 
 |  |  |       checkInTime: dayjs(item.checkInTime).format('YYYY-MM-DD HH:mm:ss'), | 
 |  |  |       checkOutTime: dayjs().format('YYYY-MM-DD HH:mm:ss'), | 
 |  |  |     }; | 
 |  |  |     return await taskCheckReceiveServices.calcTaskCheckReceive(params); | 
 |  |  |   } catch (error) {} | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function goTaskDetail(item: API.GetCheckReceiveTaskQueryResultItem) { | 
 |  |  |   if (detail.value.checkReceiveMethod !== EnumTaskCheckReceiveMethod.CheckIn) { | 
 |  |  |     if (item.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed) { | 
 |  |  |       Taro.navigateTo({ | 
 |  |  |         url: `${RouterPath.taskCheckedDetail}?id=${item.id}`, | 
 |  |  |       }); | 
 |  |  |     } | 
 |  |  |     if ( | 
 |  |  |       item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive || | 
 |  |  |       item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitSubmit | 
 |  |  |     ) { | 
 |  |  |       Taro.navigateTo({ | 
 |  |  |         url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}&date=${date}`, | 
 |  |  |       }); | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |  | 
 |  |  | async function checkReceiveTask( | 
 |  |  |   ev: EnumTaskUserSubmitCheckReceiveStatus, | 
 |  |  |   item: API.GetCheckReceiveTaskQueryResultItem | 
 |  |  | ) { | 
 |  |  |   try { | 
 |  |  |     let params: API.CheckReceiveTaskCommand = { | 
 |  |  |       taskInfoUserId: item.id, | 
 |  |  |       date: dayjs(date).format('YYYY-MM-DD'), | 
 |  |  |     }; | 
 |  |  |     if (ev === EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive) { | 
 |  |  |       params.checkInTime = dayjs().format('YYYY-MM-DD HH:mm:ss'); | 
 |  |  |       params.checkReceiveStatus = ev; | 
 |  |  |     } else if (ev === EnumTaskUserSubmitCheckReceiveStatus.Success) { | 
 |  |  |       openDialog(item); | 
 |  |  |       return; | 
 |  |  |       // params.checkOutTime = dayjs().format('YYYY-MM-DD HH:mm:ss'); | 
 |  |  |       // params.checkReceiveStatus = ev; | 
 |  |  |     } else if (ev === EnumTaskUserSubmitCheckReceiveStatus.Fail) { | 
 |  |  |       params.checkReceiveStatus = ev; | 
 |  |  |     } | 
 |  |  |     let res = await taskCheckReceiveServices.checkReceiveTask(params); | 
 |  |  |     if (res) { | 
 |  |  |       Message.success('提交成功'); | 
 |  |  |       infiniteLoadingProps.value?.refetch?.(); | 
 |  |  |     } | 
 |  |  |   } catch (error) {} | 
 |  |  | } | 
 |  |  | </script> | 
 |  |  | <style lang="scss"> | 
 |  |  | @import '@/styles/common.scss'; | 
 |  |  |  | 
 |  |  | .taskCheckDetail-page-wrapper { | 
 |  |  |   .bole-form-input-wrapper { | 
 |  |  |     display: flex; | 
 |  |  |     align-items: center; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .form-input-unit { | 
 |  |  |     margin-left: 10px; | 
 |  |  |     color: boleGetCssVar('text-color', 'primary'); | 
 |  |  |     flex-shrink: 0; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .payroll-form-wrapper { | 
 |  |  |     width: 600px; | 
 |  |  |   } | 
 |  |  |  | 
 |  |  |   .payroll-form-footer { | 
 |  |  |     padding: 10px 20px; | 
 |  |  |     text-align: center; | 
 |  |  |  | 
 |  |  |     .nut-button + .nut-button { | 
 |  |  |       margin-left: 20px; | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  | </style> |