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