| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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(); |
| | | uni.setStorageSync('vehicleAppForm', {})
|
| | | },
|
| | | 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> |