From 0c3184c4762ef8a3bf996500b2b97ccbb9640327 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期四, 13 十一月 2025 15:35:52 +0800
Subject: [PATCH] feat: 1.3.0.2

---
 apps/bMiniApp/src/subpackages/task/hooks/index.ts                              |  113 ----------------
 apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue         |    3 
 packages/hooks/index.ts                                                        |    1 
 packages/hooks/payrollChange.ts                                                |  113 ++++++++++++++++
 apps/underTakeMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue |  181 +++++++++++++++++++++++--
 5 files changed, 282 insertions(+), 129 deletions(-)

diff --git a/apps/bMiniApp/src/subpackages/task/hooks/index.ts b/apps/bMiniApp/src/subpackages/task/hooks/index.ts
index 39cfd25..e69de29 100644
--- a/apps/bMiniApp/src/subpackages/task/hooks/index.ts
+++ b/apps/bMiniApp/src/subpackages/task/hooks/index.ts
@@ -1,113 +0,0 @@
-import { Message, toRound } from '@12333/utils';
-import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
-import dayjs from 'dayjs';
-import { EnumTaskUserSubmitCheckReceiveStatus } from '@12333/constants';
-import { MaybeRef } from 'vue';
-
-type UseSettlementAmountOptions = {
-  id: MaybeRef<string>;
-  date: string;
-  onSuccess?: () => void;
-  taskInfoUserId: MaybeRef<string>;
-  timeoutServiceFee: MaybeRef<number>;
-};
-
-export function useSettlementAmount({
-  id,
-  date,
-  taskInfoUserId,
-  onSuccess,
-  timeoutServiceFee,
-}: UseSettlementAmountOptions) {
-  const dialogVisible = ref(false);
-
-  const form = reactive({
-    serviceFee: 0,
-    timeoutHours: 0,
-    timeoutFee: 0,
-    otherFee: 0,
-    remark: '',
-    timeoutServiceFee: 0,
-  });
-
-  const settlementAmount = computed(() => sumSettlementAmount());
-
-  function sumSettlementAmount() {
-    return toRound(
-      getFeeValue(Number(form.timeoutFee ?? 0)) +
-        getFeeValue(Number(form.serviceFee ?? 0)) +
-        getFeeValue(Number(form.otherFee ?? 0))
-    );
-  }
-
-  function getFeeValue(val: number) {
-    return val || 0;
-  }
-
-  async function openDialog(checkInTime: string) {
-    let res = await calcTaskCheckReceive(checkInTime);
-    if (res) {
-      dialogVisible.value = true;
-      form.serviceFee = res.serviceFee ?? 0;
-      form.timeoutHours = res.timeoutHours ?? 0;
-      form.otherFee = 0;
-      form.timeoutFee = 0;
-      form.remark = '';
-      form.timeoutServiceFee = unref(timeoutServiceFee) ?? 0;
-    }
-  }
-
-  async function calcTaskCheckReceive(checkInTime: string) {
-    try {
-      let params: API.CalcTaskCheckReceiveCommand = {
-        taskInfoId: unref(id),
-        checkInTime: !!checkInTime ? dayjs(checkInTime).format('YYYY-MM-DD HH:mm:ss') : null,
-        checkOutTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
-      };
-      return await taskCheckReceiveServices.calcTaskCheckReceive(params);
-    } catch (error) {}
-  }
-
-  function handleCancel() {
-    dialogVisible.value = false;
-  }
-
-  async function handleConfirm() {
-    try {
-      let params: API.CheckReceiveTaskCommand = {
-        taskInfoUserId: unref(taskInfoUserId),
-        date: dayjs(date).format('YYYY-MM-DD'),
-        checkReceiveStatus: EnumTaskUserSubmitCheckReceiveStatus.Success,
-        serviceFee: form.serviceFee,
-        timeoutHours: form.timeoutHours,
-        timeoutFee: form.timeoutFee,
-        otherFee: form.otherFee,
-        remark: form.remark,
-        settlementAmount: settlementAmount.value,
-      };
-      let res = await taskCheckReceiveServices.checkReceiveTask(params);
-      if (res) {
-        Message.success('鎻愪氦鎴愬姛');
-        dialogVisible.value = false;
-        //   infiniteLoadingProps.value?.refetch?.();
-        onSuccess?.();
-      }
-    } catch (error) {}
-  }
-
-  function onTimeoutHoursChange(event: any) {
-    form.timeoutFee = Number(form.timeoutServiceFee)
-      ? form.timeoutServiceFee * event.detail.value
-      : 0;
-  }
-
-  return {
-    dialogVisible,
-    form,
-    settlementAmount,
-    handleCancel,
-    openDialog,
-    handleConfirm,
-    onTimeoutHoursChange,
-  };
-}
diff --git a/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
index 522a51b..4320d15 100644
--- a/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
@@ -147,8 +147,7 @@
 import { Message, setOSSLink } from '@12333/utils';
 import dayjs from 'dayjs';
 import { goBack } from '@/utils';
