From 10089fbb4958ff4780c33bf2e51ec6f04024e2b6 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期一, 11 八月 2025 15:55:23 +0800
Subject: [PATCH] feat: 接口对接

---
 apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue |  108 ++++++++++---
 apps/cMiniApp/src/pages/task/InnerPage.vue                                      |   57 ++----
 apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue         |    1 
 apps/cMiniApp/project.private.config.json                                       |    7 
 packages/services/apiV2/auth.ts                                                 |   63 ++++++-
 packages/hooks/task.ts                                                          |    4 
 apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue          |    9 +
 apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue                      |   13 
 apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue         |   39 ++--
 packages/services/apiV2/typings.d.ts                                            |   80 +++++++++
 apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue       |   28 ++-
 packages/constants/apiEnum.ts                                                   |   10 +
 apps/cMiniApp/src/pages/mine/index.vue                                          |   43 ++++
 13 files changed, 338 insertions(+), 124 deletions(-)

diff --git a/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
index 639db70..2010249 100644
--- a/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
@@ -1,7 +1,7 @@
 <template>
   <Calendar v-model="queryMenuState.time"></Calendar>
   <ProTabs
-    v-model="queryMenuState.status"
+    v-model="queryMenuState.checkReceiveStatus"
     name="task-tab"
     :showPaneContent="false"
     class="task-tabs"
@@ -9,14 +9,14 @@
     title-gutter="8"
     title-scroll
   >
-    <ProTabPane title="寰呮彁浜�" pane-key="10"></ProTabPane>
-    <ProTabPane title="寰呴獙鏀�" pane-key="10"></ProTabPane>
-    <ProTabPane title="宸查獙鏀�" pane-key="20"></ProTabPane>
+    <ProTabPane :title="`寰呮彁浜" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
+    <ProTabPane :title="`寰呴獙鏀禶" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
+    <ProTabPane :title="`宸查獙鏀禶" :pane-key="EnumTaskCheckReceiveStatus.Completed"></ProTabPane>
   </ProTabs>
   <InfiniteLoading
     scrollViewClassName="common-infinite-scroll-list"
     v-bind="infiniteLoadingProps"
-    :key="queryMenuState.status"
+    :key="queryMenuState.checkReceiveStatus"
   >
     <template #renderItem="{ item }">
       <MyTaskCard
@@ -33,6 +33,7 @@
 <script setup lang="ts">
 import { MyTaskCard, ProTabs, ProTabPane, Calendar } from '@12333/components';
 import Taro from '@tarojs/taro';
+import { EnumTaskCheckReceiveStatus } from '@12333/constants';
 import { useTaskList } from '@12333/hooks';
 
 defineOptions({
@@ -41,7 +42,7 @@
 
 const { queryMenuState, infiniteLoadingProps } = useTaskList({
   defaultQueryMenuState: {
-    status: EnumTaskStatus.Wait,
+    checkReceiveStatus: EnumTaskCheckReceiveStatus.Wait,
   },
 });
 
diff --git a/apps/cMiniApp/project.private.config.json b/apps/cMiniApp/project.private.config.json
index a17549d..ca80844 100644
--- a/apps/cMiniApp/project.private.config.json
+++ b/apps/cMiniApp/project.private.config.json
@@ -70,13 +70,6 @@
                     "query": "",
                     "launchMode": "default",
                     "scene": null
-                },
-                {
-                    "name": "",
-                    "pathName": "subpackages/curriculum/mineCertificate/mineCertificate",
-                    "query": "",
-                    "launchMode": "default",
-                    "scene": null
                 }
             ]
         }
diff --git a/apps/cMiniApp/src/pages/mine/index.vue b/apps/cMiniApp/src/pages/mine/index.vue
index 4bafb51..cb55be5 100644
--- a/apps/cMiniApp/src/pages/mine/index.vue
+++ b/apps/cMiniApp/src/pages/mine/index.vue
@@ -16,7 +16,7 @@
           <div class="mine-avatar-wrapper" @click="goLogin">
             <UserAvatar :size="52" class="mine-avatar" />
             <div class="user-info" v-if="isLogin">
-              <div class="user-info-item">{{ userDetail?.userName ?? '' }}</div>
+              <div class="user-info-item">{{ detail?.name ?? '' }}</div>
               <!-- <div class="user-info-auth">
                 <div class="user-info-auth-item">
                   <div class="user-info-unCertified" v-if="isCertified">
@@ -64,15 +64,30 @@
           <img :src="IconArrow" class="mine-order-list-title-icon" />
         </div>
         <div class="mine-order-list-content">
