| | |
| | | @confirm="confirm" |
| | | > |
| | | <div class="modal_wrap"> |
| | | <el-form :model="form" ref="form" class="el_form" :rules="rules"> |
| | | <el-form :model="form" ref="formRef" class="el_form" :rules="rules"> |
| | | <el-form-item label="用车范围" prop="type"> |
| | | <el-radio v-model="form.type" :label="0">室内用车</el-radio> |
| | | <el-radio v-model="form.type" :label="1">室外用车</el-radio> |
| | | <el-radio v-model="form.type" style="width: 80px;" :label="0">市内用车</el-radio> |
| | | <el-radio v-model="form.type" style="width: 80px;" :label="1">市外用车</el-radio> |
| | | </el-form-item> |
| | | <el-form-item label="选择车辆" prop="carId"> |
| | | <el-select v-model="form.carId" placeholder="选择车辆"> |
| | | <el-option |
| | | v-for="item in carsList" |
| | | :key="item.carId" |
| | | :label="item.carCode" |
| | | :value="item.carId" |
| | | :key="item.id" |
| | | :label="item.code" |
| | | :value="item.id" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="用车时间" prop="sortnum"> |
| | | <div></div> |
| | | <div class="sel_btn" @click="openTime">选择时间</div> |
| | | <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="sortnum"> |
| | | <el-form-item label="预计出发时间" prop="planUseDate"> |
| | | <el-date-picker |
| | | v-model="form.a" |
| | | :disabled="!form.startTime" |
| | | v-model="form.planUseDate" |
| | | format="yyyy-MM-dd HH:mm:ss" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | :picker-options="pickerOptions" |
| | | default-time="08:00:00" |
| | | type="datetime" |
| | | placeholder="选择日期时间" |
| | | > |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="目的地" prop="sortnum"> |
| | | <el-form-item label="目的地" prop="addr"> |
| | | <el-input v-model="form.addr" placeholder="请输入内容"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="乘车人员" prop="sortnum"> </el-form-item> |
| | | <el-form-item label="用车事由" prop="sortnum"> |
| | | <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" |
| | |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="tip_wrap">111</div> |
| | | <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="600px" |
| | | > |
| | | <el-form :model="form" ref="form" class="el_form" :rules="rules"> |
| | | <el-form :model="form" ref="modalRef" class="el_form" :rules="rules"> |
| | | <el-form-item label="用车日期" prop="dateDay"> |
| | | <el-date-picker |
| | | v-model="form.dateDay" |
| | |
| | | @click="datetimeClick(item, i)" |
| | | v-for="(item, i) in timeList" |
| | | :key="i" |
| | | >{{ item.startHours }}-{{ item.endHours }}</div |
| | | > |
| | | {{ 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>已选择:{{ selDatetime }}</div> |
| | | <div class="btn" @click="subTime">确认时间</div> |
| | | </span> |
| | | </el-dialog> |
| | | <!-- 市外 --> |
| | | <el-dialog |
| | | title="选择用车时间" |
| | | :visible.sync="isShowShiwai" |
| | | append-to-body |
| | | width="600px" |
| | | > |
| | | <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:ss" |
| | | type="datetime" |
| | | :picker-options="pickerOptions" |
| | | default-time="08:00:00" |
| | | @change="seletedShiwaiDate" |
| | | > |
| | | </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:ss" |
| | | type="datetime" |
| | | :picker-options="pickerOptions" |
| | | default-time="08:00:00" |
| | | @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="card">{{ item.carCode }}</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"> |
| | | <text>用车事由</text> |
| | | <text>{{ item.content }}</text> |
| | | </div> |
| | | <div class="line"> |
| | | <span>申请人</span> |
| | | <span>{{ item.memberName }} {{ item.memberMobile }}</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <span slot="footer" class="dialog-footer"> |
| | | <div>已选择:{{ selDatetime }}</div> |
| | | <div class="btn" @click="subTime">确认时间</div> |
| | | </span> |
| | | </el-dialog> |
| | | </GlobalWindow> |
| | | </template> |
| | |
| | | import GlobalWindow from '@/components/common/GlobalWindow' |
| | | import { allList } from '@/api/business/member' |
| | | import { allList as getCarList } from '@/api/business/cars' |
| | | import { carCanReservationDate } from '@/api/business/carUseBook' |
| | | import { carCanReservationDate, carUseBookCraete, carUseBookList } from '@/api/business/carUseBook' |
| | | import { findTypeMemberInfo } from '@/api/business/memberCard' |
| | | export default { |
| | | name: 'OperCarUseBookParamWindow', |
| | | extends: BaseOpera, |
| | |
| | | return { |
| | | // 表单数据 |
| | | isShowTime: false, |
| | | isShowShiwai: false, |
| | | |
| | | memberList: [], |
| | | timeList: [], |
| | | selDatetime: '', |
| | | colorOptions: [ |
| | | { color: this.$store.state.primaryColor, name: '已选择' }, |
| | | { color: '#F7F7F7', name: '可预约' }, |
| | | { color: '#cccccc', name: '不可预约' } |
| | | ], |
| | | info: [], |
| | | |
| | | carsList: [], |
| | | form: { |
| | | type: 0 |
| | | type: 0, |
| | | memberIds: [] |
| | | }, |
| | | pickerOptions: { |
| | | disabledDate: (time) => { |
| | | if (this.form.startTime && this.form.endTime) { |
| | | const minTime = new Date(this.form.startTime).getTime() - 8.64e7 |
| | | return ( |
| | | time.getTime() < minTime |
| | | ) |
| | | } else { |
| | | return time.getTime() < Date.now() - 8.64e7 |
| | | } |
| | | } |
| | | }, |
| | | // 验证规则 |
| | | rules: { |
| | | name: [ |
| | | { required: true, message: '请输入名称' } |
| | | ] |
| | | 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' }] |
| | | } |
| | | } |
| | | }, |
| | |
| | | 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(',') |
| | | if (valid) { |
| | | carUseBookCraete({ |
| | | ...form |
| | | }).then(res => { |
| | | this.visible = false |
| | | this.$emit('success') |
| | | }) |
| | | } |
| | | }) |
| | | }, |
| | | openTime () { |
| | | const { form } = this |
| | | if(!form.carId){ |
| | | this.$tip.warning('请先选择车辆') |
| | | if (!form.carId) { |
| | | return this.$tip.error('请先选择车辆') |
| | | } |
| | | this.isShowTime = true |
| | | if (this.form.type === 0) { |
| | | this.isShowTime = true |
| | | } else { |
| | | this.isShowShiwai = true |
| | | } |
| | | }, |
| | | subTime () { |
| | | 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) |
| | | this.$set(this.form, 'endTime', selTimeList[selTimeList.length - 1].endTime) |
| | | this.isShowTime = false |
| | | this.$set(this.form, 'planUseDate', null) |
| | | this.$forceUpdate() |
| | | } else { |
| | | this.$refs.modalRef.validate((valid) => { |
| | | this.isShowShiwai = false |
| | | }) |
| | | } |
| | | }, |
| | | datetimeClick (item, index) { |
| | | 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 = '' |
| | | } else { |
| | | this.selDatetime = this.form.dateDay.slice(5) + ' ' + selTimeLists[0].startHours + '-' + selTimeLists[selTimeLists.length - 1].endHours |
| | | } |
| | | }, |
| | | seletedDate (e) { |
| | | console.log(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.gettimes() |
| | | }, |
| | | seletedShiwaiDate () { |
| | | const { form } = this |
| | | if (form.startTime && form.endTime) { |
| | | this.selDatetime = form.startTime + '-' + form.endTime |
| | | carUseBookList({ |
| | | carId: form.carId, |
| | | startTime: form.startTime, |
| | | endTime: form.endTime |
| | | }).then(res => { |
| | | this.info = res || [] |
| | | }) |
| | | } |
| | | this.isShowCar = false |
| | | }, |
| | | gettimes () { |
| | | const { param } = this |
| | | const { form } = this |
| | | carCanReservationDate({ |
| | | dateDay: param.queryDate, |
| | | carId: param.carId |
| | | dateDay: form.dateDay, |
| | | carId: form.carId |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | this.timeList = res.data || [] |
| | | this.timeList.forEach((i, j) => { |
| | | i.checked = '0', |
| | | i.index = j |
| | | }) |
| | | } |
| | | this.timeList = res || [] |
| | | this.timeList.forEach((i, j) => { |
| | | i.checked = '0', |
| | | i.index = j |
| | | }) |
| | | }) |
| | | }, |
| | | initData () { |
| | | getCarList({ |
| | | type: 1 |
| | | }).then(res => { |
| | | this.carsList = res.data || [] |
| | | this.carsList = res |
| | | }) |
| | | findTypeMemberInfo({ |
| | | type: '2' |
| | | }).then(res => { |
| | | this.memberList = res || [] |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | <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 { |
| | |
| | | border-radius: 4px; |
| | | border: 1px solid #dcdfe6; |
| | | margin-top: 32px; |
| | | text-align: right; |
| | | text-align: left; |
| | | padding-left: 12px; |
| | | color: #999999; |
| | | padding-right: 12px; |
| | | box-sizing: border-box; |
| | | cursor: pointer; |
| | | } |
| | | .text { |
| | | color: #606266; |
| | | } |
| | | } |
| | | .tip_wrap { |
| | | width: 460px; |
| | | flex: 1; |
| | | margin-left: 30px; |
| | | padding: 0 30px; |
| | | h1{ |
| | | margin-bottom: 20px; |
| | | } |
| | | div{ |
| | | line-height: 28px; |
| | | } |
| | | } |
| | | } |
| | | .time_list { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | flex-wrap: wrap; |
| | | .item { |
| | | width: 154px; |
| | | height: 32px; |
| | | line-height: 32px; |
| | | text-align: center; |
| | | background: #f7f7f7; |
| | | border-radius: 4px; |
| | | margin-bottom: 10px; |
| | | } |
| | | .active { |
| | | background-color: $primary-color; |
| | | color: #fff; |
| | | } |
| | | .disable { |
| | | background-color: #cccccc; |
| | | color: #999999; |
| | | } |
| | | } |
| | | .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; |
| | | } |
| | | } |
| | | .have_info { |
| | | padding: 0 0 120px; |
| | | .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; |
| | | text { |
| | | &:nth-of-type(1) { |
| | | width: 80px; |
| | | color: #888888; |
| | | } |
| | | &:nth-of-type(2) { |
| | | flex: 1; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </style> |