-import { useCheckReceiveTaskUserSubmit } from '@12333/hooks';
-import { useSettlementAmount } from '../hooks';
+import { useCheckReceiveTaskUserSubmit, useSettlementAmount } from '@12333/hooks';
 
 defineOptions({
   name: 'InnerPage',
diff --git a/apps/underTakeMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue b/apps/underTakeMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
index d66bb31..5d00235 100644
--- a/apps/underTakeMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
+++ b/apps/underTakeMiniApp/src/subpackages/task/taskHandleCheckDetail/InnerPage.vue
@@ -9,26 +9,132 @@
           :contactPhoneNumber="detail?.enterpriseEmployeeUser?.contactPhoneNumber"
         />
       </div>
-      <div class="taskCheckFileCard-status-title">楠屾敹鐓х墖</div>
+      <div class="taskCheckFileCard-status-title">楠屾敹璇︽儏</div>
       <TaskCheckFileCard
         :created-time="detail?.createdTime"
+        :userCheckInTime="detail?.userCheckInTime"
+        :userCheckOutTime="detail?.userCheckOutTime"
+        :checkInTime="detail?.checkInTime"
+        :checkOutTime="detail?.checkOutTime"
+        :checkReceiveMethods="detail?.checkReceiveMethods"
         :files="detail?.files?.map((x) => setOSSLink(x))"
+        userCheckLabelPrefix="鐢ㄦ埛"
+        showCheckTime
       ></TaskCheckFileCard>
     </ContentScrollView>
-    <!-- <PageFooter>
+    <PageFooter>
       <PageFooterBtn
         type="primary"
         :color="Colors.Info"
         class="dark-btn"
-        @click="checkReceiveTask(EnumTaskUserSubmitCheckReceiveStatus.Fail)"
-        >楠屾敹鏈�氳繃</PageFooterBtn
+        @click="openDialog(detail?.checkInTime ?? '')"
+        >淇敼鏈嶅姟璐�</PageFooterBtn
       >
-      <PageFooterBtn
-        type="primary"
-        @click="checkReceiveTask(EnumTaskUserSubmitCheckReceiveStatus.Success)"
-        >楠屾敹閫氳繃</PageFooterBtn
-      >
-    </PageFooter> -->
+      <PageFooterBtn type="primary" @click="checkReceiveTask()">楠屾敹</PageFooterBtn>
+    </PageFooter>
+    <nut-popup v-model:visible="dialogVisible">
+      <div class="payroll-form-wrapper">
+        <nut-form :model-value="form" ref="formRef">
+          <nut-form-item
+            label="鏈嶅姟璐�:"
+            class="bole-form-item"
+            prop="serviceFee"
+            label-width="90px"
+          >
+            <div class="bole-form-input-wrapper">
+              <NumberInput
+                v-model.trim="form.serviceFee"
+                class="nut-input-text bole-input-text"
+                placeholder="璇疯緭鍏ユ湇鍔¤垂"
+                :min="0"
+                :max="999999999999"
+                :precision="2"
+                type="text"
+                disabled
+              />
+              <div class="form-input-unit">鍏�</div>
+            </div>
+          </nut-form-item>
+          <nut-form-item
+            label="瓒呮椂:"
+            class="bole-form-item"
+            prop="timeoutHours"
+            label-width="90px"
+          >
+            <div class="bole-form-input-wrapper">
+              <NumberInput
+                v-model.trim="form.timeoutHours"
+                class="nut-input-text bole-input-text"
+                placeholder="璇疯緭鍏ヨ秴鏃舵椂闀�"
+                :min="0"
+                :max="999999999999"
+                :precision="2"
+                type="text"
+                @change="onTimeoutHoursChange"
+              />
+              <div class="form-input-unit">灏忔椂</div>
+            </div>
+          </nut-form-item>
+          <nut-form-item
+            label="瓒呮椂璐圭敤:"
+            class="bole-form-item"
+            prop="timeoutFee"
+            label-width="90px"
+          >
+            <div class="bole-form-input-wrapper">
+              <NumberInput
+                v-model.trim="form.timeoutFee"
+                class="nut-input-text bole-input-text"
+                placeholder="璇疯緭鍏ヨ秴鏃惰垂鐢�"
+                :min="0"
+                :max="999999999999"
+                :precision="2"
+                type="text"
+              />
+              <div class="form-input-unit">鍏�</div>
+            </div>
+          </nut-form-item>
+          <nut-form-item
+            label="鍏朵粬璐圭敤:"
+            class="bole-form-item"
+            prop="otherFee"
+            label-width="90px"
+          >
+            <div class="bole-form-input-wrapper">
+              <NumberInput
+                v-model.trim="form.otherFee"
+                class="nut-input-text bole-input-text"
+                placeholder="璇疯緭鍏ュ叾浠栬垂鐢�"
+                :max="999999999999"
+                :precision="2"
+                type="text"
+              />
+              <div class="form-input-unit">鍏�</div>
+            </div>
+          </nut-form-item>
+          <nut-form-item
+            label="缁撶畻閲戦:"
+            class="bole-form-item"
+            prop="settlementAmount"
+            label-width="90px"
+          >
+            {{ `${settlementAmount}鍏僠 }}
+          </nut-form-item>
+          <nut-form-item
+            label="澶囨敞:"
+            class="bole-form-item alignTop"
+            prop="remark"
+            label-width="90px"
+          >
+            <nut-textarea v-model="form.remark" rows="4" placeholder="璇疯緭鍏ュ娉�"> </nut-textarea>
+          </nut-form-item>
+        </nut-form>
+        <div class="payroll-form-footer">
+          <nut-button @click="handleCancel">鍙栨秷</nut-button>
+          <nut-button type="primary" @click="handleConfirm">纭</nut-button>
+        </div>
+      </div>
+    </nut-popup>
   </LoadingLayout>
 </template>
 
@@ -36,12 +142,12 @@
 import Taro from '@tarojs/taro';
 import { useQuery } from '@tanstack/vue-query';
 import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
-import { TaskCheckFileCard, TaskCheckPersonalView } from '@12333/components';
+import { TaskCheckFileCard, TaskCheckPersonalView, NumberInput } from '@12333/components';
 import { Colors, EnumTaskUserSubmitCheckReceiveStatus } from '@12333/constants';
 import { Message, setOSSLink } from '@12333/utils';
 import dayjs from 'dayjs';
 import { goBack } from '@/utils';
-import { useCheckReceiveTaskUserSubmit } from '@12333/hooks';
+import { useCheckReceiveTaskUserSubmit, useSettlementAmount } from '@12333/hooks';
 
 defineOptions({
   name: 'InnerPage',
@@ -49,6 +155,7 @@
 
 const router = Taro.useRouter();
 const id = router.params?.id ?? '';
+const taskInfoId = router.params?.taskInfoId ?? '';
 const date = router.params?.date ?? '';
 
 const { isLoading, isError, detail, refetch } = useCheckReceiveTaskUserSubmit({
@@ -58,11 +165,33 @@
   },
 });
 
-async function checkReceiveTask(checkReceiveStatus: EnumTaskUserSubmitCheckReceiveStatus) {
+const {
+  dialogVisible,
+  form,
+  settlementAmount,
+  handleCancel,
+  openDialog,
+  handleConfirm,
+  onTimeoutHoursChange,
+} = useSettlementAmount({
+  taskInfoUserId: id,
+  id: taskInfoId,
+  timeoutServiceFee: computed(() => detail.value?.timeoutServiceFee),
+  date,
+  onSuccess() {
+    Message.success('鎻愪氦鎴愬姛', {
+      onClosed() {
+        goBack();
+      },
+    });
+  },
+});
+
+async function checkReceiveTask() {
   try {
     let params: API.CheckReceiveTaskCommand = {
       id: detail.value?.id,
-      checkReceiveStatus: checkReceiveStatus,
+      checkReceiveStatus: EnumTaskUserSubmitCheckReceiveStatus.Success,
     };
     let res = await taskCheckReceiveServices.checkReceiveTask(params);
     if (res) {
@@ -94,5 +223,29 @@
     border-bottom: 1px solid #d9d9d9;
     margin-bottom: 22px;
   }
+
+  .bole-form-input-wrapper {
+    display: flex;
+    align-items: center;
+  }
+
+  .form-input-unit {
+    margin-left: 10px;
+    color: boleGetCssVar('text-color', 'primary');
+    flex-shrink: 0;
+  }
+
+  .payroll-form-wrapper {
+    width: 600px;
+  }
+
+  .payroll-form-footer {
+    padding: 10px 20px;
+    text-align: center;
+
+    .nut-button + .nut-button {
+      margin-left: 20px;
+    }
+  }
 }
 </style>
diff --git a/packages/hooks/index.ts b/packages/hooks/index.ts
index cfdc8fd..d03ed55 100644
--- a/packages/hooks/index.ts
+++ b/packages/hooks/index.ts
@@ -8,3 +8,4 @@
 export * from './task';
 export * from './taskUser';
 export * from './user';
+export * from './payrollChange';
diff --git a/packages/hooks/payrollChange.ts b/packages/hooks/payrollChange.ts
new file mode 100644
index 0000000..e9e276b
--- /dev/null
+++ b/packages/hooks/payrollChange.ts
@@ -0,0 +1,113 @@
+import { Message, toRound } from '@12333/utils';
+import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
+import dayjs from 'dayjs';
+import { EnumTaskUserSubmitCheckReceiveStatus } from '@12333/constants';
+import { computed, MaybeRef, reactive, ref, unref } from 'vue';
+
+type UseSettlementAmountOptions = {
+  id: MaybeRef<string>;
+  date: string;
+  onSuccess?: () => void;
+  taskInfoUserId: MaybeRef<string>;
+  timeoutServiceFee: MaybeRef<number>;
+};
+
+export function useSettlementAmount({
+  id,
+  date,
+  taskInfoUserId,
+  onSuccess,
+  timeoutServiceFee,
+}: UseSettlementAmountOptions) {
+  const dialogVisible = ref(false);
+
+  const form = reactive({
+    serviceFee: 0,
+    timeoutHours: 0,
+    timeoutFee: 0,
+    otherFee: 0,
+    remark: '',
+    timeoutServiceFee: 0,
+  });
+
+  const settlementAmount = computed(() => sumSettlementAmount());
+
+  function sumSettlementAmount() {
+    return toRound(
+      getFeeValue(Number(form.timeoutFee ?? 0)) +
+        getFeeValue(Number(form.serviceFee ?? 0)) +
+        getFeeValue(Number(form.otherFee ?? 0))
+    );
+  }
+
+  function getFeeValue(val: number) {
+    return val || 0;
+  }
+
+  async function openDialog(checkInTime: string) {
+    let res = await calcTaskCheckReceive(checkInTime);
+    if (res) {
+      dialogVisible.value = true;
+      form.serviceFee = res.serviceFee ?? 0;
+      form.timeoutHours = res.timeoutHours ?? 0;
+      form.otherFee = 0;
+      form.timeoutFee = 0;
+      form.remark = '';
+      form.timeoutServiceFee = unref(timeoutServiceFee) ?? 0;
+    }
+  }
+
+  async function calcTaskCheckReceive(checkInTime: string) {
+    try {
+      let params: API.CalcTaskCheckReceiveCommand = {
+        taskInfoId: unref(id),
+        checkInTime: !!checkInTime ? dayjs(checkInTime).format('YYYY-MM-DD HH:mm:ss') : null,
+        checkOutTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+      };
+      return await taskCheckReceiveServices.calcTaskCheckReceive(params);
+    } catch (error) {}
+  }
+
+  function handleCancel() {
+    dialogVisible.value = false;
+  }
+
+  async function handleConfirm() {
+    try {
+      let params: API.CheckReceiveTaskCommand = {
+        taskInfoUserId: unref(taskInfoUserId),
+        date: dayjs(date).format('YYYY-MM-DD'),
+        checkReceiveStatus: EnumTaskUserSubmitCheckReceiveStatus.Success,
+        serviceFee: form.serviceFee,
+        timeoutHours: form.timeoutHours,
+        timeoutFee: form.timeoutFee,
+        otherFee: form.otherFee,
+        remark: form.remark,
+        settlementAmount: settlementAmount.value,
+      };
+      let res = await taskCheckReceiveServices.checkReceiveTask(params);
+      if (res) {
+        Message.success('鎻愪氦鎴愬姛');
+        dialogVisible.value = false;
+        //   infiniteLoadingProps.value?.refetch?.();
+        onSuccess?.();
+      }
+    } catch (error) {}
+  }
+
+  function onTimeoutHoursChange(event: any) {
+    form.timeoutFee = Number(form.timeoutServiceFee)
+      ? form.timeoutServiceFee * event.detail.value
+      : 0;
+  }
+
+  return {
+    dialogVisible,
+    form,
+    settlementAmount,
+    handleCancel,
+    openDialog,
+    handleConfirm,
+    onTimeoutHoursChange,
+  };
+}

--
Gitblit v1.9.1