From 5a85dcab83e969d6b21c599b512a15117e9b8651 Mon Sep 17 00:00:00 2001 From: liukangdong <898885815@qq.com> Date: 星期四, 04 七月 2024 08:54:30 +0800 Subject: [PATCH] '' --- admin/src/components/business/operaVisitsWindow.vue | 40 + h5/pages/staff/vehicle/shiwai.vue | 3 h5/pages/staff/meetingCalendar.vue | 8 admin/src/views/business/visits.vue | 36 + admin/src/views/meeting/components/OperaBookingsDetailWindow.vue | 62 ++ admin/src/assets/style/style.scss | 4 h5/pages/staff/vehicle/shinei.vue | 162 +++++- h5/pages/applicationRecord/applicationRecord.vue | 2 h5/components/Li-Calendar/Li-Calendar.vue | 4 admin/src/api/business/carUseBook.js | 4 h5/api/staff.js | 10 admin/src/views/meeting/bookings.vue | 205 ++++++- admin/.env.development | 2 h5/pages/staff/vehicle/apply.vue | 2 h5/pages.json | 3 h5/pages/staffLogin/login.vue | 20 h5/pages/staff/meetingSubOrder.vue | 11 admin/src/api/business/visits.js | 2 h5/pages/login/login.vue | 18 h5/pages/staff/index.vue | 9 h5/pages/staff/meetingSel.vue | 2 h5/utils/service.js | 1 admin/src/views/meeting/rooms.vue | 16 admin/src/api/meeting/rooms.js | 2 h5/pages/staff/task/index.vue | 86 ++- h5/pages/staff/snapshot.vue | 4 h5/pages/staff/vehicle/sendACarDetail.vue | 9 admin/src/views/operation/serviceCar/apprRecord.vue | 14 admin/src/assets/style/element-variables.scss | 3 admin/src/views/business/reportRecord.vue | 11 h5/pages/staff/meetingSub.vue | 15 admin/src/views/business/approvalConfiguration.vue | 2 admin/src/components/operation/OperCarUseBookParamWindow.vue | 139 ++++ admin/src/components/common/upload.vue | 1 admin/src/api/business/approve.js | 6 admin/src/components/business/OperaCarUseBookWindow.vue | 4 h5/pages/staff/meetingManager.vue | 6 admin/src/views/meeting/devices.vue | 1 admin/src/views/task/visSubDetail.vue | 12 admin/src/components/common/UploadAvatarImage.vue | 8 admin/src/components/common/QueryForm/queryForm.vue | 27 admin/src/views/login.vue | 2 admin/src/api/meeting/bookings.js | 13 admin/src/views/operation/serviceCar/apprConfig.vue | 4 admin/src/views/task/index.vue | 13 h5/pages/staff/meetingDetail.vue | 145 ++++- admin/src/components/business/OperaHiddenDangerWindow.vue | 27 h5/App.vue | 7 h5/pages/staff/task/vDangetAppr.vue | 90 ++- admin/src/components/business/operaVisitsReportWindow.vue | 7 admin/src/views/meeting/components/OperaBookingsWindow.vue | 145 ++++- admin/src/components/business/OperaCarsWindow.vue | 2 h5/api/meeting.js | 10 53 files changed, 1,090 insertions(+), 351 deletions(-) diff --git a/admin/.env.development b/admin/.env.development index 19f2ddf..844693b 100644 --- a/admin/.env.development +++ b/admin/.env.development @@ -1,4 +1,4 @@ # 寮�鍙戠幆澧冮厤缃� NODE_ENV = 'development' -VUE_APP_API_URL = 'http://192.168.0.173/admin_interface' +VUE_APP_API_URL = 'http://192.168.0.135:10010' diff --git a/admin/src/api/business/approve.js b/admin/src/api/business/approve.js index 1bf61d9..5baffdf 100644 --- a/admin/src/api/business/approve.js +++ b/admin/src/api/business/approve.js @@ -41,3 +41,9 @@ export function dealHiddenDanger (data) { return request.post('/visitsAdmin/cloudService/business/hiddenDanger/dealHiddenDanger', data) } +// 浠诲姟涓績鏍囪宸茶 +export function taskSignRead (params) { + return request.get('/visitsAdmin/cloudService/business/staging/signRead', { + params + }) +} diff --git a/admin/src/api/business/carUseBook.js b/admin/src/api/business/carUseBook.js index 4d9caf0..2bafdea 100644 --- a/admin/src/api/business/carUseBook.js +++ b/admin/src/api/business/carUseBook.js @@ -40,6 +40,10 @@ export function deleteById (id) { return request.get(`/visitsAdmin/cloudService/business/carUseBook/delete/${id}`) } +// 鎾ら攢 +export function revokeById (id) { + return request.get(`/visitsAdmin/cloudService/business/carUseBook/revoke?id=${id}`) +} // 鏍规嵁ID鏌ヨ export function detail (id) { return request.get(`/visitsAdmin/cloudService/business/carUseBook/${id}`) diff --git a/admin/src/api/business/visits.js b/admin/src/api/business/visits.js index a6da90d..c0a99fa 100644 --- a/admin/src/api/business/visits.js +++ b/admin/src/api/business/visits.js @@ -55,7 +55,7 @@ } // 鎻愪氦璁垮淇℃伅 export const createFk = (data) => { - return request.post('/visitsAdmin/cloudService/web/visitor/createFk', data) + return request.post('/visitsAdmin/cloudService/business/visits/createFk', data) } // 璁垮鎶ュ export const createVisit = (data) => { diff --git a/admin/src/api/meeting/bookings.js b/admin/src/api/meeting/bookings.js index 72bfb1d..544beb4 100644 --- a/admin/src/api/meeting/bookings.js +++ b/admin/src/api/meeting/bookings.js @@ -25,8 +25,17 @@ } // 鍙栨秷 export function cancelById (data) { - debugger - return request.post('/meetingAdmin/cloudService/business/bookings/cancelById', data) + return request.post('/meetingAdmin/cloudService/business/meeting/reservationCancel', data) +} +// 缁撴潫 +export function overBookById (data) { + return request.post('/meetingAdmin/cloudService/business/meeting/reservationOver', data) +} +// 棰勫畾璇︽儏 +export function BookDetailById (params) { + return request.get('/meetingAdmin/cloudService/web/meeting/meetingDetail', { + params + }) } // 鍒犻櫎 diff --git a/admin/src/api/meeting/rooms.js b/admin/src/api/meeting/rooms.js index c129e77..9735b54 100644 --- a/admin/src/api/meeting/rooms.js +++ b/admin/src/api/meeting/rooms.js @@ -33,7 +33,7 @@ // 鍒犻櫎 export function deleteById (id) { - return request.get(`/meetingAdmin/cloudService/rooms/delete/${id}`) + return request.get(`/meetingAdmin/cloudService/business/rooms/delete/${id}`) } // 鎵归噺鍒犻櫎 diff --git a/admin/src/assets/style/element-variables.scss b/admin/src/assets/style/element-variables.scss index ebd97d0..c17c714 100644 --- a/admin/src/assets/style/element-variables.scss +++ b/admin/src/assets/style/element-variables.scss @@ -9,4 +9,7 @@ .el-drawer__header { color: #333333 !important; +} +.el-image-viewer__wrapper{ + z-index: 3000 !important; } \ No newline at end of file diff --git a/admin/src/assets/style/style.scss b/admin/src/assets/style/style.scss index 0be2757..52c0841 100644 --- a/admin/src/assets/style/style.scss +++ b/admin/src/assets/style/style.scss @@ -142,6 +142,10 @@ padding: 30px; margin: 0 16px; } +.query_btns{ + border-bottom: 1px solid #eee; + padding-bottom: 10px; +} /** 鍩虹閫氱敤 **/ // 澶у皬 澶栬竟璺� .flex1{ diff --git a/admin/src/components/business/OperaCarUseBookWindow.vue b/admin/src/components/business/OperaCarUseBookWindow.vue index 6da76fc..7685160 100644 --- a/admin/src/components/business/OperaCarUseBookWindow.vue +++ b/admin/src/components/business/OperaCarUseBookWindow.vue @@ -15,7 +15,7 @@ <span class="right" v-if="model.status === 1">瀹℃壒涓�</span> <span class="right" style="background:#53b76f " v-if="model.status === 2">瀹℃壒閫氳繃</span> <span class="right" style="background:#dc362e " v-if="model.status === 3">瀹℃壒涓嶉�氳繃</span> - <span class="right" style="background:#dc362e " v-if="model.status === 4">宸插彇娑�</span> + <span class="right" style="background:#B2B2B2; " v-if="model.status === 4">宸叉挙閿�</span> </div> <div class="info"> <div class="title">鍏姟杞︾敵璇蜂俊鎭�</div> @@ -124,7 +124,7 @@ > <el-form :model="dealForm" ref="dealForm" > <!-- <el-form-item label="娲捐溅鍙告満" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam === 1"> --> - <el-form-item label="娲捐溅鍙告満" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam == 0"> + <el-form-item label="娲捐溅鍙告満" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam == 1"> <el-select v-model="dealForm.driverId" style="width: 300px" filterable clearable placeholder="璇烽�夋嫨娲鹃仯鍙告満"> <el-option v-for="item in memberList" diff --git a/admin/src/components/business/OperaCarsWindow.vue b/admin/src/components/business/OperaCarsWindow.vue index 3e70371..629bc85 100644 --- a/admin/src/components/business/OperaCarsWindow.vue +++ b/admin/src/components/business/OperaCarsWindow.vue @@ -19,7 +19,7 @@ </el-radio-group> </el-form-item> <el-form-item label="閫夋嫨杞︿富锛�" prop="memberId"> - <el-select v-model="form.memberId" filterable placeholder="璇烽�夋嫨"> + <el-select v-model="form.memberId" clearable filterable placeholder="璇烽�夋嫨"> <el-option v-for="item in memberList" :key="item.id" diff --git a/admin/src/components/business/OperaHiddenDangerWindow.vue b/admin/src/components/business/OperaHiddenDangerWindow.vue index d2895a6..4d7486e 100644 --- a/admin/src/components/business/OperaHiddenDangerWindow.vue +++ b/admin/src/components/business/OperaHiddenDangerWindow.vue @@ -144,9 +144,9 @@ </div> <!-- --> <template v-slot:footer> - <el-button @click="isShowProblem = true" type="primary" v-if="model.status==0&& model.checkUserId == userInfo.memberId" class="status-red">澶勭悊</el-button> + <el-button @click="openHandModal" type="primary" v-if="model.status==0&& model.checkUserId == userInfo.memberId" class="status-red">澶勭悊</el-button> <el-button type="primary" plain v-if="model.status==0 && model.checkUserId == userInfo.memberId" @click="handleTransfer">杞氦</el-button> - <el-button @click="isBackProblem=true" v-if="model.status==0&& model.checkUserId == userInfo.memberId" type="danger" >閫�鍥�</el-button> + <el-button @click="openBackModal" v-if="model.status==0&& model.checkUserId == userInfo.memberId" type="danger" >閫�鍥�</el-button> <el-button @click="visible=false">杩斿洖</el-button> </template> @@ -236,7 +236,7 @@ v-model="backForm.checkDate" /> </el-form-item> - <el-form-item label="鏁存敼鍓�" prop="dealBeforeFileList"> + <el-form-item label="鍥剧墖/瑙嗛" prop="dealBeforeFileList"> <div class="df_ac"> <upload width="80px" height="80px" :list="backForm.dealBeforeFileList" :tips="'鍥剧墖/瑙嗛'" accept=".png,.jpg,.jpeg,.mp4" folder="hiddendanger" @loading="uploading = true" @dele="dele($event,2)" @success="uploadFileList($event, 2)" /> </div> @@ -264,6 +264,7 @@ import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' import upload from '@/components/common/upload' +import dayjs from 'dayjs' import { memberList } from '@/api/business/hiddenDangerParam' import { mapState } from 'vuex' export default { @@ -309,7 +310,7 @@ /*, dealBeforeFileList: [ { required: true, message: '璇蜂笂浼犳暣鏀瑰墠鎯呭喌' } - ]*/ + ] */ }, memberList: [], transForm: { @@ -338,6 +339,24 @@ }) }, methods: { + openHandModal () { + const { model } = this + this.isShowProblem = true + this.$set(this.dealForm, 'checkDate', dayjs().format('YYYY-MM-DD HH:mm:ss')) + if (model.submitFileList && model.submitFileList.length > 0) { + this.$set(this.dealForm, 'dealBeforeFileList', model.submitFileList.map(item => { + return { + fileurl: item.fileurl, + name: item.name, + url: item.fileurlFull + } + })) + } + }, + openBackModal () { + this.isBackProblem = true + this.$set(this.backForm, 'checkDate', dayjs().format('YYYY-MM-DD HH:mm:ss')) + }, dele (index, type) { if (type == 0) { if (this.dealForm.dealBeforeFileList != null && this.dealForm.dealBeforeFileList.length > index) { diff --git a/admin/src/components/business/operaVisitsReportWindow.vue b/admin/src/components/business/operaVisitsReportWindow.vue index c0976eb..1884a39 100644 --- a/admin/src/components/business/operaVisitsReportWindow.vue +++ b/admin/src/components/business/operaVisitsReportWindow.vue @@ -5,6 +5,7 @@ :visible.sync="isShowModal" :confirm-working="isWorking" @confirm="confirm" + @close="close" > <el-form :model="param" ref="paramRef" :rules="rules"> <div class="title_tip">璁垮棰勭害</div> @@ -43,6 +44,7 @@ <el-form-item label="鎵嬫満鍙�" prop="phone"> <el-input v-model="param.phone" + maxlength="11" placeholder="璇疯緭鍏ヨ仈绯讳汉鐨勬墜鏈哄彿" ></el-input> </el-form-item> @@ -58,6 +60,7 @@ <el-form-item label="闅忚溅浜烘暟" prop="memberNum"> <el-input v-model="param.memberNum" + oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 6)" placeholder="璇疯緭鍏ラ殢杞︿汉鍛樻�绘暟" ></el-input> </el-form-item> @@ -193,6 +196,10 @@ this.$set(this.param, 'faceImg', file.imgurl) this.$set(this.param, 'faceImgUrl', file.imgurlfull) }, + close () { + this.isShowModal = false + this.$emit('close') + }, // 鍚屾淇℃伅 confirm () { this.$refs.paramRef.validate((valid) => { diff --git a/admin/src/components/business/operaVisitsWindow.vue b/admin/src/components/business/operaVisitsWindow.vue index 046b710..2f97250 100644 --- a/admin/src/components/business/operaVisitsWindow.vue +++ b/admin/src/components/business/operaVisitsWindow.vue @@ -5,6 +5,7 @@ :visible.sync="isShowModal" :confirm-working="isWorking" @confirm="confirm" + @close="close" > <el-form :model="param" ref="paramRef" :rules="rules"> <div class="title_tip">璁垮淇℃伅</div> @@ -17,6 +18,7 @@ <el-form-item label="璁垮鎵嬫満鍙�" prop="phone"> <el-input v-model="param.phone" + maxlength="11" placeholder="璇疯緭鍏ヨ瀹㈢殑鎵嬫満鍙�" ></el-input> </el-form-item> @@ -40,7 +42,7 @@ placeholder="璇疯緭鍏ユ潵璁跨殑鍗曚綅鍏ㄧО" ></el-input> </el-form-item> - <el-form-item label="浜鸿劯鐓х墖"> + <el-form-item label="浜鸿劯鐓х墖" prop="faceImgUrl"> <div class="upload_wrap"> <UploadFaceImg :file="{ imgurlfull: param.faceImgUrl, imgurl: param.faceImg }" @@ -134,7 +136,7 @@ GlobalWindow, UploadFaceImg }, - data() { + data () { return { isShowModal: false, param: { @@ -149,7 +151,7 @@ folder: 'member' }, startPickerOptions: { - disabledDate(time) { + disabledDate (time) { return time.getTime() < Date.now() - 8.64e7 // 绂佺敤瓒呰繃褰撳墠鏃堕棿鐨勬棩鏈� }, selectableRange: '00:00:00 - 23:59:59' // 杩欎釜鍔犱笂涔嬪悗锛屾椂鍒嗙涓婇潰鎵嶆湁绂佹閫夋嫨鍙樼伆锛屽鏋滀笉鍔狅紝涔熷彲浠ョ姝㈤�夋嫨锛屼絾鏄笉浼氬彉鐏� @@ -180,13 +182,14 @@ } } }, - created() { + created () { this.$set(this.param, 'receptMemberId', this.$store.state.userInfo.memberId) + this.$set(this.param, 'starttime', dayjs().format('YYYY-MM-DD HH:mm:ss')) this.initData() }, watch: { 'param.starttime': { - handler(newValue, oldValue) { + handler (newValue, oldValue) { if (newValue) { const date = new Date() // const min = date.getMinutes() @@ -210,7 +213,7 @@ immediate: true }, 'param.endtime': { - handler(newValue, oldValue) { + handler (newValue, oldValue) { if (newValue) { const nowDate = dayjs(this.param.starttime).format('HH:mm:ss') let st = '' @@ -228,7 +231,11 @@ } }, methods: { - initData() { + close () { + this.isShowModal = false + this.$emit('close') + }, + initData () { getVisitedVisitReason({}).then(res => { this.VisitReason = res || [] }) @@ -237,15 +244,15 @@ console.log('memberList', this.memberList) }) }, - uploadAvatarSuccess(file) { + uploadAvatarSuccess (file) { this.$set(this.param, 'faceImg', file.imgurl) this.$set(this.param, 'faceImgUrl', file.imgurlfull) }, - changeStarttime(e) { - this.$set(this.param, 'endtime', this.param.starttime) + changeStarttime (e) { + // this.$set(this.param, 'endtime', this.param.starttime) }, // 鍚屾淇℃伅 - confirm() { + confirm () { this.$refs.paramRef.validate((valid) => { if (!valid) { return @@ -262,7 +269,6 @@ this.$emit('close') }) .catch(e => { - this.$tip.apiFailed(e) }) .finally(() => { this.isWorking = false @@ -281,6 +287,16 @@ .upload_wrap{ display: flex; align-items: center; + justify-content: center; + .avatar-uploader{ + display: flex; + align-items: center; + justify-content: center; + } + ::v-deep .avatar{ + max-width: 90px; + max-height: 90px; + } .content{ display: flex; flex-direction: column; diff --git a/admin/src/components/common/QueryForm/queryForm.vue b/admin/src/components/common/QueryForm/queryForm.vue index bb962f5..4755b31 100644 --- a/admin/src/components/common/QueryForm/queryForm.vue +++ b/admin/src/components/common/QueryForm/queryForm.vue @@ -54,6 +54,7 @@ :label="item.label || '閫夋嫨鏃ユ湡'"> <el-date-picker v-model="searchForm[item.filed]" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" type="datetimerange" + :default-time="['00:00:00', '23:59:59']" :picker-options="item.pickerOptions || pickerOptions" range-separator="鑷�" :clearable="(item.clearable !== null && item.clearable !== undefined && item.clearable !== '') ? item.clearable : true" :start-placeholder="item.start || '寮�濮嬫椂闂�'" :end-placeholder="item.end || '缁撴潫鏃堕棿'" class="w400" @@ -99,13 +100,13 @@ default: () => { } } }, - data() { + data () { return { showZk: false, pickerOptions: { shortcuts: [{ text: '杩�7澶�', - onClick(picker) { + onClick (picker) { const end = new Date() const start = new Date() start.setTime(end.getTime() - 3600 * 1000 * 24 * 6) @@ -114,7 +115,7 @@ }, { text: '杩�30澶�', - onClick(picker) { + onClick (picker) { const end = new Date() const start = new Date() start.setTime(end.getTime() - 3600 * 1000 * 24 * 29) @@ -123,7 +124,7 @@ }, { text: '杩�60澶�', - onClick(picker) { + onClick (picker) { const end = new Date() const start = new Date() start.setTime(end.getTime() - 3600 * 1000 * 24 * 59) @@ -132,14 +133,14 @@ }, { text: '杩�90澶�', - onClick(picker) { + onClick (picker) { const end = new Date() const start = new Date() start.setTime(end.getTime() - 3600 * 1000 * 24 * 89) picker.$emit('pick', [start, end]) } }], - disabledDate(time) { + disabledDate (time) { var curDate = new Date(new Date().toLocaleDateString()).getTime() var preDate = new Date(curDate + 24 * 60 * 60 * 1000 - 1) return time.getTime() > preDate @@ -150,31 +151,31 @@ emits: ['input', 'handleQuery', 'clear'], computed: { searchForm: { - get() { + get () { return this.value }, - set(value) { + set (value) { this.$emit('input', value) } } }, methods: { - handleQuery() { + handleQuery () { this.$emit('handleQuery') }, - handlekeyup(pd) { + handlekeyup (pd) { if (pd) { this.$emit('handleQuery') } }, - changeForm(filed) { + changeForm (filed) { this.$emit('changeForm', filed) }, - zkBtn() { + zkBtn () { this.showZk = !this.showZk this.$emit('zkBtn', this.zk) }, - clear() { + clear () { this.$emit('clear') } } diff --git a/admin/src/components/common/UploadAvatarImage.vue b/admin/src/components/common/UploadAvatarImage.vue index d541ed6..72f91b9 100644 --- a/admin/src/components/common/UploadAvatarImage.vue +++ b/admin/src/components/common/UploadAvatarImage.vue @@ -2,7 +2,7 @@ <div> <el-upload class="avatar-uploader" - accept=".png,.jpg" + accept=".png,.jpg,.jpeg" :style="customStyle" :action="uploadImgUrl" :data="uploadData" @@ -30,7 +30,7 @@ tipsLabel: '', customStyle: { type: String, - default: 'width: 90px; height: 90px;' + default: 'width: 90px; max-height: 90px;' }, uploadData: Object }, @@ -92,8 +92,8 @@ text-align: center; } .avatar { - width: 100% !important; - height: auto !important; + width: 90px; + max-height: 90px; display: block; } .tips-style { diff --git a/admin/src/components/common/upload.vue b/admin/src/components/common/upload.vue index d6dfc8d..ccde115 100644 --- a/admin/src/components/common/upload.vue +++ b/admin/src/components/common/upload.vue @@ -72,7 +72,6 @@ console.log(res.data.data) }) .catch(e => { - this.$message.error(e) }) .finally(() => { this.$refs.file.value = null diff --git a/admin/src/components/operation/OperCarUseBookParamWindow.vue b/admin/src/components/operation/OperCarUseBookParamWindow.vue index d8bc84d..f78ebdd 100644 --- a/admin/src/components/operation/OperCarUseBookParamWindow.vue +++ b/admin/src/components/operation/OperCarUseBookParamWindow.vue @@ -17,7 +17,7 @@ > </el-form-item> <el-form-item label="閫夋嫨杞﹁締" prop="carId"> - <el-select v-model="form.carId" placeholder="閫夋嫨杞﹁締"> + <el-select v-model="form.carId" @change="clearTime" placeholder="閫夋嫨杞﹁締"> <el-option v-for="item in carsList" :key="item.id" @@ -133,6 +133,7 @@ :class="{ disable: item.isUse == 1, active: item.checked == '1', + hasSub: item.carUseBookId, }" @click="datetimeClick(item, i)" v-for="(item, i) in timeList" @@ -161,6 +162,7 @@ :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"> @@ -189,7 +191,10 @@ <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="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> @@ -212,16 +217,48 @@ </div> <div class="line"> <span>鐢宠浜�</span> - <span>{{ item.memberName }} {{ item.memberMobile }}</span> + <span>{{ item.memberName }} <span class="primaryColor">{{ item.memberMobile }}</span></span> </div> </div> </div> <span slot="footer" class="dialog-footer"> <div>宸查�夋嫨锛歿{ selDatetime }}</div> - <div class="btn" @click="subTime">纭鏃堕棿</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> @@ -230,14 +267,15 @@ import GlobalWindow from '@/components/common/GlobalWindow' import { allList } from '@/api/business/member' import { allList as getCarList } from '@/api/business/cars' -import { carCanReservationDate, carUseBookCraete, carUseBookList } from '@/api/business/carUseBook' +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() { + data () { return { // 琛ㄥ崟鏁版嵁 isShowTime: false, @@ -260,6 +298,9 @@ endTime: '', memberIds: [] }, + activeInfo: {}, + isShowDetail: false, + carBookInfo: {}, pickerOptions: { disabledDate: (time) => { if (this.form.startTime) { @@ -306,7 +347,7 @@ }, watch: { 'form.planUseDate': { - handler(newValue, oldValue) { + 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 @@ -316,7 +357,7 @@ immediate: true }, 'form.startTime': { - handler(newValue, oldValue) { + handler (newValue, oldValue) { if (newValue) { this.$set(this.pickerOptions, 'selectableRange', this.form.startTime.slice(11, 19) + ' - ' + '23:59:59') // this.startPickerOptions = this.startPickerOptions @@ -326,11 +367,11 @@ immediate: true } }, - created() { + created () { this.initData() }, methods: { - open() { + open () { this.title = '鏂板缓鍏姟杞︾敤杞︾敵璇�' this.form = { type: 0, @@ -341,7 +382,7 @@ }) this.visible = true }, - confirm() { + confirm () { const form = JSON.parse(JSON.stringify(this.form)) this.$refs.formRef.validate((valid) => { const memberList = [] @@ -365,18 +406,32 @@ } }) }, - openTime() { + 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.isShowShiwai = true } }, - subTime() { + 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) { @@ -389,11 +444,24 @@ 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.isShowShiwai = false }) } }, - datetimeClick(item, index) { + 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') @@ -434,10 +502,10 @@ this.selDatetime = this.form.dateDay.slice(5) + ' ' + selTimeLists[0].startHours + '-' + selTimeLists[selTimeLists.length - 1].endHours } }, - seletedDate(e) { + seletedDate (e) { this.gettimes() }, - seletedShiwaiDate() { + seletedShiwaiDate () { const { form } = this if (form.startTime && form.endTime) { this.selDatetime = form.startTime + '-' + form.endTime @@ -450,7 +518,7 @@ }) } }, - gettimes() { + gettimes () { const { form } = this carCanReservationDate({ dateDay: form.dateDay, @@ -459,11 +527,11 @@ this.timeList = res || [] this.timeList.forEach((i, j) => { i.checked = '0', - i.index = j + i.index = j }) }) }, - initData() { + initData () { getCarList({ type: 1 }).then(res => { @@ -539,6 +607,10 @@ background-color: #cccccc; color: #999999; } + .hasSub { + color: #fff; + background: #cccccc; + } } .color_op { display: flex; @@ -564,6 +636,10 @@ color: #fff; width: 120px; text-align: center; + cursor: pointer; + } + .disable{ + background: #cccccc; } } .have_info { @@ -600,4 +676,29 @@ } } } +.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> diff --git a/admin/src/views/business/approvalConfiguration.vue b/admin/src/views/business/approvalConfiguration.vue index 8e374e7..320a8b2 100644 --- a/admin/src/views/business/approvalConfiguration.vue +++ b/admin/src/views/business/approvalConfiguration.vue @@ -120,7 +120,7 @@ <div class="config_data_item_reviewed_r"> <span>琚浜虹殑</span> <el-select - v-model="apprList[activeIndex].level" + v-model="apprList[activeIndex].objLevel" placeholder="璇烽�夋嫨" style="margin: 0 20px 0 10px" > diff --git a/admin/src/views/business/reportRecord.vue b/admin/src/views/business/reportRecord.vue index fcb9c59..82a650f 100644 --- a/admin/src/views/business/reportRecord.vue +++ b/admin/src/views/business/reportRecord.vue @@ -6,7 +6,7 @@ @handleQuery="getList(1)" @clear="clear" /> - <div style="margin: 16px 0 0" v-permissions="['business:visits:create', 'business:visits:exportExcel']"> + <div class="query_btns" style="margin: 16px 0 0" v-permissions="['business:visits:create', 'business:visits:exportExcel']"> <el-button type="primary" @click="handleEdit()" icon="el-icon-plus" v-permissions="['business:visits:create']">鏂板缓</el-button> <el-button type="primary" :loading="exLoading" @click="exportExcel" v-permissions="['business:visits:exportExcel']">瀵煎嚭</el-button> </div> @@ -17,6 +17,7 @@ row-key="id" default-expand-all > + <el-table-column type="selection" width="55" align="center"></el-table-column> <el-table-column prop="carNos" label="鍏ュ洯杞﹁締" @@ -42,7 +43,7 @@ label="琚浜�" min-width="100px" ></el-table-column> - <el-table-column label="鎷滆鏃堕棿" min-width="170px"> + <el-table-column label="鎷滆鏃堕棿" min-width="160px"> <template slot-scope="{ row }"> <span>璧凤細{{ row.starttime }}</span ><br /> @@ -52,13 +53,13 @@ <el-table-column prop="reason" label="鎷滆浜嬬敱" - min-width="100px" + min-width="100" ></el-table-column> <el-table-column prop="status" fixed="right" label="鐘舵��" - min-width="100px" + min-width="100" > <template slot-scope="{ row }"> <span style="color: rgba(245, 154, 35, 0.996)" v-if="row.status === 0" @@ -79,7 +80,7 @@ <span v-if="row.status === 9" style="color: gray">宸插け鏁�</span> </template> </el-table-column> - <el-table-column label="鎿嶄綔" width="230" fixed="right"> + <el-table-column label="鎿嶄綔" width="100" fixed="right"> <template slot-scope="{ row }"> <el-button type="text" diff --git a/admin/src/views/business/visits.vue b/admin/src/views/business/visits.vue index 25ebbb8..bbf8005 100644 --- a/admin/src/views/business/visits.vue +++ b/admin/src/views/business/visits.vue @@ -8,8 +8,8 @@ <el-form-item label="韬唤璇佸彿" prop="idcardNo"> <el-input v-model="searchForm.idcardNo" placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" @keypress.enter.native="search"></el-input> </el-form-item> - <el-form-item label="缁勭粐鍚嶇О" prop="companyName"> - <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏ョ粍缁囧悕绉�" @keypress.enter.native="search"></el-input> + <el-form-item label="璁垮鍗曚綅" prop="companyName"> + <el-input v-model="searchForm.companyName" placeholder="璇疯緭鍏ヨ瀹㈠崟浣�" @keypress.enter.native="search"></el-input> </el-form-item> <el-form-item label="瀹℃壒鐘舵��" prop="status"> <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨"> @@ -46,7 +46,7 @@ <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="璁垮濮撳悕" min-width="100px"></el-table-column> <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column> - <el-table-column prop="companyName" label="缁勭粐鍚嶇О" min-width="100px"></el-table-column> + <el-table-column prop="companyName" label="璁垮鍗曚綅" min-width="100px"></el-table-column> <el-table-column prop="receptMemberName" label="琚浜�" min-width="100px"></el-table-column> <el-table-column prop="reason" label="鎷滆浜嬬敱" min-width="100px"></el-table-column> <el-table-column label="棰勭害鏃堕棿" min-width="170px"> @@ -64,14 +64,15 @@ <span v-else>-</span> </template> </el-table-column> - <el-table-column label="闅忚浜哄憳" min-width="100px"> + <el-table-column label="鏂藉伐浜哄憳" min-width="100px"> <template slot-scope="{row}"> - <span>{{row.memberNum || '-'}}</span> + <span v-if="row.type == 0">鍚�</span> + <span v-if="row.type == 1">鏄�</span> </template> </el-table-column> <el-table-column label="闅忚杞﹁締" min-width="100px"> <template slot-scope="{row}"> - <span>{{row.carNum}}</span> + <span>{{row.carNos}}</span> </template> </el-table-column> <el-table-column prop="status" fixed="right" label="鐘舵��" min-width="100px"> @@ -97,7 +98,8 @@ <template slot-scope="{row}"> <el-button type="text" @click="departure(row.id)" v-permissions="['business:visits:level']" icon="el-icon-delete" style="color: red" v-if="row.status == 7">绂诲巶</el-button> <el-button type="text" @click="cancel(row.id)" v-permissions="['business:visits:cancel']" icon="el-icon-delete" style="color: red" v-if="row.status == 5">鍙栨秷棰勭害</el-button> - <el-button type="text" @click="$refs.OperaVisitsDesWindow.open('璇︽儏', row.id)" icon="el-icon-view">璇︽儏</el-button> + <!-- <el-button type="text" @click="$refs.OperaVisitsDesWindow.open('璇︽儏', row.id)" icon="el-icon-view">璇︽儏</el-button> --> + <el-button type="text" @click="handleDetail(row)" icon="el-icon-view">璇︽儏</el-button> <!-- <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:visits:delete']">鏌ヨ瀹℃壒缁撴灉</el-button>--> </template> </el-table-column> @@ -109,7 +111,8 @@ > </pagination> <!-- 璇︽儏 --> - <OperaVisitsDesWindow ref="OperaVisitsDesWindow" /> + <!-- <OperaVisitsDesWindow ref="OperaVisitsDesWindow" /> --> + <TaskDetail v-if="isShowDetail" ref="DetailRef" /> <!-- 鏂板缓 --> <OperaVisitsWindow @close="isShowEdit = false" @success="search" v-if="isShowEdit" ref="operaVisitsWindowRef" /> </template> @@ -122,20 +125,23 @@ import Pagination from '@/components/common/Pagination' import OperaVisitsDesWindow from '@/components/business/OperaVisitsDesWindow' import OperaVisitsWindow from '@/components/business/operaVisitsWindow' +import TaskDetail from '@/views/task/visSubDetail.vue' export default { name: 'Visits', extends: BaseTable, - components: { TableLayout, Pagination, OperaVisitsDesWindow, OperaVisitsWindow }, + components: { TableLayout, Pagination, TaskDetail, OperaVisitsWindow }, data () { return { isShowEdit: false, + isShowDetail: false, // 鎼滅储 searchForm: { name: '', companyName: '', idcardNo: '', - status: '' + status: '', + type: 0 } } }, @@ -149,6 +155,16 @@ this.search() }, methods: { + handleDetail (row) { + this.isShowDetail = true + console.log('row', row); + this.$nextTick(() => { + this.$refs.DetailRef.id = row.id + this.$refs.DetailRef.type = 0 + this.$refs.DetailRef.getDetail() + this.$refs.DetailRef.isShowModal = true + }) + }, handleEdit () { this.isShowEdit = true this.$nextTick(() => { diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue index 87b3f52..16a3215 100644 --- a/admin/src/views/login.vue +++ b/admin/src/views/login.vue @@ -66,7 +66,7 @@ }) .catch(e => { this.refreshCaptcha() - this.$tip.apiFailed(e) + // this.$tip.apiFailed(e) }) .finally(() => { this.loading = false diff --git a/admin/src/views/meeting/bookings.vue b/admin/src/views/meeting/bookings.vue index 6830547..4a9f8f8 100644 --- a/admin/src/views/meeting/bookings.vue +++ b/admin/src/views/meeting/bookings.vue @@ -1,7 +1,13 @@ <template> <TableLayout :permissions="['business:bookings:query']"> <!-- 鎼滅储琛ㄥ崟 --> - <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> + <el-form + ref="searchForm" + slot="search-form" + :model="searchForm" + label-width="100px" + inline + > <el-form-item label="浼氳瀹�" prop="roomId"> <el-select v-model="searchForm.roomId" @@ -9,7 +15,12 @@ clearable placeholder="璇烽�夋嫨浼氳瀹�" > - <el-option v-for="item in rooms" :key="item.id" :value="item.id" :label="item.name" /> + <el-option + v-for="item in rooms" + :key="item.id" + :value="item.id" + :label="item.name" + /> </el-select> </el-form-item> <el-form-item label="棰勭害閮ㄩ棬" prop="department"> @@ -31,10 +42,18 @@ </el-select> --> </el-form-item> <el-form-item label="浼氳涓婚" prop="name"> - <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ヤ細璁富棰�" @keypress.enter.native="search"></el-input> + <el-input + v-model="searchForm.name" + placeholder="璇疯緭鍏ヤ細璁富棰�" + @keypress.enter.native="search" + ></el-input> </el-form-item> <el-form-item label="棰勭害浜�" prop="realName"> - <el-input v-model="searchForm.realName" placeholder="璇疯緭鍏ラ绾︿汉" @keypress.enter.native="search"></el-input> + <el-input + v-model="searchForm.realName" + placeholder="璇疯緭鍏ラ绾︿汉" + @keypress.enter.native="search" + ></el-input> </el-form-item> <el-form-item label="浼氳鐘舵��" prop="status"> <el-select @@ -43,7 +62,12 @@ clearable placeholder="璇烽�夋嫨鐘舵��" > - <el-option v-for="item in status" :key="item.id" :value="item.id" :label="item.name" /> + <el-option + v-for="item in status" + :key="item.id" + :value="item.id" + :label="item.name" + /> </el-select> </el-form-item> <el-form-item label="璧锋鏃堕棿" prop="startTime"> @@ -78,10 +102,30 @@ </el-form> <!-- 琛ㄦ牸鍜屽垎椤� --> <template v-slot:table-wrap> - <ul class="toolbar" v-permissions="['business:bookings:create', 'business:bookings:exportExcel']"> - <li><el-button type="primary" @click="$refs.operaBookingsWindow.open('鏂板缓浼氳')" v-permissions="['business:bookings:create']">鏂板缓</el-button></li> + <ul + class="toolbar" + v-permissions="[ + 'business:bookings:create', + 'business:bookings:exportExcel', + ]" + > + <li> + <el-button + type="primary" + @click="$refs.operaBookingsWindow.open('鏂板缓浼氳')" + v-permissions="['business:bookings:create']" + >鏂板缓</el-button + > + </li> <!-- <li><el-button @click="deleteByIdInBatch" v-permissions="['business:bookings:delete']">鍒犻櫎</el-button></li> --> - <li><el-button :loading="isWorking.export" v-permissions="['business:bookings:exportExcel']" @click="exportExcel">瀵煎嚭</el-button></li> + <li> + <el-button + :loading="isWorking.export" + v-permissions="['business:bookings:exportExcel']" + @click="exportExcel" + >瀵煎嚭</el-button + > + </li> </ul> <el-table v-loading="isWorking.search" @@ -91,42 +135,80 @@ @selection-change="handleSelectionChange" > <!-- <el-table-column type="selection" align="center" width="55"></el-table-column> --> - <el-table-column prop="name" label="浼氳涓婚" align="center" min-width="120px" show-overflow-tooltip> - <template slot-scope="{row}"> + <el-table-column + prop="name" + label="浼氳涓婚" + align="center" + min-width="120px" + show-overflow-tooltip + > + <template slot-scope="{ row }"> <span class="long-title-style">{{ row.name }}</span> </template> </el-table-column> - <el-table-column prop="roomName" label="浼氳瀹�" align="center" min-width="120px" show-overflow-tooltip> - <template slot-scope="{row}"> + <el-table-column + prop="roomName" + label="浼氳瀹�" + align="center" + min-width="120px" + show-overflow-tooltip + > + <template slot-scope="{ row }"> <span class="long-title-style">{{ row.roomName }}</span> </template> </el-table-column> - <el-table-column prop="meetingTime" label="浼氳鏃堕棿" align="center" min-width="120px"></el-table-column> - <el-table-column prop="managerInfo" label="棰勭害浜�" align="center" min-width="100px"></el-table-column> - <el-table-column label="鐘舵��" align="center" min-width="60px"> - <template slot-scope="{row}"> - <span v-if="row.status==0" style="color:rgb(127, 178, 53)">姝e父</span> - <span v-else style="color:rgb(234, 54, 38)">鍙栨秷</span> + <el-table-column + prop="meetingTime" + label="浼氳鏃堕棿" + align="center" + min-width="120px" + ></el-table-column> + <el-table-column + prop="managerInfo" + label="棰勭害浜�" + align="center" + min-width="100px" + ></el-table-column> + <el-table-column label="鐘舵��" align="center" min-width="60px"> + <template slot-scope="{ row }"> + <span v-if="row.status == 0" style="color: rgb(127, 178, 53)" + >姝e父</span + > + <span v-else style="color: rgb(234, 54, 38)">鍙栨秷</span> <!-- {{ row.status==0 ? '姝e父' : '鍙栨秷' }} --> </template> </el-table-column> - <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" align="center" min-width="100px"></el-table-column> + <el-table-column + prop="createDate" + label="鍒涘缓鏃堕棿" + align="center" + min-width="100px" + ></el-table-column> <!-- <el-table-column prop="content" label="浼氳鍐呭" min-width="100px"></el-table-column> --> <el-table-column - v-if="containPermissions(['business:bookings:update', 'business:bookings:delete'])" + v-if=" + containPermissions([ + 'business:bookings:update', + 'business:bookings:delete', + ]) + " label="鎿嶄綔" - min-width="120" + min-width="100" align="center" fixed="right" > - <template slot-scope="{row}"> - <template v-if="row.status==0"> - <el-button type="text" @click="$refs.operaBookingsDetailWindow.open('浼氳璇︽儏', row)">鏌ョ湅</el-button> - <el-button v-if="row.flag == 0" type="text" @click="$refs.operaBookingsWindow.open('缂栬緫浼氳棰勭害', row)" v-permissions="['business:bookings:update']">淇敼</el-button> - <el-button type="text" @click="copy(row)">澶嶅埗</el-button> - <el-button v-if="row.flag == 0" type="text" @click="cancelMeeting(row.id)" v-permissions="['business:bookings:update']">鍙栨秷</el-button> + <template slot-scope="{ row }"> + <template> + <el-button + type="text" + @click="$refs.operaBookingsDetailWindow.open('浼氳璇︽儏', row)" + >鏌ョ湅璇︽儏</el-button + > + <!-- <el-button v-if="row.flag == 0" type="text" @click="$refs.operaBookingsWindow.open('缂栬緫浼氳棰勭害', row)" v-permissions="['business:bookings:update']">淇敼</el-button> --> + <!-- <el-button type="text" @click="copy(row)">澶嶅埗</el-button> --> + <!-- <el-button v-if="row.flag == 0" type="text" @click="cancelMeeting(row.id)" v-permissions="['business:bookings:update']">鍙栨秷</el-button> --> </template> - <el-button v-else type="text" @click="deleteById(row)" v-permissions="['business:bookings:delete']">鍒犻櫎</el-button> + <!-- <el-button v-else type="text" @click="deleteById(row)" v-permissions="['business:bookings:delete']">鍒犻櫎</el-button> --> </template> </el-table-column> </el-table> @@ -138,8 +220,15 @@ </pagination> </template> <!-- 鏂板缓/淇敼 --> - <OperaBookingsWindow ref="operaBookingsWindow" @success="handlePageChange"/> - <OperaBookingsDetailWindow ref="operaBookingsDetailWindow"/> + <OperaBookingsWindow + ref="operaBookingsWindow" + @success="handlePageChange" + /> + <OperaBookingsDetailWindow + @success="search" + ref="operaBookingsDetailWindow" + /> + </TableLayout> </template> @@ -158,7 +247,7 @@ name: 'Bookings', extends: BaseTable, components: { TableLayout, Pagination, OperaBookingsWindow, OperaBookingsDetailWindow }, - data () { + data() { return { date: [], // 鎼滅储 @@ -198,12 +287,12 @@ link: 'https://dmtest.ahapp.net/meeting_h5/' // H5_LINK_ADDR } }, - provide () { + provide() { return { rooms: () => this.rooms } }, - created () { + created() { this.config({ module: '浼氳瀹ら瀹氫俊鎭〃', api: '/meeting/bookings', @@ -226,7 +315,7 @@ this.changeRadio('0') }, methods: { - changeRadio (e) { + changeRadio(e) { if (e === '0') { this.searchForm.startTime = timeForMat(0)[0] this.searchForm.endTime = timeForMat(0)[1] @@ -242,7 +331,7 @@ } this.search() }, - newTree (tree) { + newTree(tree) { if (tree == null) { return [] } @@ -259,12 +348,12 @@ return newItem }) }, - selectDate (v) { + selectDate(v) { this.searchForm.endTime = v[1] + ' 23:59:59' this.searchForm.startTime = v[0] + ' 00:00:00' this.searchForm.radio = null }, - reset () { + reset() { this.$refs.searchForm.resetFields() this.date = [] this.searchForm.radio = '0' @@ -272,17 +361,16 @@ this.searchForm.endTime = '' this.changeRadio('0') }, - copy (row) { + copy(row) { const text = `${row.realName} 閭�璇锋偍鍔犲叆浼氳\n浼氳涓婚锛�${row.name}\n浼氳瀹わ細${row.roomName}\n浼氳鏃堕棿锛�${row.meetingTime}\n鐐瑰嚮閾炬帴鐩存帴鍔犲叆浼氳锛歕n${this.link}?id=${row.id}` this.$copyText(text) .then(() => { this.$message.success('浼氳淇℃伅澶嶅埗鎴愬姛锛屽幓鍒嗕韩缁欏悓浜嬪惂~') }) .catch(e => { - this.$message.error(e) }) }, - cancelMeeting (id) { + cancelMeeting(id) { this.$dialog.messageWaring('鍙栨秷浼氳', '鏄惁鍙栨秷褰撳墠浼氳锛�') .then(() => { cancelById({ id }) @@ -291,29 +379,26 @@ this.handlePageChange() }) .catch(e => { - this.$message.error(e) }) }) }, - showDetail (id) { + showDetail(id) { bookingsDetail(id) .then(res => { this.$refs.operaBookingsDetailWindow.open('浼氳璇︽儏', res) }) .catch(e => { - this.$message.error(e) }) }, - editBookings (id) { + editBookings(id) { bookingsDetail(id) .then(res => { this.$refs.operaBookingsWindow.open('缂栬緫浼氳棰勭害', res) }) .catch(e => { - this.$message.error(e) }) }, - handlePageChange (pageIndex) { + handlePageChange(pageIndex) { this.__checkApi() this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex this.isWorking.search = true @@ -341,3 +426,31 @@ } } </script> + +<style lang="scss" scoped> +.detail_modal { + padding: 20px 16px; + .title { + text-align: center; + font-weight: 600; + font-size: 16px; + margin-bottom: 20px; + } + .h1 { + font-weight: 600; + font-size: 16px; + margin-bottom: 15px; + } + .line { + display: flex; + margin-bottom: 10px; + .label { + width: 70px; + color: #888888; + } + .value { + color: #333333; + } + } +} +</style> diff --git a/admin/src/views/meeting/components/OperaBookingsDetailWindow.vue b/admin/src/views/meeting/components/OperaBookingsDetailWindow.vue index a1de55f..d0e96a2 100644 --- a/admin/src/views/meeting/components/OperaBookingsDetailWindow.vue +++ b/admin/src/views/meeting/components/OperaBookingsDetailWindow.vue @@ -13,15 +13,19 @@ <div class="content-style"> <div class="item"> <div class="item-title">鍙備細浜哄憳</div> - <div>{{ form.sysList.map(item => `${item.realName}`).join('锛�') }}</div> + <div> + {{ form.sysList.map((item) => `${item.realName}`).join("锛�") }} + </div> </div> <div class="item"> <div class="item-title">浼氳鍐呭</div> - <div class="item-value">{{ form.content || '鏃�' }}</div> + <div class="item-value">{{ form.content || "鏃�" }}</div> </div> <div v-if="form.projectList.length" class="item"> <div class="">鏈嶅姟椤�</div> - <div class="item-value">{{ form.projectList.map(item => item.projectName).join(' | ') }}</div> + <div class="item-value"> + {{ form.projectList.map((item) => item.projectName).join(" | ") }} + </div> </div> <div class="item" v-if="form.fileList.length"> <div class="item-title">闄勪欢</div> @@ -43,8 +47,33 @@ <div class="item-value">{{ form.managerInfo }}</div> </div> <div slot="footer"> - <el-button @click="visible=false">鍙栨秷</el-button> + <el-button type="primary" v-if="form.meetingStatus == 1" @click="openCancel('0')">鎾ら攢</el-button> + <el-button v-if="form.meetingStatus == 2" type="primary" @click="openCancel('1')">缁撴潫</el-button> + <el-button @click="visible = false">鍙栨秷</el-button> </div> + <!-- 鍙栨秷/缁撴潫 --> + <el-dialog + :title="cancelParam.falg == '1' ? '缁撴潫浼氳' : '鎾ら攢浼氳'" + :visible.sync="isShowCancel" + append-to-body + width="500px" + > + <el-form style="padding: 30px"> + <el-form-item label="鎾ゅ洖璇存槑"> + <el-input + type="textarea" + :rows="4" + placeholder="璇疯緭鍏ヨ鏄庛��" + v-model="cancelParam.businessRemark" + > + </el-input> + </el-form-item> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button @click="isShowCancel = false">鍙栨秷</el-button> + <el-button type="primary" @click="onSubCancel()">纭畾</el-button> + </span> + </el-dialog> </GlobalAlertWindow> </template> @@ -52,6 +81,7 @@ import BaseOpera from '@/components/base/BaseOpera' import GlobalAlertWindow from '@/components/common/GlobalAlertWindow' import FileLink from '@/views/meeting/components/common/FileLink' +import { cancelById, overBookById } from '@/api/meeting/bookings' export default { name: 'OperaBookingsDetailWindow', extends: BaseOpera, @@ -69,6 +99,7 @@ projectList: [], remark: '', roomId: '', + meetingStatus: '', startTime: '', endTime: '', times: [], @@ -81,6 +112,11 @@ sysList: [], projectList: [], timelist: [], + + isShowCancel: false, + cancelParam: { + flag: '0' + }, // 楠岃瘉瑙勫垯 rules: { @@ -92,9 +128,22 @@ api: '/meeting/bookings', 'field.id': 'id' }) - }, methods: { + openCancel (flag) { + this.isShowCancel = true + this.cancelParam.flag = flag + }, + onSubCancel () { + const { id } = this.form + const fn = this.cancelParam.flag === '0' ? cancelById : overBookById + fn({ id, businessRemark: this.cancelParam.businessRemark }).then(res => { + this.$tip.success('鎻愪氦鎴愬姛') + this.visible = false + this.isShowCancel = false + this.$emit('success') + }) + } /** * 鎵撳紑绐楀彛 * @title 绐楀彛鏍囬 @@ -124,7 +173,7 @@ // }) // }, - }, + } } </script> @@ -160,5 +209,4 @@ .bottom-style { padding: 20px; } - </style> diff --git a/admin/src/views/meeting/components/OperaBookingsWindow.vue b/admin/src/views/meeting/components/OperaBookingsWindow.vue index b998662..c81231c 100644 --- a/admin/src/views/meeting/components/OperaBookingsWindow.vue +++ b/admin/src/views/meeting/components/OperaBookingsWindow.vue @@ -31,7 +31,11 @@ class="time-item" v-for="(item, index) in timelist" :key="item.id" - :class="form.times.indexOf(index)!=-1?'time-item-sel': item.isUse ? 'time-item-disable' : ''" + :class="{ + 'time-item-sel': form.times.indexOf(index)!=-1, + 'time-item-disable': item.isUse, + 'disable': item.bookingTimeId + }" @click="selectTimes(index, item)" >{{ `${item.startTime}-${item.endTime}` }}</div> </div> @@ -40,7 +44,7 @@ <el-input v-model="form.name" placeholder="璇疯緭鍏ヤ細璁富棰�" :maxlength="30" v-trim/> </el-form-item> - <el-form-item label="鍙備細浜哄憳" prop="sysList"> + <el-form-item label="鍙備細浜哄憳"> <!-- <el-input style="width:40%" disabled v-model="sysList" placeholder="閫夋嫨鍙備細浜哄憳" v-trim/> --> <el-select v-model="form.sysList" @@ -94,6 +98,32 @@ </el-form-item> <input type="file" @change="upFiles" ref="upFile" style="display: none;" /> </el-form> + + <el-dialog + title="浼氳瀹ら绾︽儏鍐�" + :visible.sync="isShowDetail" + append-to-body + width="600px" + > + <div class="detail_modal"> + <div class="h1">{{ activeInfo.meetingName }}</div> + <div class="line"> + <div class="label">浼氳鏃堕棿</div> + <div class="value" v-if="activeInfo.meetingDate"> + {{ activeInfo.meetingDate.slice(5) }} {{ activeInfo.meetingTime }} + </div> + </div> + <div class="line"> + <div class="label">浼氳瀹�</div> + <div class="value">{{ activeInfo.roomName }}</div> + </div> + <div class="line"> + <div class="label">棰勭害浜�</div> + <div class="value">{{ activeInfo.bookingUserName }}</div> + </div> + <el-button @click="isShowDetail = false">鍏抽棴</el-button> + </div> + </el-dialog> </GlobalAlertWindow> </template> @@ -101,9 +131,10 @@ import BaseOpera from '@/components/base/BaseOpera' import GlobalAlertWindow from '@/components/common/GlobalAlertWindow' import FileLink from '@/views/meeting/components/common/FileLink' -import { upload as upload } from '@/api/system/common' +import { upload } from '@/api/system/common' import { fetchList as userList } from '@/api/system/user' import { findListByObjId } from '@/api/meeting/projects' +import { BookDetailById } from '@/api/meeting/bookings' import { findList } from '@/api/meeting/roomTime' import { numRule, arrayRule } from '@/utils/form' export default { @@ -126,8 +157,10 @@ times: [], content: '', sysList: [], - fileList: [], + fileList: [] }, + activeInfo: {}, + isShowDetail: false, isEdit: false, // room: [], sysList: [], @@ -136,20 +169,20 @@ // 楠岃瘉瑙勫垯 rules: { roomId: [ - { required: true, validator: numRule, message: '璇烽�夋嫨鍏宠仈浼氳瀹�', tigger: 'change' } + { required: true, validator: numRule, message: '璇烽�夋嫨鍏宠仈浼氳瀹�', tigger: 'change' } ], date: [ - { required: true, message: '璇烽�夋嫨棰勫畾鏃ユ湡', tigger: 'change' } + { required: true, message: '璇烽�夋嫨棰勫畾鏃ユ湡', tigger: 'change' } ], times: [ - { required: true, validator: arrayRule, message: '璇烽�夋嫨棰勭害鏃堕棿', tigger: 'change' } + { required: true, validator: arrayRule, message: '璇烽�夋嫨棰勭害鏃堕棿', tigger: 'change' } ], sysList: [ - { required: true, validator: arrayRule, message: '璇烽�夋嫨鍙備細浜哄憳', tigger: 'change' } + { required: true, validator: arrayRule, message: '璇烽�夋嫨鍙備細浜哄憳', tigger: 'change' } ], name: [ - { required: true, message: '璇烽�夋嫨杈撳叆浼氳涓婚', tigger: 'blur' } - ], + { required: true, message: '璇烽�夋嫨杈撳叆浼氳涓婚', tigger: 'blur' } + ] // content: [ // { required: true, message: '璇疯緭鍏ヤ細璁唴瀹�', tigger: 'blur' } // ], @@ -165,10 +198,10 @@ userList({ page: 1, capacity: 9999, - model: { realname: this.filterText }, + model: { realname: this.filterText } }) .then(res => { - console.log('userList', res); + console.log('userList', res) this.sysList = res.records }) }, @@ -178,7 +211,7 @@ * @title 绐楀彛鏍囬 * @target 缂栬緫鐨勫璞� */ - open (title, target) { + open (title, target) { this.title = title this.visible = true this.timelist = [] @@ -187,8 +220,6 @@ if (target == null) { this.$nextTick(() => { this.$refs.form.resetFields() - console.log(this.form.content); - debugger this.form[this.configData['field.id']] = null }) return @@ -208,7 +239,7 @@ this.selectRoom(this.form.roomId) }) }, - selectRoom(objId) { + selectRoom (objId) { this.getTimes() findListByObjId({ objId: objId, @@ -218,11 +249,11 @@ this.projectList = res }) }, - selectDate(v) { + selectDate (v) { // console.log(v); this.getTimes() }, - getTimes(isInit=false) { + getTimes (isInit = false) { this.form.times = [] this.timelist = [] @@ -259,33 +290,45 @@ }) } }, - selectTimes(index, item) { + getDetail (id) { + BookDetailById({ + id + }).then(res => { + this.activeInfo = res + this.isShowDetail = true + }) + }, + selectTimes (index, item) { + if (item.bookingTimeId) { + this.getDetail(item.bookingTimeId) + return + } if (this.isEdit) { return } - let tempIndex = this.form.times.indexOf(index) + const tempIndex = this.form.times.indexOf(index) if (tempIndex != -1) { - if (tempIndex==0) { + if (tempIndex == 0) { // console.log(this.form.times); // debugger this.form.times.splice(0, 1) - } else if (tempIndex==this.form.times.length-1) { + } else if (tempIndex == this.form.times.length - 1) { this.form.times.splice(tempIndex, 1) } } else { if (item.isUse) { return } - if (this.form.times.length && index+1 !== this.form.times[0] && index-1 !== this.form.times[this.form.times.length-1]) { + if (this.form.times.length && index + 1 !== this.form.times[0] && index - 1 !== this.form.times[this.form.times.length - 1]) { this.$message.error('棰勭害鏃堕棿蹇呴』鏄浉閭荤殑锛�') return } this.form.times.push(index) - this.form.times.sort((x,y)=> x - y) + this.form.times.sort((x, y) => x - y) } // console.log(this.form.times); }, - upFiles(file) { + upFiles (file) { const formdate = new FormData() this.isUploading = true formdate.append('file', file.target.files[0]) @@ -318,21 +361,21 @@ this.isWorking = true let sysList = [...this.form.sysList] sysList = sysList.map(item => { - return {userId: item} + return { userId: item } }) let projectList = [...this.form.projectList] projectList = projectList.map(item => { - return {projectId: item} + return { projectId: item } }) - let bookingTimeList = [] + const bookingTimeList = [] this.form.times.forEach(item => { bookingTimeList.push({ timeId: this.timelist[item].id, id: this.timelist[item].bookingTimeId }) }) - let startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00' - let endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length-1]].endTime + ':00' + const startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00' + const endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length - 1]].endTime + ':00' this.api.create({ ...this.form, sysList, @@ -364,21 +407,21 @@ this.isWorking = true let sysList = [...this.form.sysList] sysList = sysList.map(item => { - return {userId: item} + return { userId: item } }) let projectList = [...this.form.projectList] projectList = projectList.map(item => { - return {projectId: item} + return { projectId: item } }) - let bookingTimeList = [] + const bookingTimeList = [] this.form.times.forEach(item => { bookingTimeList.push({ timeId: this.timelist[item].id, id: this.timelist[item].bookingTimeId }) }) - let startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00' - let endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length-1]].endTime + ':00' + const startTime = this.form.date + ' ' + this.timelist[this.form.times[0]].startTime + ':00' + const endTime = this.form.date + ' ' + this.timelist[this.form.times[this.form.times.length - 1]].endTime + ':00' this.api.updateById({ ...this.form, sysList, @@ -400,7 +443,7 @@ }) }) } - }, + } } </script> @@ -433,10 +476,40 @@ color: #fff; } .time-item-disable { + color: #e4e4e4; + border-color: #999; + background-color: #999; + } + .disable{ border-color: #999; background-color: #999; color: #111; } } +.detail_modal { + padding: 20px 16px; + .title { + text-align: center; + font-weight: 600; + font-size: 16px; + margin-bottom: 20px; + } + .h1 { + font-weight: 600; + font-size: 16px; + margin-bottom: 15px; + } + .line { + display: flex; + margin-bottom: 10px; + .label { + width: 70px; + color: #888888; + } + .value { + color: #333333; + } + } +} </style> diff --git a/admin/src/views/meeting/devices.vue b/admin/src/views/meeting/devices.vue index cd564ba..236e75e 100644 --- a/admin/src/views/meeting/devices.vue +++ b/admin/src/views/meeting/devices.vue @@ -144,7 +144,6 @@ this.$message.success('淇敼鎴愬姛') }) .catch(e => { - this.$message.error(e) }) .finally(() => { this.handlePageChange() diff --git a/admin/src/views/meeting/rooms.vue b/admin/src/views/meeting/rooms.vue index 0b49a6c..4fbc523 100644 --- a/admin/src/views/meeting/rooms.vue +++ b/admin/src/views/meeting/rooms.vue @@ -152,7 +152,7 @@ } } }, - provide() { + provide () { return { userList: () => this.userList } @@ -167,7 +167,7 @@ userList({ page: 1, capacity: 9999, - model: { realname: this.filterText }, + model: { realname: this.filterText } }) .then(res => { this.userList = res.records @@ -175,16 +175,16 @@ this.search() }, methods: { - // 椤电爜鍙樻洿澶勭悊 + // 椤电爜鍙樻洿澶勭悊 handlePageChange (pageIndex) { this.__checkApi() this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex this.isWorking.search = true let sysList = [...this.searchForm.sysList] sysList = sysList.map(item => { - return {userId: item} + return { userId: item } }) - console.log(sysList); + console.log(sysList) this.api.fetchList({ page: this.tableData.pagination.pageIndex, capacity: this.tableData.pagination.pageSize, @@ -209,23 +209,21 @@ // console.log('21212'); // this.$refs.selectMember.open('閫夋嫨绠$悊鍛�') // }, - changeStatus(item) { + changeStatus (item) { updateStatusById({ id: item.id, status: item.status }) .then(() => { this.$message.success('淇敼鎴愬姛') - }) .catch(e => { - this.$message.error(e) }) .finally(() => { this.handlePageChange() }) } - }, + } } </script> diff --git a/admin/src/views/operation/serviceCar/apprConfig.vue b/admin/src/views/operation/serviceCar/apprConfig.vue index 9f397cf..4473aac 100644 --- a/admin/src/views/operation/serviceCar/apprConfig.vue +++ b/admin/src/views/operation/serviceCar/apprConfig.vue @@ -164,8 +164,8 @@ <div>鍏佽淇敼"椹鹃┒鍛�"</div> <el-switch class="ml10" - active-value="0" - inactive-value="1" + :active-value="1" + :inactive-value="0" v-model="apprList[activeIndex].driverParam" ></el-switch> </div> diff --git a/admin/src/views/operation/serviceCar/apprRecord.vue b/admin/src/views/operation/serviceCar/apprRecord.vue index 6c8f7d5..85828a2 100644 --- a/admin/src/views/operation/serviceCar/apprRecord.vue +++ b/admin/src/views/operation/serviceCar/apprRecord.vue @@ -17,7 +17,7 @@ <el-option label="瀹℃牳涓�" value="1"></el-option> <el-option label="瀹℃壒閫氳繃" value="2"></el-option> <el-option label="瀹℃壒涓嶉�氳繃" value="3"></el-option> - <el-option label="宸插彇娑�" value="4"></el-option> + <el-option label="宸叉挙閿�" value="4"></el-option> </el-select> </el-form-item> <el-form-item label="鐩殑鍦扮被鍨�" prop="type"> @@ -83,10 +83,10 @@ <el-table-column label="鐘舵��" min-width="100px"> <template slot-scope="{row}"> <span class="status-blue" v-if="row.status === 0">鐢宠涓�</span> - <span class="status-blue" v-if="row.status === 1">寰呭鎵�</span> + <span class="status-blue" v-if="row.status === 1">瀹℃牳涓�</span> <span class="status-green" v-if="row.status === 2">瀹℃壒閫氳繃</span> <span class="status-red" v-if="row.status === 3">瀹℃壒涓嶉�氳繃</span> - <span class="status-red" v-if="row.status === 4">宸插彇娑�</span> + <span class="status-red" v-if="row.status === 4">宸叉挙閿�</span> </template> </el-table-column> @@ -94,12 +94,13 @@ <el-table-column prop="editDate" label="鎿嶄綔鏃堕棿" min-width="150px"></el-table-column> <el-table-column label="鎿嶄綔" - min-width="100" + min-width="140" align="center" fixed="right" > <template slot-scope="{row}"> <el-button type="text" icon="el-icon-edit" @click="$refs.OperaDetailsWindow.open('鍏姟杞︾敵璇疯鎯�',row)" >鏌ョ湅璇︽儏</el-button> + <el-button v-if="(row.status === 1 || row.status === 2) && new Date().getTime() < new Date(row.startTime).getTime()" type="text" icon="el-icon-delete" @click="rowRevokeClick(row)" >鎾ら攢</el-button> </template> </el-table-column> </el-table> @@ -123,7 +124,7 @@ import OperaCarUseBookParamWindow from '@/components/operation/OperCarUseBookParamWindow.vue' import { timeForMat } from '@/utils/util' import { allList } from '@/api/business/hiddenDangerParam' -import { carUseBookRecordEx } from '@/api/business/carUseBook' +import { carUseBookRecordEx, revokeById } from '@/api/business/carUseBook' export default { name: 'Empower', extends: BaseTable, @@ -157,6 +158,9 @@ this.loadParams() }, methods: { + rowRevokeClick (row) { + revokeById(row.id) + }, handleEx () { this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵') .then(() => { diff --git a/admin/src/views/task/index.vue b/admin/src/views/task/index.vue index d4a61d0..2a8a038 100644 --- a/admin/src/views/task/index.vue +++ b/admin/src/views/task/index.vue @@ -121,7 +121,8 @@ import dayjs from 'dayjs' import { taskCenterHeadPC, - taskCenterPage + taskCenterPage, + taskSignRead } from '@/api' export default { components: { @@ -201,6 +202,14 @@ this.getList() }, handleDetail (row) { + if (this.filters.queryType == 3) { + taskSignRead({ + noticesId: row.id, + signType: 0 + }).then(res => { + this.getHeadData() + }) + } if (row.objType === 2) { this.$refs.OperaDetailsWindow.open('鍏姟杞︾敵璇疯鎯�', row) return @@ -260,7 +269,7 @@ }) }, getHeadData () { - const {filters} = this + const { filters } = this if (filters.selTime && filters.selTime.length > 0) { filters.startDate = filters.selTime[0] filters.endDate = filters.selTime[1] diff --git a/admin/src/views/task/visSubDetail.vue b/admin/src/views/task/visSubDetail.vue index b9595dc..8f04d80 100644 --- a/admin/src/views/task/visSubDetail.vue +++ b/admin/src/views/task/visSubDetail.vue @@ -5,7 +5,7 @@ <div class="header"> <div class="left"> <div class="h1">{{ cateList[type] }}</div> - <div class="time">鎻愪氦鏃堕棿锛歿{ info.createDate }}</div> + <div class="time">鎻愪氦鏃堕棿锛歿{ info.createTime }}</div> </div> <div class="right">{{ statusMap[info.status] }}</div> </div> @@ -68,7 +68,13 @@ label="璇佷欢绫诲瀷" prop="idcardTypeName" min-width="80" - /> + > + <template slot-scope="{ row }"> + <span v-if="row.idcardType == 0">韬唤璇�</span> + <span v-if="row.idcardType == 1">娓境璇佷欢</span> + <span v-if="row.idcardType == 2">鎶ょ収</span> + </template> + </el-table-column> <el-table-column label="璇佷欢鍙风爜" prop="idCardDecode" @@ -81,7 +87,7 @@ /> <el-table-column label="浜鸿劯鐓х墖" prop="" min-width="80"> <template slot-scope="{ row }"> - <el-image :src="row.prefix" :preview-src-list="[row.prefix]"> + <el-image :src="row.prefix + row.faceImg" :preview-src-list="[row.prefix + row.faceImg]"> </el-image> </template> </el-table-column> diff --git a/h5/App.vue b/h5/App.vue index 622fd7a..a46a53b 100644 --- a/h5/App.vue +++ b/h5/App.vue @@ -6,6 +6,7 @@ if (!that.$store.state.openid) { let url = window.location.href let code = '' + let source = '' if (url.indexOf('code=') !== -1) { const query = url.split('?') console.log('app-app', url) @@ -13,9 +14,13 @@ if (q.indexOf('code=') !== -1) { code = q.substring(q.indexOf('code=') + 5, q.length) } + if (q.indexOf('source=') !== -1) { + source = q.substring(q.indexOf('source=') + 7,q.indexOf('source=') + 8 ) + } } wxAuthorize({ - code: code + code: code, + source }).then(res => { console.log('app_ress', res) if (res.code === 200) { diff --git a/h5/api/meeting.js b/h5/api/meeting.js index 29ba261..c9f6413 100644 --- a/h5/api/meeting.js +++ b/h5/api/meeting.js @@ -83,7 +83,15 @@ export const cancelById = (data) => { return http({ url: 'meetingAdmin/cloudService/business/meeting/reservationCancel', - method: 'get', + method: 'post', + data + }) +} +// 浼氳瀹� 缁撴潫 +export const closeMeetignById = (data) => { + return http({ + url: 'meetingAdmin/cloudService/business/meeting/reservationOver', + method: 'post', data }) } diff --git a/h5/api/staff.js b/h5/api/staff.js index c9688d4..d32ffdc 100644 --- a/h5/api/staff.js +++ b/h5/api/staff.js @@ -205,4 +205,12 @@ method: 'post', data }) -} \ No newline at end of file +} +// 浠诲姟涓績 鏍囪宸茶 +export const signReadTask = (data) => { + return http({ + url: 'visitsAdmin/cloudService/business/staging/signRead', + method: 'get', + data + }) +} diff --git a/h5/components/Li-Calendar/Li-Calendar.vue b/h5/components/Li-Calendar/Li-Calendar.vue index f8f970c..8503056 100644 --- a/h5/components/Li-Calendar/Li-Calendar.vue +++ b/h5/components/Li-Calendar/Li-Calendar.vue @@ -858,8 +858,8 @@ /* color: #000; */ } .calendar-today { - /* border-radius: 6upx; - background-color: $uni-color-primary; */ + border-radius: 6rpx; + background-color: #e9f4f6; color: $uni-color-primary; /* -moz-box-shadow: 0px 2upx 10upx #ABABAB; -webkit-box-shadow: 0px 2upx 10upx #ABABAB; diff --git a/h5/pages.json b/h5/pages.json index 3384649..31a0fd0 100644 --- a/h5/pages.json +++ b/h5/pages.json @@ -28,8 +28,7 @@ "path": "pages/staffLogin/login", "style": { "navigationBarTitleText": "鐧诲綍", - "enablePullDownRefresh": false, - "navigationStyle": "custom" + "enablePullDownRefresh": false } }, { diff --git a/h5/pages/applicationRecord/applicationRecord.vue b/h5/pages/applicationRecord/applicationRecord.vue index b9d0641..98b1598 100644 --- a/h5/pages/applicationRecord/applicationRecord.vue +++ b/h5/pages/applicationRecord/applicationRecord.vue @@ -36,7 +36,7 @@ :key="index" > <view class="box_list_item_head"> - <text>{{ item.name }}鐨勫姵鍔″叆鍥敵璇�</text> + <text>{{ item.name }}鎻愪氦鐨勮瀹㈢敵璇�</text> <text class="loading">{{ statusMap[item.status] }}</text> </view> <view class="box_list_item_nr"> diff --git a/h5/pages/login/login.vue b/h5/pages/login/login.vue index 94f9275..c459474 100644 --- a/h5/pages/login/login.vue +++ b/h5/pages/login/login.vue @@ -11,7 +11,7 @@ </view> <u-icon name="arrow-right" size="24" color="#979797" /> </view> - <view class="item" @click="jump('/pages/staffLogin/login')"> + <view class="item" @click="staffLogin"> <image class="avatar" src="@/static/ic_staff@2x.png" /> <view class="content"> <view class="name">鎴戞槸鍛樺伐</view> @@ -34,10 +34,22 @@ export default { methods: { jump(url) { - console.log(url); + console.log(url) uni.navigateTo({ url }) + }, + staffLogin() { + const userInfo = uni.getStorageSync('userInfo') || {} + if (userInfo && userInfo.memberId) { + uni.navigateTo({ + url: '/pages/staff/index' + }) + }else{ + uni.navigateTo({ + url: '/pages/staffLogin/login' + }) + } } } } @@ -66,7 +78,7 @@ line-height: 66rpx; margin-bottom: 16rpx; } - .place{ + .place { margin-bottom: 98rpx; } .item { diff --git a/h5/pages/staff/index.vue b/h5/pages/staff/index.vue index 054cca9..888b8bd 100644 --- a/h5/pages/staff/index.vue +++ b/h5/pages/staff/index.vue @@ -63,7 +63,7 @@ <image class="img" src="@/static/staff/ic_renwuzhongxin.png"></image> <view class="h1">浠诲姟涓績</view> <view class="h2">TASK CENTER</view> - <view class="task_num">{{ taskNum }}</view> + <view class="task_num">{{ taskInfo.noticeWaitNum + taskInfo.noticeCopyNum }}</view> </view> <view class="img_wrap" @click="jump('/pages/staff/meetingCalendar')"> <image class="img" src="@/static/staff/ic_wodehuiyi.png"></image> @@ -94,11 +94,10 @@ data() { return { userInfo: uni.getStorageSync('userInfo'), - taskNum: 0 + taskInfo: 0 } }, onLoad() { - console.log('userInfo', this.userInfo) }, onShow() { if (this.userInfo && this.userInfo.memberId) { @@ -120,9 +119,9 @@ }, getTaskInfo() { stagingHead({ - isDetail: '0' + isDetail: '1' }).then(res => { - this.taskNum = res.data.taskNum + this.taskInfo = res.data }) }, } diff --git a/h5/pages/staff/meetingCalendar.vue b/h5/pages/staff/meetingCalendar.vue index 1a6b653..64a22be 100644 --- a/h5/pages/staff/meetingCalendar.vue +++ b/h5/pages/staff/meetingCalendar.vue @@ -463,6 +463,10 @@ font-weight: 600; font-size: 32rpx; color: #222222; + flex: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } .status { height: 38rpx; @@ -472,6 +476,10 @@ border: 1rpx solid #999999; font-size: 22rpx; color: #999999; + margin-left: 20rpx; + display: flex; + justify-content: center; + align-items: center; } .padding { color: $uni-color-primary; diff --git a/h5/pages/staff/meetingDetail.vue b/h5/pages/staff/meetingDetail.vue index 0222759..fd97fcf 100644 --- a/h5/pages/staff/meetingDetail.vue +++ b/h5/pages/staff/meetingDetail.vue @@ -10,7 +10,7 @@ <!-- --> <view class="empty"></view> <view class="module_list"> - <view class="item"> + <view class="item" v-if="detail.meetingContent"> <view class="label">浼氳鍐呭</view> <view class="value"> <!-- <text>涓昏璁ㄨ鏅鸿兘浼氳瀹ょ郴缁熼�夊瀷锛岃澶у涓�瀹氳鎸夋椂鏉ュ紑浼氾紝鏃堕棿瀹濊吹銆傛劅璋㈠ぇ瀹讹紒</text> --> @@ -24,7 +24,7 @@ /> </view> </view> - <view class="item"> + <view class="item" v-if="detail.userResponseList && detail.userResponseList.length > 0"> <view class="label">鍙備細浜哄憳</view> <view class="value"> <view class="personnel"> @@ -33,13 +33,19 @@ v-for="mem in detail.userResponseList" :key="mem.id" > - <image :src="mem.avatar ? mem.avatar : require('@/static/meeting/common/default_user@2x.png')" class="avatar" mode=""></image> + <image + v-if="mem.avatar" + :src="mem.avatar" + class="avatar" + mode="" + ></image> + <view v-else class="avatar">{{ mem.realname.slice(0, 1) }}</view> <view class="name">{{ mem.realname }}</view> </view> </view> </view> </view> - <view class="item"> + <view class="item" v-if="detail.projectsResponseList && detail.projectsResponseList.length > 0"> <view class="label">鏈嶅姟椤�</view> <view class="value"> <template v-for="(ser, serI) in detail.projectsResponseList"> @@ -54,13 +60,13 @@ </template> </view> </view> - <view class="item"> + <view class="item" v-if="detail.remark || detail.meetingRemark"> <view class="label">澶囨敞</view> <view class="value">{{ detail.remark || detail.meetingRemark }}</view> </view> <view class="item"> <view class="label">棰勭害浜�</view> - <view class="value" + <view class="value" v-if="detail.bookingUser" >{{ detail.bookingUser.companyName || "" }} {{ detail.bookingUser.realname }} {{ detail.bookingUser.mobile }}</view @@ -69,22 +75,72 @@ </view> <view class="empty empty2"></view> <view class="main_footer" v-if="detail.meetingStatus == '1'"> - <view class="btn" @click="handleCancel(detail.id)">鎾ゅ洖</view> + <view class="btn" @click="openCancel">鎾ゅ洖</view> <view class="btn agree" @click="handleEdit">淇敼</view> </view> <view class="main_footer" v-if="detail.meetingStatus == '2'"> - <view class="btn agree" @click="handleSub('2')">缁撴潫</view> + <view class="btn agree" @click="openClose">缁撴潫</view> </view> + <!-- 鎾ゅ洖 --> + <u-popup + catchtouchmove + :show="isShowCancel" + closeable + :round="12" + mode="bottom" + @close="isShowCancel = false" + > + <view class="cancel_modal"> + <view class="title">鎾ら攢棰勭害</view> + <view class="line"> + <view class="label">鎾ゅ洖璇存槑</view> + <textarea + class="textarea" + placeholder="璇疯緭鍏�" + maxlength="300" + v-model="cancelParam.businessRemark" + /> + </view> + <view class="sub_btn" @click="handleCancel('0')">鎻愪氦</view> + </view> + </u-popup> + <!-- 缁撴潫 --> + <u-popup + catchtouchmove + closeable + :show="isShowClose" + :round="12" + mode="bottom" + @close="isShowClose = false" + > + <view class="cancel_modal"> + <view class="title">缁撴潫棰勭害</view> + <view class="line"> + <view class="label">缁撴潫璇存槑</view> + <textarea + class="textarea" + placeholder="璇疯緭鍏�" + maxlength="300" + v-model="cancelParam.businessRemark" + /> + </view> + <view class="sub_btn" @click="handleCancel('1')">鎻愪氦</view> + </view> + </u-popup> </view> </template> <script> -import { meetingDetail, cancelById } from '@/api' +import { meetingDetail, cancelById, closeMeetignById } from '@/api' export default { data() { return { param: {}, detail: {}, + + cancelParam: {}, + isShowCancel: false, + isShowClose: false, id: '' } }, @@ -99,30 +155,30 @@ this.detail = res.data }) }, - handleCancel(id) { - uni.showModal({ - title: '鎻愮ず', - // confirmText: '纭', - content: '纭鎾ゅ洖璇ヤ細璁悧', - success: function (res) { - if (res.confirm) { - cancelById({ id }).then(res => { - if (res.code === 200) { - setTimeout(() => { - uni.showToast({ - title: '鎾ゅ洖鎴愬姛', - icon: 'success' - }) - }) - setTimeout(() => { - uni.navigateBack() - }) - } + openCancel() { + this.isShowCancel = true + this.cancelParam = {} + }, + openClose() { + this.isShowClose = true + this.cancelParam = {} + }, + handleCancel(str) { + const { id } = this.detail + let fn = str == '0' ? cancelById : closeMeetignById + fn({ id, ...this.cancelParam }).then(res => { + if (res.code === 200) { + setTimeout(() => { + uni.showToast({ + title: '鎻愪氦鎴愬姛', + icon: 'success' }) - } + }) + setTimeout(() => { + uni.navigateBack() + }) } }) - }, handleEdit() { const { id } = this @@ -189,10 +245,12 @@ flex-direction: column; justify-content: center; align-items: center; + justify-content: center; margin-right: 24rpx; .avatar { width: 72rpx; height: 72rpx; + margin: 0; border-radius: 50%; } .name { @@ -241,4 +299,31 @@ .empty2 { height: 280rpx !important; } +.cancel_modal { + height: 440rpx; + padding: 30rpx; + .title { + padding: 0 30rpx 50rpx; + text-align: center; + } + .line { + .label { + margin-bottom: 10rpx; + } + textarea { + height: 120rpx; + } + } + .sub_btn { + background-color: $uni-color-primary; + display: flex; + justify-content: center; + align-items: center; + color: #fff; + border-radius: 44rpx; + width: 690rpx; + height: 88rpx; + margin: 20rpx auto; + } +} </style> diff --git a/h5/pages/staff/meetingManager.vue b/h5/pages/staff/meetingManager.vue index 8772ad0..b7c7bef 100644 --- a/h5/pages/staff/meetingManager.vue +++ b/h5/pages/staff/meetingManager.vue @@ -179,7 +179,6 @@ getRoomList() { roomsListPost({}).then(res => { this.meetingList = [[{ id: '', name: '鍏ㄩ儴浼氳瀹�' }, ...res.data]] - console.log('meetingList', this.meetingList) }) }, seletedStatus(e) { @@ -355,9 +354,14 @@ font-weight: 600; font-size: 32rpx; color: #222222; + flex: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } .status { height: 38rpx; + margin-left: 20rpx; line-height: 38rpx; padding: 0 16rpx; border-radius: 4rpx; diff --git a/h5/pages/staff/meetingSel.vue b/h5/pages/staff/meetingSel.vue index 64654fa..ba35cde 100644 --- a/h5/pages/staff/meetingSel.vue +++ b/h5/pages/staff/meetingSel.vue @@ -347,6 +347,8 @@ color: #f62710; padding: 0rpx 6rpx; margin-left: 8rpx; + display: flex; + align-items: center; } } } diff --git a/h5/pages/staff/meetingSub.vue b/h5/pages/staff/meetingSub.vue index 5bf6b0b..f4f8d62 100644 --- a/h5/pages/staff/meetingSub.vue +++ b/h5/pages/staff/meetingSub.vue @@ -57,7 +57,7 @@ <view class="">{{ item.name }}</view> </view> </view> - <view class="sub" @click="onSubmit">纭棰勭害</view> + <view class="sub" :class="{disable: !selDatetime}" @click="onSubmit">纭棰勭害</view> </view> </view> <!-- --> @@ -134,7 +134,8 @@ this.getRoomTime() }, onSubmit() { - const { activeRoom } = this + const { activeRoom, selDatetime } = this + if(!selDatetime) return const selTimeList = this.timeList.filter(i => i.checked == '1') if (selTimeList.length == -1) { return uni.showToast({ @@ -332,12 +333,14 @@ font-size: 30rpx; color: #ffffff; } + .disable { + background-color: #cccccc; + } } } .time_list { display: flex; - justify-content: space-between; - padding: 30rpx; + padding: 30rpx 30rpx 240rpx; flex-wrap: wrap; .item { width: 220rpx; @@ -348,6 +351,10 @@ border-radius: 4rpx; margin-bottom: 24rpx; font-size: 30rpx; + margin-right: 15rpx; + &:nth-of-type(3n){ + margin-right: 0; + } } .active { background-color: $uni-color-primary; diff --git a/h5/pages/staff/meetingSubOrder.vue b/h5/pages/staff/meetingSubOrder.vue index 400120b..1d82d33 100644 --- a/h5/pages/staff/meetingSubOrder.vue +++ b/h5/pages/staff/meetingSubOrder.vue @@ -60,7 +60,7 @@ <view class="item"> <view class="name"> 鍙備細浜哄憳 - <text class="star">*</text> + <text class="star"></text> </view> <view class="line" @click="selPeople"> <view class="label"> @@ -215,6 +215,7 @@ }) }, handleBack() { + if(this.param.id) return uni.navigateBack( ) }, onSubmit() { @@ -223,10 +224,10 @@ title: '璇疯緭鍏ヤ細璁富棰�', icon: 'none' }) - if (!param.sysList || param.sysList.length == 0) return uni.showToast({ - title: '璇烽�夋嫨鍙備細浜哄憳', - icon: 'none' - }) + // if (!param.sysList || param.sysList.length == 0) return uni.showToast({ + // title: '璇烽�夋嫨鍙備細浜哄憳', + // icon: 'none' + // }) reservationMeeting({ ...param, startTime: `${param.yudingDate} ${param.startTime}:00`, diff --git a/h5/pages/staff/snapshot.vue b/h5/pages/staff/snapshot.vue index 8ddde02..b0677bc 100644 --- a/h5/pages/staff/snapshot.vue +++ b/h5/pages/staff/snapshot.vue @@ -224,7 +224,7 @@ icon: 'none' }) if (!param.applyCheckUserId) return uni.showToast({ - title: '璇烽�夋嫨鎺ュ彈浜�', + title: '璇烽�夋嫨鎺ユ敹浜�', icon: 'none' }) if (!param.categoryName) return uni.showToast({ @@ -258,7 +258,7 @@ this.$set(this.param, 'checkUserId', item.memberIds) this.$set(this.param, 'applyCheckUserId', item.memberIds) this.$set(this.param, 'checkorName', item.memberNames) - }else{ + } else { this.$set(this.param, 'checkUserId', '') this.$set(this.param, 'applyCheckUserId', '') this.$set(this.param, 'checkorName', '') diff --git a/h5/pages/staff/task/index.vue b/h5/pages/staff/task/index.vue index f3545ba..942d23b 100644 --- a/h5/pages/staff/task/index.vue +++ b/h5/pages/staff/task/index.vue @@ -1,5 +1,5 @@ <template> - <view class="box"> + <view class="box" :class="{ popupShow: showFilter }"> <scroll-view scroll-x class="box_head"> <view class="box_head_search"> <view class="box_head_search_ipt"> @@ -21,7 +21,7 @@ @click="statusClick(0)" :class="{ active: search.queryType === 0 }" class="box_head_item" - >寰呭鐞� {{ headData.noticeWaitNum || '' }}</view + >寰呭鐞� {{ headData.noticeWaitNum || "" }}</view > <view @click="statusClick(1)" @@ -39,7 +39,7 @@ @click="statusClick(3)" :class="{ active: search.queryType === 3 }" class="box_head_item" - >鎶勯�佹垜鐨� {{ headData.noticeCopyNum || '' }}</view + >鎶勯�佹垜鐨� {{ headData.noticeCopyNum || "" }}</view > </view> </scroll-view> @@ -60,7 +60,7 @@ /> <text>浠呯湅鏈</text> </view> - <view class="right">鍏ㄩ儴鏍囪宸茶</view> + <view class="right" @click="handleReady">鍏ㄩ儴鏍囪宸茶</view> </view> <view class="box_list_item" @@ -115,11 +115,7 @@ <view class="box_list_item_nr_x"></view> <view class="box_list_item_nr_text"> <text class="time">{{ item.createDate }}鎻愪氦</text> - <text - v-if="item.param2 == '0'" - class="btn" - >鍘诲鐞�</text - > + <text v-if="item.param2 == '0'" class="btn">鍘诲鐞�</text> </view> </view> </view> @@ -141,17 +137,17 @@ @close="showFilter = false" > <view class="search"> - <view class="search_head">浠诲姟绛涢��</view> + <view class="search_head">绛涢��</view> <view class="search_list"> <view class="search_list_item"> - <view class="search_list_item_label">鍒涘缓鏃ユ湡</view> + <view class="search_list_item_label">鍒涘缓鏃堕棿</view> <view class="search_list_item_val"> <view class="search_list_item_val_row" @click="tiemShow = true" :style="{ color: modelParam.startDate ? '#000' : '' }" >{{ - modelParam.startDate ? modelParam.startDate : "寮�濮嬫棩鏈�" + modelParam.startDate ? modelParam.startDate : "寮�濮嬫椂闂�" }}</view > <view class="search_list_item_val_z">-</view> @@ -160,13 +156,13 @@ @click="tiemShow1 = true" :style="{ color: modelParam.endDate ? '#000' : '' }" >{{ - modelParam.endDate ? modelParam.endDate : "缁撴潫鏃ユ湡" + modelParam.endDate ? modelParam.endDate : "缁撴潫鏃堕棿" }}</view > </view> </view> <view class="search_list_item"> - <view class="search_list_item_label">璁㈠崟鏉ユ簮</view> + <view class="search_list_item_label">浠诲姟绫诲瀷</view> <view class="search_list_item_cates"> <view :class=" @@ -184,23 +180,24 @@ </view> </view> <view class="search_footer"> - <view class="search_footer_item" @click="showFilter = false" - >鍙栨秷</view - > + <view class="search_footer_item" @click="modalReset">閲嶇疆</view> <view class="search_footer_item t" @click="modalSub">鎻愪氦</view> </view> </view> </u-popup> <u-datetime-picker :show="tiemShow" - v-model="modelParam.startDate" + v-model="startDate" mode="date" @confirm="confirmLeft" @cancel="tiemShow = false" ></u-datetime-picker> <u-datetime-picker :show="tiemShow1" - v-model="modelParam.endDate" + :minDate=" + modelParam.startDate ? new Date(modelParam.startDate).getTime() : null + " + v-model="startDate" mode="date" @confirm="confirmRight" @cancel="tiemShow1 = false" @@ -209,7 +206,7 @@ </template> <script> -import { stagingHead, stagingTaskPage } from '@/api' +import { stagingHead, stagingTaskPage, signReadTask } from '@/api' import dayjs from 'dayjs' export default { data() { @@ -218,10 +215,7 @@ search: { queryType: 0 }, - modelParam: { - startDate: dayjs().format('YYYY-MM-DD'), - endDate: dayjs().format('YYYY-MM-DD'), - }, + modelParam: {}, tiemShow: false, tiemShow1: false, @@ -237,7 +231,8 @@ { name: '鐢ㄨ溅鐢宠', id: 2 }, { name: '闅愭偅闅忔墜鎷�', id: 3 }, { name: '鐗╂祦杞︾敵璇�', id: 4 }, - ] + ], + startDate: dayjs().format('YYYY-MM-DD'), } }, // onLoad() { @@ -267,6 +262,13 @@ this.pagination.page = 0 this.dataList = [] this.$set(this.search, 'noRead', val) + this.getList() + }, + modalReset() { + this.modelParam = {} + this.pagination.page = 0 + this.dataList = [] + this.showFilter = false this.getList() }, modalSub() { @@ -306,8 +308,23 @@ this.headData = res.data }) }, + handleReady() { + signReadTask({ + signType: 1 + }).then(res => { + this.getHeadList() + }) + }, handleAppr(item) { const { objType, objId } = item + if (this.search.queryType === 3) { + signReadTask({ + noticesId: item.id, + signType: 0 + }).then(res => { + this.getHeadList() + }) + } if (objType === 2) { uni.navigateTo({ url: `/pages/staff/vehicle/sendACarDetail?id=${objId}&appr=1` @@ -327,19 +344,21 @@ } }, clickItem(index) { - this.$set(this.modelParam, 'type', this.cateList[index].id) + if (this.cateList[index].id === this.modelParam.type) { + this.$set(this.modelParam, 'type', null) + } else { + this.$set(this.modelParam, 'type', this.cateList[index].id) + } }, confirmLeft(e) { - console.log(uni.$u.timeFormat(e.value, 'yyyy-mm-dd')) setTimeout(() => { - this.modelParam.startDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd') + this.$set(this.modelParam, 'startDate', uni.$u.timeFormat(e.value, 'yyyy-mm-dd')) }) this.tiemShow = false }, confirmRight(e) { - // this.modelParam.endDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd hh:MM:ss') setTimeout(() => { - this.modelParam.endDate = uni.$u.timeFormat(e.value, 'yyyy-mm-dd') + this.$set(this.modelParam, 'endDate', uni.$u.timeFormat(e.value, 'yyyy-mm-dd')) }) this.tiemShow1 = false } @@ -588,8 +607,9 @@ color: #ffffff !important; } .search_list_item_cates_row { - padding: 0 26rpx; + width: 216rpx; height: 64rpx; + text-align: center; line-height: 64rpx; background: #f7f7f7; border-radius: 36rpx; @@ -598,8 +618,8 @@ font-weight: 400; color: #333333; margin-bottom: 20rpx; - &:last-child { - margin: 0; + &:nth-of-type(3n) { + margin-right: 0; } } } diff --git a/h5/pages/staff/task/vDangetAppr.vue b/h5/pages/staff/task/vDangetAppr.vue index f9df6eb..6eb1460 100644 --- a/h5/pages/staff/task/vDangetAppr.vue +++ b/h5/pages/staff/task/vDangetAppr.vue @@ -33,13 +33,14 @@ <image v-if="item.type == 0" :src="item.fileurlFull" + @click="priviewImage(item.fileurlFull)" mode="widthFix" class="img" /> <video v-if="item.type == 1" :src="item.fileurlFull" - class="img" + class="video" controls /> </view> @@ -177,7 +178,15 @@ </view> </view> <view class="emyty"></view> - <view v-if="info.approveDateVO!=null&& info.approveDateVO.canBeApproved!=null &&info.approveDateVO.canBeApproved ==1 && info.status == 0" class="main_footer" > + <view + v-if=" + info.approveDateVO != null && + info.approveDateVO.canBeApproved != null && + info.approveDateVO.canBeApproved == 1 && + info.status == 0 + " + class="main_footer" + > <view class="btn" @click="handleBack">閫�鍥�</view> <view class="btn transfer" @click="handleTransfer">杞氦</view> <view class="btn handle" @click="handleOpen">澶勭悊</view> @@ -516,6 +525,11 @@ this.getDetail() }, methods: { + priviewImage(url) { + uni.previewImage({ + urls: [url] + }) + }, handleOpen() { this.isShowHandle = true console.log('info', this.info) @@ -593,10 +607,10 @@ }, getMemList() { findHiddenAreaMemberList({ - model: { + model: { ...this.transferModel, id: this.info.areaId - }, + }, ...this.pagination, }).then(res => { this.memberList = res.data || [] @@ -1024,33 +1038,33 @@ } } .adduser_list_item_ipt1_upload { - width: 120rpx; - height: 120rpx; - margin-right: 24rpx; - border: 2rpx solid #e5e5e5; - background: #f7f7f7; - color: #666666; - font-size: 22rpx; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: relative; - .close { - position: absolute; - right: -20rpx; - top: -20rpx; - z-index: 9999; - } - image { - width: 100%; - height: 100%; - } - video { - width: 100%; - max-height: 120rpx; - } + width: 120rpx; + height: 120rpx; + margin-right: 24rpx; + border: 2rpx solid #e5e5e5; + background: #f7f7f7; + color: #666666; + font-size: 22rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + position: relative; + .close { + position: absolute; + right: -20rpx; + top: -20rpx; + z-index: 9999; } + image { + width: 100%; + height: 100%; + } + video { + width: 100%; + max-height: 120rpx; + } + } .module_list { .item { @@ -1113,13 +1127,12 @@ } .file_list { display: flex; - flex-wrap: wrap; margin-bottom: 20rpx; + overflow-x: auto; .img_wrap { margin-top: 24rpx; - width: 120rpx; - height: 120rpx; - margin-right: 24rpx; + min-width: 160rpx; + height: 160rpx; border: 2rpx solid #e5e5e5; background: #f7f7f7; color: #666666; @@ -1129,10 +1142,15 @@ align-items: center; justify-content: center; position: relative; + margin-right: 16rpx; + flex-shrink: 0; } .img { - width: 120rpx; - max-height: 120rpx; + width: 100%; + max-height: 100%; + } + .video { + height: 160rpx; } } .text_wrap { diff --git a/h5/pages/staff/vehicle/apply.vue b/h5/pages/staff/vehicle/apply.vue index 159180f..87d9c52 100644 --- a/h5/pages/staff/vehicle/apply.vue +++ b/h5/pages/staff/vehicle/apply.vue @@ -142,6 +142,8 @@ <u-datetime-picker :show="isShowDatetime" @confirm="confirmDate" + :minDate="new Date(param.startTime).getTime()" + :maxDate="new Date(param.endTime).getTime()" @cancel="isShowDatetime = false" mode="datetime" ></u-datetime-picker> diff --git a/h5/pages/staff/vehicle/sendACarDetail.vue b/h5/pages/staff/vehicle/sendACarDetail.vue index 60ae8bb..01c8c2e 100644 --- a/h5/pages/staff/vehicle/sendACarDetail.vue +++ b/h5/pages/staff/vehicle/sendACarDetail.vue @@ -118,7 +118,14 @@ </view> </view> <view class="emyty"></view> - <view class="main_footer"> + <view + class="main_footer" + v-if=" + info.approveDateVO != null && + info.approveDateVO.canBeApproved != null && + info.approveDateVO.canBeApproved == 1 + " + > <template v-if="appr == '1'"> <view class="btn" @click="handleSub(3)">鎷掔粷</view> <view class="btn agree" @click="handleSub(2)">鍚屾剰</view> diff --git a/h5/pages/staff/vehicle/shinei.vue b/h5/pages/staff/vehicle/shinei.vue index 9acf2f2..5413edf 100644 --- a/h5/pages/staff/vehicle/shinei.vue +++ b/h5/pages/staff/vehicle/shinei.vue @@ -16,7 +16,11 @@ <view class="time_list"> <view class="item" - :class="{ disable: item.isUse == 1, active: item.checked == '1' }" + :class="{ + disable: item.isUse == 1, + active: item.checked == '1', + hasSub: item.carUseBookId, + }" @click="datetimeClick(item, i)" v-for="(item, i) in timeList" :key="i" @@ -56,18 +60,63 @@ @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 } from '@/api' +import { getCarsList, carCanReservationDate, carUseBookDetail } from '@/api' export default { data() { return { isShowCar: false, isShowDate: false, param: {}, + isShowDetail: false, + activeInfo: {}, minDate: '', carsList: [[{ name: 'aa', value: '11' }]], @@ -87,7 +136,7 @@ }, methods: { onSubmit() { - const { param } = this + const { param } = this const selTimeList = this.timeList.filter(i => i.checked == '1') if (selTimeList.length == 0) { return uni.showToast({ @@ -95,21 +144,25 @@ icon: 'none' }) } - const obj = { - carCode: param.carCode, - carId: param.carId , - startTime: selTimeList[0].startTime, - endTime: selTimeList[selTimeList.length - 1].endTime, - dateDay: param.queryDate, + 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}` - }) + } + 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') }, datetimeClick(item, index) { - if(item.isUse == '1') return + 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) { @@ -156,16 +209,24 @@ 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() - } + if (this.param.carId && this.param.queryDate) { + this.gettimes() + } }, initData() { getCarsList({ - type: 1 + type: 1 }).then(res => { this.carsList = [res.data] }) @@ -181,6 +242,13 @@ 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() + if (endTime < nowTime) { + i.isUse = 1 + } + } }) } }) @@ -189,9 +257,9 @@ 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() - } + if (this.param.carId && this.param.queryDate) { + this.gettimes() + } this.isShowCar = false } } @@ -260,8 +328,7 @@ } .time_list { display: flex; - justify-content: space-between; - padding: 30rpx 0; + padding: 30rpx 0 240rpx; flex-wrap: wrap; .item { width: 220rpx; @@ -272,15 +339,60 @@ border-radius: 4rpx; margin-bottom: 24rpx; font-size: 30rpx; + margin-right: 15rpx; + &:nth-of-type(3n) { + margin-right: 0; + } } .active { background-color: $uni-color-primary; color: #fff; } .disable { - background-color: #cccccc; - color: #999999; + background: #f7f7f7; + color: #cccccc; } + .hasSub { + color: #fff; + 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> diff --git a/h5/pages/staff/vehicle/shiwai.vue b/h5/pages/staff/vehicle/shiwai.vue index 6f7b9e9..ff51cda 100644 --- a/h5/pages/staff/vehicle/shiwai.vue +++ b/h5/pages/staff/vehicle/shiwai.vue @@ -125,7 +125,8 @@ } }, onLoad() { - this.minDate = new Date(dayjs().format('YYYY-MM-DD HH:') + '00:00').getTime() + this.minDate = new Date(dayjs().format('YYYY-MM-DD HH:mm') + ':00').getTime() + console.log('minDate', this.minDate); this.initData() }, methods: { diff --git a/h5/pages/staffLogin/login.vue b/h5/pages/staffLogin/login.vue index 572006f..d4a0c8b 100644 --- a/h5/pages/staffLogin/login.vue +++ b/h5/pages/staffLogin/login.vue @@ -84,7 +84,12 @@ onLoad() { this.initCaptcha() }, - + onBackPress(options) { + uni.redirectTo({ + url: '/pages/login/login' + }) + return true + }, methods: { ...mapMutations(["setToken", "setUserInfo"]), changeFalg() { @@ -122,10 +127,10 @@ title: '瀵嗙爜涓嶈兘涓虹┖', icon: 'none' }) - // if (!form.code) return uni.showToast({ - // title: '楠岃瘉鐮佷笉鑳戒负绌�', - // icon: 'none' - // }) + if (!form.code) return uni.showToast({ + title: '楠岃瘉鐮佷笉鑳戒负绌�', + icon: 'none' + }) loginPost({ ...form, uuid: this.captcha.uuid, @@ -151,7 +156,7 @@ width: 100%; height: 100vh; display: flex; - padding-top: 160rpx; + padding-top: 130rpx; box-sizing: border-box; align-items: center; flex-direction: column; @@ -218,7 +223,6 @@ margin-top: 60rpx; .for_psd { color: $uni-color-primary; - margin-top: 40rpx; width: 140rpx; text-align: center; margin: 40rpx auto; @@ -242,7 +246,7 @@ width: 100%; left: 0; text-align: center; - bottom: 108rpx; + bottom: 88rpx; display: flex; justify-content: center; align-items: center; diff --git a/h5/utils/service.js b/h5/utils/service.js index 41d0bdf..fee9e39 100644 --- a/h5/utils/service.js +++ b/h5/utils/service.js @@ -36,6 +36,7 @@ }) } if (data.code === 5112) { + uni.clearStorageSync() uni.navigateTo({ url: '/pages/login/login' }) -- Gitblit v1.9.3