| | |
| | | "miniprogram": { |
| | | "list": [ |
| | | { |
| | | "name": "任务管理", |
| | | "pathName": "subpackages/task/taskManage/taskManage", |
| | | "query": "", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | }, |
| | | { |
| | | "name": "验收人员详情", |
| | | "pathName": "subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail", |
| | | "query": "id=57a8f533-2a46-7a88-e008-3a1775810dd2", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | }, |
| | | { |
| | | "name": "验收详情", |
| | | "pathName": "subpackages/task/taskCheckDetail/taskCheckDetail", |
| | | "query": "id=57a8f533-2a46-7a88-e008-3a1775810dd2", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | }, |
| | | { |
| | | "name": "验收管理", |
| | | "pathName": "subpackages/task/taskCheck/taskCheck", |
| | | "query": "", |
| | | "launchMode": "default", |
| | | "scene": null |
| | | }, |
| | | { |
| | | "name": "灵工详情", |
| | | "pathName": "subpackages/flexJob/flexJobDetail/flexJobDetail", |
| | | "query": "id=c4cfe028-23e7-0be8-ee56-3a11e3743b9d", |
| | |
| | | }, |
| | | { |
| | | root: 'subpackages/task', |
| | | pages: ['publishTask/publishTask'], |
| | | pages: [ |
| | | 'publishTask/publishTask', |
| | | 'taskCheck/taskCheck', |
| | | 'taskCheckDetail/taskCheckDetail', |
| | | 'taskHandleCheckDetail/taskHandleCheckDetail', |
| | | 'taskManage/taskManage', |
| | | ], |
| | | }, |
| | | { |
| | | root: 'subpackages/city', |
| | |
| | | <template> |
| | | <div class="chunk-title-wrapper"> |
| | | <div class="chunk-title-line"></div> |
| | | <!-- <div class="chunk-title-line"></div> --> |
| | | <div class="chunk-title">{{ title }}</div> |
| | | </div> |
| | | </template> |
| | |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .chunk-title-wrapper { |
| | | padding: 32px 0; |
| | | padding: 24px 0; |
| | | display: flex; |
| | | align-items: center; |
| | | |
| | |
| | | mineContactRecord = '/subpackages/mine/mineContactRecord/mineContactRecord', |
| | | |
| | | publishTask = '/subpackages/task/publishTask/publishTask', |
| | | taskCheck = '/subpackages/task/taskCheck/taskCheck', |
| | | taskCheckDetail = '/subpackages/task/taskCheckDetail/taskCheckDetail', |
| | | taskHandleCheckDetail = '/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail', |
| | | taskManage = '/subpackages/task/taskManage/taskManage', |
| | | } |
| | |
| | | <CellChunk title="用人"> |
| | | <div class="workbenches-cell-list"> |
| | | <TaskDetailWelfareItem :icon="IconFlexjobManage" text="灵工管理" /> |
| | | <TaskDetailWelfareItem :icon="IconTaskManage" text="任务管理" /> |
| | | <TaskDetailWelfareItem :icon="IconAcceptManage" text="验收管理" /> |
| | | <TaskDetailWelfareItem |
| | | :icon="IconTaskManage" |
| | | text="任务管理" |
| | | @click="goPage(RouterPath.taskManage)" |
| | | /> |
| | | <TaskDetailWelfareItem |
| | | :icon="IconAcceptManage" |
| | | text="验收管理" |
| | | @click="goPage(RouterPath.taskCheck)" |
| | | /> |
| | | </div> |
| | | </CellChunk> |
| | | </Cell> |
| | |
| | | .pro-form-item-tips { |
| | | word-break: break-all; |
| | | } |
| | | |
| | | .pro-img-grid { |
| | | padding: 0 !important; |
| | | |
| | | .pro-img-grid-item { |
| | | .nut-grid-item__content--square { |
| | | padding: 0; |
| | | border: none; |
| | | display: block; |
| | | background-color: transparent; |
| | | } |
| | | } |
| | | |
| | | .pro-img-grid-img-item { |
| | | width: 100%; |
| | | height: 100%; |
| | | box-sizing: border-box; |
| | | position: relative; |
| | | padding: 20px; |
| | | } |
| | | |
| | | .pro-img-grid-img { |
| | | border-radius: 8px; |
| | | width: 100% !important; |
| | | height: 100%; |
| | | object-fit: cover; |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | <template> |
| | | <div class="curriculum-list-item"> |
| | | <div class="curriculum-list-item-label" :style="{ width: props.labelWidth }"> |
| | | {{ props.label }} |
| | | </div> |
| | | <div class="curriculum-list-item-text"> |
| | | <slot>{{ props.text }}</slot> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | defineOptions({ |
| | | name: 'CurriculumViewItem', |
| | | }); |
| | | |
| | | type Props = { |
| | | label?: string; |
| | | text?: string; |
| | | labelWidth?: number | string; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | labelWidth: 'auto', |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .flexJobDetail-page-wrapper { |
| | | .curriculum-list-item { |
| | | display: flex; |
| | | margin-bottom: 14px; |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | line-height: 36px; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .curriculum-list-item-label { |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | } |
| | | |
| | | .curriculum-list-item-text { |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | flex: 1; |
| | | min-width: 0; |
| | | @include ellipsis; |
| | | } |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <ContentScrollView> |
| | | <Cell :show-title="false"> |
| | | <CellChunk title="求职意向"> |
| | | <div class="curriculum-list"> |
| | | <CurriculumViewItem label="期望岗位:"> |
| | | <div class="curriculum-position-list"> |
| | | <div class="curriculum-position-list-item">客房服务员</div> |
| | | <div class="curriculum-position-list-item">客房服务员</div> |
| | | <div class="curriculum-position-list-item">客房服务员</div> |
| | | <div class="curriculum-position-list-item">客房服务员</div> |
| | | <div class="curriculum-position-list-item">客房员</div> |
| | | <div class="curriculum-position-list-item">客房服务员</div> |
| | | <div class="curriculum-position-list-item">客房服务员</div> |
| | | <div class="curriculum-position-list-item">客房服务员</div> |
| | | </div> |
| | | </CurriculumViewItem> |
| | | <CurriculumViewItem label="空闲时间:" text="不限"> </CurriculumViewItem> |
| | | <CurriculumViewItem label="求职状态:" text="积极找工作"> </CurriculumViewItem> |
| | | </div> |
| | | </CellChunk> |
| | | <CellChunk title="资格证书"> |
| | | <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 list" :key="item" 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> |
| | | </CellChunk> |
| | | <CellChunk title="工作经验"> |
| | | <CurriculumViewItem label="工作年限:" text="无工作经验,用户自己填写"> |
| | | </CurriculumViewItem> |
| | | <CurriculumViewItem label="工作经验:" text="客房服务员,用户自己填写"> |
| | | </CurriculumViewItem> |
| | | </CellChunk> |
| | | <CellChunk title="详细信息"> |
| | | <CurriculumViewItem |
| | | label="身高:" |
| | | text="175 cm" |
| | | :label-width="labelWidth" |
| | | ></CurriculumViewItem> |
| | | <CurriculumViewItem |
| | | label="体重:" |
| | | text="80 kg" |
| | | :label-width="labelWidth" |
| | | ></CurriculumViewItem> |
| | | <CurriculumViewItem label="个人照片:"> |
| | | <nut-grid |
| | | square |
| | | :column-num="2" |
| | | :border="false" |
| | | :gutter="20" |
| | | v-if="list.length > 0" |
| | | class="pro-img-grid" |
| | | > |
| | | <nut-grid-item v-for="(item, index) in list" :key="item" 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> |
| | | </CurriculumViewItem> |
| | | </CellChunk> |
| | | </Cell> |
| | | </ContentScrollView> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import CurriculumViewItem from './CurriculumViewItem.vue'; |
| | | import { PreviewImage } from '@12333/components'; |
| | | import Taro from '@tarojs/taro'; |
| | | |
| | | defineOptions({ |
| | | name: 'curriculumView', |
| | | }); |
| | | |
| | | const labelWidth = Taro.pxTransform(120); |
| | | |
| | | 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', |
| | | ]); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .flexJobDetail-page-wrapper { |
| | | .curriculum-position-list { |
| | | width: 100%; |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | column-gap: 24px; |
| | | row-gap: 16px; |
| | | |
| | | .curriculum-position-list-item { |
| | | font-weight: 500; |
| | | font-size: 24px; |
| | | color: boleGetCssVar('color', 'warning'); |
| | | line-height: 36px; |
| | | } |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <ContentScrollView> |
| | | <Cell title="岗位经历"> |
| | | <nut-steps direction="vertical" progress-dot :current="3" class="flexJobDetail-steps"> |
| | | <nut-step title="2024.12.24" content="您的订单已经打包完成,商品已发出"></nut-step> |
| | | <nut-step title="2024.12.24" content="您的订单正在配送途中"></nut-step> |
| | | <nut-step title="2024.12.24"> |
| | | <template #content> |
| | | <p>收货地址为:</p> |
| | | <p>北京市经济技术开发区科创十一街18号院京东大厦</p> |
| | | </template> |
| | | </nut-step> |
| | | </nut-steps> |
| | | </Cell> |
| | | </ContentScrollView> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | defineOptions({ |
| | | name: 'experienceView', |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .flexJobDetail-page-wrapper { |
| | | .flexJobDetail-steps { |
| | | .nut-step-main { |
| | | margin-bottom: 40px; |
| | | } |
| | | |
| | | .nut-step:last-child { |
| | | .nut-step-main { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <PageLayoutWithBg class="flexJobDetail-page-wrapper" title="灵工详情" :need-auth="false"> |
| | | <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> |
| | | <ContentScrollView style="background-color: transparent"> |
| | | <ContentView style="background-color: transparent"> |
| | | <FlexJobTopView size="small" class="flexJobDetail-top" /> |
| | | <div class="flexJobDetail-contact-info"> |
| | | <div class="flexJobDetail-contact-info-item"> |
| | |
| | | <div class="flexJobDetail-contact-info-item"> |
| | | <div class="flexJobDetail-contact-info-item-label">身份证号:</div> |
| | | <div class="flexJobDetail-contact-info-item-text"> |
| | | {{ isCollapse ? '330902199909******' : '立即联系后可查看' }} |
| | | {{ isCollapse ? hiddenIDNumberForEnd6('330902199909123456') : '立即联系后可查看' }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </ContentScrollView> |
| | | </ContentView> |
| | | <ProTabs |
| | | v-model="tab" |
| | | name="flexJobDetail-tab" |
| | | :showSmile="false" |
| | | class="flexJobDetail-tabs" |
| | | isTransparent |
| | | title-gutter="8" |
| | | fullHeight |
| | | > |
| | | <ProTabPane :title="`简历`" pane-key="1"> |
| | | <curriculumView /> |
| | | </ProTabPane> |
| | | <ProTabPane :title="`经历`" pane-key="2"> |
| | | <experienceView /> |
| | | </ProTabPane> |
| | | </ProTabs> |
| | | <PageFooter> |
| | | <PageFooterAction |
| | | :icon="IconShare" |
| | |
| | | import Taro from '@tarojs/taro'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import * as orderServices from '@12333/services/api/Order'; |
| | | import { FlexJobTopView } from '@12333/components'; |
| | | import { FlexJobTopView, ProTabs, ProTabPane } from '@12333/components'; |
| | | import IconShare from '@/assets/flexJob/icon-share.png'; |
| | | import IconAttention from '@/assets/flexJob/icon-attention-lg.png'; |
| | | import IconAttentionActive from '@/assets/flexJob/icon-attention-lg-active.png'; |
| | | import { useToggle } from 'senin-mini/hooks'; |
| | | import curriculumView from './components/curriculumView.vue'; |
| | | import experienceView from './components/experienceView.vue'; |
| | | import { hiddenIDNumberForEnd6 } from '@12333/utils'; |
| | | |
| | | defineOptions({ |
| | | name: 'flexJobDetail', |
| | |
| | | |
| | | const router = Taro.useRouter(); |
| | | const taskId = router.params?.id ?? ''; |
| | | |
| | | const tab = ref('1'); |
| | | |
| | | const { |
| | | isLoading, |
| | |
| | | |
| | | .flexJobDetail-contact-info { |
| | | padding-left: 130px; |
| | | margin-bottom: 78px; |
| | | |
| | | .flexJobDetail-contact-info-item { |
| | | display: flex; |
New file |
| | |
| | | <template> |
| | | <div class="task-check-card-wrapper"> |
| | | <TaskCheckPersonalView class="task-check-card-view"> |
| | | <template #actions> |
| | | <nut-button type="primary" class="task-check-card-phone-btn">验收</nut-button> |
| | | <!-- <div class="task-check-card-phone-status" :style="{ color: Colors.Success }">验收通过</div> --> |
| | | </template> |
| | | </TaskCheckPersonalView> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import TaskCheckPersonalView from './TaskCheckPersonalView.vue'; |
| | | import { Colors } from '@12333/constants'; |
| | | |
| | | defineOptions({ |
| | | name: 'TaskCheckCard', |
| | | }); |
| | | |
| | | // type Props = {}; |
| | | |
| | | // const props = withDefaults(defineProps<Props>(), {}); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .task-check-card-wrapper { |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | padding: 40px; |
| | | padding-right: 26px; |
| | | margin-bottom: 24px; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .task-check-card-view { |
| | | .task-check-card-phone-container { |
| | | margin-top: 0; |
| | | } |
| | | } |
| | | |
| | | .task-check-card-phone-status { |
| | | font-size: 24px; |
| | | height: 52px; |
| | | line-height: 52px; |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <FlexJobTopView> |
| | | <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">13000000000</div> |
| | | </div> |
| | | <slot name="actions"></slot> |
| | | </div> |
| | | </template> |
| | | </FlexJobTopView> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { FlexJobTopView } from '@12333/components'; |
| | | |
| | | defineOptions({ |
| | | name: 'TaskCheckPersonalView', |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | |
| | | .task-check-card-phone-container { |
| | | display: flex; |
| | | align-items: center; |
| | | /* height: 52px; */ |
| | | margin-top: 14px; |
| | | |
| | | .task-check-card-phone-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | font-weight: 400; |
| | | font-size: 24px; |
| | | line-height: 28px; |
| | | flex: 1; |
| | | min-width: 0; |
| | | |
| | | .flexJob-card-top-info { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | .task-check-card-phone-label { |
| | | color: boleGetCssVar('text-color', 'regular'); |
| | | } |
| | | |
| | | .task-check-card-phone { |
| | | color: boleGetCssVar('text-color', 'secondary'); |
| | | } |
| | | } |
| | | |
| | | .task-check-card-phone-btn { |
| | | width: 144px; |
| | | height: 52px; |
| | | font-size: 24px; |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <Calendar v-model="queryState.date"></Calendar> |
| | | <ProTabs |
| | | v-model="queryState.status" |
| | | name="task-tab" |
| | | :showPaneContent="false" |
| | | class="task-tabs" |
| | | isTransparent |
| | | title-gutter="8" |
| | | title-scroll |
| | | > |
| | | <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" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <MyTaskCard @click="goSubmitTaskDetail(item)" /> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </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 orderServices from '@12333/services/api/Order'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const queryState = reactive({ |
| | | status: 10, |
| | | date: new Date(), |
| | | }); |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.FrontOrderListInput = { |
| | | pageModel: { |
| | | rows: 20, |
| | | page: pageParam, |
| | | orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }], |
| | | }, |
| | | }; |
| | | |
| | | return orderServices.getFrontOrderList(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['orderServices/getFrontOrderList', queryState], |
| | | } |
| | | ); |
| | | |
| | | function goSubmitTaskDetail(item: API.FrontOrderList) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskCheckDetail}?id=${item.id}`, |
| | | }); |
| | | } |
| | | </script> |
New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
New file |
| | |
| | | <template> |
| | | <PageLayoutWithBg class="taskCheck-page-wrapper" :title="'验收管理'"> |
| | | <InnerPage></InnerPage> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'taskCheck', |
| | | }); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> |
| | | <ContentView> |
| | | <MyTaskCard :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)" /> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </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 { useInfiniteLoading } from '@12333/hooks'; |
| | | import { OrderInputType } from '@12333/constants'; |
| | | import TaskCheckCard from '../components/TaskCheckCard.vue'; |
| | | import { MyTaskCard } from '@12333/components'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const router = Taro.useRouter(); |
| | | const taskId = router.params?.id ?? ''; |
| | | |
| | | 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 queryState = reactive({ |
| | | status: 10, |
| | | }); |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.FrontOrderListInput = { |
| | | pageModel: { |
| | | rows: 20, |
| | | page: pageParam, |
| | | orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }], |
| | | }, |
| | | }; |
| | | |
| | | return orderServices.getFrontOrderList(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['orderServices/getFrontOrderList', queryState], |
| | | } |
| | | ); |
| | | |
| | | function goHandleTaskDetail(item: API.FrontOrderList) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}`, |
| | | }); |
| | | } |
| | | </script> |
New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
New file |
| | |
| | | <template> |
| | | <PageLayoutWithBg class="taskCheckDetail-page-wrapper" title="验收详情"> |
| | | <InnerPage /> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'taskCheckDetail', |
| | | }); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch"> |
| | | <ContentScrollView style="background-color: #fff"> |
| | | <div class="personal-info-wrapper"> |
| | | <TaskCheckPersonalView /> |
| | | </div> |
| | | <div class="taskCheckDetail-status-wrapper"> |
| | | <div class="taskCheckDetail-status-title">验收照片</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="list.length > 0" |
| | | class="pro-img-grid" |
| | | > |
| | | <nut-grid-item v-for="(item, index) in list" :key="item" 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> |
| | | </ContentScrollView> |
| | | <PageFooter> |
| | | <PageFooterBtn type="primary" :color="Colors.Info" class="dark-btn">验收未通过</PageFooterBtn> |
| | | <PageFooterBtn type="primary">验收通过</PageFooterBtn> |
| | | </PageFooter> |
| | | </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 TaskCheckPersonalView from '../components/TaskCheckPersonalView.vue'; |
| | | import { PreviewImage } from '@12333/components'; |
| | | import { Colors } from '@12333/constants'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const router = Taro.useRouter(); |
| | | const taskId = router.params?.id ?? ''; |
| | | |
| | | 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 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', |
| | | ]); |
| | | </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; |
| | | 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; |
| | | } |
| | | } |
| | | </style> |
New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
New file |
| | |
| | | <template> |
| | | <PageLayout class="taskHandleCheckDetail-page-wrapper" title="人员详情" has-border> |
| | | <InnerPage /> |
| | | </PageLayout> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'taskHandleCheckDetail', |
| | | }); |
| | | </script> |
New file |
| | |
| | | <template> |
| | | <ProTabs |
| | | v-model="queryState.status" |
| | | name="task-tab" |
| | | :showPaneContent="false" |
| | | class="task-tabs" |
| | | isTransparent |
| | | title-gutter="8" |
| | | title-scroll |
| | | > |
| | | <ProTabPane :title="`待安排(10)`" :pane-key="10"></ProTabPane> |
| | | <ProTabPane :title="`已安排(11)`" :pane-key="20"></ProTabPane> |
| | | </ProTabs> |
| | | <InfiniteLoading |
| | | scrollViewClassName="common-infinite-scroll-list" |
| | | v-bind="infiniteLoadingProps" |
| | | :key="queryState.status" |
| | | > |
| | | <template #renderItem="{ item }"> |
| | | <TaskCard @click="goSubmitTaskDetail(item)" /> |
| | | </template> |
| | | </InfiniteLoading> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { TaskCard, ProTabs, ProTabPane } from '@12333/components'; |
| | | import Taro from '@tarojs/taro'; |
| | | import { useInfiniteLoading } from '@12333/hooks'; |
| | | import { OrderInputType } from '@12333/constants'; |
| | | import * as orderServices from '@12333/services/api/Order'; |
| | | |
| | | defineOptions({ |
| | | name: 'InnerPage', |
| | | }); |
| | | |
| | | const queryState = reactive({ |
| | | status: 10, |
| | | }); |
| | | |
| | | const { infiniteLoadingProps } = useInfiniteLoading( |
| | | ({ pageParam }) => { |
| | | let params: API.FrontOrderListInput = { |
| | | pageModel: { |
| | | rows: 20, |
| | | page: pageParam, |
| | | orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }], |
| | | }, |
| | | }; |
| | | |
| | | return orderServices.getFrontOrderList(params, { |
| | | showLoading: false, |
| | | }); |
| | | }, |
| | | { |
| | | queryKey: ['orderServices/getFrontOrderList', queryState], |
| | | } |
| | | ); |
| | | |
| | | function goSubmitTaskDetail(item: API.FrontOrderList) { |
| | | Taro.navigateTo({ |
| | | url: `${RouterPath.taskCheckDetail}?id=${item.id}`, |
| | | }); |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss"> |
| | | @import '@/styles/common.scss'; |
| | | </style> |
New file |
| | |
| | | export default definePageConfig({ |
| | | disableScroll: true, |
| | | }); |
New file |
| | |
| | | <template> |
| | | <PageLayoutWithBg class="taskManage-page-wrapper" title="任务管理"> |
| | | <InnerPage /> |
| | | </PageLayoutWithBg> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import InnerPage from './InnerPage.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'taskManage', |
| | | }); |
| | | </script> |
| | |
| | | </div> |
| | | <div class="flexJob-card-top-info-auth">{{ '已实名' }}</div> |
| | | </div> |
| | | <div class="flexJob-card-top-info-detail">{{ '26岁 | 非学生 | 本科 | 上岗121次' }}</div> |
| | | <slot name="detail"> |
| | | <div class="flexJob-card-top-info-detail">{{ '26岁 | 非学生 | 本科 | 上岗121次' }}</div> |
| | | </slot> |
| | | </div> |
| | | </div> |
| | | </template> |
| | |
| | | .flexJob-card-top-info { |
| | | display: flex; |
| | | flex-direction: column; |
| | | flex: 1; |
| | | min-width: 0; |
| | | |
| | | .flexJob-card-top-info-item { |
| | | display: flex; |
| | |
| | | line-height: 34px; |
| | | font-weight: bold; |
| | | color: boleGetCssVar('text-color', 'primary'); |
| | | @include ellipsis; |
| | | } |
| | | |
| | | .flexJob-card-top-info-gender { |
| | |
| | | align-items: center; |
| | | height: 34px; |
| | | margin: 0 10px; |
| | | flex-shrink: 0; |
| | | |
| | | .flexJob-card-top-info-gender-icon { |
| | | width: 24px; |
| | |
| | | .flexJob-card-top-info-auth { |
| | | font-size: 28px; |
| | | line-height: 34px; |
| | | flex-shrink: 0; |
| | | } |
| | | } |
| | | |
| | |
| | | <RectRight :size="12" class="my-task-card-arrow" v-if="showMyTaskArrow" /> |
| | | <div v-else></div> |
| | | </template> |
| | | <div class="my-task-card-time">2025年2月5日 至 2025年3月5日</div> |
| | | <div class="my-task-card-time" v-if="showTime">2025年2月5日 至 2025年3月5日</div> |
| | | <div v-else></div> |
| | | </TaskCard> |
| | | </template> |
| | | |
| | |
| | | |
| | | type Props = CommonTaskCardProps & { |
| | | showMyTaskArrow?: boolean; |
| | | showTime?: boolean; |
| | | }; |
| | | |
| | | const props = withDefaults(defineProps<Props>(), { |
| | | showMyTaskArrow: true, |
| | | showTime: true, |
| | | }); |
| | | </script> |
| | | |
| | |
| | | export function filterJoin(list: any[], separator = '-') { |
| | | return list.filter(Boolean).join(separator); |
| | | } |
| | | |
| | | export const hiddenIDNumberForEnd6 = (realIDNumber: string) => |
| | | realIDNumber.replace(/^(\d+)(.{6})$/, '$1******'); |