481 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			481 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | ||
| 	<view class="pages">
 | ||
| 		<u-navbar title="订单统计" :border-bottom="false" :background="bgc" title-color='#fff' back-icon-color="#fff"
 | ||
| 			title-size='36' height='50'></u-navbar>
 | ||
| 		<view class="time">
 | ||
| 			<view class="timetit">
 | ||
| 				时间范围
 | ||
| 			</view>
 | ||
| 			<view class="timert">
 | ||
| 				<view style="margin-right: 10rpx;" class="xztime" @click="btnks(1)">{{endtime}}</view> — <view
 | ||
| 					style="margin-left: 10rpx;" class="xztime" @click="btnks(2)">{{lasttime}}</view>
 | ||
| 				<view class="qinc" @click="btnqc">×</view>
 | ||
| 			</view>
 | ||
| 		</view>
 | ||
| 		<!-- 快捷选择 -->
 | ||
| 		<view class="ordertongji">
 | ||
| 			<view class="orderday">
 | ||
| 				<view class="sj">
 | ||
| 					<text @click="btnriq(1)" :class="dateindex == 1 ? 'dateactive' : ''">今日</text>
 | ||
| 					<text @click="btnriq(2)" :class="dateindex == 2 ? 'dateactive' : ''">昨日</text>
 | ||
| 					<text @click="btnriq(3)" :class="dateindex == 3 ? 'dateactive' : ''">近七日</text>
 | ||
| 					<text @click="btnriq(4)" :class="dateindex == 4 ? 'dateactive' : ''">本月</text>
 | ||
| 				</view>
 | ||
| 			</view>
 | ||
| 		</view>
 | ||
| 
 | ||
| 		<view class="serch">
 | ||
| 			<input type="text" v-model="type" placeholder="请输入店铺名称" />
 | ||
| 			<view class="" @click="btnsear">搜索</view>
 | ||
| 		</view>
 | ||
| 		<u-picker mode="time" v-model="show" :params="params" @confirm="confirm"></u-picker>
 | ||
| 
 | ||
| 		<view class="tab">
 | ||
| 			<!-- <view class="">店铺</view> -->
 | ||
| 			<view class="">设备</view>
 | ||
| 			<view class="">订单数</view>
 | ||
| 			<view class="">时长</view>
 | ||
| 			<view class="">电量</view>
 | ||
| 			<view class="">金额</view>
 | ||
| 		</view>
 | ||
| 		
 | ||
| 		<view class="table-container">  
 | ||
| 		    <view  
 | ||
| 		      v-for="(row, index) in tableData"  
 | ||
| 		      :key="row.storeId"  
 | ||
| 		      class="table-row"  
 | ||
| 		      @click="toggleRow(index,row.storeId)">  
 | ||
| 			  <view class="" style="margin-bottom: 20rpx;">
 | ||
| 			  	 <text style="font-size: 32rpx;font-weight: 600;">{{ row.storeId == -1 ? '未分配店铺设备' : '店铺:' + row.storeName }}</text>  
 | ||
| 			  </view>
 | ||
| 		      <view class="row-header">  
 | ||
| 		       
 | ||
| 				<text class="">{{row.deviceCount}}台</text>
 | ||
| 				<text class="">{{row.orderCount}}单</text>
 | ||
| 				<text class="">{{row.formattedDuration}}</text>
 | ||
| 				<text class="">{{row.ele}}度</text>
 | ||
| 				<text class="">{{row.arrivalAmount}}元</text>
 | ||
| 		      </view>  
 | ||
| 		      <view v-if="!row.folded" class="row-details" v-for="(val,index) in vallist" :key="index">  
 | ||
| 			    <!-- <view></view> -->
 | ||
| 		        <view>{{val.deviceName}}</view>  
 | ||
| 		        <view>{{val.orderCount}}单</view>  
 | ||
| 		        <view>{{val.formattedDuration}}</view>  
 | ||
| 				<view>{{val.ele}}度</view>  
 | ||
| 		        <view>{{val.arrivalAmount}}元</view>  
 | ||
| 		      </view>  
 | ||
| 		    </view>  
 | ||
| 		  </view>  
 | ||
| 
 | ||
