From 92b51e47eb0e53e1e8e13aa0f9135603e1bb03a0 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期日, 19 十月 2025 14:38:36 +0800
Subject: [PATCH] fix: 验收管理

---
 packages/constants/enum.ts                                                                             |    2 
 packages/services/apiV2/taskCheckReceive.ts                                                            |   18 +
 packages/constants/task.ts                                                                             |   15 +
 apps/bMiniApp/src/constants/router.ts                                                                  |    1 
 apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue                                |    3 
 packages/services/apiV2/user.ts                                                                        |   30 ++
 apps/bMiniApp/project.private.config.json                                                              |   65 +++-
 apps/bMiniApp/src/subpackages/task/components/TaskCheckHistoryCard.vue                                 |   80 ++++++
 apps/bMiniApp/src/app.config.ts                                                                        |    1 
 apps/bMiniApp/src/subpackages/task/constants/index.ts                                                  |    6 
 apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue                                             |   22 +
 apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.vue       |   13 +
 packages/services/apiV2/index.ts                                                                       |   20 
 apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue                                        |   47 ++
 apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue                                       |   61 +++-
 packages/components/src/Card/FlexJobTopView.vue                                                        |   38 ++
 packages/services/apiV2/task.ts                                                                        |   15 +
 packages/services/apiV2/typings.d.ts                                                                   |  161 ++++++++++++
 apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/InnerPage.vue                          |  104 ++++++++
 packages/constants/apiEnum.ts                                                                          |   26 +
 apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.config.ts |    3 
 21 files changed, 654 insertions(+), 77 deletions(-)

diff --git a/apps/bMiniApp/project.private.config.json b/apps/bMiniApp/project.private.config.json
index fa7ccc7..23c40f5 100644
--- a/apps/bMiniApp/project.private.config.json
+++ b/apps/bMiniApp/project.private.config.json
@@ -1,25 +1,44 @@
 {
-  "description": "椤圭洰绉佹湁閰嶇疆鏂囦欢銆傛鏂囦欢涓殑鍐呭灏嗚鐩� project.config.json 涓殑鐩稿悓瀛楁銆傞」鐩殑鏀瑰姩浼樺厛鍚屾鍒版鏂囦欢涓�傝瑙佹枃妗o細https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
-  "projectname": "bMiniApp",
-  "setting": {
-    "compileHotReLoad": true,
-    "bigPackageSizeSupport": true,
-    "urlCheck": false,
-    "coverView": true,
-    "lazyloadPlaceholderEnable": false,
-    "skylineRenderEnable": false,
-    "preloadBackgroundData": false,
-    "autoAudits": false,
-    "useApiHook": true,
-    "useApiHostProcess": true,
-    "showShadowRootInWxmlPanel": true,
-    "useStaticServer": false,
-    "useLanDebug": false,
-    "showES6CompileOption": false,
-    "checkInvalidKey": true,
-    "ignoreDevUnusedFiles": true,
-    "useIsolateContext": true
-  },
-  "condition": {},
-  "libVersion": "3.9.3"
+    "description": "椤圭洰绉佹湁閰嶇疆鏂囦欢銆傛鏂囦欢涓殑鍐呭灏嗚鐩� project.config.json 涓殑鐩稿悓瀛楁銆傞」鐩殑鏀瑰姩浼樺厛鍚屾鍒版鏂囦欢涓�傝瑙佹枃妗o細https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
+    "projectname": "bMiniApp",
+    "setting": {
+        "compileHotReLoad": true,
+        "bigPackageSizeSupport": true,
+        "urlCheck": false,
+        "coverView": true,
+        "lazyloadPlaceholderEnable": false,
+        "skylineRenderEnable": false,
+        "preloadBackgroundData": false,
+        "autoAudits": false,
+        "useApiHook": true,
+        "useApiHostProcess": true,
+        "showShadowRootInWxmlPanel": true,
+        "useStaticServer": false,
+        "useLanDebug": false,
+        "showES6CompileOption": false,
+        "checkInvalidKey": true,
+        "ignoreDevUnusedFiles": true,
+        "useIsolateContext": true
+    },
+    "condition": {
+        "miniprogram": {
+            "list": [
+                {
+                    "name": "楠屾敹绠$悊",
+                    "pathName": "subpackages/task/taskCheck/taskCheck",
+                    "query": "",
+                    "scene": null,
+                    "launchMode": "default"
+                },
+                {
+                    "name": "楠屾敹璇︽儏",
+                    "pathName": "subpackages/task/taskCheckDetail/taskCheckDetail",
+                    "query": "id=927b9898-1e9f-4aec-99aa-08ddf4e125c9&date=2025-10-19&checkReceiveStatus=10",
+                    "launchMode": "default",
+                    "scene": null
+                }
+            ]
+        }
+    },
+    "libVersion": "3.9.3"
 }
\ No newline at end of file
diff --git a/apps/bMiniApp/src/app.config.ts b/apps/bMiniApp/src/app.config.ts
index bb6a629..4077471 100644
--- a/apps/bMiniApp/src/app.config.ts
+++ b/apps/bMiniApp/src/app.config.ts
@@ -94,6 +94,7 @@
         'taskHandleCheckDetail/taskHandleCheckDetail',
         'taskManage/taskManage',
         'batchTaskList/batchTaskList',
