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.
 
 
 

549 lines
13 KiB

<template>
<view class="">
<view class="card" v-if="timeType">
<view class="card-title">
时间类型
</view>
<view class="timetype">
<view class="timetype_item" :class="[defaultTimeType==0?'active':'']" @click="changeTimeType('年')">
</view>
<view class="timetype_item" :class="[defaultTimeType==1?'active':'']" @click="changeTimeType('月')">
</view>
<view class="timetype_item" :class="[defaultTimeType==2?'active':'']" @click="changeTimeType('日')">
</view>
<!-- <time-type height="300rpx" :value="defaultTimeType" @change="changeTimeType" lineHeight="60rpx">
</time-type> -->
</view>
</view>
<view class="card">
<view class="card-title">
时间选择
<text style="font-size: 24rpx;color: #FA6200;" v-if="defaultTimeType!=0">(关联之后起止时间联动,间隔不超过30天)</text>
<text style="font-size: 24rpx;color: #FA6200;" v-if="defaultTimeType==0">(关联之后起止时间联动,间隔不超过365天)</text>
</view>
<view class="card-content">
<view class="time left" :class="[chooseOne==0?'active':'']" @click="clickChoose(0)">
{{startTimeFormat}}
</view>
<view class="label">至</view>
<view class="time right" :class="[chooseOne==1?'active':'']" @click="clickChoose(1)">
{{endTimeFormat}}
</view>
</view>
<view style="position: relative;height:20rpx;top: -20rpx;">
<view
style="font-size: 24rpx;color: red;position: absolute;top: 0;left: 0;right: 0;transform: scale(.8);transform-origin: left;">
{{validate}}
</view>
</view>
<view style="display: flex;align-items: center;">
<template>
<view @click="selectToday()" class="btn">
今天
</view>
<view v-if="defaultTimeType!=0" @click="selectOneMonth()" class="btn">
近30天
</view>
<view v-if="defaultTimeType==0" @click="selectOneYear()" class="btn">
近1年
</view>
<view @click="clickBind" class="btn" :class="[isBind?'active':'']">
关联起止时间
</view>
</template>
<view style="text-align: right;flex: 1;width: 0;">
<image style="width: 28rpx;height: 28rpx;"
src="https://www.enesoon-saas-back-test.cn/company/static/icon-clear@2x.png" @tap="clearDate" />
</view>
</view>
<view>
<day :value="defaultTime" @change="changeTime" height="400rpx" ref="day" :current="true"
:type="timeType"></day>
</view>
</view>
<view class="card">
<view class="card-title">
年份选择
</view>
<view class="card-content">
<scroll-view scroll-x>
<view class="year-list">
<view class="year-item" @click="delYearList(item,index)" v-for="(item,index) in sortYearList"
:key="index">
{{item}}
<u-icon name="close-circle-fill" color="#999" size="16rpx" top="-10rpx"></u-icon>
</view>
</view>
</scroll-view>
</view>
<scroll-view scroll-y style="height: 240rpx;">
<view class="year-choose-list">
<view class="year-choose-item" @click="addYearList(item,index)"
:class="[yearList.includes(+item)?'highlight':'', selectYearData==item?'disabled':'']"
v-for="(item,index) in yearAllList" :key="index">
{{item}}
</view>
</view>
</scroll-view>
</view>
</view>
</template>
<script>
import day from "./day.vue"
import {
dateTimeFormat
} from "./util.js"
import TimeType from "./TimeType.vue"
let intevalTime = 30 * 24 * 60 * 60 * 1000; // 30天
export default{
components: {
day,
TimeType
},
data() {
return {
yearAllList: [2021, 2020, 2019, 2018],
yearList: [],
isBind: true,
startTime: '',
endTime: '',
chooseOne: -1,
defaultTime: null,
timeType: "year,month,day",
defaultTimeType: 1
};
},
created() {
this.changeTimeType('月')
this.chooseOne = 0
let day = new Date().getTime()
let dayD = new Date(day)
this.endTime = dayD
let dayc = new Date(this.endTime).getTime() - intevalTime
let dayA = new Date(dayc)
dayA.setHours(0,0,0)
this.startTime = dayA
this.defaultTime = this.startTime
this.bindDay()
},
computed: {
validate() {
if(!this.endTime || !this.startTime){
return ""
}
if (this.endTime.getTime() - this.startTime.getTime() < 0) {
return "开始时间不能大于结束时间"
}
if (this.endTime.getTime() - this.startTime.getTime() > intevalTime) {
if(this.defaultTimeType!=0){
return "时间间隔不能大于30天"
}else{
return "时间间隔不能大于365天"
}
}
return ''
},
startTimeFormat() {
if (!this.startTime) {
return "开始时间"
}
// yyyy-MM-dd HH:mm:ss
if (this.defaultTimeType == 0) {
return dateTimeFormat(this.startTime, 'yyyy-MM')
}
if (this.defaultTimeType == 1) {
return dateTimeFormat(this.startTime, 'yyyy-MM-dd')
}
if (this.defaultTimeType == 2) {
return dateTimeFormat(this.startTime, 'yyyy-MM-dd')
}
return dateTimeFormat(this.startTime, 'yyyy-MM-dd')
},
endTimeFormat() {
if (!this.endTime) {
return "结束时间"
}
// yyyy-MM-dd HH:mm:ss
if (this.defaultTimeType == 0) {
return dateTimeFormat(this.endTime, 'yyyy-MM')
}
if (this.defaultTimeType == 1) {
return dateTimeFormat(this.endTime, 'yyyy-MM-dd')
}
if (this.defaultTimeType == 2) {
return dateTimeFormat(this.endTime, 'yyyy-MM-dd')
}
return dateTimeFormat(this.endTime, 'yyyy-MM-dd')
},
selectYearData() {
let year = -1
if (this.startTime && this.endTime) {
let Ayear = +dateTimeFormat(this.startTime, "yyyy")
let Byear = +dateTimeFormat(this.endTime, "yyyy")
if (Ayear == Byear) {
year = Ayear
}
}
return year
},
sortYearList() {
return this.yearList.sort(function(a, b) {
return +b - (+a)
})
},
},
methods: {
clearDate() {
this.startTime = ""
this.endTime = ""
this.yearList = [];
},
delYearList(item) {
// if (!this.year) {
// return
// }
if (item == this.selectYearData) {
uni.showToast({
icon: "none",
title: "该年份不能修改"
})
return
}
let index = this.yearList.indexOf(item)
this.yearList.splice(index, 1)
this.buildDate()
},
addYearList(item) {
// if (!this.year) {
// return
// }
if (item == this.selectYearData) {
uni.showToast({
icon: "none",
title: "该年份不能修改"
})
return
}
let index = this.yearList.indexOf(item)
if (index == -1) {
if (this.startTime && this.endTime) {
let Ayear = +dateTimeFormat(this.startTime, "yyyy")
let Byear = +dateTimeFormat(this.endTime, "yyyy")
if (Ayear != Byear) {
uni.showToast({
icon: "none",
title: "跨年不能选择"
})
return
}
if (this.yearList.length == 3) {
uni.showToast({
icon: "none",
title: "只能选择三个年份"
})
return
}
this.yearList.push(item)
this.buildDate()
} else {
uni.showToast({
icon: "none",
title: "请完善时间范围"
})
}
} else {
this.yearList.splice(index, 1)
this.buildDate()
}
},
clickChoose(type) {
if (type == 0) {
if (this.chooseOne != 0) {
this.chooseOne = 0;
if (this.startTime) {
this.defaultTime = this.startTime
} else {
this.defaultTime = new Date()
}
} else {
this.chooseOne = -1;
}
}
if (type == 1) {
if (this.chooseOne != 1) {
this.chooseOne = 1;
if (this.endTime) {
this.defaultTime = this.endTime
} else {
this.defaultTime = new Date()
}
} else {
this.chooseOne = -1;
}
}
},
changeTimeType(type) {
switch (type) {
case "年":
this.defaultTimeType = 0
intevalTime = 365 * 24 * 60 * 60 * 1000;
this.timeType = 'year,month'
break;
case "月":
intevalTime = 30 * 24 * 60 * 60 * 1000;
this.defaultTimeType = 1
this.timeType = 'year,month,day'
break;
case '日':
intevalTime = 30 * 24 * 60 * 60 * 1000;
this.defaultTimeType = 2
this.timeType = "year,month,day,hour,minute,second"
break;
case 'only-year':
intevalTime = 30 * 24 * 60 * 60 * 1000;
this.defaultTimeType = 3
this.timeType = "year"
break;
default:
this.defaultTimeType = 1
this.timeType = 'year,month,day'
break;
}
},
bindDay() {
if (this.chooseOne == 0 || this.chooseOne == -1) {
if (this.isBind && ((this.startTime && this.endTime && this.isBigger30Day(this.startTime.getTime(),
this.endTime
.getTime())) || (!this.endTime && this.startTime))) {
let day = new Date(dateTimeFormat(this.startTime, "yyyy/MM/dd HH:mm:ss")).getTime() + intevalTime
this.endTime = new Date(day)
}
}
if (this.chooseOne == 1) {
if (this.isBind && ((this.startTime && this.endTime && this.isBigger30Day(this.startTime.getTime(),
this.endTime
.getTime())) || (!this.startTime && this.endTime))) {
let day = new Date(dateTimeFormat(this.endTime, "yyyy/MM/dd HH:mm:ss")).getTime() - intevalTime
this.startTime = new Date(day)
}
}
if (this.startTime && this.endTime) {
let Ayear = +dateTimeFormat(this.startTime, "yyyy")
let Byear = +dateTimeFormat(this.endTime, "yyyy")
if (Ayear == Byear) {
this.yearList = [Ayear]
} else {
this.yearList = []
}
}
this.buildDate()
},
buildDate() {
let format = "yyyy-MM-dd HH:mm:ss"
if(this.defaultTimeType==0){
format = "yyyy-MM"
}
if(this.defaultTimeType==1){
format = "yyyy-MM-dd"
}
// console.log("输出");
// console.log(dateTimeFormat(this.startTime, format));
// console.log(dateTimeFormat(this.endTime, format));
// console.log(this.yearList);
// console.log(this.defaultTimeType);
if (this.startTime && this.endTime) {
if (this.endTime.getTime() - this.startTime.getTime() < 0) {
uni.showToast({
icon: "none",
title: "开始时间不能大于结束时间"
})
}
if(this.endTime.getTime() - this.startTime.getTime() > intevalTime){
uni.showToast({
icon: "none",
title: "时间间隔大于30天"
})
}
}
},
isBigger30Day(time1, time2) {
return (time2 - time1 > intevalTime) || (time2 - time1 < 0)
},
changeTime(time) {
if (this.chooseOne == 0) {
this.startTime = time
}
if (this.chooseOne == 1) {
this.endTime = time
}
this.bindDay()
if (this.chooseOne == -1) {
uni.showToast({
icon: "none",
title: "请先选中一项"
})
}
},
selectOneYear() {
this.selectToday(1)
this.select(0)
},
selectOneMonth() {
this.selectToday(1)
this.select(0)
},
fixedTime(time,chooseOne){
time.setHours(0,0,0)
return time
},
select(chooseOne) {
if (chooseOne == 0 && this.endTime) {
let day = new Date(dateTimeFormat(this.endTime, "yyyy/MM/dd HH:mm:ss")).getTime() - intevalTime
this.defaultTime = new Date(day)
this.startTime = new Date(day)
// this.$refs.day.setTime(new Date(day))
}
if (chooseOne == 1 && this.startTime) {
let day = new Date(dateTimeFormat(this.startTime, "yyyy/MM/dd HH:mm:ss")).getTime() + intevalTime
this.defaultTime = new Date(day)
this.endTime = new Date(day)
}
this.bindDay()
},
selectToday(chooseOne) {
if (this.chooseOne == -1) {
uni.showToast({
icon: "none",
title: "请先选中一项"
})
return
}
if (this.chooseOne == 0 || chooseOne===0) {
this.startTime = new Date()
}
if (this.chooseOne == 1 || chooseOne===1) {
this.endTime = new Date()
}
this.bindDay()
},
clickBind() {
this.isBind = !this.isBind;
this.bindDay()
}
}
}
</script>
<style lang="scss" scoped>
.card {
margin: 20rpx;
.card-title {
font-size: 32rpx;
font-weight: 500;
color: #333333;
}
.card-content {
margin: 20rpx 0;
line-height: 60rpx;
text-align: center;
font-size: 28rpx;
font-weight: 400;
color: #999999;
display: flex;
align-items: center;
.time {
width: 260rpx;
border-bottom: 1px solid #CECECE;
&.active {
color: #22AB39;
}
}
.label {
color: #666666;
flex: 1;
}
}
}
.btn {
border: 1px solid #C0C0C0;
color: #333333;
padding: 4rpx 15rpx;
border-radius: 10rpx;
color: #000;
+.btn {
margin-left: 10rpx;
}
&.active {
border-color: #22AB39;
color: #22AB39;
}
}
.year-choose-list {
text-align: center;
line-height: 60rpx;
.year-choose-item {
margin: 10rpx 0;
color: #999;
&.highlight {
color: #333;
background: #F5F5F5;
}
&.disabled {
color: #333;
background: #F5F5F5;
}
}
}
.year-list {
white-space: nowrap;
text-align: left;
color: #22AB39;
line-height: 60rpx;
height: 60rpx;
.year-item {
display: inline-block;
padding: 0 20rpx;
}
}
.timetype{
display: flex;
justify-content: space-around;
margin: 20rpx 0;
.timetype_item{
line-height: 1;
padding: 8rpx 42rpx;
border-radius: 4rpx;
font-size: 28rpx;
font-weight: 400;
color: #37363B;
&.active{
background-color: #22AB39;
color: white;
}
}
}
</style>