From 05357b9c587f64cd548e987643066b253cd9bfe0 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期五, 14 二月 2025 15:06:59 +0800
Subject: [PATCH] fix: b端

---
 apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue                   |  108 +++++++
 apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/CurriculumViewItem.vue    |   55 +++
 apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.vue       |   13 
 apps/bMiniApp/src/constants/router.ts                                                    |    4 
 apps/bMiniApp/src/pages/workbenches/InnerPage.vue                                        |   12 
 apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue                  |   61 ++++
 apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue                              |   68 ++++
 apps/bMiniApp/project.private.config.json                                                |   28 ++
 apps/bMiniApp/src/app.config.ts                                                          |    8 
 apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/experienceView.vue        |   40 ++
 apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue                               |   66 ++++
 apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue                          |   51 +++
 packages/components/src/Card/FlexJobTopView.vue                                          |    9 
 apps/bMiniApp/src/subpackages/task/taskManage/taskManage.vue                             |   13 
 apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.config.ts                         |    3 
 apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.config.ts |    3 
 apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.vue                               |   13 
 packages/utils/common.ts                                                                 |    3 
 apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue                    |   30 +
 apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.config.ts             |    3 
 apps/bMiniApp/src/subpackages/task/taskManage/taskManage.config.ts                       |    3 
 apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/curriculumView.vue        |  114 ++++++++
 apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.vue                   |   13 
 apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue                         |   81 +++++
 packages/components/src/Card/MyTaskCard.vue                                              |    5 
 apps/bMiniApp/src/components/Chunk/ChunkTitle.vue                                        |    4 
 apps/bMiniApp/src/styles/nut.scss                                                        |   28 ++
 27 files changed, 828 insertions(+), 11 deletions(-)

diff --git a/apps/bMiniApp/project.private.config.json b/apps/bMiniApp/project.private.config.json
index 3ff7cda..4b60a88 100644
--- a/apps/bMiniApp/project.private.config.json
+++ b/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",
diff --git a/apps/bMiniApp/src/app.config.ts b/apps/bMiniApp/src/app.config.ts
index 8e23d6e..45e4302 100644
--- a/apps/bMiniApp/src/app.config.ts
+++ b/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',
diff --git a/apps/bMiniApp/src/components/Chunk/ChunkTitle.vue b/apps/bMiniApp/src/components/Chunk/ChunkTitle.vue
index 49d88d5..94b00f9 100644
--- a/apps/bMiniApp/src/components/Chunk/ChunkTitle.vue
+++ b/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;
 
diff --git a/apps/bMiniApp/src/constants/router.ts b/apps/bMiniApp/src/constants/router.ts
index 330c92a..2e9128a 100644
--- a/apps/bMiniApp/src/constants/router.ts
+++ b/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',
 }
diff --git a/apps/bMiniApp/src/pages/workbenches/InnerPage.vue b/apps/bMiniApp/src/pages/workbenches/InnerPage.vue
index c62b8c3..e906178 100644
--- a/apps/bMiniApp/src/pages/workbenches/InnerPage.vue
+++ b/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>
diff --git a/apps/bMiniApp/src/styles/nut.scss b/apps/bMiniApp/src/styles/nut.scss
index ee5295d..df1482f 100644
--- a/apps/bMiniApp/src/styles/nut.scss
+++ b/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;
+    }
+  }
 }
diff --git a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/CurriculumViewItem.vue b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/CurriculumViewItem.vue
new file mode 100644
index 0000000..62171b3
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/CurriculumViewItem.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/curriculumView.vue b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/curriculumView.vue
new file mode 100644
index 0000000..fb3ea33
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/curriculumView.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/experienceView.vue b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/experienceView.vue
new file mode 100644
index 0000000..70ff130
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/components/experienceView.vue
@@ -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="鎮ㄧ殑璁㈠崟姝e湪閰嶉�侀�斾腑"></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>
diff --git a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue
index 054ed39..9ba2d43 100644
--- a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetail/flexJobDetail.vue
+++ b/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;
diff --git a/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue b/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
new file mode 100644
index 0000000..db091ef
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue b/apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue
new file mode 100644
index 0000000..1b76904
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
new file mode 100644
index 0000000..b30a8be
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.config.ts b/apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.vue b/apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.vue
new file mode 100644
index 0000000..fa06647
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskCheck/taskCheck.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
new file mode 100644
index 0000000..d149ccc
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.config.ts b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.vue b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.vue
new file mode 100644
index 0000000..3d08fd1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/taskCheckDetail.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
new file mode 100644
index 0000000..289d0a5
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.config.ts b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.vue b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.vue
new file mode 100644
index 0000000..9e7019b
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
new file mode 100644
index 0000000..9913fbf
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
@@ -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>
diff --git a/apps/bMiniApp/src/subpackages/task/taskManage/taskManage.config.ts b/apps/bMiniApp/src/subpackages/task/taskManage/taskManage.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskManage/taskManage.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/task/taskManage/taskManage.vue b/apps/bMiniApp/src/subpackages/task/taskManage/taskManage.vue
new file mode 100644
index 0000000..5b9ad6e
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskManage/taskManage.vue
@@ -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>
diff --git a/packages/components/src/Card/FlexJobTopView.vue b/packages/components/src/Card/FlexJobTopView.vue
index 4f938b6..63a0ef0 100644
--- a/packages/components/src/Card/FlexJobTopView.vue
+++ b/packages/components/src/Card/FlexJobTopView.vue
@@ -10,7 +10,9 @@
         </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>
@@ -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;
       }
     }
 
diff --git a/packages/components/src/Card/MyTaskCard.vue b/packages/components/src/Card/MyTaskCard.vue
index ecd1447..9921ce4 100644
--- a/packages/components/src/Card/MyTaskCard.vue
+++ b/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>
 
diff --git a/packages/utils/common.ts b/packages/utils/common.ts
index e6344d5..c36c689 100644
--- a/packages/utils/common.ts
+++ b/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******');

--
Gitblit v1.9.1