From 931e45f5f78494c7af4cab75053da49b57f22fbe Mon Sep 17 00:00:00 2001 From: rk <94314517@qq.com> Date: 星期一, 13 十月 2025 14:31:43 +0800 Subject: [PATCH] 定时自动叫号 与 WMS获取车辆是否在园接口开发 --- admin/src/components/operation/OperCarUseBookParamWindow.vue | 338 +++++++++++++++++++++++++++---------------------------- 1 files changed, 165 insertions(+), 173 deletions(-) diff --git a/admin/src/components/operation/OperCarUseBookParamWindow.vue b/admin/src/components/operation/OperCarUseBookParamWindow.vue index 64f9063..19c6d8b 100644 --- a/admin/src/components/operation/OperCarUseBookParamWindow.vue +++ b/admin/src/components/operation/OperCarUseBookParamWindow.vue @@ -1,144 +1,77 @@ <template> - <GlobalWindow - :title="title" - width="1000px" - :visible.sync="visible" - :confirm-working="isWorking" - @confirm="confirm" - > + <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" style="width: 80px" :label="0" - >甯傚唴鐢ㄨ溅</el-radio - > - <el-radio v-model="form.type" style="width: 80px" :label="1" - >甯傚鐢ㄨ溅</el-radio - > + <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 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" - > + <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:ss" - :picker-options="pickerOptions" - default-time="08:00:00" - 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:ss" - :picker-options="pickerOptions2" - default-time="08:00:00" - type="datetime" - placeholder="閫夋嫨鏃ユ湡鏃堕棿" - /> + <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-select v-model="form.memberIds" multiple filterable placeholder="璇烽�夋嫨"> + <el-option v-for="item in memberList" + :key="item.memberId" :value="item.memberId" + :label="item.companyName ? `${item.realname}-${item.companyName}` : item.realname" > </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-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> + <!-- <div> 3銆佸�熷嚭杞﹁締蹇呴』閬靛畧浜ら�氳鍒欙紝瀹夊叏琛岄┒銆傚浜庤溅杈嗗彂鐢熶氦閫氭剰澶栵紝瀵瑰綋浜嬩汉鍙婄涓夋柟閫犳垚浜鸿韩浼ゅ鍙婃崯澶憋紝鍏徃鍙互鍗忓姪澶勭悊淇濋櫓鍏徃璧斿伩鐩稿叧浜嬪疁锛屼絾涓嶆壙鎷呬换浣曡矗浠诲拰璐圭敤銆� </div> <div> 4銆佸叕鍙稿�熺粰鐢宠浜虹敤杞︼紝鐢宠鍊熻溅浜轰负绗竴璐d换浜猴紝涓嶅厑璁歌浆鍊熺粰鍏朵粬浜轰娇鐢紝鑻ヨ鍊熺粰浠栦汉浣跨敤銆傝矗浠讳汉瑕佹壙鎷呭叏閮ㄨ矗浠汇�� - </div> + </div> --> </div> </div> <!-- 甯傚唴 --> - <el-dialog - title="閫夋嫨鐢ㄨ溅鏃堕棿" - :visible.sync="isShowTime" - append-to-body - width="600px" - > + <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="閫夋嫨鏃ユ湡" + <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; + return time.getTime() < Date.now() - 8.64e7 * 7; }, - }" - @change="seletedDate" - > + }" @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.isUse == 1, - active: item.checked == '1', - hasSub: item.carUseBookId, - }" - @click="datetimeClick(item, i)" - v-for="(item, i) in timeList" - :key="i" - > + <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> @@ -152,41 +85,25 @@ </div> </div> <span slot="footer" class="dialog-footer"> - <div>宸查�夋嫨锛歿{ selDatetime }}</div> + <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-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:ss" - value-format="yyyy-MM-dd HH:mm:ss" - type="datetime" - :default-time="defaultTime" - :picker-options="pickerOptionsNow" - @change="seletedShiwaiDate(1)" - > + <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:ss" - value-format="yyyy-MM-dd HH:mm:ss" - type="datetime" - :default-time="defaultTime" - :picker-options="pickerOptions" - @change="seletedShiwaiDate" - > + <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> @@ -202,8 +119,7 @@ <span> {{ item.startTime.slice(5, 16) }}鑷硔{ item.endTime.slice(5, 16) - }}</span - > + }}</span> </div> <div class="line"> <span>鐩殑鍦�</span> @@ -225,23 +141,22 @@ </div> <span slot="footer" class="dialog-footer"> - <div>宸查�夋嫨锛歿{ selDatetime }}</div> - <div class="btn" :class="{disable: info && info.length > 0}" @click="subTime">纭鏃堕棿</div> + <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" - > + <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 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> @@ -257,10 +172,11 @@ </div> <div class="line"> <div class="label">鐢宠浜�</div> - <div class="value">{{ activeInfo.memberName }} <span class="primaryColor ml12">{{ activeInfo.memberPhone }}</span></div> + <div class="value">{{ activeInfo.memberName }} <span class="primaryColor ml12">{{ activeInfo.memberPhone + }}</span></div> </div> </div> - </el-dialog> + </el-dialog> </GlobalWindow> </template> @@ -272,6 +188,7 @@ import { carCanReservationDate, carUseBookCraete, carUseBookList, detail } from '@/api/business/carUseBook' import { findTypeMemberInfo } from '@/api/business/memberCard' import dayjs from 'dayjs' +import { findAllList as userList } from '@/api/system/user' export default { name: 'OperCarUseBookParamWindow', @@ -287,6 +204,7 @@ timeList: [], defaultTime: dayjs().format('HH:mm:ss'), selDatetime: '', + selPastDatetime: '', colorOptions: [ { color: this.$store.state.primaryColor, name: '宸查�夋嫨' }, { color: '#F7F7F7', name: '鍙绾�' }, @@ -334,7 +252,7 @@ }, pickerOptionsNow: { disabledDate: (time) => { - return time.getTime() < Date.now() - 8.64e7; + return time.getTime() < Date.now() - 8.64e7 * 7 } }, // 楠岃瘉瑙勫垯 @@ -353,18 +271,18 @@ computed: { }, - watch: { - 'form.planUseDate': { - handler (newValue, oldValue) { - if (newValue) { - this.$set(this.pickerOptions, 'selectableRange', this.form.startTime.slice(11, 19) + ' - ' + this.form.endTime.slice(11, 19)) - // this.startPickerOptions = this.startPickerOptions - } - }, - deep: true, - immediate: true - } - }, + // 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() }, @@ -386,14 +304,17 @@ const memberList = [] form.memberIds.forEach(i => { this.memberList.forEach(item => { - if (i === item.id) { + if (i === item.memberId) { memberList.push(item) } }) }) - form.memberNames = memberList.map(i => i.name).join(',') + form.memberNames = memberList.map(i => i.realname).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 @@ -419,6 +340,14 @@ 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', '') @@ -436,10 +365,10 @@ 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.$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', null) + this.$set(this.form, 'planUseDate', selTimeList[0].startTime.slice(0, 16)) this.$forceUpdate() } else { this.$refs.modalRef.validate((valid) => { @@ -447,9 +376,12 @@ 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) { @@ -497,7 +429,14 @@ // console.log('selTimeList', selTimeList); if (selTimeLists.length === 0) { this.selDatetime = '' + this.selPastDatetime = '' } else { + const 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 } }, @@ -506,18 +445,26 @@ }, seletedShiwaiDate (str) { const { form } = this - if(str && str == 1){ + 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, - endTime: form.endTime + startTime: form.startTime + ':00', + endTime: form.endTime + ':59' }).then(res => { this.info = res || [] }) + } else { + this.selPastDatetime = '' } }, gettimes () { @@ -528,6 +475,7 @@ }).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 }) @@ -539,12 +487,17 @@ }).then(res => { this.carsList = res }) - findTypeMemberInfo({ + userList({ queryParam: this.filterText, querySpecial: 1, type: 2, companyType: 1, workStatus: 0 }) + .then(res => { + this.memberList = res || [] + }) + /* findTypeMemberInfo({ type: '2', - companyType: 1 + companyType: 1, + querySpecial: 1 }).then(res => { this.memberList = res || [] - }) + }) */ } } } @@ -552,14 +505,18 @@ <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; @@ -573,54 +530,73 @@ 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; - 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; + 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 { - background-color: $primary-color; - color: #fff; - } - .disable { - background-color: #cccccc; - color: #999999; + border-color: $primary-color; + background-color: #f6f9fe; + color: $primary-color; } .hasSub { - color: #fff; - background: #cccccc; - } + 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; @@ -628,10 +604,12 @@ } } } + .dialog-footer { display: flex; align-items: center; justify-content: space-between; + .btn { height: 42px; line-height: 42px; @@ -641,21 +619,26 @@ text-align: center; cursor: pointer; } - .disable{ + + .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; @@ -664,14 +647,17 @@ 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; } @@ -679,26 +665,32 @@ } } } + .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; } -- Gitblit v1.9.3