+        'taskUserSubmitCheckHistories/taskUserSubmitCheckHistories',
       ],
     },
     {
diff --git a/apps/bMiniApp/src/constants/router.ts b/apps/bMiniApp/src/constants/router.ts
index e2db973..acd5296 100644
--- a/apps/bMiniApp/src/constants/router.ts
+++ b/apps/bMiniApp/src/constants/router.ts
@@ -47,6 +47,7 @@
   taskHandleCheckDetail = '/subpackages/task/taskHandleCheckDetail/taskHandleCheckDetail',
   taskManage = '/subpackages/task/taskManage/taskManage',
   batchTaskList = '/subpackages/task/batchTaskList/batchTaskList',
+  taskUserSubmitCheckHistories = '/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories',
 
   jobApplicationManage = '/subpackages/jobApplicationManage/jobApplicationManage/jobApplicationManage',
   jobApplicationDetail = '/subpackages/jobApplicationManage/jobApplicationDetail/jobApplicationDetail',
diff --git a/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue b/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
index fe8e7ea..801c3ee 100644
--- a/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
+++ b/apps/bMiniApp/src/subpackages/task/components/TaskCheckCard.vue
@@ -9,15 +9,36 @@
       :contactPhoneNumber="contactPhoneNumber"
     >
       <template #actions>
-        <nut-button
-          v-if="checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive"
-          type="primary"
-          class="task-check-card-phone-btn"
-          >楠屾敹</nut-button
-        >
-        <div v-else class="task-check-card-phone-status" :style="{ color: Colors.Success }">
-          {{ EnumTaskCheckReceiveStatusText[checkReceiveStatus] }}
-        </div>
+        <template v-if="checkReceiveMethod === EnumTaskCheckReceiveMethod.CheckIn">
+          <nut-button
+            v-if="!checkInTime"
+            type="primary"
+            class="task-check-card-phone-btn"
+            @click.stop="emit('checkInOrOut', CheckInOrOutEventEnum.CheckIn)"
+            >绛惧埌</nut-button
+          >
+          <nut-button
+            v-else-if="!checkOutTime"
+            type="primary"
+            class="task-check-card-phone-btn"
+            @click.stop="emit('checkInOrOut', CheckInOrOutEventEnum.CheckOut)"
+            >绛惧嚭</nut-button
+          >
+          <div v-else class="task-check-card-phone-status" :style="{ color: Colors.Success }">
+            {{ EnumTaskCheckReceiveStatusText[checkReceiveStatus] }}
+          </div>
+        </template>
+        <template v-else>
+          <nut-button
+            v-if="checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive"
+            type="primary"
+            class="task-check-card-phone-btn"
+            >楠屾敹</nut-button
+          >
+          <div v-else class="task-check-card-phone-status" :style="{ color: Colors.Success }">
+            {{ EnumTaskCheckReceiveStatusText[checkReceiveStatus] }}
+          </div>
+        </template>
       </template>
     </TaskCheckPersonalView>
   </div>
@@ -30,7 +51,9 @@
   EnumUserGender,
   EnumTaskCheckReceiveStatus,
   EnumTaskCheckReceiveStatusText,
+  EnumTaskCheckReceiveMethod,
 } from '@12333/constants';
