<template>
|
<LoadingLayout>
|
<ContentView>
|
<MyTaskCard
|
:name="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.name"
|
:addressName="infiniteLoadingProps?.listData?.pages?.[0]?.objectData?.addressName"
|
:showMyTaskArrow="false"
|
:showTime="false"
|
></MyTaskCard>
|
<ChunkTitle title="验收列表" />
|
</ContentView>
|
<InfiniteLoading
|
scrollViewClassName="common-infinite-scroll-list"
|
v-bind="infiniteLoadingProps"
|
>
|
<template #renderItem="{ item }">
|
<TaskCheckCard
|
:avatar="setOSSLink(item.avatar)"
|
:name="item.name"
|
: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"
|
disabled
|
/>
|
<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 * as taskCheckReceiveServices from '@12333/services/apiV2/taskCheckReceive';
|
import { useInfiniteLoading } from '@12333/hooks';
|
import TaskCheckCard from '../components/TaskCheckCard.vue';
|
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 id = router.params?.id ?? '';
|
const date = router.params?.date ?? '';
|
const checkReceiveStatus = Number(router.params?.checkReceiveStatus);
|
|
const dialogVisible = ref(false);
|
|
const form = reactive({
|
serviceFee: 0,
|
timeoutHours: 0,
|
timeoutFee: 0,
|
otherFee: 0,
|
remark: '',
|
timeoutServiceFee: 0,
|
|
taskInfoId: '',
|
checkInTime: '',
|
checkoutTime: '',
|
});
|
|
const detail = ref<API.GetCheckReceiveTasksQueryResultItem>();
|
|
const { infiniteLoadingProps } = useInfiniteLoading(
|
async ({ pageParam }) => {
|
let params: API.GetCheckReceiveTaskQuery = {
|
pageModel: {
|
rows: 20,
|
page: pageParam,
|
},
|
taskInfoId: id,
|
date: dayjs(date).format('YYYY-MM-DD'),
|
checkReceiveStatus: checkReceiveStatus,
|
};
|
|
let res = await taskCheckReceiveServices.getCheckReceiveTask(params, {
|
showLoading: false,
|
});
|
detail.value = res.objectData;
|
return res;
|
},
|
{
|
queryKey: ['taskCheckReceiveServices/getCheckReceiveTask'],
|
}
|
);
|
|
const settlementAmount = computed(() => sumSettlementAmount());
|
|
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;
|
form.timeoutHours = res.timeoutHours;
|
form.timeoutFee = res.timeoutFee;
|
form.otherFee = 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>
|