| <template> | 
|     <view class="main_app"> | 
|         <view class="main_wrap"> | 
|             <view class="main_title">运输信息</view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>入园原因</text> | 
|                 </view> | 
|                 <view class="value" @click="reasonClick"> | 
|                     <text class="mr6" :class="{gray: param.id}" :style="{ color: param.inReason ? '#000000' : '#999999' }">{{ param.inReason ? param.inReason : '请选择' }}</text> | 
|                     <u-icon name="arrow-right" color="#CCCCCC" size="16"></u-icon> | 
|                 </view> | 
|             </view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>合同/单据编号</text> | 
|                 </view> | 
|                 <view class="value"><input type="text" placeholder="请输入您的合同/单据编号" v-model="param.contractNum" placeholder-style="color: #999999;" /></view> | 
|             </view> | 
|             <!--  --> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>到场时间</text> | 
|                 </view> | 
|                 <view class="value" @click="showDatetime = true"> | 
|                     <text class="mr6" :style="{ color: param.arriveDate ? '#000000' : '#999999' }">{{ param.arriveDate ? param.arriveDate : '请选择' }}</text> | 
|                     <u-icon name="arrow-right" color="#CCCCCC" size="16"></u-icon> | 
|                 </view> | 
|             </view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>作业类型</text> | 
|                 </view> | 
|                 <view class="value"> | 
|                     <view class="btns"> | 
|                         <view @click="inTypeClick(0)" :class="{ active: param.inType == 0 }" class="btn">整托盘</view> | 
|                         <view @click="inTypeClick(1)" :class="{ active: param.inType == 1 }" class="btn">件烟</view> | 
|                     </view> | 
|                 </view> | 
|             </view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>总运输量</text> | 
|                 </view> | 
|                 <view class="value"> | 
|                     <input type="number" @blur="checkSurplus" placeholder="请输入总运输量" v-model="param.totalNum" placeholder-style="color: #999999;" /> | 
|                     <text class="unit">万支</text> | 
|                 </view> | 
|             </view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>准运证/运单照片</text> | 
|                 </view> | 
|                 <view class="value" @click="handleUpload"> | 
|                     <image v-if="param.transportImgFull" class="upload_wrap" :src="param.transportImgFull" alt=""> | 
|                     <view v-else class="upload_wrap"><u-icon name="plus" size="20" color="#999999"></u-icon></view> | 
|                 </view> | 
|             </view> | 
|             <view class="empty"></view> | 
|             <view class="main_title">司机/车辆信息</view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>司机姓名</text> | 
|                 </view> | 
|                 <view class="value"><input type="text" placeholder="请输入您的真实姓名" v-model="param.driverName" placeholder-style="color: #999999;" /></view> | 
|             </view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>手机号</text> | 
|                 </view> | 
|                 <view class="value"><input type="number" placeholder="请输入您的手机号" v-model="param.driverPhone" placeholder-style="color: #999999;" /></view> | 
|             </view> | 
|             <!--  --> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>车前牌照号</text> | 
|                 </view> | 
|                 <view class="value" @click="openInput(1)"> | 
|                     <text :style="{ color: param.carCodeFront ? '#000000' : '#999999' }">{{ param.carCodeFront ? param.carCodeFront : '请输入车牌号码' }}</text> | 
|                 </view> | 
|             </view> | 
|             <view class="line"> | 
|                 <view class="label"> | 
|                     <text>*</text> | 
|                     <text>车后牌照号</text> | 
|                 </view> | 
|                 <view class="value" @click="openInput(2)"> | 
|                     <text :style="{ color: param.carCodeBack     ? '#000000' : '#999999' }">{{ param.carCodeBack     ? param.carCodeBack     : '请输入车牌号码' }}</text> | 
|                 </view> | 
|             </view> | 
|             <view class="copy" @click="copy">复制车前牌照号</view> | 
|             <view class="footer"> | 
|                 <view class="handle_sub" @click="onSubmit"> | 
|                     提交 | 
|                 </view> | 
|             </view> | 
|         </view> | 
|          | 
|         <!--  --> | 
|         <u-picker :show="showReason" keyName="reason" closeOnClickOverlay @close="showReason = false" | 
|             @cancel="showReason = false" :columns="reasonList" @confirm="reasonConfirm"></u-picker> | 
|         <u-datetime-picker | 
|             :show="showDatetime" | 
|             closeOnClickOverlay | 
|             :minDate="new Date().getTime()" | 
|             mode="datetime" | 
|             @close="showDatetime = false" | 
|             @cancel="showDatetime = false" | 
|             @confirm="setinDate" | 
|         ></u-datetime-picker> | 
|         <keyboardInput ref="keyboard" @export="setPlate" @close="closeInput" /> | 
|     </view> | 
| </template> | 
|   | 
| <script> | 
| import keyboardInput from '@/components/keyboard-input/keyboard-input.vue'; | 
| import { uploadUrl, driverCarApply,driverCarApplyEdit, driverReasonList, driverApplyDetail, checkSurplusNum } from '@/api'; | 
| import dayjs from 'dayjs' | 
| export default { | 
|     components: { | 
|         keyboardInput | 
|     }, | 
|     data() { | 
|         return { | 
|             param: { | 
|                 inType: 0, | 
|                 driverName: uni.getStorageSync('driverInfo').realname, | 
|                 driverPhone: uni.getStorageSync('driverInfo').username, | 
|             }, | 
|             reasonIndex: -1, | 
|             reasonList: [], | 
|             showDatetime: false, | 
|             showReason: false, | 
|   | 
|             inputType: '' | 
|         }; | 
|     }, | 
|     onLoad(option) { | 
|         if(option && option.id){ | 
|             this.getDetail(option.id, option.type) | 
|         } | 
|         this.initData() | 
|     }, | 
|     methods: { | 
|         checkSurplus() { | 
|               const { arriveDate, reasonId, totalNum } = this.param | 
|               if(!arriveDate || !reasonId || !totalNum) return | 
|               checkSurplusNum({ | 
|                 arriveDate: arriveDate + ':00', | 
|                 reasonId, | 
|                 totalNum | 
|               }).then(res => { | 
|                 console.log('res', res); | 
|                  | 
|                 if( res.data == 0 ||  res.data < Number(totalNum)){ | 
|                   this.showToast(`当日剩余可预约作业量不足请选择其他到场日期`) | 
|                 } | 
|               }) | 
|             }, | 
|         reasonClick() { | 
|             if(this.param.id){ | 
|                 return | 
|             } | 
|             this.showReason = true | 
|         }, | 
|         onSubmit() { | 
|             const param = { ...this.param } | 
|             if (!param.arriveDate) return this.showToast('请选择到场时间') | 
|             if (!param.inType && param.inType != 0) return this.showToast('请选择作业类型') | 
|             if (!param.contractNum) return this.showToast('请输入合同/单据编号') | 
|             if (!param.totalNum) return this.showToast('请输入总运输量') | 
|             if (!param.driverName) return this.showToast('请输入司机姓名') | 
|             if (!param.driverPhone) return this.showToast('请输入手机号') | 
|             if (!param.carCodeFront) return this.showToast('请输入车前牌号') | 
|             if (!param.carCodeBack) return this.showToast('请输入车后牌号') | 
|             if (!param.transportImgFull) return this.showToast('请上传准运证/运单照片') | 
|             param.arriveDate = param.arriveDate + ':00' | 
|             let fn = param.id ? driverCarApplyEdit : driverCarApply | 
|             fn({...param}).then(res => { | 
|                 if(res && res.code === 200){ | 
|                     setTimeout(() => { | 
|                         this.showToast('预约申请成功') | 
|                     }) | 
|                     uni.redirectTo({ | 
|                         url: '/pages/driver/index' | 
|                     }) | 
|                 } | 
|             }) | 
|         }, | 
|         getDetail(id, type) { | 
|             driverApplyDetail({id}).then(res => { | 
|                 this.param = { ...res.data, transportImgFull: res.data.prefixUrl + res.data.transportImg } | 
|                 if(type && type == 'reject'){ | 
|                     this.$set(this.param, 'id', null) | 
|                 } | 
|             }) | 
|         }, | 
|         initData(){ | 
|             driverReasonList().then(res => { | 
|                 this.reasonList = [res.data] | 
|             }) | 
|         }, | 
|         reasonConfirm(e) { | 
|             const reasonList = this.reasonList[0] | 
|             const index = e.indexs[0] | 
|             this.$set(this.param, 'inReason', reasonList[index].reason) | 
|             this.$set(this.param, 'reasonId', reasonList[index].id) | 
|             this.checkSurplus() | 
|             this.showReason = false | 
|         }, | 
|         setinDate(e) { | 
|             this.$set(this.param, 'arriveDate', dayjs(e.value).format('YYYY-MM-DD HH:mm')) | 
|             this.checkSurplus() | 
|             this.showDatetime = false | 
|         }, | 
|         inTypeClick(e) { | 
|             this.param.inType = e | 
|         }, | 
|         openInput(type) { | 
|             this.inputType = type; | 
|             this.$refs.keyboard.open(); | 
|         }, | 
|         setPlate(e) { | 
|             if (this.inputType === 1) { | 
|                 this.$set(this.param, 'carCodeFront', e) | 
|             } else if (this.inputType === 2) { | 
|                 this.$set(this.param, 'carCodeBack', e) | 
|             } | 
|             this.$forceUpdate(); | 
|             this.closeInput(); | 
|         }, | 
|         closeInput() { | 
|             this.$refs.keyboard.close(); | 
|         }, | 
|         copy(){ | 
|             if(this.param.carCodeFront){ | 
|                 this.$set(this.param, 'carCodeBack', this.param.carCodeFront) | 
|                 this.showToast('复制成功'); | 
|             } | 
|         }, | 
|         handleUpload() { | 
|             let token = uni.getStorageSync('token') || '' | 
|             uni.chooseImage({ | 
|               count: 1, | 
|               success: (chooseImageRes) => { | 
|                 uni.showLoading({ title: '上传中', mask: true }) | 
|                 const tempFilePaths = chooseImageRes.tempFilePaths | 
|                 let imgs = tempFilePaths.map((value, index) => { | 
|                   return { | 
|                     name: 'file', | 
|                     uri: value | 
|                   } | 
|                 }) | 
|                 uni.uploadFile({ | 
|                   url: `${uploadUrl}`, | 
|                   files: imgs, | 
|                   name: 'file', | 
|                   formData: { | 
|                     folder: 'PLATFORM' | 
|                   }, | 
|                   header: { | 
|                     Dm_user_token: token | 
|                   }, | 
|                   success: (uploadFileRes) => { | 
|                     let res = JSON.parse(uploadFileRes.data) | 
|                     console.log('res', res.data) | 
|                     if (res.data && res.data.length > 0) { | 
|                                 this.$set(this.param, 'transportImg', res.data[0].imgaddr) | 
|                                 this.$set(this.param, 'transportImgFull', res.data[0].url) | 
|                     } | 
|                   }, | 
|                   fail(err) { | 
|                     console.log('err', err) | 
|                   }, | 
|                   complete() { | 
|                     uni.hideLoading() | 
|                   } | 
|                 }) | 
|                 // } | 
|               } | 
|             }) | 
|         }, | 
|     } | 
| }; | 
| </script> | 
|   | 
| <style lang="scss"> | 
| page { | 
|     background-color: #f7f7f7; | 
| } | 
| .main_wrap { | 
|     background-color: #fff; | 
|     margin: 0 -30rpx; | 
|     padding: 0 30rpx; | 
|     .line { | 
|         display: flex; | 
|         justify-content: space-between; | 
|         align-items: center; | 
|         border-bottom: 1rpx solid #e5e5e5; | 
|         padding: 30rpx 0; | 
|         .label { | 
|             font-size: 30rpx; | 
|             font-weight: 400; | 
|             text { | 
|                 &:nth-child(1) { | 
|                     color: #e42d2d; | 
|                     margin-right: 4rpx; | 
|                 } | 
|             } | 
|         } | 
|         .value { | 
|             flex: 1; | 
|             height: 100%; | 
|             margin-left: 30rpx; | 
|             display: flex; | 
|             align-items: center; | 
|             justify-content: flex-end; | 
|             .gray{ | 
|                 color: #999999 !important; | 
|             } | 
|             .btns { | 
|                 display: flex; | 
|                 align-items: center; | 
|                 .btn { | 
|                     height: 60rpx; | 
|                     line-height: 60rpx; | 
|                     padding: 0 16rpx; | 
|                     font-size: 26rpx; | 
|                     margin-left: 12rpx; | 
|                     border-radius: 12rpx; | 
|                     border: 1rpx solid #777777; | 
|                     color: #777777; | 
|                 } | 
|                 .active { | 
|                     background-color: #4d99a8; | 
|                     color: #fff; | 
|                     border: 1rpx solid #4d99a8; | 
|                 } | 
|             } | 
|             .unit { | 
|                 width: 64rpx; | 
|                 text-align: right; | 
|                 font-size: 26rpx; | 
|                 margin-bottom: 2rpx; | 
|             } | 
|             input { | 
|                 flex: 1; | 
|                 height: 100%; | 
|                 text-align: right; | 
|                 font-size: 28rpx; | 
|                 font-weight: 400; | 
|                 color: #222222; | 
|             } | 
|             .upload_wrap { | 
|                 width: 120rpx; | 
|                 height: 120rpx; | 
|                 border-radius: 12rpx; | 
|                 border: 2rpx solid #e5e5e5; | 
|                 background: #f7f7f7; | 
|                 color: #666666; | 
|                 display: flex; | 
|                 align-items: center; | 
|                 justify-content: center; | 
|                 overflow: hidden; | 
|                 image { | 
|                     width: 100%; | 
|                     height: 100%; | 
|                 } | 
|             } | 
|         } | 
|     } | 
| } | 
| .main_app { | 
|     padding-top: 10rpx; | 
|     .footer{ | 
|         background-color: #f7f7f7; | 
|         padding: 20rpx 30rpx 30rpx; | 
|         margin: 0 -30rpx; | 
|     } | 
|     .handle_sub{ | 
|         width: 690rpx; | 
|         background-color: #4d99a8; | 
|         height: 88rpx; | 
|         line-height: 88rpx; | 
|         text-align: center; | 
|         color: #fff; | 
|         border-radius: 50rpx; | 
|     } | 
|     .perch{ | 
|         width: 750rpx; | 
|         margin: 0 -30rpx; | 
|         height: 200rpx; | 
|         background-color: #f7f7f7; | 
|     } | 
|     .copy{ | 
|         background-color: #f7f7f7; | 
|         display: flex; | 
|         margin: 0 -30rpx; | 
|         width: 750rpx; | 
|         justify-content: flex-end; | 
|         padding: 12rpx 30rpx; | 
|         font-size: 26rpx; | 
|         color: #4d99a8; | 
|     } | 
| } | 
| .main_title { | 
|     width: 750rpx; | 
|     padding: 16rpx 30rpx; | 
|     background-color: #f7f7f7; | 
|     margin: 0 -30rpx; | 
|     color: #666666; | 
|     font-size: 26rpx; | 
| } | 
| .empty { | 
|     width: 750rpx; | 
|     height: 20rpx; | 
|     background-color: #f7f7f7; | 
|     margin: 0 -30rpx; | 
| } | 
| </style> |