| 	</view>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| 	export default {
 | ||
| 		data() {
 | ||
| 			return {
 | ||
| 				bgc: {
 | ||
| 					backgroundColor: "#8883F0",
 | ||
| 				},
 | ||
| 				statusList: '',
 | ||
| 				type: '',
 | ||
| 				endtime: '',
 | ||
| 				lasttime: '',
 | ||
| 				params: {
 | ||
| 					year: true,
 | ||
| 					month: true,
 | ||
| 					day: true,
 | ||
| 					hour: false,
 | ||
| 					minute: false,
 | ||
| 					second: false
 | ||
| 				},
 | ||
| 				show: false,
 | ||
| 				num: '',
 | ||
| 				tableData: [],  
 | ||
| 				vallist:[],
 | ||
| 				previouslyExpandedIndex: null,
 | ||
| 				dateindex:1
 | ||
| 			}
 | ||
| 		},
 | ||
| 		onLoad() {
 | ||
| 			const todayStartTime = this.getTodayStartTime()
 | ||
|             this.endtime = this.formatDate(todayStartTime)
 | ||
| 			this.lasttime = this.formatDate(todayStartTime)
 | ||
| 			this.getList()
 | ||
| 		},
 | ||
| 		onShow() {
 | ||
| 
 | ||
| 		},
 | ||
| 		// 分享到好友(会话)
 | ||
| 		onShareAppMessage: function() {
 | ||
| 			return {
 | ||
| 				title: '创想物联',
 | ||
| 				path: '/pages/shouye/index'
 | ||
| 			}
 | ||
| 		},
 | ||
| 
 | ||
| 		// 分享到朋友圈  
 | ||
| 		onShareTimeline: function() {
 | ||
| 			return {
 | ||
| 				title: '创想物联',
 | ||
| 				query: '',
 | ||
| 				path: '/pages/shouye/index'
 | ||
| 			}
 | ||
| 		},
 | ||
| 		methods: {
 | ||
| 			btnriq(num) {
 | ||
| 				this.dateindex = num
 | ||
| 				if (num == 1) {
 | ||
| 					let today = new Date();
 | ||
| 					this.endtime = this.formatDate(today)
 | ||
| 					this.lasttime = this.formatDate(today)
 | ||
| 					this.getList()
 | ||
| 				} else if (num == 2) {
 | ||
| 					let yesterday = new Date()
 | ||
| 					yesterday.setDate(yesterday.getDate() - 1)
 | ||
| 					this.endtime = this.formatDate(yesterday)
 | ||
| 					this.lasttime = this.formatDate(yesterday)
 | ||
| 					this.getList()
 | ||
| 				} else if (num == 3) {
 | ||
| 					let today = new Date()
 | ||
| 					let firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6)
 | ||
| 					this.endtime = this.formatDate(firstDayOfMonth)
 | ||
| 					this.lasttime = this.formatDate(new Date())
 | ||
| 					this.getList()
 | ||
| 				} else if (num == 4) {
 | ||
| 					let today = new Date()
 | ||
| 					let firstDayOfLastMonth = new Date(today.getFullYear(), today.getMonth(), 1)
 | ||
| 					let lastDayOfLastMonth = new Date(today.getFullYear(), today.getMonth(), today.getDate())
 | ||
| 					this.endtime = this.formatDate(firstDayOfLastMonth)
 | ||
| 					this.lasttime = this.formatDate(lastDayOfLastMonth)
 | ||
| 					this.getList()
 | ||
| 				} 
 | ||
| 			},
 | ||
| 			formatDate(date) {
 | ||
| 				let year = date.getFullYear()
 | ||
| 				let month = String(date.getMonth() + 1).padStart(2, '0')
 | ||
| 				let day = String(date.getDate()).padStart(2, '0')
 | ||
| 				return `${year}-${month}-${day}`
 | ||
| 			},
 | ||
| 			
 | ||
| 			// 请求统计列表
 | ||
| 			getList(){
 | ||
| 				this.$u.get(`/mch/dashboard/businessStatisticsByStore?storeName=${this.type}&dateRange=${this.endtime+ ',' +this.lasttime}`).then((res) => {
 | ||
| 					if (res.code == 200) {
 | ||
| 					  let arr = res.data
 | ||
| 					  this.tableData = arr.map(item => ({  
 | ||
| 					    ...item,   
 | ||
| 					   folded: true,
 | ||
| 					   formattedDuration: this.formatDuration(item.seconds)
 | ||
| 					  }))
 | ||
| 					}
 | ||
| 				})
 | ||
| 			},
 | ||
| 			
 | ||
| 			formatDuration(seconds) {  
 | ||
| 			      const hours = Math.floor(seconds / 3600);  
 | ||
| 			      const minutes = Math.floor((seconds % 3600) / 60);  
 | ||
| 			      return `${hours.toString().padStart(2, '0')}小时${minutes.toString().padStart(2, '0')}分钟`;  
 | ||
| 			    },  
 | ||
| 			
 | ||
| 			
 | ||
| 			// 点击搜索
 | ||
| 			btnsear(){
 | ||
| 				if(this.endtime == '' || this.endtime == ''){
 | ||
| 					uni.showToast({
 | ||
| 						title: '时间范围不能为空',
 | ||
| 						icon: 'none',
 | ||
| 						duration:2000 
 | ||
| 					})
 | ||
| 				}else{
 | ||
| 					this.getList()
 | ||
| 					this.dateindex = ''
 | ||
| 				}
 | ||
| 			},
 | ||
| 			// 获取当天时间
 | ||
| 			getTodayStartTime() {  
 | ||
| 			  const now = new Date();  
 | ||
| 			  const startOfDay = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0);  
 | ||
| 			  return startOfDay;  
 | ||
| 			},
 | ||
