From b617603a5e9a4f86e47bb3df67e1cd0c9beb2ba1 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期一, 11 八月 2025 17:03:51 +0800
Subject: [PATCH] Merge branch 'master' of http://120.26.58.240:8888/r/flexJobMiniApp

---
 apps/cMiniApp/src/subpackages/curriculum/mineCertificateAddOrEdit/InnerPage.vue |  108 ++++++++++---
 apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue             |    6 
 apps/cMiniApp/src/pages/task/InnerPage.vue                                      |   57 ++----
 apps/cMiniApp/src/subpackages/curriculum/mineJobIntention/InnerPage.vue         |    1 
 packages/services/apiV2/taskUser.ts                                             |   27 +++
 apps/cMiniApp/project.private.config.json                                       |    7 
 packages/hooks/task.ts                                                          |    4 
 apps/cMiniApp/src/subpackages/curriculum/mineCertificate/InnerPage.vue          |    9 +
 apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue                      |   13 
 packages/services/apiV2/index.ts                                                |    2 
 packages/hooks/area.ts                                                          |   47 ++++-
 apps/cMiniApp/src/subpackages/curriculum/mineDetailedInfo/InnerPage.vue         |   39 ++--
 packages/utils/area.ts                                                          |    6 
 packages/services/apiV2/typings.d.ts                                            |   40 ++++
 apps/cMiniApp/src/subpackages/curriculum/mineWorkExperience/InnerPage.vue       |   28 ++-
 packages/constants/apiEnum.ts                                                   |   26 ++
 apps/cMiniApp/src/pages/mine/index.vue                                          |   43 ++++
 17 files changed, 322 insertions(+), 141 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 a6c0377..02429d4 100644
--- a/apps/cMiniApp/project.private.config.json
+++ b/apps/cMiniApp/project.private.config.json
@@ -77,13 +77,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/editMineInfo/InnerPage.vue b/apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
index 61ef2e5..fb29bf4 100644
--- a/apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/curriculum/editMineInfo/InnerPage.vue
@@ -26,7 +26,7 @@
       </nut-form-item>
       <nut-form-item label="甯搁┗鍩庡競:" class="bole-form-item" prop="areaList">
         <ChooseInputWithAreaPicker
-          :columns="completeAreaTree"
+          :columns="areaTree"
           v-model="form.areaList"
           placeholder="璇烽�夋嫨甯搁┗鍩庡競"
         ></ChooseInputWithAreaPicker>
@@ -42,7 +42,7 @@
 import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types';
 import { ChooseInputWithPicker, ChooseInputWithAreaPicker } from '@12333/components';
 import { convertApi2FormUrlOnlyOne, Message, setOSSLink } from '@12333/utils';
-import { useArea, useDictionaryDataSelect } from '@12333/hooks';
+import { useAreaTree, useDictionaryDataSelect } from '@12333/hooks';
 import { CategoryCode } from '@12333/constants';
 import * as userResumeServices from '@12333/services/apiV2/userResume';
 import Taro from '@tarojs/taro';
@@ -60,7 +60,7 @@
   categoryCode: CategoryCode.Education,
 });
 
-const { completeAreaTree } = useArea();
+const { areaTree } = useAreaTree();
 
 const form = reactive({
   avatar: [],
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 cc6ab80..393a3ce 100644
--- a/packages/constants/apiEnum.ts
+++ b/packages/constants/apiEnum.ts
@@ -91,20 +91,22 @@
   Dictionary = 0,
   /**浠诲姟 */
   Task = 1,
+  /**浠诲姟闆囦剑 */
+  TaskUser = 2,
   /**鐢ㄦ埛璁よ瘉 */
-  Auth = 2,
+  Auth = 3,
   /**鐢ㄦ埛鑿滃崟 */
-  Menu = 3,
+  Menu = 4,
   /**鐢ㄦ埛璧勬簮 */
-  Resource = 4,
+  Resource = 5,
   /**鐢ㄦ埛瑙掕壊 */
-  Role = 5,
+  Role = 6,
   /**鐢ㄦ埛淇℃伅 */
-  User = 6,
+  User = 7,
   /**鐢ㄦ埛绠�鍘� */
-  UserResume = 7,
+  UserResume = 8,
   /**浼佷笟淇℃伅 */
-  Enterprise = 8,
+  Enterprise = 9,
 }
 
 /** 璧勬簮璇锋眰鏂瑰紡 */
@@ -191,6 +193,16 @@
   Complete = 20,
 }
 
