瀏覽代碼

选择监测站判断、更新弹窗、录音播放、添加标品报错、收益、评论筛选有图、上架提示下架、

baijunde 1 年之前
父節點
當前提交
827ee0022a

+ 1 - 0
common/service/config.service.js

@@ -5,6 +5,7 @@ if (process.env.NODE_ENV == 'development') {
 	BASE_URL = 'https://test.baoxianzhanggui.com/locallive-java' // 测试环境
 	// BASE_URL = 'http://192.168.0.36:8080/jeecg-boot' // 开发环境
     // BASE_URL = 'http://192.168.0.52:8081/jeecg-boot' // 开发环境
+		// BASE_URL = 'http://192.168.0.42:8080/jeecg-boot' // 开发环境
 
 } else {
 	BASE_URL = 'https://test.baoxianzhanggui.com/locallive-java' // 测试环境

+ 424 - 0
components/yzhua006-update/app-update.vue

@@ -0,0 +1,424 @@
+<template>
+	<view class="wrap" v-if="popup_show">
+		<view class="popup-bg" :style="getHeight">
+			<view class="popup-content" :class="{'popup-content-show' : popup_show}">
+				<view class="update-wrap">
+					<image src="./images/img.png" class="top-img"></image>
+					<view class="content">
+						<text class="title">发现新版本V{{update_info.versionno}}</text>
+						<!-- 标题 -->
+						<view class="title-sub" v-html="update_info.title" style="font-weight: bold;"></view>
+						<!-- 升级描述 -->
+						<view class="title-sub" v-html="update_info.content" style="padding-top: 8rpx;"></view>
+						<!-- 升级按钮 -->
+						<button class="btn" v-if="downstatus < 1" @click="nowUpdate()">立即升级</button>
+						<!-- 下载进度 -->
+						<view class="sche-wrap" v-else>
+							<!-- 更新包下载中 -->
+							<view style="display: flex;align-items: center;justify-content: space-between;">
+								<view class="sche-bg">
+									<view class="sche-bg-jindu" :style="lengthWidth"></view>
+								</view>
+								<text style="color: #999999;margin-left: 4rpx;">{{width}}%</text>
+							</view>
+							<text
+								class="down-text">下载进度:{{(downSize/1024/1024 ).toFixed(2)}}M/{{(fileSize/1024/1024).toFixed(2)}}M</text>
+						</view>
+					</view>
+				</view>
+				<image src="./images/close.png" class="close-ioc" @click="closeUpdate()"></image>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	var vm;
+	export default {
+		name: "appUpdate",
+		//@是否强制更新
+		props: {
+
+		},
+		data() {
+			return {
+				popup_show: false, //弹窗是否显示
+				platform: "", //ios or android
+				version: "", //当前软件版本
+				wgtLatestVersion: "", //最新资源
+				apkLatestVersion: "", //最新整包
+				need_update: false, // 是否更新
+				downing: false, //是否下载中
+				downstatus: 0, //0未下载  1已开始 2已连接到资源  3已接收到数据  4下载完成
+				update_info: {},
+				fileSize: 0, //文件大小
+				downSize: 0, //已下载大小
+				viewObj: null, //原生遮罩view
+				force: true,
+				width: "",
+				wgtInfo: {},
+				apkInfo: {},
+			};
+		},
+		created() {
+			vm = this;
+		},
+		computed: {
+			// 下载进度计算
+			lengthWidth: function() {
+				let w = this.downSize / this.fileSize * 100;
+				let result = w;
+				this.width = Math.floor(result)
+				if (!w) {
+					w = 0
+				} else {
+					w = w.toFixed(2)
+				}
+				return {
+					width: w + "%" //return 宽度百分比
+
+				}
+			},
+			getHeight: function() {
+				let bottom = 0;
+				return {
+					"bottom": bottom + 'px',
+					"height": "auto"
+				}
+			}
+		},
+		methods: {
+			// 检查更新
+			update() {
+			
+				console.log('-----------')
+				// alert(plus.runtime.appid)
+				// 获取手机系统信息
+				uni.getSystemInfo({
+					success: function(res) {
+						vm.platform = res.platform //ios  or android
+					}
+				});
+				// 获取当前版本号
+				plus.runtime.getProperty(plus.runtime.appid, function(inf) {
+					vm.version = inf.version
+				});
+				vm.getUpdateInfo(); //获取更新信息
+					// #ifdef APP-PLUS
+				// #endif
+			},
+			// 获取线上版本信息
+			async getUpdateInfo() {
+				//向后台发起请求,获取最新版本号
+				let apkquote = await this.$http.post('/sysVersionRecord/sysVersionRecord/queryByAppId', {
+					apptype:'2',
+					appId:"__UNI__E0EA6E1"
+				});
+				vm.apkInfo = apkquote.data.result
+				vm.apkLatestVersion = apkquote.data.result.versionno;
+				let wgtquote = await this.$http.post('/sysVersionRecord/sysVersionRecord/queryByAppId', {
+					apptype:'2',
+					appId:"__UNI__E0EA6E1"
+				});
+				console.log(apkquote,wgtquote)
+				// wgtquote
+				vm.wgtInfo = wgtquote.data.result
+				vm.wgtLatestVersion = wgtquote.data.result.versionno;
+				vm.checkUpdate(); //检查是否更新
+				// var data = {
+				// 	appid: "__UNI__D4FE29A"
+				// }
+				// let res = await this.$http.get('/sysVersion/queryMaxNum', data);
+				// vm.update_info = res.data;
+				// if (vm.update_info.updateflag == '1') {
+				// 	vm.force = true;
+				// } else {
+				// 	vm.force = false;
+				// }
+				// if (!vm.update_info.platform) {
+				// 	// 后台未配置当前系统的升级数据
+				// } else {
+				// 	
+				// }
+			},
+			// 检查是否更新
+			checkUpdate() {
+				// alert('旧的:'vm.version,'----------' '新的:' vm.apkLatestVersion)
+				let apkneed = vm.compareVersion(vm.version, vm.apkLatestVersion); // 检查包版本
+				let wgtneed = vm.compareVersion(vm.version, vm.wgtLatestVersion); // 检查资源版本
+				if (apkneed) {
+					vm.update_info = vm.apkInfo;
+					vm.popup_show = true; //线上版本号大于当前安装的版本号  显示升级框
+					//页面是否有原生tabbar组件
+					// 创建原生view用来遮罩tabbar的点击事件 (如果是没有用原生的tabbar这一步可以取消)
+					vm.viewObj = new plus.nativeObj.View('viewObj', {
+						bottom: '0px',
+						left: '0px',
+						height: '10px',
+						width: '100%',
+						position: "fixed",
+						backgroundColor: "rgba(0,0,0,.6)"
+					});
+					vm.viewObj.show() //显示原生遮罩
+				} else {
+					if (wgtneed) {
+						vm.update_info = vm.wgtInfo;
+						vm.popup_show = true; //线上版本号大于当前安装的版本号  显示升级框
+						//页面是否有原生tabbar组件
+						// 创建原生view用来遮罩tabbar的点击事件 (如果是没有用原生的tabbar这一步可以取消)
+						vm.viewObj = new plus.nativeObj.View('viewObj', {
+							bottom: '0px',
+							left: '0px',
+							height: '10px',
+							width: '100%',
+							position: "fixed",
+							backgroundColor: "rgba(0,0,0,.6)"
+						});
+						vm.viewObj.show() //显示原生遮罩
+					}
+
+				}
+			},
+
+			// 取消更新
+			closeUpdate() {
+				if (vm.force) {
+					// 强制更新,取消退出app
+					plus.os.name == "Android" ? plus.runtime.quit() : plus.ios.import("UIApplication").sharedApplication()
+						.performSelector(
+							"exit");
+				} else {
+					vm.popup_show = false; //关闭升级弹窗
+					if (vm.viewObj) vm.viewObj.hide() //隐藏原生遮罩
+				}
+			},
+			// 立即更新
+			nowUpdate() {
+				if (vm.downing) return false; //如果正在下载就停止操作
+				vm.downing = true; //状态改变 正在下载中
+
+				if (/\.apk$/.test(vm.update_info.path)) {
+					// 如果是apk地址
+					vm.download_wgt() // 安装包/升级包更新
+				} else if (/\.wgt$/.test(vm.update_info.path)) {
+					// 如果是更新包
+					vm.download_wgt() // 安装包/升级包更新
+				} else {
+					plus.runtime.openURL(vm.update_info.path, function() { //调用外部浏览器打开更新地址
+						plus.nativeUI.toast("打开错误");
+					});
+				}
+			},
+			// 下载升级资源包
+			download_wgt() {
+				plus.nativeUI.showWaiting("下载更新文件..."); //下载更新文件...
+				let options = {
+					method: "get"
+				};
+				let dtask = plus.downloader.createDownload(vm.update_info.path, options, function(d, status) {
+
+				});
+				dtask.addEventListener("statechanged", function(task, status) {
+					if (status === null) {} else if (status == 200) {
+						vm.downstatus = task.state;
+						switch (task.state) {
+							case 3: // 已接收到数据  
+								vm.downSize = task.downloadedSize;
+								if (task.totalSize) {
+									vm.fileSize = task.totalSize; //服务器须返回正确的content-length才会有长度
+								}
+								break;
+							case 4:
+								vm.installWgt(task.filename); // 安装wgt包  
+								break;
+						}
+					} else {
+						plus.nativeUI.closeWaiting();
+						plus.nativeUI.toast("下载出错");
+						vm.downing = false;
+						vm.downstatus = 0;
+					}
+				});
+				dtask.start();
+			},
+
+			// 安装文件
+			installWgt(path) {
+				plus.nativeUI.showWaiting("安装更新文件..."); //安装更新文件...
+				plus.runtime.install(path, {}, function() {
+					plus.nativeUI.closeWaiting();
+					// 应用资源下载完成!
+					plus.nativeUI.alert("应用资源下载完成!", function() {
+						plus.runtime.restart();
+					});
+				}, function(e) {
+					plus.nativeUI.closeWaiting();
+					// 安装更新文件失败
+					plus.nativeUI.alert("安装更新文件失败[" + e.code + "]:" + e.message);
+					
+				});
+			},
+			// 对比版本号
+			compareVersion(ov, nv) {
+				if (!ov || !nv || ov == "" || nv == "") {
+					return false;
+				}
+				let b = false,
+					ova = ov.split(".", 4),
+					nva = nv.split(".", 4);
+				for (let i = 0; i < ova.length && i < nva.length; i++) {
+					let so = ova[i],
+						no = parseInt(so),
+						sn = nva[i],
+						nn = parseInt(sn);
+					if (nn > no || sn.length > so.length) {
+						return true;
+					} else if (nn < no) {
+						return false;
+					}
+				}
+				if (nva.length > ova.length && 0 == nv.indexOf(ov)) {
+					return true;
+				} else {
+					return false;
+				}
+			},
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.popup-bg {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: var(--window-bottom);
+		width: 750rpx;
+		background-color: rgba(0, 0, 0, 0.6);
+		z-index: 99999999;
+	}
+
+	.popup-content {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+	}
+
+	.popup-content-show {
+		animation: mymove 500ms;
+		transform: scale(1);
+	}
+
+	@keyframes mymove {
+		0% {
+			transform: scale(0);
+			/*开始为原始大小*/
+		}
+
+		100% {
+			transform: scale(1);
+		}
+	}
+
+	.update-wrap {
+		width: 580rpx;
+		border-radius: 18rpx;
+		position: relative;
+		display: flex;
+		flex-direction: column;
+		background-color: #ffffff;
+		padding: 170rpx 30rpx 0;
+
+		.top-img {
+			position: absolute;
+			left: 0;
+			width: 100%;
+			height: 256rpx;
+			top: -128rpx;
+		}
+
+		.content {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			padding-bottom: 40rpx;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #3a63f6;
+			}
+
+			.title-sub {
+				text-align: center;
+				font-size: 24rpx;
+				color: #666666;
+				padding-top: 20rpx;
+			}
+
+			.btn {
+				width: 460rpx;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				color: #ffffff;
+				font-size: 30rpx;
+				height: 80rpx;
+				line-height: 80rpx;
+				border-radius: 100px;
+				background-color: #3a63f6;
+				margin-top: 20rpx;
+			}
+		}
+	}
+
+	.close-ioc {
+		width: 70rpx;
+		height: 70rpx;
+		margin-top: 30rpx;
+	}
+
+	.sche-wrap {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: flex-end;
+		padding: 10rpx 50rpx 0;
+
+		.sche-wrap-text {
+			font-size: 24rpx;
+			color: #666;
+			margin-bottom: 20rpx;
+		}
+
+		.sche-bg {
+			position: relative;
+			background-color: #cccccc;
+			height: 30rpx;
+			border-radius: 100px;
+			width: 480rpx;
+			display: flex;
+			align-items: center;
+
+			.sche-bg-jindu {
+				position: absolute;
+				left: 0;
+				top: 0;
+				height: 30rpx;
+				min-width: 40rpx;
+				border-radius: 100px;
+				background: url(images/round.png) #5775e7 center right 4rpx no-repeat;
+				background-size: 26rpx 26rpx;
+			}
+		}
+
+		.down-text {
+			font-size: 24rpx;
+			color: #5674e5;
+			margin-top: 16rpx;
+		}
+	}
+</style>

二進制
components/yzhua006-update/images/close.png


二進制
components/yzhua006-update/images/img.png


二進制
components/yzhua006-update/images/round.png


二進制
components/yzhua006-update/images/update-img.png


+ 4 - 3
manifest.json

@@ -2,8 +2,8 @@
     "name" : "掌柜生活商户版",
     "appid" : "__UNI__E0EA6E1",
     "description" : "",
-    "versionName" : "0.0.2",
-    "versionCode" : 2,
+    "versionName" : "1.0.1",
+    "versionCode" : 101,
     "transformPx" : false,
     "app-plus" : {
         /* 5+App特有相关 */
@@ -48,7 +48,8 @@
                     "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
+                ],
+                "targetSdkVersion" : 30
             },
             "ios" : {
                 "privacy" : {

+ 1 - 0
pages/evaluate/evaluate.vue

@@ -146,6 +146,7 @@
 						tip: '暂无相关数据'
 					}
 				},
+				
 			};
 		},
 		mounted() {

+ 13 - 1
pages/login/login.vue

@@ -1,5 +1,6 @@
 <template>
 	<view class="zai-box">
+		<app-update ref="app_update"></app-update>
 		<!-- <scroll-view scroll-y class="page"> -->
 		<!-- <view class="text-center" :style="[{animation: 'show ' + 0.4+ 's 1'}]"> -->
 		<!-- <image src="../../static/login/bejing.png" mode='aspectFit' class="zai-header "></image> -->
@@ -70,8 +71,11 @@
 import { ACCESS_TOKEN, USER_NAME, USER_INFO } from "@/common/util/constants"
 import { mapActions } from "vuex"
 import configService from '@/common/service/config.service.js';
-
+	import appUpdate from "@/components/yzhua006-update/app-update.vue"; //app更新组件
 export default {
+	components: {
+		appUpdate
+	},
 	data() {
 		return {
 			sex: [{
@@ -110,6 +114,14 @@ export default {
 		});
 		// #endif
 	},
+	beforeCreate() {
+		setTimeout(() => {
+			this.$refs.app_update.update(); //调用子组件检查更新方法
+			setTimeout(() => {
+				if (this.$refs.app_update.popup_show == true && this.$refs.app_update.force == true) {}
+			}, 100)
+		}, 500)
+	},
 	computed: {
 
 		isSendSMSEnable() {

+ 34 - 26
pages/order/index.vue

@@ -7,9 +7,9 @@
 				<view class="case">
 					<view class="select_type">
 						<div class="tab-item" :class="tabIndex == 0?'active':''"
-							@click="tabIndex=0;productName='';productStatus=0;">普通订单</div>
+							@click="getList(servicePage),tabIndex=0;productName='';productStatus=0;">普通订单</div>
 						<div class="tab-item" :class="tabIndex == 1?'active':''"
-							@click="tabIndex=1;productName='';productStatus=0;">服务订单</div>
+							@click="getserviceList(servicePage),tabIndex=1;productName='';productStatus=0;">服务订单</div>
 					</view>
 				</view>
 
@@ -284,7 +284,11 @@
 				paramState: '', //上传完图片修改状态
 				serveType: '', //服务类型
 				iseEvaluate: false, //评价弹窗显隐
-				userId: '' //评论用户id
+				userId: '', //评论用户id
+				servicePage: {
+					num: 1,
+					size: 10
+				}
 			}
 		},
 		methods: {
@@ -293,14 +297,19 @@
 				uni.hideTabBar()
 			},
 			onEndTimeChange(val) {
-				this.orderList = []
-				this.buyStartTime = val.startDate
-				this.buyEndTime = val.endDate
-				let page = {
-					num: 1,
-					size: 10
+				if (this.tabIndex == 0) {
+					this.orderList = []
+					this.buyStartTime = val.startDate
+					this.buyEndTime = val.endDate
+					let page = {
+						num: 1,
+						size: 10
+					}
+					this.getList(page)
+				} else {
+
 				}
-				this.getList(page)
+
 			},
 			cutPopup() {
 				this.isYear = false
@@ -329,12 +338,12 @@
 				this.currentIndex = index
 				this.statusCode = item.type
 				this.serviceList = []
-				// let page = {
-				// 	num: 1,
-				// 	size: 10
-				// }
-				
-				this.mescroll.resetUpScroll();
+				let page = {
+					num: 1,
+					size: 10
+				}
+				this.getserviceList(page)
+				// this.mescroll.resetUpScroll();
 			},
 			searchList() {
 				if (this.tabIndex == 0) {
@@ -373,9 +382,9 @@
 					buyEndTime: this.buyEndTime
 				}
 				this.$http.post("/app/order/locaOrder/list", data).then(res => {
-						this.orderList = this.orderList.concat(res.data.result.records)
-						this.mescroll.endSuccess(res.data.result.records.length, res.data.result.total);
-						uni.showTabBar()
+					this.orderList = this.orderList.concat(res.data.result.records)
+					this.mescroll.endSuccess(res.data.result.records.length, res.data.result.total);
+					uni.showTabBar()
 				}).catch(() => {
 					this.mescroll.endErr()
 				})
@@ -394,10 +403,8 @@
 					status: this.statusCode
 				}
 				this.$http.post("/ts/merchant/serviceOrder", data).then(res => {
-						if (res.data.code == 200) {
-							this.serviceList =this.serviceList.cancat(res.data.result.records) 
-							this.mescroll.endSuccess(res.data.result.records.length, res.data.result.total);
-						}
+						this.serviceList = this.serviceList.concat(res.data.result.records)
+						this.mescroll.endSuccess(res.data.result.records.length, res.data.result.total);
 					})
 					.catch(() => {
 						this.mescroll.endErr()
@@ -441,7 +448,7 @@
 					//客户送车,商户收车
 					if (item.statusCode == 3) {
 						this.uptype = 2
-					}else{
+					} else {
 						this.uptype = 3
 					}
 				}
@@ -841,8 +848,9 @@
 							color: #F0761D;
 						}
 					}
-					.ticket{
-						image{
+
+					.ticket {
+						image {
 							width: 50rpx;
 							height: 50rpx;
 						}

+ 33 - 25
pages/order/serviceOrder/live.vue

@@ -22,7 +22,7 @@
 			<view class="car_data">
 				<view class="fat">
 					<view class="fat_title">备注信息</view>
-					<view class="message" v-for="item in historyList" :key="item.id">
+					<view class="message" v-for="(item,index) in historyList" :key="item.id">
 						<view class="top">
 							<view class="left">
 								<view class="img">
@@ -33,12 +33,12 @@
 									<span>{{item.createTime}}</span>
 								</view>
 							</view>
-							<view class="play">
-								<image src="/static/play.png" mode="" @click="play(item)"></image><br />
-								12.03
+							<view class="play" v-if="item.recordUrl.length>0">
+								<image src="/static/pause.png" mode="" @click="exchangeStatus(item),play(item)" v-if=" item.isPlay"></image>
+								<image src="/static/play.png" mode="" @click="exchangeStatus(item),play(item)" v-else></image>
 							</view>
 						</view>
-						<view class="content">
+						<view class="content" >
 							{{item.msgContent}}
 						</view>
 					</view>
@@ -50,21 +50,14 @@
 </template>
 
 <script>
-	
-		import configService from '../../../common/service/config.service'
+	import configService from '../../../common/service/config.service'
 	export default {
 		data() {
 			return {
 				taskId: 1,
 				form: [],
-				historyList: [{
-					time: '2025.2.12 13:22:30',
-					url: 'https://pic.rmb.bdstatic.com/bjh/news/9e4e3aca4eb384cf0ad43e26cae97135.jpeg',
-					name: '用户昵称',
-					content: '额外强制消费',
-					type: 1,
-				}, ],
-				audioContext:null
+				historyList: [],
+				audioContext: null,
 			}
 		},
 		methods: {
@@ -75,7 +68,6 @@
 				});
 			},
 			getLive() {
-				console.log(this.taskId)
 				this.$http.get("/merchant/localTsCustomerServiceDict/list?taskId=" + this.taskId + '&source=' + '1').then(
 					res => {
 						if (res.data.code == 200) {
@@ -97,30 +89,46 @@
 									}
 								})
 								item.categoryList = temp
-								if(item.categoryList.length> 0){
+								if (item.categoryList.length > 0) {
 									list.push(item)
 								}
 							})
 							this.form = list
-							
+
 						}
 					})
 			},
-			play(item){
+			//播放,暂停
+			play(item) {
+				const audioContext = uni.createInnerAudioContext();
+				audioContext.autoplay = true;
+				audioContext.src = configService.apiUrl + '/' + item.recordUrl
+				if(item.isPlay){
+					audioContext.onPlay(() => {
+						console.log('开始播放');
+					});
+				}else{
+					audioContext.pause();
+					console.log('音频已暂停');
+				}
 				
-				this.audioContext = uni.createInnerAudioContext();
-				    // this.audioContext.src = configService.apiUrl + '/'+item.recordUrl.split(',')[0];
-						 this.audioContext.src = 'https://your-domain.com/audio/example.mp3'
-						console.log(this.audioContext)
-						this.audioContext.play();
+			},
+			exchangeStatus(item, index) {
+				item.isPlay = !item.isPlay
+					this.$forceUpdate()
 			},
 			getHistroyList() {
 				let data = {
 					taskId: this.taskId
 				}
 				this.$http.post('/merchant/localTsCustomerServiceTaskMsg/queryList', data).then((res) => {
-					console.log(res);
 					this.historyList = res.data.result
+					this.historyList.forEach(item => {
+						if (item.recordUrl) {
+							item.isPlay = false
+						}
+					})
+					console.log(this.historyList);
 				})
 			},
 		},

+ 1 - 1
pages/product/index.vue

@@ -82,7 +82,7 @@
 					<view class="delist" @click.stop="sell(item)" v-if="item.productStatus==0">
 						上架
 					</view>
-					<view class="delist select" @click.stop="goSelect(item)" style="margin-left: 20rpx;">
+					<view class="delist select" @click.stop="goSelect(item)" style="margin-left: 20rpx;" v-if="item.categoryId.includes('1909434886438043649')">
 						选择检测站
 					</view>
 					<view class="delist" @click.stop="delist(item)" v-if="item.productStatus==1">