-          <nut-badge class="mine-order-list-item" top="8" :value="8" @click="goMineSign">
+          <nut-badge
+            class="mine-order-list-item"
+            top="8"
+            :value="detail?.taskCount ?? 0"
+            @click="goMineSign"
+          >
             <img :src="IconOrderSign" class="mine-order-list-icon" />
             <div class="mine-order-list-text">鎴戠殑鎶ュ悕</div>
           </nut-badge>
-          <nut-badge class="mine-order-list-item" top="8" :value="8" @click="goMineHire">
+          <nut-badge
+            class="mine-order-list-item"
+            top="8"
+            :value="detail?.hirePassTaskCount ?? 0"
+            @click="goMineHire"
+          >
             <img :src="IconOrderHire" class="mine-order-list-icon" />
             <div class="mine-order-list-text">宸插綍鐢�</div>
           </nut-badge>
-          <nut-badge class="mine-order-list-item" top="8" :value="8" @click="goMineCancel">
+          <nut-badge
+            class="mine-order-list-item"
+            top="8"
+            :value="detail?.hireRefuseTaskCount ?? 0"
+            @click="goMineCancel"
+          >
             <img :src="IconOrderCancel" class="mine-order-list-icon" />
             <div class="mine-order-list-text">宸插彇娑�</div>
           </nut-badge>
@@ -106,6 +121,8 @@
 import { useSystemStore } from '@/stores/modules/system';
 import PageLayoutWithBg from '@/components/Layout/PageLayoutWithBg.vue';
 import { toThousand } from '@12333/utils';
+import { useQuery } from '@tanstack/vue-query';
+import * as authServices from '@12333/services/apiV2/auth';
 
 const { userDetail, isCertified } = useUser();
 const isLogin = useIsLogin();
@@ -114,6 +131,24 @@
 const { goLoginFn } = useGoLogin();
 const bgHeight = computed(() => 133 + systemStore.navHeight);
 
