From 1bbd7061dac79cacf5513234a04cac8ba0be5c6f Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期五, 21 三月 2025 09:15:36 +0800
Subject: [PATCH] feat: 接口对接

---
 packages/components/src/AreaTreeSelect/PositionSelectView.vue                         |   26 +-
 packages/constants/index.ts                                                           |    1 
 packages/constants/task.ts                                                            |   52 ++++
 apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue                           |    2 
 apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue                   |   91 ++++++-
 packages/components/src/Tag/JobTagList.vue                                            |   17 
 apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue            |    2 
 apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue                       |    5 
 packages/hooks/area.ts                                                                |   13 +
 apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue                          |    4 
 packages/services/api/index.ts                                                        |    2 
 apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue                 |   46 +++
 apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue                                    |   15 +
 apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue             |    2 
 apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue               |  110 ++++++++-
 apps/cMiniApp/project.private.config.json                                             |    7 
 apps/bMiniApp/tsconfig.json                                                           |    3 
 apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue            |   55 ++++
 packages/services/api/UserResume.ts                                                   |   16 +
 packages/components/src/AreaTreeSelect/CategoryPane.vue                               |    6 
 packages/services/api/FlexEnterpriseWoker.ts                                          |   54 ++++
 packages/services/api/typings.d.ts                                                    |  115 ++++++++++
 packages/utils/area.ts                                                                |   10 
 apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue               |    2 
 apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue |    2 
 apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue           |    2 
 26 files changed, 556 insertions(+), 104 deletions(-)

diff --git a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
index 2cc644d..d42c8da 100644
--- a/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/flexJob/flexJobDetailFromTask/InnerPage.vue
@@ -21,7 +21,7 @@
 import { useQuery } from '@tanstack/vue-query';
 import * as flexWorkerServices from '@12333/services/api/FlexWorker';
 import { Message } from '@12333/utils';
