You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
5.1 KiB
165 lines
5.1 KiB
<template>
|
|
<view class="p-4 flex justify-between items-center">
|
|
<view>
|
|
<u-button class="m-0" size="mini" type="primary" @click="punch(0)" v-if="!currPunchInfo.morningStatus">早打卡</u-button>
|
|
|
|
<template v-else>
|
|
<!-- 1 待审核 2 已驳回 3 已通过 -->
|
|
<view :class="{'relative': currPunchInfo.morningStatus === 1}">
|
|
<text class="font-semibold"
|
|
:class="{'line-through text-red-500': currPunchInfo.morningStatus === 2, 'text-cyan': currPunchInfo.morningStatus === 3}"
|
|
>
|
|
{{ dayjs(+currPunchInfo.morning).format("HH:mm") }}
|
|
</text>
|
|
|
|
<!-- 小红点 -->
|
|
<u-badge v-if="currPunchInfo.morningStatus === 1"
|
|
:is-dot="true" type="error" size="mini" style="top: -2px; right: -10px;"
|
|
></u-badge>
|
|
</view>
|
|
</template>
|
|
</view>
|
|
|
|
<view>
|
|
<u-button class="m-0" size="mini" type="primary" @click="punch(1)" v-if="!currPunchInfo.nightStatus">晚打卡</u-button>
|
|
|
|
<template v-else>
|
|
<!-- 1 待审核 2 已驳回 3 已通过 -->
|
|
<view :class="{'relative': currPunchInfo.nightStatus === 1}">
|
|
<text class="font-semibold"
|
|
:class="{'line-through text-red-500': currPunchInfo.nightStatus === 2, 'text-cyan': currPunchInfo.nightStatus === 3}"
|
|
>
|
|
{{ dayjs(+currPunchInfo.night).format("HH:mm") }}
|
|
</text>
|
|
|
|
<!-- 小红点 -->
|
|
<u-badge v-if="currPunchInfo.nightStatus === 1"
|
|
:is-dot="true" type="error" size="mini" style="top: -2px; right: -10px;"
|
|
></u-badge>
|
|
</view>
|
|
</template>
|
|
</view>
|
|
|
|
<!-- 审核人 -->
|
|
<view class="flex items-center">
|
|
<view class="mr-2 flex items-center rounded-md border-gray-200"
|
|
:class="{'px-2 py-1 border border-solid': !(currPunchInfo.morning && currPunchInfo.night)}"
|
|
@click="showCheckerList">
|
|
<text>{{ checkerName ? checkerName : members[0].name }}</text>
|
|
<u-icon v-if="!(currPunchInfo.morning && currPunchInfo.night)" class="ml-3" size="24" name="arrow-down"></u-icon>
|
|
</view>
|
|
|
|
<u-icon size="30" name="arrow-right" @click="toDetail"></u-icon>
|
|
|
|
<u-select v-model="show" :list="list" @confirm="confirm"></u-select>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed, onMounted, ref, watch } from 'vue';
|
|
import { useStore } from 'vuex';
|
|
import dayjs from 'dayjs';
|
|
|
|
const store = useStore();
|
|
const projectId = computed(() => store.getters['project/projectId']);
|
|
const roleId = computed(() => store.state.role.roleId);
|
|
const members = computed(() => store.state.role.members); // 检查人列表
|
|
const businessCode = computed(() => store.state.task.businessCode); // 服务名
|
|
|
|
let currPunchInfo = ref({}); // 当前用户打卡信息
|
|
const show = ref(false); // 是否展示审核人列表
|
|
let list = ref([]); // 审核人列表
|
|
let checkerId = ref(null); // 选择的审核人id
|
|
let checkerName = ref(null); // 选择的审核人姓名
|
|
|
|
onMounted(async () => {
|
|
// 用户数据处理
|
|
await handleUser();
|
|
await getClockQuery();
|
|
})
|
|
|
|
// 数据
|
|
async function handleUser() {
|
|
// 当前登录用户
|
|
list.value = [];
|
|
members.value.forEach(item => {
|
|
list.value.push({
|
|
value: item.memberId,
|
|
label: item.name
|
|
})
|
|
|
|
if (item.name === '周勇') {
|
|
checkerId.value = item.memberId;
|
|
checkerName.value = item.name;
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
/**
|
|
* 批量查询打卡信息
|
|
*/
|
|
async function getClockQuery() {
|
|
let startTime = dayjs().startOf('day').valueOf().toString();
|
|
let endTime = dayjs().endOf('day').valueOf().toString();
|
|
|
|
try {
|
|
const params = { projectId: projectId.value, roleId: roleId.value, memberIdList: [], startTime, endTime }
|
|
const data = await uni.$u.api.clockQuery(params);
|
|
|
|
currPunchInfo.value = data[0].recordList[0];
|
|
checkerId.value = currPunchInfo.value.lastCheckerId ? currPunchInfo.value.lastCheckerId : currPunchInfo.value.checkerId ? currPunchInfo.value.checkerId : checkerId.value;
|
|
checkerName.value = currPunchInfo.value.lastCheckerName ? currPunchInfo.value.lastCheckerName : currPunchInfo.value.checkerName ? currPunchInfo.value.checkerName : checkerName.value;
|
|
} catch (error) {
|
|
console.log('error: ', error);
|
|
}
|
|
}
|
|
|
|
function showCheckerList() {
|
|
if (!(currPunchInfo.morning && currPunchInfo.night)) {
|
|
show.value = true
|
|
}
|
|
}
|
|
|
|
// 选择审核人结果
|
|
function confirm(e) {
|
|
checkerId.value = e[0].value;
|
|
checkerName.value = e[0].label;
|
|
}
|
|
|
|
// 打卡
|
|
async function punch(clockType) {
|
|
try {
|
|
const params = {
|
|
checkerId: checkerId.value,
|
|
id: currPunchInfo.value.id,
|
|
memberId: currPunchInfo.value.memberId,
|
|
dateTime: dayjs().valueOf(),
|
|
clockType,
|
|
longitude: "",
|
|
latitude: ""
|
|
}
|
|
|
|
const data = await uni.$u.api.clockPunch(params);
|
|
|
|
getClockQuery(); // 打卡成功重新加载打卡信息
|
|
} catch (error) {
|
|
console.log('error: ', error);
|
|
}
|
|
}
|
|
|
|
function toDetail() {
|
|
uni.$storage.setStorageSync('pluginKey', 'checkWork');
|
|
|
|
uni.navigateTo({
|
|
url: "/pages/detail/detail"
|
|
})
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.text-cyan {
|
|
color: #13acc4;
|
|
}
|
|
</style>
|
|
|