+const {
+  isLoading,
+  isError,
+  data: detail,
+  refetch,
+} = useQuery({
+  queryKey: ['authServices/getPersonalLoginInfo'],
+  queryFn: async () => {
+    return await authServices.getPersonalLoginInfo(
+      {},
+      {
+        showLoading: false,
+      }
+    );
+  },
+  placeholderData: () => ({} as API.GetPersonalLoginInfoQueryResult),
+});
+
 function goLogin() {
   if (!isLogin.value) {
     goLoginFn();
diff --git a/apps/cMiniApp/src/pages/task/InnerPage.vue b/apps/cMiniApp/src/pages/task/InnerPage.vue
index 33a1569..7de494e 100644
--- a/apps/cMiniApp/src/pages/task/InnerPage.vue
+++ b/apps/cMiniApp/src/pages/task/InnerPage.vue
@@ -1,7 +1,7 @@
 <template>
-  <Calendar v-model="queryState.date"></Calendar>
+  <Calendar v-model="queryMenuState.time"></Calendar>
   <ProTabs
-    v-model="queryState.status"
+    v-model="queryMenuState.checkReceiveStatus"
     name="task-tab"
     :showPaneContent="false"
     class="task-tabs"
@@ -9,16 +9,23 @@
     title-gutter="8"
     title-scroll
   >
-    <ProTabPane :title="`寰呮彁浜" :pane-key="10"></ProTabPane>
-    <ProTabPane :title="`寰呴獙鏀禶" :pane-key="20"></ProTabPane>
+    <ProTabPane :title="`寰呮彁浜" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
+    <ProTabPane :title="`寰呴獙鏀禶" :pane-key="EnumTaskCheckReceiveStatus.Wait"></ProTabPane>
+    <ProTabPane :title="`宸查獙鏀禶" :pane-key="EnumTaskCheckReceiveStatus.Completed"></ProTabPane>
   </ProTabs>
   <InfiniteLoading
     scrollViewClassName="common-infinite-scroll-list task-list"
     v-bind="infiniteLoadingProps"
-    :key="queryState.status"
+    :key="queryMenuState.checkReceiveStatus"
   >
     <template #renderItem="{ item }">
-      <MyTaskCard @click="goSubmitTaskDetail(item)" />
+      <MyTaskCard
+        :name="item.name"
+        :addressName="item.addressName"
+        :begin-time="item.beginTime"
+        :end-time="item.endTime"
+        @click="goSubmitTaskDetail(item)"
+      />
     </template>
   </InfiniteLoading>
 </template>
@@ -26,44 +33,22 @@
 <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 flexWorkerServices from '@12333/services/api/FlexWorker';
+import { useTaskList } from '@12333/hooks';
+import { EnumTaskCheckReceiveStatus } from '@12333/constants';
 
 defineOptions({
   name: 'InnerPage',
 });
 
-const queryState = reactive({
-  status: 10,
-  date: new Date(),
+const { queryMenuState, infiniteLoadingProps } = useTaskList({
+  defaultQueryMenuState: {
+    checkReceiveStatus: EnumTaskCheckReceiveStatus.Wait,
+  },
 });
 
-const { infiniteLoadingProps } = useInfiniteLoading(
-  ({ pageParam }) => {
-    let params: API.GetFlexTaskListInput = {
-      pageModel: {
-        rows: 20,
-        page: pageParam,
-        orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }],
-      },
-    };
-
-    return flexWorkerServices.getFlexTaskByArrange(params, {
-      showLoading: false,
-    });
-  },
-  {
-    queryKey: ['flexWorkerServices/getFlexTaskByArrange', queryState],
-  }
-);
-
-function goSubmitTaskDetail(item: API.GetFlexTaskListOutput) {
-  //   Taro.navigateTo({
-  //     url: `${RouterPath.taskSubmitCheck}?id=${item.id}`,
-  //   });
+function goSubmitTaskDetail(item: API.GetTaskInfosQueryResultItem) {
   Taro.navigateTo({
-    url: `${RouterPath.taskCheckDetail}?id=${item.taskId}`,
+    url: `${RouterPath.taskCheckDetail}?id=${item.id}`,
   });
 }
 </script>
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue
index e659738..f546f29 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue
@@ -21,11 +21,20 @@
 import { RouterPath } from '@/constants';
 import * as userResumeServices from '@12333/services/apiV2/userResume';
 import { useQuery } from '@tanstack/vue-query';
+import { useEvent } from 'senin-mini/hooks';
 
 defineOptions({
   name: 'InnerPage',
 });
 
+useEvent('updateResume', function (data: { content: boolean }) {
+  if (data.content) {
+    refetch({
+      type: 'inactive',
+    });
+  }
+});
+
 const {
   isLoading,
   isError,
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue
index 123fc38..46c8966 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue
@@ -1,22 +1,22 @@
 <template>
   <ContentScrollView :paddingH="false">
     <nut-form :model-value="form" ref="formRef" :rules="rules">
-      <nut-form-item label="璇佷功绫诲瀷:" class="bole-form-item" prop="type">
+      <nut-form-item label="璇佷功绫诲瀷:" class="bole-form-item" prop="typeCode">
         <ChooseInputWithPicker
-          v-model="form.type"
+          v-model="form.typeCode"
           placeholder="璇烽�夋嫨璇佷功绫诲瀷"
-          :value-enum="TaskStatusText"
+          :value-enum="certificateTypeList"
         />
       </nut-form-item>
-      <nut-form-item label="璇佷功缂栧彿:" class="bole-form-item" prop="certificateNumber">
-        <nut-input v-model="form.certificateNumber" type="number" placeholder="璇疯緭鍏�"> </nut-input>
+      <nut-form-item label="璇佷功缂栧彿:" class="bole-form-item" prop="code">
+        <nut-input v-model="form.code" type="number" placeholder="璇疯緭鍏�"> </nut-input>
       </nut-form-item>
       <nut-form-item
         label="姘镐箙璇佷功:"
         class="bole-form-item permanent-certificate"
-        prop="isPermanentCertificate"
+        prop="isForever"
       >
-        <nut-switch v-model="form.isPermanentCertificate" />
+        <nut-switch v-model="form.isForever" />
       </nut-form-item>
       <nut-form-item label="寮�濮嬫棩鏈�:" class="bole-form-item" prop="startDate">
         <ChooseInputWithDatePicker v-model="form.startDate"></ChooseInputWithDatePicker>
@@ -24,26 +24,26 @@
       <nut-form-item label="缁撴潫鏃ユ湡:" class="bole-form-item" prop="endDate">
         <ChooseInputWithDatePicker v-model="form.endDate"></ChooseInputWithDatePicker>
       </nut-form-item>
-      <nut-form-item label="鍙戣瘉鍗曚綅:" class="bole-form-item" prop="certificateNumber">
-        <nut-input v-model="form.certificateNumber" placeholder="璇疯緭鍏�"> </nut-input>
+      <nut-form-item label="鍙戣瘉鍗曚綅:" class="bole-form-item" prop="issueUnit">
+        <nut-input v-model="form.issueUnit" placeholder="璇疯緭鍏�"> </nut-input>
       </nut-form-item>
       <div class="certificate-upload">
         <div class="certificate-upload-title">涓婁紶璇佷功</div>
         <nut-form-item
           label="璇佷功姝i潰鐓х墖锛堣纭繚璇佷功鍙枫�佸ご鍍忕収鐗囩瓑娓呮櫚鍙锛�"
           class="bole-form-item"
-          prop="photo"
+          prop="img"
           label-position="top"
         >
-          <Uploader v-model:file-list="form.photo" :maximum="1" class="bole-uploader"> </Uploader>
+          <Uploader v-model:file-list="form.img" :maximum="1" class="bole-uploader"> </Uploader>
         </nut-form-item>
         <nut-form-item
           label="璇佷功鍙嶉潰鐓х墖锛堟垨鍏朵粬鏈夊唴瀹归〉锛�"
           class="bole-form-item"
-          prop="photo"
+          prop="backImg"
           label-position="top"
         >
-          <Uploader v-model:file-list="form.photo" :maximum="1" class="bole-uploader"> </Uploader>
+          <Uploader v-model:file-list="form.backImg" :maximum="1" class="bole-uploader"> </Uploader>
         </nut-form-item>
       </div>
     </nut-form>
@@ -54,13 +54,16 @@
 </template>
 
 <script setup lang="ts">
-import { useUser } from '@/hooks';
 import { ChooseInputWithPicker, ChooseInputWithDatePicker } from '@12333/components';
 import * as userResumeServices from '@12333/services/apiV2/userResume';
-import { TaskStatusText, TaskStatus } from '@/constants';
 import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
-import { useQuery } from '@tanstack/vue-query';
+import { useQuery, useQueryClient } from '@tanstack/vue-query';
 import Taro from '@tarojs/taro';
+import { useDictionaryDataSelect } from '@12333/hooks';
+import { CategoryCode } from '@12333/constants';
+import { convertApi2FormUrlOnlyOne, Message, setOSSLink, FormValidator } from '@12333/utils';
+import dayjs from 'dayjs';
+import { goBack } from '@/utils';
 
 defineOptions({
   name: 'InnerPage',
@@ -69,14 +72,21 @@
 const router = Taro.useRouter();
 const id = router.params?.id as string;
 const isEdit = computed(() => !!id);
+const queryClient = useQueryClient();
+
+const { dictionaryDataList: certificateTypeList } = useDictionaryDataSelect({
+  categoryCode: CategoryCode.CertificateType,
+});
 
 const form = reactive({
-  type: TaskStatus.All,
-  certificateNumber: '',
+  typeCode: '',
+  code: '',
   startDate: '',
   endDate: '',
-  isPermanentCertificate: false,
-  photo: [],
+  issueUnit: '',
+  isForever: false,
+  img: [],
+  backImg: [],
 });
 
 const {
@@ -95,14 +105,37 @@
     );
   },
   placeholderData: () => ({} as API.GetUserResumeCredentialQueryResult),
-  enabled: isEdit.value,
+  enabled: computed(() => isEdit.value),
+  onSuccess(data) {
+    form.typeCode = data.typeCode;
+    form.code = data.code;
+    form.startDate = dayjs(data.startDate).format('YYYY-MM-DD 00:00:00');
+    form.endDate = dayjs(data.endDate).format('YYYY-MM-DD 23:59:59');
+    form.issueUnit = data.issueUnit;
+    form.isForever = data.isForever;
+    form.img = convertApi2FormUrlOnlyOne(setOSSLink(data.img));
+    form.backImg = convertApi2FormUrlOnlyOne(setOSSLink(data.backImg));
+  },
 });
 
 const rules = reactive<FormRules>({
-  type: [{ required: true, message: '璇疯緭鍏ユ墜鏈哄彿' }],
+  typeCode: [{ required: true, message: '璇烽�夋嫨璇佷功绫诲瀷' }],
   startDate: [{ required: true, message: '璇烽�夋嫨寮�濮嬫棩鏈�' }],
-  endDate: [{ required: true, message: '璇烽�夋嫨缁撴潫鏃ユ湡' }],
-  photo: [{ required: true, message: '璇蜂笂浼犺瘉涔︽闈㈢収' }],
+  endDate: [
+    {
+      required: true,
+      message: '璇烽�夋嫨缁撴潫鏃ユ湡',
+      validator(value) {
+        if (!value) return Promise.reject('璇烽�夋嫨缁撴潫鏃ユ湡');
+        if (value <= form.startDate) return Promise.reject('缁撴潫鏃ユ湡涓嶈兘灏忎簬寮�濮嬫棩鏈�');
+        return Promise.resolve(true);
+      },
+    },
+  ],
+  img: [{ required: true, message: '璇蜂笂浼犺瘉涔︽闈㈢収', validator: FormValidator.validatorArray }],
+  backImg: [
+    { required: true, message: '璇蜂笂浼犺瘉涔﹀弽闈㈢収', validator: FormValidator.validatorArray },
+  ],
 });
 const formRef = ref<any>(null);
 function handleConfirm() {
@@ -114,7 +147,32 @@
   });
 }
 
-function confirm() {}
+async function confirm() {
+  try {
+    let params: API.SaveUserResumeCredentialCommand = {
+      typeCode: form.typeCode,
+      code: form.code,
+      isForever: form.isForever,
+      startDate: dayjs(form.startDate).format('YYYY-MM-DD 00:00:00'),
+      endDate: dayjs(form.endDate).format('YYYY-MM-DD 23:59:59'),
+      issueUnit: form.issueUnit,
+      img: form.img[0]?.path,
+      backImg: form.backImg[0]?.path,
+    };
+    if (isEdit.value) {
+      params.id = id;
+    }
+    let res = await userResumeServices.saveUserResumeCredential(params);
+    if (res) {
+      Message.success(isEdit ? '缂栬緫鎴愬姛' : '娣诲姞鎴愬姛', {
+        onClosed() {
+          goBack();
+          queryClient.invalidateQueries(['userResumeServices/getUserResumeCredentials']);
+        },
+      });
+    }
+  } catch (error) {}
+}
 </script>
 
 <style lang="scss">
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue
index e360f49..9a7eca4 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue
@@ -17,8 +17,7 @@
         prop="photo"
         label-position="top"
       >
-        <Uploader v-model:file-list="form.lifeCircleImgUrlList" :maximum="6" class="bole-uploader">
-        </Uploader>
+        <Uploader v-model:file-list="form.photos" :maximum="6" class="bole-uploader"> </Uploader>
       </nut-form-item>
     </nut-form>
   </ContentScrollView>
@@ -30,7 +29,7 @@
 <script setup lang="ts">
 import { goBack } from '@/utils';
 import { NumberInput } from '@12333/components';
-import * as userResumeServices from '@12333/services/api/userResume';
+import * as userResumeServices from '@12333/services/apiV2/userResume';
 import { convertApiPath2Url, Message } from '@12333/utils';
 import { FileItem } from '@nutui/nutui-taro/dist/types/__VUE/uploader/type';
 import { useQuery } from '@tanstack/vue-query';
@@ -39,48 +38,50 @@
   name: 'InnerPage',
 });
 
