From ccc340793f1cf2c3932be705c69fa5906033f989 Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期一, 27 十月 2025 18:27:46 +0800
Subject: [PATCH] fix: bug

---
 apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue |  341 +++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 297 insertions(+), 44 deletions(-)

diff --git a/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
index a91b416..b98f5c7 100644
--- a/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
+++ b/apps/bMiniApp/src/subpackages/task/taskCheckDetail/InnerPage.vue
@@ -1,9 +1,9 @@
 <template>
-  <LoadingLayout :loading="isLoading" :error="isError" :loadError="refetch">
+  <LoadingLayout>
     <ContentView>
       <MyTaskCard
-        :namee="detail.name"
-        :addressName="detail.addressName"
+        :name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.name"
+        :addressName="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.addressName"
         :showMyTaskArrow="false"
         :showTime="false"
       ></MyTaskCard>
@@ -12,84 +12,337 @@
     <InfiniteLoading
       scrollViewClassName="common-infinite-scroll-list"
       v-bind="infiniteLoadingProps"
-      :key="queryState.status"
     >
       <template #renderItem="{ item }">
         <TaskCheckCard
-          :avatarUrl="setOSSLink(item.avatarUrl)"
+          :avatar="setOSSLink(item.avatar)"
           :name="item.name"
-          :genderType="item.genderType"
-          :isRealName="item.isRealName"
-          :contactPhone="item.contactPhone"
-          :checkAcceptStatus="item.checkAcceptStatus"
-          @click="goHandleTaskDetail(item)"
+          :gender="item.gender"
+          :isReal="item.isReal"
+          :checkInTime="item.checkInTime"
+          :checkOutTime="item.checkOutTime"
+          :contactPhoneNumber="item.contactPhoneNumber"
+          :checkReceiveStatus="item.checkReceiveStatus"
+          :checkReceiveMethod="detail?.checkReceiveMethod"
+          :submitCheckReceiveStatus="item.submitCheckReceiveStatus"
+          @checkReceive="goTaskDetail(item)"
+          @checkInOrOut="(ev) => checkReceiveTask(ev, item)"
         />
       </template>
     </InfiniteLoading>
+    <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>
 
 <script setup lang="ts">
 import Taro from '@tarojs/taro';
-import { useQuery } from '@tanstack/vue-query';
-import * as taskServices from '@12333/services/apiV2/task';
+import * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
 import { useInfiniteLoading } from '@12333/hooks';
-import { OrderInputType } from '@12333/constants';
 import TaskCheckCard from '../components/TaskCheckCard.vue';
-import { MyTaskCard } from '@12333/components';
-import { setOSSLink } from '@12333/utils';
+import { MyTaskCard, NumberInput } from '@12333/components';
+import {
+  EnumTaskCheckReceiveMethod,
+  EnumTaskCheckReceiveStatus,
+  EnumTaskUserSubmitCheckReceiveStatus,
+} from '@12333/constants';
+import { Message, setOSSLink } from '@12333/utils';
+import dayjs from 'dayjs';
 
 defineOptions({
   name: 'InnerPage',
 });
 
 const router = Taro.useRouter();
-const taskId = router.params?.taskId ?? '';
+const id = router.params?.id ?? '';
+const date = router.params?.date ?? '';
+const checkReceiveStatus = Number(router.params?.checkReceiveStatus);
 
