Parcourir la source

会员管理增加区域显示、编辑功能;停车场明细增加按区域显示、编辑车位数

chenwen il y a 2 semaines
Parent
commit
88312a8d32

+ 22 - 1
apis/myparkings.js

@@ -41,6 +41,27 @@ export function updateParkingSeat(parkingId,totalCount,idleCount){
 	})
 }
 
+export function updateParkingAreaSeat(areaSeats){
+	return request({
+		header:{'content-type':'application/json'},
+		method: 'post',
+		data:areaSeats,
+		url: '/mobileApi/parkingSite/updateAreaSeat'
+	})
+}
+
+export function loadParkingArea(parkId){
+	return request({
+		method: 'post',
+		data:{
+			parkingId:parkId
+		} ,
+		url: '/mobileApi/parkingSite/loadAreaInfo'
+	})
+}
+
+
+/*
 const areaOpts={'0':'大楼院内','2':'大楼前门','1':'创客公寓'}
 
 export function getAreaName(area){
@@ -54,7 +75,7 @@ export function getAreaOpts(){
 	}
 	
 	return optsAry
-}
+}*/
 
 
 

+ 1 - 1
pages/parking/myparkings.vue

@@ -6,7 +6,7 @@
 			<view class="panel-left">
 				<text class="left-title">{{item.parking_name}}</text>
 				<text class="left-txt">{{item.address_}}</text>
-				<view class="left-txt">总车位数<text class="num-txt">{{item.total_parking_number}}</text> <!-- / <text class="newpower-txt">新能源车位<text class="num-txt">40</text></text> --></view>
+				<!-- <view class="left-txt">总车位数<text class="num-txt">{{item.total_parking_number}}</text> <!-- / <text class="newpower-txt">新能源车位<text class="num-txt">40</text></text> </view>--> 
 			</view>
 			<u-icon name="arrow-right" style="padding:15rpx;" @tap="showDtl(item.park_id)"></u-icon>
 		</view>

+ 159 - 66
pages/parking/parkingSiteDes.vue

@@ -4,16 +4,20 @@
 		</u-navbar>
 		<view class="parking-panel">
 			<view class="panel-left">
-				<view>
-					<text class="left-title">{{parkingSite.parking_name}}</text>
+				<view class="panel-row">
+					<text class="item-title" style="font-size: 32rpx;color:#000;">{{parkingSite.parking_name}}</text>
 					<u-icon name="edit-pen" size="32" color="#4a4a4a" style="margin-left:100rpx;padding:10rpx;" @tap="editParking"></u-icon>
 				</view>
 				
-				<view class="left-txt">
-					<text>总车位数 </text><text class="num-txt">{{parkingSite.total_parking_number}}</text>
-					
+				
+				<view class="panel-row">
+					<text class="item-title">区域</text>
+					<text class="item-title">车位余数 / 总数</text>
+				</view>
+				<view class="panel-row" v-for="(site,index) in parkingSite.sites" :key="index">
+					<text class="item-title">{{site.areaName}}</text>
+					<text class="num-txt">{{site.surplusParkingNumber}} / {{site.totalParkingNumber}}</text>
 				</view>
-				<view class="left-txt">剩余车位数<text class="num-txt">{{parkingSite.surplus_parking_number}}</text></view>
 			</view>
 			<image :src="parkingSite.pic_url" style="width:200rpx;height:160rpx;border-radius: 10rpx;"></image>
 		</view>
@@ -55,9 +59,18 @@
 		</u-modal>
 		
 		<u-modal v-model="showEditModal" ref="editModal" title="车位数编辑" :show-cancel-button="true" :async-close="true" @confirm="submitSeat">
-			<view class="slot-content">
-				<u-field type="number" v-model="seatModel.total" label="总车位数" :label-width="150" :field-style="{'border-bottom':'1px solid #55aaff'}"/>
-				<u-field type="number" v-model="seatModel.idle" label="剩余车位数" :label-width="150" :field-style="{'border-bottom':'1px solid #55aaff'}"/>
+			<view class="eidt-content">
+				<view class="edit-row" style="font-weight: bold;">
+					<text class="item-title">区域</text>
+					<text class="item-title" style="margin-right:30rpx;">车位余数 / 总数</text>
+				</view>
+				<view class="edit-row" v-for="(site,index) in editSites" :key="index">
+					<text class="item-title">{{site.areaName}}</text>
+					<view style="display: flex;justify-content: flex-end;">
+						<u-field type="number" v-model="site.surplusParkingNumber" label="" :label-width="0" :field-style="{'border-bottom':'1px solid #55aaff','width':'60rpx'}" :clearable="false"/>
+						<u-field type="number" v-model="site.totalParkingNumber" label="" :label-width="0" :field-style="{'border-bottom':'1px solid #55aaff','width':'60rpx'}" :clearable="false"/>
+					</view>
+				</view>
 			</view>
 		</u-modal>
 	</view>
