YNUtdPlatform/pages/workPlan/index/components/calendar.vue

486 lines
12 KiB
Vue
Raw Normal View History

2024-10-21 18:10:14 +08:00
<template>
<view class="calendar">
<!-- <view class="header">
2024-10-21 18:10:14 +08:00
<text @click="changeMonth(-1)"></text>
<text>{{ currentYear }}{{ currentMonth + 1 }}</text>
<text @click="changeMonth(1)"></text>
</view> -->
<view class="header">
<view v-show="activeType === 1">
<uni-icons type="left" size="16" @click="changeMonth(-1)"></uni-icons>
<text>{{ currentYear }}-{{ currentMonth + 1 }}</text>
<uni-icons type="right" size="16" @click="changeMonth(1)"></uni-icons>
</view>
<view v-show="activeType === 2">
<uni-icons type="left" size="16" @click="changeWeek(-1)"></uni-icons>
<text class="week-container">{{ weekStart }}~{{ weekEnd }}</text>
<uni-icons type="right" size="16" @click="changeWeek(1)"></uni-icons>
</view>
<view v-show="activeType === 3">
<uni-icons type="left" size="16" @click="changeDay(-1)"></uni-icons>
<text>{{ currentDay }}</text>
<uni-icons type="right" size="16" @click="changeDay(1)"></uni-icons>
</view>
<view>
<button :class="{ 'active-button ': activeType === 1 }" @tap="onCheckTime(1)"></button>
<button :class="{ 'active-button ': activeType === 2 }" @tap="onCheckTime(2)"></button>
<button :class="{ 'active-button ': activeType === 3 }" @tap="onCheckTime(3)"></button>
</view>
2024-10-21 18:10:14 +08:00
</view>
<!-- 选择月的时候的日历 -->
<view v-show="activeType === 1">
<view class="weekdays">
<text v-for="day in weekdays" :key="day">{{ day }}</text>
</view>
<view class="days">
<view
v-for="day in days"
:key="day.date"
:class="{ 'current-month': day.currentMonth, 'other-month': !day.currentMonth }"
@click="selectDate(day)"
>
<text style="font-weight: bold">{{ day.day }}</text>
<view class="risk-container">
<text>:9</text>
<text>:30</text>
<text>可接受:4</text>
</view>
</view>
</view>
</view>
<!-- 选择周的时候日历 -->
<view v-show="activeType === 2">
<view class="week-th">
<view v-for="item in weekList" :key="item">
<text>{{ item.title }}</text>
<text v-if="item !== '分公司'" style="margin-top: 6rpx">{{ item.time }}</text>
</view>
</view>
<view class="week-td" v-for="(item, index) in weekCompanyList" :key="index">
<view>
<text style="font-size: 26rpx">{{ item.name }}</text>
</view>
<view v-for="(i, j) in item.weekList" :key="j">
<text class="style_1">{{ i.height }}</text>
<text class="style_2">{{ i.height }}</text>
<text class="style_3">{{ i.kjs }}</text>
<text style="margin-bottom: 60rpx" class="style_4">可接受{{ i.height }}</text>
</view>
</view>
</view>
<!-- 选择天的时候日历 -->
<view v-show="activeType === 3">
<view class="day-th">
<view>工程名称</view>
<view>作业人数</view>
<view>
<text>周二</text>
<text>10/22</text>
</view>
</view>
<view class="day-td">
<view>10kv换东线10kv换东线10kv换东线10kv换东线10kv换东线</view>
<view>
<text>3</text>
</view>
<view>
<text class="style_1"></text>
<text class="style_2"></text>
<text class="style_3"></text>
<text class="style_4">可接受</text>
<text class="style_4">特高</text>
</view>
2024-10-21 18:10:14 +08:00
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
activeType: 1,
2024-10-21 18:10:14 +08:00
currentYear: new Date().getFullYear(),
currentMonth: new Date().getMonth(),
weekdays: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
weekList: [
{ title: '分公司', time: '' },
{ title: '周一', time: this.$moment().week(this.$moment().week()).startOf('week').format('MM-DD') },
{
title: '周二',
time: this.$moment(this.$moment().week(this.$moment().week()).startOf('week').format('YYYY-MM-DD'))
.add(1, 'days')
.format('MM-DD')
},
{
title: '周三',
time: this.$moment(this.$moment().week(this.$moment().week()).startOf('week').format('YYYY-MM-DD'))
.add(2, 'days')
.format('MM-DD')
},
{
title: '周四',
time: this.$moment(this.$moment().week(this.$moment().week()).startOf('week').format('YYYY-MM-DD'))
.add(3, 'days')
.format('MM-DD')
},
{
title: '周五',
time: this.$moment(this.$moment().week(this.$moment().week()).startOf('week').format('YYYY-MM-DD'))
.add(4, 'days')
.format('MM-DD')
},
{
title: '周六',
time: this.$moment(this.$moment().week(this.$moment().week()).startOf('week').format('YYYY-MM-DD'))
.add(5, 'days')
.format('MM-DD')
},
{ title: '周日', time: this.$moment().week(this.$moment().week()).endOf('week').format('MM-DD') }
],
weekStart: this.$moment().week(this.$moment().week()).startOf('week').format('YYYY-MM-DD'),
weekEnd: this.$moment().week(this.$moment().week()).endOf('week').format('YYYY-MM-DD'),
currentDay: this.$moment().format('YYYY-MM-DD'),
weekCompanyList: [
{
name: '全部',
weekList: [
{
height: 3,
kjs: 6
},
{
height: 3,
kjs: 6
}
]
},
{
name: '分公司一',
weekList: [
{
height: 3,
kjs: 6
},
{
height: 3,
kjs: 6
}
]
},
{
name: '分公司二',
weekList: [
{
height: 3,
kjs: 6
},
{
height: 3,
kjs: 6
}
]
}
],
2024-10-21 18:10:14 +08:00
days: [],
customDates: {
'2023-06-15': '自定义内容'
}
}
},
mounted() {
this.generateCalendar()
},
methods: {
generateCalendar() {
const firstDay = new Date(this.currentYear, this.currentMonth, 1)
const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0)
const daysInMonth = lastDay.getDate()
const startingDay = firstDay.getDay()
this.days = []
for (let i = 0; i < startingDay; i++) {
const prevMonthLastDay = new Date(this.currentYear, this.currentMonth, 0).getDate()
this.days.push({
day: prevMonthLastDay - startingDay + i + 1,
currentMonth: false,
date: new Date(this.currentYear, this.currentMonth - 1, prevMonthLastDay - startingDay + i + 1)
})
}
for (let i = 1; i <= daysInMonth; i++) {
const date = new Date(this.currentYear, this.currentMonth, i)
const dateString = `${this.currentYear}-${String(this.currentMonth + 1).padStart(2, '0')}-${String(i).padStart(
2,
'0'
)}`
this.days.push({
day: i,
currentMonth: true,
date: date,
customContent: this.customDates[dateString]
})
}
const remainingDays = 42 - this.days.length
for (let i = 1; i <= remainingDays; i++) {
this.days.push({
day: i,
currentMonth: false,
date: new Date(this.currentYear, this.currentMonth + 1, i)
})
}
},
changeMonth(delta) {
this.currentMonth += delta
if (this.currentMonth > 11) {
this.currentMonth = 0
this.currentYear++
} else if (this.currentMonth < 0) {
this.currentMonth = 11
this.currentYear--
}
this.generateCalendar()
},
changeDay(delta) {
if (delta > 0) {
this.currentDay = this.$moment(this.currentDay).add(1, 'days').format('YYYY-MM-DD')
} else {
this.currentDay = this.$moment(this.currentDay).subtract(1, 'days').format('YYYY-MM-DD')
}
},
changeWeek(delta) {
if (delta > 0) {
this.weekStart = this.$moment(this.weekStart).add(7, 'days').format('YYYY-MM-DD')
this.weekEnd = this.$moment(this.weekEnd).add(7, 'days').format('YYYY-MM-DD')
} else {
this.weekStart = this.$moment(this.weekStart).subtract(7, 'days').format('YYYY-MM-DD')
this.weekEnd = this.$moment(this.weekEnd).subtract(7, 'days').format('YYYY-MM-DD')
}
},
2024-10-21 18:10:14 +08:00
selectDate(day) {
console.log('选择的日期', day.date)
// 在这里可以添加选择日期后的逻辑
},
onCheckTime(type) {
this.activeType = type
2024-10-21 18:10:14 +08:00
}
}
}
</script>
<style scoped lang="scss">
2024-10-21 18:10:14 +08:00
.calendar {
width: 100%;
margin-top: 30rpx;
2024-10-21 18:10:14 +08:00
/* padding: 20rpx; */
}
.header {
width: 100%;
2024-10-21 18:10:14 +08:00
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
view {
flex: 1;
height: 80rpx;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 36rpx;
font-weight: bold;
}
.week-container {
font-size: 24rpx !important;
font-weight: normal !important;
}
}
.header view:last-child {
width: 45%;
margin-right: 20rpx;
background-color: #f8f8f8;
border-radius: 40rpx;
button {
flex: 1;
height: 80rpx;
color: #000;
line-height: 80rpx;
font-weight: normal;
font-size: 36rpx;
cursor: pointer;
transition: all 0.3s ease;
}
button:last-child {
border-radius: 40rpx;
}
button:first-child {
border-radius: 40rpx;
}
.active-button {
border-radius: 40rpx;
background-color: #21a1f4;
color: #fff;
}
button::after {
border: none;
}
2024-10-21 18:10:14 +08:00
}
.weekdays {
display: flex;
justify-content: space-around;
margin: 10rpx 0;
2024-10-21 18:10:14 +08:00
}
.days {
display: flex;
flex-wrap: wrap;
// border-bottom: 1px solid #ccc;
.risk-container {
width: 100%;
display: flex;
margin-bottom: 30rpx;
flex-direction: column;
text {
width: 100%;
margin-bottom: 3rpx;
padding-left: 3rpx;
text-align: left;
font-size: 24rpx;
}
}
.risk-container text:first-child {
background-color: #fde9cf;
border-left: 2px solid #fa8d0a;
}
.risk-container text:nth-child(2) {
background-color: #cff2ec;
border-left: 2px solid #1db691;
}
.risk-container text:nth-child(3) {
background-color: #d8fbff;
border-left: 2px solid #45e6ed;
}
2024-10-21 18:10:14 +08:00
}
.days view {
width: 14.28%;
/* height: 80rpx; */
2024-10-21 18:10:14 +08:00
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.other-month {
// color: #ccc;
color: transparent;
text {
border: none !important;
background-color: transparent !important;
}
2024-10-21 18:10:14 +08:00
}
.custom-content {
font-size: 20rpx;
color: #007aff;
}
.week-th,
.week-td {
width: 100%;
display: flex;
view {
width: 12.5%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
}
.week-td view text {
width: 100%;
margin-bottom: 3rpx;
padding-left: 2rpx;
display: inline-block;
font-size: 22rpx;
// font-weight: bold;
}
.style_1 {
background-color: #ffd5d6;
border-left: 2px solid #f6322a;
}
.style_2 {
background-color: #fee9ca;
border-left: 2px solid #f58b07;
}
.style_3 {
background-color: #d1f1ec;
border-left: 2px solid #14bb91;
}
.style_4 {
background-color: #d8fbfc;
border-left: 2px solid #3eebf7;
}
.day-th,
.day-td {
display: flex;
align-items: center;
view {
width: 33.33%;
display: flex;
flex-direction: column;
// align-items: center;
justify-content: center;
text {
width: 100%;
text-align: center;
}
}
}
.day-td {
// height: 180rpx;
view {
height: 100%;
padding: 30rpx 0;
}
}
.day-th view:nth-child(2) {
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
}
.day-td view:nth-child(2) {
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
}
.day-td view:last-child text {
width: 100%;
margin-left: 10rpx;
margin-bottom: 3rpx;
text-align: left;
}
2024-10-21 18:10:14 +08:00
</style>