| 			// 调用函数并打印结果  
 | ||
| 			formatDate(date) {  
 | ||
| 			  const year = date.getFullYear();  
 | ||
| 			  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1并补零  
 | ||
| 			  const day = String(date.getDate()).padStart(2, '0'); // 补零  
 | ||
| 			  const hours = String(date.getHours()).padStart(2, '0'); // 补零(虽然这里总是00)  
 | ||
| 			  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零  
 | ||
| 			  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零  
 | ||
| 			  return `${year}-${month}-${day} `;  
 | ||
| 			},
 | ||
| 			
 | ||
| 		    // 点击展开折叠
 | ||
| 			toggleRow(index,storeId) {  
 | ||
| 				if(this.endtime == '' || this.endtime == ''){
 | ||
| 					uni.showToast({
 | ||
| 						title: '时间范围不能为空',
 | ||
| 						icon: 'none',
 | ||
| 						duration:2000 
 | ||
| 					})
 | ||
| 				}else{
 | ||
| 					this.$u.get(`/mch/dashboard/businessStatisticsByDevice?storeId=${storeId == null ? '' : storeId}&dateRange=${this.endtime+ ',' +this.lasttime}`).then(res => {
 | ||
| 						if(res.code == 200){
 | ||
| 							let arr = res.data
 | ||
| 							this.vallist = arr.map(item => ({
 | ||
| 							  ...item,   
 | ||
| 							 formattedDuration: this.formatDuration(item.seconds)
 | ||
| 							}))
 | ||
| 							// 如果之前有展开的行,则将其折叠
 | ||
| 							if (this.previouslyExpandedIndex !== null && this.previouslyExpandedIndex !== index) {  
 | ||
| 							  this.$set(this.tableData, this.previouslyExpandedIndex, {  
 | ||
| 							    ...this.tableData[this.previouslyExpandedIndex],  
 | ||
| 							    folded: true  
 | ||
| 							  });  
 | ||
| 							}  
 | ||
| 							// 展开当前行  
 | ||
| 							this.$set(this.tableData, index, {  
 | ||
| 							  ...this.tableData[index],  
 | ||
| 							  folded: false  
 | ||
| 							});  
 | ||
| 							// 更新之前展开行的索引  
 | ||
| 							this.previouslyExpandedIndex = index; 
 | ||
| 						}
 | ||
| 					})
 | ||
| 				}   
 | ||
| 			  },
 | ||
| 			  
 | ||
| 			// 选择时间
 | ||
| 			btnks(num) {
 | ||
| 				this.show = true
 | ||
| 				if (num == 1) {
 | ||
| 					this.num = 1
 | ||
| 				} else {
 | ||
| 					this.num = 2
 | ||
| 				}
 | ||
| 			},
 | ||