-import { FlexTaskWorkerHireEnum } from '@/constants/task';
+import { FlexTaskWorkerHireEnum } from '@12333/constants/task';
 
 defineOptions({
   name: 'InnerPage',
diff --git a/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
index b52155b..29401b3 100644
--- a/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/flexJobManage/flexJobManage/InnerPage.vue
@@ -43,7 +43,7 @@
 import { useInfiniteLoading } from '@12333/hooks';
 import { OrderInputType } from '@12333/constants';
 import * as flexWorkerServices from '@12333/services/api/FlexWorker';
-import { FlexWorkerEleSignEnum } from '@/constants/task';
+import { FlexWorkerEleSignEnum } from '@12333/constants/task';
 import Taro from '@tarojs/taro';
 
 defineOptions({
diff --git a/apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue b/apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue
index 9caeaae..6a0d095 100644
--- a/apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue
+++ b/apps/bMiniApp/src/subpackages/jobApplicationManage/components/JobDetail.vue
@@ -50,7 +50,7 @@
 import * as flexWorkerServices from '@12333/services/api/FlexWorker';
 import IconLocaltion from '@/assets/flexJob/icon-localtion.png';
 import { TaskPrice, TaskDetailWelfareItem } from '@12333/components';
-import { SalaryTimeTypeEnumUnit, FlexTaskSettleTypeEnumText } from '@/constants/task';
+import { SalaryTimeTypeEnumUnit, FlexTaskSettleTypeEnumText } from '@12333/constants/task';
 import dayjs from 'dayjs';
 import { setOSSLink } from '@12333/utils';
 import { RectRight } from '@nutui/icons-vue-taro';
diff --git a/apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue b/apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue
index 10c56b0..0bd03d2 100644
--- a/apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue
+++ b/apps/bMiniApp/src/subpackages/jobApplicationManage/components/SignList.vue
@@ -21,7 +21,7 @@
 <script setup lang="ts">
 import { OrderInputType } from '@12333/constants';
 import { RouterPath } from '@/constants';
-import { FlexTaskWorkerHireEnum } from '@/constants/task';
+import { FlexTaskWorkerHireEnum } from '@12333/constants/task';
 import { useInfiniteLoading } from '@12333/hooks';
 import * as flexWorkerServices from '@12333/services/api/FlexWorker';
 import { FlexJobCard } from '@12333/components';
diff --git a/apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue b/apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue
index 1340552..a29d411 100644
--- a/apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/jobApplicationManage/jobApplicationManage/InnerPage.vue
@@ -56,7 +56,7 @@
   FlexTaskReleaseStatusEnum,
   FlexTaskReleaseStatusEnumText,
   SalaryTimeTypeEnumUnit,
-} from '@/constants/task';
+} from '@12333/constants/task';
 import * as flexWorkerServices from '@12333/services/api/FlexWorker';
 import Taro from '@tarojs/taro';
 import { Message } from '@12333/utils';
diff --git a/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue b/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
index d95e866..5334987 100644
--- a/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
+++ b/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
@@ -26,7 +26,10 @@
 <script setup lang="ts">
 import TaskCheckPersonalView from './TaskCheckPersonalView.vue';
 import { Colors, Gender } from '@12333/constants';
-import { FlexTaskCheckAcceptStatusEnum, FlexTaskCheckAcceptStatusEnumText } from '@/constants/task';
+import {
+  FlexTaskCheckAcceptStatusEnum,
+  FlexTaskCheckAcceptStatusEnumText,
+} from '@12333/constants/task';
 
 defineOptions({
   name: 'TaskCheckCard',
diff --git a/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue
index 738ce69..269f389 100644
--- a/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue
@@ -122,14 +122,14 @@
 </template>
 
 <script setup lang="ts">
+import { useUser } from '@/hooks';
 import {
   FlexTaskSettleTypeEnum,
   FlexTaskSettleTypeEnumText,
   FlexTaskFeeTypeEnum,
   FlexTaskFeeTypeEnumText,
   SalaryTimeTypeEnumUnit,
-} from '@/constants/task';
-import { useUser } from '@/hooks';
+} from '@12333/constants';
 import {
   ChooseInputWithPicker,
   ChooseInputWithDatePicker,
diff --git a/apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
index 9c049a0..dd4535c 100644
--- a/apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/taskManage/InnerPage.vue
@@ -52,7 +52,7 @@
 import { useInfiniteLoading } from '@12333/hooks';
 import { OrderInputType, Colors } from '@12333/constants';
 import * as flexWorkerServices from '@12333/services/api/FlexWorker';
-import { SalaryTimeTypeEnumUnit } from '@/constants/task';
+import { SalaryTimeTypeEnumUnit } from '@12333/constants/task';
 
 defineOptions({
   name: 'InnerPage',
diff --git a/apps/bMiniApp/tsconfig.json b/apps/bMiniApp/tsconfig.json
index 231b16a..dfb771d 100644
--- a/apps/bMiniApp/tsconfig.json
+++ b/apps/bMiniApp/tsconfig.json
@@ -21,7 +21,8 @@
     "./types/**/*.d.ts",
     "./components.d.ts",
     "./auto-imports.d.ts",
-    "../../types/api.d.ts"
+    "../../types/api.d.ts",
+    "../../packages/constants/task.ts"
   ],
   "exclude": ["node_modules", "dist"],
   "references": [
diff --git a/apps/cMiniApp/project.private.config.json b/apps/cMiniApp/project.private.config.json
index 73439be..9961598 100644
--- a/apps/cMiniApp/project.private.config.json
+++ b/apps/cMiniApp/project.private.config.json
@@ -56,13 +56,6 @@
                     "query": "",
                     "launchMode": "default",
                     "scene": null
-                },
-                {
-                    "name": "",
-                    "pathName": "subpackages/mine/mineCertificateAddOrEdit/mineCertificateAddOrEdit",
-                    "query": "",
-                    "launchMode": "default",
-                    "scene": null
                 }
             ]
         }
diff --git a/apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue b/apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue
index 26a6979..20ce0a2 100644
--- a/apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue
+++ b/apps/cMiniApp/src/pages/home/HomeQueryMenuView.vue
@@ -2,10 +2,14 @@
   <QueryMenuView @close="handleReset" @confirm="emit('close')" cancelText="閲嶇疆">
     <div class="home-query-menu-view">
       <QueryMenuItem title="缁撶畻鏂瑰紡">
-        <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
+        <ProRadio
+          v-model="query.gender"
+          :value-enum="FlexTaskSettleTypeEnumText"
+          show-all-btn
+        ></ProRadio>
       </QueryMenuItem>
       <QueryMenuItem title="鍛樺伐绂忓埄">
-        <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
+        <ProRadio v-model="query.gender" :value-enum="WelfareList" show-all-btn></ProRadio>
       </QueryMenuItem>
       <QueryMenuItem title="鎬у埆瑕佹眰">
         <ProRadio v-model="query.gender" :value-enum="GenderText" show-all-btn></ProRadio>
@@ -16,7 +20,8 @@
 
 <script setup lang="ts">
 import { QueryMenuView, QueryMenuItem, ProRadio } from '@12333/components';
-import { GenderText } from '@12333/constants';
+import { GenderText, SearchType, FlexTaskSettleTypeEnumText } from '@12333/constants';
+import { useSearchSettingType } from '@12333/hooks';
 
 defineOptions({
   name: 'HomeQueryMenuView',
@@ -26,6 +31,10 @@
 
 // const props = withDefaults(defineProps<Props>(), {});
 
+const { searchSettingTypeList: WelfareList } = useSearchSettingType({
+  searchType: SearchType.Welfare,
+});
+
 const emit = defineEmits<{
   (e: 'reset'): void;
   (e: 'close'): void;
diff --git a/apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
index cfccdcb..9bf9b84 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -7,8 +7,8 @@
       <nut-form-item label="濮撳悕:" class="bole-form-item" prop="name">
         <nut-input v-model.trim="form.name" placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" />
       </nut-form-item>
-      <nut-form-item label="鎵嬫満鍙�:" class="bole-form-item" prop="phone" required>
-        <nut-input v-model.trim="form.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" type="text" />
+      <nut-form-item label="鎵嬫満鍙�:" class="bole-form-item" prop="phoneNumber" required>
+        <nut-input v-model.trim="form.phoneNumber" placeholder="璇疯緭鍏ユ墜鏈哄彿" type="text" />
       </nut-form-item>
       <nut-form-item label="韬唤:" class="bole-form-item" prop="socialIdentity">
         <ChooseInputWithPicker
@@ -24,12 +24,12 @@
           :value-enum="EducationTypeList"
         />
       </nut-form-item>
-      <nut-form-item label="甯搁┗鍩庡競:" class="bole-form-item" prop="gender">
-        <ChooseInputWithPicker
-          v-model="form.gender"
+      <nut-form-item label="甯搁┗鍩庡競:" class="bole-form-item" prop="areaList">
+        <ChooseInputWithAreaPicker
+          :columns="cityAreaTree"
+          v-model="form.areaList"
           placeholder="璇烽�夋嫨甯搁┗鍩庡競"
-          :value-enum="TaskStatusText"
-        />
+        ></ChooseInputWithAreaPicker>
       </nut-form-item>
     </nut-form>
   </ContentScrollView>
@@ -40,12 +40,14 @@
 
 <script setup lang="ts">
 import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
-import { ChooseInputWithPicker } from '@12333/components';
-import { TaskStatusText, TaskStatus } from '@/constants';
-import { convertApi2FormUrlOnlyOne } from '@12333/utils';
-import { useUser } from '@/hooks';
-import { useSearchSettingType } from '@12333/hooks';
-import { SearchType } from '@12333/constants';
+import { ChooseInputWithPicker, ChooseInputWithAreaPicker } from '@12333/components';
+import { TaskStatusText } from '@/constants';
+import { convertApi2FormUrlOnlyOne, Message, setOSSLink } from '@12333/utils';
+import { useAllAreaList, useArea, useSearchSettingType } from '@12333/hooks';
+import { Gender, SearchType } from '@12333/constants';
+import * as userResumeServices from '@12333/services/api/userResume';
+import Taro from '@tarojs/taro';
+import { useQuery } from '@tanstack/vue-query';
 
 defineOptions({
   name: 'InnerPage',
@@ -58,18 +60,44 @@
   searchType: SearchType.Identity,
 });
 
+const { findAreaNameFromCode, cityAreaTree } = useAllAreaList();
+
 const form = reactive({
-  // avatarUrl: convertApi2FormUrlOnlyOne(userDetail.value?.originalAvatarUrl),
+  avatarUrl: [],
   name: '',
-  phone: '',
-  gender: TaskStatus.All,
+  phoneNumber: '',
+  gender: Gender.Male,
   socialIdentity: '',
   educationalLevel: '',
   areaList: [] as number[],
 });
 
+const {
+  isLoading,
+  isError,
+  data: detail,
+  refetch,
+} = useQuery({
+  queryKey: ['userResumeServices/getUserResumeBaseInfo'],
+  queryFn: async () => {
+    return await userResumeServices.getUserResumeBaseInfo({
+      showLoading: false,
+    });
+  },
+  placeholderData: () => ({} as API.UserResumeBaseInfoOutput),
+  onSuccess(data) {
+    form.avatarUrl = convertApi2FormUrlOnlyOne(setOSSLink(data.avatarUrl));
+    form.name = data.name;
+    form.phoneNumber = data.phoneNumber;
+    form.gender = data.genderType;
+    form.socialIdentity = data.socialIdentity;
+    form.educationalLevel = data.educationalLevel;
+    form.areaList = [data.residentProvinceCode, data.residentCityCode];
+  },
+});
+
 const rules = reactive<FormRules>({
-  phone: [{ required: true, message: '璇疯緭鍏ユ墜鏈哄彿' }],
+  phoneNumber: [{ required: true, message: '璇疯緭鍏ユ墜鏈哄彿' }],
   socialIdentity: [{ required: true, message: '璇烽�夋嫨韬唤' }],
   educationalLevel: [{ required: true, message: '璇烽�夋嫨瀛﹀巻' }],
   areaList: [{ required: true, message: '璇烽�夋嫨甯搁┗鍩庡競' }],
@@ -84,7 +112,34 @@
   });
 }
 
-function confirm() {}
+async function confirm() {
+  try {
+    let params: API.SaveUserResumeBaseInfoInput = {
+      name: form.name,
+      avatarUrl: form.avatarUrl[0]?.path,
+      phoneNumber: form.phoneNumber,
+      educationalLevel: form.educationalLevel,
+      socialIdentity: form.socialIdentity,
+      residentProvinceCode: form.areaList[0],
+      residentProvinceName: findAreaNameFromCode(form.areaList[0]),
+      residentCityCode: form.areaList[1],
+      residentCityName: findAreaNameFromCode(form.areaList[1]),
+    };
+    let res = await userResumeServices.saveUserResumeBaseInfo(params);
+    if (res) {
+      Message.success('淇濆瓨鎴愬姛', {
+        onClosed() {
+          Taro.navigateTo({
+            url: `${RouterPath.mineCurriculumVitae}`,
+            success: function (res) {
+              res.eventChannel.emit('updateResume', { content: true });
+            },
+          });
+        },
+      });
+    }
+  } catch (error) {}
+}
 </script>
 
 <style lang="scss">
diff --git a/apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue
index ca2afc3..71a124b 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/expectPosition/InnerPage.vue
@@ -4,29 +4,65 @@
   </ContentView>
   <PageFooter>
     <div class="expect-position-page-footer">
-      <div class="expect-position-select-wrapper" v-if="positionList.length > 0">
-        <div class="expect-position-select-item" v-for="(item, index) in positionList" :key="index">
-          <div class="expect-position-select-item-text">{{ item }}</div>
+      <div class="expect-position-select-wrapper" v-if="checkdList.length > 0">
+        <div class="expect-position-select-item" v-for="(item, index) in checkdList" :key="index">
+          <div class="expect-position-select-item-text">{{ item.name }}</div>
           <div class="expect-position-select-item-icon-wrapper">
-            <Close :size="8" class="expect-position-select-item-icon" />
+            <Close
+              :size="8"
+              class="expect-position-select-item-icon"
+              @click="handleDelete(item.id)"
+            />
           </div>
         </div>
       </div>
-      <PageFooterBtn type="primary">淇濆瓨</PageFooterBtn>
+      <PageFooterBtn type="primary" @click="handleConfirm">淇濆瓨</PageFooterBtn>
     </div>
   </PageFooter>
 </template>
 
 <script setup lang="ts">
 import { PositionSelectView } from '@12333/components';
+import { SearchType } from '@12333/constants';
+import { useSearchSettingType } from '@12333/hooks';
 import { Close } from '@nutui/icons-vue-taro';
+import Taro from '@tarojs/taro';
 import { size } from 'lodash';
+import { useEvent, useEventChannel } from 'senin-mini/hooks';
 
 defineOptions({
   name: 'InnerPage',
 });
 
+const eventChannel = useEventChannel();
+
+useEvent('updatePosition', function (data: { content: string[] }) {
+  if (data.content.length) {
+    positionList.value = [...data.content];
+  }
+});
+
 const positionList = ref([]);
+
+const { searchSettingTypeList: position } = useSearchSettingType({
+  searchType: SearchType.Position,
+});
+
+const checkdList = computed(() => {
+  if (!positionList.value.length) return [];
+  return position.value.filter((x) => positionList.value.includes(x.id));
+});
+
+function handleDelete(id: string) {
+  positionList.value = positionList.value.filter((x) => x !== id);
+}
+
+function handleConfirm() {
+  eventChannel.emit('addPosition', {
+    content: positionList.value,
+  });
+  Taro.navigateBack({ delta: 1 });
+}
 </script>
 
 <style lang="scss">
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
index 77d25d5..c8b000e 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineCurriculumVitae/InnerPage.vue
@@ -8,16 +8,24 @@
       class="mine-curriculum-noticebar"
     />
     <div class="mine-curriculum-info-wrapper">
-      <UserAvatar :size="60" class="mine-curriculum-avatar" />
+      <Avatar
+        :size="60"
+        class="mine-curriculum-avatar"
+        :src="setOSSLink(detail?.resumeBaseInfo?.avatarUrl ?? '')"
+      ></Avatar>
       <div class="mine-curriculum-info-content">
         <div class="mine-curriculum-info-item">
           <div class="mine-curriculum-info-item-left">
             <div class="mine-curriculum-info-item-name">
-              {{ userStore.userDetail?.userName ?? '' }}
+              {{ detail?.resumeBaseInfo?.name ?? '' }}
             </div>
             <div class="mine-curriculum-info-item-gender">
               <div class="mine-curriculum-info-item-gender-dot">路</div>
-              <img v-if="1" :src="IconMale" class="mine-curriculum-info-item-gender-icon" />
+              <img
+                v-if="detail?.resumeBaseInfo?.genderType === Gender.Male"
+                :src="IconMale"
+                class="mine-curriculum-info-item-gender-icon"
+              />
               <img v-else :src="IconFemale" class="mine-curriculum-info-item-gender-icon" />
             </div>
           </div>
@@ -27,11 +35,13 @@
           <div class="mine-curriculum-info-item-left">
             <img :src="IconPhone" class="mine-curriculum-info-item-phone-icon" />
             <div class="mine-curriculum-info-item-phone">
-              {{ userStore.userDetail?.phoneNumber ?? '' }}
+              {{ detail?.resumeBaseInfo?.phoneNumber ?? '' }}
             </div>
           </div>
           <div class="mine-curriculum-info-item-detail">
-            {{ '26宀� | 闈炲鐢� | 鏈' }}
+            {{
+              `${detail?.resumeBaseInfo?.age}宀� | ${detail?.resumeBaseInfo?.socialIdentityName} | ${detail?.resumeBaseInfo?.educationalLevelName}`
+            }}
           </div>
         </div>
       </div>
@@ -47,17 +57,23 @@
         </div>
         <MineAgreementSignDetailItem label="鏈熸湜宀椾綅" class="mine-curriculum-intention-job">
           <template #detail>
-            <JobTagList />
+            <JobTagList :jobTagList="jobTag" />
           </template>
         </MineAgreementSignDetailItem>
         <MineAgreementSignDetailItem label="绌洪棽鏃堕棿">
           <template #detail>
-            <div class="mine-curriculum-intention-bold">涓嶉檺</div>
+            <div class="mine-curriculum-intention-bold">
+              {{ UserResumeFreeTimeEnumText[detail?.resumeExpectationJob?.freeTime] }}
+            </div>
           </template>
         </MineAgreementSignDetailItem>
         <MineAgreementSignDetailItem label="姹傝亴鐘舵��">
           <template #detail>
-            <div class="mine-curriculum-intention-bold">绉瀬鎵惧伐浣�</div>
+            <div class="mine-curriculum-intention-bold">
+              {{
+                UserResumeJobSeekingStatusEnumText[detail?.resumeExpectationJob?.jobSeekingStatus]
+              }}
+            </div>
           </template>
         </MineAgreementSignDetailItem>
       </div>
@@ -89,7 +105,12 @@
 import { useUserStore } from '@/stores/modules/user';
 import { useIsLogin } from '@/hooks';
 import MineAgreementSignDetailItem from '../../mine/mineAgreementSignDetail/MineAgreementSignDetailItem.vue';
-import { List, ListItem, JobTagList } from '@12333/components';
+import { List, ListItem, JobTagList, Avatar } from '@12333/components';
+import {
+  Gender,
+  UserResumeFreeTimeEnumText,
+  UserResumeJobSeekingStatusEnumText,
+} from '@12333/constants';
 import { RouterPath } from '@/constants';
 import * as userResumeServices from '@12333/services/api/userResume';
 import IconArrow from '@/assets/setting/icon-arrow.png';
@@ -99,6 +120,8 @@
 import IconPhone from '@/assets/mine/icon-phone.png';
 import Taro from '@tarojs/taro';
 import { useQuery } from '@tanstack/vue-query';
+import { setOSSLink } from '@12333/utils';
+import { useEvent, useEventChannel } from 'senin-mini/hooks';
 
 defineOptions({
   name: 'InnerPage',
@@ -110,6 +133,20 @@
 
 const taskId = router.params?.taskId;
 
+const eventChannel = useEventChannel();
+
+useEvent('updateResume', function (data: { content: boolean }) {
+  if (data.content) {
+    refetch({
+      type: 'inactive',
+    });
+  }
+});
+
+const jobTag = computed(
+  () => detail?.value?.resumeExpectationJob?.jobIdList?.map((x) => x.name) ?? []
+);
+
 const {
   isLoading,
   isError,
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
index d123c03..d40cd5c 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
@@ -1,28 +1,23 @@
 <template>
   <ContentScrollView :paddingH="false">
     <nut-form :model-value="form" ref="formRef" :rules="rules">
-      <nut-form-item label="鏈熸湜宀椾綅:" class="bole-form-item" prop="job" label-position="top">
-        <!-- <ChooseInputWithPicker
-          v-model="form.job"
-          placeholder="璇烽�夋嫨鏈熸湜宀椾綅"
-          :value-enum="TaskStatusText"
-        /> -->
+      <nut-form-item label="鏈熸湜宀椾綅:" class="bole-form-item" prop="jobIdList" label-position="top">
         <CommonInputField class="job-common-input-field" @click="goExpectPosition">
-          <JobTagList />
+          <JobTagList :jobTagList="jobTagList" />
         </CommonInputField>
       </nut-form-item>
-      <nut-form-item label="绌洪棽鏃堕棿:" class="bole-form-item" prop="job">
+      <nut-form-item label="绌洪棽鏃堕棿:" class="bole-form-item" prop="freeTime">
         <ChooseInputWithPicker
-          v-model="form.job"
+          v-model="form.freeTime"
           placeholder="璇烽�夋嫨绌洪棽鏃堕棿"
-          :value-enum="TaskStatusText"
+          :value-enum="UserResumeFreeTimeEnumText"
         />
       </nut-form-item>
-      <nut-form-item label="姹傝亴鐘舵��:" class="bole-form-item" prop="job">
+      <nut-form-item label="姹傝亴鐘舵��:" class="bole-form-item" prop="jobSeekingStatus">
         <ChooseInputWithPicker
-          v-model="form.job"
+          v-model="form.jobSeekingStatus"
           placeholder="璇烽�夋嫨姹傝亴鐘舵��"
-          :value-enum="TaskStatusText"
+          :value-enum="UserResumeJobSeekingStatusEnumText"
         />
       </nut-form-item>
     </nut-form>
@@ -35,22 +30,70 @@
 <script setup lang="ts">
 import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
 import { ChooseInputWithPicker, JobTagList, CommonInputField } from '@12333/components';
-import { TaskStatusText, TaskStatus } from '@/constants';
-import { useUser } from '@/hooks';
+import {
+  UserResumeFreeTimeEnumText,
+  UserResumeJobSeekingStatusEnumText,
+  UserResumeFreeTimeEnum,
+  UserResumeJobSeekingStatusEnum,
+  SearchType,
+} from '@12333/constants';
 import Taro from '@tarojs/taro';
+import * as userResumeServices from '@12333/services/api/userResume';
+import { useSearchSettingType } from '@12333/hooks';
+import { Message } from '@12333/utils';
+import { goBack } from '@/utils';
+import { useQuery } from '@tanstack/vue-query';
 
 defineOptions({
   name: 'InnerPage',
 });
 
-const { userDetail } = useUser();
+const { searchSettingTypeList: positionList } = useSearchSettingType({
+  searchType: SearchType.Position,
+});
+
+const jobTagList = computed(() => {
+  return positionList.value?.filter((x) => form.jobIdList.includes(x.id)).map((x) => x.name) || [];
+});
 
 const form = reactive({
-  job: TaskStatus.All,
+  jobIdList: [] as string[],
+  freeTime: UserResumeFreeTimeEnum.NoLimit,
+  jobSeekingStatus: UserResumeJobSeekingStatusEnum.Activing,
+});
+
+const {
+  isLoading,
+  isError,
+  data: detail,
+  refetch,
+} = useQuery({
+  queryKey: ['userResumeServices/getResumeExpectationJob'],
+  queryFn: async () => {
+    return await userResumeServices.getResumeExpectationJob({
+      showLoading: false,
+    });
+  },
+  placeholderData: () => ({} as API.UserResumeExpectationJobOutput),
+  onSuccess(data) {
+    form.jobIdList = data.jobIdList.map((x) => x.id);
+    form.freeTime = data.freeTime;
+    form.jobSeekingStatus = data.jobSeekingStatus;
+  },
 });
 
 const rules = reactive<FormRules>({
-  job: [{ required: true, message: '璇烽�夋嫨' }],
+  jobIdList: [
+    {
+      required: true,
+      validator() {
+        if (form.jobIdList.length) return Promise.resolve(true);
+        return Promise.reject('璇烽�夋嫨鏈熸湜宀椾綅');
+      },
+    },
+  ],
+  freeTime: [{ required: true, message: '璇烽�夋嫨绌洪棽鏃堕棿' }],
+  jobSeekingStatus: [{ required: true, message: '璇烽�夋嫨姹傝亴鐘舵��' }],
 });
 const formRef = ref<any>(null);
 function handleConfirm() {
@@ -62,11 +105,40 @@
   });
 }
 
-function confirm() {}
+async function confirm() {
+  try {
+    let params: API.SaveUserResumeExpectationJobInput = {
+      jobIdList: form.jobIdList,
+      freeTime: form.freeTime,
+      jobSeekingStatus: form.jobSeekingStatus,
+    };
+    let res = await userResumeServices.saveUserResumeExpectationJob(params);
+    if (res) {
+      Message.success('淇濆瓨鎴愬姛', {
+        onClosed() {
+          Taro.navigateTo({
+            url: `${RouterPath.mineCurriculumVitae}`,
+            success: function (res) {
+              res.eventChannel.emit('updateResume', { content: true });
+            },
+          });
+        },
+      });
+    }
+  } catch (error) {}
+}
 
 function goExpectPosition() {
   Taro.navigateTo({
     url: `${RouterPath.expectPosition}`,
+    events: {
+      addPosition: function (data: { content: string[] }) {
+        form.jobIdList = data.content?.length ? data.content : [];
+      },
+    },
+    success: function (res) {
+      res.eventChannel.emit('updatePosition', { content: form.jobIdList });
+    },
   });
 }
 </script>
diff --git a/packages/components/src/AreaTreeSelect/CategoryPane.vue b/packages/components/src/AreaTreeSelect/CategoryPane.vue
index e9862ab..11aee8c 100644
--- a/packages/components/src/AreaTreeSelect/CategoryPane.vue
+++ b/packages/components/src/AreaTreeSelect/CategoryPane.vue
@@ -3,10 +3,10 @@
     <div class="nut-category-pane__cateListRight">
       <div v-for="(item, index) in categoryChild" :key="index">
         <div class="nut-category-pane__childItemList">
-          <div class="bole-category-pane__childItem" @click="onChange(item.value)">
+          <div class="bole-category-pane__childItem" @click="onChange(item.id)">
             <div
               class="bole-category-pane-item-wrapper"
-              :class="{ active: modelValue.includes(item.value) }"
+              :class="{ active: modelValue.includes(item.id) }"
             >
               <div class="bole-category-pane-item-name">{{ item.name }}</div>
               <Check :size="16" class="bole-category-pane-item-icon" />
@@ -29,7 +29,7 @@
 
 type ChildType = {
   name?: string;
-  value?: string | number;
+  id?: string | number;
   [key: string]: any;
 };
 
diff --git a/packages/components/src/AreaTreeSelect/PositionSelectView.vue b/packages/components/src/AreaTreeSelect/PositionSelectView.vue
index 048754e..86ba1cc 100644
--- a/packages/components/src/AreaTreeSelect/PositionSelectView.vue
+++ b/packages/components/src/AreaTreeSelect/PositionSelectView.vue
@@ -1,15 +1,16 @@
 <template>
-  <Category :category="provinceList" @change="change" class="position-select-view">
+  <Category :category="industryList" @change="change" class="position-select-view">
     <CategoryPane :max="max" :categoryChild="categoryChild" :multiple="multiple" v-model="model">
     </CategoryPane>
   </Category>
 </template>
 
 <script setup lang="ts">
-import { useAllAreaList } from '@12333/hooks';
+import { useAllSearchSettingList, useSearchSettingType } from '@12333/hooks';
 import Category from './Category.vue';
 import CategoryPane from './CategoryPane.vue';
 import { reactive, computed, watch } from 'vue';
+import { SearchType } from '@12333/constants';
 
 defineOptions({
   name: 'PositionSelectView',
@@ -24,25 +25,26 @@
   multiple: true,
 });
 
-const model = defineModel<number[]>();
+const model = defineModel<string[]>();
 
 const state = reactive({
   provinceIndex: 0,
 });
 
-const { areaTreeList } = useAllAreaList();
-
-const provinceList = computed(() => areaTreeList.value.map((x) => ({ ...x, name: x.areaName })));
+const { allSearchSettingList: positionList } = useAllSearchSettingList({
+  searchType: SearchType.Position,
+});
+const { searchSettingTypeList: industryList } = useSearchSettingType({
+  searchType: SearchType.IndustryCategory,
+});
 
 const categoryChild = computed(() => {
-  if (!provinceList.value.length) {
+  if (!industryList.value.length) {
     return [];
   }
-  return provinceList.value[state.provinceIndex].children.map((x) => ({
-    ...x,
-    name: x.areaName,
-    value: x.areaCode,
-  }));
+  return positionList.value?.filter(
+    (x) => x.parentName === industryList.value[state.provinceIndex].name
+  );
 });
 
 const change = (index: number) => {
diff --git a/packages/components/src/Tag/JobTagList.vue b/packages/components/src/Tag/JobTagList.vue
index c962b4c..dc51ea1 100644
--- a/packages/components/src/Tag/JobTagList.vue
+++ b/packages/components/src/Tag/JobTagList.vue
@@ -1,13 +1,8 @@
 <template>
   <div class="mine-curriculum-intention-job-content">
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
-    <div class="mine-curriculum-intention-job-item">瀹㈡埧鏈嶅姟鍛�</div>
+    <div v-for="item in jobTagList" :key="item" class="mine-curriculum-intention-job-item">
+      {{ item }}
+    </div>
   </div>
 </template>
 
@@ -16,9 +11,11 @@
   name: 'JobTagList',
 });
 
-// type Props = {};
+type Props = {
+  jobTagList?: string[];
+};
 
-// const props = withDefaults(defineProps<Props>(), {});
+const props = withDefaults(defineProps<Props>(), {});
 </script>
 
 <style lang="scss">
diff --git a/packages/constants/index.ts b/packages/constants/index.ts
index 6d4bb41..4ba4a42 100644
--- a/packages/constants/index.ts
+++ b/packages/constants/index.ts
@@ -11,3 +11,4 @@
 export * from './oss';
 export * from './authenticationV2';
 export * from './parkOrHR';
+export * from './task';
diff --git a/apps/bMiniApp/src/constants/task.ts b/packages/constants/task.ts
similarity index 73%
rename from apps/bMiniApp/src/constants/task.ts
rename to packages/constants/task.ts
index 16d939b..742c086 100644
--- a/apps/bMiniApp/src/constants/task.ts
+++ b/packages/constants/task.ts
@@ -150,3 +150,55 @@
   [FlexWorkerEleSignEnum.HasSign]: '宸茬绾�',
   [FlexWorkerEleSignEnum.CancelSign]: '宸茶В绾�',
 };
+
+export enum UserResumeFreeTimeEnum {
+  /**
+   * 涓嶉檺
+   */
+  NoLimit = 1,
+  /**
+   * 瀵掓殤鍋�
+   */
+  WinterAndSummerVacation = 2,
+  /**
+   * 鑺傚亣鏃�
+   */
+  Holiday = 3,
+  /**
+   * 鍛ㄥ叚鏃�
+   */
+  Weekend = 4,
+  /**
+   * 宸ヤ綔鏃�
+   */
+  Weekday = 5,
+}
+
+export const UserResumeFreeTimeEnumText = {
+  [UserResumeFreeTimeEnum.NoLimit]: '涓嶉檺',
+  [UserResumeFreeTimeEnum.WinterAndSummerVacation]: '瀵掓殤鍋�',
+  [UserResumeFreeTimeEnum.Holiday]: '鑺傚亣鏃�',
+  [UserResumeFreeTimeEnum.Weekend]: '鍛ㄥ叚鏃�',
+  [UserResumeFreeTimeEnum.Weekday]: '宸ヤ綔鏃�',
+};
+
+export enum UserResumeJobSeekingStatusEnum {
+  /**
+   * 绉瀬鎵惧伐浣�
+   */
+  Activing = 1,
+  /**
+   * 闅忎究鐪嬬湅
+   */
+  JustLook = 2,
+  /**
+   * 鏆傛椂涓嶆壘宸ヤ綔
+   */
+  NotLook = 3,
+}
+
+export const UserResumeJobSeekingStatusEnumText = {
+  [UserResumeJobSeekingStatusEnum.Activing]: '绉瀬鎵惧伐浣�',
+  [UserResumeJobSeekingStatusEnum.JustLook]: '闅忎究鐪嬬湅',
+  [UserResumeJobSeekingStatusEnum.NotLook]: '鏆傛椂涓嶆壘宸ヤ綔',
+};
diff --git a/packages/hooks/area.ts b/packages/hooks/area.ts
index 2f9220f..46668cf 100644
--- a/packages/hooks/area.ts
+++ b/packages/hooks/area.ts
@@ -63,7 +63,15 @@
   return {
     completeAreaList: computed(() => areaStore.value.completeAreaList),
     completeAreaTree: computed(() => areaStore.value.completeAreaTree),
-    // cityAreaTree: computed(() => areaStore.value.cityAreaTree),
+    cityAreaTree: computed(() =>
+      areaStore.value.completeAreaTree.map((x) => ({
+        ...x,
+        children: x.children.map((y) => ({
+          ...y,
+          children: undefined,
+        })),
+      }))
+    ),
     provinceList: computed(() => areaStore.value.provinceList),
     areaItemMap: computed(() => areaStore.value.areaItemMap),
     getAreaFromCompleteAreaList,
@@ -72,7 +80,7 @@
 }
 
 export function useAllAreaList() {
-  const { completeAreaTree, provinceList, completeAreaList } = useArea();
+  const { completeAreaTree, provinceList, completeAreaList, cityAreaTree } = useArea();
 
   const findAreaCodeFromName = (areaName: string) => {
     const areaItem = completeAreaList.value.find((x) => x.areaName === areaName);
@@ -95,6 +103,7 @@
     findAreaItemFromCode,
     areaTreeList: completeAreaTree,
     provinceList,
+    cityAreaTree,
   };
 }
 
diff --git a/packages/services/api/FlexEnterpriseWoker.ts b/packages/services/api/FlexEnterpriseWoker.ts
new file mode 100644
index 0000000..9bafeb5
--- /dev/null
+++ b/packages/services/api/FlexEnterpriseWoker.ts
@@ -0,0 +1,54 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** C绔汉鍛樼鐞嗗垪琛� POST /api/FlexEnterpriseWoker/GetUserClientList */
+export async function getUserClientList(
+  body: API.GetUserClientForBackInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetUserClientForBackOutputPageOutput>(
+    '/api/FlexEnterpriseWoker/GetUserClientList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** C绔汉鍛樼鐞�--绛剧害璇︽儏 POST /api/FlexEnterpriseWoker/GetUserClientSignList */
+export async function getUserClientSignList(
+  body: API.GetUserClientSignListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.UserClientSignListOutputPageOutput>(
+    '/api/FlexEnterpriseWoker/GetUserClientSignList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** C绔汉鍛樼鐞�--鑾峰彇浜哄憳璇︽儏 GET /api/FlexEnterpriseWoker/GetUserDetailForBack */
+export async function getUserDetailForBack(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetUserDetailForBackParams,
+  options?: API.RequestConfig
+) {
+  return request<API.GetUserDetailForBackOutput>('/api/FlexEnterpriseWoker/GetUserDetailForBack', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
diff --git a/packages/services/api/UserResume.ts b/packages/services/api/UserResume.ts
index 9b0735e..3ec42a4 100644
--- a/packages/services/api/UserResume.ts
+++ b/packages/services/api/UserResume.ts
@@ -2,6 +2,14 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
+/** 鏍规嵁鐢ㄦ埛鑾峰彇鏈熷緟鐨勫伐浣� GET /api/UserResume/GetResumeExpectationJob */
+export async function getResumeExpectationJob(options?: API.RequestConfig) {
+  return request<API.UserResumeExpectationJobOutput>('/api/UserResume/GetResumeExpectationJob', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
 /** 鏍规嵁鐢ㄦ埛鑾峰彇绠�鍘� GET /api/UserResume/GetUserResume */
 export async function getUserResume(options?: API.RequestConfig) {
   return request<API.MyResumeOutput>('/api/UserResume/GetUserResume', {
@@ -10,6 +18,14 @@
   });
 }
 
+/** 鏍规嵁鐢ㄦ埛鑾峰彇绠�鍘嗗熀纭�淇℃伅 GET /api/UserResume/GetUserResumeBaseInfo */
+export async function getUserResumeBaseInfo(options?: API.RequestConfig) {
+  return request<API.UserResumeBaseInfoOutput>('/api/UserResume/GetUserResumeBaseInfo', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
 /** 鏍规嵁璁よ瘉id鑾峰彇璁よ瘉璇︽儏 GET /api/UserResume/GetUserResumeCertificateDetailById */
 export async function getUserResumeCertificateDetailById(
   // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
diff --git a/packages/services/api/index.ts b/packages/services/api/index.ts
index a9c1745..ffe8d03 100644
--- a/packages/services/api/index.ts
+++ b/packages/services/api/index.ts
@@ -9,6 +9,7 @@
 import * as Common from './Common';
 import * as Features from './Features';
 import * as FlexEnterprise from './FlexEnterprise';
+import * as FlexEnterpriseWoker from './FlexEnterpriseWoker';
 import * as FlexTask from './FlexTask';
 import * as FlexWorker from './FlexWorker';
 import * as IdentityRole from './IdentityRole';
@@ -30,6 +31,7 @@
   Common,
   Features,
   FlexEnterprise,
+  FlexEnterpriseWoker,
   FlexTask,
   FlexWorker,
   IdentityRole,
diff --git a/packages/services/api/typings.d.ts b/packages/services/api/typings.d.ts
index 3b11f05..58ea6e5 100644
--- a/packages/services/api/typings.d.ts
+++ b/packages/services/api/typings.d.ts
@@ -242,6 +242,10 @@
     id: string;
   }
 
+  interface APIgetUserDetailForBackParams {
+    userId?: string;
+  }
+
   interface APIgetUserListByPhoneNumberParams {
     phoneNumber?: string;
     clientId?: string;
@@ -1197,6 +1201,77 @@
     belongType?: number;
   }
 
+  interface GetUserClientForBackInput {
+    pageModel?: Pagination;
+    /** 濮撳悕/鎵嬫満/韬唤璇佸彿/瀹㈡埛 */
+    searchKeys?: string;
+    /** 鏈�杩戝綍鐢ㄦ椂闂�--寮�濮� */
+    nearlyHireDateTimeBegin?: string;
+    /** 鏈�杩戝綍鐢ㄦ椂闂�--缁撴潫 */
+    nearlyHireDateTimeEnd?: string;
+    /** 鏈�杩戠绾︽椂闂�--寮�濮� */
+    nearlySignDateTimeBegin?: string;
+    /** 鏈�杩戠绾︽椂闂�--缁撴潫 */
+    nearlySignDateTimeEnd?: string;
+    /** 瀹炲悕鐘舵�� */
+    realVerifyStatus?: boolean;
+  }
+
+  interface GetUserClientForBackOutput {
+    userId?: string;
+    userResumeId?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 韬唤璇佸彿 */
+    idNumber?: string;
+    /** 鎵嬫満鍙� */
+    contactPhone?: string;
+    /** 骞撮緞 */
+    age?: number;
+    genderType?: GenderTypeEnum;
+    /** 甯搁┗鐪佷唤Code */
+    residentProvinceCode?: number;
+    /** 甯搁┗鍩庡競code */
+    residentCityCode?: number;
+    /** 甯搁┗鐪佷唤鍚嶇О */
+    residentProvinceName?: string;
+    /** 甯搁┗鍩庡競鍚嶇О */
+    residentCityName?: string;
+    /** 瀹炲悕鐘舵�� */
+    realVerifyStatus?: boolean;
+    /** 瀹炲悕鏃堕棿 */
+    realVerifyTime?: string;
+    nearlyWorkRecord?: NearlyFlexWorkerRecord;
+  }
+
+  interface GetUserClientForBackOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetUserClientForBackOutput[];
+  }
+
+  interface GetUserClientSignListInput {
+    pageModel?: Pagination;
+    userId?: string;
+  }
+
+  interface GetUserDetailForBackOutput {
+    userId?: string;
+    userResumeId?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 韬唤璇佸彿 */
+    idNumber?: string;
+    /** 鎵嬫満鍙� */
+    contactPhone?: string;
+    /** 骞撮緞 */
+    age?: number;
+    /** 韬唤璇佹闈� */
+    certificateFrontImgUrl?: string;
+    /** 韬唤璇佸弽闈� */
+    certificateBackImgUrl?: string;
+  }
+
   interface GetWorkerListForBackOutput {
     userId?: string;
     /** 濮撳悕 */
@@ -1537,6 +1612,16 @@
     value?: string;
   }
 
+  interface NearlyFlexWorkerRecord {
+    taskId?: string;
+    /** 鏈�杩戝綍鐢ㄦ椂闂� */
+    nearlyHireDateTime?: string;
+    /** 鏈�杩戠绾︽椂闂� */
+    nearlySignDateTime?: string;
+    /** 鎵�灞炲晢鎴� */
+    enterpirseName?: string;
+  }
+
   interface ObjectExtensionsDto {
     modules?: Record<string, any>;
     enums?: Record<string, any>;
@@ -1729,6 +1814,10 @@
     residentCityCode?: number;
     residentProvinceName?: string;
     residentCityName?: string;
+    /** 鑱旂郴鐢佃瘽 */
+    phoneNumber?: string;
+    /** 澶村儚 */
+    avatarUrl?: string;
   }
 
   interface SaveUserResumeCertificateInput {
@@ -1938,6 +2027,30 @@
     releaseStatus?: FlexTaskReleaseStatusEnum;
   }
 
+  interface UserClientSignListOutput {
+    /** 鎵�灞炲晢鎴� */
+    enterpirseName?: string;
+    /** 鎶ュ悕鏃堕棿 */
+    applyTime?: string;
+    enterSignStatus?: FlexWorkerEleSignEnum;
+    /** 浼佷笟绛剧害鏃堕棿 */
+    enterSignTime?: string;
+    hireStatus?: FlexTaskWorkerHireEnum;
+    /** 褰曠敤鏃堕棿 */
+    hireDateTime?: string;
+    userSignStatus?: FlexWorkerEleSignEnum;
+    /** 鐏靛伐绛剧害鏃堕棿 */
+    userSignTime?: string;
+    /** 鐢靛瓙鍚堝悓 */
+    contractUrl?: string;
+  }
+
+  interface UserClientSignListOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: UserClientSignListOutput[];
+  }
+
   interface UserData {
     id?: string;
     tenantId?: string;
@@ -2017,7 +2130,7 @@
     /** 绠�鍘嗚璇佽鎯匢d */
     id?: string;
     /** 鐢ㄦ埛绠�鍘咺d */
-    userResumeId?: string;
+    userId?: string;
     /** 璁よ瘉绫诲埆Id */
     certificateTypeId?: string;
     /** 璁よ瘉璇佷欢鍙烽粯璁よ韩浠借瘉 */
diff --git a/packages/utils/area.ts b/packages/utils/area.ts
index a0b323e..1732267 100644
--- a/packages/utils/area.ts
+++ b/packages/utils/area.ts
@@ -1,11 +1,11 @@
 import { AreaType } from '@12333/constants';
 
-export interface AreaTreeNode extends API.AreaInfo {
+export interface AreaTreeNode extends API.AreaDto {
   children?: AreaTreeNode[];
 }
 
 export function formatAreaListToTree(
-  areaDataList: API.AreaInfo[],
+  areaDataList: API.AreaDto[],
   parentId: number,
   maxLayer = AreaType.Area
 ) {
@@ -23,11 +23,11 @@
   return treeNodeList;
 }
 
-export function flattenAreaTree(tree: API.AreaInfo[]) {
-  let result = [] as API.AreaInfo[];
+export function flattenAreaTree(tree: API.AreaDto[]) {
+  let result = [] as API.AreaDto[];
 
   // 閫掑綊鍑芥暟锛岀敤浜庨亶鍘嗗瓙鑺傜偣
-  function flatten(node: API.AreaInfo) {
+  function flatten(node: API.AreaDto) {
     result.push(node);
 
     if (node.children && node.children.length > 0) {

--
Gitblit v1.9.1