Pārlūkot izejas kodu

Merge branch 'lw_test' into gyq_test

郭宇琦 2 nedēļas atpakaļ
vecāks
revīzija
d666f5a039

+ 2 - 1
App.vue

@@ -71,7 +71,8 @@
 			reportData: {},
 			reponseData: {},
 			bluetoothConfig: {},
-			deviceBTBMSBuf: {} // 用于分包组包
+			deviceBTBMSBuf: {} ,// 用于分包组包
+			permissionArr:[]
 		}
 	};
 </script>

+ 6 - 4
common/bluetooth/ZXCar.js

@@ -222,9 +222,9 @@ async function readBinBinarayToCommand() {
 }
 
 function sendNextCommand(mac_id) {
-	console.log('开始发送指令');
+	console.log(currentCommandIndex,commands.length,'开始发送指令');
 	// console.log(commands[currentCommandIndex],'command');
-    if (currentCommandIndex >= commands.length-1) {
+    if (currentCommandIndex >= commands.length) {
 		uni.hideLoading();
 		common.simpleToast('所有指令发送完成', 2000)
         return;
@@ -258,9 +258,11 @@ function sendNextCommand(mac_id) {
 }
 
 function splitArrayIntoChunks(array, chunkSize) {
-    const numChunks = Math.ceil(array.length / chunkSize);
+	const newArr=array.slice(16383)
+    const numChunks = Math.ceil(newArr.length / chunkSize);
+	
     return Array.from({ length: numChunks }, (_, i) => {
-        return array.slice(i * chunkSize, (i + 1) * chunkSize);
+        return newArr.slice(i * chunkSize, (i + 1) * chunkSize);
     });
 }
 

+ 2 - 0
common/config.js

@@ -170,5 +170,7 @@ var config = {
 	API_FLK_ADD_SHARE_USER: api_web_url + '?r=flk/car/add-share-user',
 	//删除用车人
 	API_FLK_REMOVE_SHARE_USER: api_web_url + '?r=flk/car/remove-share-user',
+	//中控
+	API_FLK_CAR_REMOTE_CONTROL: api_web_url + '?r=flk/car/remote-control',
 };
 module.exports = config;

+ 10 - 2
common/storage.js

@@ -35,32 +35,40 @@ const ICONS = {
 }
 const activeTabs = [{
 		name: i18n.t('开机'),
+		type:'tronOnOrOff',
 		iconUrl: `${QINIU_URL}Fp5T9lSNakoiioji6S7W4DmFQ_ys`,
-		isLock: true
+		isLock: true,
+		isTurnOn:1
 	},
 	{
 		name: i18n.t('闪灯鸣笛'),
+		type:'findCar',
 		iconUrl: `${QINIU_URL}FpeQsDh2dbeTullNLI-HhWj4WAQS`
 	},
 	{
 		name: i18n.t('打开座桶'),
+		type:'openSeatBag',
 		iconUrl: `${QINIU_URL}FppwhbFzrEmDeJQgZJtDTu6WOoMZ`
 	},
 	{
 		name: i18n.t('打开尾箱'),
+		type:'openTailBox',
 		iconUrl: `${QINIU_URL}Fv3KLuYWEeV5IM4_2sMbmur7yZtz`
 	}
 ]
 const toBeSelectTabs = [{
 		name:i18n.t('胎压'),
+		type:'tirePressure',
 		iconUrl: `${QINIU_URL}FmbcjmvoB4J3CT1hrbjNX4kxv9Zq`
 	},
 	{
-		name: i18n.t('点出信息'),
+		name: i18n.t('电池信息'),
+		type:'batteryInfo',
 		iconUrl: `${QINIU_URL}Fnx_4tLoq1ytvVA0UemepWisI73A`
 	},
 	{
 		name: i18n.t('导航'),
+		type:'navigation',
 		iconUrl: `${QINIU_URL}FrA_ouJtDp-39g7rMBI0EYr2czVE`
 	}
 ]

+ 151 - 1
js_sdk/wa-permission/permission.js

@@ -265,9 +265,159 @@ function checkSystemEnableLocation() {
 	}
 }
 
+
+//获取安卓手机权限
+function requestAndroidPermissions() {
+	const locationPermission=checkLocationPermission()
+	const optimizationStatus=checkBatteryOptimizationStatus()
+	// const runningPermission=checkBackgroundRunningPermission()
+	// const lockStatus=checkAppLockStatus()
+	const permissionArr=[
+		{type: 'location',state:locationPermission,title: ('位置权限'), desc: '打开手机定位,并运行APP始终使用'},
+		{type: 'battery',state:optimizationStatus,title: ('电池优化'),  desc: '打开电池优化设置, 将弗兰克APP加入保护名单'},
+		// {type: 'appLock',state:lockStatus},
+		// {type: 'backstage',state:runningPermission},
+		// {type: 'appLock',state:lockStatus},
+	]
+	return permissionArr
+}
+
+
+function checkLocationPermission() {
+    var main = plus.android.runtimeMainActivity();
+    var PackageManager = plus.android.importClass("android.content.pm.PackageManager");
+    
+    // 定义定位权限常量
+    var FINE_PERMISSION = "android.permission.ACCESS_FINE_LOCATION";
+    var COARSE_PERMISSION = "android.permission.ACCESS_COARSE_LOCATION";
+    
+    // 检查精确和粗略定位权限状态
+    var hasFineLocation = main.checkSelfPermission(FINE_PERMISSION) === PackageManager.PERMISSION_GRANTED;
+    var hasCoarseLocation = main.checkSelfPermission(COARSE_PERMISSION) === PackageManager.PERMISSION_GRANTED;
+    
+    if (hasFineLocation || hasCoarseLocation) {
+        console.log("✅ 定位权限已授予");
+        return true;
+    } else {
+        console.log("⚠️ 定位权限未授予");
+        return false;
+    }
+}
+
+function checkBatteryOptimizationStatus() {
+    var main = plus.android.runtimeMainActivity();
+    var Context = plus.android.importClass("android.content.Context");
+    var PowerManager = plus.android.importClass("android.os.PowerManager");
+    
+    var powerManager = main.getSystemService(Context.POWER_SERVICE);
+    var packageName = main.getPackageName();
+    
+    var isIgnoringBatteryOptimizations = powerManager.isIgnoringBatteryOptimizations(packageName);
+    
+    if (isIgnoringBatteryOptimizations) {
+        console.log("✅ 应用已被白名单豁免,未受电池优化限制");
+        return true;
+    } else {
+        console.log("⚠️ 应用受电池优化限制");
+        return false;
+    }
+}
+
+function openBatteryOptimization() {
+    var Intent = plus.android.importClass("android.content.Intent");
+    var Settings = plus.android.importClass("android.provider.Settings");
+    var Uri = plus.android.importClass("android.net.Uri");
+
+    var main = plus.android.runtimeMainActivity();
+    var intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
+    var uri = Uri.parse("package:" + main.getPackageName());
+    intent.setData(uri);
+    main.startActivity(intent);
+}
+
+
+function checkBackgroundRunningPermission() {
+    var main = plus.android.runtimeMainActivity();
+    var Context = plus.android.importClass("android.content.Context");
+    var ActivityManager = plus.android.importClass("android.app.ActivityManager");
+
+    var activityManager = main.getSystemService(Context.ACTIVITY_SERVICE);
+    var runningAppProcesses = activityManager.getRunningAppProcesses();
+    console.log(runningAppProcesses,'runningAppProcesses');
+    var packageName = main.getPackageName();
+    
+	if('size' in runningAppProcesses){
+		for (var i = 0; i < runningAppProcesses.size(); i++) {
+		    var processInfo = runningAppProcesses.get(i);
+		    if (processInfo.processName === packageName) {
+		        console.log("✅ 应用正在后台运行");
+		        return true;
+		    }
+		}
+	}else{
+		console.log("⚠️ 应用可能未开启后台运行权限");
+		return false;	
+	}
+   
+}
+
+
+function checkAppLockStatus() {
+    var main = plus.android.runtimeMainActivity();
+    var Context = plus.android.importClass("android.content.Context");
+    var AppOpsManager = plus.android.importClass("android.app.AppOpsManager");
+
+    var appOps = main.getSystemService(Context.APP_OPS_SERVICE);
+    var packageName = main.getPackageName();
+    var uid = plus.android.importClass("android.os.Process").myUid();
+	
+    var mode = appOps.checkOpNoThrow("android:get_usage_stats", uid, packageName);
+	console.log(AppOpsManager.OPSTR_GET_USAGE_STATS ,mode,AppOpsManager.MODE_ALLOWED);
+    if (mode === AppOpsManager.MODE_ALLOWED) {
+        console.log("✅ 应用未被应用锁限制");
+        return true;
+    } else {
+        console.log("⚠️ 应用可能被应用锁限制");
+        return false;
+    }
+}
+function openAppLockSettings() {
+    const brand = uni.getSystemInfoSync().brand.toLowerCase();
+    console.log(brand);
+    if (brand.includes("xiaomi")) {
+        plus.runtime.openURL("miui://securitycenter",(res)=>{
+			console.log(res,'test');
+		}); // 小米 - 安全中心
+    } else if (brand.includes("huawei")) {
+        plus.runtime.openURL("huawei://settings/security/ApplicationLock"); // 华为 - 应用锁
+    } else if (brand.includes("oppo")) {
+        plus.runtime.openURL("oppo://securecenter/appLock"); // OPPO
+    } else if (brand.includes("vivo")) {
+        plus.runtime.openURL("vivosec://AppLock"); // VIVO
+    } else {
+        openGeneralSettings(); // 其他品牌通用方法
+    }
+}
+function openGeneralSettings() {
+    var Intent = plus.android.importClass("android.content.Intent");
+    var Settings = plus.android.importClass("android.provider.Settings");
+
+    var main = plus.android.runtimeMainActivity();
+    var intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); // 安全设置
+    main.startActivity(intent);
+}
+
+
+
 module.exports = {
 	judgeIosPermission: judgeIosPermission,
 	requestAndroidPermission: requestAndroidPermission,
 	checkSystemEnableLocation: checkSystemEnableLocation,
-	gotoAppPermissionSetting: gotoAppPermissionSetting
+	gotoAppPermissionSetting: gotoAppPermissionSetting,
+	checkBatteryOptimizationStatus,
+	checkAppLockStatus,
+	openBatteryOptimization,
+	checkBackgroundRunningPermission,
+	requestAndroidPermissions,
+	openAppLockSettings,//前往打开应用锁
 }

+ 3 - 1
manifest.json

@@ -35,6 +35,7 @@
                     "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.ADD_VOICEMAIL\"/>",
+                    "<uses-permission android:name=\"android.permission.BATTERY_STATS\"/>",
                     "<uses-permission android:name=\"android.permission.BIND_TV_INPUT\"/>",
                     "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
                     "<uses-permission android:name=\"android.permission.CAMERA\"/>",
@@ -47,7 +48,8 @@
                     "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
                     "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>"
+                    "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
+                    "<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>"
                 ],
                 "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
                 "autoSdkPermissions" : false