+/** 浠诲姟褰曠敤鐘舵�� */
+export enum EnumTaskUserHireStatus {
+  /**寰呭綍鐢� */
+  Wait = 10,
+  /**宸插綍鐢� */
+  Pass = 20,
+  /**宸茶阿缁� */
+  Refuse = 30,
+}
+
 /** 鐢ㄦ埛鎬у埆 */
 export enum EnumUserGender {
   /**鐢� */
diff --git a/packages/hooks/area.ts b/packages/hooks/area.ts
index f8bd597..684ce2c 100644
--- a/packages/hooks/area.ts
+++ b/packages/hooks/area.ts
@@ -4,6 +4,7 @@
 import { AreaType, CategoryCode } from '@12333/constants';
 import Taro, { EventChannel } from '@tarojs/taro';
 import { useDictionaryDataSelect } from './dic';
+import axios from 'axios';
 
 export function useArea() {
   const queryClient = useQueryClient();
@@ -12,13 +13,12 @@
     categoryCode: CategoryCode.Area,
     staleTime: Infinity,
     all: true,
-    maxDeep: AreaType.City,
+    maxDeep: AreaType.Area,
   });
 
   const areaList = computed(() => dictionaryDataList.value.map(convertDictionaryToAreaTreeNode));
-  console.log('areaList: ', areaList);
 
-  const areaTree = computed(() => formatAreaListToTree(areaList.value));
+  // const areaTree = computed(() => formatAreaListToTree(areaList.value));
 
   function getAreaFromCompleteAreaList(areaCode: string) {
     return areaList.value.find((x) => x.areaCode === areaCode);
@@ -31,20 +31,41 @@
   return {
     completeAreaList: areaList,
     areaList,
-    completeAreaTree: areaTree,
-    provinceList: computed(() => areaList.value.filter((x) => x.layer === AreaType.Province)),
+    // completeAreaTree: areaTree,
+    // provinceList: computed(() => areaList.value.filter((x) => x.layer === AreaType.Province)),
     getAreaFromCompleteAreaList,
     getAreaByAreaCode,
   };
+}
+
+export function useAreaTree() {
+  axios.get('https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/12333/area.txt').then((res) => {
+    console.log(res);
+  });
+  const { data } = useQuery({
+    queryKey: ['area.txt'],
+    queryFn() {
+      return axios
+        .get<API.AreaTreeNode[]>(
+          'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/12333/area.txt'
+        )
+        .then((res) => res.data);
+    },
+
+    placeholderData: () => [] as API.AreaTreeNode[],
+  });
+
+  const areaTree = computed(() => formatAreaListToTree(data.value));
+
+  return { areaTree: areaTree };
 }
 
 function convertDictionaryToAreaTreeNode(
   item: API.SelectOptionStringGetDictionaryDataSelectQueryResultOption
 ) {
   return {
-    children: [],
     areaCode: item.data?.code,
-    parentCode: item.data?.field1,
+    parentCode: item.data?.parentCode,
     areaName: item.label,
     layer: Number(item.data?.field4),
     quickQuery: item.data?.field2,
@@ -79,13 +100,13 @@
   };
 }
 
-export function useProvinceList() {
-  const { provinceList } = useArea();
+// export function useProvinceList() {
+//   const { provinceList } = useArea();
 
-  return {
-    provinceList,
-  };
-}
+//   return {
+//     provinceList,
+//   };
+// }
 
 export const globalEventEmitter = new Taro.Events();
 
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/index.ts b/packages/services/apiV2/index.ts
index e33974b..a1555c0 100644
--- a/packages/services/apiV2/index.ts
+++ b/packages/services/apiV2/index.ts
@@ -10,6 +10,7 @@
 import * as task from './task';
 import * as enterprise from './enterprise';
 import * as role from './role';
+import * as taskUser from './taskUser';
 import * as menu from './menu';
 export default {
   userResume,
@@ -20,5 +21,6 @@
   task,
   enterprise,
   role,
+  taskUser,
   menu,
 };
