| | |
| | | <template> |
| | | <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> |
| | | <ContentScrollView style="background-color: transparent"> |
| | | <Cell :title="'客房服务员'" titleSize="large"> |
| | | <Cell :title="detail?.name ?? ''" titleSize="large"> |
| | | <template #title-right> |
| | | <img :src="IconAttentioActive" class="taskDetail-attention-icon" /> |
| | | <img |
| | | :src="detail.isCollected ? IconAttentioActive : IconAttention" |
| | | class="taskDetail-attention-icon" |
| | | @click="handleAttention" |
| | | /> |
| | | </template> |
| | | <div class="taskDetail-time">2025年2月5日 至 2025年3月5日</div> |
| | | <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">日结</div> |
| | | <div class="task-card-welfare-list-item">男女不限</div> |
| | | <div class="task-card-welfare-list-item">包三餐</div> |
| | | <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="212" /> |
| | | <TaskPrice |
| | | :value="toThousand(detail.serviceFee ?? 0)" |
| | | :unit="BillingMethodEnumUnit[detail.billingMethod]" |
| | | /> |
| | | </div> |
| | | <div class="taskDetail-address-wrapper"> |
| | | <div class="taskDetail-address-title-wrapper"> |
| | | <img :src="IconLocaltion" class="taskDetail-address-title-icon" /> |
| | | <div class="taskDetail-address-title">宁波柏悦酒店</div> |
| | | <div class="taskDetail-address-title">{{ detail?.addressName ?? '' }}</div> |
| | | </div> |
| | | <div class="taskDetail-address-info-wrapper"> |
| | | <div class="taskDetail-address-info">宁波市鄞州区东钱湖大堰路188号宁波柏悦酒店</div> |
| | | <div class="taskDetail-address-info">{{ detail?.addressDetail ?? '' }}</div> |
| | | <RectRight :size="8" class="taskDetail-address-info-icon" /> |
| | | </div> |
| | | </div> |
| | |
| | | <Cell :show-title="false"> |
| | | <CellChunk title="福利信息"> |
| | | <div class="taskDetail-welfare-list"> |
| | | <TaskDetailWelfareItem :icon="IconAttentioActive" text="高温补贴" /> |
| | | <TaskDetailWelfareItem :icon="IconAttentioActive" text="高温补贴" /> |
| | | <TaskDetailWelfareItem :icon="IconAttentioActive" text="高温补贴" /> |
| | | <TaskDetailWelfareItem :icon="IconAttentioActive" text="高温补贴" /> |
| | | <TaskDetailWelfareItem :icon="IconAttentioActive" text="高温补贴" /> |
| | | <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">18-45岁</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">不限</div> |
| | | <div class="taskDetail-limit-list-item-text"> |
| | | {{ TaskUtils.getGenderText(detail.genderLimit) }} |
| | | </div> |
| | | </div> |
| | | <div class="taskDetail-limit-list-item"> |
| | | <div class="taskDetail-limit-list-item-label">资格证书:</div> |
| | | <div class="taskDetail-limit-list-item-text">健康证</div> |
| | | <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"></CompanyDesc> |
| | | <CompanyDesc |
| | | @click="goCompanyDetail" |
| | | :enterpriseName="detail?.enterpriseName ?? ''" |
| | | :taskCount="detail?.taskCount ?? 0" |
| | | ></CompanyDesc> |
| | | </CellChunk> |
| | | </Cell> |
| | | <Cell> |
| | |
| | | :isFlex="false" |
| | | openType="share" |
| | | ></PageFooterAction> |
| | | <PageFooterAction :icon="IconPhone" text="手机" :isFlex="false"></PageFooterAction> |
| | | <PageFooterBtn type="primary">报名(5人已报名)</PageFooterBtn> |
| | | <PageFooterAction |
| | | :icon="IconPhone" |
| | | text="手机" |
| | | :isFlex="false" |
| | | @click="handleCall" |
| | | ></PageFooterAction> |
| | | <PageFooterBtn |
| | | v-if="showApplyBtn" |
| | | type="primary" |
| | | @click="handleApply" |
| | | :disabled="detail?.hireStatus === EnumTaskUserHireStatus.Wait" |
| | | >{{ `报名(${detail?.applyCount ?? 0}人已报名)` }}</PageFooterBtn |
| | | > |
| | | <PageFooterBtn |
| | | v-if="detail.applyButton === GetTaskInfoQueryResultApplyButton.WaitHire" |
| | | color="#999999" |
| | | disabled |
| | | >待确认</PageFooterBtn |
| | | > |
| | | <!-- <PageFooterBtn |
| | | v-if="detail.applyButton === GetTaskInfoQueryResultApplyButton.WaitSignContract" |
| | | >去签约</PageFooterBtn |
| | | > --> |
| | | <PageFooterBtn |
| | | v-if="detail.hireButton === GetTaskInfoQueryResultHireButton.InProcess" |
| | | color="#999999" |
| | | disabled |
| | | >进行中</PageFooterBtn |
| | | > |
| | | <!-- <PageFooterBtn |
| | | v-if="detail.hireButton === GetTaskInfoQueryResultHireButton.ApplyCheckReceive" |
| | | >申请验收</PageFooterBtn |
| | | > --> |
| | | <PageFooterBtn |
| | | v-if="detail.hireButton === GetTaskInfoQueryResultHireButton.Completed" |
| | | color="#999999" |
| | | disabled |
| | | >已完成</PageFooterBtn |
| | | > |
| | | <PageFooterBtn v-if="detail.releaseStatus === EnumTaskReleaseStatus.Stopped" color="#999999" |
| | | >已停止</PageFooterBtn |
| | | > |
| | | </PageFooter> |
| | | </LoadingLayout> |
| | | </template> |
| | |
| | | <script setup lang="ts"> |
| | | import Taro from '@tarojs/taro'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import * as flexWorkerServices from '@12333/services/api/FlexWorker'; |
| | | import * as taskServices from '@12333/services/apiV2/task'; |
| | | import * as taskUserServices from '@12333/services/apiV2/taskUser'; |
| | | import { useToggle } from 'senin-mini/hooks'; |
| | | import { TaskPrice, TaskDetailWelfareItem } from '@12333/components'; |
| | | import IconAttention from '@/assets/task/icon-attention.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, |
| | | EnumTaskUserHireStatus, |
| | | GetTaskInfoQueryResultApplyButton, |
| | | GetTaskInfoQueryResultHireButton, |
| | | } from '@12333/constants'; |
| | | import { useAccessLogin } from '@/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | /** |
| | | * TODO 缺少 手机 投诉举报接口 报名接口 |
| | | */ |
| | | |
| | | const router = Taro.useRouter(); |
| | | const taskId = router.params?.id ?? ''; |
| | | |
| | | const showApplyBtn = computed(() => { |
| | | return ( |
| | | detail.value?.releaseStatus === EnumTaskReleaseStatus.InProcess && |
| | | (detail.value?.hireStatus === EnumTaskUserHireStatus.Wait || !detail.value?.hireStatus) |
| | | ); |
| | | }); |
| | | |
| | | const { |
| | | isLoading, |
| | |
| | | data: detail, |
| | | refetch, |
| | | } = useQuery({ |
| | | queryKey: ['flexWorkerServices/getOrdeForDetail', taskId], |
| | | queryKey: ['taskServices/getTaskInfo', taskId], |
| | | queryFn: async () => { |
| | | return await flexWorkerServices.getOrdeForDetail( |
| | | return await taskServices.getTaskInfo( |
| | | { id: taskId }, |
| | | { |
| | | showLoading: false, |
| | | } |
| | | ); |
| | | }, |
| | | placeholderData: () => ({} as API.OrderInfoDto), |
| | | placeholderData: () => ({} as API.GetTaskInfoQueryResult), |
| | | onSuccess(data) { |
| | | if (data.isExistTradeChatRecord) setTrue(); |
| | | // if (data.isExistTradeChatRecord) setTrue(); |
| | | }, |
| | | }); |
| | | |
| | | const { isCollapse, setTrue } = useToggle(); |
| | | |
| | | function goComplaint() { |
| | | const goComplaint = useAccessLogin(() => { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.complaint}?id=${taskId}`, |
| | | }); |
| | | } |
| | | }); |
| | | |
| | | function goCompanyDetail() { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.companyDetail}?id=${taskId}`, |
| | | }); |
| | | } |
| | | 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: [taskId], |
| | | }; |
| | | let res = await taskUserServices.applyTask(params); |
| | | if (res) { |
| | | Message.success('报名成功', { |
| | | onClosed() { |
| | | refetch({ type: 'inactive' }); |
| | | }, |
| | | }); |
| | | } |
| | | } catch (error) {} |
| | | }); |
| | | |
| | | const handleAttention = useAccessLogin(async () => { |
| | | try { |
| | | await Message.confirm({ |
| | | message: `确定${detail.value?.isCollected ? '取消收藏' : '收藏'}吗?`, |
| | | }); |
| | | let params: API.CollectTaskCommand = { |
| | | ids: [taskId], |
| | | isCollect: !detail.value?.isCollected, |
| | | }; |
| | | let res = await taskUserServices.collectTask(params); |
| | | if (res) { |
| | | Message.success('操作成功', { |
| | | onClosed() { |
| | | refetch({ type: 'inactive' }); |
| | | }, |
| | | }); |
| | | } |
| | | } catch (error) {} |
| | | }); |
| | | |
| | | const handleCall = useAccessLogin(() => { |
| | | if (detail.value.contactPhoneNumber) { |
| | | Taro.makePhoneCall({ |
| | | phoneNumber: detail.value.contactPhoneNumber, |
| | | }); |
| | | } |
| | | }); |
| | | </script> |