From 2b7fccce78fe4d57d73f4cf350cbe16b75a72fd4 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期五, 08 八月 2025 14:34:36 +0800
Subject: [PATCH] fix: 任务详情

---
 apps/cMiniApp/src/pages/home/index.vue                        |    2 
 apps/cMiniApp/src/subpackages/task/components/CompanyDesc.vue |   10 +
 apps/cMiniApp/src/hooks/task.ts                               |    8 -
 packages/utils/tsconfig.json                                  |    7 +
 apps/cMiniApp/project.private.config.json                     |    7 +
 packages/services/apiV2/auth.ts                               |   12 ++
 packages/utils/index.ts                                       |    1 
 apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue   |   89 ++++++++++----
 packages/components/src/Card/TaskCard.vue                     |   61 ++++++++-
 apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue  |    8 
 packages/services/apiV2/typings.d.ts                          |   68 +++++++++-
 packages/constants/apiEnum.ts                                 |   14 ++
 packages/utils/task.ts                                        |   14 ++
 apps/bMiniApp/src/pages/home/index.vue                        |    8 -
 14 files changed, 241 insertions(+), 68 deletions(-)

diff --git a/apps/bMiniApp/src/pages/home/index.vue b/apps/bMiniApp/src/pages/home/index.vue
index 72f0e72..4a9ae6e 100644
--- a/apps/bMiniApp/src/pages/home/index.vue
+++ b/apps/bMiniApp/src/pages/home/index.vue
@@ -114,8 +114,8 @@
         page: pageParam,
         orderInput: [
           queryState.orderType === HomeOrderType.Recommend
-            ? { property: 'createdTime', order: EnumPagedListOrder.Desc }
-            : {},
+            ? { property: 'recommendStatus', order: EnumPagedListOrder.Desc }
+            : { property: 'createdTime', order: EnumPagedListOrder.Desc },
         ],
       },
       // keywords: 'string',
@@ -127,10 +127,6 @@
       // status: 10,
       releaseStatus: EnumTaskReleaseStatus.InProcess,
     };