+import { CheckInOrOutEventEnum } from '../constants';
 
 defineOptions({
   name: 'TaskCheckCard',
@@ -43,12 +66,18 @@
   isReal?: boolean;
   contactPhoneNumber?: string;
   checkReceiveStatus?: EnumTaskCheckReceiveStatus;
+  /** 绛惧埌鏃堕棿 */
+  checkInTime?: string;
+  /** 绛惧嚭鏃堕棿 */
+  checkOutTime?: string;
+  checkReceiveMethod?: EnumTaskCheckReceiveMethod;
 };
 
 const props = withDefaults(defineProps<Props>(), {});
 
 const emit = defineEmits<{
   (e: 'checkReceive'): void;
+  (e: 'checkInOrOut', ev: CheckInOrOutEventEnum): void;
 }>();
 </script>
 
diff --git a/apps/bMiniApp/src/subpackages/task/components/TaskCheckHistoryCard.vue b/apps/bMiniApp/src/subpackages/task/components/TaskCheckHistoryCard.vue
new file mode 100644
index 0000000..ef9135a
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/components/TaskCheckHistoryCard.vue
@@ -0,0 +1,80 @@
+<template>
+  <div class="task-check-card-wrapper">
+    <TaskCheckPersonalView
+      class="task-check-card-view"
+      :avatar="avatar"
+      :name="name"
+      :gender="gender"
+      :isReal="isReal"
+      :contactPhoneNumber="contactPhoneNumber"
+    >
+      <template #time v-if="!!checkTime">
+        {{ dayjs(checkTime).format('HH:mm') }}
+      </template>
+      <template #actions>
+        <div
+          class="task-check-card-phone-status"
+          :style="{ color: EnumTaskUserSubmitCheckHistoryTypeColor[type] }"
+        >
+          {{ EnumTaskUserSubmitCheckHistoryTypeText[type] }}
+        </div>
+      </template>
+    </TaskCheckPersonalView>
+  </div>
+</template>
+
+<script setup lang="ts">
+import dayjs from 'dayjs';
+import TaskCheckPersonalView from './TaskCheckPersonalView.vue';
+import {
+  Colors,
+  EnumUserGender,
+  EnumTaskUserSubmitCheckHistoryType,
+  EnumTaskUserSubmitCheckHistoryTypeText,
+  EnumTaskUserSubmitCheckHistoryTypeColor,
+} from '@12333/constants';
+
+defineOptions({
+  name: 'TaskCheckHistoryCard',
+});
+
+type Props = {
+  avatar?: string;
+  name?: string;
+  gender?: EnumUserGender;
+  isReal?: boolean;
+  contactPhoneNumber?: string;
+  type?: EnumTaskUserSubmitCheckHistoryType;
+  checkTime?: string;
+};
+
+const props = withDefaults(defineProps<Props>(), {});
+</script>
+
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.task-check-card-wrapper {
+  background: #ffffff;
+  border-radius: 12px;
+  padding: 40px;
+  padding-right: 26px;
+  margin-bottom: 24px;
+
+  &:last-child {
+    margin-bottom: 0;
+  }
+
+  .task-check-card-view {
+    .task-check-card-phone-container {
+      margin-top: 0;
+    }
+  }
+
+  .task-check-card-phone-status {
+    font-size: 24px;
+    height: 52px;
+    line-height: 52px;
+  }
+}
+</style>
diff --git a/apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue b/apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue
index 0fdb3db..ff39f26 100644
--- a/apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue
+++ b/apps/bMiniApp/src/subpackages/task/components/TaskCheckPersonalView.vue
@@ -1,5 +1,8 @@
 <template>
   <FlexJobTopView :avatar="avatar" :name="name" :gender="gender" :isReal="isReal">
+    <template #time>
+      <slot name="time"></slot>
+    </template>
     <template #detail>
       <div class="task-check-card-phone-container">
         <div class="task-check-card-phone-wrapper">
diff --git a/apps/bMiniApp/src/subpackages/task/constants/index.ts b/apps/bMiniApp/src/subpackages/task/constants/index.ts
new file mode 100644
index 0000000..3d6b49a
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/constants/index.ts
@@ -0,0 +1,6 @@
+export enum CheckInOrOutEventEnum {
+  /**绛惧埌 */
+  CheckIn = 10,
+  /**绛惧嚭 */
+  CheckOut = 20,
+}
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
index a8ed12a..b8760a6 100644
--- a/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/taskCheck/InnerPage.vue
@@ -36,8 +36,9 @@
 <script setup lang="ts">
 import { MyTaskCard, ProTabs, ProTabPane, Calendar } from '@12333/components';
 import Taro from '@tarojs/taro';
-import { EnumTaskCheckReceiveStatus } from '@12333/constants';
+import { EnumTaskCheckReceiveStatus, EnumTaskCheckReceiveMethod } from '@12333/constants';
 import { useCheckReceiveTasks } from '@12333/hooks';
+import dayjs from 'dayjs';
 
 defineOptions({
   name: 'InnerPage',
@@ -46,8 +47,21 @@
 const { queryState, infiniteLoadingProps } = useCheckReceiveTasks();
 
 function goSubmitTaskDetail(item: API.GetCheckReceiveTasksQueryResultItem) {
-  Taro.navigateTo({
-    url: `${RouterPath.taskCheckDetail}?id=${item.id}&date=${queryState.date}&checkReceiveStatus=${queryState.checkReceiveStatus}`,
-  });
+  if (
+    item.checkReceiveMethod === EnumTaskCheckReceiveMethod.CheckIn &&
+    dayjs(queryState.date).isBefore(dayjs())
+  ) {
+    Taro.navigateTo({
+      url: `${RouterPath.taskUserSubmitCheckHistories}?id=${item.id}&date=${dayjs(
+        queryState.date
+      ).format('YYYY-MM-DD')}`,
+    });
+  } else {
+    Taro.navigateTo({
+      url: `${RouterPath.taskCheckDetail}?id=${item.id}&date=${dayjs(queryState.date).format(
+        'YYYY-MM-DD'
+      )}&checkReceiveStatus=${queryState.checkReceiveStatus}`,
+    });
+  }
 }
 </script>
diff --git a/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
index f9e1391..09dd67b 100644
--- a/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
@@ -19,9 +19,13 @@
           :name="item.name"
           :gender="item.gender"
           :isReal="item.isReal"
+          :checkInTime="item.checkInTime"
+          :checkOutTime="item.checkOutTime"
           :contactPhoneNumber="item.contactPhoneNumber"
           :checkReceiveStatus="item.checkReceiveStatus"
+          :checkReceiveMethod="detail?.checkReceiveMethod"
           @checkReceive="goTaskDetail(item)"
+          @checkInOrOut="checkReceiveTask"
         />
       </template>
     </InfiniteLoading>
@@ -34,9 +38,10 @@
 import { useInfiniteLoading } from '@12333/hooks';
 import TaskCheckCard from '../components/TaskCheckCard.vue';
 import { MyTaskCard } from '@12333/components';
-import { EnumTaskCheckReceiveStatus } from '@12333/constants';
-import { setOSSLink } from '@12333/utils';
+import { EnumTaskCheckReceiveMethod, EnumTaskCheckReceiveStatus } from '@12333/constants';
+import { Message, setOSSLink } from '@12333/utils';
 import dayjs from 'dayjs';
+import { CheckInOrOutEventEnum } from '../constants';
 
 defineOptions({
   name: 'InnerPage',
@@ -47,8 +52,10 @@
 const date = router.params?.date ?? '';
 const checkReceiveStatus = Number(router.params?.checkReceiveStatus);
 
+const detail = ref<API.GetCheckReceiveTasksQueryResultItem>();
+
 const { infiniteLoadingProps } = useInfiniteLoading(
-  ({ pageParam }) => {
+  async ({ pageParam }) => {
     let params: API.GetCheckReceiveTaskQuery = {
       pageModel: {
         rows: 20,
@@ -59,9 +66,11 @@
       checkReceiveStatus: checkReceiveStatus,
     };
 
-    return taskCheckReceiveServices.getCheckReceiveTask(params, {
+    let res = await taskCheckReceiveServices.getCheckReceiveTask(params, {
       showLoading: false,
     });
+    detail.value = res.objectData;
+    return res;
   },
   {
     queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'],
@@ -69,18 +78,38 @@
 );
 
 function goTaskDetail(item: API.GetCheckReceiveTaskQueryResultItem) {
-  if (item.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed) {
-    Taro.navigateTo({
-      url: `${RouterPath.taskCheckedDetail}?id=${item.id}`,
-    });
+  if (detail.value.checkReceiveMethod !== EnumTaskCheckReceiveMethod.CheckIn) {
+    if (item.checkReceiveStatus === EnumTaskCheckReceiveStatus.Completed) {
+      Taro.navigateTo({
+        url: `${RouterPath.taskCheckedDetail}?id=${item.id}`,
+      });
+    }
+    if (
+      item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive ||
+      item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitSubmit
+    ) {
+      Taro.navigateTo({
+        url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}&date=${date}`,
+      });
+    }
   }
-  if (
-    item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitCheckReceive ||
-    item.checkReceiveStatus === EnumTaskCheckReceiveStatus.WaitSubmit
-  ) {
-    Taro.navigateTo({
-      url: `${RouterPath.taskHandleCheckDetail}?id=${item.id}&date=${date}`,
-    });
-  }
+}
+
+async function checkReceiveTask(ev: CheckInOrOutEventEnum) {
+  try {
+    let params: API.CheckReceiveTaskCommand = {
+      id: id,
+    };
+    if (ev === CheckInOrOutEventEnum.CheckIn) {
+      params.checkInTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
+    } else if (ev === CheckInOrOutEventEnum.CheckOut) {
+      params.checkOutTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
+    }
+    let res = await taskCheckReceiveServices.checkReceiveTask(params);
+    if (res) {
+      Message.success('鎻愪氦鎴愬姛');
+      infiniteLoadingProps.value?.refetch?.();
+    }
+  } catch (error) {}
 }
 </script>
diff --git a/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/InnerPage.vue
new file mode 100644
index 0000000..0d74f59
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/InnerPage.vue
@@ -0,0 +1,104 @@
+<template>
+  <LoadingLayout>
+    <ProTabs
+      v-model="queryState.type"
+      name="taskUserSubmitCheckHistories-tab"
+      :showPaneContent="false"
+      class="taskUserSubmitCheckHistories-tabs"
+      isTransparent
+      title-gutter="8"
+      title-scroll
+    >
+      <ProTabPane :title="`鍏ㄩ儴`" :pane-key="0"></ProTabPane>
+      <ProTabPane
+        :title="EnumTaskUserSubmitCheckHistoryTypeText[EnumTaskUserSubmitCheckHistoryType.CheckIn]"
+        :pane-key="EnumTaskUserSubmitCheckHistoryType.CheckIn"
+      ></ProTabPane>
+      <ProTabPane
+        :title="EnumTaskUserSubmitCheckHistoryTypeText[EnumTaskUserSubmitCheckHistoryType.CheckOut]"
+        :pane-key="EnumTaskUserSubmitCheckHistoryType.CheckOut"
+      ></ProTabPane>
+      <ProTabPane
+        :title="
+          EnumTaskUserSubmitCheckHistoryTypeText[EnumTaskUserSubmitCheckHistoryType.UnCheckIn]
+        "
+        :pane-key="EnumTaskUserSubmitCheckHistoryType.UnCheckIn"
+      ></ProTabPane>
+      <ProTabPane
+        :title="
+          EnumTaskUserSubmitCheckHistoryTypeText[EnumTaskUserSubmitCheckHistoryType.UnCheckOut]
+        "
+        :pane-key="EnumTaskUserSubmitCheckHistoryType.UnCheckOut"
+      ></ProTabPane>
+    </ProTabs>
+    <ChunkTitle :title="title" />
+    <InfiniteLoading
+      scrollViewClassName="common-infinite-scroll-list"
+      v-bind="infiniteLoadingProps"
+    >
+      <template #renderItem="{ item }">
+        <TaskCheckHistoryCard
+          :avatar="setOSSLink(item.avatar)"
+          :name="item.name"
+          :gender="item.gender"
+          :isReal="item.isReal"
+          :contactPhoneNumber="item.contactPhoneNumber"
+          :type="item.type"
+          :checkTime="item.checkTime"
+        />
+      </template>
+    </InfiniteLoading>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import Taro from '@tarojs/taro';
+import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
+import { useInfiniteLoading } from '@12333/hooks';
+import TaskCheckHistoryCard from '../components/TaskCheckHistoryCard.vue';
+import { ProTabs, ProTabPane } from '@12333/components';
+import {
+  EnumTaskUserSubmitCheckHistoryTypeText,
+  EnumTaskUserSubmitCheckHistoryTypeColor,
+  EnumTaskUserSubmitCheckHistoryType,
+  WeekCN,
+} from '@12333/constants';
+import { Message, setOSSLink } from '@12333/utils';
+import dayjs from 'dayjs';
+
+defineOptions({
+  name: 'InnerPage',
+});
+
+const router = Taro.useRouter();
+const id = router.params?.id ?? '';
+const date = router.params?.date ?? '';
+
+const title = `${dayjs(date).format('YYYY骞碝M鏈圖D鏃�')} 鏄熸湡${WeekCN[dayjs(date).day()]}`;
+
+const queryState = reactive({
+  type: 0 as any as EnumTaskUserSubmitCheckHistoryType,
+});
+
+const { infiniteLoadingProps } = useInfiniteLoading(
+  async ({ pageParam }) => {
+    let params: API.GetCheckReceiveTaskUserSubmitCheckHistoriesQuery = {
+      pageModel: {
+        rows: 20,
+        page: pageParam,
+      },
+      taskInfoId: id,
+      date: dayjs(date).format('YYYY-MM-DD'),
+      type: queryState.type,
+    };
+
+    let res = await taskCheckReceiveServices.getCheckReceiveTaskUserSubmitCheckHistories(params, {
+      showLoading: false,
+    });
+    return res;
+  },
+  {
+    queryKey: ['taskCheckReceiveServices/getCheckReceiveTaskUserSubmitCheckHistories', queryState],
+  }
+);
+</script>
diff --git a/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.config.ts b/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.config.ts
new file mode 100644
index 0000000..305fdb1
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.config.ts
@@ -0,0 +1,3 @@
+export default definePageConfig({
+  disableScroll: true,
+});
diff --git a/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.vue b/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.vue
new file mode 100644
index 0000000..5ff25c8
--- /dev/null
+++ b/apps/bMiniApp/src/subpackages/task/taskUserSubmitCheckHistories/taskUserSubmitCheckHistories.vue
@@ -0,0 +1,13 @@
+<template>
+  <PageLayoutWithBg class="taskUserSubmitCheckHistories-page-wrapper" title="楠屾敹璇︽儏">
+    <InnerPage />
+  </PageLayoutWithBg>
+</template>
+
+<script setup lang="ts">
+import InnerPage from './InnerPage.vue';
+
+defineOptions({
+  name: 'taskUserSubmitCheckHistories',
+});
+</script>
diff --git a/packages/components/src/Card/FlexJobTopView.vue b/packages/components/src/Card/FlexJobTopView.vue
index f874817..2c9fa45 100644
--- a/packages/components/src/Card/FlexJobTopView.vue
+++ b/packages/components/src/Card/FlexJobTopView.vue
@@ -7,17 +7,22 @@
     />
     <div class="flexJob-card-top-info">
       <div class="flexJob-card-top-info-item">
-        <div class="flexJob-card-top-info-name">{{ name }}</div>
-        <div class="flexJob-card-top-info-gender">
-          <img
-            v-if="gender === EnumUserGender.Male"
-            :src="IconMale"
-            class="flexJob-card-top-info-gender-icon"
-          />
-          <img v-else :src="IconFemale" class="flexJob-card-top-info-gender-icon" />
+        <div class="flexJob-card-top-info-item-w">
+          <div class="flexJob-card-top-info-name">{{ name }}</div>
+          <div class="flexJob-card-top-info-gender">
+            <img
+              v-if="gender === EnumUserGender.Male"
+              :src="IconMale"
+              class="flexJob-card-top-info-gender-icon"
+            />
+            <img v-else :src="IconFemale" class="flexJob-card-top-info-gender-icon" />
+          </div>
+          <div class="flexJob-card-top-info-auth" :class="{ 'is-real-name': isReal }">
+            {{ isReal ? '宸插疄鍚�' : '鏈疄鍚�' }}
+          </div>
         </div>
-        <div class="flexJob-card-top-info-auth" :class="{ 'is-real-name': isReal }">
-          {{ isReal ? '宸插疄鍚�' : '鏈疄鍚�' }}
+        <div class="flexJob-card-top-info-item-right">
+          <slot name="time"></slot>
         </div>
       </div>
       <slot name="detail">
@@ -90,10 +95,23 @@
     flex: 1;
     min-width: 0;
 
+    .flexJob-card-top-info-item-w {
+      display: flex;
+      align-items: center;
+      flex: 1;
+      min-width: 0;
+    }
+
     .flexJob-card-top-info-item {
       display: flex;
       align-items: center;
 
+      .flexJob-card-top-info-item-right {
+        font-size: 28px;
+        line-height: 34px;
+        color: boleGetCssVar('text-color', 'secondary');
+      }
+
       .flexJob-card-top-info-name {
         font-size: 34px;
         line-height: 34px;
diff --git a/packages/constants/apiEnum.ts b/packages/constants/apiEnum.ts
index b901d56..3d11edb 100644
--- a/packages/constants/apiEnum.ts
+++ b/packages/constants/apiEnum.ts
@@ -485,6 +485,16 @@
   Stopped = 100,
 }
 
+/** 浠诲姟缁撶畻瀹℃牳鐘舵�� */
+export enum EnumTaskSettlementAuditStatus {
+  /**寰呭鏍� */
+  Wait = 10,
+  /**瀹℃牳閫氳繃 */
+  Pass = 20,
+  /**椹冲洖 */
+  Fail = 30,
+}
+
 /** 浠诲姟缁撶畻鍗曠姸鎬� */
 export enum EnumTaskSettlementOrderStatus {
   /**寰呬笂浼� */
@@ -545,15 +555,27 @@
   Stop = 50,
 }
 
+/** 浠诲姟浜哄憳鎻愪氦淇℃伅绛惧埌璁板綍绫诲瀷 */
+export enum EnumTaskUserSubmitCheckHistoryType {
+  /**绛惧埌 */
+  CheckIn = 10,
+  /**绛惧嚭 */
+  CheckOut = 20,
+  /**鏈埌宀� */
+  UnCheckIn = 30,
+  /**鏈鍑� */
+  UnCheckOut = 40,
+}
+
 /** 浠诲姟楠屾敹鐘舵�� */
 export enum EnumTaskUserSubmitCheckReceiveStatus {
   /**寰呮彁浜� */
   WaitSubmit = 10,
-  /**寰呴獙鏀�/鏈埌宀� */
+  /**寰呴獙鏀� */
   WaitCheckReceive = 20,
   /**楠屾敹閫氳繃/宸茬鍒� */
   Success = 30,
-  /**楠屾敹鏈�氳繃 */
+  /**楠屾敹鏈�氳繃/鏈埌宀� */
   Fail = 40,
 }
 
diff --git a/packages/constants/enum.ts b/packages/constants/enum.ts
index 511e684..712ee34 100644
--- a/packages/constants/enum.ts
+++ b/packages/constants/enum.ts
@@ -116,3 +116,5 @@
    */
   UserCertification = 10,
 }
+
+export const WeekCN = ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'];
diff --git a/packages/constants/task.ts b/packages/constants/task.ts
index fd41f55..669badf 100644
--- a/packages/constants/task.ts
+++ b/packages/constants/task.ts
@@ -13,6 +13,7 @@
   GetTaskInfoQueryResultHireButton,
   GetTaskInfoQueryResultApplyButton,
   EnumTaskUserSubmitCheckReceiveStatus,
+  EnumTaskUserSubmitCheckHistoryType,
 } from './apiEnum';
 
 export const EnumBillingMethodText = {
@@ -155,3 +156,17 @@
   [GetTaskInfoQueryResultApplyButton.WaitHire]: '寰呯‘璁�',
   [GetTaskInfoQueryResultApplyButton.WaitSignContract]: '鍘荤绾�',
 };
+
+export const EnumTaskUserSubmitCheckHistoryTypeText = {
+  [EnumTaskUserSubmitCheckHistoryType.CheckIn]: '绛惧埌',
+  [EnumTaskUserSubmitCheckHistoryType.CheckOut]: '绛惧嚭',
+  [EnumTaskUserSubmitCheckHistoryType.UnCheckIn]: '鏈埌宀�',
+  [EnumTaskUserSubmitCheckHistoryType.UnCheckOut]: '鏈鍑�',
+};
+
+export const EnumTaskUserSubmitCheckHistoryTypeColor = {
+  [EnumTaskUserSubmitCheckHistoryType.CheckIn]: Colors.Success,
+  [EnumTaskUserSubmitCheckHistoryType.CheckOut]: Colors.Success,
+  [EnumTaskUserSubmitCheckHistoryType.UnCheckIn]: Colors.Danger,
+  [EnumTaskUserSubmitCheckHistoryType.UnCheckOut]: Colors.Info,
+};
diff --git a/packages/services/apiV2/index.ts b/packages/services/apiV2/index.ts
index aa1fd08..e99bcae 100644
--- a/packages/services/apiV2/index.ts
+++ b/packages/services/apiV2/index.ts
@@ -5,11 +5,12 @@
 import * as enterpriseEmployee from './enterpriseEmployee';
 import * as user from './user';
 import * as role from './role';
+import * as enterpriseWallet from './enterpriseWallet';
 import * as ocrUtils from './ocrUtils';
 import * as task from './task';
 import * as enterprise from './enterprise';
+import * as logRecords from './logRecords';
 import * as resource from './resource';
-import * as enterpriseWallet from './enterpriseWallet';
 import * as dictionary from './dictionary';
 import * as codeUrl from './codeUrl';
 import * as electronSign from './electronSign';
@@ -18,21 +19,21 @@
 import * as taskCheckReceive from './taskCheckReceive';
 import * as taskUser from './taskUser';
 import * as sms from './sms';
-import * as logRecords from './logRecords';
-import * as menu from './menu';
-import * as fileUtils from './fileUtils';
-import * as userWallet from './userWallet';
 import * as settings from './settings';
+import * as menu from './menu';
+import * as userWallet from './userWallet';
+import * as fileUtils from './fileUtils';
 import * as syncDatabase from './syncDatabase';
 export default {
   enterpriseEmployee,
   user,
   role,
+  enterpriseWallet,
   ocrUtils,
   task,
   enterprise,
+  logRecords,
   resource,
-  enterpriseWallet,
   dictionary,
   codeUrl,
   electronSign,
@@ -41,10 +42,9 @@
   taskCheckReceive,
   taskUser,
   sms,
-  logRecords,
-  menu,
-  fileUtils,
-  userWallet,
   settings,
+  menu,
+  userWallet,
+  fileUtils,
   syncDatabase,
 };
diff --git a/packages/services/apiV2/task.ts b/packages/services/apiV2/task.ts
index 0f797ab..84167b8 100644
--- a/packages/services/apiV2/task.ts
+++ b/packages/services/apiV2/task.ts
@@ -2,6 +2,21 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
+/** 瀹℃牳浠诲姟缁撶畻 POST /api/flexjob/task/auditTaskSettlement */
+export async function auditTaskSettlement(
+  body: API.AuditTaskSettlementCommand,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/flexjob/task/auditTaskSettlement', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鍒犻櫎浠诲姟 DELETE /api/flexjob/task/deleteTaskInfo */
 export async function deleteTaskInfo(body: API.DeleteTaskInfoCommand, options?: API.RequestConfig) {
   return request<number>('/api/flexjob/task/deleteTaskInfo', {
diff --git a/packages/services/apiV2/taskCheckReceive.ts b/packages/services/apiV2/taskCheckReceive.ts
index 87c33b3..aaa88db 100644
--- a/packages/services/apiV2/taskCheckReceive.ts
+++ b/packages/services/apiV2/taskCheckReceive.ts
@@ -86,6 +86,24 @@
   );
 }
 
+/** 鏌ヨ楠屾敹浠诲姟璇︽儏-绛惧埌绛惧嚭璁板綍 POST /api/flexjob/taskCheckReceive/getCheckReceiveTaskUserSubmitCheckHistories */
+export async function getCheckReceiveTaskUserSubmitCheckHistories(
+  body: API.GetCheckReceiveTaskUserSubmitCheckHistoriesQuery,
+  options?: API.RequestConfig
+) {
+  return request<API.GetCheckReceiveTaskUserSubmitCheckHistoriesQueryResult>(
+    '/api/flexjob/taskCheckReceive/getCheckReceiveTaskUserSubmitCheckHistories',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json-patch+json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
 /** 鏌ヨ楠屾敹璇︽儏 POST /api/flexjob/taskCheckReceive/getCheckReceiveTaskUserSubmits */
 export async function getCheckReceiveTaskUserSubmits(
   body: API.GetCheckReceiveTaskUserSubmitsQuery,
diff --git a/packages/services/apiV2/typings.d.ts b/packages/services/apiV2/typings.d.ts
index f903ae2..5dac705 100644
--- a/packages/services/apiV2/typings.d.ts
+++ b/packages/services/apiV2/typings.d.ts
@@ -344,6 +344,14 @@
     ids?: string[];
   }
 
+  interface AuditTaskSettlementCommand {
+    /** 缁撶畻璁㈠崟Id */
+    id?: string;
+    auditStatus?: EnumTaskSettlementAuditStatus;
+    /** 瀹℃牳澶囨敞 */
+    auditRemark?: string;
+  }
+
   interface BaiduOcrBusinessLicenseResultModel {
     /** 浼佷笟鍏ㄧО */
     enterpriseName?: string;
@@ -397,6 +405,16 @@
     sessionKey: string;
   }
 
+  interface BuildOperatorTokenCommand {
+    /** 鎿嶄綔瀵嗙爜 */
+    password?: string;
+  }
+
+  interface BuildOperatorTokenCommandResult {
+    /** 鎿嶄綔浠ょ墝 */
+    operatorToken?: string;
+  }
+
   interface ChangePhoneNumberCommand {
     /** 鎵嬫満鍙风爜 */
     phoneNumber: string;
@@ -416,9 +434,18 @@
 
   type CheckHealthQuery = Record<string, any>;
 
+  interface CheckOperatorTokenCommand {
+    /** 鎿嶄綔浠ょ墝 */
+    operatorToken?: string;
+  }
+
   interface CheckReceiveTaskCommand {
     /** 鎻愪氦Id */
     id?: string;
+    /** 绛惧埌鏃堕棿 */
+    checkInTime?: string;
+    /** 绛惧嚭鏃堕棿 */
+    checkOutTime?: string;
     checkReceiveStatus?: EnumTaskUserSubmitCheckReceiveStatus;
   }
 
@@ -494,6 +521,8 @@
   interface EditTaskSettlementOrderRosterCommand {
     /** 鍚嶅崟Id */
     id?: string;
+    /** 绱宸ユ椂 */
+    totalWorkHours?: number;
     /** 缁撶畻閲戦 */
     settlementAmount: number;
     /** 瀹炲彂閲戦 */
@@ -1015,6 +1044,15 @@
     Stopped = 100,
   }
 
+  enum EnumTaskSettlementAuditStatus {
+    /**寰呭鏍� */
+    Wait = 10,
+    /**瀹℃牳閫氳繃 */
+    Pass = 20,
+    /**椹冲洖 */
+    Fail = 30,
+  }
+
   enum EnumTaskSettlementOrderStatus {
     /**寰呬笂浼� */
     Wait = 10,
@@ -1069,14 +1107,25 @@
     Stop = 50,
   }
 
+  enum EnumTaskUserSubmitCheckHistoryType {
+    /**绛惧埌 */
+    CheckIn = 10,
+    /**绛惧嚭 */
+    CheckOut = 20,
+    /**鏈埌宀� */
+    UnCheckIn = 30,
+    /**鏈鍑� */
+    UnCheckOut = 40,
+  }
+
   enum EnumTaskUserSubmitCheckReceiveStatus {
     /**寰呮彁浜� */
     WaitSubmit = 10,
-    /**寰呴獙鏀�/鏈埌宀� */
+    /**寰呴獙鏀� */
     WaitCheckReceive = 20,
     /**楠屾敹閫氳繃/宸茬鍒� */
     Success = 30,
-    /**楠屾敹鏈�氳繃 */
+    /**楠屾敹鏈�氳繃/鏈埌宀� */
     Fail = 40,
   }
 
@@ -1313,6 +1362,24 @@
     timestamp?: number;
   }
 
+  interface FriendlyResultBuildOperatorTokenCommandResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: BuildOperatorTokenCommandResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
   interface FriendlyResultEnterpriseUserElectronSignCommandResult {
     /** 璺熻釜Id */
     traceId?: string;
@@ -1411,6 +1478,24 @@
     /** 閿欒鐮� */
     errorCode?: string;
     data?: GetCheckReceiveTasksQueryResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
+  interface FriendlyResultGetCheckReceiveTaskUserSubmitCheckHistoriesQueryResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetCheckReceiveTaskUserSubmitCheckHistoriesQueryResult;
     /** 鎵ц鎴愬姛 */
     success?: boolean;
     /** 閿欒淇℃伅 */
@@ -3373,6 +3458,12 @@
     /** 鏄惁瀹炲悕 */
     isReal?: boolean;
     realMethod?: EnumUserRealMethod;
+    /** 绛惧埌鏃堕棿 */
+    checkInTime?: string;
+    /** 绛惧嚭鏃堕棿 */
+    checkOutTime?: string;
+    /** 鎿嶄綔浜� */
+    operator?: string;
     /** 鏈�杩戞彁浜ゆ椂闂� */
     lastSubmitTime?: string;
     checkReceiveStatus?: EnumTaskCheckReceiveStatus;
@@ -3462,6 +3553,45 @@
     lastCheckReceiveTime?: string;
   }
 
+  interface GetCheckReceiveTaskUserSubmitCheckHistoriesQuery {
+    /** 浠诲姟Id */
+    taskInfoId?: string;
+    /** 鏃ユ湡 */
+    date?: string;
+    type?: EnumTaskUserSubmitCheckHistoryType;
+    pageModel?: PagedListQueryPageModel;
+  }
+
+  interface GetCheckReceiveTaskUserSubmitCheckHistoriesQueryResult {
+    pageModel?: PagedListQueryResultPageModel;
+    /** 鏁版嵁 */
+    data?: GetCheckReceiveTaskUserSubmitCheckHistoriesQueryResultItem[];
+  }
+
+  interface GetCheckReceiveTaskUserSubmitCheckHistoriesQueryResultItem {
+    /** 璁板綍Id */
+    id?: string;
+    /** 澶村儚 */
+    avatar?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 韬唤璇佸彿 */
+    identity?: string;
+    gender?: EnumUserGender;
+    /** 骞撮緞 */
+    age?: number;
+    /** 鎵嬫満鍙� */
+    contactPhoneNumber?: string;
+    /** 鏄惁瀹炲悕 */
+    isReal?: boolean;
+    realMethod?: EnumUserRealMethod;
+    /** 绛惧埌绛惧嚭鏃堕棿 */
+    checkTime?: string;
+    /** 鎿嶄綔浜� */
+    operator?: string;
+    type?: EnumTaskUserSubmitCheckHistoryType;
+  }
+
   interface GetCheckReceiveTaskUserSubmitQueryResult {
     /** 鎻愪氦Id */
     id?: string;
@@ -3495,6 +3625,12 @@
     id?: string;
     /** 楠屾敹鏃堕棿 */
     date?: string;
+    /** 绛惧埌鏃堕棿 */
+    checkInTime?: string;
+    /** 绛惧嚭鏃堕棿 */
+    checkOutTime?: string;
+    /** 鎿嶄綔浜� */
+    operator?: string;
     /** 鎻愪氦鏃堕棿 */
     createdTime?: string;
     /** 楠屾敹鐓х墖 */
@@ -5534,10 +5670,21 @@
   interface GetSettlementTaskUsersQueryResultDetail {
     /** 缁撶畻璁㈠崟Id */
     id?: string;
+    /** 鏍¢獙楠屾敹璧峰鏃ユ湡 */
+    checkReceiveBeginDate?: string;
+    /** 鏍¢獙楠屾敹鎴鏃ユ湡 */
+    checkReceiveEndDate?: string;
     /** 浠诲姟鍚嶇О */
     name?: string;
     /** 浠诲姟鍗曞彿 */
     code?: string;
+    billingMethod?: EnumBillingMethod;
+    /** 鏈嶅姟璐� */
+    serviceFee?: number;
+    /** 鏍稿畾宸ユ椂 */
+    verifyWorkHours?: number;
+    /** 瓒呮椂鏈嶅姟璐� */
+    timeoutServiceFee?: number;
     settlementOrderStatus?: EnumTaskSettlementOrderStatus;
     /** 缁撶畻鍗曞悕绉� */
     settlementOrderName?: string;
@@ -5557,6 +5704,8 @@
   interface GetSettlementTaskUsersQueryResultItem {
     /** 缁撶畻鍚嶅崟Id */
     id?: string;
+    /** 浠诲姟浜哄憳Id */
+    taskInfoUserId?: string;
     /** 鐢ㄦ埛淇℃伅Id */
     userId?: string;
     /** 濮撳悕 */
@@ -5565,6 +5714,8 @@
     identity?: string;
     /** 鎵嬫満鍙� */
     contactPhoneNumber?: string;
+    /** 绱宸ユ椂 */
+    totalWorkHours?: number;
     /** 鎵�灞為摱琛� */
     bank?: string;
     /** 寮�鎴锋敮琛屽悕绉� */
@@ -6435,6 +6586,8 @@
     bankBranch?: string;
     /** 鏀舵璐︽埛 */
     receiveAccount?: string;
+    /** 绱宸ユ椂 */
+    totalWorkHours?: number;
     /** 缁撶畻閲戦 */
     settlementAmount?: number;
     /** 瀹炲彂閲戦 */
@@ -7121,8 +7274,10 @@
     userName?: string;
     /** 鎵嬫満鍙� */
     phoneNumber?: string;
-    /** 瀵嗙爜 */
+    /** 瀵嗙爜锛堥�夊~ 濉簡灏辨敼涓嶅~灏变笉鏀癸級 */
     password?: string;
+    /** 鎿嶄綔瀵嗙爜锛堥�夊~ 濉簡灏辨敼涓嶅~灏变笉鏀癸級 */
+    operatorPassword?: string;
     /** 瑙掕壊Id */
     roleIds?: string[];
     status?: EnumUserStatus;
diff --git a/packages/services/apiV2/user.ts b/packages/services/apiV2/user.ts
index e62b980..eb29746 100644
--- a/packages/services/apiV2/user.ts
+++ b/packages/services/apiV2/user.ts
@@ -2,6 +2,36 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
+/** 鐢熸垚鎿嶄綔浠ょ墝 POST /api/user/user/buildOperatorToken */
+export async function buildOperatorToken(
+  body: API.BuildOperatorTokenCommand,
+  options?: API.RequestConfig
+) {
+  return request<API.BuildOperatorTokenCommandResult>('/api/user/user/buildOperatorToken', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏍¢獙鎿嶄綔浠ょ墝 POST /api/user/user/checkOperatorToken */
+export async function checkOperatorToken(
+  body: API.CheckOperatorTokenCommand,
+  options?: API.RequestConfig
+) {
+  return request<boolean>('/api/user/user/checkOperatorToken', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鍒犻櫎鐢ㄦ埛閾惰鍗′俊鎭� DELETE /api/user/user/deletePersonalUserBankCard */
 export async function deletePersonalUserBankCard(
   body: API.DeletePersonalUserBankCardCommand,

--
Gitblit v1.9.1