-const {
-  isLoading,
-  isError,
-  data: detail,
-  refetch,
-} = useQuery({
-  queryKey: ['taskServices/getTaskInfo', taskId],
-  queryFn: async () => {
-    return await taskServices.getTaskInfo(
-      { id: taskId },
-      {
-        showLoading: false,
-      }
-    );
-  },
-  placeholderData: () => ({} as API.GetTaskInfoQueryResult),
+const dialogVisible = ref(false);
+
+const form = reactive({
+  serviceFee: 0,
+  timeoutHours: 0,
+  timeoutFee: 0,
+  otherFee: 0,
+  remark: '',
+  timeoutServiceFee: 0,
+
+  taskInfoId: '',
+  checkInTime: '',
+  checkoutTime: '',
 });
 
-const queryState = reactive({
-  status: 10,
-});
+const detail = ref<API.GetCheckReceiveTasksQueryResultItem>();
 
 const { infiniteLoadingProps } = useInfiniteLoading(
-  ({ pageParam }) => {
-    let params: API.GetFlexTaskWorkerCheckListInput = {
+  async ({ pageParam }) => {
+    let params: API.GetCheckReceiveTaskQuery = {
       pageModel: {
         rows: 20,
         page: pageParam,
-        orderInput: [{ property: 'lastShelfTime', order: OrderInputType.Desc }],
       },
+      taskInfoId: id,
+      date: dayjs(date).format('YYYY-MM-DD'),
+      checkReceiveStatus: checkReceiveStatus,
     };
 
-    return flexWorkerServices.getFlexTaskWorkerCheckList(params, {
+    let res = await taskCheckReceiveServices.getCheckReceiveTask(params, {
       showLoading: false,
     });
+    detail.value = res.objectData;
+    return res;
   },
   {
-    queryKey: ['flexWorkerServices/getFlexTaskWorkerCheckList', queryState],
+    queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'],
   }
 );
 
-function goHandleTaskDetail(item: API.GetNewestWorkerListOutput) {
-  Taro.navigateTo({
-    url: `${RouterPath.taskHandleCheckDetail}?userId=${item.userId}&taskId=${taskId}`,
-  });
+const settlementAmount = computed(() => sumSettlementAmount());
+
+function onTimeoutHoursChange(event: any) {
+  form.timeoutFee = Number(form.timeoutServiceFee)
+    ? form.timeoutServiceFee * event.detail.value
+    : 0;
+}
+
+function sumSettlementAmount() {
+  return (
+    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(item: API.GetCheckReceiveTaskQueryResultItem) {
+  let res = await calcTaskCheckReceive(item);
+  if (res) {
+    dialogVisible.value = true;
+    form.taskInfoId = item.id;
+    form.serviceFee = res.serviceFee ?? 0;
+    form.timeoutHours = res.timeoutHours ?? 0;
+    form.timeoutServiceFee = detail.value?.timeoutServiceFee ?? 0;
+    form.otherFee = 0;
+    form.timeoutFee = 0;
+    form.remark = '';
+  }
+}
+
+function handleCancel() {
+  dialogVisible.value = false;
+}
+
+async function handleConfirm() {
+  try {
+    let params: API.CheckReceiveTaskCommand = {
+      taskInfoUserId: form.taskInfoId,
+      date: dayjs(date).format('YYYY-MM-DD'),
+      checkOutTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+      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?.();
+    }
+  } catch (error) {}
+}
+
+async function calcTaskCheckReceive(item: API.GetCheckReceiveTaskQueryResultItem) {
+  try {
+    let params: API.CalcTaskCheckReceiveCommand = {
+      taskInfoId: id,
+      checkInTime: dayjs(item.checkInTime).format('YYYY-MM-DD HH:mm:ss'),
+      checkOutTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+    };
+    return await taskCheckReceiveServices.calcTaskCheckReceive(params);
+  } catch (error) {}
+}
+
+function goTaskDetail(item: API.GetCheckReceiveTaskQueryResultItem) {
+  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}`,
+      });
+    }
+  }
+}
+
+async function checkReceiveTask(
+  ev: EnumTaskUserSubmitCheckReceiveStatus,
+  item: API.GetCheckReceiveTaskQueryResultItem
+) {
+  try {
+    let params: API.CheckReceiveTaskCommand = {
+      taskInfoUserId: item.id,
+      date: dayjs(date).format('YYYY-MM-DD'),
+    };
+    if (ev === EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive) {
+      params.checkInTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
+      params.checkReceiveStatus = ev;
+    } else if (ev === EnumTaskUserSubmitCheckReceiveStatus.Success) {
+      openDialog(item);
+      return;
+      // params.checkOutTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
+      // params.checkReceiveStatus = ev;
+    } else if (ev === EnumTaskUserSubmitCheckReceiveStatus.Fail) {
+      params.checkReceiveStatus = ev;
+    }
+    let res = await taskCheckReceiveServices.checkReceiveTask(params);
+    if (res) {
+      Message.success('鎻愪氦鎴愬姛');
+      infiniteLoadingProps.value?.refetch?.();
+    }
+  } catch (error) {}
 }
 </script>
+<style lang="scss">
+@import '@/styles/common.scss';
+
+.taskCheckDetail-page-wrapper {
+  .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>

--
Gitblit v1.9.1