+const { refetch: userResumeRefetch } = useUserResume();
+
 const {
   isLoading,
   isError,
   data: detail,
   refetch,
 } = useQuery({
-  queryKey: ['userResumeServices/getUserResumeDetailInfo'],
+  queryKey: ['userResumeServices/getUserResumeDetail'],
   queryFn: async () => {
-    return await userResumeServices.getUserResumeDetailInfo({
-      showLoading: false,
-    });
+    return await userResumeServices.getUserResumeDetail(
+      {},
+      {
+        showLoading: false,
+      }
+    );
   },
-  placeholderData: () => ({} as API.UserResumeDetailInfoOutput),
+  placeholderData: () => ({} as API.GetUserResumeDetailQueryResult),
   onSuccess(data) {
     form.height = data.height;
     form.weight = data.weight;
-    form.lifeCircleImgUrlList = data.lifeCircleImgUrlList?.length
-      ? data.lifeCircleImgUrlList.map((x) => convertApiPath2Url(x))
-      : [];
+    form.photos = data.photos?.length ? data.photos.map((x) => convertApiPath2Url(x)) : [];
   },
 });
 
 const form = reactive({
-  height: '',
-  weight: '',
-  lifeCircleImgUrlList: [] as FileItem[],
+  height: 0,
+  weight: 0,
+  photos: [] as FileItem[],
 });
 
 async function handleConfirm() {
   try {
-    let params: API.SaveUserResumeDetailInfoInput = {
+    let params: API.SaveUserResumeDetailCommand = {
       weight: form.weight,
       height: form.weight,
-      lifeCircleImgUrlList: form.lifeCircleImgUrlList?.length
-        ? form.lifeCircleImgUrlList.map((x) => x.url)
-        : [],
+      photos: form.photos?.length ? form.photos.map((x) => x.path) : [],
     };
-    let res = await userResumeServices.saveUserResumeDetailInfo(params);
+    let res = await userResumeServices.saveUserResumeDetail(params);
     if (res) {
       Message.success('淇濆瓨鎴愬姛', {
         onClosed() {
           goBack();
+          userResumeRefetch({ type: 'inactive' });
         },
       });
     }
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
index 87b07bf..309e69d 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue
@@ -147,7 +147,6 @@
       },
     },
     success: function (res) {
-      console.log('res: ', res);
       res.eventChannel.emit('updatePosition', { content: form.userExpectJobs });
     },
   });
