<template>
|
<GlobalWindow :title="title" width="1000px" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm">
|
<div class="modal_wrap">
|
<el-form :model="form" ref="formRef" class="el_form" :rules="rules">
|
<el-form-item label="用车范围" prop="type">
|
<el-radio v-model="form.type" @change="changeType" style="width: 80px" :label="0">市内用车</el-radio>
|
<el-radio v-model="form.type" @change="changeType" style="width: 80px" :label="1">市外用车</el-radio>
|
</el-form-item>
|
<el-form-item label="选择车辆" prop="carId">
|
<el-select v-model="form.carId" @change="clearTime" placeholder="选择车辆">
|
<el-option v-for="item in carsList" :key="item.id" :label="item.code" :value="item.id">
|
</el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="用车时间" prop="startTime">
|
<div v-if="form.startTime && form.endTime" class="sel_btn text" @click="openTime">
|
{{ form.startTime }}-{{ form.endTime }}
|
</div>
|
<div v-else class="sel_btn" @click="openTime">选择时间</div>
|
</el-form-item>
|
<el-form-item label="预计出发时间" prop="planUseDate">
|
<el-date-picker v-if="form.type == '0'" :disabled="!form.startTime" v-model="form.planUseDate"
|
format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm" type="datetime" placeholder="选择日期时间" />
|
<el-date-picker v-if="form.type == '1'" :disabled="!form.startTime" v-model="form.planUseDate"
|
format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm" type="datetime" placeholder="选择日期时间" />
|
</el-form-item>
|
<el-form-item label="目的地" prop="addr">
|
<el-input v-model="form.addr" placeholder="请输入内容"></el-input>
|
</el-form-item>
|
<el-form-item label="乘车人员" prop="memberIds">
|
<el-select v-model="form.memberIds" multiple filterable placeholder="请选择">
|
<el-option v-for="item in memberList" :key="item.id" :label="item.name" :value="item.id">
|
</el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="用车事由" prop="content">
|
<el-input v-model="form.content" type="textarea" placeholder="请输入" :rows="4"></el-input>
|
</el-form-item>
|
</el-form>
|
<div class="tip_wrap">
|
<h1>注意事项:</h1>
|
<div>1、公司车辆外出需办理用车申请表,经批准后方可外出(借出)。</div>
|
<div>2、市外用车需领导审核。</div>
|
<!-- <div>
|
3、借出车辆必须遵守交通规则,安全行驶。对于车辆发生交通意外,对当事人及第三方造成人身伤害及损失,公司可以协助处理保险公司赔偿相关事宜,但不承担任何责任和费用。
|
</div>
|
<div>
|
4、公司借给申请人用车,申请借车人为第一责任人,不允许转借给其他人使用,若要借给他人使用。责任人要承担全部责任。
|
</div> -->
|
</div>
|
</div>
|
|
<!-- 市内 -->
|
<el-dialog title="选择用车时间" :visible.sync="isShowTime" append-to-body width="640px">
|
<el-form :model="form" ref="modalRef" class="el_form" :rules="rules">
|
<el-form-item label="用车日期" prop="dateDay">
|
<el-date-picker v-model="form.dateDay" value-format="yyyy-MM-dd" type="date" placeholder="选择日期"
|
:picker-options="{
|
disabledDate(time) {
|
return time.getTime() < Date.now() - 8.64e7 * 7;
|
},
|
}" @change="seletedDate">
|
</el-date-picker>
|
</el-form-item>
|
<el-form-item label="用车时间" prop="dateDay">
|
<div>
|
<div class="time_list">
|
<div 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 }}
|
</div>
|
</div>
|
</div>
|
</el-form-item>
|
</el-form>
|
<div class="color_op">
|
<div class="item" v-for="item in colorOptions" :key="item.name">
|
<div class="box" :style="{ background: item.color }"></div>
|
<div class="">{{ item.name }}</div>
|
</div>
|
</div>
|
<span slot="footer" class="dialog-footer">
|
<div style="text-align: left;">
|
<div>已选择:{{ selDatetime }}</div>
|
<div class="red">{{ selPastDatetime }}</div>
|
</div>
|
<div class="btn" @click="subTime">确认时间</div>
|
</span>
|
</el-dialog>
|
<!-- 市外 -->
|
<el-dialog title="选择用车时间" :visible.sync="isShowShiwai" append-to-body width="600px" :before-close="clearTime">
|
<el-form :model="form" ref="modalRef" class="el_form" :rules="rules">
|
<el-form-item label="用车开始时间" prop="startTime">
|
<el-date-picker v-model="form.startTime" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm"
|
type="datetime" :default-time="defaultTime" :picker-options="pickerOptionsNow"
|
@change="seletedShiwaiDate(1)">
|
</el-date-picker>
|
</el-form-item>
|
<el-form-item label="用车结束时间" prop="endTime">
|
<el-date-picker v-model="form.endTime" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm"
|
type="datetime" :default-time="defaultTime" :picker-options="pickerOptions" @change="seletedShiwaiDate">
|
</el-date-picker>
|
</el-form-item>
|
</el-form>
|
<div class="have_info" v-if="info && info.length > 0">
|
<div class="tit">您申请的用车时段已有车辆预约</div>
|
<div class="content" v-for="(item, i) in info" :key="i">
|
<div class="df_sb">
|
<span class="card" v-if="item.carCode">{{ item.carCode }}</span>
|
<span>{{ i + 1 }}/{{ info.length }}</span>
|
</div>
|
<div class="line">
|
<span>用车时段</span>
|
<span>
|
{{ item.startTime.slice(5, 16) }}至{{
|
item.endTime.slice(5, 16)
|
}}</span>
|
</div>
|
<div class="line">
|
<span>目的地</span>
|
<span>{{ item.addr }}</span>
|
</div>
|
<div class="line">
|
<span>乘车人数</span>
|
<span>{{ item.memberIds.split(",").length }}人</span>
|
</div>
|
<div class="line">
|
<span>用车事由</span>
|
<span>{{ item.content }}</span>
|
</div>
|
<div class="line">
|
<span>申请人</span>
|
<span>{{ item.memberName }} <span class="primaryColor">{{ item.memberMobile }}</span></span>
|
</div>
|
</div>
|
</div>
|
|
<span slot="footer" class="dialog-footer">
|
<div style="text-align: left;">
|
<div>已选择:{{ selDatetime }}</div>
|
<div class="red">{{ selPastDatetime }}</div>
|
</div>
|
<div class="btn" :class="{ disable: info && info.length > 0 }" @click="subTime">确认时间</div>
|
</span>
|
</el-dialog>
|
<!-- 详情 -->
|
<el-dialog title="选择用车时间" :visible.sync="isShowDetail" append-to-body width="600px">
|
<div class="detail_modal">
|
<div class="title">车辆预约情况</div>
|
<div class="h1" v-if="activeInfo.carCode">{{ activeInfo.carCode }}</div>
|
<div class="line">
|
<div class="label">预计用车时段</div>
|
<div class="value" v-if="activeInfo.startTime">{{ activeInfo.startTime.slice(5, 16) }} - {{
|
activeInfo.endTime.slice(5, 16) }}</div>
|
</div>
|
<div class="line">
|
<div class="label">目的地</div>
|
<div class="value">{{ activeInfo.addr }}</div>
|
</div>
|
<div class="line">
|
<div class="label">乘车人数</div>
|
<div class="value" v-if="activeInfo.memberIds">{{ activeInfo.memberIds.split(',').length }}人</div>
|
</div>
|
<div class="line">
|
<div class="label">用车事由</div>
|
<div class="value">{{ activeInfo.content || '' }}</div>
|
</div>
|
<div class="line">
|
<div class="label">申请人</div>
|
<div class="value">{{ activeInfo.memberName }} <span class="primaryColor ml12">{{ activeInfo.memberPhone
|
}}</span></div>
|
</div>
|
</div>
|
</el-dialog>
|
</GlobalWindow>
|
</template>
|
|
<script>
|
import BaseOpera from '@/components/base/BaseOpera'
|
import GlobalWindow from '@/components/common/GlobalWindow'
|
import { allList } from '@/api/business/member'
|
import { allList as getCarList } from '@/api/business/cars'
|
import { carCanReservationDate, carUseBookCraete, carUseBookList, detail } from '@/api/business/carUseBook'
|
import { findTypeMemberInfo } from '@/api/business/memberCard'
|
import dayjs from 'dayjs'
|
|
export default {
|
name: 'OperCarUseBookParamWindow',
|
extends: BaseOpera,
|
components: { GlobalWindow },
|
data() {
|
return {
|
// 表单数据
|
isShowTime: false,
|
isShowShiwai: false,
|
|
memberList: [],
|
timeList: [],
|
defaultTime: dayjs().format('HH:mm:ss'),
|
selDatetime: '',
|
selPastDatetime: '',
|
colorOptions: [
|
{ color: this.$store.state.primaryColor, name: '已选择' },
|
{ color: '#F7F7F7', name: '可预约' },
|
{ color: '#cccccc', name: '不可预约' }
|
],
|
info: [],
|
|
carsList: [],
|
form: {
|
type: 0,
|
startTime: '',
|
endTime: '',
|
memberIds: []
|
},
|
activeInfo: {},
|
isShowDetail: false,
|
carBookInfo: {},
|
pickerOptions: {
|
disabledDate: (time) => {
|
if (this.form.startTime) {
|
const minTime = new Date(this.form.startTime).getTime() - 8.64e7
|
const maxTime = this.form.endTime ? new Date(this.form.endTime).getTime() : ''
|
return (
|
// maxTime ? time.getTime() < minTime || time.getTime() > maxTime : time.getTime() < minTime
|
time.getTime() < minTime
|
)
|
} else {
|
return time.getTime() < Date.now() - 8.64e7
|
}
|
}
|
},
|
pickerOptions2: {
|
disabledDate: (time) => {
|
if (this.form.startTime && this.form.endTime) {
|
const minTime = new Date(this.form.startTime).getTime()
|
const maxTime = new Date(this.form.endTime).getTime()
|
return (
|
time.getTime() < minTime - 8.64e7 || time.getTime() > maxTime
|
)
|
} else {
|
return time.getTime() < Date.now() - 8.64e7
|
}
|
},
|
selectableRange: '00:00:00 - 23:59:59'
|
},
|
pickerOptionsNow: {
|
disabledDate: (time) => {
|
return time.getTime() < Date.now() - 8.64e7 * 7
|
}
|
},
|
// 验证规则
|
rules: {
|
type: [{ required: true, message: '请选择', trigger: 'change' }],
|
carId: [{ required: true, message: '请选择', trigger: 'change' }],
|
startTime: [{ required: true, message: '请选择', trigger: 'change' }],
|
endTime: [{ required: true, message: '请选择', trigger: 'change' }],
|
planUseDate: [{ required: true, message: '请选择', trigger: 'change' }],
|
addr: [{ required: true, message: '请输入', trigger: 'blur' }],
|
memberIds: [{ type: 'array', required: true, message: '请选择', trigger: 'change' }],
|
content: [{ required: true, message: '请输入', trigger: 'blur' }]
|
}
|
}
|
},
|
computed: {
|
|
},
|
// watch: {
|
// 'form.planUseDate': {
|
// handler (newValue, oldValue) {
|
// if (newValue) {
|
// this.$set(this.pickerOptions, 'selectableRange', this.form.startTime.slice(11, 16) + ' - ' + this.form.endTime.slice(11, 16))
|
// // this.startPickerOptions = this.startPickerOptions
|
// }
|
// },
|
// deep: true,
|
// immediate: true
|
// }
|
// },
|
created() {
|
this.initData()
|
},
|
methods: {
|
open() {
|
this.title = '新建公务车用车申请'
|
this.form = {
|
type: 0,
|
memberIds: []
|
}
|
this.$nextTick(() => {
|
this.$refs.formRef.clearValidate()
|
})
|
this.visible = true
|
},
|
confirm() {
|
const form = JSON.parse(JSON.stringify(this.form))
|
this.$refs.formRef.validate((valid) => {
|
const memberList = []
|
form.memberIds.forEach(i => {
|
this.memberList.forEach(item => {
|
if (i === item.id) {
|
memberList.push(item)
|
}
|
})
|
})
|
form.memberNames = memberList.map(i => i.name).join(',')
|
form.memberList = memberList
|
form.memberIds = form.memberIds.join(',')
|
form.startTime = form.startTime + ':00'
|
form.planUseDate = form.planUseDate + ':00'
|
form.endTime = form.endTime + ':59'
|
if (valid) {
|
carUseBookCraete({
|
...form
|
}).then(res => {
|
this.visible = false
|
this.$emit('success')
|
})
|
}
|
})
|
},
|
openTime() {
|
const { form } = this
|
if (!form.carId) {
|
return this.$tip.error('请先选择车辆')
|
}
|
if (this.form.type === 0) {
|
this.$set(this.form, 'dateDay', '')
|
this.timeList = []
|
this.isShowTime = true
|
} else {
|
this.clearTime()
|
this.selDatetime = ''
|
this.isShowShiwai = true
|
}
|
},
|
changeType() {
|
this.$set(this.form, 'startTime', '')
|
this.$set(this.form, 'endTime', '')
|
this.$set(this.form, 'planUseDate', '')
|
this.$nextTick(() => {
|
this.$refs.formRef.clearValidate()
|
})
|
},
|
clearTime() {
|
this.isShowShiwai = false
|
this.$set(this.form, 'startTime', '')
|
this.$set(this.form, 'endTime', '')
|
this.$nextTick(() => {
|
if (this.$refs.modalRef) {
|
this.$refs.modalRef.clearValidate()
|
}
|
})
|
},
|
subTime() {
|
if (this.info && this.info.length > 0) return
|
if (this.form.type === 0) {
|
const selTimeList = this.timeList.filter(i => i.checked == '1')
|
if (selTimeList.length === 0) {
|
return this.$tip.error('请先选择用车时间段')
|
}
|
this.$set(this.form, 'startTime', selTimeList[0].startTime.slice(0, 16))
|
this.$set(this.form, 'endTime', selTimeList[selTimeList.length - 1].endTime.slice(0, 16))
|
this.isShowTime = false
|
this.$set(this.form, 'planUseDate', selTimeList[0].startTime.slice(0, 16))
|
this.$forceUpdate()
|
} else {
|
this.$refs.modalRef.validate((valid) => {
|
const { form } = this
|
if (new Date(form.startTime).getTime() > new Date(form.endTime).getTime()) {
|
return this.$tip.error('结束时间应大于开始时间')
|
}
|
this.$set(this.form, 'planUseDate', form.startTime)
|
this.$forceUpdate()
|
this.isShowShiwai = false
|
})
|
}
|
console.log('form', this.form)
|
},
|
datetimeClick(item, index) {
|
if (item.carUseBookId) {
|
detail(
|
item.carUseBookId
|
).then(res => {
|
this.activeInfo = res
|
this.isShowDetail = true
|
})
|
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 this.$tip.error('请选择相邻的时间段')
|
}
|
} else {
|
if (index === selTimeList[0].index || index === selTimeList[selTimeList.length - 1].index) {
|
item.checked = false
|
this.$forceUpdate()
|
} else {
|
return this.$tip.error('请先取消最外层的时间段')
|
}
|
}
|
}
|
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.form.dateDay.slice(5) + ' ' + selTimeLists[0].startHours + '-' + selTimeLists[selTimeLists.length - 1].endHours
|
}
|
},
|
seletedDate(e) {
|
this.gettimes()
|
},
|
seletedShiwaiDate(str) {
|
const { form } = this
|
if (str && str == 1) {
|
this.$set(this.form, 'endTime', '')
|
}
|
|
if (form.startTime && form.endTime) {
|
this.selDatetime = form.startTime + ' - ' + form.endTime
|
if(new Date(form.startTime).getTime() < new Date().getTime()){
|
this.selPastDatetime = '当前选择包含已经过去时间,请确认后再提交;'
|
}else{
|
this.selPastDatetime = ''
|
}
|
carUseBookList({
|
carId: form.carId,
|
startTime: form.startTime + ':00',
|
endTime: form.endTime + ':59'
|
}).then(res => {
|
this.info = res || []
|
})
|
}else{
|
this.selPastDatetime = ''
|
}
|
},
|
gettimes() {
|
const { form } = this
|
carCanReservationDate({
|
dateDay: form.dateDay,
|
carId: form.carId
|
}).then(res => {
|
this.timeList = res || []
|
this.timeList.forEach((i, j) => {
|
i.pastFlag = new Date().getTime() > new Date(i.startTime).getTime()
|
i.checked = '0',
|
i.index = j
|
})
|
|
})
|
},
|
initData() {
|
getCarList({
|
type: 0
|
}).then(res => {
|
this.carsList = res
|
})
|
findTypeMemberInfo({
|
type: '2',
|
companyType: 1,
|
querySpecial: 1
|
}).then(res => {
|
this.memberList = res || []
|
})
|
}
|
}
|
}
|
</script>
|
|
<style scoped lang="scss">
|
@import "@/assets/style/variables.scss";
|
|
div {
|
box-sizing: border-box;
|
}
|
|
.modal_wrap {
|
display: flex;
|
padding: 20px 0;
|
|
.el_form {
|
flex: 1;
|
|
.sel_btn {
|
width: 100%;
|
height: 32px;
|
border-radius: 4px;
|
border: 1px solid #dcdfe6;
|
margin-top: 32px;
|
text-align: left;
|
padding-left: 12px;
|
color: #999999;
|
padding-right: 12px;
|
box-sizing: border-box;
|
cursor: pointer;
|
}
|
|
.text {
|
color: #606266;
|
}
|
}
|
|
.tip_wrap {
|
flex: 1;
|
margin-left: 30px;
|
padding: 0 30px;
|
|
h1 {
|
margin-bottom: 20px;
|
}
|
|
div {
|
line-height: 28px;
|
}
|
}
|
}
|
|
.time_list {
|
display: flex;
|
flex-wrap: wrap;
|
|
.item {
|
margin-right: 8px;
|
margin-bottom: 8px;
|
font-size: 14px;
|
font-weight: 400;
|
line-height: 14px;
|
width: 124px;
|
height: 36px;
|
display: flex;
|
justify-content: center;
|
align-items: center;
|
border-radius: 5px;
|
color: #111;
|
border: #cccccc solid 1px;
|
cursor: pointer;
|
}
|
|
|
.disable {
|
color: #fff;
|
border-color: #cccccc;
|
background-color: #cccccc;
|
}
|
.active {
|
border-color: $primary-color;
|
background-color: #f6f9fe;
|
color: $primary-color;
|
}
|
.hasSub {
|
border-color: #bed6f9;
|
background-color: #bed6f9;
|
color: #fff;
|
}
|
}
|
|
.color_op {
|
display: flex;
|
|
.item {
|
display: flex;
|
align-items: center;
|
margin-right: 10px;
|
|
.box {
|
margin-right: 4px;
|
width: 16px;
|
height: 16px;
|
}
|
}
|
}
|
|
.dialog-footer {
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
|
.btn {
|
height: 42px;
|
line-height: 42px;
|
background-color: $primary-color;
|
color: #fff;
|
width: 120px;
|
text-align: center;
|
cursor: pointer;
|
}
|
|
.disable {
|
background: #cccccc;
|
}
|
}
|
|
.have_info {
|
padding: 0 0 60px;
|
|
.tit {
|
color: #ed4545;
|
margin: 20px 0 12px;
|
}
|
|
.content {
|
background: #f7f7f7;
|
border-radius: 8px;
|
padding: 15px 15px 5px;
|
margin-bottom: 10px;
|
|
.card {
|
margin-bottom: 15px;
|
font-weight: 500;
|
font-size: 16px;
|
color: #222222;
|
background: #f7f7f7;
|
padding: 0;
|
}
|
|
.line {
|
display: flex;
|
margin-bottom: 10px;
|
|
span {
|
&:nth-of-type(1) {
|
width: 80px;
|
color: #888888;
|
}
|
|
&:nth-of-type(2) {
|
flex: 1;
|
}
|
}
|
}
|
}
|
}
|
|
.detail_modal {
|
padding: 20px 15px;
|
|
.title {
|
text-align: center;
|
font-weight: 600;
|
font-size: 16px;
|
margin-bottom: 20px;
|
}
|
|
.h1 {
|
font-weight: 600;
|
font-size: 16px;
|
margin-bottom: 16px;
|
}
|
|
.line {
|
display: flex;
|
margin-bottom: 10px;
|
|
.label {
|
width: 120px;
|
color: #888888;
|
}
|
|
.value {
|
color: #333333;
|
}
|
}
|
}
|
</style>
|