+ 0 - 1
pages/bluetoothUnlock/bluetoothUnlockAuth.vue

@@ -30,7 +30,6 @@ export default {
     methods: {
         open() {
             this.show = true;
-            console.log(111, this.platform)
         },
         _initPlatform() {
             const systemInfo = uni.getSystemInfoSync();

+ 31 - 36
pages/bluetoothUnlock/components/AndroidUnlockAuth.vue

@@ -13,8 +13,8 @@
             <view class="desc-wrap">
               <view class="title-row">
                 <view class="title">{{ item.title }}</view>
-                <view :class="['turn-on-switch', permisionCheckObj[item.type] && 'is-open']">
-                  {{ permisionCheckObj[item.type] ? $t('已开启') : $t('未开启') }}
+                <view :class="['turn-on-switch', item.state && 'is-open']">
+                  {{ item.state ? $t('已开启') : $t('未开启') }}
                 </view>
               </view>
               <view class="desc">{{ item.desc }}</view>
@@ -28,7 +28,9 @@
 </template>
 
 <script>
+	var app = getApp();
 	var bluetooth = require('@/common/bluetooth.js');
+	var common = require('@/common/common.js');
 import permision from "@/js_sdk/wa-permission/permission.js"
 export default {
   props: {
@@ -44,20 +46,22 @@ export default {
   data() {
     return {
       showDialog: this.value,
-      permisionCheckObj: {}
-    }
-  },
-  computed: {
-    authStepList() {
-      const lang = v => this.$t(v)
-      return [
-        { title: ('位置权限'), type: 'location', desc: '打开手机定位,并运行APP始终使用' },
-        { title: ('电池优化'), type: 'battery', desc: '打开电池优化设置, 将弗兰克APP加入保护名单' },
-        { title: ('后台运行'), type: 'backstage', desc: '打开后台运行权限 清选择手动控制' },
-        { title: ('打开应用锁'), type: 'appLock', desc: '打开应用权限锁' }
-      ]
+      permisionCheckObj: {},
+	  authStepList:[],
+	  isOpenAllPermission:false,//是否打开所有需要权限
     }
   },
+  // computed: {
+  //   authStepList() {
+  //     const lang = v => this.$t(v)
+  //     return [
+  //       { title: ('位置权限'), type: 'location', desc: '打开手机定位,并运行APP始终使用' },
+  //       { title: ('电池优化'), type: 'battery', desc: '打开电池优化设置, 将弗兰克APP加入保护名单' },
+  //       // { title: ('后台运行'), type: 'backstage', desc: '打开后台运行权限 清选择手动控制' },
+  //       // { title: ('打开应用锁'), type: 'appLock', desc: '打开应用权限锁' }
+  //     ]
+  //   }
+  // },
   watch: {
     value(newValue) {
       this.showDialog = newValue
@@ -68,16 +72,7 @@ export default {
   },
   methods: {
     async _initCheckdPermission() {
-      
-      const permissionsToCheck = [
-        { key: 'location', permission: 'android.permission.ACCESS_FINE_LOCATION' },
-        { key: 'backstage', permission: 'android.permission.SET_PROCESS_FOREGROUND' }
-      ]
-
-      for (const { key, permission } of permissionsToCheck) {
-        const result = await this.requestAndroidPermission(permission)
-        this.$set(this.permisionCheckObj, key, result)
-      }
+		this.authStepList=app.globalData.permissionArr
     },
     // vue的method里编写如下代码
     async requestAndroidPermission(permisionID) {
@@ -99,26 +94,26 @@ export default {
       //   showCancel: false
       // });
     },
+
     enablePermissions({ type }) {
-      if (!this.permisionCheckObj[type]) {
-        permision.gotoAppPermissionSetting()
-      }
+		console.log(type,'type');
+      // if (!this.permisionCheckObj[type]) {
+      //   permision.gotoAppPermissionSetting()
+      // }
     },
     linkTo() {
-		// uni.navigateTo({ url: '/pages/bluetoothUnlock/bluetoothPair' })
-      const allPermissionsGranted = Object.values(this.permisionCheckObj).every(value => value === true);
-      if (allPermissionsGranted) {
-        this.close()
-        uni.navigateTo({ url: '/pages/bluetoothUnlock/bluetoothPair' })
-      } else {
-        permision.gotoAppPermissionSetting()
-      }
+		uni.navigateTo({ url: '/pages/bluetoothUnlock/bluetoothPair' })
+      // if (!this.isOpenAllPermission) {
+      //   this.close()
+      //   uni.navigateTo({ url: '/pages/bluetoothUnlock/bluetoothPair' })
+      // } else {
+      //   permision.gotoAppPermissionSetting()
+      // }
     },
     close() {
       this.$emit('input', false)
     },
 		bluetoothClose: function() {
-		console.log(11112222);
 			bluetooth.closeBluetoothAdapter();
 			bluetooth.closeDevice(
 				"900000997",

+ 2 - 1
pages/carFunctionSet/more.vue

@@ -98,12 +98,13 @@
 				this.toBeSelectTabs = getFunctionTag().tag
 			},
 			toggleEdit(e) {
-				this.isActiveEdit = e
+				// this.isActiveEdit = e
 			},
 			addItemTab(tab) {
 				const index = this.toBeSelectTabs.findIndex(t => t.name === tab.name)
 				if (index !== -1) {
 					const removedTab = this.toBeSelectTabs.splice(index, 1)[0]
+					console.log(removedTab,index,this.realActiveTabs.length);
 					this.activeTabs.push(removedTab)
 					if (this.realActiveTabs.length == this.MAX_TAB_LEN) {
 						this.isActiveEdit = false

+ 2 - 2
pages/common/wxs/tools.sjs

@@ -71,7 +71,7 @@ var formatTimeDate = function(datetime) {
 	return formatNumber(month) + '月' + formatNumber(day) + '日 ' + formatNumber(hour) + ':' + formatNumber(minute);
 }
 
-// 时间戳格式化 返回x月x日 x:x
+// 时间戳格式化 返回x-x x:x
 var formatTimeSecond = function(datetime) {
 	if (datetime == 0) {
 		return ""
@@ -82,7 +82,7 @@ var formatTimeSecond = function(datetime) {
 	var hour = date.getHours()
 	var minute = date.getMinutes()
 	var second = date.getSeconds()
-	return formatNumber(month) + '.' + formatNumber(day) + '-' + formatNumber(hour) + ':' + formatNumber(minute);
+	return formatNumber(month) + '-' + formatNumber(day) + ' ' + formatNumber(hour) + ':' + formatNumber(minute);
 }
 
 var formatDateSplit = function(dateString) {

+ 1 - 1
pages/common/wxs/tools.wxs

@@ -159,7 +159,7 @@ var formatTimeSecond = function(datetime) {
 	var hour = date.getHours()
 	var minute = date.getMinutes()
 	var second = date.getSeconds()
-	return formatNumber(month) + '.' + formatNumber(day) + '-' + formatNumber(hour) + ':' + formatNumber(minute);
+	return formatNumber(month) + '-' + formatNumber(day) + ' ' + formatNumber(hour) + ':' + formatNumber(minute);
 }
 
 var countToDay = function(count, unit) {

+ 98 - 29
pages/index/components/control/control.vue

@@ -2,8 +2,8 @@
     <view class="container-view-contril">
 		<scroll-view class="scroll-view flex-row" scroll-x="true">
 			<view @tap="tapOpen" v-for="(item,index) of contrilList" :key="index" :data-item="item" class="contril-item flex-row">
-				<img class="contril-item-img"  :src="item.iconUrl" alt="">
-				<text>{{item.name}}</text>
+				<img class="contril-item-img"  :src="item.isTurnOn==0?item.offUrl:item.iconUrl" alt="">
+				<text >{{item.name}}</text>
 			</view>
 			<view class="contril-item flex-row" @tap="toMoreFunctionSet">
 				<img class="contril-item-img" src="https://qiniu.bms16.com/Ft3pNyStT22LP8Ds1Mru2LoTHadx" alt="">
@@ -64,6 +64,14 @@
 <script>
 	var app = getApp();
 	var bluetooth = require('@/common/bluetooth.js');
+	var config = require('@/common/config.js');
+	var common = require('@/common/common.js');
+	var http = require('@/common/http.js');
+	import i18n from '@/locale/index.js'
+	import {
+			getFunctionTag,
+			setFunctionTag
+		} from '@/common/storage.js';
 export default {
 	props:{
 		contrilList: {
@@ -77,7 +85,8 @@ export default {
 			popText:'',
 			popupShow:false,
 			controlType:null,//选择的车辆控制
-			isShowMore:false
+			isShowMore:false,
+			car_line:true
 		};
     },
 	mounted() {
@@ -89,39 +98,99 @@ export default {
      */
     methods: {
 		tapOpen(e){
-			const {name} = e.currentTarget.dataset.item;
+			console.log( getFunctionTag().activeTag, getFunctionTag());
+			const {name,type} = e.currentTarget.dataset.item;
 			this.setData({
 				popText:name,
+				cmdType:type,
 				popupShow:true
 			})
 		},
 		tapBlueToothCmd(){
-			// const isLock=this.contrilList.map(i=>i.isLock||false)
-			if(this.popText=='开机'){
-				bluetooth.turnOnCar('900000997',()=>{
-					console.log('发送开机指令结束');
-				})
-			}else if(this.popText=='闪灯鸣笛'){
-				bluetooth.findCarCmd('900000997',()=>{
-					console.log('发送闪灯鸣笛指令结束');
-				})
-			}else if(this.popText=='打开座桶'){
-				bluetooth.openCarSeat('900000997',()=>{
-					console.log('发送打开座桶指令结束');
-				})
-			}else if(this.popText=='打开尾箱'){
-				bluetooth.openCarTrunk('900000997',()=>{
-					console.log('发送打开尾箱指令结束');
-				})
-			}else if(this.popText=='关机'){
-				bluetooth.turnOffCar('900000997',()=>{
-					console.log('发送关机指令结束');
-				})
-			}else if(this.popText=='胎压'){
-				bluetooth.getCarPressure('900000997',()=>{
-					console.log('发送胎压指令结束');
-				})
+			const car_info= uni.getStorageSync('car_info');
+
+			// 判断车辆是否在线状态
+			if (this.car_line) {
+				if(this.cmdType=='batteryInfo'){
+					uni.navigateTo({
+						url:`/pages/batteryDetail/batteryDetail`
+					})
+				}else if(this.cmdType=='navigation'){
+					const {
+						address,
+						latitude,
+						longitude,
+						car_name
+					} =car_info
+					uni.openLocation({
+						latitude: latitude - 0,
+						longitude: longitude - 0,
+						scale: 15,
+						name: car_name,
+						address: address,
+						success: function (res) {},
+					})
+				}else if(this.cmdType=='turnOnOrOff'){
+					const switchType=this.contrilList.find(item => item.isTurnOn)
+					const pData={
+						car_sn:car_info.car_sn,
+						switch:switchType
+					}
+					const me=this
+					common.loading();
+					http.postApi(config.API_FLK_CAR_SWITCH, pData, (resp) => {
+						uni.hideLoading();
+						if (resp.data.code === 200) {
+							common.simpleToast(me.popText + '成功');
+							const activeTag=me.contrilList.map(item=>{
+								item.isTurnOn=(item.isTurnOn==1)?0:1
+								item.name=i18n.t((item.isTurnOn==1)?'关机':'开机')
+								return item
+							})
+							const tag=getFunctionTag().tag
+							setFunctionTag({activeTag,tag})
+							
+						} else {
+							common.simpleToast(resp.data.msg);
+						}
+					});
+				}else{
+					const testArr=[
+						{type:'findCar',opt_type:1},
+						{type:'openSeatBag',opt_type:0},
+						{type:'openTailBox',opt_type:2},
+						]
+					const pData = testArr.find(i=>i.type===this.cmdType)
+					const me=this
+					common.loading();
+					http.postApi(config.API_FLK_CAR_REMOTE_CONTROL, pData, (resp) => {
+						uni.hideLoading();
+						if (resp.data.code === 200) {
+							common.simpleToast(me.popText + '成功');
+						} else {
+							common.simpleToast(resp.data.msg);
+						}
+					});
+				}
+			} else {
+				const isTurnOn=this.contrilList.find(item => item.isTurnOn).isTurnOn==1
+				const bluetoothCommands = {
+					'turnOnOrOff': isTurnOn?bluetooth.turnOnCar:bluetooth.turnOffCar,
+					'findCar': bluetooth.findCarCmd,
+					'openSeatBag': bluetooth.openCarSeat,
+					'openTailBox': bluetooth.openCarTrunk,
+					'tirePressure': bluetooth.getCarPressure
+				};
+				
+				const command = bluetoothCommands[this.cmdType];
+				if (command) {
+					command('900000997', () => {
+						console.log(`发送${this.popText}指令结束`);
+					});
+				}
 			}
+			this.popupShow=false
+
 		},
 		closePopup(){
 			this.popupShow=false

+ 56 - 16
pages/index/index.vue

@@ -18,18 +18,20 @@
 			</view> -->
 			<view class="car-img-view">
 				<view class="quantity-view flex-row">
-					<text class="quantity flex-row">88 <text style="font-size: 28rpx;font-weight: 500;">%</text></text>
-					<u-line-progress style="width: 100rpx;" active-color="#2ADA62" height="10" :show-percent="false" :percent="70"></u-line-progress>
+					<text class="quantity flex-row">{{car_info.soc}} <text style="font-size: 28rpx;font-weight: 500;">%</text></text>
+					<u-line-progress style="width: 100rpx;" active-color="#2ADA62" height="10" :show-percent="false" :percent="car_info.soc"></u-line-progress>
 					<text class="quantity-text flex-row">
 						<text style="font-weight:400;font-size: 22rpx;">{{$t("续航")}}</text>
-						<text style="font-size: 36rpx;">54</text><text style="font-size: 30rpx;">km</text> 
+						<text style="font-size: 36rpx;">{{endurance}}</text><text style="font-size: 30rpx;">km</text> 
 					</text>
 				</view>
-				<img src="https://qiniu.bms16.com/Fg8_p7083jpsy8BXG4bR6yMs7jQX" style="width: 100%;height: 526rpx;" alt="">
+				<!-- <img :src="car_info.model_images||'https://qiniu.bms16.com/Fg8_p7083jpsy8BXG4bR6yMs7jQX'" style="width: 100%;height: 526rpx;" alt=""> -->
+				<img :src="'https://qiniu.bms16.com/Fg8_p7083jpsy8BXG4bR6yMs7jQX'" style="width: 100%;height: 526rpx;" alt="">
 				<view class="flex-row align-center update-time-view" >
-					<text style="margin-right: 10rpx;">{{$t("车辆已关机")}} </text>
-					<text style="margin-right: 10rpx;">{{$t("更新于")}} {{car_info.heart_time}}11-25 23:05 </text>
-					<img src="https://qiniu.bms16.com/FsL6XWGoIhfsVB7jRg6EGFVsuaTZ" style="width: 24rpx;height: 32rpx;" alt="">
+					<text v-if="car_info.acc_state==0" style="margin-right: 10rpx;">{{$t("车辆已关机")}} </text>
+					<text v-if="car_info.acc_state==1" style="margin-right: 10rpx;">{{$t("更新于")}} {{tools.formatTimeSecond(car_info.heart_time)}} </text>
+					<!-- <img src="https://qiniu.bms16.com/FsL6XWGoIhfsVB7jRg6EGFVsuaTZ" style="width: 24rpx;height: 32rpx;" alt=""> -->
+					<img src="https://qiniu.bms16.com/FmhdBxGmadYQYMjwdR9U61Gg-rfs" style="width: 24rpx;height: 32rpx;" alt="">
 				</view>
 			</view>
 			<Control :contrilList="contrilList" />
@@ -46,7 +48,7 @@
 							</view>
 							<view @tap.stop="isTrackOrAll=!isTrackOrAll"><img style="width: 24rpx;height: 20rpx;" src="https://qiniu.bms16.com/FltPK-o7KGS3dQ2pfQHXGSxOdzaN" alt=""></view>
 						</view>
-						<view class="card-top-text">27.4<text class="font_24">km</text></view>
+						<view class="card-top-text">{{car_info.current_mail}}<text class="font_24">km</text></view>
 					</view>
 					
 					<view class="card-bg">
@@ -73,7 +75,7 @@
 					<view class="margin_r_20"><img class="icon_style_64"  src="https://qiniu.bms16.com/FhKkijkN__9UzhYNgamBFSggIlYo" alt=""></view>
 					<view class="flex-row config-text-view">
 						<view class="flex-row font_w_600">{{$t("用车人管理")}}</view>
-						<view class="flex-row tip-text-config">{{$t("个家庭账号")}}</view>
+						<view class="flex-row tip-text-config">{{car_info.share_num + $t("个家庭账号")}}</view>
 					</view>
 					<img class="icon_style_28" src="https://qiniu.bms16.com/FqnbZ2iKHmzCGJA8XD30sf5g_CAm" alt="">
 				</view>
@@ -81,7 +83,7 @@
 					<view class="margin_r_20"><img class="icon_style_64" src="https://qiniu.bms16.com/FsAg6mHEBJfbtpgIHBrDdNiPo1iH" alt=""></view>
 					<view class="flex-row config-text-view">
 						<view  class="flex-row font_w_600">{{$t("设备信息")}}</view>
-						<view class="flex-row tip-text-config">{{$t("软件版本")}}</view>
+						<view class="flex-row tip-text-config">{{$t("软件版本") + (firmware.firmware||'')}}</view>
 					</view>
 					<img class="icon_style_28" src="https://qiniu.bms16.com/FqnbZ2iKHmzCGJA8XD30sf5g_CAm" alt="">
 				</view>
@@ -100,18 +102,19 @@
 <script module="tools" lang="sjs" src="@/pages/common/wxs/tools.sjs"></script>
 <script>
 	var app = getApp();
-	var config = require('../../common/config.js');
-	var common = require('../../common/common.js');
-	var http = require('../../common/http.js');
-	var storage = require('../../common/storage.js');
+	var config = require('@/common/config.js');
+	var common = require('@/common/common.js');
+	var http = require('@/common/http.js');
+	var storage = require('@/common/storage.js');
 	import Control from './components/control/control'
 	import MapCard from './components/mapCard/mapCard'
 	import UnleasedPages from './components/unleasedPages/unleasedPages'
 	import CustomTabbar from '@/component/customTabbar/index';
 	import BluetoothUnlockAuth from '../bluetoothUnlock/bluetoothUnlockAuth.vue'
-import {
+	import {
 		getFunctionTag,
 	} from '@/common/storage.js';
+	import permision from "@/js_sdk/wa-permission/permission.js"
 
 	export default {
 		
@@ -134,6 +137,7 @@ import {
 				model_list:[],
 				car_list:[],//用户车辆列表
 				car_sn:'',//当前车辆编号
+				isHideInduction:true,
 				car_info:{
 					exchange_package_info:{
 						activity_time:0
@@ -164,6 +168,27 @@ import {
 		 * 生命周期函数--监听页面显示
 		 */
 		onShow: function() {
+			// const permissionArr=permision.requestAndroidPermissions()
+			// app.globalData.permissionArr=permissionArr
+			// permision.gotoAppPermissionSetting()
+			// let status = checkBatteryOptimizationStatus();
+			// if (!permissionArr) {
+			//     uni.showModal({
+			//         title: "电池优化提示",
+			//         content: "您的设备开启了电池优化,可能会影响应用后台运行,请在设置中关闭。",
+			//         showCancel: true,
+			//         cancelText: "忽略",
+			//         confirmText: "去设置",
+			//         success(res) {
+			//             if (res.confirm) {
+			//                 permision.gotoAppPermissionSetting(); // 跳转到电池优化设置
+			//             }
+			//         }
+			//     });
+			// }
+			// app.globalData.permissionArr=permissionArr
+			console.log(33333333)
+			console.log(getFunctionTag().activeTag)
 			this.contrilList = getFunctionTag().activeTag
 			const user_token = storage.getUserToken()
 				if (!user_token) {
@@ -217,7 +242,22 @@ import {
 				});
 			},
 			inductiveUnlockHandle() {
-				this.$refs.bluetoothUnlockAuth.open();
+				this.isHideInduction=false
+				let isOpenAllPermission=false
+				app.globalData.permissionArr.map(item=>{
+					if(!item.state) isOpenAllPermission=true
+				})
+				// console.log(this.isOpenAllPermission,'this.isOpenAllPermission');
+				if(!isOpenAllPermission){
+					common.simpleToast('所需权限开启成功,前往开启蓝牙配对...');
+					uni.navigateTo({ url: '/pages/bluetoothUnlock/bluetoothPair' })
+				}else{
+					this.$refs.bluetoothUnlockAuth.open();	
+				}
+				
+			},
+			showInduction(){
+				this.isHideInduction=true
 			},
 			loadModelList() {
 				const me = this