@@ -77,6 +90,7 @@
 				opening:false,
 				openingChannel:'',
 				parkingSite:{},
+				editSites:null,
 				chargeRule:{},
 				othChargeRule:[],
 				devs:[],
@@ -94,8 +108,6 @@
 		methods: {
 			editParking(){
 				this.showEditModal=true;
-				this.seatModel.total=this.parkingSite.total_parking_number;
-				this.seatModel.idle=this.parkingSite.surplus_parking_number;
 			},
 			closeEditModal(isClose){
 				if(isClose){
@@ -105,35 +117,70 @@
 					this.$refs.editModal.clearLoading();
 				}
 			},
+			synSites(){ //编辑车位提交成功后同步模型数据
+				this.parkingSite['sites']=JSON.parse(JSON.stringify(this.editSites))
+			},
 			submitSeat(){
-				
-				api.updateParkingSeat(this.parkingSite.id,this.seatModel.total,this.seatModel.idle).then(resp=>{
-					if(!resp.success){
+				//this.crtparkId
+				//let arySeat=[{parkId:'11',area:'0',totalParkingNumber:0,surplusParkingNumber:2}]
+				let arySeat=this.editSites.map(area=>{
+					area['parkId']=this.crtparkId
+					return area
+				})
+				if(this.crtparkId=='1'){ //荆鹏停车场
+					api.updateParkingAreaSeat(arySeat).then(resp=>{
+						if(!resp.success){
+							uni.showToast({
+								title:resp.msg||'保存数据失败',
+								icon:'none'
+							})
+							this.closeEditModal()
+							return;
+						}
 						uni.showToast({
-							title:resp.msg||'保存数据失败',
-							icon:'none'
+							title:'操作成功',
+							icon:'success'
 						})
+						this.synSites()
+						this.closeEditModal(true)
+						
+					}).catch(err=>{
 						this.closeEditModal()
-						return;
-					}
-					
-					uni.showToast({
-						title:'操作成功',
-						icon:'success'
+						uni.showToast({
+							title:'保存数据出错',
+							icon:'none'
+						})
 					})
-					this.closeEditModal(true)
-					
-					//编辑后的值设置到显示对象中,不用请求后台
-					this.parkingSite.total_parking_number=this.seatModel.total;
-					this.parkingSite.surplus_parking_number=this.seatModel.idle;
-					
-				}).catch(err=>{
-					uni.showToast({
-						title:'保存数据出错',
-						icon:'none'
+				}
+				
+				else{
+					api.updateParkingSeat(arySeat[0].parkId,arySeat[0].totalParkingNumber,arySeat[0].surplusParkingNumber).then(resp=>{
+							if(!resp.success){
+								uni.showToast({
+									title:resp.msg||'保存数据失败',
+									icon:'none'
+								})
+								this.closeEditModal()
+								return;
+							}
+							uni.showToast({
+								title:'操作成功',
+								icon:'success'
+							})
+							this.synSites()
+							this.closeEditModal(true)
+						}).catch(err=>{
+							this.closeEditModal()
+							uni.showToast({
+								title:'保存数据出错',
+								icon:'none'
+							})
+						
 					})
-					this.closeEditModal()
-				})
+				}
+				
+				
+				
 			},
 			manualPass(channelId,gateName){
 				if(this.opening){
@@ -200,34 +247,56 @@
 						return;
 					}
 					
-					this.parkingSite=resp.data.parkInfo;
-					if(!this.parkingSite.pic_url){
-						this.parkingSite.pic_url="../../static/img/header_bg.png";
-					}
-					this.chargeRule=resp.data.chargeRule;
-					let othchargeRule=resp.data.othchargeRule||[];
-					let othRuleTxt={ryc:[],xny:[]};
-					othchargeRule.forEach((item) => {
-						if(item.car_type=='1'){ //燃油车
-							othRuleTxt.ryc.push(`${item.min_section}-${item.max_section}分钟:${item.parking_cost}元`);
-						}
-						else if(item.car_type=='2'){  //新能源车
-							othRuleTxt.xny.push(`${item.min_section}-${item.max_section}分钟:${item.parking_cost}元`);
-						}
-					});
+					this.processParkInfo(resp.data.areas, resp.data.parkInfo,id)
 					
-					this.chargeRule['rule_txt']=`燃油车\n 免费时长:${this.chargeRule.free_duration}分钟,每小时费用:${this.chargeRule.hour_cost}元,${othRuleTxt.ryc.join(',')} \n新能源车\n 免费时长:${this.chargeRule.new_energy_free_duration}分钟,每小时费用:${this.chargeRule.new_energy_hour_cost}元,${othRuleTxt.xny.join(',')} \n每日封顶费用:${this.chargeRule.day_capping_cost}元`;
+					this.processRuleDatas(resp.data.chargeRule,resp.data.othchargeRule)
 					
-					//this.chargeRule['oth_rule_txt']=othRuleTxt.join(' ');
-					console.log(resp.data.devs)
 					this.devs=this.processDevDatas(resp.data.devs,id);  //resp.data.devs
-					console.log(this.devs)
+					//console.log(this.devs)
 					
 				}).catch(error => {
 					uni.hideLoading();
 				});
 			},
 			
+			processParkInfo(areas,parkInfo,parkId){
+				if(!parkInfo.pic_url){
+					parkInfo.pic_url="../../static/img/header_bg.png"
+				}
+				
+				let siteAry=null
+				if(parkId=='1'){ //荆鹏停车场
+					siteAry=areas.map(item=>{
+						let {areaName,area,totalParkingNumber,surplusParkingNumber}=item
+						return {areaName,area,totalParkingNumber,surplusParkingNumber}
+					})
+				}
+				else{
+					siteAry=[{areaName:'全域停车场',totalParkingNumber:parkInfo.total_parking_number,surplusParkingNumber:parkInfo.surplus_parking_number}]
+				}
+				parkInfo['sites']=siteAry
+				this.parkingSite=parkInfo
+				this.editSites=JSON.parse(JSON.stringify(siteAry))
+				//console.log(this.parkingSite)
+			},
+			
+			processRuleDatas(chargeRule,othchargeRule){
+				if(!othchargeRule){
+					othchargeRule=[]
+				}
+				let othRuleTxt={ryc:[],xny:[]};
+				othchargeRule.forEach((item) => {
+					if(item.car_type=='1'){ //燃油车
+						othRuleTxt.ryc.push(`${item.min_section}-${item.max_section}分钟:${item.parking_cost}元`);
+					}
+					else if(item.car_type=='2'){  //新能源车
+						othRuleTxt.xny.push(`${item.min_section}-${item.max_section}分钟:${item.parking_cost}元`);
+					}
+				})
+				this.chargeRule=chargeRule||{}
+				this.chargeRule['rule_txt']=`燃油车\n 免费时长:${this.chargeRule.free_duration}分钟,每小时费用:${this.chargeRule.hour_cost}元,${othRuleTxt.ryc.join(',')} \n新能源车\n 免费时长:${this.chargeRule.new_energy_free_duration}分钟,每小时费用:${this.chargeRule.new_energy_hour_cost}元,${othRuleTxt.xny.join(',')} \n每日封顶费用:${this.chargeRule.day_capping_cost}元`;
+			},
+			
 			//设备(通道设备-摄像头),分级显示(停车场-区域-出口、入口),根据所属道闸合并显示
 			/*
 			{
@@ -247,7 +316,7 @@
 				if(!devs){
 					return []
 				}
-				
+				//console.log(devs)
 				if(parkId!='1'){ //非荆鹏停车场
 					devs.forEach(dev=>{
 						dev['gateName']=dev['channel_name']
@@ -267,11 +336,11 @@
 					}
 					areaKey=dev.area || 'all'
 					if(!glbDev[areaKey]){            //按区域分组
-						glbDev[areaKey]={'areaName':api.getAreaName(areaKey),'gate':{}}   //gate 道闸下的通道设备
+						glbDev[areaKey]={'areaName':dev.area_name||'','gate':{}}   //gate 道闸下的通道设备
 					}
 					if(!glbDev[areaKey]['gate'][dev.channel_flag]){  //按所属道闸合并显示,道闸名=区域名+道闸序号+'入口/出口'
 						gateNameStr=`${glbDev[areaKey]['areaName']}道闸${dev.channel_flag||'1'}`
-						gateNameStr=gateNameStr.replace('全部区域','')
+						//gateNameStr=gateNameStr.replace('全部区域','')
 						glbDev[areaKey]['gate'][dev.channel_flag]={'gateName':gateNameStr,'gateStatus':false,'onlineDevId':null, 'channels':[]}
 					}
 					glbDev[areaKey]['gate'][dev.channel_flag]['channels'].push(dev)
@@ -281,7 +350,7 @@
 					}
 					
 				})
-				//console.log(glbDev)
+				console.log(glbDev)
 				let gateAry=[]
 				for(let are in glbDev){
 					for(let gateIdx in glbDev[are]['gate']){
@@ -320,25 +389,41 @@
 		justify-content: space-between;
 		align-items: flex-start;
 		font-family: '华文行楷';
+		width:480rpx;
 		
 	}
-	.parking-panel .panel-left .left-txt{
+	
+	.parking-panel .panel-left .panel-row,.edit-row{
+		display: flex;
+		flex-flow: row nowrap;
+		justify-content: space-between;
+		align-items: center;
+		width:100%;
+		padding:10rpx 0rpx;
+		box-sizing: border-box;
+		font-size:28rpx;
+	}
+	
+	.parking-panel .panel-left .panel-row .num-txt{
+		font-size: 28rpx;
+		font-weight: bold;
+		margin:0rpx 10rpx;
+	}
+	
+	.parking-panel .panel-left .panel-row .item-title{
 		font-size:24rpx;
-		color:#695f5f;
-		margin-top:15rpx;
-		
+		font-weight: bold;
+		color:#5d5454;
 	}
+	
+	
 	.parking-panel .panel-left .left-title{
 		font-weight: bold;
 		font-size:32rpx;
 		
 		color:#000000;
 	}
-	.left-txt .num-txt{
-		font-size: 28rpx;
-		font-weight: bold;
-		margin:0rpx 10rpx;
-	}
+	
 	.newpower-txt{
 		color:#27bf3e;
 		margin:0rpx 10rpx;
@@ -392,4 +477,12 @@
 		
 	}
 	
+	.eidt-content{
+		padding:10rpx 20rpx;
+		box-sizing: border-box;
+	}
+	
+	.edit-row /deep/.u-field{
+		width:160rpx !important;
+	}
 </style>

+ 44 - 23
pages/whiteList/editWhite.vue

@@ -42,7 +42,7 @@
 			
 		</u-form>
 		
-		<u-select v-model="parkSelShow" :list="myParkSites" mode="mutil-column-auto" @confirm="confirmPark"></u-select>
+		<u-select v-model="parkSelShow" :default-value="defSelect" :list="myParkSites" mode="mutil-column-auto" @confirm="confirmPark"></u-select>
 		
 		<!-- <u-picker mode="selector" v-model="parkSelShow"   :range="myParkSites" range-key="parking_name" @confirm="confirmPark"></u-picker> -->
 		
@@ -153,38 +153,56 @@
 					//document.querySelectorAll('.uni-page-head .uni-page-head-ft .uni-page-head-btn')[0].querySelector('.uni-btn-icon').innerText='';
 				}
 		},
-		onLoad(opts){
+		async onLoad(opts){
 			
-			let childPark=null
-			
-			
-			this.myParkSites=api.getMyParkSites().map(parkItem=>{
-				childPark=[{'label':'全部区域'}]
-				if(parkItem.park_id=='1'){ //1=荆鹏停车场分为多个区域
-					apipark.getAreaOpts().forEach(opt=>{
-						childPark.push({'label':opt.name,value:opt.code})
+			let jpchildPark=[{'label':'全部区域'}]
+			let hadJpPark=api.getMyParkSites().some(parkItem=>parkItem.park_id=='1')  //是否包含荆鹏停车场
+			if(hadJpPark){
+				let parkAreas=await apipark.loadParkingArea("1").catch(err=>{console.log(err)})
+				if(parkAreas && parkAreas.success){
+					parkAreas.data.forEach(areaObj=>{
+						jpchildPark.push({'label':areaObj.areaName,value:areaObj.area})
 					})
 					
-					//console.log(childPark)
-					
 				}
-				return {'label':parkItem.parking_name,'value':parkItem.park_id,'children':childPark}
+			}
+			this.myParkSites=api.getMyParkSites().map(item=>{
+				item={'label':item.parking_name,'value':item.park_id}
+				item['children']=[{'label':'全部区域'}]
+				if(item.value=='1'){
+					item['children']=jpchildPark
+				}
+				
+				return item
 			})
 			
 			if(opts.id!=null){
 				this.loadDate(opts.id);
 				this.isUpdate=true;
 			}
-			else{
+			
+		},
+		computed:{
+			defSelect(){
+				let {parkId,area}=this.white
+				if(!this.myParkSites || !parkId){
+					return [0,0]
+				}
+				let idx=this.myParkSites.findIndex(item=>{
+					return item.value==parkId
+				})
 				
-
+				idx=idx<0?0:idx
 				
-
-			}
-			
-			
+				let idx2=this.myParkSites[idx].children.findIndex(item=>{
+					return (!area && !item.value) || item.value==area
+				})
+				
+				idx2=idx2<0?0:idx2
+				
+				return [idx,idx2]
+			},
 		},
-		
 		methods: {
 			whenOthFocus(){ //其它输入聚焦会弹出系统键盘,所以要关闭车牌输入键盘
 				this.carboardShow=false
@@ -252,15 +270,17 @@
 					}
 					
 					//this.memberRecord=resp.data;
-					let {memberName,memberPhone,memberCarNum,parkingName,memberStartTime,memberEndTime,parkId,memberType,id,area=null}=resp.data;
-					let areaName=apipark.getAreaName(area);
+					let {memberName,memberPhone,memberCarNum,parkingName,memberStartTime,memberEndTime,parkId,memberType,id,area=null,areaName}=resp.data;
+					areaName=areaName || '全部区域'
 					this.white={memberName,memberPhone,memberCarNum,parkingName,memberStartTime,memberEndTime,parkId,memberType,id,area,areaName};
 					//console.log(this.white);
 					
+					
 				}).catch(error => {
 					uni.hideLoading();
 				});
 			},
+			
 			saveData(){
 				this.$refs.uForm.validate(valid => {
 					if(!valid){
@@ -285,7 +305,7 @@
 				if(!submitData['area']||submitData['area']==""){
 					delete submitData['area'];
 				}
-				console.log(submitData)
+				//console.log(submitData)
 				apifun(submitData).then(resp => {
 					//console.log(resp)
 					uni.hideLoading();
@@ -356,6 +376,7 @@
 			}
 		}
 		
+		
 		/* computed:{
 			expireDateRange(){
 				return this.white.memberStartTime?(this.white.memberStartTime+' 至 '+this.white.memberEndTime):'';

+ 4 - 2
pages/whiteList/whiteList.vue

@@ -50,7 +50,7 @@
 			<!-- <view class="us-time">使用时段:无限制</view> -->
 			<view class="parking-site">
 				<text style="color:#888;">使用场所:</text>{{item.parking_name}}
-				<view style="color:#888;font-size:28rpx;margin:10rpx;">({{ item.areaName}})</view>
+				<view style="color:#888;font-size:28rpx;margin:10rpx;">({{ item.area_name || '全部区域'}})</view>
 			</view>
 			<view class="us-expire">使用期限:
 			 <text v-if="item.cloud_del_flag==1" style="font-size:26rpx;font-weight: bold;">
@@ -216,11 +216,13 @@
 				/*let finds=respData.records.find(item=>item.park_id=='1')
 				console.log(finds)
 				finds['area']='1'*/
+				
+				/*
 				if(respData.records){
 					respData.records.forEach(item=>{
 						item['areaName']=apipark.getAreaName(item['area_'])
 					})
-				}
+				}*/
 				
 				respData['pageNum']=respData.current;
 				respData['pageCount']=respData.pages;

+ 1 - 1
utils/request.js

@@ -19,7 +19,7 @@ const service = function(obj) {
 	//uni.showNavigationBarLoading() //在当前页面显示导航条加载动画
 	return new Promise((resolve, reject) => {
 		const header = obj.header ? obj.header : {};
-		header['content-type'] = 'application/x-www-form-urlencoded';
+		header['content-type'] = header['content-type'] || 'application/x-www-form-urlencoded';
 		//store.state.access_token && (header['token'] = store.state.access_token);
 		uni.request({
 			url: BASEURL + obj.url,