-
-    if (queryState.orderType === HomeOrderType.Recommend) {
-      params.recommendStatus = EnumTaskRecommendStatus.Yes;
-    }
 
     return taskServices.getTaskInfos(params, {
       showLoading: false,
diff --git a/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue
index 11d80a6..dbb88a9 100644
--- a/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/publishTask/InnerPage.vue
@@ -285,17 +285,17 @@
     form.billingMethod = data.billingMethod;
     form.serviceFee = data.serviceFee;
     form.settlementCycle = data.settlementCycle;
-    form.benefits = (data.benefits ?? []).map((item) => item.code);
+    form.benefits = (data.benefits ?? []).map((item) => item.benefitCode);
     form.ageMinLimit = data.ageMinLimit;
     form.ageMaxLimit = data.ageMaxLimit;
     form.genderLimit = data.genderLimit;
-    form.credentialLimits = (data.credentialLimits ?? []).map((item) => item.code);
+    form.credentialLimits = (data.credentialLimits ?? []).map((item) => item.typeCode);
     form.beginTime = dayjs(data.beginTime).format('YYYY-MM-DD 00:00:00');
     form.endTime = dayjs(data.endTime).format('YYYY-MM-DD 23:59:59');
     form.addressDetail = data.addressDetail;
     form.weMapInfo = {
-      provinceName: data.provinceName,
-      cityName: data.cityName,
+      provinceName: data.provinceContent,
+      cityName: data.cityContent,
       provinceCode: data.provinceCode,
       cityCode: data.cityCode,
       latitude: data.latitude,
diff --git a/apps/cMiniApp/project.private.config.json b/apps/cMiniApp/project.private.config.json
index 0c6b36b..c7ac5b7 100644
--- a/apps/cMiniApp/project.private.config.json
+++ b/apps/cMiniApp/project.private.config.json
@@ -9,6 +9,13 @@
         "miniprogram": {
             "list": [
                 {
+                    "name": "浠诲姟璇︽儏",
+                    "pathName": "subpackages/task/taskDetail/taskDetail",
+                    "query": "id=04c75425-e783-4dbf-0f16-08ddd626b756",
+                    "launchMode": "default",
+                    "scene": null
+                },
+                {
                     "name": "鍩庡競閫夋嫨",
                     "pathName": "subpackages/city/citySelect/citySelect",
                     "query": "",
diff --git a/apps/cMiniApp/src/hooks/task.ts b/apps/cMiniApp/src/hooks/task.ts
index d8414e1..bdb6b3a 100644
--- a/apps/cMiniApp/src/hooks/task.ts
+++ b/apps/cMiniApp/src/hooks/task.ts
@@ -50,8 +50,8 @@
           page: pageParam,
           orderInput: [
             queryState.orderType === HomeOrderType.Recommend
-              ? { property: 'createdTime', order: EnumPagedListOrder.Desc }
-              : {},
+              ? { property: 'recommendStatus', order: EnumPagedListOrder.Desc }
+              : { property: 'createdTime', order: EnumPagedListOrder.Desc },
           ],
         },
         keywords: queryState.searchValueTrim,
@@ -62,10 +62,6 @@
         status: queryMenuState.status,
         releaseStatus: EnumTaskReleaseStatus.InProcess,
       };
-
-      if (queryState.orderType === HomeOrderType.Recommend) {
-        params.recommendStatus = EnumTaskRecommendStatus.Yes;
-      }
 
       return taskServices.getTaskInfos(params, {
         showLoading: false,
diff --git a/apps/cMiniApp/src/pages/home/index.vue b/apps/cMiniApp/src/pages/home/index.vue
index afc2d7b..3fb5639 100644
--- a/apps/cMiniApp/src/pages/home/index.vue
+++ b/apps/cMiniApp/src/pages/home/index.vue
@@ -57,7 +57,7 @@
       :key="queryState.orderType"
     >
       <template #renderItem="{ item }">
-        <TaskCard @click="goTaskDetail(item)" />
+        <TaskCard @click="goTaskDetail(item)" v-bind="item" />
       </template>
     </InfiniteLoading>
   </PageLayoutWithBg>
diff --git a/apps/cMiniApp/src/subpackages/task/components/CompanyDesc.vue b/apps/cMiniApp/src/subpackages/task/components/CompanyDesc.vue
index fd14e5c..f3641da 100644
--- a/apps/cMiniApp/src/subpackages/task/components/CompanyDesc.vue
+++ b/apps/cMiniApp/src/subpackages/task/components/CompanyDesc.vue
@@ -1,12 +1,12 @@
 <template>
   <div class="taskDetail-company-wrapper">
     <div class="taskDetail-company-title-wrapper">
-      <div class="taskDetail-company-title">瀹佹尝浜哄姏鏃犲咖</div>
+      <div class="taskDetail-company-title">{{ enterpriseName }}</div>
       <RectRight v-if="showArrow" :size="8" class="taskDetail-company-arrow" />
     </div>
     <div class="taskDetail-company-info">
       <img :src="IconSafe" class="safe-company-info-icon" />
-      <div class="taskDetail-company-info-text">宸茶璇� | 4涓矖浣嶅湪鎷�</div>
+      <div class="taskDetail-company-info-text">宸茶璇� | {{ taskCount }}涓矖浣嶅湪鎷�</div>
     </div>
   </div>
 </template>
@@ -21,10 +21,16 @@
 
 type Props = {
   showArrow?: boolean;
+  enterpriseName?: string;
+  taskCount?: number;
+  /**
+   * TODO 缂哄皯鏄惁宸茶璇�
+   */
 };
 
 const props = withDefaults(defineProps<Props>(), {
   showArrow: true,
+  taskCount: 0,
 });
 </script>
 
diff --git a/apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue b/apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
index 56f23c6..b599bbe 100644
--- a/apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
+++ b/apps/cMiniApp/src/subpackages/task/taskDetail/InnerPage.vue
@@ -1,26 +1,38 @@
 <template>
   <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
     <ContentScrollView style="background-color: transparent">
-      <Cell :title="'瀹㈡埧鏈嶅姟鍛�'" titleSize="large">
+      <Cell :title="detail?.name ?? ''" titleSize="large">
         <template #title-right>
-          <img :src="IconAttentioActive" class="taskDetail-attention-icon" />
+          <img
+            :src="detail.isCollected ? IconAttentioActive : IconAttention"
+            class="taskDetail-attention-icon"
+          />
         </template>
-        <div class="taskDetail-time">2025骞�2鏈�5鏃� 鑷� 2025骞�3鏈�5鏃�</div>
+        <div class="taskDetail-time">
+          {{ dayjs(detail?.beginTime).format('YYYY骞碝M鏈圖D鏃�') }} 鑷�
+          {{ dayjs(detail?.endTime).format('YYYY骞碝M鏈圖D鏃�') }}
+        </div>
         <div class="task-card-welfare-wrapper">
           <div class="task-card-welfare-list">
-            <div class="task-card-welfare-list-item">鏃ョ粨</div>
-            <div class="task-card-welfare-list-item">鐢峰コ涓嶉檺</div>
-            <div class="task-card-welfare-list-item">鍖呬笁椁�</div>
+            <div class="task-card-welfare-list-item">
+              {{ EnumSettlementCycleText[detail.settlementCycle] }}
+            </div>
+            <!-- <div class="task-card-welfare-list-item">
+              {{ TaskUtils.getGenderText(detail.genderLimit) }}
+            </div> -->
           </div>
-          <TaskPrice :value="212" />
+          <TaskPrice
+            :value="detail.serviceFee ?? 0"
+            :unit="BillingMethodEnumUnit[detail.billingMethod]"
+          />
         </div>
         <div class="taskDetail-address-wrapper">
           <div class="taskDetail-address-title-wrapper">
             <img :src="IconLocaltion" class="taskDetail-address-title-icon" />
-            <div class="taskDetail-address-title">瀹佹尝鏌忔偊閰掑簵</div>
+            <div class="taskDetail-address-title">{{ detail?.addressName ?? '' }}</div>
           </div>
           <div class="taskDetail-address-info-wrapper">
-            <div class="taskDetail-address-info">瀹佹尝甯傞劄宸炲尯涓滈挶婀栧ぇ鍫拌矾188鍙峰畞娉㈡煆鎮﹂厭搴�</div>
+            <div class="taskDetail-address-info">{{ detail?.addressDetail ?? '' }}</div>
             <RectRight :size="8" class="taskDetail-address-info-icon" />
           </div>
         </div>
@@ -28,31 +40,44 @@
       <Cell :show-title="false">
         <CellChunk title="绂忓埄淇℃伅">
           <div class="taskDetail-welfare-list">
-            <TaskDetailWelfareItem :icon="IconAttentioActive" text="楂樻俯琛ヨ创" />
-            <TaskDetailWelfareItem :icon="IconAttentioActive" text="楂樻俯琛ヨ创" />
-            <TaskDetailWelfareItem :icon="IconAttentioActive" text="楂樻俯琛ヨ创" />
-            <TaskDetailWelfareItem :icon="IconAttentioActive" text="楂樻俯琛ヨ创" />
-            <TaskDetailWelfareItem :icon="IconAttentioActive" text="楂樻俯琛ヨ创" />
+            <TaskDetailWelfareItem
+              v-for="benefit in detail.benefits"
+              :key="benefit.benefitCode"
+              :icon="IconAttentioActive"
+              :text="benefit.benefitContent"
+            />
           </div>
         </CellChunk>
         <CellChunk title="鎶ュ悕鏉′欢">
           <div class="taskDetail-limit-list">
             <div class="taskDetail-limit-list-item">
               <div class="taskDetail-limit-list-item-label">骞撮緞锛�</div>
-              <div class="taskDetail-limit-list-item-text">18-45宀�</div>
+              <div class="taskDetail-limit-list-item-text">
+                {{ detail.ageMinLimit ?? 0 }}-{{ detail.ageMaxLimit ?? 0 }}宀�
+              </div>
             </div>
             <div class="taskDetail-limit-list-item">
               <div class="taskDetail-limit-list-item-label">鎬у埆锛�</div>
-              <div class="taskDetail-limit-list-item-text">涓嶉檺</div>
+              <div class="taskDetail-limit-list-item-text">
+                {{ TaskUtils.getGenderText(detail.genderLimit) }}
+              </div>
             </div>
             <div class="taskDetail-limit-list-item">
-              <div class="taskDetail-limit-list-item-label">璧勬牸璇佷功锛�</div>
-              <div class="taskDetail-limit-list-item-text">鍋ュ悍璇�</div>
+              <template v-if="detail?.credentialLimits?.length > 0">
+                <div class="taskDetail-limit-list-item-label">璧勬牸璇佷功锛�</div>
+                <div class="taskDetail-limit-list-item-text">
+                  {{ TaskUtils.getCredentialLimit(detail?.credentialLimits) }}
+                </div>
+              </template>
             </div>
           </div>
         </CellChunk>
         <CellChunk title="鍙戝竷鑰呬俊鎭�">
-          <CompanyDesc @click="goCompanyDetail"></CompanyDesc>
+          <CompanyDesc
+            @click="goCompanyDetail"
+            :enterpriseName="detail?.enterpriseName ?? ''"
+            :taskCount="detail?.taskCount ?? 0"
+          ></CompanyDesc>
         </CellChunk>
       </Cell>
       <Cell>
@@ -84,7 +109,7 @@
 <script setup lang="ts">
 import Taro from '@tarojs/taro';
 import { useQuery } from '@tanstack/vue-query';
-import * as flexWorkerServices from '@12333/services/api/FlexWorker';
+import * as taskServices from '@12333/services/apiV2/task';
 import { useToggle } from 'senin-mini/hooks';
 import { TaskPrice, TaskDetailWelfareItem } from '@12333/components';
 import IconAttention from '@/assets/task/icon-attention.png';
@@ -96,10 +121,18 @@
 import IconLocaltion from '@/assets/task/icon-localtion.png';
 import './taskDetail.scss';
 import CompanyDesc from '../components/CompanyDesc.vue';
+import dayjs from 'dayjs';
+import { TaskUtils } from '@12333/utils';
+import { EnumSettlementCycleText, BillingMethodEnumUnit } from '@12333/constants';
+import { useAccessLogin } from '@/hooks';
 
 defineOptions({
   name: 'InnerPage',
 });
+
+/**
+ * TODO 缂哄皯宸叉姤鍚嶄汉鏁� 鎵嬫満 鎶曡瘔涓炬姤鎺ュ彛
+ */
 
 const router = Taro.useRouter();
 const taskId = router.params?.id ?? '';
@@ -110,32 +143,32 @@
   data: detail,
   refetch,
 } = useQuery({
-  queryKey: ['flexWorkerServices/getOrdeForDetail', taskId],
+  queryKey: ['taskServices/getTaskInfo', taskId],
   queryFn: async () => {
-    return await flexWorkerServices.getOrdeForDetail(
+    return await taskServices.getTaskInfo(
       { id: taskId },
       {
         showLoading: false,
       }
     );
   },
-  placeholderData: () => ({} as API.OrderInfoDto),
+  placeholderData: () => ({} as API.GetTaskInfoQueryResult),
   onSuccess(data) {
-    if (data.isExistTradeChatRecord) setTrue();
+    // if (data.isExistTradeChatRecord) setTrue();
   },
 });
 
 const { isCollapse, setTrue } = useToggle();
 
-function goComplaint() {
+const goComplaint = useAccessLogin(() => {
   Taro.navigateTo({
     url: `${RouterPath.complaint}?id=${taskId}`,
   });
-}
+});
 
-function goCompanyDetail() {
+const goCompanyDetail = useAccessLogin(() => {
   Taro.navigateTo({
     url: `${RouterPath.companyDetail}?id=${taskId}`,
   });
-}
+});
 </script>
diff --git a/packages/components/src/Card/TaskCard.vue b/packages/components/src/Card/TaskCard.vue
index f358afb..098b45c 100644
--- a/packages/components/src/Card/TaskCard.vue
+++ b/packages/components/src/Card/TaskCard.vue
@@ -1,23 +1,29 @@
 <template>
   <div class="task-card-wrapper">
     <div class="task-card-title-wrapper">
-      <div class="task-card-title">{{ taskName }}</div>
+      <div class="task-card-title">{{ name }}</div>
       <slot name="title-right">
-        <TaskPrice :value="212" />
+        <TaskPrice :value="serviceFee ?? 0" :unit="BillingMethodEnumUnit[billingMethod]" />
       </slot>
     </div>
     <slot>
       <div class="task-card-welfare-list">
-        <div class="task-card-welfare-list-item">鏃ョ粨</div>
-        <div class="task-card-welfare-list-item">鐢峰コ涓嶉檺</div>
+        <div class="task-card-welfare-list-item">
+          {{ EnumSettlementCycleText[settlementCycle] }}
+        </div>
+        <div class="task-card-welfare-list-item">{{ TaskUtils.getGenderText(genderLimit) }}</div>
         <div class="task-card-welfare-list-item">鍖呬笁椁�</div>
       </div>
-      <div class="task-card-time">涓婄彮鏃堕棿:07:00-15:30</div>
+      <div class="task-card-time">
+        {{ dayjs(beginTime).format('YYYY骞碝M鏈圖D鏃�') }}鑷硔{
+          dayjs(endTime).format('YYYY骞碝M鏈圖D鏃�')
+        }}
+      </div>
     </slot>
     <div class="task-card-footer">
       <div class="task-card-left">
         <div class="task-card-footer-tag">H</div>
-        <div class="task-card-footer-address">{{ address }}</div>
+        <div class="task-card-footer-address">{{ 'address' }}</div>
       </div>
       <div class="task-card-actions" v-if="showActions">
         <slot name="actions">
@@ -29,8 +35,24 @@
 </template>
 
 <script setup lang="ts">
+import {
+  EnumBillingMethod,
+  EnumSettlementCycle,
+  EnumTaskCheckReceiveStatus,
+  EnumTaskRecommendStatus,
+  EnumTaskReleaseStatus,
+  EnumTaskSettlementStatus,
+  EnumTaskStatus,
+  EnumUserGender,
+  EnumBillingMethodText,
+  EnumUserGenderText,
+  EnumSettlementCycleText,
+  BillingMethodEnumUnit,
+} from '@12333/constants';
 import TaskPrice from './TaskPrice.vue';
 import { CommonTaskCardProps } from './card';
+import dayjs from 'dayjs';
+import { TaskUtils } from '@12333/utils';
 
 defineOptions({
   name: 'TaskCard',
@@ -38,9 +60,30 @@
 
 type Props = CommonTaskCardProps & {
   showActions?: boolean;
-
-  taskName?: string;
-  address?: string;
+  /** Id */
+  id?: string;
+  /** 浠诲姟鍚嶇О */
+  name: string;
+  /** 浠诲姟鍗曞彿 */
+  code?: string;
+  billingMethod?: EnumBillingMethod;
+  /** 鏈嶅姟璐� */
+  serviceFee?: number;
+  settlementCycle?: EnumSettlementCycle;
+  genderLimit?: EnumUserGender;
+  /** 鎶ュ悕浜烘暟 */
+  userCount?: number;
+  status?: EnumTaskStatus;
+  /** 浠诲姟寮�濮嬫椂闂� */
+  beginTime?: string;
+  /** 浠诲姟缁撴潫鏃堕棿 */
+  endTime?: string;
+  releaseStatus?: EnumTaskReleaseStatus;
+  checkReceiveStatus?: EnumTaskCheckReceiveStatus;
+  settlementStatus?: EnumTaskSettlementStatus;
+  recommendStatus?: EnumTaskRecommendStatus;
+  /** 鍒涘缓鏃堕棿 */
+  createdTime?: string;
 };
 
 const props = withDefaults(defineProps<Props>(), {
diff --git a/packages/constants/apiEnum.ts b/packages/constants/apiEnum.ts
index f260f44..d4ebf8b 100644
--- a/packages/constants/apiEnum.ts
+++ b/packages/constants/apiEnum.ts
@@ -125,6 +125,20 @@
   AliyunSms = 10,
 }
 
+/** 鐭俊妯℃澘绫诲瀷 */
+export enum EnumSmsTemplateType {
+  /**鐧诲綍 */
+  Login = 0,
+  /**娉ㄥ唽 */
+  Register = 1,
+  /**淇敼瀵嗙爜 */
+  UpdatePassword = 2,
+  /**缁戝畾鎵嬫満鍙风爜 */
+  BindPhoneNumber = 3,
+  /**淇敼鎵嬫満鍙风爜 */
+  UpdatePhoneNumber = 4,
+}
+
 /** 浠诲姟缁撶畻鐘舵�� */
 export enum EnumTaskCheckReceiveStatus {
   /**寰呴獙鏀� */
diff --git a/packages/services/apiV2/auth.ts b/packages/services/apiV2/auth.ts
index 543ccd0..00b5ddb 100644
--- a/packages/services/apiV2/auth.ts
+++ b/packages/services/apiV2/auth.ts
@@ -62,3 +62,15 @@
     ...(options || {}),
   });
 }
+
+/** 鍙戦�侀獙璇佺爜 POST /api/user/auth/sendVerifyCode */
+export async function sendVerifyCode(body: API.SendVerifyCodeCommand, options?: API.RequestConfig) {
+  return request<string>('/api/user/auth/sendVerifyCode', {
+    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 98a7d82..5324984 100644
--- a/packages/services/apiV2/typings.d.ts
+++ b/packages/services/apiV2/typings.d.ts
@@ -122,13 +122,6 @@
     ids: string[];
   }
 
-  interface DictionaryDataQueryModel {
-    /** 缂栧彿 */
-    code?: string;
-    /** 鍚嶇О */
-    name?: string;
-  }
-
   enum EnumBillingMethod {
     /**鎸夋湀 */
     Month = 10,
@@ -240,6 +233,19 @@
   enum EnumSmsAccess {
     /**闃块噷浜戠煭淇� */
     AliyunSms = 10,
+  }
+
+  enum EnumSmsTemplateType {
+    /**鐧诲綍 */
+    Login = 0,
+    /**娉ㄥ唽 */
+    Register = 1,
+    /**淇敼瀵嗙爜 */
+    UpdatePassword = 2,
+    /**缁戝畾鎵嬫満鍙风爜 */
+    BindPhoneNumber = 3,
+    /**淇敼鎵嬫満鍙风爜 */
+    UpdatePhoneNumber = 4,
   }
 
   enum EnumTaskCheckReceiveStatus {
@@ -1159,22 +1165,22 @@
     serviceFee?: number;
     settlementCycle?: EnumSettlementCycle;
     /** 绂忓埄 */
-    benefits?: DictionaryDataQueryModel[];
+    benefits?: GetTaskInfoQueryResultBenefit[];
     /** 骞撮緞鑼冨洿鏈�灏� */
     ageMinLimit?: number;
     /** 骞撮緞鑼冨洿澶� */
     ageMaxLimit?: number;
     genderLimit?: EnumUserGender;
     /** 璧勬牸璇佷功绫诲瀷 */
-    credentialLimits?: DictionaryDataQueryModel[];
+    credentialLimits?: GetTaskInfoQueryResultCredentialLimit[];
     /** 浠诲姟鍦扮偣鎵�灞炵渷浠界紪鍙� */
     provinceCode?: string;
     /** 浠诲姟鍦扮偣鎵�灞炵渷浠� */
-    provinceName?: string;
+    provinceContent?: string;
     /** 浠诲姟鍦扮偣鎵�灞炲煄甯傜紪鍙� */
     cityCode?: string;
     /** 浠诲姟鍦扮偣鎵�灞炲煄甯� */
-    cityName?: string;
+    cityContent?: string;
     /** 浠诲姟鍦扮偣鍚嶇О */
     addressName?: string;
     /** 浠诲姟鍦扮偣璇︾粏鍦板潃 */
@@ -1191,6 +1197,20 @@
     createdTime?: string;
     /** 鏄惁宸叉敹钘� */
     isCollected?: boolean;
+  }
+
+  interface GetTaskInfoQueryResultBenefit {
+    /** 绂忓埄缂栧彿 */
+    benefitCode?: string;
+    /** 绂忓埄 */
+    benefitContent?: string;
+  }
+
+  interface GetTaskInfoQueryResultCredentialLimit {
+    /** 璇佷功绫诲瀷缂栧彿 */
+    typeCode?: string;
+    /** 璇佷功绫诲瀷 */
+    typeContent?: string;
   }
 
   interface GetTaskInfosQuery {
@@ -1223,7 +1243,27 @@
     /** 鏈嶅姟璐� */
     serviceFee?: number;
     settlementCycle?: EnumSettlementCycle;
+    /** 绂忓埄 */
+    benefits?: GetTaskInfoQueryResultBenefit[];
     genderLimit?: EnumUserGender;
+    /** 璧勬牸璇佷功绫诲瀷 */
+    credentialLimits?: GetTaskInfoQueryResultCredentialLimit[];
+    /** 浠诲姟鍦扮偣鎵�灞炵渷浠界紪鍙� */
+    provinceCode?: string;
+    /** 浠诲姟鍦扮偣鎵�灞炵渷浠� */
+    provinceContent?: string;
+    /** 浠诲姟鍦扮偣鎵�灞炲煄甯傜紪鍙� */
+    cityCode?: string;
+    /** 浠诲姟鍦扮偣鎵�灞炲煄甯� */
+    cityContent?: string;
+    /** 浠诲姟鍦扮偣鍚嶇О */
+    addressName?: string;
+    /** 浠诲姟鍦扮偣璇︾粏鍦板潃 */
+    addressDetail?: string;
+    /** 缁忓害 */
+    longitude?: number;
+    /** 绾害 */
+    latitude?: number;
     /** 鎶ュ悕浜烘暟 */
     userCount?: number;
     status?: EnumTaskStatus;
@@ -1600,6 +1640,12 @@
     data?: any;
   }
 
+  interface SendVerifyCodeCommand {
+    /** 鎵嬫満鍙风爜 */
+    phoneNumber?: string;
+    templateCode?: EnumSmsTemplateType;
+  }
+
   interface SetDictionaryDataIsDisabledCommand {
     ids?: string[];
     /** 鏄惁宸茬鐢� */
diff --git a/packages/utils/index.ts b/packages/utils/index.ts
index da54574..a626aa0 100644
--- a/packages/utils/index.ts
+++ b/packages/utils/index.ts
@@ -14,3 +14,4 @@
 export * from './media';
 export * from './location';
 export * from './encrypt';
+export * from './task';
diff --git a/packages/utils/task.ts b/packages/utils/task.ts
new file mode 100644
index 0000000..b8e1b09
--- /dev/null
+++ b/packages/utils/task.ts
@@ -0,0 +1,14 @@
+import { EnumUserGender, EnumUserGenderText } from '@12333/constants';
+
+export class TaskUtils {
+  static getGenderText(gender: EnumUserGender, allGenderText = '鐢峰コ涓嶉檺') {
+    return gender ? EnumUserGenderText[gender] : allGenderText;
+  }
+
+  static getCredentialLimit(credentialLimits: API.GetTaskInfoQueryResultCredentialLimit[]) {
+    if (credentialLimits?.length > 0) {
+      return credentialLimits[0].typeContent;
+    }
+    return '';
+  }
+}
diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json
index 247e669..68e2a11 100644
--- a/packages/utils/tsconfig.json
+++ b/packages/utils/tsconfig.json
@@ -7,7 +7,12 @@
       "@12333/*": ["../../packages/*"]
     },
     "composite": true,
-    "types": ["node", "@12333/services/api/typings.d.ts", "../../types/api.d.ts"]
+    "types": [
+      "node",
+      "@12333/services/api/typings.d.ts",
+      "@12333/services/apiV2/typings.d.ts",
+      "../../types/api.d.ts"
+    ]
   },
   "exclude": ["node_modules", "dist"],
   "references": [{ "path": "../constants" }, { "path": "../services" }, { "path": "../components" }]

--
Gitblit v1.9.1