zhengyiming
2025-02-14 05357b9c587f64cd548e987643066b253cd9bfe0
fix: b端
10个文件已修改
17个文件已添加
837 ■■■■■ 已修改文件
apps/bMiniApp/project.private.config.json 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/app.config.ts 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/components/Chunk/ChunkTitle.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/constants/router.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/pages/workbenches/InnerPage.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/styles/nut.scss 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/CurriculumViewItem.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/curriculumView.vue 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/experienceView.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskManage/taskManage.config.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/src/subpackages/task/taskManage/taskManage.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/FlexJobTopView.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/components/src/Card/MyTaskCard.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
packages/utils/common.ts 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
apps/bMiniApp/project.private.config.json
@@ -9,6 +9,34 @@
        "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",
apps/bMiniApp/src/app.config.ts
@@ -76,7 +76,13 @@
    },
    {
      root: 'subpackages/task',
      pages: ['publishTask/publishTask'],
      pages: [
        'publishTask/publishTask',
        'taskCheck/taskCheck',
        'taskCheckDetail/taskCheckDetail',
        'taskHandleCheckDetail/taskHandleCheckDetail',
        'taskManage/taskManage',
      ],
    },
    {
      root: 'subpackages/city',
apps/bMiniApp/src/components/Chunk/ChunkTitle.vue
@@ -1,6 +1,6 @@
<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>
@@ -21,7 +21,7 @@
@import '@/styles/common.scss';
.chunk-title-wrapper {
  padding: 32px 0;
  padding: 24px 0;
  display: flex;
  align-items: center;
apps/bMiniApp/src/constants/router.ts
@@ -29,4 +29,8 @@
  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',
}
apps/bMiniApp/src/pages/workbenches/InnerPage.vue
@@ -18,8 +18,16 @@
      <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>
apps/bMiniApp/src/styles/nut.scss
@@ -167,4 +167,32 @@
  .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;
    }
  }
}
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/CurriculumViewItem.vue
New file
@@ -0,0 +1,55 @@
<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>
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/curriculumView.vue
New file
@@ -0,0 +1,114 @@
<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>
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/experienceView.vue
New file
@@ -0,0 +1,40 @@
<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>
apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue
@@ -1,7 +1,7 @@
<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">
@@ -13,11 +13,27 @@
          <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"
@@ -40,11 +56,14 @@
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',
@@ -52,6 +71,8 @@
const router = Taro.useRouter();
const taskId = router.params?.id ?? '';
const tab = ref('1');
const {
  isLoading,
@@ -84,6 +105,7 @@
  .flexJobDetail-contact-info {
    padding-left: 130px;
    margin-bottom: 78px;
    .flexJobDetail-contact-info-item {
      display: flex;
apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
New file
@@ -0,0 +1,51 @@
<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>
apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue
New file
@@ -0,0 +1,61 @@
<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>
apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
New file
@@ -0,0 +1,66 @@
<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>
apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.vue
New file
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="taskCheck-page-wrapper" :title="'验收管理'">
    <InnerPage></InnerPage>
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'taskCheck',
});
</script>
apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
New file
@@ -0,0 +1,81 @@
<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>
apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.vue
New file
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="taskCheckDetail-page-wrapper" title="验收详情">
    <InnerPage />
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'taskCheckDetail',
});
</script>
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
New file
@@ -0,0 +1,108 @@
<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>
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.vue
New file
@@ -0,0 +1,13 @@
<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>
apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
New file
@@ -0,0 +1,68 @@
<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>
apps/bMiniApp/src/subpackages/task/taskManage/taskManage.config.ts
New file
@@ -0,0 +1,3 @@
export default definePageConfig({
  disableScroll: true,
});
apps/bMiniApp/src/subpackages/task/taskManage/taskManage.vue
New file
@@ -0,0 +1,13 @@
<template>
  <PageLayoutWithBg class="taskManage-page-wrapper" title="任务管理">
    <InnerPage />
  </PageLayoutWithBg>
</template>
<script setup lang="ts">
import InnerPage from './InnerPage.vue';
defineOptions({
  name: 'taskManage',
});
</script>
packages/components/src/Card/FlexJobTopView.vue
@@ -10,7 +10,9 @@
        </div>
        <div class="flexJob-card-top-info-auth">{{ '已实名' }}</div>
      </div>
      <slot name="detail">
      <div class="flexJob-card-top-info-detail">{{ '26岁 | 非学生 | 本科 | 上岗121次' }}</div>
      </slot>
    </div>
  </div>
</template>
@@ -46,6 +48,8 @@
  .flexJob-card-top-info {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-width: 0;
    .flexJob-card-top-info-item {
      display: flex;
@@ -56,6 +60,7 @@
        line-height: 34px;
        font-weight: bold;
        color: boleGetCssVar('text-color', 'primary');
        @include ellipsis;
      }
      .flexJob-card-top-info-gender {
@@ -63,6 +68,7 @@
        align-items: center;
        height: 34px;
        margin: 0 10px;
        flex-shrink: 0;
        .flexJob-card-top-info-gender-icon {
          width: 24px;
@@ -73,6 +79,7 @@
      .flexJob-card-top-info-auth {
        font-size: 28px;
        line-height: 34px;
        flex-shrink: 0;
      }
    }
packages/components/src/Card/MyTaskCard.vue
@@ -4,7 +4,8 @@
      <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>
@@ -19,10 +20,12 @@
type Props = CommonTaskCardProps & {
  showMyTaskArrow?: boolean;
  showTime?: boolean;
};
const props = withDefaults(defineProps<Props>(), {
  showMyTaskArrow: true,
  showTime: true,
});
</script>
packages/utils/common.ts
@@ -129,3 +129,6 @@
export function filterJoin(list: any[], separator = '-') {
  return list.filter(Boolean).join(separator);
}
export const hiddenIDNumberForEnd6 = (realIDNumber: string) =>
  realIDNumber.replace(/^(\d+)(.{6})$/, '$1******');