| <template>  | 
|     <view class="main_app">  | 
|         <view class="app_header">  | 
|             <view class="item" @click="isShowCar = true">  | 
|                 <text v-if="param.carCode">{{ param.carCode }}</text>  | 
|                 <text v-else class="placeholder9">选择车辆</text>  | 
|                 <u-icon name="arrow-down" color="#999999" />  | 
|             </view>  | 
|             <view class="item" @click="showDate">  | 
|                 <text v-if="param.queryDate">{{ param.queryDate }}</text>  | 
|                 <text v-else class="placeholder9">选择日期</text>  | 
|                 <u-icon name="arrow-down" color="#999999" />  | 
|             </view>  | 
|         </view>  | 
|         <!-- pastFlag -->  | 
|         <view class="time_list">  | 
|             <view class="item" :class="{  | 
|           disable: item.pastFlag,  | 
|           active: item.checked == '1',  | 
|           hasSub: item.carUseBookId,  | 
|         }" @click="datetimeClick(item, i)" v-for="(item, i) in timeList" :key="i">  | 
|                 {{ item.startHours }}-{{ item.endHours }}  | 
|             </view>  | 
|         </view>  | 
|         <!--  -->  | 
|         <view class="main_footer">  | 
|             <view class="df_ac">  | 
|                 <view>已选择:</view>  | 
|                 <view class="sel_time">{{ selDatetime }}</view>  | 
|             </view>  | 
|             <view class="df_ac red">  | 
|                 {{selPastDatetime}}  | 
|             </view>  | 
|             <view class="btns">  | 
|                 <view class="left">  | 
|                     <view class="item" v-for="item in colorOptions" :key="item.name">  | 
|                         <view class="box" :style="{ background: item.color }"></view>  | 
|                         <view class="">{{ item.name }}</view>  | 
|                     </view>  | 
|                 </view>  | 
|                 <view class="sub" @click="onSubmit">确认预约</view>  | 
|             </view>  | 
|         </view>  | 
|         <!--  -->  | 
|         <!-- 选择车辆 -->  | 
|         <u-picker keyName="code" :show="isShowCar" :columns="carsList" @confirm="seletedCar"  | 
|             @cancel="isShowCar = false"></u-picker>  | 
|         <!-- 日期 -->  | 
|         <u-datetime-picker ref="startPick" :formatter="formatter" :show="isShowDate" :minDate="minDate" @confirm="confirmDate"  | 
|             @cancel="isShowDate = false" mode="date"></u-datetime-picker>  | 
|         <!-- 详情 -->  | 
|         <u-popup :show="isShowDetail" :round="12" mode="bottom" @close="isShowDetail = false">  | 
|             <view class="detail_modal">  | 
|                 <view class="title">车辆预约情况</view>  | 
|                 <view class="h1">{{ activeInfo.carCode }}</view>  | 
|                 <view class="line">  | 
|                     <view class="label">预计用车时段</view>  | 
|                     <view class="value" v-if="activeInfo.startTime">{{ activeInfo.startTime.slice(5, 16) }} -  | 
|                         {{ activeInfo.endTime.slice(5, 16) }}  | 
|                     </view>  | 
|                 </view>  | 
|                 <view class="line">  | 
|                     <view class="label">目的地</view>  | 
|                     <view class="value">{{ activeInfo.addr }}</view>  | 
|                 </view>  | 
|                 <view class="line">  | 
|                     <view class="label">乘车人数</view>  | 
|                     <view class="value" v-if="activeInfo.memberIds">{{ activeInfo.memberIds.split(",").length }}人</view>  | 
|                 </view>  | 
|                 <view class="line">  | 
|                     <view class="label">用车事由</view>  | 
|                     <view class="value">{{ activeInfo.content || "" }}</view>  | 
|                 </view>  | 
|                 <view class="line">  | 
|                     <view class="label">申请人</view>  | 
|                     <view class="value">{{ activeInfo.memberName }}  | 
|                         <text class="primaryColor ml12">{{  | 
|               activeInfo.memberPhone  | 
|             }}</text>  | 
|                     </view>  | 
|                 </view>  | 
|                 <view class="btn" @click="isShowDetail = false">关闭</view>  | 
|             </view>  | 
|         </u-popup>  | 
|     </view>  | 
| </template>  | 
|   | 
| <script>  | 
|     import dayjs from 'dayjs'  | 
|     import {  | 
|         getCarsList,  | 
|         carCanReservationDate,  | 
|         carUseBookDetail  | 
|     } from '@/api'  | 
|     export default {  | 
|         data() {  | 
|             return {  | 
|                 isShowCar: false,  | 
|                 isShowDate: false,  | 
|                 param: {},  | 
|                 isShowDetail: false,  | 
|                 activeInfo: {},  | 
|   | 
|                 minDate: '',  | 
|                 carsList: [  | 
|                     [{  | 
|                         name: 'aa',  | 
|                         value: '11'  | 
|                     }]  | 
|                 ],  | 
|                 timeList: [],  | 
|                 selDatetime: '',  | 
|                 selPastDatetime: '',  | 
|   | 
|                 colorOptions: [{  | 
|                         color: this.$store.state.primaryColor,  | 
|                         name: '已选择'  | 
|                     },  | 
|                     {  | 
|                         color: '#F7F7F7',  | 
|                         name: '可预约'  | 
|                     },  | 
|                     {  | 
|                         color: '#cccccc',  | 
|                         name: '不可预约'  | 
|                     },  | 
|                 ]  | 
|             }  | 
|         },  | 
|         onLoad() {  | 
|             this.minDate = new Date().getTime() - (6 * 24 * 60 * 60 * 1000)  | 
|             this.initData()  | 
|         },  | 
|         methods: { | 
|             formatter(type, value) { | 
|                 if (type === 'year') { | 
|                     return `${value}年` | 
|                 } | 
|                 if (type === 'month') { | 
|                     return `${value}月` | 
|                 } | 
|                 if (type === 'day') { | 
|                     return `${value}日` | 
|                 } | 
|                 if (type === 'hour') { | 
|                     return `${value}时` | 
|                 } | 
|                 if (type === 'minute') { | 
|                     return `${value}分` | 
|                 } | 
|                 return value | 
|             },  | 
|             onSubmit() {  | 
|                 const {  | 
|                     param  | 
|                 } = this  | 
|                 const selTimeList = this.timeList.filter(i => i.checked == '1')  | 
|                 if (selTimeList.length == 0) {  | 
|                     return uni.showToast({  | 
|                         title: '请先选择用车时间段',  | 
|                         icon: 'none'  | 
|                     })  | 
|                 }  | 
|                 const obj = {  | 
|                     carCode: param.carCode,  | 
|                     carId: param.carId,  | 
|                     startTime: selTimeList[0].startTime,  | 
|                     endTime: selTimeList[selTimeList.length - 1].endTime,  | 
|                     dateDay: param.queryDate,  | 
|                     type: '0'  | 
|                 }  | 
|                 uni.navigateTo({  | 
|                     url: `/pages/staff/vehicle/apply?carCode=${obj.carCode}&carId=${obj.carId}&startTime=${obj.startTime}&endTime=${obj.endTime}&dateDay=${obj.dateDay}&type=${obj.type}`  | 
|                 })  | 
|                 // this.$jump('/pages/staff/vehicle/apply')  | 
|             },  | 
|             showDate() {  | 
|                 this.isShowDate = true  | 
|                 if (!this.param.queryDate) {  | 
|                     this.$refs.startPick.innerValue = new Date().getTime()  | 
|                 }  | 
|             },  | 
|             datetimeClick(item, index) {  | 
|                 if (item.carUseBookId) {  | 
|                     this.getDetail(item.carUseBookId)  | 
|                     return  | 
|                 }  | 
|                 if (item.isUse == '1') return  | 
|                 const {  | 
|                     timeList  | 
|                 } = this  | 
|                 const selTimeList = timeList.filter(i => i.checked == '1')  | 
|                 if (selTimeList.length === 0) {  | 
|                     this.timeList.forEach((ite, i) => {  | 
|                         if (i === index) {  | 
|                             ite.checked = '1'  | 
|                             this.$forceUpdate()  | 
|                         }  | 
|                     })  | 
|                 } else {  | 
|                     const findIndex = selTimeList.findIndex(i => i.index === index)  | 
|                     console.log('findIndex', findIndex)  | 
|                     if (findIndex === -1) {  | 
|                         const startNum = index - selTimeList[0].index  | 
|                         const endNum = index - selTimeList[selTimeList.length - 1].index  | 
|                         if (startNum == 1 || startNum == -1 || endNum == 1 || endNum == -1) {  | 
|                             console.log('相邻')  | 
|                             item.checked = true  | 
|                             this.$forceUpdate()  | 
|                         } else {  | 
|                             return uni.showToast({  | 
|                                 title: '请选择相邻的时间段',  | 
|                                 icon: 'none'  | 
|                             })  | 
|                         }  | 
|                     } else {  | 
|                         if (index === selTimeList[0].index || index === selTimeList[selTimeList.length - 1].index) {  | 
|                             item.checked = false  | 
|                             this.$forceUpdate()  | 
|                         } else {  | 
|                             return uni.showToast({  | 
|                                 title: '请先取消最外层的时间段',  | 
|                                 icon: 'none'  | 
|                             })  | 
|                         }  | 
|   | 
|                     }  | 
|                 }  | 
|                 const selTimeLists = this.timeList.filter(i => i.checked == '1')  | 
|                 // console.log('selTimeList', selTimeList);  | 
|                 if (selTimeLists.length === 0) {  | 
|                     this.selDatetime = ''  | 
|                     this.selPastDatetime = ''  | 
|                 } else {  | 
|                     let pastList = selTimeLists.filter(i => i.pastFlag)  | 
|                     if (pastList.length > 0) {  | 
|                         this.selPastDatetime = '当前选择包含已经过去时间,请确认后再提交;'  | 
|                     } else {  | 
|                         this.selPastDatetime = ''  | 
|                     }  | 
|                     this.selDatetime = this.param.queryDate.slice(5) + ' ' + selTimeLists[0].startHours + '-' + selTimeLists[  | 
|                         selTimeLists.length - 1].endHours  | 
|                 }  | 
|             },  | 
|             getDetail(id) {  | 
|                 carUseBookDetail(  | 
|                     id  | 
|                 ).then(res => {  | 
|                     this.activeInfo = res.data  | 
|                     this.isShowDetail = true  | 
|                 })  | 
|             },  | 
|             confirmDate(e) {  | 
|                 this.param.queryDate = dayjs(e.value).format('YYYY-MM-DD')  | 
|                 this.isShowDate = false  | 
|                 if (this.param.carId && this.param.queryDate) {  | 
|                     this.gettimes()  | 
|                 }  | 
|             },  | 
|             initData() {  | 
|                 getCarsList({  | 
|                     type: 0  | 
|                 }).then(res => {  | 
|                     this.carsList = [res.data]  | 
|                 })  | 
|             },  | 
|             gettimes() {  | 
|                 const {  | 
|                     param  | 
|                 } = this  | 
|                 carCanReservationDate({  | 
|                     dateDay: param.queryDate,  | 
|                     carId: param.carId  | 
|                 }).then(res => {  | 
|                     if (res.code === 200) {  | 
|                         this.timeList = res.data || []  | 
|                         this.timeList.forEach((i, j) => {  | 
|                             i.checked = '0',  | 
|                                 i.index = j  | 
|                             // if (dayjs().format('YYYY-MM-DD') == param.queryDate) {  | 
|                             // let endTime = new Date(i.endTime).getTime()  | 
|                             // let nowTime = new Date().getTime()  | 
|                             i.pastFlag = new Date().getTime() > new Date(i.endTime).getTime()  | 
|                             // if (endTime < nowTime) {  | 
|                             //   i.isUse = 1  | 
|                             // }  | 
|                             // }  | 
|                         })  | 
|                     }  | 
|                 })  | 
|             },  | 
|             seletedCar(e) {  | 
|                 const item = e.value[0]  | 
|                 this.$set(this.param, 'carCode', item.code)  | 
|                 this.$set(this.param, 'carId', item.id)  | 
|                 if (this.param.carId && this.param.queryDate) {  | 
|                     this.gettimes()  | 
|                 }  | 
|                 this.isShowCar = false  | 
|             }  | 
|         }  | 
|     };  | 
| </script>  | 
|   | 
| <style lang="scss">  | 
|     .main_app {  | 
|         .app_header {  | 
|             display: flex;  | 
|             align-items: center;  | 
|             margin: 0 -15rpx; | 
|             padding-top: 10rpx;  | 
|             .item {  | 
|                 width: 330rpx;  | 
|                 height: 72rpx;  | 
|                 margin: 15rpx;  | 
|                 padding: 0 30rpx;  | 
|                 border-radius: 36rpx;  | 
|                 border: 1rpx solid #e5e5e5;  | 
|                 display: flex;  | 
|                 align-items: center;  | 
|                 justify-content: space-between;  | 
|                 align-items: center;  | 
|             }  | 
|         }  | 
|   | 
|         .main_footer {  | 
|             position: fixed;  | 
|             width: 100%;  | 
|             left: 0;  | 
|             bottom: 0;  | 
|             padding: 20rpx 30rpx 52rpx;  | 
|             box-shadow: 0rpx -3rpx 6rpx 0rpx #eeeeee;  | 
|   | 
|             .sel_time {  | 
|                 color: $uni-color-primary;  | 
|             }  | 
|   | 
|             .btns {  | 
|                 margin-top: 10rpx;  | 
|                 display: flex;  | 
|                 justify-content: space-between;  | 
|                 align-items: center;  | 
|   | 
|                 .left {  | 
|                     display: flex;  | 
|   | 
|                     .item {  | 
|                         display: flex;  | 
|                         align-items: center;  | 
|                         margin-right: 20rpx;  | 
|   | 
|                         .box {  | 
|                             margin-right: 10rpx;  | 
|                             width: 32rpx;  | 
|                             height: 32rpx;  | 
|                         }  | 
|                     }  | 
|                 }  | 
|   | 
|                 .sub {  | 
|                     width: 184rpx;  | 
|                     height: 72rpx;  | 
|                     line-height: 72rpx;  | 
|                     text-align: center;  | 
|                     background: $uni-color-primary;  | 
|                     box-shadow: 0rpx -1rpx 0rpx 0rpx #eeeeee;  | 
|                     border-radius: 36rpx;  | 
|                     font-size: 30rpx;  | 
|                     color: #ffffff;  | 
|                 }  | 
|             }  | 
|         }  | 
|   | 
|         .time_list {  | 
|             display: flex;  | 
|             padding: 30rpx 0 240rpx;  | 
|             flex-wrap: wrap;  | 
|   | 
|             .item {  | 
|                 width: 220rpx;  | 
|                 height: 80rpx;  | 
|                 line-height: 80rpx;  | 
|                 text-align: center;  | 
|                 background: #f7f7f7;  | 
|                 border-radius: 4rpx;  | 
|                 margin-bottom: 24rpx;  | 
|                 font-size: 30rpx;  | 
|                 margin-right: 15rpx;  | 
|   | 
|                 &:nth-of-type(3n) {  | 
|                     margin-right: 0;  | 
|                 }  | 
|             }  | 
|   | 
|             .disable {  | 
|                 background: #f7f7f7;  | 
|                 color: #cccccc;  | 
|             }  | 
|   | 
|             .active {  | 
|                 background-color: $uni-color-primary;  | 
|                 color: #fff;  | 
|             }  | 
|   | 
|             .hasSub {  | 
|                 color: #999999;  | 
|                 background: #cccccc;  | 
|             }  | 
|         }  | 
|     }  | 
|   | 
|     .detail_modal {  | 
|         padding: 40rpx 30rpx;  | 
|   | 
|         .title {  | 
|             text-align: center;  | 
|             font-weight: 600;  | 
|             font-size: 32rpx;  | 
|             margin-bottom: 40rpx;  | 
|         }  | 
|   | 
|         .h1 {  | 
|             font-weight: 600;  | 
|             font-size: 32rpx;  | 
|             margin-bottom: 30rpx;  | 
|         }  | 
|   | 
|         .line {  | 
|             display: flex;  | 
|             margin-bottom: 20rpx;  | 
|   | 
|             .label {  | 
|                 width: 180rpx;  | 
|                 color: #888888;  | 
|             }  | 
|   | 
|             .value {  | 
|                 color: #333333;  | 
|             }  | 
|         }  | 
|   | 
|         .btn {  | 
|             margin-top: 230rpx;  | 
|             width: 690rpx;  | 
|             height: 88rpx;  | 
|             line-height: 88rpx;  | 
|             text-align: center;  | 
|             background: $uni-color-primary;  | 
|             border-radius: 44rpx;  | 
|             font-weight: 600;  | 
|             font-size: 32rpx;  | 
|             color: #ffffff;  | 
|         }  | 
|     }  | 
| </style> |