diff --git a/apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue
index 60f5d12..1303900 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue
@@ -1,8 +1,8 @@
 <template>
   <ContentScrollView :paddingH="false">
     <nut-form :model-value="form" ref="formRef">
-      <nut-form-item label="宸ヤ綔骞撮檺:" class="bole-form-item" prop="workingSeniority">
-        <nut-input v-model="form.workingSeniority" placeholder="璇疯緭鍏�"> </nut-input>
+      <nut-form-item label="宸ヤ綔骞撮檺:" class="bole-form-item" prop="workSeniority">
+        <nut-input v-model="form.workSeniority" placeholder="璇疯緭鍏�"> </nut-input>
       </nut-form-item>
       <nut-form-item label="宸ヤ綔缁忛獙:" class="bole-form-item" prop="workExperience">
         <nut-input v-model="form.workExperience" type="textarea" placeholder="璇疯緭鍏�"> </nut-input>
@@ -16,7 +16,7 @@
 
 <script setup lang="ts">
 import { goBack } from '@/utils';
-import * as userResumeServices from '@12333/services/api/userResume';
+import * as userResumeServices from '@12333/services/apiV2/userResume';
 import { Message } from '@12333/utils';
 import { useQuery } from '@tanstack/vue-query';
 
@@ -24,8 +24,10 @@
   name: 'InnerPage',
 });
 
