| | |
| | | "query": "", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | }, |
| | | { |
| | | "name": "", |
| | | "pathName": "subpackages/jobApplicationManage/jobApplicationDetail/jobApplicationDetail", |
| | | "query": "id=04c75425-e783-4dbf-0f16-08ddd626b756", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | } |
| | | ] |
| | | } |
| | |
| | | 'publishTask/publishTask', |
| | | 'taskCheck/taskCheck', |
| | | 'taskCheckDetail/taskCheckDetail', |
| | | 'taskCheckedDetail/taskCheckedDetail', |
| | | 'taskHandleCheckDetail/taskHandleCheckDetail', |
| | | 'taskManage/taskManage', |
| | | 'batchTaskList/batchTaskList', |
| | |
| | | publishTask = '/subpackages/task/publishTask/publishTask', |
| | | taskCheck = '/subpackages/task/taskCheck/taskCheck', |
| | | taskCheckDetail = '/subpackages/task/taskCheckDetail/taskCheckDetail', |
| | | taskCheckedDetail = '/subpackages/task/taskCheckedDetail/taskCheckedDetail', |
| | | taskHandleCheckDetail = '/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail', |
| | | taskManage = '/subpackages/task/taskManage/taskManage', |
| | | batchTaskList = '/subpackages/task/batchTaskList/batchTaskList', |
| | |
| | | <template> |
| | | <div class="task-check-card-wrapper"> |
| | | <div class="task-check-card-wrapper" @click.stop="emit('taskChecked')"> |
| | | <TaskCheckPersonalView |
| | | class="task-check-card-view" |
| | | :avatarUrl="avatarUrl" |
| | | :avatar="avatar" |
| | | :name="name" |
| | | :genderType="genderType" |
| | | :isRealName="isRealName" |
| | | :contactPhone="contactPhone" |
| | | :gender="gender" |
| | | :isReal="isReal" |
| | | :contactPhoneNumber="contactPhoneNumber" |
| | | > |
| | | <template #actions> |
| | | <nut-button |
| | | v-if="checkAcceptStatus === EnumTaskCheckReceiveStatus.Wait" |
| | | v-if="checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive" |
| | | type="primary" |
| | | class="task-check-card-phone-btn" |
| | | @click.stop="emit('checkReceive')" |
| | | >验收</nut-button |
| | | > |
| | | <div v-else class="task-check-card-phone-status" :style="{ color: Colors.Success }"> |
| | | {{ EnumTaskCheckReceiveStatusText[checkAcceptStatus] }} |
| | | {{ EnumTaskCheckReceiveStatusText[checkReceiveStatus] }} |
| | | </div> |
| | | </template> |
| | | </TaskCheckPersonalView> |
| | |
| | | }); |
| | | |
| | | type Props = { |
| | | avatarUrl?: string; |
| | | avatar?: string; |
| | | name?: string; |
| | | genderType?: EnumUserGender; |
| | | isRealName?: boolean; |
| | | contactPhone?: string; |
| | | checkAcceptStatus?: EnumTaskCheckReceiveStatus; |
| | | gender?: EnumUserGender; |
| | | isReal?: boolean; |
| | | contactPhoneNumber?: string; |
| | | checkReceiveStatus?: EnumTaskCheckReceiveStatus; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'checkReceive'): void; |
| | | (e: 'taskChecked'): void; |
| | | }>(); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | |
| | | <template> |
| | | <FlexJobTopView |
| | | :avatarUrl="avatarUrl" |
| | | :name="name" |
| | | :genderType="genderType" |
| | | :isRealName="isRealName" |
| | | > |
| | | <FlexJobTopView :avatar="avatar" :name="name" :gender="gender" :isReal="isReal"> |
| | | <template #detail> |
| | | <div class="task-check-card-phone-container"> |
| | | <div class="task-check-card-phone-wrapper"> |
| | | <div class="task-check-card-phone-label">手机号:</div> |
| | | <div class="task-check-card-phone">{{ contactPhone }}</div> |
| | | <div class="task-check-card-phone">{{ contactPhoneNumber }}</div> |
| | | </div> |
| | | <slot name="actions"></slot> |
| | | </div> |
| | |
| | | }); |
| | | |
| | | type Props = { |
| | | avatarUrl?: string; |
| | | avatar?: string; |
| | | name?: string; |
| | | genderType?: EnumUserGender; |
| | | isRealName?: boolean; |
| | | contactPhone?: string; |
| | | gender?: EnumUserGender; |
| | | isReal?: boolean; |
| | | contactPhoneNumber?: string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), {}); |
| | |
| | | import { MyTaskCard, ProTabs, ProTabPane, Calendar } from '@12333/components'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { EnumTaskCheckReceiveStatus } from '@12333/constants'; |
| | | import { useInfiniteLoading, useTaskList } from '@12333/hooks'; |
| | | import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive'; |
| | | import dayjs from 'dayjs'; |
| | | import { useCheckReceiveTasks } from '@12333/hooks'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const queryState = reactive({ |
| | | date: dayjs().toDate(), |
| | | checkReceiveStatus: EnumTaskCheckReceiveStatus.WaitSubmit, |
| | | }); |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.GetCheckReceiveTasksQuery = { |
| | | pageModel: { |
| | | rows: 20, |
| | | page: pageParam, |
| | | }, |
| | | date: dayjs(queryState.date).format('YYYY-MM-DD'), |
| | | checkReceiveStatus: queryState.checkReceiveStatus, |
| | | }; |
| | | |
| | | return taskCheckReceiveServices.getCheckReceiveTasks(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['taskCheckReceiveServices/getCheckReceiveTasks', queryState], |
| | | } |
| | | ); |
| | | const { queryState, infiniteLoadingProps } = useCheckReceiveTasks(); |
| | | |
| | | function goSubmitTaskDetail(item: API.GetCheckReceiveTasksQueryResultItem) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskCheckDetail}?taskId=${item.id}`, |
| | | url: `${RouterPath.taskCheckDetail}?id=${item.id}&date=${queryState.date}&checkReceiveStatus=${queryState.checkReceiveStatus}`, |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | <template> |
| | | <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> |
| | | <LoadingLayout> |
| | | <ContentView> |
| | | <MyTaskCard |
| | | :namee="detail.name" |
| | | :addressName="detail.addressName" |
| | | :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.name" |
| | | :addressName="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.addressName" |
| | | :showMyTaskArrow="false" |
| | | :showTime="false" |
| | | ></MyTaskCard> |
| | |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | v-bind="infiniteLoadingProps" |
| | | :key="queryState.status" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <TaskCheckCard |
| | | :avatarUrl="setOSSLink(item.avatarUrl)" |
| | | :avatar="setOSSLink(item.avatar)" |
| | | :name="item.name" |
| | | :genderType="item.genderType" |
| | | :isRealName="item.isRealName" |
| | | :contactPhone="item.contactPhone" |
| | | :checkAcceptStatus="item.checkAcceptStatus" |
| | | @click="goHandleTaskDetail(item)" |
| | | :gender="item.gender" |
| | | :isReal="item.isReal" |
| | | :contactPhoneNumber="item.contactPhoneNumber" |
| | | :checkReceiveStatus="item.checkReceiveStatus" |
| | | @checkReceive="goHandleTaskDetail(item)" |
| | | @taskChecked="goTaskCheckedDetail(item)" |
| | | /> |
| | | </template> |
| | | </InfiniteLoading> |
| | |
| | | |
| | | <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 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 { setOSSLink } from '@12333/utils'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const router = Taro.useRouter(); |
| | | const taskId = router.params?.taskId ?? ''; |
| | | |
| | | const { |
| | | isLoading, |
| | | isError, |
| | | data: detail, |
| | | refetch, |
| | | } = useQuery({ |
| | | queryKey: ['taskServices/getTaskInfo', taskId], |
| | | queryFn: async () => { |
| | | return await taskServices.getTaskInfo( |
| | | { id: taskId }, |
| | | { |
| | | showLoading: false, |
| | | } |
| | | ); |
| | | }, |
| | | placeholderData: () => ({} as API.GetTaskInfoQueryResult), |
| | | }); |
| | | |
| | | const queryState = reactive({ |
| | | status: 10, |
| | | }); |
| | | const id = router.params?.id ?? ''; |
| | | const date = router.params?.date ?? ''; |
| | | const checkReceiveStatus = Number(router.params?.checkReceiveStatus); |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.GetFlexTaskWorkerCheckListInput = { |
| | | 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 flexWorkerServices.getFlexTaskWorkerCheckList(params, { |
| | | return taskCheckReceiveServices.getCheckReceiveTask(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['flexWorkerServices/getFlexTaskWorkerCheckList', queryState], |
| | | queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'], |
| | | } |
| | | ); |
| | | |
| | | function goHandleTaskDetail(item: API.GetNewestWorkerListOutput) { |
| | | function goHandleTaskDetail(item: API.GetCheckReceiveTaskQueryResultItem) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskHandleCheckDetail}?userId=${item.userId}&taskId=${taskId}`, |
| | | url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}&date=${date}`, |
| | | }); |
| | | } |
| | | |
| | | function goTaskCheckedDetail(item: API.GetCheckReceiveTaskQueryResultItem) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskCheckedDetail}?id=${item.id}`, |
| | | }); |
| | | } |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <LoadingLayout> |
| | | <ContentView> |
| | | <MyTaskCard |
| | | :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.taskInfo?.name" |
| | | :addressName="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.taskInfo?.addressName" |
| | | :showMyTaskArrow="false" |
| | | :showTime="false" |
| | | ></MyTaskCard> |
| | | <ChunkTitle title="验收列表" /> |
| | | <TaskCheckCard |
| | | :avatar=" |
| | | setOSSLink( |
| | | infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.avatar |
| | | ) |
| | | " |
| | | :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.name" |
| | | :gender=" |
| | | infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.gender |
| | | " |
| | | :isReal=" |
| | | infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser?.isReal |
| | | " |
| | | :contactPhoneNumber=" |
| | | infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser |
| | | ?.contactPhoneNumber |
| | | " |
| | | :checkReceiveStatus=" |
| | | infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.enterpriseEmployeeUser |
| | | ?.checkReceiveStatus |
| | | " |
| | | /> |
| | | <div class="taskCheckFileCard-status-title">验收照片</div> |
| | | </ContentView> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | v-bind="infiniteLoadingProps" |
| | | :key="date" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <TaskCheckFileCard |
| | | :created-time="item?.createdTime" |
| | | :checkReceiveStatus="item?.checkReceiveStatus" |
| | | :files="item?.files" |
| | | /> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import Taro from '@tarojs/taro'; |
| | | import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive'; |
| | | import { useInfiniteLoading } from '@12333/hooks'; |
| | | import TaskCheckCard from '../components/TaskCheckCard.vue'; |
| | | import { MyTaskCard, TaskCheckFileCard } from '@12333/components'; |
| | | import { setOSSLink } from '@12333/utils'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const router = Taro.useRouter(); |
| | | const id = router.params?.id ?? ''; |
| | | const date = router.params?.date ?? ''; |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.GetCheckReceiveTaskUserSubmitsQuery = { |
| | | pageModel: { |
| | | rows: 20, |
| | | page: pageParam, |
| | | }, |
| | | id: id, |
| | | }; |
| | | |
| | | return taskCheckReceiveServices.getCheckReceiveTaskUserSubmits(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmits'], |
| | | } |
| | | ); |
| | | </script> |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .taskCheckedDetail-page-wrapper { |
| | | .taskCheckFileCard-status-title { |
| | | font-weight: 600; |
| | | font-size: 28px; |
| | | line-height: 32px; |
| | | margin-bottom: 16px; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | } |
| | | |
| | | .task-check-card-wrapper { |
| | | margin-bottom: 24px; |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
New file |
| | |
| | | <template> |
| | | <PageLayoutWithBg class="taskCheckedDetail-page-wrapper" title="验收详情"> |
| | | <InnerPage /> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'taskCheckedDetail', |
| | | }); |
| | | </script> |
| | |
| | | <ContentScrollView style="background-color: #fff"> |
| | | <div class="personal-info-wrapper"> |
| | | <TaskCheckPersonalView |
| | | :avatarUrl="setOSSLink(detail.avatarUrl)" |
| | | :name="detail.name" |
| | | :isRealName="detail.isRealName" |
| | | :contactPhone="detail.contactPhone" |
| | | :avatarUrl="setOSSLink(detail?.enterpriseEmployeeUser?.avatar)" |
| | | :name="detail?.enterpriseEmployeeUser?.name" |
| | | :isReal="detail?.enterpriseEmployeeUser?.isReal" |
| | | :contactPhoneNumber="detail?.enterpriseEmployeeUser?.contactPhoneNumber" |
| | | /> |
| | | </div> |
| | | <div class="taskCheckDetail-status-wrapper"> |
| | | <div class="taskCheckDetail-status-title">验收照片</div> |
| | | </div> |
| | | <div class="taskCheckDetail-time"> |
| | | {{ dayjs(detail.appleCheckTime).format('YYYY.MM.DD HH:mm:ss') }} |
| | | </div> |
| | | <nut-grid |
| | | square |
| | | :column-num="3" |
| | | :border="false" |
| | | :gutter="20" |
| | | v-if="list.length > 0" |
| | | class="pro-img-grid" |
| | | > |
| | | <nut-grid-item |
| | | v-for="(item, index) in detail.checkImageUrl" |
| | | :key="index" |
| | | class="pro-img-grid-item" |
| | | > |
| | | <div class="pro-img-grid-img-item"> |
| | | <PreviewImage :src="item" class="pro-img-grid-img" :urls="list" /> |
| | | </div> |
| | | </nut-grid-item> |
| | | </nut-grid> |
| | | <div class="taskCheckFileCard-status-title">验收照片</div> |
| | | <TaskCheckFileCard |
| | | :created-time="detail?.createdTime" |
| | | :files="detail?.files" |
| | | ></TaskCheckFileCard> |
| | | </ContentScrollView> |
| | | <PageFooter> |
| | | <PageFooterBtn type="primary" :color="Colors.Info" class="dark-btn">验收未通过</PageFooterBtn> |
| | | <PageFooterBtn type="primary">验收通过</PageFooterBtn> |
| | | <PageFooterBtn |
| | | type="primary" |
| | | :color="Colors.Info" |
| | | class="dark-btn" |
| | | @click="checkReceiveTask(EnumTaskUserSubmitCheckReceiveStatus.Fail)" |
| | | >验收未通过</PageFooterBtn |
| | | > |
| | | <PageFooterBtn |
| | | type="primary" |
| | | @click="checkReceiveTask(EnumTaskUserSubmitCheckReceiveStatus.Success)" |
| | | >验收通过</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 taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive'; |
| | | import TaskCheckPersonalView from '../components/TaskCheckPersonalView.vue'; |
| | | import { PreviewImage } from '@12333/components'; |
| | | import { Colors } from '@12333/constants'; |
| | | import { setOSSLink } from '@12333/utils'; |
| | | import { TaskCheckFileCard } from '@12333/components'; |
| | | import { Colors, EnumTaskUserSubmitCheckReceiveStatus } from '@12333/constants'; |
| | | import { Message, setOSSLink } from '@12333/utils'; |
| | | import dayjs from 'dayjs'; |
| | | import { goBack } from '@/utils'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const router = Taro.useRouter(); |
| | | const taskId = router.params?.taskId ?? ''; |
| | | const userId = router.params?.userId ?? ''; |
| | | const id = router.params?.id ?? ''; |
| | | const date = router.params?.date ?? ''; |
| | | |
| | | const { |
| | | isLoading, |
| | |
| | | data: detail, |
| | | refetch, |
| | | } = useQuery({ |
| | | queryKey: ['flexWorkerServices/getOrdeForDetail', taskId], |
| | | queryKey: ['flexWorkerServices/getOrdeForDetail', id, date], |
| | | queryFn: async () => { |
| | | return await flexWorkerServices.getFlexTaskWorkerCheckContentDto( |
| | | { flexTaskId: taskId, flexWorkerId: userId }, |
| | | return await taskCheckReceiveServices.getCheckReceiveTaskUserSubmit( |
| | | { taskInfoUserId: id, date: dayjs(date).format('YYYY-MM-DD') }, |
| | | { |
| | | showLoading: false, |
| | | } |
| | | ); |
| | | }, |
| | | placeholderData: () => ({} as API.GetTaskWorkerCheckContentOutput), |
| | | placeholderData: () => ({} as API.GetCheckReceiveTaskUserSubmitQueryResult), |
| | | }); |
| | | |
| | | const list = ref([ |
| | | 'https://storage.360buyimg.com/jdc-article/NutUItaro34.jpg', |
| | | 'https://storage.360buyimg.com/jdc-article/NutUItaro2.jpg', |
| | | 'https://storage.360buyimg.com/jdc-article/welcomenutui.jpg', |
| | | 'https://storage.360buyimg.com/jdc-article/fristfabu.jpg', |
| | | ]); |
| | | async function checkReceiveTask(checkReceiveStatus: EnumTaskUserSubmitCheckReceiveStatus) { |
| | | try { |
| | | let params: API.CheckReceiveTaskCommand = { |
| | | id: detail.value?.id, |
| | | checkReceiveStatus: checkReceiveStatus, |
| | | }; |
| | | let res = await taskCheckReceiveServices.checkReceiveTask(params); |
| | | if (res) { |
| | | Message.success('提交成功', { |
| | | onClosed() { |
| | | goBack(); |
| | | }, |
| | | }); |
| | | } |
| | | } catch (error) {} |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .taskHandleCheckDetail-page-wrapper { |
| | | .personal-info-wrapper { |
| | | padding-top: 52px; |
| | | padding-bottom: 36px; |
| | | border-bottom: 1px solid #d9d9d9; |
| | | margin-bottom: 22px; |
| | | } |
| | | |
| | | .taskCheckDetail-status-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | .taskCheckFileCard-status-title { |
| | | font-weight: 600; |
| | | font-size: 28px; |
| | | line-height: 32px; |
| | | margin-bottom: 16px; |
| | | |
| | | .taskCheckDetail-status-title { |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | } |
| | | |
| | | .taskCheckDetail-time { |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | line-height: 36px; |
| | | .personal-info-wrapper { |
| | | padding-top: 52px; |
| | | padding-bottom: 36px; |
| | | border-bottom: 1px solid #d9d9d9; |
| | | margin-bottom: 22px; |
| | | } |
| | | } |
| | |
| | | "ignore": [], |
| | | "include": [] |
| | | }, |
| | | "appid": "wxb9e0baf4f87aa0de" |
| | | "appid": "wx88251c84f5cd886b" |
| | | } |
| | |
| | | const { queryState, infiniteLoadingProps } = useCheckReceiveTasks(); |
| | | |
| | | function goSubmitTaskDetail(item: API.GetCheckReceiveTasksQueryResultItem) { |
| | | if (item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitSubmit) { |
| | | if (Number(queryState.checkReceiveStatus) === EnumTaskCheckReceiveStatus.WaitSubmit) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskSubmitCheck}?id=${item.id}`, |
| | | }); |
| | | } |
| | | if (item.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed) { |
| | | if (Number(queryState.checkReceiveStatus) === EnumTaskCheckReceiveStatus.Completed) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskCheckDetail}?id=${item.id}`, |
| | | }); |
| | |
| | | <template> |
| | | <ContentScrollView style="background-color: transparent"> |
| | | <MyTaskCard :showMyTaskArrow="false"></MyTaskCard> |
| | | <div class="taskCheckFileCard-status-title">验收照片</div> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list task-list" |
| | | v-bind="infiniteLoadingProps" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <div class="taskCheckDetail-status-wrapper"> |
| | | <div class="taskCheckDetail-status-title">验收照片</div> |
| | | <div |
| | | class="taskCheckDetail-status" |
| | | :style="{ |
| | | color: Colors.Warning, |
| | | }" |
| | | > |
| | | 待验收 |
| | | </div> |
| | | </div> |
| | | <div class="taskCheckDetail-time">2024.11.14 9:28:39</div> |
| | | <nut-grid |
| | | square |
| | | :column-num="3" |
| | | :border="false" |
| | | :gutter="20" |
| | | v-if="item?.files?.length > 0" |
| | | class="taskCheckDetail-img-grid" |
| | | > |
| | | <nut-grid-item |
| | | v-for="(itema, index) in item.files" |
| | | :key="index" |
| | | class="publish-circle-friend-file-grid-item" |
| | | > |
| | | <div class="taskCheckDetail-img-grid-item"> |
| | | <PreviewImage |
| | | :src="setOSSLink(itema)" |
| | | class="taskCheckDetail-img" |
| | | :urls="item.files" |
| | | /> |
| | | </div> |
| | | </nut-grid-item> |
| | | </nut-grid> |
| | | <TaskCheckFileCard |
| | | :created-time="item?.createdTime" |
| | | :files="item?.files" |
| | | ></TaskCheckFileCard> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </ContentScrollView> |
| | |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { MyTaskCard, PreviewImage } from '@12333/components'; |
| | | import { Colors } from '@12333/constants'; |
| | | import { MyTaskCard, TaskCheckFileCard } from '@12333/components'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { useCheckReceiveTaskUserSubmits } from '@12333/hooks'; |
| | | import { setOSSLink } from '@12333/utils'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .taskCheckDetail-page-wrapper { |
| | | .taskCheckDetail-status-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | .taskCheckFileCard-status-title { |
| | | font-weight: 600; |
| | | font-size: 28px; |
| | | line-height: 32px; |
| | | margin-bottom: 16px; |
| | | |
| | | .taskCheckDetail-status-title { |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | } |
| | | |
| | | .taskCheckDetail-time { |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | line-height: 36px; |
| | | margin-bottom: 22px; |
| | | } |
| | | |
| | | .taskCheckDetail-img-grid { |
| | | padding: 0 !important; |
| | | |
| | | .publish-circle-friend-file-grid-item { |
| | | .nut-grid-item__content--square { |
| | | padding: 0; |
| | | border: none; |
| | | display: block; |
| | | background-color: transparent; |
| | | } |
| | | } |
| | | |
| | | .taskCheckDetail-img-grid-item { |
| | | width: 100%; |
| | | height: 100%; |
| | | box-sizing: border-box; |
| | | position: relative; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .taskCheckDetail-img { |
| | | border-radius: 8px; |
| | | width: 100% !important; |
| | | height: 100%; |
| | | object-fit: cover; |
| | | } |
| | | } |
| | | |
| | | .taskCheckDetail-tips-wrapper { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | line-height: 32px; |
| | | padding: 20px 0; |
| | | |
| | | .taskCheckDetail-tips-text { |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | } |
| | | |
| | | .taskCheckDetail-tips-btn { |
| | | color: boleGetCssVar('color', 'primary'); |
| | | } |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | } |
| | | } |
| | | </style> |
| | |
| | | import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { goBack } from '@/utils'; |
| | | import { useQueryClient } from '@tanstack/vue-query'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | |
| | | |
| | | const route = Taro.useRouter(); |
| | | const id = route.params?.id as string; |
| | | const queryClient = useQueryClient(); |
| | | |
| | | const form = reactive({ |
| | | files: [] as FileItem[], |
| | |
| | | Message.success('提交成功', { |
| | | onClosed() { |
| | | goBack(); |
| | | queryClient.invalidateQueries(['taskServices/getTaskInfo', id]); |
| | | }, |
| | | }); |
| | | } |
New file |
| | |
| | | <template> |
| | | <div class="taskCheckFileCard-wrapper"> |
| | | <div class="taskCheckFileCard-status-wrapper"> |
| | | <div class="taskCheckFileCard-time"> |
| | | {{ dayjs(props.createdTime).format('YYYY-MM-DD HH:mm:ss') }} |
| | | </div> |
| | | <div |
| | | class="taskCheckFileCard-status" |
| | | :style="{ |
| | | color: Colors.Warning, |
| | | }" |
| | | > |
| | | {{ EnumTaskCheckReceiveStatusText[props.checkReceiveStatus] }} |
| | | </div> |
| | | </div> |
| | | |
| | | <nut-grid |
| | | square |
| | | :column-num="3" |
| | | :border="false" |
| | | :gutter="20" |
| | | v-if="props?.files?.length > 0" |
| | | class="taskCheckFileCard-img-grid" |
| | | > |
| | | <nut-grid-item |
| | | v-for="(itema, index) in props.files" |
| | | :key="index" |
| | | class="publish-circle-friend-file-grid-item" |
| | | > |
| | | <div class="taskCheckFileCard-img-grid-item"> |
| | | <PreviewImage |
| | | :src="setOSSLink(itema)" |
| | | class="taskCheckFileCard-img" |
| | | :urls="props.files" |
| | | /> |
| | | </div> |
| | | </nut-grid-item> |
| | | </nut-grid> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { PreviewImage } from '@12333/components'; |
| | | import { |
| | | Colors, |
| | | EnumTaskUserSubmitCheckReceiveStatus, |
| | | EnumTaskCheckReceiveStatusText, |
| | | } from '@12333/constants'; |
| | | import { setOSSLink } from '@12333/utils'; |
| | | import dayjs from 'dayjs'; |
| | | |
| | | defineOptions({ |
| | | name: 'TaskCheckFileCard', |
| | | }); |
| | | |
| | | type Props = { |
| | | createdTime?: string; |
| | | checkReceiveStatus?: EnumTaskUserSubmitCheckReceiveStatus; |
| | | files?: string[]; |
| | | |
| | | showCheckReceiveStatus?: boolean; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | showCheckReceiveStatus: false, |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .taskCheckFileCard-wrapper { |
| | | .taskCheckFileCard-status-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | .taskCheckFileCard-time { |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | line-height: 32px; |
| | | } |
| | | |
| | | .taskCheckFileCard-img-grid { |
| | | padding: 0 !important; |
| | | |
| | | .publish-circle-friend-file-grid-item { |
| | | .nut-grid-item__content--square { |
| | | padding: 0; |
| | | border: none; |
| | | display: block; |
| | | background-color: transparent; |
| | | } |
| | | |
| | | .taskCheckFileCard-img-grid-item { |
| | | width: 100%; |
| | | height: 100%; |
| | | box-sizing: border-box; |
| | | position: relative; |
| | | padding: 20px; |
| | | } |
| | | } |
| | | |
| | | .taskCheckFileCard-img { |
| | | border-radius: 8px; |
| | | width: 100% !important; |
| | | height: 100%; |
| | | object-fit: cover; |
| | | } |
| | | } |
| | | |
| | | .taskCheckFileCard-tips-wrapper { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | line-height: 32px; |
| | | padding: 20px 0; |
| | | |
| | | .taskCheckFileCard-tips-text { |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | } |
| | | |
| | | .taskCheckFileCard-tips-btn { |
| | | color: boleGetCssVar('color', 'primary'); |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | export { default as AreaTreeSelect } from './AreaTreeSelect/AreaTreeSelect.vue'; |
| | | export { default as Elevator } from './Elevator/Elevator.vue'; |
| | | export { default as TaskCard } from './Card/TaskCard.vue'; |
| | | export { default as TaskCheckFileCard } from './Card/TaskCheckFileCard.vue'; |
| | | export { default as MineAgreementSignCard } from './Card/MineAgreementSignCard.vue'; |
| | | export { default as JobApplicationCard } from './Card/JobApplicationCard.vue'; |
| | | export { default as MyTaskCard } from './Card/MyTaskCard.vue'; |
| | |
| | | }; |
| | | |
| | | export const EnumTaskCheckReceiveStatusText = { |
| | | [EnumTaskCheckReceiveStatus.WaitSubmit]: '待验收', |
| | | [EnumTaskCheckReceiveStatus.WaitSubmit]: '待提交', |
| | | [EnumTaskCheckReceiveStatus.WaitCheckReceive]: '待验收', |
| | | [EnumTaskCheckReceiveStatus.Completed]: '已验收', |
| | | }; |
| | | |
| | |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmits', id], |
| | | queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmits'], |
| | | } |
| | | ); |
| | | |
| | |
| | | }); |
| | | } |
| | | |
| | | /** 查询企业用户登录信息 GET /api/user/auth/getEnterpriseLoginInfo */ |
| | | export async function getEnterpriseLoginInfo( |
| | | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) |
| | | params: API.APIgetEnterpriseLoginInfoParams, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<API.GetEnterpriseLoginInfoQueryResult>('/api/user/auth/getEnterpriseLoginInfo', { |
| | | method: 'GET', |
| | | params: { |
| | | ...params, |
| | | request: undefined, |
| | | ...params['request'], |
| | | }, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 查询个人用户登录信息 GET /api/user/auth/getPersonalLoginInfo */ |
| | | export async function getPersonalLoginInfo( |
| | | // 叠加生成的Param类型 (非body参数swagger默认没有生成对象) |
| | |
| | | import * as user from './user'; |
| | | import * as userResume from './userResume'; |
| | | import * as auth from './auth'; |
| | | import * as taskCheckReceive from './taskCheckReceive'; |
| | | import * as resource from './resource'; |
| | | import * as taskUser from './taskUser'; |
| | | import * as taskCheckReceive from './taskCheckReceive'; |
| | | import * as menu from './menu'; |
| | | export default { |
| | | enterpriseEmployee, |
| | |
| | | user, |
| | | userResume, |
| | | auth, |
| | | taskCheckReceive, |
| | | resource, |
| | | taskUser, |
| | | taskCheckReceive, |
| | | menu, |
| | | }; |
| | |
| | | } |
| | | |
| | | interface APIgetCheckReceiveTaskUserSubmitParams { |
| | | /** 提交Id */ |
| | | id?: string; |
| | | /** 提交Id(用于B端客户端) */ |
| | | submitId?: string; |
| | | /** 任务Id(用于C端小程序编辑提交 和日期一起传) */ |
| | | taskInfoId?: string; |
| | | /** 任务人员Id(用于B端小程序验收 和日期一起传) */ |
| | | taskInfoUserId?: string; |
| | | /** 日期(用于两个小程序 跟某一个Id一起传) */ |
| | | date?: string; |
| | | } |
| | | |
| | | interface APIgetCurrentLogierMenuParams { |
| | |
| | | id?: string; |
| | | /** 任务Id */ |
| | | taskInfoId?: string; |
| | | } |
| | | |
| | | interface APIgetEnterpriseLoginInfoParams { |
| | | /** 查询企业用户登录信息 */ |
| | | request?: GetEnterpriseLoginInfoQuery; |
| | | } |
| | | |
| | | interface APIgetEnterpriseParams { |
| | |
| | | ids?: string[]; |
| | | /** 是否收藏 */ |
| | | isCollect?: boolean; |
| | | } |
| | | |
| | | interface CollectUserResumeCommand { |
| | | /** 用户Id */ |
| | | id?: string; |
| | | /** 是否已收藏 */ |
| | | isCollected?: boolean; |
| | | } |
| | | |
| | | interface ContactUserResumeCommand { |
| | | /** 用户Id */ |
| | | id?: string; |
| | | } |
| | | |
| | | interface DeleteDictionaryCategoryCommand { |
| | |
| | | /** 错误码 */ |
| | | errorCode?: string; |
| | | data?: GetEnterpriseEmployeesQueryResult; |
| | | /** 执行成功 */ |
| | | success?: boolean; |
| | | /** 错误信息 */ |
| | | msg?: any; |
| | | /** 附加数据 */ |
| | | extras?: any; |
| | | /** 时间戳 */ |
| | | timestamp?: number; |
| | | } |
| | | |
| | | interface FriendlyResultGetEnterpriseLoginInfoQueryResult { |
| | | /** 跟踪Id */ |
| | | traceId?: string; |
| | | /** 状态码 */ |
| | | code?: number; |
| | | /** 错误码 */ |
| | | errorCode?: string; |
| | | data?: GetEnterpriseLoginInfoQueryResult; |
| | | /** 执行成功 */ |
| | | success?: boolean; |
| | | /** 错误信息 */ |
| | |
| | | interface GetCheckReceiveTaskQuery { |
| | | /** 任务Id */ |
| | | taskInfoId?: string; |
| | | checkReceiveStatus?: EnumTaskCheckReceiveStatus; |
| | | /** 日期(B端小程序专用) */ |
| | | date?: string; |
| | | pageModel?: PagedListQueryPageModel; |
| | | } |
| | | |
| | |
| | | interface GetCheckReceiveTasksQuery { |
| | | /** 日期(小程序-验收管理专用) */ |
| | | date?: string; |
| | | /** 关键字(姓名/手机/身份证号) */ |
| | | keywords?: string; |
| | | /** 验收日期-最早时间(B端客户端-验收管理专用) */ |
| | | checkReceiveTimeBegin?: string; |
| | | /** 验收日期-最晚时间(B端客户端-验收管理专用) */ |
| | |
| | | /** 服务费 */ |
| | | serviceFee?: number; |
| | | settlementCycle?: EnumSettlementCycle; |
| | | /** 发布时间 */ |
| | | createdTime?: string; |
| | | /** 任务开始时间 */ |
| | | beginTime?: string; |
| | | /** 任务结束时间 */ |
| | |
| | | } |
| | | |
| | | interface GetCheckReceiveTaskUserSubmitsQueryResultObjectDataEnterpriseEmployeeUser { |
| | | /** 用户Id */ |
| | | id?: string; |
| | | /** 头像 */ |
| | | avatar?: string; |
| | | /** 姓名 */ |
| | |
| | | /** 是否实名 */ |
| | | isReal?: boolean; |
| | | realMethod?: EnumUserRealMethod; |
| | | /** 是否绑定银行卡 */ |
| | | isBindBankCard?: boolean; |
| | | } |
| | | |
| | | interface GetCheckReceiveTaskUserSubmitsQueryResultObjectDataTaskInfo { |
| | |
| | | enterpriseSignContractStatus?: EnumTaskUserSignContractStatus; |
| | | /** 企业签约时间 */ |
| | | enterpriseSignContractTime?: string; |
| | | } |
| | | |
| | | type GetEnterpriseLoginInfoQuery = Record<string, any>; |
| | | |
| | | interface GetEnterpriseLoginInfoQueryResult { |
| | | /** Id */ |
| | | id?: string; |
| | | /** 头像 */ |
| | | avatar?: string; |
| | | /** 姓名 */ |
| | | name?: string; |
| | | /** 企业全称 */ |
| | | enterpriseName?: string; |
| | | /** 角色 */ |
| | | roles?: string[]; |
| | | /** 是否实名 */ |
| | | isReal?: boolean; |
| | | /** 我的收藏 */ |
| | | collectUsers?: number; |
| | | /** 联系记录 */ |
| | | contactRecords?: number; |
| | | } |
| | | |
| | | interface GetEnterpriseQueryResult { |
| | |
| | | applyCount?: number; |
| | | /** 任务名称 */ |
| | | name?: string; |
| | | /** 任务单号 */ |
| | | code?: string; |
| | | billingMethod?: EnumBillingMethod; |
| | | /** 服务费 */ |
| | | serviceFee?: number; |
| | |
| | | checkReceiveStatus?: EnumTaskCheckReceiveStatus; |
| | | settlementStatus?: EnumTaskSettlementStatus; |
| | | recommendStatus?: EnumTaskRecommendStatus; |
| | | /** 创建时间 */ |
| | | /** 发布时间 */ |
| | | createdTime?: string; |
| | | } |
| | | |
| | |
| | | // @ts-ignore |
| | | import { request } from '@/utils/request'; |
| | | |
| | | /** 收藏灵工 POST /api/user/userResume/collectUserResume */ |
| | | export async function collectUserResume( |
| | | body: API.CollectUserResumeCommand, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<string>('/api/user/userResume/collectUserResume', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json-patch+json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 联系灵工 POST /api/user/userResume/contactUserResume */ |
| | | export async function contactUserResume( |
| | | body: API.ContactUserResumeCommand, |
| | | options?: API.RequestConfig |
| | | ) { |
| | | return request<string>('/api/user/userResume/contactUserResume', { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json-patch+json', |
| | | }, |
| | | data: body, |
| | | ...(options || {}), |
| | | }); |
| | | } |
| | | |
| | | /** 删除用户简历-资格证书 DELETE /api/user/userResume/deleteUserResumeCredential */ |
| | | export async function deleteUserResumeCredential( |
| | | body: API.DeleteUserResumeCredentialCommand, |