| 
 | ||
| 			// 清除时间
 | ||
| 			btnqc() {
 | ||
| 				this.endtime = ''
 | ||
| 				this.lasttime = ''
 | ||
| 			},
 | ||
| 			// 确定时间
 | ||
| 			confirm(e) {
 | ||
| 				if (this.num == 1) {
 | ||
| 					this.endtime = e.year + '-' + e.month + '-' + e.day 
 | ||
| 				} else {
 | ||
| 					this.lasttime = e.year + '-' + e.month + '-' + e.day 
 | ||
| 				}
 | ||
| 			},
 | ||
| 		},
 | ||
| 	}
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss">
 | ||
| 	/deep/ .u-title {
 | ||
| 		padding-bottom: 22rpx;
 | ||
| 	}
 | ||
| 
 | ||
| 	/deep/ .uicon-nav-back {
 | ||
| 		padding-bottom: 22rpx;
 | ||
| 	}
 | ||
| 	.dateactive {
 | ||
| 		background: #E3E3FF !important;
 | ||
| 		color: #3D3D3D !important;
 | ||
| 	}
 | ||
| 	.ordertongji {
 | ||
| 		width: 658rpx;
 | ||
| 		background: #FFFFFF;
 | ||
| 		border-radius: 24rpx 24rpx 24rpx 24rpx;
 | ||
| 		margin: auto;
 | ||
| 		margin-top: 20rpx;
 | ||
| 		.shuju {
 | ||
| 			display: flex;
 | ||
| 			justify-content: space-between;
 | ||
| 			box-sizing: border-box;
 | ||
| 			margin-top: 24rpx;
 | ||
| 			.sjone{
 | ||
| 				width: 170rpx;
 | ||
| 				margin: auto;
 | ||
| 				text-align: center;
 | ||
| 				.je{
 | ||
| 					font-size: 40rpx;
 | ||
| 					color: #3D3D3D;
 | ||
| 					font-weight: 600;
 | ||
| 				}
 | ||
| 				.shu{
 | ||
| 					font-size: 20rpx;
 | ||
| 					color: #3D3D3D;
 | ||
| 					margin-top: 20rpx;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 	
 | ||
| 		.date {
 | ||
| 			padding-left: 80rpx;
 | ||
| 			padding-right: 80rpx;
 | ||
| 			box-sizing: border-box;
 | ||
| 			display: flex;
 | ||
| 			justify-content: space-between;
 | ||
| 			margin-top: 26rpx;
 | ||
| 			text {
 | ||
| 				padding: 6rpx 18rpx;
 | ||
| 				box-sizing: border-box;
 | ||
| 				background: #eee;
 | ||
| 				border-radius: 10rpx 10rpx 10rpx 10rpx;
 | ||
| 				font-size: 24rpx;
 | ||
| 				color: #808080;
 | ||
| 			}
 | ||
| 		}
 | ||
| 	
 | ||
| 		.orderday {
 | ||
| 			display: flex;
 | ||
| 			justify-content: space-between;
 | ||
| 			width: 100%;
 | ||
| 			padding: 10rpx 12rpx;
 | ||
| 			box-sizing: border-box;
 | ||
| 			text {
 | ||
| 				margin-right: 10rpx;
 | ||
| 				border-radius: 20rpx;
 | ||
| 				text-align: center;
 | ||
| 				display: inline-block;
 | ||
| 				width: 148rpx;
 | ||
| 				height: 84rpx;
 | ||
| 				text-align: center;
 | ||
| 				line-height: 84rpx;
 | ||
| 				color: #979797;
 | ||
| 				background-color: #f5f5f5;
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 	.table-container {  
 | ||
| 	  padding: 20rpx;  
 | ||
| 	}  
 | ||
| 	  
 | ||
| 	.table-row {  
 | ||
| 	  margin-bottom: 40rpx;  
 | ||
| 	  border-bottom: 1rpx solid #ddd;  
 | ||
| 	}  
 | ||
| 	  
 | ||
| 	.row-header {  
 | ||
| 	  display: flex;  
 | ||
| 	  justify-content: space-between;  
 | ||
| 	  align-items: center;  
 | ||
| 	  padding: 10rpx;  
 | ||
| 	  background-color: #f5f5f5;  
 | ||
| 	  cursor: pointer;  
 | ||
| 	  height: 100rpx;
 | ||
| 	  text{
 | ||
| 		  width: 16%;
 | ||
| 		  text-align: center;
 | ||
| 		  overflow: scroll;
 | ||
| 	  }
 | ||
| 	}  
 | ||
| 	  
 | ||
| 	.row-details {  
 | ||
| 	  padding: 10rpx;  
 | ||
| 	  background-color: #fff;  
 | ||
| 	  display: flex;
 | ||
| 	  justify-content: space-between;
 | ||
| 	  align-items: center;
 | ||
| 	  view{
 | ||
| 		  width: 16%;
 | ||
| 		  text-align: center;
 | ||
| 		  overflow: scroll;
 | ||
| 	  }
 | ||
| 	}  
 | ||
| 	  
 | ||
| 	.folded-count {  
 | ||
| 	  margin-top: 20rpx;  
 | ||
| 	  font-size: 30rpx;  
 | ||
| 	  text-align: center;  
 | ||
| 	}  
 | ||
|     .list{
 | ||
| 		padding: 0 30rpx;
 | ||
| 		box-sizing: border-box;
 | ||
| 	}
 | ||
| 	.tab {
 | ||
| 		display: flex;
 | ||
| 		justify-content: space-between;
 | ||
| 		padding: 0 30rpx;
 | ||
| 		box-sizing: border-box;
 | ||
| 		background-color: #fff;
 | ||
| 		height: 50rpx;
 | ||
| 		view{
 | ||
| 			width: 16%;
 | ||
| 			text-align: center;
 | ||
| 			overflow: scroll;
 | ||
| 			font-size: 32rpx;
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	.serch {
 | ||
| 		display: flex;
 | ||
| 		justify-content: space-between;
 | ||
| 		align-items: center;
 | ||
| 		padding: 0 40rpx;
 | ||
| 		box-sizing: border-box;
 | ||
| 		height: 120rpx;
 | ||
| 		background-color: #fff;
 | ||
| 
 | ||
| 		input {
 | ||
| 			width: 100%;
 | ||
| 			height: 60rpx;
 | ||
| 			line-height: 60rpx;
 | ||
| 			padding-left: 30rpx;
 | ||
| 			border: 1px solid #ccc;
 | ||
| 			border-radius: 10rpx;
 | ||
| 		}
 | ||
| 
 | ||
| 		view {
 | ||
| 			width: 170rpx;
 | ||
| 			height: 60rpx;
 | ||
| 			line-height: 60rpx;
 | ||
| 			text-align: center;
 | ||
| 			color: #fff;
 | ||
| 			background-color: #8883F0;
 | ||
| 			border-radius: 10rpx;
 | ||
| 			margin-left: 30rpx;
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	.time {
 | ||
| 		height: 150rpx;
 | ||
| 		padding-top: 40rpx !important;
 | ||
| 		padding: 0 40rpx;
 | ||
| 		box-sizing: border-box;
 | ||
| 		background-color: #fff;
 | ||
| 
 | ||
| 		.timetit {
 | ||
| 			font-weight: 600;
 | ||
| 			font-size: 30rpx;
 | ||
| 		}
 | ||
| 
 | ||
| 		.timert {
 | ||
| 			display: flex;
 | ||
| 			line-height: 60rpx;
 | ||
| 			justify-content: space-between;
 | ||
| 			margin-top: 20rpx;
 | ||
| 
 | ||
| 			.xztime {
 | ||
| 				width: 300rpx;
 | ||
| 				height: 60rpx;
 | ||
| 				border: 1px solid #ccc;
 | ||
| 				border-radius: 10rpx;
 | ||
| 				text-align: center;
 | ||
| 			}
 | ||
| 
 | ||
| 			.qinc {
 | ||
| 				font-size: 50rpx;
 | ||
| 				color: #ccc;
 | ||
| 				width: 80rpx;
 | ||
| 				height: 60rpx;
 | ||
| 				text-align: center;
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	page {
 | ||
| 		background-color: #fff !important;
 | ||
| 	}
 | ||
| </style> |