From b565a275fe240e2bd8a939c3b4beed98d03767bc Mon Sep 17 00:00:00 2001 From: liukangdong <898885815@qq.com> Date: 星期四, 20 二月 2025 18:17:15 +0800 Subject: [PATCH] ll --- admin/src/views/business/onlinePayStatistics.vue | 2 admin/src/views/operation/components/QRcode.vue | 122 ++++ admin/src/views/operation/site.vue | 29 admin/src/api/business/bikes.js | 34 + admin/src/views/business/goodsorder.vue | 3 admin/src/views/combo/components/config.js | 14 admin/src/views/combo/order.vue | 73 +- admin/src/assets/style/style.scss | 3 admin/src/views/business/memberRides.vue | 4 admin/public/template/tram_import_tem.xlsx | 0 admin/src/views/business/bikeRetakeRecord.vue | 4 admin/src/views/combo/index.vue | 100 ++- admin/src/views/operation/components/TramEdit.vue | 46 admin/src/views/business/miniproSetting.vue | 123 ++- admin/src/views/business/bikeRepair.vue | 2 admin/src/views/operation/components/AMap.vue | 144 +++++ admin/src/api/business/combo.js | 53 ++ admin/src/views/combo/components/ComboDetail.vue | 81 +- admin/src/views/combo/components/Refund.vue | 153 +++++ admin/src/components/common/GlobalWindow.vue | 1 admin/src/views/operation/components/SitesWindow.vue | 7 admin/src/utils/request.js | 22 admin/src/views/combo/components/Edit.vue | 187 ++++-- admin/src/views/operation/tram.vue | 201 ++++++- admin/src/views/business/components/Map.vue | 144 +++++ 25 files changed, 1,240 insertions(+), 312 deletions(-) diff --git a/admin/public/template/tram_import_tem.xlsx b/admin/public/template/tram_import_tem.xlsx new file mode 100644 index 0000000..f736947 --- /dev/null +++ b/admin/public/template/tram_import_tem.xlsx Binary files differ diff --git a/admin/src/api/business/bikes.js b/admin/src/api/business/bikes.js index 656464d..2586017 100644 --- a/admin/src/api/business/bikes.js +++ b/admin/src/api/business/bikes.js @@ -1,23 +1,47 @@ import request from '../../utils/request' // 鏌ヨ -export function fetchList (data) { +export function fetchList(data) { return request.post('/business/bikes/page', data, { trim: true }) } - +export function tranListPost(data) { + return request.post('/business/bikes/pageCurrent', data, { + trim: true + }) +} +export function baseTranListPost(params) { + return request.get('/business/baseParam/baseParamList', { params }) +} +// 浜岀淮鐮佸垪琛� +export function qrcodeBike(params) { + return request.get(`/business/locks/findBikeBase`, { params }) +} +export function qrcodeBikeList(params) { + return request.get(`/business/locks/findAllBikeBase`, { params }) +} +export function downloadImgs(data) { + return request.post(`/business/locks/exportEbikeImages`, data, { + trim: true, + download: true + }) +} // 鍒涘缓 -export function create (data) { +export function create(data) { return request.post('/business/bikes/create', data) } // 淇敼 -export function updateById (data) { +export function updateById(data) { return request.post('/business/bikes/updateById', data) } // 鍒犻櫎 -export function deleteById (id) { +export function deleteById(id) { return request.get(`/business/bikes/delete/${id}`) } +// 鍒犻櫎 +export function deleteBatchById(params) { + return request.get(`/business/bikes/delete/batch`, { params }) +} \ No newline at end of file diff --git a/admin/src/api/business/combo.js b/admin/src/api/business/combo.js new file mode 100644 index 0000000..6a6d329 --- /dev/null +++ b/admin/src/api/business/combo.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +export function comboAddPost(data) { + return request.post('/business/discount/create', data, { + trim: true + }) +} +export function comboEditPost(data) { + return request.post('/business/discount/updateById', data, { + trim: true + }) +} +export function comboListPost(data) { + return request.post('/business/discount/page', data, { + trim: true + }) +} +export function comboDetailPost(id) { + return request.get('/business/discount/' + id, { + trim: true + }) +} +export function comboOrderPost(data) { + return request.post('/business/goodsorder/page', data, { + trim: true + }) +} +// 瀵煎嚭Excel +export function comboOrderEx(data) { + return request.post('/business/goodsorder/exportExcel', data, { + trim: true, + download: true + }) +} + +export function comboReDetailPost(params) { + return request.get('/business/goodsorder/getGoodsorderCanBanlanceDTO', {params}) +} +export function comboOrderRefundPost(data) { + return request.post('/business/goodsorder/backGoodsorder', data, { + trim: true + }) +} +export function comboOrderDetailPost(params) { + return request.get('/business/goodsorder/discountOrderDetail', {params}) +} + +export function comboListOrderEx(data) { + return request.post('/business/goodsorder/discountExportExcel', data, { + trim: true, + download: true + }) +} \ No newline at end of file diff --git a/admin/src/assets/style/style.scss b/admin/src/assets/style/style.scss index 63b0596..8624008 100644 --- a/admin/src/assets/style/style.scss +++ b/admin/src/assets/style/style.scss @@ -60,6 +60,9 @@ .primaryColor{ color: $primary-color; } +.red{ + color: red; +} .pointer{ cursor: pointer; } diff --git a/admin/src/components/common/GlobalWindow.vue b/admin/src/components/common/GlobalWindow.vue index 7967500..8751ebc 100644 --- a/admin/src/components/common/GlobalWindow.vue +++ b/admin/src/components/common/GlobalWindow.vue @@ -62,6 +62,7 @@ }, close () { this.$emit('update:visible', false) + this.$emit('close') } } } diff --git a/admin/src/utils/request.js b/admin/src/utils/request.js index 9821bd0..ce83873 100644 --- a/admin/src/utils/request.js +++ b/admin/src/utils/request.js @@ -41,7 +41,7 @@ // 鏂板缓鍝嶅簲鎷︽埅鍣� axiosInstance.interceptors.response.use((response) => { - + // console.log(response.status) // debugger // 璇锋眰澶辫触 @@ -62,9 +62,15 @@ } // 涓氬姟澶辫触 if (!response.data.success) { - return Promise.reject(response.data) + Message.error(response.data.message) + return null } - return response.data.data + if (response.data.data) { + return response.data.data + } else { + return response.data + } + }, function (error) { if (error.code == null) { return Promise.reject(new Error('鏈嶅姟鍣ㄧ箒蹇欙紝璇风◢鍚庡啀璇�')) @@ -82,7 +88,7 @@ __arguments: args, __result_promise: null, // 寮�鍚紦瀛� - cache () { + cache() { const data = this.__cacheImpl.getJSON(cacheKey) if (data != null) { this.__result_promise = Promise.resolve(data) @@ -92,16 +98,16 @@ } return this }, - then () { + then() { return this.__access('then', arguments) }, - catch () { + catch() { return this.__access('catch', arguments) }, - finally () { + finally() { return this.__access('finally', arguments) }, - __access (methodName, args) { + __access(methodName, args) { if (this.__result_promise != null) { return this.__result_promise } diff --git a/admin/src/views/business/bikeRepair.vue b/admin/src/views/business/bikeRepair.vue index 76be78b..251ce4a 100644 --- a/admin/src/views/business/bikeRepair.vue +++ b/admin/src/views/business/bikeRepair.vue @@ -150,7 +150,7 @@ 'field.id': 'id', 'field.main': 'id' }) - this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' + // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' this.search() }, methods: { diff --git a/admin/src/views/business/bikeRetakeRecord.vue b/admin/src/views/business/bikeRetakeRecord.vue index 5d94999..babeb93 100644 --- a/admin/src/views/business/bikeRetakeRecord.vue +++ b/admin/src/views/business/bikeRetakeRecord.vue @@ -165,8 +165,8 @@ 'field.id': 'id', 'field.main': 'id' }) - this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' - this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59' + // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' + // this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59' this.search() }, methods: { diff --git a/admin/src/views/business/components/Map.vue b/admin/src/views/business/components/Map.vue new file mode 100644 index 0000000..102de26 --- /dev/null +++ b/admin/src/views/business/components/Map.vue @@ -0,0 +1,144 @@ +<template> + <GlobalWindow title="缁樺埗杩愯惀鍖哄煙" :visible.sync="isShowModal" :confirm-working="isWorking" @close="close" + @confirm="confirm" width="1000px"> + <div class="map_title">缁樺埗锛氶紶鏍囧乏閿偣鍑诲強绉诲姩鍗冲彲缁樺埗鍥惧舰锛岀粯鍒惰繃绋嬩腑鎸変笅esc閿彲涓柇璇ヨ繃绋�</div> + <div class="map_title">榧犳爣宸﹂敭鍙屽嚮鍗冲彲缁撴潫褰撳墠澶氳竟褰㈢粯鍒讹紝澶氳竟褰細鑷姩闂悎锛�</div> + <div class="map_wrap"> + <div class="btns"> + <el-button plain type="primary" @click="reset">{{ polygons.length > 0 ? '閲嶆柊缁樺埗' : '寮�濮嬬粯鍒�' }}</el-button> + <!-- <el-button plain type="primary" @click="changeMode">缁撴潫缁樺埗</el-button> --> + <!-- <el-button plain @click="reset">閲嶆柊缁樺埗</el-button> --> + <!-- <el-button plain type="danger" @click="deleteObj">鍒犻櫎</el-button> --> + </div> + <div id="container" style="width: 100%; height: 100%"></div> + </div> + </GlobalWindow> +</template> + +<script> +import GlobalWindow from '@/components/common/GlobalWindow' +import { Message } from 'element-ui' +var map // 鍦板浘 +// var editor // 缂栬緫鍣� +export default { + components: { + GlobalWindow + }, + data() { + return { + isShowModal: false, + isWorking: false, + + map: null, + editor: null, + polygon: null, + polygons: [], // 瀛樺偍鎵�鏈夌粯鍒剁殑澶氳竟褰� + selectedPolygon: null, + } + }, + methods: { + initMap() { + map = new TMap.Map("container", { + zoom: 15, // 璁剧疆鍦板浘缂╂斁绾у埆 + center: new TMap.LatLng(31.722763, 117.385480) // 璁剧疆鍦板浘涓績鐐瑰潗鏍� + }) + var tempList = [] + if (this.polygons.length > 0) { + tempList = [{ paths: this.polygons.map(item => new TMap.LatLng(item.lat, item.lng)) }] + } + this.polygon = new TMap.MultiPolygon({ + map: map, + id: 'polygon', + selectedStyleId: 'highlight', + styles: { + highlight: new TMap.PolygonStyle({ + color: 'rgba(255, 255, 0, 0.6)' + }) + }, + geometries: tempList + }) + this.editor = new TMap.tools.GeometryEditor({ + map, + overlayList: [{ + overlay: this.polygon, + id: 'polygon', + }], + actionMode: tempList.length > 0 ? TMap.tools.constants.EDITOR_ACTION.INTERACT : TMap.tools.constants.EDITOR_ACTION.DRAW, // 缂栬緫鍣ㄧ殑宸ヤ綔妯″紡 + activeOverlayId: 'polygon', // 婵�娲诲浘灞� + snappable: true, // 寮�鍚惛闄� + selectable: true, + }) + + let evtList = ['delete', 'adjust', 'split', 'union'] + evtList.forEach(evtName => { + this.editor.on(evtName + '_complete', evtResult => { + // console.log(evtName, evtResult) + }) + }) + this.editor.on('draw_complete', (geometry) => { + var id = geometry.id + if (this.editor.getActiveOverlay().id === 'polygon') { + var geo = this.polygon.geometries.filter(function (item) { + return item.id === id + }) + this.polygons = geo[0].paths + // console.log('缁樺埗鐨勫杈瑰舰鍧愭爣锛�', geo[0].paths) + } + this.changeMode() + }) + }, + handleAgain() { + this.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW) + }, + reset() { + // this.editor.enable() + this.polygons = [] + this.polygon.setGeometries([]) + this.polygon.remove('polygon') + this.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW) + }, + changeMode() { + this.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT) + }, + deleteObj() { + this.editor.delete() + }, + close() { + this.reset() + map.destroy() + this.isShowModal = false + }, + confirm() { + const list = this.editor.getOverlayList()[0].overlay.geometries + if (list.length == 0) return Message.warning('璇峰厛缁樺埗杩愯惀鍖哄煙') + this.isShowModal = false + this.reset() + this.$emit('change', list[0].paths) + + + } + } +} +</script> + +<style lang="scss" scoped> +.map_title { + font-size: 14px; + font-weight: 500; + margin-bottom: 6px; +} + +.map_wrap { + width: 100%; + height: calc(100% - 60px); + position: relative; + + .btns { + position: absolute; + left: 50%; + top: 10px; + transform: translate(-50%, 0); + z-index: 99999999999; + } +} +</style> \ No newline at end of file diff --git a/admin/src/views/business/goodsorder.vue b/admin/src/views/business/goodsorder.vue index a721331..275e639 100644 --- a/admin/src/views/business/goodsorder.vue +++ b/admin/src/views/business/goodsorder.vue @@ -146,6 +146,7 @@ closeMoney: '', startDate: '', endDate: '', + type: 0 }, value1: [new Date(), new Date()] @@ -158,7 +159,7 @@ 'field.id': 'id', 'field.main': 'id' }) - this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' + // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' this.search() }, methods: { diff --git a/admin/src/views/business/memberRides.vue b/admin/src/views/business/memberRides.vue index b79b5cd..e9d0139 100644 --- a/admin/src/views/business/memberRides.vue +++ b/admin/src/views/business/memberRides.vue @@ -167,8 +167,8 @@ 'field.id': 'id', 'field.main': 'id' }) - this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' - this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59' + // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' + // this.searchForm.endDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 23:59:59' this.search() }, methods: { diff --git a/admin/src/views/business/miniproSetting.vue b/admin/src/views/business/miniproSetting.vue index 18aa191..d234c77 100644 --- a/admin/src/views/business/miniproSetting.vue +++ b/admin/src/views/business/miniproSetting.vue @@ -1,7 +1,7 @@ <template> <TableLayout :permissions="['business:baseparam:query']"> <!-- 鎼滅储琛ㄥ崟 --> - <el-form ref="form" slot="search-form" :model="form" label-width="130px" label-suffix="锛�"> + <el-form ref="form" slot="search-form" :model="form" label-width="160px" label-suffix="锛�"> <el-form-item label="涓婚〉涓婚"> <el-input v-model="form.projectName" placeholder="璇疯緭鍏ヤ富椤典富棰�"></el-input> @@ -10,7 +10,8 @@ <el-input v-model="form.serverPhone" placeholder="璇疯緭鍏ユ湇鍔$數璇�"></el-input> </el-form-item> <el-form-item label="鎶奸噾閲戦"> - <el-input v-model="form.rentDeposit" @change="changeVal(form.rentDeposit,1)" type="number" placeholder="璇疯緭鍏ユ娂閲戦噾棰�"></el-input> + <el-input v-model="form.rentDeposit" @change="changeVal(form.rentDeposit, 1)" type="number" + placeholder="璇疯緭鍏ユ娂閲戦噾棰�"></el-input> <div class="tips">璇疯緭鍏ラ渶瑕佺即绾崇殑鎶奸噾閲戦(鍗曚綅锛氬厓)</div> </el-form-item> <el-form-item label="钀ヤ笟鏃堕棿"> @@ -21,29 +22,55 @@ v-model="form.businessEndtime"></el-time-picker> </el-form-item> <el-form-item label="鍏嶈垂楠戣鏃堕暱"> - <el-input v-model="form.freeRentTime" type="number" @change="changeVal(form.freeRentTime,2)" placeholder="璇疯緭鍏ュ厤璐归獞琛屾椂闀�"></el-input> + <el-input v-model="form.freeRentTime" type="number" @change="changeVal(form.freeRentTime, 2)" + placeholder="璇疯緭鍏ュ厤璐归獞琛屾椂闀�"></el-input> <div class="tips">鍏嶈垂楠戣鏃堕暱锛屽崟浣嶏細鍒嗛挓</div> </el-form-item> <el-form-item label="婊¤浇棰勮(%)" prop="name"> <div style="display: flex;"> - 浣庝簬<el-input style="width: 80px;" v-model="form.warnMin" @change="changeVal(form.warnMin,3)" type="number" placeholder="鏈�灏忓��"></el-input> - 鎴栭珮浜�<el-input style="width: 80px;" v-model="form.warnMax" @change="changeVal(form.warnMax,4)" type="number" placeholder="鏈�澶у��"></el-input> + 浣庝簬<el-input style="width: 80px;" v-model="form.warnMin" @change="changeVal(form.warnMin, 3)" type="number" + placeholder="鏈�灏忓��"></el-input> + 鎴栭珮浜�<el-input style="width: 80px;" v-model="form.warnMax" @change="changeVal(form.warnMax, 4)" type="number" + placeholder="鏈�澶у��"></el-input> 浼氭兂閽夐拤缇ゅ彂閫侀璀� </div> <div class="tips">褰撹溅杈嗘弧杞借秴杩囦互涓婇厤缃椂锛屾彁绀虹鐞嗗憳</div> </el-form-item> -<!-- <el-form-item label="棰勮閽夐拤缇ゅ湴鍧�">--> -<!-- <el-input v-model="form.warnDingdingUrl" placeholder="璇疯緭鍏ラ璀﹂拤閽夌兢鍦板潃"></el-input>--> -<!-- </el-form-item>--> + <el-form-item label="鐢靛姩杞︿复鏃跺仠杞﹂檺鍒�"> + <el-radio v-model="form.pauseBikeType" :label="0">鍋滆溅鐐瑰唴鍋滆溅</el-radio> + <el-radio v-model="form.pauseBikeType" :label="1">杩愯惀鍖哄唴鍋滆溅</el-radio> + </el-form-item> + <el-form-item label="鐢靛姩杞︿复鏃惰嚜鍔ㄥ叧閿�"> + <el-input v-model="form.pauseAutoCloseTime" + oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" + type="number"></el-input> + <div class="placeholder9">涓村仠瓒呰繃閰嶇疆鏃堕暱锛岀郴缁熶細鑷姩鍏抽攣骞惰繘琛岀粨绠楋紝鍗曚綅锛氬垎閽�</div> + </el-form-item> + <el-form-item label="鐢靛姩杞︾數鍘嬭缃�"> + <div style="display: flex;"> + 浣庣數鍘嬮璀﹀��<el-input style="width: 80px;" + oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" + v-model="form.lowBikeVoltage" type="number"></el-input> + 浼忥紝婊$數鐢靛帇 <el-input style="width: 80px;" + oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" + v-model="form.fullBikeVoltage" type="number"></el-input> + </div> + </el-form-item> + <el-form-item label="杩愯惀鍖哄煙璁剧疆"> + <el-button type="primary" @click="handleDraw">鏌ョ湅/缂栬緫</el-button> + <div class="placeholder9">鐐瑰嚮鎸夐挳鍙煡鐪�/缂栬緫杩愯惀鍖哄煙锛岀敤鎴峰彧鑳藉湪杩愯惀鍖哄煙鍐呮壂鐮侀獞琛�</div> + </el-form-item> + <!-- <el-form-item label="棰勮閽夐拤缇ゅ湴鍧�">--> + <!-- <el-input v-model="form.warnDingdingUrl" placeholder="璇疯緭鍏ラ璀﹂拤閽夌兢鍦板潃"></el-input>--> + <!-- </el-form-item>--> <el-form-item label="绉熻祦椤荤煡涓诲浘"> <div style="display: flex;"> - <UploadAvatarImage - :file="{ 'imgurlfull': form.leaseNoticeUrl, 'imgurl': leaseNoticeUrl }" - :uploadData="uploadData" tipsLabel="" @uploadSuccess="uploadOutSuccess" @uploadEnd="isUploading=false" - @uploadBegin="isUploading=true" /> - <div class="tips"> - <el-button type="text" style="color: red;" @click="form.leaseNoticeUrl = ''">鍒犻櫎</el-button> - </div> + <UploadAvatarImage :file="{ 'imgurlfull': form.leaseNoticeUrl, 'imgurl': leaseNoticeUrl }" + :uploadData="uploadData" tipsLabel="" @uploadSuccess="uploadOutSuccess" @uploadEnd="isUploading = false" + @uploadBegin="isUploading = true" /> + <div class="tips"> + <el-button type="text" style="color: red;" @click="form.leaseNoticeUrl = ''">鍒犻櫎</el-button> + </div> </div> </el-form-item> <el-form-item label="绉熻祦娴佺▼瑙嗛" prop="name"> @@ -51,27 +78,21 @@ <div style="width: 250px;height: 180px" v-if="form.rentTipsVideo"> <video controls :src="form.rentTipsVideo" style="width: 100%;height: 100%"></video> </div> -<!-- <el-upload class="avatar-uploader" :action="uploadImgUrl" :show-file-list="false" accept=".mp4"--> -<!-- :data="{ folder: 'bike', }" :on-success="handleAvatarSuccess">--> -<!-- <video v-if="form.rentTipsVideo" :src="form.rentTipsVideo" class="avatar"></video>--> -<!-- <i v-else class="el-icon-plus avatar-uploader-icon"></i>--> -<!-- </el-upload>--> + <!-- <el-upload class="avatar-uploader" :action="uploadImgUrl" :show-file-list="false" accept=".mp4"--> + <!-- :data="{ folder: 'bike', }" :on-success="handleAvatarSuccess">--> + <!-- <video v-if="form.rentTipsVideo" :src="form.rentTipsVideo" class="avatar"></video>--> + <!-- <i v-else class="el-icon-plus avatar-uploader-icon"></i>--> + <!-- </el-upload>--> <div class="tips"> <div> - <el-upload - class="upload-demo" - ref="upload" - :action="uploadImgUrl" - :show-file-list="false" - accept=".mp4" - :data="{ folder: 'bike', }" - :on-success="handleAvatarSuccess"> + <el-upload class="upload-demo" ref="upload" :action="uploadImgUrl" :show-file-list="false" accept=".mp4" + :data="{ folder: 'bike', }" :on-success="handleAvatarSuccess"> <el-button slot="trigger" size="small" type="primary">涓婁紶瑙嗛</el-button> <div slot="tip" class="el-upload__tip">鍙兘涓婁紶mp4鏍煎紡锛屽缓璁笉瓒呰繃50M</div> </el-upload> <el-button type="text" style="color: red;" @click="form.rentTipsVideo = ''">鍒犻櫎</el-button> </div> -<!-- <div>鍙兘涓婁紶mp4鏍煎紡锛屽缓璁笉瓒呰繃50M</div>--> + <!-- <div>鍙兘涓婁紶mp4鏍煎紡锛屽缓璁笉瓒呰繃50M</div>--> </div> </div> @@ -97,16 +118,9 @@ 鑷� <el-time-picker placeholder="缁撴潫鏃堕棿" value-format="yyyy-MM-dd HH:mm:ss" format='HH:mm' v-model="form.stopServeEndtime"></el-time-picker> --> - <el-date-picker - v-model="value1" - type="datetimerange" - @change="selectDate" - range-separator="鑷�" - start-placeholder="寮�濮嬫椂闂�" - end-placeholder="缁撴潫鏃堕棿" - format="yyyy-MM-dd HH:mm:ss" - value-format="yyyy-MM-dd HH:mm:ss" - ></el-date-picker> + <el-date-picker v-model="value1" type="datetimerange" @change="selectDate" range-separator="鑷�" + start-placeholder="寮�濮嬫椂闂�" end-placeholder="缁撴潫鏃堕棿" format="yyyy-MM-dd HH:mm:ss" + value-format="yyyy-MM-dd HH:mm:ss"></el-date-picker> <div class="tips">鍋滄鏈嶅姟寮�濮嬫椂闂磋嚦缁撴潫鏃堕棿</div> </el-form-item> </template> @@ -115,6 +129,7 @@ @click="saveSetting">淇濆瓨閰嶇疆椤�</el-button> </el-form-item> </el-form> + <AMap @change="changeMap" ref="MapRef" /> </TableLayout> </template> @@ -123,10 +138,11 @@ import { getMiniProgrammeDTO, updateById } from '@/api/business/minproSetting' import UploadAvatarImage from '@/components/common/UploadAvatarImage.vue' import RichEditor from '@/components/common/RichEditor.vue' +import AMap from './components/Map.vue' export default { name: 'BaseParam', - components: { TableLayout, UploadAvatarImage, RichEditor }, - data () { + components: { TableLayout, UploadAvatarImage, RichEditor, AMap }, + data() { return { uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal', option: { @@ -158,7 +174,7 @@ } } }, - created () { + created() { getMiniProgrammeDTO() .then(res => { this.form = res @@ -166,7 +182,11 @@ }) }, methods: { - changeVal (val, type) { + changeMap(e) { + console.log('e', e) + this.$set(this.form, 'parkLatLngList', JSON.stringify(e)) + }, + changeVal(val, type) { if (type === 1) { if (this.form.rentDeposit < 0) { this.form.rentDeposit = '' @@ -185,15 +205,24 @@ } } }, - handleAvatarSuccess (res, file) { + handleDraw() { + this.$refs.MapRef.isShowModal = true + this.$nextTick(() => { + if (this.form.parkLatLngList) { + this.$refs.MapRef.polygons = JSON.parse(this.form.parkLatLngList) + } + this.$refs.MapRef.initMap() + }) + }, + handleAvatarSuccess(res, file) { console.log(res.data.url) this.form.rentTipsVideo = res.data.url }, - uploadOutSuccess (file) { + uploadOutSuccess(file) { this.leaseNoticeUrl = file.imgurl this.form.leaseNoticeUrl = file.imgurlfull }, - selectDate (v) { + selectDate(v) { this.form.stopServeStarttime = '' this.form.stopServeEndtime = '' if (v) { @@ -213,7 +242,7 @@ // // } // return isJPG; // }, - saveSetting () { + saveSetting() { const reg = /^[0-9][0-9]*|0\.\d*[0-9]\d*$/ if (!reg.test(this.form.rentDeposit)) { return this.$tip.apiFailed({ message: '鎶奸噾閲戦蹇呴』澶т簬0' }) diff --git a/admin/src/views/business/onlinePayStatistics.vue b/admin/src/views/business/onlinePayStatistics.vue index 37e6178..55f7ca8 100644 --- a/admin/src/views/business/onlinePayStatistics.vue +++ b/admin/src/views/business/onlinePayStatistics.vue @@ -71,7 +71,7 @@ } }, created () { - this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' + // this.searchForm.startDate = formatDateTime(new Date(), 'yyyy-MM-dd') + ' 00:00:00' this.search() }, methods: { diff --git a/admin/src/views/combo/components/ComboDetail.vue b/admin/src/views/combo/components/ComboDetail.vue index 30b5899..6ab44db 100644 --- a/admin/src/views/combo/components/ComboDetail.vue +++ b/admin/src/views/combo/components/ComboDetail.vue @@ -8,31 +8,31 @@ <div class="title_wrap"> <div> <span class="title">{{ detail.name }}</span> - <span class="status">{{ detail.status === '1' ? '宸插惎鐢�' : '绂佺敤' }}</span> + <span class="status">{{ detail.status == '0' ? '宸插惎鐢�' : '绂佺敤' }}</span> </div> - <div class="placeholder9 mt10">姣忔棩閿�鍞檺閲忥細{{ detail.circulationDay }}</div> + <div class="placeholder9 mt10">姣忔棩閿�鍞檺閲忥細{{ detail.saleDayLimit }}</div> </div> </div> <div class="right"> <div class="item"> <div class="key">鎬诲彂鏀炬暟閲�</div> - <div class="value">{{ detail.circulationAll || '-' }}</div> + <div class="value">{{ detail.saleLimit || '涓嶉檺棰�' }}</div> </div> <div class="item"> <div class="key">宸查攢鍞暟閲�</div> - <div class="value">{{ detail.sellNum }}</div> + <div class="value">{{ detail.saleNum }}</div> </div> <div class="item"> <div class="key">鍓╀綑鏁伴噺</div> - <div v-if="detail.circulationAll" class="value">{{ detail.surplusDay }}</div> - <div v-else class="value">{{ detail.surplusDay || '-' }}</div> + <div v-if="detail.saleLimit" class="value">{{ detail.saleLimit - detail.saleNum }}</div> + <div v-else class="value">涓嶉檺棰�</div> </div> </div> </div> <div class="createTime_wrap"> - <span class="item">鍒涘缓鏃堕棿锛歿{ detail.createTime }}</span> + <span class="item">鍒涘缓鏃堕棿锛歿{ detail.createDate }}</span> <span class="item">鍒涘缓浜猴細{{ detail.creator }}</span> - <span class="item">鏈�鍚庢洿鏂版椂闂达細{{ detail.editTime }}</span> + <span class="item">鏈�鍚庢洿鏂版椂闂达細{{ detail.editDate }}</span> <span class="item">鏇存柊浜猴細{{ detail.editor }}</span> </div> </div> @@ -44,52 +44,53 @@ </div> <div class="line"> <div class="key">濂楅绫诲瀷锛�</div> - <div v-if="detail.mealsType == '0'" class="value">鏈熼檺鍗�</div> + <div v-if="detail.type == '0'" class="value">鏈熼檺鍗�</div> </div> <div class="line"> - <div class="key">{{ detail.mealsType == '1' || detail.mealsType == '4' ? '姣忔棩楠戣闄愬埗锛�' : '濂楅娆℃暟锛�' }}</div> - <div v-if="detail.mealsType == '1' || detail.mealsType == '4'" class="value"> - <span>{{ detail.inOutNum || '涓嶉檺鍒�' }}</span> - </div> - <div v-else class="value"><span>{{ detail.nums }}</span></div> - </div> - <div class="line"> - <div class="key">浣跨敤璇存槑锛�</div> + <div class="key">姣忔棩楠戣闄愬埗锛�</div> <div class="value"> - <div>{{ detail.content }}</div> + <span>{{ detail.limitType == 0 ? '涓嶉檺鍒�' : detail.limitTime + '鍒嗛挓' }}</span> + </div> + </div> + <div class="line"> + <div class="key">濂楅绠�浠嬶細</div> + <div class="value"> + <div>{{ detail.desc }}</div> </div> </div> <div class="property-title">閫傜敤瑙勫垯</div> <div class="line"> <div class="key">閿�鍞椂闂存锛�</div> - <div class="value">{{ detail.circulationAll || '涓嶉檺閲�' }}</div> + <div class="value">{{ detail.startDate }} 鑷� {{ detail.endDate }}</div> </div> <div class="line"> <div class="key">浣跨敤鏃堕棿锛�</div> - <div class="value">{{ detail.circulationDay }}</div> + <div class="value" v-if="detail.useType == 0">{{ detail.useStartDate }} 鑷� {{ detail.useEndDate }}</div> + <div class="value" v-if="detail.useType == 1">璐拱鍚巤{ detail.useDays }}澶╁唴鏈夋晥</div> + <div class="value" v-if="detail.useType == 2">鑷獅{ detail.useStartDate }} 鍚� {{ detail.useDays }}澶╁唴鏈夋晥</div> </div> <div class="line"> <div class="key">閫傜敤鑼冨洿锛�</div> - <div class="value">{{ detail.useVenue }}</div> + <div class="value">{{ detail.useWorkday == 1 && '宸ヤ綔鏃�' }} {{ detail.useWorkday && detail.useHoliday && '|' }} {{ detail.useHoliday == 1 && '鑺傚亣鏃�' }}</div> </div> <div class="line"> <div class="key">閫傜敤椤圭洰锛�</div> - <div class="value">{{ detail.useProject }}</div> + <div class="value">{{ detail.isbike == 1 && '鑷杞�' }} {{ detail.isbike && detail.iselecbike && '|' }} {{ detail.iselecbike == 1 && '鐢靛姩杞�' }}</div> + </div> <div class="line"> <div class="key">鎬婚檺棰濓細</div> - <div class="value">{{ detail.useClassInfo || '涓嶉檺鍒�' }}</div> + <div class="value">{{ detail.saleLimit || '涓嶉檺鍒�' }}</div> </div> <div class="line"> <div class="key">姣忔棩闄愰锛�</div> - <div class="value">{{ detail.useTeacherInfo || '涓嶉檺棰�' }}</div> + <div class="value">{{ detail.saleDayLimit || '涓嶉檺棰�' }}</div> </div> </GlobalWindow> </template> <script> -// import { comboDetailPost, mealsCancelUse } from '@/api' -// import dayjs from 'dayjs' +import { comboDetailPost } from '@/api/business/combo.js' import GlobalWindow from '@/components/common/GlobalWindow' export default { name: 'ComboDetail', @@ -136,24 +137,13 @@ } }) }, - getDetail(detail) { - const { activeTab, pagination } = this - const param = { - listType: activeTab, - type: detail.type, - id: detail.id - } - this.tableLoading = true - comboDetailPost({ pagination, param }).then(res => { - this.tableLoading = false - this.dataList = res.record.data || [] - this.totalCount = res.record.count || 0 - this.detail = { ...detail, useProject: res.record.useProject } - this.$nextTick(() => { - this.$refs.tableo.doLayout() - }) + getDetail(id) { + comboDetailPost(id).then(res => { + console.log('res', res) + + this.detail = res }, () => { - this.tableLoading = false + }) }, tabClick(val) { @@ -226,6 +216,7 @@ border: 1px solid $primaryColor; color: $primaryColor; margin-left: 10px; + padding: 0 4px; } } @@ -275,10 +266,12 @@ line-height: 1.5; color: #333; } -.property-title{ + +.property-title { margin-bottom: 16px; color: $primaryColor; } + .device-uploader { width: 80px; height: 80px; diff --git a/admin/src/views/combo/components/Edit.vue b/admin/src/views/combo/components/Edit.vue index 227d177..51b16fd 100644 --- a/admin/src/views/combo/components/Edit.vue +++ b/admin/src/views/combo/components/Edit.vue @@ -1,35 +1,44 @@ <template> <GlobalWindow :title="param.id ? '缂栬緫濂楅' : '鏂板缓濂楅'" :visible.sync="isShowModal" :confirm-working="isLoading" - width="1000px" @close="close" @confirm="confirm"> + width="900px" @close="close" @confirm="confirm"> <el-form :model="param" label-width="100px" ref="form" :rules="rules"> <div class="form_title">鍩烘湰淇℃伅</div> <el-form-item label="濂楅鍚嶇О" prop="name"> <el-input class="w200" v-model="param.name" placeholder="璇疯緭鍏ュ椁愬悕绉�" v-trim /> </el-form-item> - <el-form-item label="绫诲瀷"> - <el-select class="w200" :disabled="true" v-model="param.warehouseId"> + <el-form-item label="绫诲瀷" prop="type"> + <el-select class="w200" :disabled="true" v-model="param.type"> <el-option label="鏈熼檺鍗�" :value="0"></el-option> + <el-option label="娆″崱" :value="1"></el-option> </el-select> </el-form-item> <el-form-item label="姣忔棩楠戣闄愬埗"> - <div> - <el-radio v-model="param.aa" label="1">涓嶉檺鍒�</el-radio> - <el-radio v-model="param.aa" label="2">闄愬埗鏃堕暱</el-radio> + <div class="df_ac"> + <div class="mr10"> + <el-radio @change="changeType" v-model="param.limitType" :label="0">涓嶉檺鍒�</el-radio> + <el-radio @change="changeType" v-model="param.limitType" :label="1">闄愬埗鏃堕暱</el-radio> + </div> + <el-input v-if="param.limitType == 1" class="w200" v-model="param.limitTime" v-trim /> + <span v-if="param.limitType == 1" class="ml10">鍒嗛挓</span> </div> </el-form-item> - <el-form-item label="閿�鍞环"> - <el-input class="w200" v-model="param.name" placeholder="璇疯緭鍏ヤ环鏍�" v-trim /> + <el-form-item label="閿�鍞环" prop="price"> + <el-input class="w200" + oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" + v-model="param.price" placeholder="璇疯緭鍏ヤ环鏍�" v-trim /> </el-form-item> <el-form-item label="鍒掔嚎浠�"> - <el-input class="w200" v-model="param.name" placeholder="璇疯緭鍏ュ睍绀虹殑鍒掔嚎浠�" v-trim /> + <el-input class="w200" v-model="param.linePrice" + oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" + placeholder="璇疯緭鍏ュ睍绀虹殑鍒掔嚎浠�" v-trim /> </el-form-item> - <el-form-item label="閿�鍞笭閬�"> - <el-checkbox v-model="param.ada">灏忕▼搴忕</el-checkbox> + <el-form-item label="閿�鍞笭閬�" prop="channel"> + <el-checkbox v-model="param.channel" disabled :true-label="0" :false-label="1">灏忕▼搴忕</el-checkbox> </el-form-item> <el-form-item label="濂楅鍥剧墖"> <div class="df_ac"> <UploadAvatarImage :file="{ 'imgurlfull': param.fileFullUrl, 'imgurl': param.fileUrl }" - :uploadData="{ folder: 'ywPatrol/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false" + :uploadData="{ folder: 'DISCOUNT/' }" @uploadSuccess="uploadAvatarSuccess" @uploadEnd="isUploading = false" @uploadBegin="isUploading = true" /> <div class="img_place"> <div>涓婁紶鍥剧墖涓嶅厑璁告秹鍙婃斂娌绘晱鎰熶笌鑹叉儏;</div> @@ -39,7 +48,7 @@ </div> </el-form-item> <el-form-item label="濂楅绠�浠�"> - <el-input class="w400" v-model="param.name" placeholder="璇疯緭鍏ュ椁愮畝浠�" v-trim /> + <el-input class="w400" v-model="param.descs" placeholder="璇疯緭鍏ュ椁愮畝浠�" v-trim /> </el-form-item> <el-form-item label="濂楅鎻忚堪"> <RichEditor :content="{ content: param.content }" @edit="param.content = $event"></RichEditor> @@ -48,50 +57,56 @@ <div>閫傜敤瑙勫垯</div> <div class="placeholder9">閿�鍞椂闂淬�佷娇鐢ㄦ椂闂寸瓑璁剧疆</div> </div> - <el-form-item label="閿�鍞椂娈�"> - <el-date-picker class="w400" v-model="param.value1" value-format="yyyy-MM-dd" type="daterange" range-separator=" ~ " /> + <el-form-item label="閿�鍞椂娈�" prop="saleDate"> + <el-date-picker class="w400" v-model="param.saleDate" value-format="yyyy-MM-dd" type="daterange" + range-separator=" ~ " /> </el-form-item> <div class="df_ac"> - <el-form-item label="浣跨敤鏃堕棿" class="mr16"> - <el-select v-model="param.aaadd" style="width: 140px;"> + <el-form-item prop="useType" label="浣跨敤鏃堕棿" class="mr16"> + <el-select @change="changeUseDate" v-model="param.useType" style="width: 140px;"> <el-option label="鍥哄畾鏃ユ湡" :value="0"></el-option> <el-option label="璐拱鍚庣敓鏁�" :value="1"></el-option> - <el-option label="鎸囧畾鏃ユ湡鐢熸晥" :value="1"></el-option> + <el-option label="鎸囧畾鏃ユ湡鐢熸晥" :value="2"></el-option> </el-select> </el-form-item> - <!-- <el-form-item label-width="80px" label="鍥哄畾鏃ユ湡"> - <el-date-picker v-model="param.value1" value-format="yyyy-MM-dd" type="daterange" range-separator=" ~ " /> - </el-form-item> --> - <!-- <el-form-item label-width="60px" label="鏈夋晥鏈�"> - <el-input style="width: 130px;" v-model="param.name" placeholder="璇疯緭鍏ユ湁鏁堝ぉ鏁�" v-trim /> - </el-form-item> --> - <el-form-item label-width="0px"> + <el-form-item v-if="param.useType == 0" label-width="80px" label="鍥哄畾鏃ユ湡"> + <el-date-picker v-model="param.useDate" value-format="yyyy-MM-dd" type="daterange" range-separator=" ~ " /> + </el-form-item> + <el-form-item v-if="param.useType == 1" label-width="60px" label="鏈夋晥鏈�"> + <el-input style="width: 130px;" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 8)" + v-model="param.useDays" placeholder="璇疯緭鍏ユ湁鏁堝ぉ鏁�" v-trim /> + <span class="ml10">澶�</span> + </el-form-item> + <el-form-item v-if="param.useType == 2" label-width="0px"> <div class="df_ac"> - <el-date-picker class="w200" v-model="param.dasdas" value-format="yyyy-MM-dd" type="date" /> + <el-date-picker class="w200" v-model="param.useStartDate" value-format="yyyy-MM-dd" type="date" /> <span class="ml10 mr10">寮�濮嬬敓鏁堬紝鏈夋晥鏈�</span> - <el-input style="width: 130px;" v-model="param.name" placeholder="璇疯緭鍏ユ湁鏁堝ぉ鏁�" v-trim /> + <el-input style="width: 130px;" v-model="param.useDays" + oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 8)" placeholder="璇疯緭鍏ユ湁鏁堝ぉ鏁�" v-trim /> <span class="ml10">澶�</span> </div> </el-form-item> </div> - <el-form-item label="閫傜敤鑼冨洿"> - <el-checkbox-group v-model="param.checkList"> - <el-checkbox label="宸ヤ綔鏃�"></el-checkbox> - <el-checkbox label="鑺傚亣鏃�"></el-checkbox> - </el-checkbox-group> + <el-form-item :prop="param.useWorkday == 1 ? 'useWorkday' : 'useHoliday'" label="閫傜敤鑼冨洿"> + <div class="df_ac"> + <el-checkbox v-model="param.useWorkday" :true-label="1" :false-label="0" label="宸ヤ綔鏃�"></el-checkbox> + <el-checkbox v-model="param.useHoliday" :true-label="1" :false-label="0" label="鑺傚亣鏃�"></el-checkbox> + </div> </el-form-item> - <el-form-item label="閫傜敤椤圭洰"> - <el-checkbox-group v-model="param.checkList"> - <el-checkbox label="鑷杞�"></el-checkbox> - <el-checkbox label="鐢靛姩杞�"></el-checkbox> - </el-checkbox-group> + <el-form-item :prop="param.isbike == 1 ? 'isbike' : 'iselecbike'" label="閫傜敤椤圭洰"> + <div class="df_ac"> + <el-checkbox v-model="param.isbike" :true-label="1" :false-label="0" label="鑷杞�"></el-checkbox> + <el-checkbox v-model="param.iselecbike" :true-label="1" :false-label="0" label="鐢靛姩杞�"></el-checkbox> + </div> </el-form-item> <el-form-item label="鎬婚檺棰�"> - <el-input class="w400" v-model="param.name" placeholder="璇疯緭鍏ユ�诲彂鍞暟閲�" v-trim /> + <el-input class="w400" v-model="param.saleLimit" oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 12)" + placeholder="璇疯緭鍏ユ�诲彂鍞暟閲�" v-trim /> <div class="placeholder9">璇疯緭鍏ユ�诲彂鍞暟閲忥紝閿�閲忓ぇ浜庤鏁伴噺鍚庯紝涓嶅啀鏀寔閿�鍞紱涓虹┖琛ㄧず涓嶉檺鍒�</div> </el-form-item> <el-form-item label="鏃ラ檺棰�"> - <el-input class="w400" v-model="param.name" placeholder="璇疯緭鍏ュ崟鏃ュ彂鍞暟閲�" v-trim /> + <el-input class="w400" v-model="param.saleDayLimit" + oninput="value=value.replace(/^(0+)|[^\d]+/g, '').slice(0, 12)" placeholder="璇疯緭鍏ュ崟鏃ュ彂鍞暟閲�" v-trim /> <div class="placeholder9">璇疯緭鍏ユ棩鍙戝敭鏁伴噺锛屽綋鏃ラ攢閲忓ぇ浜庤鏁伴噺鍚庯紝涓嶅啀鏀寔閿�鍞紱涓虹┖琛ㄧず涓嶉檺鍒�</div> </el-form-item> @@ -104,10 +119,9 @@ <script> import GlobalWindow from '@/components/common/GlobalWindow' -// import { fetchList as getStoreList } from '@/api/ywWarehouse' -// import { ywOutinboundCreate } from '@/api/store/index' +import { comboAddPost, comboEditPost, comboDetailPost } from '@/api/business/combo.js' import UploadAvatarImage from '@/components/common/UploadAvatarImage' -import { StoreTypeOps, rules } from './config' +import { rulesCombo } from './config' import { Message } from 'element-ui' import RichEditor from '@/components/common/RichEditor' // import dayjs from 'dayjs' @@ -117,13 +131,25 @@ data() { return { // 琛ㄥ崟鏁版嵁 - param: { checkList: [], content: '' }, + param: { + type: 0, + limitType: 0, + channel: 0, + useType: 0, + useWorkday: 1, + useHoliday: 0, + iselecbike: 0, + isbike: 1, + + checkList: [], + content: '' + }, isShowModal: false, isShowSel: false, isLoading: false, isUploading: false, // 楠岃瘉瑙勫垯 - rules, + rules: rulesCombo, storeList: [], list: [], StoreTypeOps: [], @@ -137,47 +163,48 @@ }, methods: { confirm() { + const { param } = this this.$refs['form'].validate((valid) => { if (valid) { - const { param, list } = this - if (list.length == 0) return Message.warning('璇峰厛閫夋嫨鐗╂枡淇℃伅') - let count = 0 // 鍏ュ簱鏁伴噺蹇呭~ - list.forEach(item => { - if (!item.stock) count++ - }) - if (count > 0) return Message.warning('璇疯緭鍏ユ纭殑鍏ュ簱鏁伴噺') + if (param.useDate && param.useDate.length > 0) { + param.useStartDate = param.useDate[0] + param.useEndDate = param.useDate[1] + } else { + param.useStartDate = param.useType == 2 ? param.useStartDate : null + param.useEndDate = null + } + if (param.saleDate && param.saleDate.length > 0) { + param.startDate = param.saleDate[0] + param.endDate = param.saleDate[1] + } else { + param.startDate = null + param.endDate = null + } this.isLoading = true - ywOutinboundCreate({ - ...param, - recordList: list + let fn = param.id ? comboEditPost : comboAddPost + fn({ + ...param }).then(res => { this.isLoading = false - Message.success('鎻愪氦鎴愬姛') - this.$emit('success') - this.close() + if (res) { + Message.success('鎻愪氦鎴愬姛') + this.$emit('success') + this.close() + } }, () => { this.isLoading = false }) } }) }, - initData() { - this.$set(this.param, 'doneDate', dayjs().format('YYYY-MM-DD')) - getStoreList({ capacity: 9999, page: 1, model: { status: 0 } }).then(res => { - this.storeList = res.records || [] - }) + changeType() { + this.$set(this.param, 'limitTime', null) }, - changeSel(val) { - const list = val - list.forEach(item => { - const index = this.list.findIndex(i => i.id == item.id) - if (index == -1) { - item.materialId = item.id - item.multifile = null - item.createDate = null - this.list.push(item) - } - }) + changeUseDate() { + this.$set(this.param, 'useDate', null) + this.$set(this.param, 'useDays', null) + this.$set(this.param, 'useStartDate', null) + this.$set(this.param, 'useEndDate', null) }, uploadAvatarSuccess(file) { this.$set(this.param, 'fileUrl', file.imgurl) @@ -191,12 +218,19 @@ }) }, close() { + console.log('------'); + this.isShowModal = false this.$emit('close') }, - getDetail(id) { - getInfoById(id).then(res => { + getDetail(id, type) { + comboDetailPost(id).then(res => { this.param = res + this.$set(this.param, 'saleDate', [res.startDate, res.endDate]) + if (res.useStartDate && res.useEndDate) { + this.$set(this.param, 'useDate', [res.useStartDate, res.useEndDate]) + } + this.$set(this.param, id, type == 'copy' ? null : this.param.id) }) }, } @@ -217,7 +251,8 @@ margin-left: 12px; } } -.img_place{ + +.img_place { display: flex; flex-direction: column; justify-content: space-between; diff --git a/admin/src/views/combo/components/Refund.vue b/admin/src/views/combo/components/Refund.vue new file mode 100644 index 0000000..776030f --- /dev/null +++ b/admin/src/views/combo/components/Refund.vue @@ -0,0 +1,153 @@ +<template> + <GlobalAlertWindow title="濂楅鍗¢��娆�" :visible.sync="visible" :confirm-working="isWorking" width="600px" + @confirm="confirm"> + <el-descriptions title="" :column="2"> + <el-descriptions-item label="瀹炰粯閲戦">{{ form.goodsorderMoney }}鍏�</el-descriptions-item> + <!-- <el-descriptions-item label="缁撶畻閲戦">{{ form.closeMoney }}鍏�</el-descriptions-item> --> + <el-descriptions-item label="宸查��閲戦">{{ form.hasRefundMoney }}鍏�</el-descriptions-item> + <el-descriptions-item label="鍙��閲戦">{{ form.canBanlanceMoney }}鍏�</el-descriptions-item> + </el-descriptions> + <el-form :model="form" ref="form" :rules="rules" label-width="100px" label-suffix="锛�"> + <el-form-item label="閫�娆剧被鍨�" prop="backType"> + <el-radio v-model="form.backType" :label="0">閫�璐ч��娆�</el-radio> + <el-radio v-model="form.backType" :label="1">浠呴��娆�</el-radio> + <div class="placeholder9">閫�娆鹃��璐т細浣滃簾璁㈠崟瀵瑰簲鐨勫椁愬崱</div> + </el-form-item> + <el-form-item label="閫�娆鹃噾棰�" prop="money"> + <div style="display: flex;"> + <el-input style="flex: 1;" oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')" v-model="form.money" placeholder="璇疯緭鍏ラ��娆鹃噾棰�" v-trim /> + </div> + </el-form-item> + <el-form-item label="閫�娆惧師鍥�" prop="reason"> + <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" v-model="form.reason" placeholder="璇疯緭鍏ラ��娆惧師鍥�" + v-trim /> + </el-form-item> + </el-form> + </GlobalAlertWindow> +</template> + +<script> +import BaseOpera from '@/components/base/BaseOpera' +import GlobalAlertWindow from '@/components/common/GlobalAlertWindow' +import { comboReDetailPost, comboOrderRefundPost } from '@/api/business/combo.js' +export default { + name: 'OperaSuggestWindow', + extends: BaseOpera, + components: { GlobalAlertWindow }, + data() { + return { + // 琛ㄥ崟鏁版嵁 + form: { + orderId: null, + canBanlanceMoney: '', + closeMoney: '', + goodsorderMoney: '', + hasRefundMoney: '', + + backType: 0, + money: '', + reason: '', + }, + // 楠岃瘉瑙勫垯 + rules: { + money: [{ required: true, message: '璇疯緭鍏�' }], + reason: [{ required: true, message: '璇疯緭鍏�' }], + backType: [{ required: true, message: '璇疯緭鍏�' }] + }, + + } + }, + created() { + + }, + methods: { + /** + * 鎵撳紑绐楀彛 + * @title 绐楀彛鏍囬 + * @target 缂栬緫鐨勫璞� + */ + open(id) { + this.visible = true + this.$nextTick(() => { + comboReDetailPost({ orderId: id }).then(res => { + if (res) { + this.form = res + this.form.backType = 0 + this.form.orderId = id + } + }) + this.form.money = null + this.form.reason = '' + this.$refs.form.clearValidate() + }) + + }, + selectReason(v) { + // console.log(item); + let item = this.reason.find(item => item.name == v) + this.backInfoRequired = item.required == 1 + }, + confirm() { + this.$refs.form.validate((valid) => { + if (!valid) { + return + } + this.isWorking = true + comboOrderRefundPost(this.form) + .then((res) => { + if (res) { + this.visible = false + this.$tip.apiSuccess('閫�娆炬垚鍔�') + this.$emit('success') + } + }) + .catch(err => { + this.$tip.apiFailed(err) + }) + .finally(() => { + this.isWorking = false + }) + }) + } + }, +} +</script> + +<style lang="scss" scoped> +@import "@/assets/style/alertstyle.scss"; +@import "@/assets/style/variables.scss"; + +::v-deep .el-input.is-disabled .el-input__inner { + background-color: #fff !important; + cursor: pointer; +} + +.time-style { + display: flex; + flex-wrap: wrap; + cursor: pointer; + + .time-item { + margin-right: 8px; + /* margin-bottom: 8px; */ + border: #111 solid 1px; + font-size: 14px; + line-height: 14px; + padding: 5px; + border-radius: 5px; + color: #111; + } + + .time-item-sel { + border-color: $primary-color; + background-color: $primary-color; + color: #fff; + } + + .time-item-disable { + border-color: #999; + background-color: #999; + color: #111; + } +} +</style> diff --git a/admin/src/views/combo/components/config.js b/admin/src/views/combo/components/config.js index a2c2977..0ee8681 100644 --- a/admin/src/views/combo/components/config.js +++ b/admin/src/views/combo/components/config.js @@ -1,3 +1,17 @@ +export const rulesCombo = { + name: [{ required: true, message: '璇疯緭鍏�' }], + type: [{ required: true, message: '璇疯緭鍏�' }], + price: [{ required: true, message: '璇疯緭鍏�' }], + channel: [{ required: true, message: '璇疯緭鍏�' }], + saleDate: [{ required: true, message: '璇烽�夋嫨' }], + useType: [{ required: true, message: '璇烽�夋嫨' }], + useWorkday: [{ required: true, message: '璇烽�夋嫨' }], + useHoliday: [{ required: true, message: '璇烽�夋嫨' }], + isbike: [{ required: true, message: '璇烽�夋嫨' }], + iselecbike: [{ required: true, message: '璇烽�夋嫨' }], + +} + export const pickerOptions = { // 绮剧‘鍒扮 disabledDate(time) { return time.getTime() < new Date(new Date().toLocaleDateString()).getTime() diff --git a/admin/src/views/combo/index.vue b/admin/src/views/combo/index.vue index 355231c..d32263e 100644 --- a/admin/src/views/combo/index.vue +++ b/admin/src/views/combo/index.vue @@ -5,19 +5,52 @@ <el-button type="primary" @click="handleEdit()">鏂板</el-button> </div> <el-table v-loading="loading" :data="list" stripe border> - <el-table-column prop="code" label="濂楅鍚嶇О" align="center" min-width="120" show-overflow-tooltip /> - <el-table-column prop="" label="濂楅绫诲瀷" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="娆℃暟" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="鏈夋晥鏈�" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="浠锋牸" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="鎬诲彂琛屾暟閲�" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="宸插敭鍞噺" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="閿�鍞笭閬�" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="閿�鍞椂娈�" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" label="鐘舵��" align="center" min-width="100" show-overflow-tooltip /> - <el-table-column label="鎿嶄綔" fixed="right" align="center" min-width="80" show-overflow-tooltip> + <el-table-column prop="name" label="濂楅鍚嶇О" align="center" min-width="120" show-overflow-tooltip> <template v-slot="{ row }"> - <span @click="handleDetail(row)" class="primaryColor pointer">鏌ョ湅璇︽儏</span> + <span @click="handleDetail(row)" class="primaryColor pointer">{{ row.name }}</span> + </template> + </el-table-column> + <el-table-column prop="" label="濂楅绫诲瀷" align="center" min-width="100" show-overflow-tooltip> + <template v-slot="{ row }"> + <span v-if="row.type == 0">鏈熼檺鍗�</span> + </template> + </el-table-column> + <!-- <el-table-column prop="" label="娆℃暟" align="center" min-width="100" show-overflow-tooltip /> --> + <el-table-column prop="useDays" label="鏈夋晥鏈�" align="center" min-width="90" show-overflow-tooltip> + <template v-slot="{ row }"> + <span>{{ row.useDays }}澶�</span> + </template> + </el-table-column> + <el-table-column prop="price" label="浠锋牸" align="center" min-width="80" show-overflow-tooltip /> + <el-table-column prop="saleLimit" label="鎬诲彂琛屾暟閲�" align="center" min-width="100" show-overflow-tooltip> + <template v-slot="{ row }"> + <span>{{ row.saleLimit ? row.saleLimit : '涓嶉檺棰�' }}</span> + </template> + </el-table-column> + <el-table-column prop="saleNum" label="宸插敭鍞噺" align="center" min-width="100" show-overflow-tooltip /> + <el-table-column prop="" label="閿�鍞笭閬�" align="center" min-width="100" show-overflow-tooltip> + <template v-slot="{ row }"> + <span v-if="row.channel == 0">灏忕▼搴�</span> + </template> + </el-table-column> + <el-table-column prop="" label="閿�鍞椂娈�" align="center" min-width="120" show-overflow-tooltip> + <template v-slot="{ row }"> + <div>璧凤細{{ row.startDate }}</div> + <div>姝細{{ row.endDate }}</div> + </template> + </el-table-column> + <el-table-column prop="" fixed="right" label="鐘舵��" align="center" min-width="80" show-overflow-tooltip> + <template v-slot="{ row }"> + <el-switch @change="changeStatus(row)" v-model="row.status" :active-value="0" :inactive-value="1" /> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" fixed="right" align="center" min-width="120" show-overflow-tooltip> + <template v-slot="{ row }"> + <div> + <span v-if="row.status == 0" @click="handleEdit(row, 'copy')" class="primaryColor pointer">澶嶅埗</span> + <span v-if="row.status == 1" @click="handleEdit(row)" class="primaryColor pointer mr10">缂栬緫</span> + <span v-if="row.status == 1" @click="handleDetail(row)" class="red pointer">鍒犻櫎</span> + </div> </template> </el-table-column> </el-table> @@ -35,6 +68,8 @@ import TableLayout from '@/layouts/TableLayout' import Edit from './components/Edit' import ComboDetail from './components/ComboDetail.vue' +import { comboListPost, comboEditPost } from '@/api/business/combo.js' +import { Message } from 'element-ui' export default { extends: BasePageTemp, components: { @@ -55,27 +90,35 @@ label: '濂楅鍚嶇О', }, { - filed: 'type', + filed: 'bikeOrElec', type: 'select', label: '閫傜敤椤圭洰', labelCode: 'name', valueCode: 'id', - options: [] + options: [ + { name: '鑷杞�', id: 1 }, + { name: '鐢靛姩杞�', id: 2 }, + ] }, { filed: 'status', type: 'select', label: '鐘舵��', - options: [] + labelCode: 'name', + valueCode: 'id', + options: [ + { name: '姝e父', id: 0 }, + { name: '鍋滅敤', id: 1 }, + ] }, ], online: true }, - list: [{}] + list: [] } }, created() { - // this.getList() + this.getList() // this.initData() }, methods: { @@ -86,17 +129,27 @@ } }) }, - handleEdit() { + changeStatus(row) { + comboEditPost({ ...row }).then(res => { + if (res.code == 200) { + return Message.success('鏇存柊鎴愬姛') + } + }) + }, + handleEdit(row, type = 'edit') { this.isShowEdit = true this.$nextTick(() => { this.$refs.EditRef.isShowModal = true + if (row && row.id) { + this.$refs.EditRef.getDetail(row.id, type) + } }) }, handleDetail(row) { this.isShowDetail = true this.$nextTick(() => { this.$refs.DetailRef.isShowModal = true - // this.$refs.DetailRef.getDetail(row.id) + this.$refs.DetailRef.getDetail(row.id) }) }, handleEx() { @@ -129,20 +182,15 @@ const { pagination, filters } = this this.loading = true if (page) { pagination.page = page } - ywOutinboundPage({ + comboListPost({ model: { - ...filters, - inOut: 0 + ...filters }, - // sorts: [{ direction: 'DESC', property: 'param1' }], capacity: pagination.pageSize, page: page, }).then(res => { this.loading = false this.list = res.records || [] - this.list.forEach(item => { - item.typeName = this.StoreTypeOps[item.type].name - }) this.pagination.total = res.total || 0 }, () => { this.loading = false diff --git a/admin/src/views/combo/order.vue b/admin/src/views/combo/order.vue index c944ff7..949d402 100644 --- a/admin/src/views/combo/order.vue +++ b/admin/src/views/combo/order.vue @@ -6,21 +6,33 @@ <el-button type="primary" @click="handleEx()">瀵煎嚭</el-button> </div> <el-table v-loading="loading" :data="list" stripe border> - <el-table-column prop="code" align="center" label="璁㈠崟缂栧彿" min-width="140" show-overflow-tooltip> + <el-table-column prop="code" align="center" label="璁㈠崟缂栧彿" min-width="180" show-overflow-tooltip> <template scope="{row}"> - <span class="primaryColor pointer">{{ row.orderId }}</span> + <span @click="handleDetail(row.id)" class="primaryColor pointer">{{ row.code }}</span> </template> </el-table-column> - <el-table-column prop="" align="center" label="濂楅鍗�" min-width="120" show-overflow-tooltip /> - <el-table-column prop="" align="center" label="鍚堣(鍏�)" min-width="80" show-overflow-tooltip /> - <el-table-column prop="" align="center" label="瀹炰粯(鍏�)" min-width="80" show-overflow-tooltip /> - <el-table-column prop="" align="center" label="宸查��閲戦(鍏�)" min-width="100" show-overflow-tooltip /> - <el-table-column prop="" align="center" label="鐢ㄦ埛淇℃伅" min-width="120" show-overflow-tooltip /> - <el-table-column prop="" align="center" label="璁㈠崟鐘舵��" min-width="110" show-overflow-tooltip /> + <el-table-column prop="discountName" align="center" label="濂楅鍗�" min-width="120" show-overflow-tooltip /> + <el-table-column prop="money" align="center" label="鍚堣(鍏�)" min-width="80" show-overflow-tooltip /> + <el-table-column prop="money" align="center" label="瀹炰粯(鍏�)" min-width="80" show-overflow-tooltip /> + <el-table-column prop="refundMoney" align="center" label="宸查��閲戦(鍏�)" min-width="100" show-overflow-tooltip /> + <el-table-column prop="memberId" align="center" label="鐢ㄦ埛淇℃伅" min-width="140" show-overflow-tooltip /> + <el-table-column prop="payWay" align="center" label="鏀粯鏂瑰紡" min-width="80" show-overflow-tooltip> + <template v-slot="{ row }"> + <span v-if="row.payWay == 0">寰俊鏀粯</span> + <span v-if="row.payWay == 1">鏀粯瀹�</span> + </template> + </el-table-column> + <el-table-column prop="payWay" align="center" label="璁㈠崟鏉ユ簮" min-width="80" show-overflow-tooltip> + <template v-slot="{ row }"> + <span>灏忕▼搴忕</span> + </template> + </el-table-column> + <el-table-column prop="refundUserName" align="center" label="鎿嶄綔浜�" min-width="80" show-overflow-tooltip /> + <el-table-column prop="createDate" align="center" label="鍒涘缓鏃堕棿" min-width="140" show-overflow-tooltip /> <el-table-column label="鎿嶄綔" fixed="right" align="center" min-width="80" show-overflow-tooltip> <template v-slot="{ row }"> - <span @click="handleDetail(row.id)" v-permissions="['business:ywoutinboundrecord:query']" - class="primaryColor pointer">鏌ョ湅璇︽儏</span> + <span @click="handleDetail(row.id)" class="primaryColor pointer">鏌ョ湅璇︽儏</span> + <span v-if="row.status == 1 && (row.refundMoney < row.money)" @click="handRefund(row.id)" class="primaryColor pointer ml10">閫�娆�</span> </template> </el-table-column> </el-table> @@ -28,7 +40,8 @@ <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" /> </div> <!-- --> - <OrderDetail v-if="isShowDetail" ref="OrderDetailRef" /> + <OrderDetail ref="OrderDetailRef" /> + <Refund ref="RefundRef" @success="getList" /> </div> </template> @@ -36,20 +49,26 @@ import BasePageTemp from '@/components/base/BasePageTemp' import Breadcrumb from '@/layouts/Breadcrumb' import OrderDetail from './components/OrderDetail.vue' +import Refund from './components/Refund' +import { + comboOrderPost, + comboListOrderEx, + comboOrderDetailPost +} from '@/api/business/combo.js' export default { extends: BasePageTemp, components: { Breadcrumb, - OrderDetail + OrderDetail, + Refund }, data() { return { loading: false, - isShowDetail: false, queryFormConfig: { formItems: [ { - filed: 'orderId', + filed: 'id', type: 'input', label: '璁㈠崟缂栧彿', }, @@ -69,7 +88,10 @@ filed: 'status', type: 'select', label: '璁㈠崟鐘舵��', - options: [] + options: [ + { label: '鏈敮浠�', value: 0 }, + { label: '宸叉敮浠�', value: 1 }, + ] }, { filed: 'time', @@ -87,12 +109,15 @@ } }, created() { - // this.getList() + this.getList() // this.initData() }, methods: { + handRefund(id) { + this.$refs.RefundRef.open(id) + }, handleDetail(id) { - getDetail(id) + comboOrderDetailPost({id}) .then(res => { this.$refs.OrderDetailRef.open('璁㈠崟璇︽儏', res) }) @@ -104,8 +129,8 @@ this.$dialog.exportConfirm('纭瀵煎嚭鍚楋紵') .then(() => { this.loading = true - ywOutinboundEx({ - page: this.pagination.page, + comboListOrderEx({ + page: 1, capacity: 1000000, model: this.filters }) @@ -130,20 +155,16 @@ const { pagination, filters } = this this.loading = true if (page) { pagination.page = page } - ywOutinboundPage({ + comboOrderPost({ model: { ...filters, - inOut: 0 + type: 1 }, - // sorts: [{ direction: 'DESC', property: 'param1' }], capacity: pagination.pageSize, - page: page, + page: pagination.page, }).then(res => { this.loading = false this.list = res.records || [] - this.list.forEach(item => { - item.typeName = this.StoreTypeOps[item.type].name - }) this.pagination.total = res.total || 0 }, () => { this.loading = false diff --git a/admin/src/views/operation/components/AMap.vue b/admin/src/views/operation/components/AMap.vue new file mode 100644 index 0000000..9b6a4c1 --- /dev/null +++ b/admin/src/views/operation/components/AMap.vue @@ -0,0 +1,144 @@ +<template> + <GlobalWindow title="缁樺埗杩愯惀鍖哄煙" :visible.sync="isShowModal" :confirm-working="isWorking" @close="close" + @confirm="confirm" width="1000px"> + <div class="map_title">缁樺埗锛氶紶鏍囧乏閿偣鍑诲強绉诲姩鍗冲彲缁樺埗鍥惧舰锛岀粯鍒惰繃绋嬩腑鎸変笅esc閿彲涓柇璇ヨ繃绋�</div> + <div class="map_title">榧犳爣宸﹂敭鍙屽嚮鍗冲彲缁撴潫褰撳墠澶氳竟褰㈢粯鍒讹紝澶氳竟褰細鑷姩闂悎锛�</div> + <div class="map_wrap"> + <div class="btns"> + <el-button plain type="primary" @click="reset">{{ polygons.length > 0 ? '閲嶆柊缁樺埗' : '寮�濮嬬粯鍒�' }}</el-button> + <!-- <el-button plain type="primary" @click="changeMode">缁撴潫缁樺埗</el-button> --> + <!-- <el-button plain @click="reset">閲嶆柊缁樺埗</el-button> --> + <!-- <el-button plain type="danger" @click="deleteObj">鍒犻櫎</el-button> --> + </div> + <div id="container" style="width: 100%; height: 100%"></div> + </div> + </GlobalWindow> +</template> + +<script> +import GlobalWindow from '@/components/common/GlobalWindow' +import { Message } from 'element-ui' +var map // 鍦板浘 +// var editor // 缂栬緫鍣� +export default { + components: { + GlobalWindow + }, + data() { + return { + isShowModal: false, + isWorking: false, + row: {}, + map: null, + editor: null, + polygon: null, + polygons: [], // 瀛樺偍鎵�鏈夌粯鍒剁殑澶氳竟褰� + selectedPolygon: null, + } + }, + methods: { + initMap() { + map = new TMap.Map("container", { + zoom: 15, // 璁剧疆鍦板浘缂╂斁绾у埆 + center: new TMap.LatLng(31.722763, 117.385480) // 璁剧疆鍦板浘涓績鐐瑰潗鏍� + }) + var tempList = [] + if (this.polygons.length > 0) { + tempList = [{ paths: this.polygons.map(item => new TMap.LatLng(item.lat, item.lng)) }] + } + this.polygon = new TMap.MultiPolygon({ + map: map, + id: 'polygon', + selectedStyleId: 'highlight', + styles: { + highlight: new TMap.PolygonStyle({ + color: 'rgba(255, 255, 0, 0.6)' + }) + }, + geometries: tempList + }) + this.editor = new TMap.tools.GeometryEditor({ + map, + overlayList: [{ + overlay: this.polygon, + id: 'polygon', + }], + actionMode: tempList.length > 0 ? TMap.tools.constants.EDITOR_ACTION.INTERACT : TMap.tools.constants.EDITOR_ACTION.DRAW, // 缂栬緫鍣ㄧ殑宸ヤ綔妯″紡 + activeOverlayId: 'polygon', // 婵�娲诲浘灞� + snappable: true, // 寮�鍚惛闄� + selectable: true, + }) + + let evtList = ['delete', 'adjust', 'split', 'union'] + evtList.forEach(evtName => { + this.editor.on(evtName + '_complete', evtResult => { + // console.log(evtName, evtResult) + }) + }) + this.editor.on('draw_complete', (geometry) => { + var id = geometry.id + if (this.editor.getActiveOverlay().id === 'polygon') { + var geo = this.polygon.geometries.filter(function (item) { + return item.id === id + }) + this.polygons = geo[0].paths + // console.log('缁樺埗鐨勫杈瑰舰鍧愭爣锛�', geo[0].paths) + } + this.changeMode() + }) + }, + handleAgain() { + this.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW) + }, + reset() { + // this.editor.enable() + this.polygons = [] + this.polygon.setGeometries([]) + this.polygon.remove('polygon') + this.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.DRAW) + }, + changeMode() { + this.editor.setActionMode(TMap.tools.constants.EDITOR_ACTION.INTERACT) + }, + deleteObj() { + this.editor.delete() + }, + close() { + this.reset() + map.destroy() + this.isShowModal = false + }, + confirm() { + const list = this.editor.getOverlayList()[0].overlay.geometries + if (list.length == 0) return Message.warning('璇峰厛缁樺埗杩愯惀鍖哄煙') + this.isShowModal = false + this.reset() + this.$emit('change', list[0].paths, this.row) + + + } + } +} +</script> + +<style lang="scss" scoped> +.map_title { + font-size: 14px; + font-weight: 500; + margin-bottom: 6px; +} + +.map_wrap { + width: 100%; + height: calc(100% - 60px); + position: relative; + + .btns { + position: absolute; + left: 50%; + top: 10px; + transform: translate(-50%, 0); + z-index: 99999999999; + } +} +</style> \ No newline at end of file diff --git a/admin/src/views/operation/components/QRcode.vue b/admin/src/views/operation/components/QRcode.vue new file mode 100644 index 0000000..0f8670c --- /dev/null +++ b/admin/src/views/operation/components/QRcode.vue @@ -0,0 +1,122 @@ +<template> + <GlobalWindow + title="鏌ョ湅鍥剧墖" + :visible.sync="visible" + :confirm-working="isWorking" + confirmText="鎵撳嵃浜岀淮鐮�" + > + <div class="box" id="print-content"> + <div class="box_item" v-for="(item, index) in list" :key="index"> +<!-- <div class="box_item_title">寰俊</div>--> + <div class="box_item_qr"> + <img :src="item.imgurl" /> +<!-- <span>{{item.siteId}}/{{item.code}}</span>--> + </div> +<!-- <div class="box_item_footer">鎵爜鍙栬溅</div>--> + </div> + </div> + <template v-slot:footer> +<!-- <el-button type="primary" v-print="'#print-content'">鎵撳嵃</el-button>--> + <el-button type="primary" :loading="isWorking.export" @click="exportImages">鎵撳寘涓嬭浇</el-button> + <el-button @click="close">杩斿洖</el-button> + </template> + </GlobalWindow> +</template> + +<script> +import BaseOpera from '@/components/base/BaseOpera' +import GlobalWindow from '@/components/common/GlobalWindow' +import { downloadImgs } from '@/api/business/bikes.js' +export default { + name: 'QRcode', + extends: BaseOpera, + components: { GlobalWindow }, + data () { + return { + siteId:'', + isLoading : true, + list: [] + } + }, + created () { + this.config({ + api: '/business/sites', + 'field.id': 'id' + }) + }, + methods: { + open (title, id) { + this.visible = true + }, + close () { + this.visible = false + }, + exportImages () { + downloadImgs( this.siteId) + .then(response => { + this.download(response) + }) + .catch(e => { + this.$tip.apiFailed(e) + }) + .finally(() => { + this.isWorking.export = false + }) + } + } +} +</script> + +<style lang="scss" scoped> + .box { + width: 100%; + display: flex; + align-items: center; + /*justify-content: space-between;*/ + flex-wrap: wrap; + .box_item { + width: 152px; + height: auto; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + background: #FFFFFF; + border: 1px solid #BBBBBB; + padding: 3px 0 4px 0; + box-sizing: border-box; + margin-top: 50px; + margin-left: 35px; + .box_item_title { + font-size: 21px; + font-weight: 400; + color: #222222; + } + .box_item_qr { + width: 139px; + height: 154px; + padding: 6px 7px; + box-sizing: border-box; + background: #282828; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + img { + width: 126px; + height: 146px; + } + span { + font-size: 13px; + font-weight: 400; + color: #FFFFFF; + } + } + .box_item_footer { + font-size: 23px; + font-weight: bold; + color: #222222; + } + } + } +</style> diff --git a/admin/src/views/operation/components/SitesWindow.vue b/admin/src/views/operation/components/SitesWindow.vue index 25e214c..a8382f8 100644 --- a/admin/src/views/operation/components/SitesWindow.vue +++ b/admin/src/views/operation/components/SitesWindow.vue @@ -13,12 +13,12 @@ <el-form-item label="绔欑偣鍚嶇О" prop="name"> <el-input v-model="form.name" placeholder="璇疯緭鍏ョ珯鐐瑰悕绉�" v-trim/> </el-form-item> - <el-form-item label="鏄惁寮傚父涓婃姤" prop="needNotice"> + <!-- <el-form-item label="鏄惁寮傚父涓婃姤" prop="needNotice"> <el-radio-group v-model="form.needNotice"> <el-radio :label="0">涓婃姤</el-radio> <el-radio :label="1">涓嶄笂鎶�</el-radio> </el-radio-group> - </el-form-item> + </el-form-item> --> <!-- <el-form-item label="绔欑偣ip" prop="ip"> <el-input v-model="form.ip" placeholder="璇疯緭鍏ョ珯鐐筰p鍦板潃" v-trim/> </el-form-item> @@ -49,7 +49,8 @@ code: '', needNotice:0, ip: '', - port: '' + port: '', + type: 1 // createDate: '', // creator: '', diff --git a/admin/src/views/operation/components/TramEdit.vue b/admin/src/views/operation/components/TramEdit.vue index 1710052..38293a1 100644 --- a/admin/src/views/operation/components/TramEdit.vue +++ b/admin/src/views/operation/components/TramEdit.vue @@ -7,17 +7,16 @@ width="600px" > <el-form :model="form" ref="form" :rules="rules" label-width="100px"> - <el-form-item label="杞﹁締绫诲瀷" prop="code"> - <el-select v-model="form.named" placeholder="璇烽�夋嫨"> - <el-option label="3浜虹數鍔ㄨ溅" :value="0"></el-option> - <el-option label="4浜虹數鍔ㄨ溅" :value="1"></el-option> + <el-form-item label="杞﹁締绫诲瀷" prop="paramId"> + <el-select v-model="form.paramId" placeholder="璇烽�夋嫨"> + <el-option v-for="item in types" :label="item.name" :value="item.id"></el-option> </el-select> </el-form-item> <el-form-item label="杞﹁締缂栧彿" prop="code"> - <el-input v-model="form.name" placeholder="璇疯緭鍏ヨ溅杈嗙紪鍙�" v-trim/> + <el-input v-model="form.code" placeholder="璇疯緭鍏ヨ溅杈嗙紪鍙�" v-trim/> </el-form-item> - <el-form-item label="鎺у埗鍣⊿N" prop="needNotice"> - <el-input v-model="form.name" placeholder="璇疯緭鍏ユ帶鍒跺櫒SN" v-trim/> + <el-form-item label="鎺у埗鍣⊿N" prop="deviceSn"> + <el-input v-model="form.deviceSn" placeholder="璇疯緭鍏ユ帶鍒跺櫒SN" v-trim/> </el-form-item> </el-form> </GlobalWindow> @@ -26,6 +25,7 @@ <script> import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' +import { baseTranListPost } from '@/api/business/bikes.js' export default { name: 'OperaSitesWindow', extends: BaseOpera, @@ -34,36 +34,38 @@ return { // 琛ㄥ崟鏁版嵁 form: { - id: null, - name: '', + paramId: '', code: '', - needNotice:0, - ip: '', - port: '' - + deviceSn: '', }, + types: [], // 楠岃瘉瑙勫垯 rules: { code: [ - { required: true, message: '璇疯緭鍏ョ珯鐐圭紪鍙�', tigger: 'blur' }, + { required: true, message: '璇疯緭鍏�', tigger: 'blur' }, ], - name: [ - { required: true, message: '璇疯緭鍏ョ珯鐐瑰悕绉�', tigger: 'blur' }, + paramId: [ + { required: true, message: '璇烽�夋嫨', tigger: 'blur' }, ], - ip: [ - { required: true, message: '璇疯緭鍏ョ珯鐐筰p鍦板潃', tigger: 'blur' }, - ], - port: [ - { required: true, message: '璇疯緭鍏ョ珯鐐圭鍙e彿', tigger: 'blur' }, + deviceSn: [ + { required: true, message: '璇疯緭鍏�', tigger: 'blur' }, ], } } }, created () { + this.initOp() this.config({ - api: '/business/sites', + api: '/business/bikes', 'field.id': 'id' }) + }, + methods: { + initOp(){ + baseTranListPost({type: 4}).then(res => { + this.types = res + }) + } } } </script> diff --git a/admin/src/views/operation/site.vue b/admin/src/views/operation/site.vue index fca27a8..512cfdb 100644 --- a/admin/src/views/operation/site.vue +++ b/admin/src/views/operation/site.vue @@ -25,7 +25,7 @@ min-width="100px" align="center"></el-table-column> <el-table-column prop="name" label="绔欑偣鍚嶇О" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" sortable min-width="100px" align="center"></el-table-column> + <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" sortable min-width="100px" align="center"></el-table-column> <el-table-column v-if="containPermissions(['business:sites:update', 'business:sites:delete'])" label="鎿嶄綔" min-width="120" align="center" fixed="right"> <template slot-scope="{row}"> @@ -43,8 +43,7 @@ <!-- 鏂板缓/淇敼 --> <OperaSitesWindow ref="operaSitesWindow" @success="handlePageChange" /> <!-- 鏌ョ湅浜岀淮鐮� --> - <AMap ref="MapRef" /> - <div id="aaa"></div> + <AMap @change="changeMap" ref="MapRef" /> </TableLayout> </template> @@ -53,7 +52,9 @@ import TableLayout from '@/layouts/TableLayout' import Pagination from '@/components/common/Pagination' import OperaSitesWindow from './components/SitesWindow' -import AMap from './components/Map.vue' +import AMap from './components/AMap.vue' +import { Message } from 'element-ui' +import { updateById } from '@/api/business/sites.js' export default { name: 'Sites', extends: BaseTable, @@ -74,7 +75,8 @@ status: '', lockNum: '', ip: '', - clientVersion: '' + clientVersion: '', + type: 1 }, isShowMap: false } @@ -89,10 +91,23 @@ this.search() }, methods: { - handleDraw() { + changeMap(e, row) { + console.log(e); + updateById({ ...row, electronicFence: JSON.stringify(e) }).then(res => { + if (res) { + Message.success('璁剧疆鎴愬姛') + this.search() + } + }) + }, + handleDraw(row) { this.$refs.MapRef.isShowModal = true this.$nextTick(() => { - // this.$refs.MapRef.isShowModal = true + this.$refs.MapRef.row = row + if (row.electronicFence) { + this.$refs.MapRef.polygons = JSON.parse(row.electronicFence) + } + this.$refs.MapRef.initMap() }) } diff --git a/admin/src/views/operation/tram.vue b/admin/src/views/operation/tram.vue index c557513..3f221de 100644 --- a/admin/src/views/operation/tram.vue +++ b/admin/src/views/operation/tram.vue @@ -15,54 +15,65 @@ </el-select> </el-form-item> <section> - <el-button type="primary" @click="search">鎼滅储</el-button> + <el-button type="primary" @click="search(1)">鎼滅储</el-button> <el-button @click="reset">閲嶇疆</el-button> </section> </el-form> <!-- 琛ㄦ牸鍜屽垎椤� --> <template v-slot:table-wrap> <ul class="toolbar" v-permissions="['business:sites:create']"> - <li><el-button type="primary" @click="$refs.TramEditRef.open('鏂板杞﹁締')" icon="el-icon-plus" v-permissions="['business:sites:create']">鏂板缓</el-button></li> + <li><el-button type="primary" @click="$refs.TramEditRef.open('鏂板杞﹁締')" icon="el-icon-plus" + v-permissions="['business:sites:create']">鏂板缓</el-button></li> + <li><el-button @click="handleDelAll">鎵归噺鍒犻櫎</el-button></li> + <li v-permissions="['system:user:create']"> + <ImportButton text="瀵煎叆" template-name="鐢佃溅妯℃澘.xlsx" template-path="/template/tram_import_tem.xlsx" + action="/business/bikes/importExcel" @success="search" /> + </li> + <li><el-button :loading="downLoading" @click="handleDownAll" + v-permissions="['business:sites:create']">鎵归噺涓嬭浇浜岀淮鐮�</el-button></li> </ul> - <el-table - v-loading="isWorking.search" - :data="tableData.list" - stripe - border - > - <el-table-column prop="code" label="杞﹁締缂栫爜" :sort-method="(a,b)=>{ return a.code-b.code}" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="name" label="杞﹁締绫诲瀷" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="name" label="鎺у埗鍣⊿N" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="name" label="褰撳墠鐢靛帇鍊�" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="name" label="鐢甸噺鎯呭喌" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="name" label="绔欑偣缂栧彿" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="name" label="绔欑偣鍚嶇О" sortable min-width="100px" align="center"></el-table-column> - <el-table-column prop="createTime" label="鏈�鍚庨�氳鏃堕棿" sortable min-width="100px" align="center"></el-table-column> - <el-table-column - v-if="containPermissions(['business:sites:update', 'business:sites:delete'])" - label="鎿嶄綔" - min-width="160" - align="center" - fixed="right" - > + <el-table @selection-change="handleSelectionChange" v-loading="isWorking.search" :data="tableData.list" stripe + border> + <el-table-column type="selection" width="55" align="center"></el-table-column> + <el-table-column prop="code" label="杞﹁締缂栫爜" min-width="100px" align="center"></el-table-column> + <el-table-column prop="paramName" label="杞﹁締绫诲瀷" min-width="100px" align="center"></el-table-column> + <el-table-column prop="deviceSn" label="鎺у埗鍣⊿N" min-width="100px" align="center"></el-table-column> + <el-table-column prop="voltage" label="褰撳墠鐢靛帇鍊�" sortable min-width="100px" align="center"></el-table-column> + <el-table-column label="鐢甸噺鎯呭喌" width="80px" align="center"> + <template v-slot="{ row }"> + <span :class="{ red: row.lowVoltage == 1 }">{{ row.lowVoltage == 0 ? '姝e父' : '浣庣數閲�' }}</span> + </template> + </el-table-column> + <el-table-column prop="siteId" label="绔欑偣缂栧彿" min-width="100px" align="center"></el-table-column> + <el-table-column prop="siteName" label="绔欑偣鍚嶇О" min-width="100px" align="center"></el-table-column> + <el-table-column prop="heartDate" label="鏈�鍚庨�氳鏃堕棿" min-width="100px" align="center"></el-table-column> + <el-table-column v-if="containPermissions(['business:sites:update', 'business:sites:delete'])" label="鎿嶄綔" + min-width="160" align="center" fixed="right"> <template slot-scope="{row}"> - <el-button type="text" @click="$refs.QRcode.open('鏌ョ湅浜岀淮鐮�', row.code)" icon="el-icon-picture-outline-round">鏌ョ湅浜岀淮鐮�</el-button> - <el-button type="text" @click="$refs.TramEditRef.open('缂栬緫杞﹁締', row)" icon="el-icon-edit" v-permissions="['business:sites:update']">缂栬緫</el-button> - <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:sites:delete']">鍒犻櫎</el-button> + <el-button type="text" @click="handlePri(row)" icon="el-icon-picture-outline-round">鏌ョ湅浜岀淮鐮�</el-button> + <el-button type="text" @click="$refs.TramEditRef.open('缂栬緫杞﹁締', row)" icon="el-icon-edit" + v-permissions="['business:sites:update']">缂栬緫</el-button> + <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" + v-permissions="['business:sites:delete']">鍒犻櫎</el-button> </template> </el-table-column> </el-table> - <pagination - @size-change="handleSizeChange" - @current-change="handlePageChange" - :pagination="tableData.pagination" - > + <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination"> </pagination> </template> <!-- 鏂板缓/淇敼 --> - <TramEdit ref="TramEditRef" @success="handlePageChange"/> - <!-- 鏌ョ湅浜岀淮鐮� --> - <QRcode ref="QRcode" /> + <TramEdit ref="TramEditRef" @success="search" /> + <el-dialog title="鏌ョ湅浜岀淮鐮�" :visible.sync="isShowPri" width="600px"> + <div style="display: flex;align-items: center;justify-content: center;"> + <el-image style="width: 500px; height: 500px" :src="imgurl" :preview-src-list="[imgurl]"></el-image> + </div> + <span slot="footer" class="dialog-footer"> + <el-button @click="isShowPri = false">鍙� 娑�</el-button> + <el-button type="primary" @click="isShowPri = false">纭� 瀹�</el-button> + </span> + </el-dialog> + <QRcode ref="QRcodeRef" /> + <!-- <ImportWindow ref="ImportWindowRef" templateName="鐢佃溅淇℃伅妯℃澘" /> --> </TableLayout> </template> @@ -71,12 +82,16 @@ import TableLayout from '@/layouts/TableLayout' import Pagination from '@/components/common/Pagination' import TramEdit from './components/TramEdit.vue' -import QRcode from '@/components/business/QRcode' +import QRcode from './components/QRcode' +import ImportButton from '@/components/common/ImportButton' +import { tranListPost } from '@/api/business/bikes.js' +import { qrcodeBike, qrcodeBikeList, deleteBatchById } from '@/api/business/bikes.js' +import { Message } from 'element-ui' export default { - name: 'Sites', + name: 'bikes', extends: BaseTable, - components: { TableLayout, Pagination, TramEdit, QRcode }, - data () { + components: { TableLayout, Pagination, TramEdit, QRcode, ImportButton }, + data() { return { // 鎼滅储 searchForm: { @@ -92,18 +107,122 @@ status: '', lockNum: '', ip: '', + type: 1, clientVersion: '' - } + }, + imgurl: '', + isShowPri: false, + downLoading: false, + + selList: [] } }, - created () { + created() { this.config({ module: '绔欑偣淇℃伅琛�', - api: '/business/sites', + api: '/business/bikes', 'field.id': 'id', 'field.main': 'id' }) this.search() + }, + methods: { + handleSelectionChange(val) { + this.selList = val + console.log(val) + + }, + handleDelAll() { + const { selList } = this + if (selList.length == 0) return Message.warning('璇峰厛閫夋嫨瑕佸垹闄ょ殑杞﹁締') + this.$confirm('鎮ㄧ‘璁よ鍒犻櫎閫変腑鐨勮溅杈嗗悧锛�', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning', + }).then(() => { + deleteBatchById({ ids: selList.map(i => i.id).join() }).then(res => { + if (res) { + this.search(1) + Message.success('鍒犻櫎鎴愬姛') + } + }) + }) + }, + handlePri(row) { + this.imgurl = null + qrcodeBike({ fouce: 0, bikeId: row.id }).then(res => { + if (res && res.imgurl) { + this.imgurl = res.imgurl + this.isShowPri = true + } + }) + }, + handleDownAll() { + this.downLoading = true + qrcodeBikeList({ fouce: 0 }).then(res => { + this.downLoading = false + this.$refs.QRcodeRef.list = res + this.$refs.QRcodeRef.visible = true + }, () => { + this.downLoading = false + }) + }, + search(pageIndex) { + this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex + this.isWorking.search = true + tranListPost({ + page: this.tableData.pagination.pageIndex, + capacity: this.tableData.pagination.pageSize, + model: this.searchForm, + sorts: this.tableData.sorts + }) + .then(data => { + this.tableData.list = data.records + this.tableData.pagination.total = data.total + }) + .catch(e => { + this.$tip.apiFailed(e) + }) + .finally(() => { + this.isWorking.search = false + }) + }, + handleSizeChange(pageSize) { + this.tableData.pagination.pageSize = pageSize + this.search() + }, + // 鎺掑簭 + handleSortChange(sortData) { + this.tableData.sorts = [] + if (sortData.order != null) { + this.tableData.sorts.push({ + property: sortData.column.sortBy, + direction: sortData.order === 'descending' ? 'DESC' : 'ASC' + }) + } + this.handlePageChange() + }, + // 椤电爜鍙樻洿澶勭悊 + handlePageChange(pageIndex) { + this.tableData.pagination.pageIndex = pageIndex || this.tableData.pagination.pageIndex + this.isWorking.search = true + tranListPost({ + page: this.tableData.pagination.pageIndex, + capacity: this.tableData.pagination.pageSize, + model: this.searchForm, + sorts: this.tableData.sorts + }) + .then(data => { + this.tableData.list = data.records + this.tableData.pagination.total = data.total + }) + .catch(e => { + this.$tip.apiFailed(e) + }) + .finally(() => { + this.isWorking.search = false + }) + }, } } </script> -- Gitblit v1.9.3