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.
234 lines
6.1 KiB
234 lines
6.1 KiB
<template>
|
|
<view class="search-box fixed z-10 p-4 w-full bg-white shadow-lg">
|
|
<view class="flex">
|
|
<u-input class="mr-3" v-model="startTimeValue" type="text" :border="true" height="64" @focus="openCal" />
|
|
<u-input v-model="endTimeValue" type="text" :border="true" height="64" @focus="openCal" />
|
|
</view>
|
|
|
|
<u-input class="mt-3" v-model="selectedMembers" type="text" :border="true" height="64" @focus="openMember" />
|
|
|
|
<view class="mt-3 text-center">
|
|
<u-button class="mr-3" size="mini" @click="closePopup">取消</u-button>
|
|
<u-button class="mr-3" type="primary" size="mini" @click="submitSearch(1)">过滤</u-button>
|
|
<u-button type="primary" size="mini" @click="submitSearch(2)">导出</u-button>
|
|
</view>
|
|
|
|
<u-popup title="请选择角色" mode="bottom" v-model="showMembers" :mask-close-able="false">
|
|
<view class="multiple-select-box">
|
|
<view class="multiple-select-title flex justify-between items-center">
|
|
<view @click="handleCancel">取消</view>
|
|
<view @click="handleOK" class="text-blue-500">确认</view>
|
|
</view>
|
|
<scroll-view scroll-y="true" style="height: 400rpx;">
|
|
<view v-for="(item, index) in members" :key="index" @click="changeItem(item)"
|
|
class="multiple-select-item flex items-center justify-between"
|
|
:class="[selectedMemberId.indexOf(item.value) > -1 ? 'selected' : '']"
|
|
>
|
|
<text>{{ item.label }} </text>
|
|
<u-icon name="checkbox-mark" class="icon"></u-icon>
|
|
</view>
|
|
</scroll-view>
|
|
</view>
|
|
</u-popup>
|
|
|
|
<u-calendar v-if="!source" v-model="showCal" mode="range" @change="change"></u-calendar>
|
|
|
|
<template v-if="source === 'checkWorkSummary'">
|
|
<u-picker mode="time" v-model="showCal" :params="params" @confirm="selectedStartTime"></u-picker>
|
|
<u-picker mode="time" v-model="showEndCal" :params="params" @confirm="selectedEndTime"></u-picker>
|
|
</template>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { onMounted, ref } from 'vue';
|
|
import { useStore } from 'vuex';
|
|
import dayjs from 'dayjs';
|
|
|
|
const props = defineProps({
|
|
// 打点日期的自定义样式
|
|
members: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
show: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
source: {
|
|
type: String,
|
|
default: ""
|
|
}
|
|
});
|
|
const emit = defineEmits(['closePopup', 'getClockQuery']);
|
|
|
|
const store = useStore();
|
|
let startTimeValue = ref(null); // 当前选择的时间
|
|
let endTimeValue = ref(null); // 当前选择的时间
|
|
let showCal = ref(false); // 日历弹框是否显示
|
|
let showEndCal = ref(false); // 结束时间弹框是否显示
|
|
|
|
let showMembers = ref(false); // 用户列表弹框是否显示
|
|
let defaultMembers = ref([]); // 用户选择初始值
|
|
let selectedMemberArr = ref([]);
|
|
let selectedMemberName = ref([]); // 被选中的用户
|
|
let selectedMemberId = ref([]); // 被选中的用户
|
|
let selectedMembers = ref(null);
|
|
|
|
let selectedRoles = ref([]);
|
|
|
|
const params = ref({ year: true, month: true, day: false, hour: false, minute: false, second: false })
|
|
|
|
// 打开日历弹框
|
|
function openCal() {
|
|
showCal.value = true;
|
|
}
|
|
|
|
// 选择时间
|
|
function change(e) {
|
|
startTimeValue.value = e.startDate;
|
|
endTimeValue.value = e.endDate;
|
|
}
|
|
|
|
// 打开月份弹框
|
|
function selectedStartTime(e) {
|
|
showEndCal.value = true;
|
|
startTimeValue.value = e.year + '-' + e.month;
|
|
}
|
|
|
|
// 打开结束月份弹框
|
|
function selectedEndTime(e) {
|
|
endTimeValue.value = e.year + '-' + e.month;
|
|
}
|
|
|
|
// 打开用户列表
|
|
function openMember() {
|
|
showMembers.value = true;
|
|
|
|
// 再次打开弹框,之前的数据显示问题处理(只显示选中且确认的,选中之后未确认但是关闭弹框,之后选中的数据不显示)
|
|
selectedMemberId.value = [];
|
|
let curr = (selectedMembers.value || "").split(",");
|
|
let arr = [];
|
|
selectedMemberArr.value.forEach(member => {
|
|
const index = curr.findIndex(item => item === member.label);
|
|
|
|
if (index > -1) {
|
|
arr.push(member);
|
|
selectedMemberId.value.push(member.value);
|
|
}
|
|
})
|
|
|
|
selectedMemberArr.value = [...arr];
|
|
}
|
|
|
|
// 选择成员
|
|
function changeItem(item) {
|
|
let index = selectedMemberArr.value.findIndex(member => member.value === item.value);
|
|
if (index === -1) {
|
|
selectedMemberArr.value.push(item);
|
|
} else {
|
|
selectedMemberArr.value.splice(index, 1);
|
|
}
|
|
|
|
selectedMemberName.value = [];
|
|
selectedMemberId.value = [];
|
|
|
|
selectedMemberArr.value.forEach(item => {
|
|
selectedMemberName.value.push(item.label);
|
|
selectedMemberId.value.push(item.value);
|
|
})
|
|
}
|
|
|
|
// 确认选中,关闭用户弹可
|
|
function handleOK() {
|
|
showMembers.value = false;
|
|
selectedMembers.value = selectedMemberName.value.toString();
|
|
}
|
|
|
|
// 关闭用户弹框
|
|
function handleCancel() {
|
|
showMembers.value = false;
|
|
}
|
|
|
|
// 关闭过滤弹框
|
|
function closePopup() {
|
|
emit('closePopup', false);
|
|
}
|
|
|
|
// 提交筛选
|
|
function submitSearch(type) {
|
|
if (!startTimeValue.value) {
|
|
uni.showToast({
|
|
title: "请选择开始时间",
|
|
icon: 'none'
|
|
});
|
|
return false;
|
|
}
|
|
|
|
if (!endTimeValue.value) {
|
|
uni.showToast({
|
|
title: "请选择结束时间",
|
|
icon: 'none'
|
|
});
|
|
return false;
|
|
}
|
|
|
|
const param = {
|
|
startTime: startTimeValue.value,
|
|
endTime: endTimeValue.value,
|
|
memberIdList: selectedMemberId.value
|
|
}
|
|
|
|
if (type === 1) {
|
|
emit('getClockQuery', param)
|
|
} else {
|
|
emit('clockExport', param)
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.search-box {
|
|
top: 50px;
|
|
}
|
|
|
|
.selected-member {
|
|
padding: 2px 10px;
|
|
min-height: 34px;
|
|
border: 1px solid #d9d9d9;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.member-box {
|
|
padding: 0 10px;
|
|
background-color: #fafafa;
|
|
border: 1px solid #e8e8e8;
|
|
border-radius: 2px;
|
|
height: 24px;
|
|
margin: 2px 0;
|
|
margin-right: 4px;
|
|
}
|
|
|
|
.multiple-select-box {
|
|
background-color: #fff;
|
|
}
|
|
|
|
.multiple-select-title {
|
|
height: 45px;
|
|
line-height: 45;
|
|
border-bottom: 1px solid #f4f6f8;
|
|
|
|
view {
|
|
padding: 0 12px;
|
|
}
|
|
}
|
|
|
|
.multiple-select-item {
|
|
padding: 0 40rpx;
|
|
height: 32px;
|
|
}
|
|
|
|
.multiple-select-item.selected {
|
|
color: #2979ff;
|
|
}
|
|
</style>
|
|
|