diff --git a/packages/services/apiV2/taskUser.ts b/packages/services/apiV2/taskUser.ts
new file mode 100644
index 0000000..694be3e
--- /dev/null
+++ b/packages/services/apiV2/taskUser.ts
@@ -0,0 +1,27 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鎶ュ悕浠诲姟 POST /api/flexjob/taskUser/applyTask */
+export async function applyTask(body: API.ApplyTaskCommand, options?: API.RequestConfig) {
+  return request<number>('/api/flexjob/taskUser/applyTask', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏀惰棌浠诲姟 POST /api/flexjob/taskUser/collectTask */
+export async function collectTask(body: API.CollectTaskCommand, options?: API.RequestConfig) {
+  return request<number>('/api/flexjob/taskUser/collectTask', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/packages/services/apiV2/typings.d.ts b/packages/services/apiV2/typings.d.ts
index a8f052a..8638b22 100644
--- a/packages/services/apiV2/typings.d.ts
+++ b/packages/services/apiV2/typings.d.ts
@@ -145,6 +145,11 @@
     request?: GetUserResumeWorkExperienceQuery;
   }
 
+  interface ApplyTaskCommand {
+    /** 浠诲姟Id */
+    ids?: string[];
+  }
+
   interface BindWxmpUserInfoCommand {
     /** 鍖呮嫭鏁忔劅鏁版嵁鍦ㄥ唴鐨勫畬鏁寸敤鎴蜂俊鎭殑鍔犲瘑鏁版嵁 */
     encryptedData: string;
@@ -159,6 +164,13 @@
     phoneNumber: string;
     /** 楠岃瘉鐮� */
     verifyCode: string;
+  }
+
+  interface CollectTaskCommand {
+    /** 浠诲姟Id */
+    ids?: string[];
+    /** 鏄惁鏀惰棌 */
+    isCollect?: boolean;
   }
 
   interface DeleteDictionaryCategoryCommand {
@@ -262,20 +274,22 @@
     Dictionary = 0,
     /**浠诲姟 */
     Task = 1,
+    /**浠诲姟闆囦剑 */
+    TaskUser = 2,
     /**鐢ㄦ埛璁よ瘉 */
-    Auth = 2,
+    Auth = 3,
     /**鐢ㄦ埛鑿滃崟 */
-    Menu = 3,
+    Menu = 4,
     /**鐢ㄦ埛璧勬簮 */
-    Resource = 4,
+    Resource = 5,
     /**鐢ㄦ埛瑙掕壊 */
-    Role = 5,
+    Role = 6,
     /**鐢ㄦ埛淇℃伅 */
-    User = 6,
+    User = 7,
     /**鐢ㄦ埛绠�鍘� */
-    UserResume = 7,
+    UserResume = 8,
     /**浼佷笟淇℃伅 */
-    Enterprise = 8,
+    Enterprise = 9,
   }
 
   enum EnumResourceMethod {
@@ -351,6 +365,15 @@
     Wait = 10,
     /**宸插畨鎺� */
     Complete = 20,
+  }
+
+  enum EnumTaskUserHireStatus {
+    /**寰呭綍鐢� */
+    Wait = 10,
+    /**宸插綍鐢� */
+    Pass = 20,
+    /**宸茶阿缁� */
+    Refuse = 30,
   }
 
   enum EnumUserGender {
@@ -1481,6 +1504,8 @@
     releaseStatus?: EnumTaskReleaseStatus;
     recommendStatus?: EnumTaskRecommendStatus;
     checkReceiveStatus?: EnumTaskCheckReceiveStatus;
+    /** 褰曠敤鐘舵�� */
+    hireStatus?: EnumTaskUserHireStatus[];
     pageModel?: PagedListQueryPageModel;
   }
 
@@ -1536,6 +1561,7 @@
     recommendStatus?: EnumTaskRecommendStatus;
     /** 鍒涘缓鏃堕棿 */
     createdTime?: string;
+    hireStatus?: EnumTaskUserHireStatus;
   }
 
   interface GetTaskInfosQueryResultObjectData {
diff --git a/packages/utils/area.ts b/packages/utils/area.ts
index aa4c806..c41d617 100644
--- a/packages/utils/area.ts
+++ b/packages/utils/area.ts
@@ -2,7 +2,7 @@
 
 export function formatAreaListToTree(
   areaDataList: API.AreaTreeNode[],
-  parentId = '',
+  parentId = null,
   maxLayer = AreaType.Area
 ) {
   const treeNodeList: API.AreaTreeNode[] = [];
@@ -11,7 +11,9 @@
       const areaTreeNode: API.AreaTreeNode = { ...areaData };
       if (areaData.parentCode === parentId && areaData.layer <= maxLayer) {
         const children = formatAreaListToTree(areaDataList, areaData.areaCode, maxLayer);
-        areaTreeNode.children = children;
+        if (children.length > 0) {
+          areaTreeNode.children = children;
+        }
         treeNodeList.push(areaTreeNode);
       }
     });

--
Gitblit v1.9.1