| <template> | 
|   <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> | 
|     <ContentScrollView style="background-color: transparent"> | 
|       <Cell :title="detail?.name ?? ''" titleSize="large"> | 
|         <template #title-right> | 
|           <img | 
|             v-if="from === 'apply'" | 
|             :src="detail.isCollected ? IconAttentioActive : IconAttention" | 
|             class="taskDetail-attention-icon" | 
|             @click="handleAttention" | 
|           /> | 
|           <div | 
|             v-if="from === 'sign'" | 
|             :style="{ color: GetPersonalApplyTaskInfosQueryStatusColor[detail.applyButton] }" | 
|           > | 
|             {{ GetTaskInfoQueryResultApplyButtonText[detail.applyButton] }} | 
|           </div> | 
|           <div | 
|             v-if="from === 'hire'" | 
|             :style="{ color: GetPersonalHireTaskInfosQueryStatusColor[detail.hireButton] }" | 
|           > | 
|             {{ GetTaskInfoQueryResultHireButtonText[detail.hireButton] }} | 
|           </div> | 
|           <div v-if="from === 'cancel'" :style="{ color: '#999999' }">已取消</div> | 
|         </template> | 
|         <div class="taskDetail-time"> | 
|           {{ dayjs(detail?.beginTime).format('YYYY年MM月DD日') }} 至 | 
|           {{ dayjs(detail?.endTime).format('YYYY年MM月DD日') }} | 
|         </div> | 
|         <div class="task-card-welfare-wrapper"> | 
|           <div class="task-card-welfare-list"> | 
|             <div class="task-card-welfare-list-item"> | 
|               {{ EnumSettlementCycleText[detail.settlementCycle] }} | 
|             </div> | 
|             <!-- <div class="task-card-welfare-list-item"> | 
|               {{ TaskUtils.getGenderText(detail.genderLimit) }} | 
|             </div> --> | 
|           </div> | 
|           <TaskPrice | 
|             :value="toThousand(detail.serviceFee ?? 0)" | 
|             :unit="BillingMethodEnumUnit[detail.billingMethod]" | 
|           /> | 
|         </div> | 
|         <div class="taskDetail-address-wrapper" @click="goMap"> | 
|           <div class="taskDetail-address-title-wrapper"> | 
|             <img :src="IconLocaltion" class="taskDetail-address-title-icon" /> | 
|             <div class="taskDetail-address-title">{{ detail?.addressName ?? '' }}</div> | 
|           </div> | 
|           <div class="taskDetail-address-info-wrapper"> | 
|             <div class="taskDetail-address-info">{{ detail?.addressDetail ?? '' }}</div> | 
|             <RectRight :size="8" class="taskDetail-address-info-icon" /> | 
|           </div> | 
|         </div> | 
|       </Cell> | 
|       <Cell :show-title="false"> | 
|         <CellChunk title="福利信息"> | 
|           <div class="taskDetail-welfare-list"> | 
|             <TaskDetailWelfareItem | 
|               v-for="benefit in detail.benefits" | 
|               :key="benefit.benefitCode" | 
|               :icon="setOSSLink(benefit.benefitField2)" | 
|               :text="benefit.benefitContent" | 
|             /> | 
|           </div> | 
|         </CellChunk> | 
|         <CellChunk title="报名条件"> | 
|           <div class="taskDetail-limit-list"> | 
|             <div class="taskDetail-limit-list-item"> | 
|               <div class="taskDetail-limit-list-item-label">年龄:</div> | 
|               <div class="taskDetail-limit-list-item-text"> | 
|                 {{ detail.ageMinLimit ?? 0 }}-{{ detail.ageMaxLimit ?? 0 }}岁 | 
|               </div> | 
|             </div> | 
|             <div class="taskDetail-limit-list-item"> | 
|               <div class="taskDetail-limit-list-item-label">性别:</div> | 
|               <div class="taskDetail-limit-list-item-text"> | 
|                 {{ TaskUtils.getGenderText(detail.genderLimit) }} | 
|               </div> | 
|             </div> | 
|             <div class="taskDetail-limit-list-item"> | 
|               <template v-if="detail?.credentialLimits?.length > 0"> | 
|                 <div class="taskDetail-limit-list-item-label">资格证书:</div> | 
|                 <div class="taskDetail-limit-list-item-text"> | 
|                   {{ TaskUtils.getCredentialLimit(detail?.credentialLimits) }} | 
|                 </div> | 
|               </template> | 
|             </div> | 
|           </div> | 
|         </CellChunk> | 
|         <CellChunk title="发布者信息"> | 
|           <CompanyDesc | 
|             @click="goCompanyDetail" | 
|             :enterpriseName="detail?.enterpriseName ?? ''" | 
|             :taskCount="detail?.taskCount ?? 0" | 
|             :isReal="detail?.isReal ?? false" | 
|           ></CompanyDesc> | 
|         </CellChunk> | 
|       </Cell> | 
|       <Cell> | 
|         <template #title> | 
|           <div class="safe-cell-title-wrapper"> | 
|             <img :src="IconSafe" class="safe-cell-title-icon" /> | 
|             <div class="safe-cell-title">安全提示</div> | 
|           </div> | 
|         </template> | 
|         <div class="safe-cell-content"> | 
|           该信息由用户自主发布,如遇虚假信息、诈骗、传销等违法违规行为,请立即 | 
|           <div class="safe-cell-content-btn" @click="goComplaint">投诉举报</div> | 
|         </div> | 
|       </Cell> | 
|     </ContentScrollView> | 
|     <PageFooter> | 
|       <PageFooterAction | 
|         :icon="IconShare" | 
|         text="分享" | 
|         :isFlex="false" | 
|         openType="share" | 
|       ></PageFooterAction> | 
|       <PageFooterAction | 
|         :icon="IconPhone" | 
|         text="手机" | 
|         :isFlex="false" | 
|         @click="handleCall" | 
|       ></PageFooterAction> | 
|       <PageFooterBtn | 
|         v-if="from === 'sign'" | 
|         type="primary" | 
|         :disabled="detail?.applyButton === GetTaskInfoQueryResultApplyButton.WaitHire" | 
|         @click="handleSign" | 
|       > | 
|         {{ GetTaskInfoQueryResultApplyButtonText[detail.applyButton] }} | 
|       </PageFooterBtn> | 
|       <PageFooterBtn | 
|         v-if="from === 'hire'" | 
|         type="primary" | 
|         :disabled="detail?.hireButton !== GetTaskInfoQueryResultHireButton.ApplyCheckReceive" | 
|         @click="handleHire" | 
|       > | 
|         {{ GetTaskInfoQueryResultHireButtonText[detail.hireButton] }} | 
|       </PageFooterBtn> | 
|       <template v-if="from === 'apply'"> | 
|         <PageFooterBtn | 
|           v-if="detail?.releaseStatus === EnumTaskReleaseStatus.InProcess" | 
|           type="primary" | 
|           @click="handleApply" | 
|           :disabled="!!detail?.hireStatus" | 
|           >{{ `报名(${detail?.applyCount ?? 0}人已报名)` }}</PageFooterBtn | 
|         > | 
|   | 
|         <PageFooterBtn v-if="detail.releaseStatus === EnumTaskReleaseStatus.Stopped" color="#999999" | 
|           >已停止</PageFooterBtn | 
|         > | 
|       </template> | 
|     </PageFooter> | 
|   </LoadingLayout> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
| import Taro from '@tarojs/taro'; | 
| import { useQuery } from '@tanstack/vue-query'; | 
| import * as taskServices from '@12333/services/apiV2/task'; | 
| import * as taskUserServices from '@12333/services/apiV2/taskUser'; | 
| import * as enterpriseEmployeeServices from '@12333/services/apiV2/enterpriseEmployee'; | 
| import { useToggle } from 'senin-mini/hooks'; | 
| import { TaskPrice, TaskDetailWelfareItem } from '@12333/components'; | 
| import IconAttention from '@/assets/task/icon-attention.png'; | 
| import IconAttentioActive from '@/assets/task/icon-attention-active.png'; | 
| import { RectRight } from '@nutui/icons-vue-taro'; | 
| import IconShare from '@/assets/task/icon-share.png'; | 
| import IconPhone from '@/assets/task/icon-phone.png'; | 
| import IconSafe from '@/assets/task/icon-safe.png'; | 
| import IconLocaltion from '@/assets/task/icon-localtion.png'; | 
| import './taskDetail.scss'; | 
| import CompanyDesc from '../components/CompanyDesc.vue'; | 
| import dayjs from 'dayjs'; | 
| import { TaskUtils, toThousand, setOSSLink, Message } from '@12333/utils'; | 
| import { | 
|   EnumSettlementCycleText, | 
|   BillingMethodEnumUnit, | 
|   EnumTaskReleaseStatus, | 
|   GetPersonalApplyTaskInfosQueryStatusColor, | 
|   GetTaskInfoQueryResultApplyButtonText, | 
|   GetPersonalHireTaskInfosQueryStatusColor, | 
|   GetTaskInfoQueryResultHireButtonText, | 
|   GetTaskInfoQueryResultHireButton, | 
|   GetTaskInfoQueryResultApplyButton, | 
| } from '@12333/constants'; | 
| import { useAccessLogin } from '@/hooks'; | 
|   | 
| defineOptions({ | 
|   name: 'InnerPage', | 
| }); | 
|   | 
| /** | 
|  * TODO 缺少 投诉举报接口 | 
|  */ | 
| const { userDetail } = useUser(); | 
| const router = Taro.useRouter(); | 
| const id = router.params?.id ?? ''; | 
| const from = router.params?.from ?? ''; | 
|   | 
| const { | 
|   isLoading, | 
|   isError, | 
|   data: detail, | 
|   refetch, | 
| } = useQuery({ | 
|   queryKey: ['taskServices/getTaskInfo', id], | 
|   queryFn: async () => { | 
|     return await taskServices.getTaskInfo( | 
|       { id: id }, | 
|       { | 
|         showLoading: false, | 
|       } | 
|     ); | 
|   }, | 
|   placeholderData: () => ({} as API.GetTaskInfoQueryResult), | 
|   onSuccess(data) { | 
|     // if (data.isExistTradeChatRecord) setTrue(); | 
|   }, | 
| }); | 
|   | 
| const { isCollapse, setTrue } = useToggle(); | 
|   | 
| const goComplaint = useAccessLogin(() => { | 
|   Taro.navigateTo({ | 
|     url: `${RouterPath.complaint}?id=${id}`, | 
|   }); | 
| }); | 
|   | 
| const goCompanyDetail = useAccessLogin(() => { | 
|   if (detail.value.enterpriseId) { | 
|     Taro.navigateTo({ | 
|       url: `${RouterPath.companyDetail}?id=${detail.value.enterpriseId}`, | 
|     }); | 
|   } | 
| }); | 
|   | 
| const handleApply = useAccessLogin(async () => { | 
|   try { | 
|     let params: API.ApplyTaskCommand = { | 
|       ids: [id], | 
|     }; | 
|     let res = await taskUserServices.applyTask(params); | 
|     if (res) { | 
|       Message.success('报名成功'); | 
|       refetch({ type: 'inactive' }); | 
|     } | 
|   } catch (error) {} | 
| }); | 
|   | 
| const handleAttention = useAccessLogin(async () => { | 
|   try { | 
|     // await Message.confirm({ | 
|     //   message: `确定${detail.value?.isCollected ? '取消收藏' : '收藏'}吗?`, | 
|     // }); | 
|     let params: API.CollectTaskCommand = { | 
|       ids: [id], | 
|       isCollect: !detail.value?.isCollected, | 
|     }; | 
|     let res = await taskUserServices.collectTask(params); | 
|     if (res) { | 
|       refetch({ type: 'inactive' }); | 
|       // Message.success('操作成功', { | 
|       //   onClosed() { | 
|       //     refetch({ type: 'inactive' }); | 
|       //   }, | 
|       // }); | 
|     } | 
|   } catch (error) {} | 
| }); | 
|   | 
| const handleCall = useAccessLogin(() => { | 
|   if (detail.value.contactPhoneNumber) { | 
|     Taro.makePhoneCall({ | 
|       phoneNumber: detail.value.contactPhoneNumber, | 
|     }); | 
|   } | 
| }); | 
|   | 
| function handleHire() { | 
|   Taro.navigateTo({ | 
|     url: `${RouterPath.taskSubmitCheck}?id=${id}`, | 
|   }); | 
| } | 
| const handleSign = useAccessReal(() => { | 
|   Taro.navigateTo({ | 
|     url: `${RouterPath.mineAgreementSignDetail}?id=${detail.value?.enterpriseEmployeeId}`, | 
|   }); | 
| }); | 
|   | 
| function goMap() { | 
|   Taro.openLocation({ | 
|     latitude: detail.value?.latitude, | 
|     longitude: detail.value?.longitude, | 
|     scale: 18, | 
|   }); | 
| } | 
|   | 
| Taro.useDidShow(() => { | 
|   refetch(); | 
| }); | 
| </script> |