| | |
| | | > |
| | | <template #actions> |
| | | <nut-button |
| | | v-if="checkAcceptStatus === FlexTaskCheckAcceptStatusEnum.Wait" |
| | | v-if="checkAcceptStatus === EnumTaskCheckReceiveStatus.Wait" |
| | | type="primary" |
| | | class="task-check-card-phone-btn" |
| | | >验收</nut-button |
| | | > |
| | | <div v-else class="task-check-card-phone-status" :style="{ color: Colors.Success }"> |
| | | {{ FlexTaskCheckAcceptStatusEnumText[checkAcceptStatus] }} |
| | | {{ EnumTaskCheckReceiveStatusText[checkAcceptStatus] }} |
| | | </div> |
| | | </template> |
| | | </TaskCheckPersonalView> |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import TaskCheckPersonalView from './TaskCheckPersonalView.vue'; |
| | | import { Colors, Gender } from '@12333/constants'; |
| | | import { |
| | | FlexTaskCheckAcceptStatusEnum, |
| | | FlexTaskCheckAcceptStatusEnumText, |
| | | } from '@12333/constants/task'; |
| | | Colors, |
| | | EnumUserGender, |
| | | EnumTaskCheckReceiveStatus, |
| | | EnumTaskCheckReceiveStatusText, |
| | | } from '@12333/constants'; |
| | | |
| | | defineOptions({ |
| | | name: 'TaskCheckCard', |
| | |
| | | type Props = { |
| | | avatarUrl?: string; |
| | | name?: string; |
| | | genderType?: Gender; |
| | | genderType?: EnumUserGender; |
| | | isRealName?: boolean; |
| | | contactPhone?: string; |
| | | checkAcceptStatus?: API.FlexTaskCheckAcceptStatusEnum; |
| | | checkAcceptStatus?: EnumTaskCheckReceiveStatus; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import { FlexJobTopView } from '@12333/components'; |
| | | import { Gender } from '@12333/constants'; |
| | | import { EnumUserGender } from '@12333/constants'; |
| | | |
| | | defineOptions({ |
| | | name: 'TaskCheckPersonalView', |
| | |
| | | type Props = { |
| | | avatarUrl?: string; |
| | | name?: string; |
| | | genderType?: Gender; |
| | | genderType?: EnumUserGender; |
| | | isRealName?: boolean; |
| | | contactPhone?: string; |
| | | }; |
| | |
| | | <template> |
| | | <Calendar v-model="queryState.date"></Calendar> |
| | | <Calendar v-model="queryMenuState.time"></Calendar> |
| | | <ProTabs |
| | | v-model="queryState.status" |
| | | v-model="queryMenuState.status" |
| | | name="task-tab" |
| | | :showPaneContent="false" |
| | | class="task-tabs" |
| | |
| | | title-gutter="8" |
| | | title-scroll |
| | | > |
| | | <ProTabPane title="待提交" pane-key="10"></ProTabPane> |
| | | <ProTabPane title="待验收" pane-key="10"></ProTabPane> |
| | | <ProTabPane title="已验收" pane-key="20"></ProTabPane> |
| | | </ProTabs> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | v-bind="infiniteLoadingProps" |
| | | :key="queryState.status" |
| | | :key="queryMenuState.status" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <MyTaskCard |
| | | :taskName="item.taskName" |
| | | :startDate="item.startDate" |
| | | :endDate="item.endDate" |
| | | :address="item.address" |
| | | :name="item.name" |
| | | :beginTime="item.beginTime" |
| | | :endTime="item.endTime" |
| | | :addressName="item.addressName" |
| | | @click="goSubmitTaskDetail(item)" |
| | | /> |
| | | </template> |
| | |
| | | <script setup lang="ts"> |
| | | import { MyTaskCard, ProTabs, ProTabPane, Calendar } from '@12333/components'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { useInfiniteLoading } from '@12333/hooks'; |
| | | import { OrderInputType } from '@12333/constants'; |
| | | import * as flexWorkerServices from '@12333/services/api/FlexWorker'; |
| | | import { useTaskList } from '@12333/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const queryState = reactive({ |
| | | status: '10', |
| | | date: new Date(), |
| | | const { queryMenuState, infiniteLoadingProps } = useTaskList({ |
| | | defaultQueryMenuState: { |
| | | status: EnumTaskStatus.Wait, |
| | | }, |
| | | }); |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.GetFlexTaskListInput = { |
| | | isOverCheck: queryState.status === '20', |
| | | pageModel: { |
| | | rows: 20, |
| | | page: pageParam, |
| | | orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }], |
| | | }, |
| | | }; |
| | | |
| | | return flexWorkerServices.getFlexTaskByIsOverCheck(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['flexWorkerServices/getFlexTaskByIsOverCheck', queryState], |
| | | } |
| | | ); |
| | | |
| | | function goSubmitTaskDetail(item: API.GetFlexTaskListOutput) { |
| | | function goSubmitTaskDetail(item: API.GetTaskInfosQueryResultItem) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskCheckDetail}?taskId=${item.taskId}`, |
| | | url: `${RouterPath.taskCheckDetail}?taskId=${item.id}`, |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> |
| | | <ContentView> |
| | | <MyTaskCard |
| | | :task-name="detail.taskName" |
| | | :address="address" |
| | | :namee="detail.name" |
| | | :addressName="detail.addressName" |
| | | :showMyTaskArrow="false" |
| | | :showTime="false" |
| | | ></MyTaskCard> |
| | |
| | | <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 { useInfiniteLoading } from '@12333/hooks'; |
| | | import { OrderInputType } from '@12333/constants'; |
| | | import TaskCheckCard from '../components/TaskCheckCard.vue'; |
| | |
| | | data: detail, |
| | | refetch, |
| | | } = useQuery({ |
| | | queryKey: ['flexWorkerServices/getFlexTaskDto', taskId], |
| | | queryKey: ['taskServices/getTaskInfo', taskId], |
| | | queryFn: async () => { |
| | | return await flexWorkerServices.getFlexTaskDto( |
| | | return await taskServices.getTaskInfo( |
| | | { id: taskId }, |
| | | { |
| | | showLoading: false, |
| | | } |
| | | ); |
| | | }, |
| | | placeholderData: () => ({} as API.GetFlexTaskDtoOutput), |
| | | }); |
| | | |
| | | const address = computed(() => { |
| | | return `${detail.value.provinceName} ${detail.value.cityName} ${detail.value.areaName} ${detail.value.address}`; |
| | | placeholderData: () => ({} as API.GetTaskInfoQueryResult), |
| | | }); |
| | | |
| | | const queryState = reactive({ |
| | |
| | | <div class="flexJob-card-top-info-name">{{ name }}</div> |
| | | <div class="flexJob-card-top-info-gender"> |
| | | <img |
| | | v-if="genderType === Gender.Male" |
| | | v-if="genderType === EnumUserGender.Male" |
| | | :src="IconMale" |
| | | class="flexJob-card-top-info-gender-icon" |
| | | /> |
| | |
| | | <script setup lang="ts"> |
| | | import IconMale from '@/assets/mine/icon-male.png'; |
| | | import IconFemale from '@/assets/mine/icon-female.png'; |
| | | import { AvatarImage, Gender } from '@12333/constants'; |
| | | import { AvatarImage, EnumUserGender } from '@12333/constants'; |
| | | import { Avatar } from '@12333/components'; |
| | | |
| | | defineOptions({ |
| | |
| | | |
| | | avatarUrl?: string; |
| | | name?: string; |
| | | genderType?: Gender; |
| | | genderType?: EnumUserGender; |
| | | age?: number; |
| | | educationalLevel?: string; |
| | | arrangeCount?: number; |
| | |
| | | </template> |
| | | <div class="my-task-card-time" v-if="showTime"> |
| | | {{ |
| | | `${dayjs(startDate).format('YYYY年MM月DD日')}至${dayjs(endDate).format('YYYY年MM月DD日')}` |
| | | `${dayjs(beginTime).format('YYYY年MM月DD日')}至${dayjs(endTime).format('YYYY年MM月DD日')}` |
| | | }} |
| | | </div> |
| | | <div v-else></div> |
| | |
| | | showMyTaskArrow?: boolean; |
| | | showTime?: boolean; |
| | | |
| | | startDate?: string; |
| | | endDate?: string; |
| | | taskName?: string; |
| | | address?: string; |
| | | name?: string; |
| | | beginTime?: string; |
| | | endTime?: string; |
| | | addressName?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | |
| | | EnumUserGender, |
| | | EnumSettlementCycle, |
| | | EnumTaskReleaseStatus, |
| | | EnumTaskCheckReceiveStatus, |
| | | } from './apiEnum'; |
| | | |
| | | export const EnumBillingMethodText = { |
| | |
| | | [EnumTaskReleaseStatus.InProcess]: '发布中', |
| | | [EnumTaskReleaseStatus.Stopped]: '已停止', |
| | | }; |
| | | |
| | | export const EnumTaskCheckReceiveStatusText = { |
| | | [EnumTaskCheckReceiveStatus.Wait]: '待验收', |
| | | [EnumTaskCheckReceiveStatus.Completed]: '已验收', |
| | | }; |
| | |
| | | import { trim } from '@12333/utils'; |
| | | import { MaybeRef, reactive, ref, unref } from 'vue'; |
| | | import * as taskServices from '@12333/services/apiV2/task'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | export enum HomeOrderType { |
| | | Recommend = 'Recommend', |
| | |
| | | settlementCycle?: EnumSettlementCycle; |
| | | benefitCodes?: string; |
| | | enterpriseId?: string; |
| | | time?: Date; |
| | | }; |
| | | }; |
| | | |
| | |
| | | status: '' as any as EnumTaskStatus, |
| | | releaseStatus: EnumTaskReleaseStatus.InProcess, |
| | | enterpriseId: '', |
| | | time: '' as any as Date, |
| | | ...defaultQueryMenuState, |
| | | }); |
| | | |
| | |
| | | status: queryMenuState.status, |
| | | releaseStatus: queryMenuState.releaseStatus, |
| | | enterpriseId: queryMenuState.enterpriseId, |
| | | beginTime: dayjs(queryMenuState.time).format('YYYY-MM-DD 00:00:00'), |
| | | endTime: dayjs(queryMenuState.time).format('YYYY-MM-DD 23:59:59'), |
| | | }; |
| | | |
| | | return taskServices.getTaskInfos(params, { |