+const { refetch: userResumeRefetch } = useUserResume();
+
 const form = reactive({
-  workingSeniority: '',
+  workSeniority: '',
   workExperience: '',
 });
 
@@ -37,21 +39,24 @@
 } = useQuery({
   queryKey: ['userResumeServices/getUserResumeWorkExperience'],
   queryFn: async () => {
-    return await userResumeServices.getUserResumeWorkExperience({
-      showLoading: false,
-    });
+    return await userResumeServices.getUserResumeWorkExperience(
+      {},
+      {
+        showLoading: false,
+      }
+    );
   },
-  placeholderData: () => ({} as API.UserResumeWorkExperienceOutput),
+  placeholderData: () => ({} as API.GetUserResumeWorkExperienceQueryResult),
   onSuccess(data) {
-    form.workingSeniority = data.workingSeniority;
+    form.workSeniority = data.workSeniority;
     form.workExperience = data.workExperience;
   },
 });
 
 async function handleConfirm() {
   try {
-    let params: API.SaveUserResumeWorkExperienceInput = {
-      workingSeniority: form.workingSeniority,
+    let params: API.SaveUserResumeWorkExperienceCommand = {
+      workSeniority: form.workSeniority,
       workExperience: form.workExperience,
     };
     let res = await userResumeServices.saveUserResumeWorkExperience(params);
@@ -59,6 +64,7 @@
       Message.success('淇濆瓨鎴愬姛', {
         onClosed() {
           goBack();
+          userResumeRefetch({ type: 'inactive' });
         },
       });
     }
diff --git a/packages/constants/apiEnum.ts b/packages/constants/apiEnum.ts
index 849b19f..cc6ab80 100644
--- a/packages/constants/apiEnum.ts
+++ b/packages/constants/apiEnum.ts
@@ -199,6 +199,16 @@
   Female = 20,
 }
 
+/** 鐢ㄦ埛瀹炲悕鏂瑰紡 */
+export enum EnumUserRealMethod {
+  /**涓汉鎵嬫満鍙蜂笁瑕佺礌 */
+  Identity3 = 10,
+  /**閾惰鍗″瑕佺礌 */
+  Identity4 = 20,
+  /**鍒疯劯璁よ瘉 */
+  Face = 30,
+}
+
 /** 鐢ㄦ埛淇℃伅鐘舵�� */
 export enum EnumUserStatus {
   /**姝e父 */
diff --git a/packages/hooks/task.ts b/packages/hooks/task.ts
index bac7643..77af26c 100644
--- a/packages/hooks/task.ts
+++ b/packages/hooks/task.ts
@@ -2,6 +2,7 @@
 import {
   EnumPagedListOrder,
   EnumSettlementCycle,
+  EnumTaskCheckReceiveStatus,
   EnumTaskRecommendStatus,
   EnumTaskReleaseStatus,
   EnumTaskStatus,
@@ -27,6 +28,7 @@
     status?: EnumTaskStatus;
     genderLimit?: EnumUserGender;
     settlementCycle?: EnumSettlementCycle;
+    checkReceiveStatus?: EnumTaskCheckReceiveStatus;
     benefitCodes?: string;
     enterpriseId?: string;
     time?: Date;
@@ -44,6 +46,7 @@
     benefitCodes: '',
     status: '' as any as EnumTaskStatus,
     releaseStatus: EnumTaskReleaseStatus.InProcess,
+    checkReceiveStatus: '' as any as EnumTaskCheckReceiveStatus,
     enterpriseId: '',
     time: '' as any as Date,
     ...defaultQueryMenuState,
@@ -77,6 +80,7 @@
         genderLimit: queryMenuState.genderLimit,
         status: queryMenuState.status,
         releaseStatus: queryMenuState.releaseStatus,
+        checkReceiveStatus: queryMenuState.checkReceiveStatus,
         enterpriseId: queryMenuState.enterpriseId,
         beginTime: queryMenuState.time
           ? dayjs(queryMenuState.time).format('YYYY-MM-DD 00:00:00')
diff --git a/packages/services/apiV2/auth.ts b/packages/services/apiV2/auth.ts
index 38dc7f7..331a423 100644
--- a/packages/services/apiV2/auth.ts
+++ b/packages/services/apiV2/auth.ts
@@ -2,12 +2,12 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
-/** 缁戝畾鎵嬫満鍙� POST /api/user/auth/bindPhoneNumber */
-export async function bindPhoneNumber(
-  body: API.BindPhoneNumberCommand,
+/** 缁戝畾寰俊灏忕▼搴忕敤鎴蜂俊鎭� POST /api/user/auth/bindWxmpUserInfo */
+export async function bindWxmpUserInfo(
+  body: API.BindWxmpUserInfoCommand,
   options?: API.RequestConfig
 ) {
-  return request<boolean>('/api/user/auth/bindPhoneNumber', {
+  return request<API.LoginCommandCallback>('/api/user/auth/bindWxmpUserInfo', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json-patch+json',
@@ -17,12 +17,12 @@
   });
 }
 
-/** 缁戝畾寰俊灏忕▼搴忕敤鎴蜂俊鎭� POST /api/user/auth/bindWxmpUserInfo */
-export async function bindWxmpUserInfo(
-  body: API.BindWxmpUserInfoCommand,
+/** 鏇存崲鎵嬫満鍙� POST /api/user/auth/changePhoneNumber */
+export async function changePhoneNumber(
+  body: API.ChangePhoneNumberCommand,
   options?: API.RequestConfig
 ) {
-  return request<API.LoginCommandCallback>('/api/user/auth/bindWxmpUserInfo', {
+  return request<boolean>('/api/user/auth/changePhoneNumber', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json-patch+json',
@@ -81,9 +81,41 @@
   });
 }
 
+/** 鏌ヨ涓汉鐢ㄦ埛鐧诲綍淇℃伅 GET /api/user/auth/getPersonalLoginInfo */
+export async function getPersonalLoginInfo(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetPersonalLoginInfoParams,
+  options?: API.RequestConfig
+) {
+  return request<API.GetPersonalLoginInfoQueryResult>('/api/user/auth/getPersonalLoginInfo', {
+    method: 'GET',
+    params: {
+      ...params,
+      request: undefined,
+      ...params['request'],
+    },
+    ...(options || {}),
+  });
+}
+
 /** 瀵嗙爜鐧诲綍 POST /api/user/auth/passwordLogin */
 export async function passwordLogin(body: API.PasswordLoginCommand, options?: API.RequestConfig) {
   return request<API.LoginCommandCallback>('/api/user/auth/passwordLogin', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 娉ㄥ唽涓汉璐﹀彿 POST /api/user/auth/registerPersonalUser */
+export async function registerPersonalUser(
+  body: API.RegisterPersonalUserCommand,
+  options?: API.RequestConfig
+) {
+  return request<boolean>('/api/user/auth/registerPersonalUser', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json-patch+json',
@@ -120,6 +152,21 @@
   });
 }
 
+/** 鍙戦�佹洿鎹㈡墜鏈哄彿鐭俊 POST /api/user/auth/updatePhoneNumberVerifyCode */
+export async function updatePhoneNumberVerifyCode(
+  body: API.UpdatePhoneNumberVerifyCodeCommand,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/user/auth/updatePhoneNumberVerifyCode', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 寰俊灏忕▼搴忕櫥褰� POST /api/user/auth/wxmpLogin */
 export async function wxmpLogin(body: API.WxmpLoginCommand, options?: API.RequestConfig) {
   return request<API.LoginCommandCallback>('/api/user/auth/wxmpLogin', {
diff --git a/packages/services/apiV2/typings.d.ts b/packages/services/apiV2/typings.d.ts
index 1d549f8..a8f052a 100644
--- a/packages/services/apiV2/typings.d.ts
+++ b/packages/services/apiV2/typings.d.ts
@@ -69,6 +69,11 @@
     roleId?: string;
   }
 
+  interface APIgetPersonalLoginInfoParams {
+    /** 鏌ヨ涓汉鐢ㄦ埛鐧诲綍淇℃伅 */
+    request?: GetPersonalLoginInfoQuery;
+  }
+
   interface APIgetResourceFieldsParams {
     /** Id */
     id?: string;
@@ -140,13 +145,6 @@
     request?: GetUserResumeWorkExperienceQuery;
   }
 
-  interface BindPhoneNumberCommand {
-    /** 鎵嬫満鍙风爜 */
-    phoneNumber?: string;
-    /** 楠岃瘉鐮� */
-    verifyCode?: string;
-  }
-
   interface BindWxmpUserInfoCommand {
     /** 鍖呮嫭鏁忔劅鏁版嵁鍦ㄥ唴鐨勫畬鏁寸敤鎴蜂俊鎭殑鍔犲瘑鏁版嵁 */
     encryptedData: string;
@@ -154,6 +152,13 @@
     iv: string;
     /** 鑾峰彇浼氳瘽瀵嗛挜 */
     sessionKey: string;
+  }
+
+  interface ChangePhoneNumberCommand {
+    /** 鎵嬫満鍙风爜 */
+    phoneNumber: string;
+    /** 楠岃瘉鐮� */
+    verifyCode: string;
   }
 
   interface DeleteDictionaryCategoryCommand {
@@ -355,6 +360,15 @@
     Female = 20,
   }
 
+  enum EnumUserRealMethod {
+    /**涓汉鎵嬫満鍙蜂笁瑕佺礌 */
+    Identity3 = 10,
+    /**閾惰鍗″瑕佺礌 */
+    Identity4 = 20,
+    /**鍒疯劯璁よ瘉 */
+    Face = 30,
+  }
+
   enum EnumUserStatus {
     /**姝e父 */
     Normal = 10,
@@ -470,6 +484,24 @@
     /** 閿欒鐮� */
     errorCode?: string;
     data?: GetMenuQueryResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
+  interface FriendlyResultGetPersonalLoginInfoQueryResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetPersonalLoginInfoQueryResult;
     /** 鎵ц鎴愬姛 */
     success?: boolean;
     /** 閿欒淇℃伅 */
@@ -1251,6 +1283,24 @@
     name?: string;
   }
 
+  type GetPersonalLoginInfoQuery = Record<string, any>;
+
+  interface GetPersonalLoginInfoQueryResult {
+    /** Id */
+    id?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 鏄惁瀹炲悕 */
+    isReal?: boolean;
+    realMethod?: EnumUserRealMethod;
+    /** 鎴戠殑鎶ュ悕 */
+    taskCount?: number;
+    /** 宸插綍鐢� */
+    hirePassTaskCount?: number;
+    /** 宸插彇娑� */
+    hireRefuseTaskCount?: number;
+  }
+
   interface GetResourceFieldsQueryResultItem {
     /** 缂栧彿 */
     code?: string;
@@ -1702,6 +1752,10 @@
     accessToken?: string;
     /** 鍒锋柊浠ょ墝 */
     refreshToken?: string;
+    /** 浼氳瘽绉橀挜锛堜粎鐢ㄤ簬寰俊灏忕▼搴忔巿鏉冪櫥褰曪級 */
+    sessionKey?: string;
+    /** 鏄惁宸茬粦瀹氭墜鏈哄彿锛堜粎鐢ㄤ簬寰俊灏忕▼搴忔巿鏉冪櫥褰曪級 */
+    isBindPhoneNumber?: boolean;
   }
 
   interface PagedListQueryPageModel {
@@ -1769,6 +1823,13 @@
     password: string;
     type?: EnumUserType;
     clientType?: EnumClientType;
+  }
+
+  interface RegisterPersonalUserCommand {
+    /** 鎵嬫満鍙风爜 */
+    phoneNumber: string;
+    /** 楠岃瘉鐮� */
+    verifyCode: string;
   }
 
   interface SaveDictionaryCategoryCommand {
@@ -2201,6 +2262,11 @@
 
   type SyncHumanResourcesAreaDictionaryDataCommand = Record<string, any>;
 
+  interface UpdatePhoneNumberVerifyCodeCommand {
+    /** 鎵嬫満鍙风爜 */
+    phoneNumber: string;
+  }
+
   interface WxmpLoginCommand {
     /** 鐢ㄦ埛鐧诲綍鍑瘉 */
     code: string;

--
Gitblit v1.9.1