Files
ys-app/src/pages/business/CRM/map/checkinStatistics.vue

286 lines
7.5 KiB
Vue
Raw Normal View History

2025-08-25 16:41:33 +08:00
<template>
<view class="con-body">
<view class="con-bg">
<!-- 头部 -->
<customHeader ref="customHeaderRef" :title="'打卡统计'" :leftFlag="true" :rightFlag="false"></customHeader>
<!-- 高度来避免头部遮挡 -->
<view class="top-height"></view>
<!-- 正文内容 -->
<view>
<!-- 搜索 -->
<view class="search">
<picker @change="bindPickerChange" :value="cityIndex" :range="cityArr" class="picker-bg">
<view class="picker">
<uni-icons type="location" size="18"></uni-icons>
<view>{{ cityArr[cityIndex] }}</view>
<uni-icons type="down" size="18"></uni-icons>
</view>
</picker>
<picker mode="date" :value="defaultDate" :start="startDate" :end="endDate" @change="bindDateChange"
class="picker-bg">
<view class="picker">
<uni-icons custom-prefix="iconfont" color="#ffffff" type="icon-phoneshizhong"
size="18"></uni-icons>
<view>{{ defaultDate }}</view>
<uni-icons type="down" size="18"></uni-icons>
</view>
</picker>
<button type="default" @click="handleSearch" size="mini" class="btn-search">查询</button>
</view>
<!-- 签到打卡 -->
<view class="checkin-tab">
<view class="checkin-tab-item" :class="{ active: tabType == 0 }" @click="handleTab(0)">
<view class="tab-item-title">{{ signCount }}</view>
<view class="tab-item-name">最新签到打卡</view>
</view>
<view class="checkin-tab-item" :class="{ active: tabType == 1 }" @click="handleTab(1)">
<view class="tab-item-title">{{ noSignCount }}</view>
<view class="tab-item-name">未签到打卡</view>
</view>
</view>
<!-- tab切换显示 -->
<view class="white-bg">
<!-- 最新签到列表 -->
<view class="tab-con" v-if="tabType == 0">
<view class="tab-title" v-for="(item, index) in singInList" :key="index">
{{ item }}
<uni-icons type="checkbox-filled" size="26" color="#02C74C"></uni-icons>
</view>
</view>
<!-- 未签到列表 -->
<view class="tab-con" v-if="tabType == 1">
<view class="tab-title" v-for="(item, index) in singInNoList" :key="index">
{{ item }}
<uni-icons type="info-filled" size="26" color="#FF8059"></uni-icons>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { ref, onMounted, reactive } from 'vue'
import customHeader from '@/components/customHeader.vue'
import { getDate } from '@/utils/datetime.js'
import { getNoSigninList, getSigninList } from '../../../../api/crm/activity/map';
//进入页面初始化页面
onMounted(() => {
getSignListMethod();
getNoSignListMethod();
})
let cityIndex = ref(0);
let cityArr = ['市场一部','市场二部','市场三部',"北京大区", "南方大区",'北方大区','西部大区'];
// 选择大区列表
let bindPickerChange = (e) => {
console.log('picker发送选择改变携带值为', e.detail.value)
cityIndex.value = e.detail.value
}
// 开始时间
let startDate = getDate('start');
// 结束时间间隔10年
let endDate = getDate('end');
let defaultDate = getDate({ format: true })
let bindDateChange = (e) => {
defaultDate = e.detail.value
}
let searchValue = ref(null)
// 查询搜索跳转
let handleSearch = () => {
queryForm.tadayDate = defaultDate
queryForm.region = cityArr[cityIndex.value]
getSignListMethod();
getNoSignListMethod();
}
// 列表
let signCount = ref(0)
let singInList = ref([]);
let noSignCount = ref(0)
let singInNoList = ref([]);
//查询表单,默认有个北京大区的参数
let queryForm = reactive({
region: "北京大区"
})
// tab 切换
let tabType = ref(0)
let handleTab = (type) => {
tabType.value = type;
//最新签到列表
if (type === 0) {
getSignListMethod();
}
//未签到列表
else if (type === 1) {
getNoSignListMethod();
}
}
function getSignListMethod() {
getSigninList(queryForm).then(res => {
signCount.value = res.total
singInList.value = res.rows.map(item => item.userName)
})
}
function getNoSignListMethod() {
getNoSigninList(queryForm).then(res => {
noSignCount.value = res.total
singInNoList.value = res.rows.map(item => item.userName);
})
}
// 确定
let handleSubmit = () => {
}
</script>
<style scoped>
.search {
display: flex;
padding: 0 30rpx;
}
.search .btn-search {
border: none;
background: none;
line-height: normal;
color: #fff;
line-height: 56rpx !important;
padding: 10rpx 0 0;
text-align: left;
cursor: pointer;
}
.search .btn-search::after {
display: none;
}
.search .picker-bg {
display: flex;
background-color: #6FA2F8;
border-radius: 25px;
color: #fff;
font-size: 28rpx;
padding: 0rpx 20rpx;
/* #ifndef APP-PLUS */
padding: 10rpx 20rpx 0 20rpx;
/* #endif */
margin-right: 20rpx;
}
.search .picker-bg .picker {
display: flex;
align-items: center;
/* #ifndef APP-PLUS */
padding-top: 2rpx;
/* #endif */
}
.search .picker-bg .picker .uni-icons {
color: #fff !important;
}
.search .picker-bg .picker .uni-icons:first-child {
margin-right: 10rpx;
}
.search .picker-bg .picker .uniui-down {
margin-left: 20rpx;
}
.checkin-tab {
margin-top: 35rpx;
display: flex;
padding: 0 30rpx;
flex: 1;
}
.checkin-tab-item {
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.5);
text-align: center;
margin-right: 30rpx;
font-weight: bold;
padding-bottom: 20rpx;
}
.checkin-tab-item.active {
position: relative;
color: #fff;
}
.checkin-tab-item.active::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
background-color: #fff;
width: 100rpx;
height: 8rpx;
}
.checkin-tab-item .tab-item-title {
font-size: 60rpx;
}
.white-bg {
width: 670rpx;
margin: 0;
border-radius: 8px 8px 0 0;
padding: 50rpx 40rpx;
margin-top: 20rpx;
/* #ifdef APP-PLUS */
height: calc(100vh - 260px);
/* #endif */
/* #ifndef APP-PLUS */
height: calc(100vh - 230px);
/* #endif */
}
.tab-con {
display: flex;
flex-flow: row wrap
}
.tab-con .tab-title {
border: 1px solid #E8E8E8;
text-align: center;
border-radius: 5px;
position: relative;
/* padding:10rpx 20rpx; */
margin-right: 20rpx;
margin-bottom: 30rpx;
width: 148rpx;
height: 60rpx;
line-height: 60rpx;
font-size: 28rpx;
}
.tab-con .tab-title:nth-child(4n) {
margin-right: 0;
}
.tab-con .uni-icons {
position: absolute;
right: -10px;
top: -10px;
}
</style>