diff --git a/images/lan/lan_en.json b/images/lan/lan_en.json index d0c782b8..077942d5 100755 --- a/images/lan/lan_en.json +++ b/images/lan/lan_en.json @@ -656,6 +656,7 @@ "刷新": "Refresh", "手动配网": "Manual distribution network", "远距离": "Long distance", + "中距离": "Medium distance", "近距离": "Short distance", "锁时间更新成功": "Lock time update success", "锁用户": "Lock user", @@ -925,5 +926,10 @@ "发送钥匙": "Send key", "进度": "Progress", "失败": "Failure", - "人脸详情": "Face details" + "人脸详情": "Face details", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 1.5 meters in front of the door, the face recognition unlocking will be automatically started.", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.8 meters in front of the door, the face recognition unlocking will be automatically started.", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.5 meters in front of the door, the face recognition unlocking will be automatically started.", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "The sensing distance has been turned off, you need to manually touch any key on the keyboard to perform face recognition unlocking.", + "防误开已打开,时间是": "The anti-mistake opening has been turned on, and the time is" } diff --git a/images/lan/lan_keys.json b/images/lan/lan_keys.json index 2d798848..457f83ac 100755 --- a/images/lan/lan_keys.json +++ b/images/lan/lan_keys.json @@ -682,6 +682,7 @@ "刷新": "刷新", "手动配网": "手动配网", "远距离": "远距离", + "中距离": "中距离", "近距离": "近距离", "锁时间更新成功": "锁时间更新成功", "锁用户": "锁用户", @@ -957,5 +958,11 @@ "发送钥匙": "发送钥匙", "进度": "进度", "失败": "失败", - "人脸详情": "人脸详情" + "人脸详情": "人脸详情", + + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。", + "防误开已打开,时间是": "防误开已打开,时间是" } diff --git a/images/lan/lan_zh.json b/images/lan/lan_zh.json index b788524f..35256364 100755 --- a/images/lan/lan_zh.json +++ b/images/lan/lan_zh.json @@ -655,6 +655,7 @@ "刷新": "刷新", "手动配网": "手动配网", "远距离": "远距离", + "中距离": "中距离", "近距离": "近距离", "锁时间更新成功": "锁时间更新成功", "锁用户": "锁用户", @@ -922,6 +923,11 @@ "发送钥匙": "发送钥匙", "进度": "进度", "失败": "失败", - "人脸详情": "人脸详情" + "人脸详情": "人脸详情", + "感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。", + "感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。", + "感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。", + "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。", + "防误开已打开,时间是": "防误开已打开,时间是" } diff --git a/lib/appRouters.dart b/lib/appRouters.dart index 7e63d7d8..bc56cf3e 100755 --- a/lib/appRouters.dart +++ b/lib/appRouters.dart @@ -84,6 +84,7 @@ import 'main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdayS import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart'; import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart'; import 'main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart'; +import 'main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart'; import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart'; import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart'; import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart'; @@ -488,6 +489,7 @@ abstract class Routers { static const String batchExportLogPage = '/batchExportLogPage'; //批量导出操作记录 static const String exportSuccessPage = '/exportSuccessPage'; //导出成功 static const String viewExportRecordPage = '/viewExportRecordPage'; //查看导出记录 + static const String doorLockLogDetailPage = '/doorLockLogDetailPage'; //操作记录详情 static const String login = '/login'; //登录 } @@ -1146,5 +1148,7 @@ abstract class AppRouters { page: () => const ViewExportRecordPage()), GetPage( name: Routers.expireKeyChangeValidityDatePage, page: () => const ExpireKeyChangeValidityDatePage()), + GetPage( + name: Routers.doorLockLogDetailPage, page: () => const DoorLockLogDetailPage()), ]; } diff --git a/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_logic.dart b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_logic.dart new file mode 100644 index 00000000..9ff9e022 --- /dev/null +++ b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_logic.dart @@ -0,0 +1,9 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; + +import 'doorLockLogDetail_state.dart'; + +class DoorLockLogDetailLogic extends BaseGetXController { + final DoorLockLogDetailState state = DoorLockLogDetailState(); + +} \ No newline at end of file diff --git a/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart new file mode 100644 index 00000000..574c760e --- /dev/null +++ b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart @@ -0,0 +1,57 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/tools/dateTool.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; +import 'doorLockLogDetail_logic.dart'; +import 'doorLockLogDetail_state.dart'; + +class DoorLockLogDetailPage extends StatefulWidget { + const DoorLockLogDetailPage({Key? key}) : super(key: key); + + @override + State createState() => _DoorLockLogDetailPageState(); +} + +class _DoorLockLogDetailPageState extends State { + final DoorLockLogDetailLogic logic = Get.put(DoorLockLogDetailLogic()); + final DoorLockLogDetailState state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: '操作记录详情', + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + body: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all(20.w), + child: Text('操作时间:${DateTool().dateIntToYMDHNString(state.timelineDataItem.value.operateDate)}', style: TextStyle(fontSize: 23.sp)), + ), + Container( + width: 1.sw, + padding: EdgeInsets.all(15.w), + margin: EdgeInsets.only(left:20.w, right: 20.w, bottom: 20.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10.w), + ), + child: Text(state.timelineDataItem.value.recordDetailStr ?? '', style: TextStyle(fontSize: 25.sp)), + ), + ], + ), + ), + ); + } + +} diff --git a/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_state.dart b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_state.dart new file mode 100644 index 00000000..376677b2 --- /dev/null +++ b/lib/main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_state.dart @@ -0,0 +1,15 @@ + +import 'package:get/get.dart'; + +import '../doorLockLog_entity.dart'; + +class DoorLockLogDetailState { + + DoorLockLogDetailState() { + final Map map = Get.arguments; + if(map['doorLockLogDataItem'] != null){ + timelineDataItem.value = map['doorLockLogDataItem']; + } + } + Rx timelineDataItem = DoorLockLogDataItem().obs; +} \ No newline at end of file diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_entity.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_entity.dart index 74395fbf..f8e11a21 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_entity.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_entity.dart @@ -73,7 +73,8 @@ class DoorLockLogDataItem { this.headUrl, this.userid, this.keyboardPwd, - this.recordStr}); + this.recordStr, + this.recordDetailStr}); DoorLockLogDataItem.fromJson(Map json) { recordId = json['recordId']; @@ -89,6 +90,7 @@ class DoorLockLogDataItem { userid = json['userid']; keyboardPwd = json['keyboardPwd']; recordStr = json['recordStr']; + recordDetailStr = json['recordDetailStr']; } int? recordId; int? lockId; @@ -103,6 +105,7 @@ class DoorLockLogDataItem { String? userid; String? keyboardPwd; String? recordStr; + String? recordDetailStr; Map toJson() { final Map data = {}; @@ -119,6 +122,7 @@ class DoorLockLogDataItem { data['userid'] = userid; data['keyboardPwd'] = keyboardPwd; data['recordStr'] = recordStr; + data['recordDetailStr'] = recordDetailStr; return data; } } diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart index b024ee68..6c65684d 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart @@ -26,7 +26,7 @@ class DoorLockLogLogic extends BaseGetXController { late StreamSubscription _replySubscription; void _initReplySubscription() { _replySubscription = - EventBusManager().eventBus!.on().listen((reply) { + EventBusManager().eventBus!.on().listen((Reply reply) { if (reply is SenderReferEventRecordTimeReply && state.ifCurrentScreen.value == true) { _replyReferEventRecordTime(reply); @@ -50,19 +50,22 @@ class DoorLockLogLogic extends BaseGetXController { if (reply.data.length < 17) { return; } - final getList = splitList(reply.data, 17); + final List> getList = splitList(reply.data, 17); // AppLog.log("getList:$getList"); - final uploadList = []; + final List uploadList = []; for (int i = 0; i < getList.length; i++) { - final indexList = getList[i]; + final List indexList = getList[i]; // AppLog.log("indexList:$indexList"); - final indexMap = {}; + final Map indexMap = {}; indexMap['type'] = indexList[0].toString(); - final int operateDate = 0; + const int operateDate = 0; if (indexList[0] == 2) { - final passwordData = indexList.sublist(7, 17); - final password = utf8String(passwordData); - indexMap['user'] = password.toString(); + final int userNo = (indexList[1] * 256) + indexList[2]; + indexMap['user'] = userNo.toString(); + + final List passwordData = indexList.sublist(7, 17); + final String password = utf8String(passwordData); + indexMap['password'] = password.toString(); } else { final int userNo = (indexList[1] * 256) + indexList[2]; indexMap['user'] = userNo.toString(); @@ -70,10 +73,10 @@ class DoorLockLogLogic extends BaseGetXController { indexMap['success'] = '1'; - final int time = ((0xff & indexList[(3)]) << 24 | + final int time = (0xff & indexList[3]) << 24 | (0xff & indexList[4]) << 16 | (0xff & indexList[5]) << 8 | - (0xFF & indexList[6])); + (0xFF & indexList[6]); indexMap['date'] = '${time * 1000}'; uploadList.add(indexMap); @@ -108,14 +111,14 @@ class DoorLockLogLogic extends BaseGetXController { BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionStateState) async { if (connectionStateState == BluetoothConnectionState.connected) { - final privateKey = await Storage.getStringList(saveBluePrivateKey); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); final List getPrivateKeyList = changeStringListToIntList(privateKey!); - final token = await Storage.getStringList(saveBlueToken); + final List? token = await Storage.getStringList(saveBlueToken); final List getTokenList = changeStringListToIntList(token!); - final publicKey = await Storage.getStringList(saveBluePublicKey); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); final List getPublicKeyList = changeStringListToIntList(publicKey!); @@ -230,11 +233,10 @@ class DoorLockLogLogic extends BaseGetXController { @override Future onReady() async { - // TODO: implement onReady super.onReady(); // 获取是否是演示模式 演示模式不获取接口 - final isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); if (isDemoMode == false) { // _initReplySubscription(); diff --git a/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart b/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart index 7c076e8e..bfe242b1 100755 --- a/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart +++ b/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart @@ -274,56 +274,63 @@ class _DoorLockLogPageState extends State with RouteAware { final String formattedTime = '${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}'; - return Padding( - padding: EdgeInsets.only(left: 20.w, top: 20.h), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - // '$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}', - timelineData.recordStr ?? '', - textAlign: TextAlign.left, - style: TextStyle( - color: Colors.black, - fontSize: 24.sp, - fontWeight: FontWeight.w600, + return GestureDetector( + onTap: () { + Get.toNamed(Routers.doorLockLogDetailPage, arguments: { + 'doorLockLogDataItem': timelineData + }); + }, + child: Padding( + padding: EdgeInsets.only(left: 20.w, top: 20.h), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + // '$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}', + timelineData.recordStr ?? '', + textAlign: TextAlign.left, + style: TextStyle( + color: Colors.black, + fontSize: 24.sp, + fontWeight: FontWeight.w600, + ), ), - ), - SizedBox( - height: 10.h, - ), - GestureDetector( - onTap: () { - Get.toNamed(Routers.videoLogDetailPage); - }, - child: Stack( - children: [ - if (timelineData.imagesUrl!.isNotEmpty) - Image.network( - timelineData.imagesUrl!, - width: 260.w, - height: 260.h, - ) - else - Container(), - Positioned( - top: 150.h, - left: 10.w, - child: Image( - image: const AssetImage( - 'images/main/icon_lockLog_play.png'), - width: 24.w, - height: 20.w, + SizedBox( + height: 10.h, + ), + GestureDetector( + onTap: () { + Get.toNamed(Routers.videoLogDetailPage); + }, + child: Stack( + children: [ + if (timelineData.imagesUrl!.isNotEmpty) + Image.network( + timelineData.imagesUrl!, + width: 260.w, + height: 260.h, + ) + else + Container(), + Positioned( + top: 150.h, + left: 10.w, + child: Image( + image: const AssetImage( + 'images/main/icon_lockLog_play.png'), + width: 24.w, + height: 20.w, + ), ), - ), - ], + ], + ), ), - ), - SizedBox( - height: 20.h, - ), - ], + SizedBox( + height: 20.h, + ), + ], + ), ), ); }, diff --git a/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart b/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart index 59c1007c..b3382528 100755 --- a/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart +++ b/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart @@ -172,7 +172,7 @@ class FingerprintDetailLogic extends BaseGetXController{ changeType: '1', startTime: int.parse(state.startDate.value), endTime: int.parse(state.endTime.value), - fingerprintType: state.fingerprintItemData.value.fingerprintType!, + fingerprintType: state.keyType.value, fingerRight: state.isAdministrator.value ? 1 : 0, ); if(entity.errorCode!.codeIsSuccessful){ diff --git a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart index 9f52c4d2..47b1efdf 100755 --- a/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart +++ b/lib/main/lockDetail/lockSet/automaticBlocking/automaticBlocking_logic.dart @@ -110,6 +110,12 @@ class AutomaticBlockingLogic extends BaseGetXController { // 设置支持功能(带参数) Future sendAutoLock() async { + final String autoTime = state.timeController.text; + if (int.parse(autoTime) > 60) { + showToast('请输入小于或等于60的数字'.tr); + return; + } + if (state.sureBtnState.value == 1) { return; } diff --git a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart index f0072e75..4d07b6bc 100755 --- a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart +++ b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart @@ -1,74 +1,215 @@ +import 'dart:async'; + +import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart'; -import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/versionUndate/versionUndate_entity.dart'; + +import '../../../../blue/blue_manage.dart'; +import '../../../../blue/io_protocol/io_setSupportFunctionsWithParameters.dart'; +import '../../../../blue/io_reply.dart'; +import '../../../../blue/io_tool/io_tool.dart'; +import '../../../../blue/io_tool/manager_event_bus.dart'; +import '../../../../blue/sender_manage.dart'; +import '../../../../tools/eventBusEventManage.dart'; +import '../../../../tools/storage.dart'; class FaceUnlockLogic extends BaseGetXController { final FaceUnlockState state = FaceUnlockState(); - // 获取锁设置信息 - Future getLockSettingInfoData() async { - LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData( - lockId: state.lockSetInfoData.value.lockId.toString(), - ); - if (entity.errorCode!.codeIsSuccessful) { - state.lockSetInfoData.value = entity.data!; - state.faceOn.value = - entity.data!.lockSettingInfo!.faceSwitch == 0 ? false : true; - state.autoBright.value = - entity.data!.lockSettingInfo!.faceAutoLightScreen == 0 ? false : true; - state.senseDistance.value = - entity.data!.lockSettingInfo!.faceInductionDistance! == 0 - ? '远距离'.tr - : '近距离'.tr; - state.antiMisoperation.value = - entity.data!.lockSettingInfo!.faceAntiMistakeOpen!; - } - return entity; - } - //设置面容开锁开关 - void updateFaceSwitch() async { - var entity = await ApiRepository.to.updateFaceSwitch( + Future updateFaceSwitch() async { + final VersionUndateEntity entity = await ApiRepository.to.updateFaceSwitch( lockId: state.lockSetInfoData.value.lockId ?? 0, faceSwitch: state.faceOn.value == false ? 0 : 1, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('设置成功'.tr); - } - } - - //设置自动亮屏开关 - void updateFaceConfig() async { - var entity = await ApiRepository.to.updateFaceAutoLightScreen( - lockId: state.lockSetInfoData.value.lockId ?? 0, - faceAutoLightScreen: state.autoBright.value == false ? 0 : 1, - ); - if (entity.errorCode!.codeIsSuccessful) { - showToast('设置成功'.tr); + showToast('设置成功'.tr, something: (){ + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + Get.back(); + }); } } //设置面容感应距离 - void updateFaceSenseDistance() async { - var entity = await ApiRepository.to.updateFaceSenseDistance( + Future updateFaceSenseDistance() async { + int faceInductionDistance = 0; + if(state.senseDistance.value == '远距离'.tr){ + faceInductionDistance = 1; + } + + if(state.senseDistance.value == '中距离'.tr){ + faceInductionDistance = 2; + } + + if(state.senseDistance.value == '近距离'.tr){ + faceInductionDistance = 3; + } + + if(state.senseDistance.value == '关闭'.tr){ + faceInductionDistance = 0; + } + final VersionUndateEntity entity = await ApiRepository.to.updateFaceSenseDistance( lockId: state.lockSetInfoData.value.lockId ?? 0, - faceInductionDistance: state.senseDistance.value == '远距离'.tr ? 0 : 1, + faceInductionDistance: faceInductionDistance, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('设置成功'.tr); + showToast('设置成功'.tr, something: (){ + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + Get.back(); + }); } } //设置面容防误开 - void updateFacePreventMisrun() async { - var entity = await ApiRepository.to.updateFacePreventMisrun( + Future updateFacePreventMisrun() async { + final VersionUndateEntity entity = await ApiRepository.to.updateFacePreventMisrun( lockId: state.lockSetInfoData.value.lockId ?? 0, - faceAntiMistakeOpen: state.antiMisoperation.value, + faceEnErrUnlock: state.antiMisoperation.value, ); if (entity.errorCode!.codeIsSuccessful) { - showToast('设置成功'); + showToast('设置成功'.tr, something: (){ + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + Get.back(); + }); } } + + // 获取解析后的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = EventBusManager().eventBus!.on().listen((Reply reply) { + if(reply is SetSupportFunctionsWithParametersReply && (state.ifCurrentScreen.value == true)) { + _replySetSupportFunctionsWithParameters(reply); + } + }); + } + + // 设置面容开锁数据解析 + Future _replySetSupportFunctionsWithParameters(Reply reply) async { + final int status = reply.data[2]; + switch(status){ + case 0x00: + //成功 + state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); + dismissEasyLoading(); + switch(state.setType.value){ + case 0: + updateFaceSwitch(); + break; + case 1: + updateFaceSenseDistance(); + break; + case 2: + updateFacePreventMisrun(); + break; + } + break; + case 0x06: + //无权限 + break; + default: + break; + } + } + + // 设置支持功能(带参数) + Future sendFaceUnlock() async { + if(state.sureBtnState.value == 1){ + return; + } + state.sureBtnState.value = 1; + + showEasyLoading(); + showBlueConnetctToastTimer(action: (){ + dismissEasyLoading(); + state.sureBtnState.value = 0; + }); + BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async { + if (connectionState == BluetoothConnectionState.connected) { + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + + final List? token = await Storage.getStringList(saveBlueToken); + final List getTokenList = changeStringListToIntList(token!); + + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List getPublicKeyList = changeStringListToIntList(publicKey!); + + final List list = []; + // 面容开锁开关 + list.add(state.faceOn.value ? 1 : 0); + + // 感应距离 + int faceInductionDistance = 0; + if(state.senseDistance.value == '远距离'.tr){ + faceInductionDistance = 3; + }else if(state.senseDistance.value == '中距离'.tr){ + faceInductionDistance = 2; + }else if(state.senseDistance.value == '近距离'.tr){ + faceInductionDistance = 1; + }else if(state.senseDistance.value == '关闭'.tr){ + faceInductionDistance = 0; + } + list.add(faceInductionDistance); + + // 防误开 + list.add(state.antiMisoperation.value); + + IoSenderManage.setSupportFunctionsWithParametersCommand( + keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), + userID: await Storage.getUid(), + featureBit: 5, + featureParaLength: 3, + featureData: list, + token: getTokenList, + needAuthor: 1, + publicKey: getPublicKeyList, + privateKey: getPrivateKeyList); + } else if (connectionState == BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + state.sureBtnState.value = 0; + if(state.ifCurrentScreen.value == true){ + showBlueConnetctToast(); + } + } + }); + } + + String getSensingDistanceString(){ + if(state.senseDistance.value == '远距离'.tr){ + return '感应到门前约1.5米有人时,将自动启动面部识别开锁。'.tr; + }else if(state.senseDistance.value == '中距离'.tr){ + return '感应到门前约0.8米有人时,将自动启动面部识别开锁。'.tr; + }else if(state.senseDistance.value == '近距离'.tr){ + return '感应到门前约0.5米有人时,将自动启动面部识别开锁。'.tr; + }else{ + return '感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。'.tr; + } + } + + @override + void onReady() { + super.onReady(); + + _initReplySubscription(); + } + + @override + void onInit() { + super.onInit(); + + // _readSupportFunctionsWithParameters(); + } + + @override + void onClose() { + super.onClose(); + + _replySubscription.cancel(); + } } diff --git a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart index 63803c7f..1a0dfdd1 100755 --- a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart +++ b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dart @@ -1,12 +1,16 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart'; +import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart'; import 'package:star_lock/tools/custom_bottom_sheet.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; +import '../../../../tools/pickers/pickers.dart'; import '../../../../tools/titleAppBar.dart'; import '../../../../translations/trans_lib.dart'; @@ -18,14 +22,8 @@ class FaceUnlockPage extends StatefulWidget { } class _FaceUnlockPageState extends State { - final logic = Get.put(FaceUnlockLogic()); - final state = Get.find().state; - - @override - void initState() { - super.initState(); - logic.getLockSettingInfoData(); - } + final FaceUnlockLogic logic = Get.put(FaceUnlockLogic()); + final FaceUnlockState state = Get.find().state; @override Widget build(BuildContext context) { @@ -36,45 +34,42 @@ class _FaceUnlockPageState extends State { haveBack: true, backgroundColor: AppColors.mainColor), body: Obx(() => Column( - children: [ + children: [ Container( margin: EdgeInsets.only(left: 20.w), child: CommonItem( leftTitel: TranslationLoader.lanKeys!.faceUnlocks!.tr, - rightTitle: "", + rightTitle: '', allHeight: 70.h, isHaveLine: true, isHaveRightWidget: true, rightWidget: SizedBox( width: 60.w, height: 50.h, child: _switch(1))), ), - Container( - margin: EdgeInsets.only(left: 20.w), - child: CommonItem( - leftTitel: TranslationLoader - .lanKeys!.automaticBrighteningScreen!.tr, - rightTitle: "", - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: SizedBox( - width: 60.w, height: 50.h, child: _switch(2))), - ), _buildSubTitleItem( TranslationLoader.lanKeys!.sensingDistance!.tr, - TranslationLoader.lanKeys!.sensingDistanceTip!.tr, - state.senseDistance.value, () { + // TranslationLoader.lanKeys!.sensingDistanceTip!.tr, + logic.getSensingDistanceString(), + state.senseDistance.value, + state.faceOn.value, () { _openBottomItemSheet(state.senseDistanceList.value, 0); }), - SizedBox( - height: 30.h, - ), + SizedBox(height: 30.h), _buildSubTitleItem( TranslationLoader.lanKeys!.preventWrongOpening!.tr, - TranslationLoader.lanKeys!.preventWrongOpeningTip!.tr, state.antiMisoperation.value == 0 - ? '关闭' - : '${state.antiMisoperation.value}秒', () { - _openBottomItemSheet(state.antiMisoperationStrList.value, 1); + ? TranslationLoader.lanKeys!.preventWrongOpeningTip!.tr + :'防误开已打开,时间是'.tr + state.antiMisoperation.value.toString() + '秒'.tr, + // state.antiMisoperation.value == 0 ? '关闭' : + '${state.antiMisoperation.value}' + '秒'.tr, + state.faceOn.value, () { + Pickers.showSinglePicker(Get.context!, data: state.antiMisoperationStrList.value, onConfirm: (var data, int position) { + AppLog.log('data = $data, position = $position'); + state.antiMisoperation.value = position; + state.setType.value = 2; + logic.sendFaceUnlock(); + }); + // _openBottomItemSheet(state.antiMisoperationStrList.value, 1); }), Expanded( child: SizedBox( @@ -88,28 +83,27 @@ class _FaceUnlockPageState extends State { ))); } - Widget _buildSubTitleItem( - String leftStr, String subTitle, String rightStr, Function()? action) { + Widget _buildSubTitleItem(String leftStr, String subTitle, String rightStr, bool isAble, Function()? action) { return GestureDetector( - onTap: action, + onTap: isAble ? action : null, child: Container( margin: EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.h), color: Colors.white, child: Row( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ SizedBox( width: 20.w, ), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, - children: [ + children: [ Container( alignment: Alignment.centerLeft, child: Text( leftStr, - style: TextStyle(fontSize: 24.sp, color: Colors.black), + style: TextStyle(fontSize: 24.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor), ), ), SizedBox( @@ -133,7 +127,7 @@ class _FaceUnlockPageState extends State { Text( rightStr, style: TextStyle( - fontSize: 22.sp, color: AppColors.darkGrayTextColor), + fontSize: 22.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor), ), SizedBox( width: 10.w, @@ -169,16 +163,13 @@ class _FaceUnlockPageState extends State { activeColor: CupertinoColors.activeBlue, trackColor: CupertinoColors.systemGrey5, thumbColor: CupertinoColors.white, - value: getIndex == 1 ? state.faceOn.value : state.autoBright.value, - onChanged: (value) { + value: state.faceOn.value, // getIndex == 1 ? state.faceOn.value : state.autoBright.value, + onChanged: (bool value) { if (getIndex == 1) { //设置面容开锁开关 state.faceOn.value = value; - logic.updateFaceSwitch(); - } else { - //设置自动亮屏开关 - state.autoBright.value = value; - logic.updateFaceConfig(); + state.setType.value = 0; + logic.sendFaceUnlock(); } }, ); @@ -193,18 +184,11 @@ class _FaceUnlockPageState extends State { return AlertBottomWidget( topTitle: '', items: bottomItemList, - chooseCallback: (value) { - if (clickIndex == 0) { - //感应距离 - state.senseDistance.value = - state.senseDistanceList.value[value]; - logic.updateFaceSenseDistance(); - } else if (clickIndex == 1) { - //防误开 - state.antiMisoperation.value = - state.antiMisoperationList.value[value]; - logic.updateFacePreventMisrun(); - } + chooseCallback: (int value) { + state.senseDistance.value = + state.senseDistanceList.value[value]; + state.setType.value = 1; + logic.sendFaceUnlock(); }, ); }); diff --git a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart index e62267d1..fb959b4b 100755 --- a/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart +++ b/lib/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -7,26 +8,54 @@ import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dar import '../../../../translations/trans_lib.dart'; class FaceUnlockState { - var lockSetInfoData = LockSetInfoData().obs; - var isCheck = false.obs; - var faceOn = false.obs; //面容开锁 - var autoBright = false.obs; //自动亮屏 - var senseDistance = TranslationLoader.lanKeys!.remote!.tr.obs; //感应距离 - var antiMisoperation = 0.obs; //防误开 - var senseDistanceList = [ - TranslationLoader.lanKeys!.remote!.tr, - TranslationLoader.lanKeys!.closeRange!.tr - ].obs; - var antiMisoperationList = [0, 5, 10, 15, 30, 60].obs; - var antiMisoperationStrList = [ - TranslationLoader.lanKeys!.close!.tr, - '5${TranslationLoader.lanKeys!.second!.tr}', - '10${TranslationLoader.lanKeys!.second!.tr}', - '15${TranslationLoader.lanKeys!.second!.tr}', - '30${TranslationLoader.lanKeys!.second!.tr}', - '60${TranslationLoader.lanKeys!.second!.tr}' + FaceUnlockState() { + Map map = Get.arguments; + if (map['lockSetInfoData'] != null) { + lockSetInfoData.value = map['lockSetInfoData']; + faceOn.value = lockSetInfoData.value.lockSettingInfo!.faceSwitch != 0; + // autoBright.value = lockSetInfoData.value.lockSettingInfo!.faceAutoLightScreen != 0; + + switch(lockSetInfoData.value.lockSettingInfo!.faceInductionDistance!){ + case 1: + senseDistance.value = '远距离'; + break; + case 2: + senseDistance.value = '中距离'; + break; + case 3: + senseDistance.value = '近距离'; + break; + case 0: + senseDistance.value = '关闭'; + break; + } + + antiMisoperation.value = lockSetInfoData.value.lockSettingInfo!.faceEnErrUnlock!; + } + + for(int i = 0; i < 31; i++) { + antiMisoperationStrList.add(i.toString() + '秒'.tr); + } + } + Rx lockSetInfoData = LockSetInfoData().obs; + + // RxBool isCheck = false.obs; + RxBool faceOn = false.obs; //面容开锁 + // RxBool autoBright = false.obs; //自动亮屏 + RxString senseDistance = TranslationLoader.lanKeys!.remote!.tr.obs; //感应距离 + RxInt antiMisoperation = 0.obs; //防误开 + RxList senseDistanceList = [ + '远距离'.tr, + '中距离'.tr, + '近距离'.tr, + '关闭'.tr ].obs; + // RxList antiMisoperationList = [0, 5, 10, 15, 30, 60].obs; + RxList antiMisoperationStrList = [].obs; + + // TextEditingController antiMisoperationStrController = TextEditingController(); + //高亮样式 final TextStyle titleStyle = TextStyle( color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500); @@ -34,7 +63,7 @@ class FaceUnlockState { final TextStyle subTipsStyle = TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp); - late InlineSpan tipsPreviewSpan = TextSpan(children: [ + late InlineSpan tipsPreviewSpan = TextSpan(children: [ TextSpan( text: '${TranslationLoader.lanKeys!.addAndUseFaceWhenUnlocking!.tr}:\n', style: titleStyle), @@ -43,10 +72,8 @@ class FaceUnlockState { style: subTipsStyle), ]); - FaceUnlockState() { - Map map = Get.arguments; - if (map['lockSetInfoData'] != null) { - lockSetInfoData.value = map['lockSetInfoData']; - } - } + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxInt sureBtnState = 0.obs; + + RxInt setType = 0.obs; // 0面容开锁 1感应距离 2防误开 } diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart b/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart index 1a2322f5..31297bc2 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart @@ -490,9 +490,10 @@ class LockSettingInfo { int? faceSwitch; //人脸开关 0:关闭 1:开启 int? faceAutoLightScreen; //人脸自动亮屏开关 0:关闭 1:开启 int? faceInductionDistance; //人脸感应距离 - int? faceAntiMistakeOpen; //人脸防误开门 0:关闭 1:开启 + // int? faceAntiMistakeOpen; //人脸防误开门 0:关闭 1:开启 int? autoLightScreen; //猫眼-自动亮屏开关 0:关闭 1:开启 int? autoLightScreenTime; //猫眼-自动亮屏时间 + int? faceEnErrUnlock; // 防误开 // List? catEyeConfigList; // int? faceSwitch; //人脸开关 0:关闭 1:开启 @@ -538,9 +539,10 @@ class LockSettingInfo { this.faceSwitch, this.faceAutoLightScreen, this.faceInductionDistance, - this.faceAntiMistakeOpen, + // this.faceAntiMistakeOpen, this.autoLightScreen, this.autoLightScreenTime, + this.faceEnErrUnlock, // this.dayNotOpenDoorSwitch, // this.dayNotOpenDoorValue, // this.doorNotCloseSwitch, @@ -589,9 +591,11 @@ class LockSettingInfo { faceSwitch = json['faceSwitch']; faceAutoLightScreen = json['faceAutoLightScreen']; faceInductionDistance = json['faceInductionDistance']; - faceAntiMistakeOpen = json['faceAntiMistakeOpen']; + // faceAntiMistakeOpen = json['faceAntiMistakeOpen']; autoLightScreen = json['autoLightScreen']; autoLightScreenTime = json['autoLightScreenTime']; + faceEnErrUnlock = json['faceEnErrUnlock']; + // dayNotOpenDoorSwitch = json['dayNotOpenDoorSwitch']; // dayNotOpenDoorValue = json['dayNotOpenDoorValue']; // doorNotCloseSwitch = json['doorNotCloseSwitch']; @@ -636,9 +640,11 @@ class LockSettingInfo { data['faceSwitch'] = faceSwitch; data['faceAutoLightScreen'] = faceAutoLightScreen; data['faceInductionDistance'] = faceInductionDistance; - data['faceAntiMistakeOpen'] = faceAntiMistakeOpen; + // data['faceAntiMistakeOpen'] = faceAntiMistakeOpen; data['autoLightScreen'] = autoLightScreen; data['autoLightScreenTime'] = autoLightScreenTime; + data['faceEnErrUnlock'] = faceEnErrUnlock; + // data['dayNotOpenDoorSwitch'] = dayNotOpenDoorSwitch; // data['dayNotOpenDoorValue'] = dayNotOpenDoorValue; // data['doorNotCloseSwitch'] = doorNotCloseSwitch; diff --git a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart index 924077f6..f2c09851 100755 --- a/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart +++ b/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart @@ -191,7 +191,7 @@ class PasswordKeyDetailLogic extends BaseGetXController { case 3: //限期 3 在开始和结束时间内有效,必需在开始时间24小时内使用一次,否则将失效 useDateStr = - '${startDateStr.toLocal().toString().substring(0, 16)}\n${endDateStr.toLocal().toString().substring(0, 16)}'; + '${startDateStr.toLocal().toString().substring(0, 16)}\n${DateTime.fromMillisecondsSinceEpoch(state.itemData.value.endDate!-1).toLocal().toString().substring(0, 16)}'; state.isCirculation.value = false; break; case 4: diff --git a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart index aa13b173..500a310f 100755 --- a/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart +++ b/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart @@ -243,7 +243,7 @@ class _PasswordKeyPerpetualPageState extends State day: DateTime.now().day, hour: 24), // minDate: PDuration.now(), - mode: DateMode.YMDHM, onConfirm: (PDuration p) { + mode: DateMode.YMDHM, hourShow24: true, onConfirm: (PDuration p) { state.beginTime.value = DateTool().getYMDHNDateString(p, 4); }); }), @@ -266,7 +266,9 @@ class _PasswordKeyPerpetualPageState extends State year: DateTime.now().year, month: DateTime.now().month, day: DateTime.now().day), - mode: DateMode.YMDH, onConfirm: (PDuration p) { + mode: DateMode.YMDH, + hourShow24: true, + onConfirm: (PDuration p) { state.endTime.value = DateTool().getYMDHNDateString(p, 4); }); }), diff --git a/lib/network/api_provider.dart b/lib/network/api_provider.dart index 0c897578..d576225e 100755 --- a/lib/network/api_provider.dart +++ b/lib/network/api_provider.dart @@ -1881,7 +1881,7 @@ class ApiProvider extends BaseProvider { // 设置面容开锁 Future updateFaceSwitch(int lockId, int faceSwitch) => post( - updateFaceConfigURL.toUrl, + updateLockSettingUrl.toUrl, jsonEncode({ 'lockId': lockId, 'faceSwitch': faceSwitch, @@ -1891,7 +1891,7 @@ class ApiProvider extends BaseProvider { Future updateFaceSenseDistance( int lockId, int faceInductionDistance) => post( - updateFaceConfigURL.toUrl, + updateLockSettingUrl.toUrl, jsonEncode({ 'lockId': lockId, 'faceInductionDistance': faceInductionDistance, @@ -1899,12 +1899,12 @@ class ApiProvider extends BaseProvider { // 设置面容防误开 Future updateFacePreventMisrun( - int lockId, int faceAntiMistakeOpen) => + int lockId, int faceEnErrUnlock) => post( - updateFaceConfigURL.toUrl, + updateLockSettingUrl.toUrl, jsonEncode({ 'lockId': lockId, - 'faceAntiMistakeOpen': faceAntiMistakeOpen, + 'faceEnErrUnlock': faceEnErrUnlock, })); // 设置面容自动亮屏 diff --git a/lib/network/api_repository.dart b/lib/network/api_repository.dart index 31836cb6..6fc0036f 100755 --- a/lib/network/api_repository.dart +++ b/lib/network/api_repository.dart @@ -1941,9 +1941,9 @@ class ApiRepository { // 设置面容防误开 Future updateFacePreventMisrun( - {required int lockId, required int faceAntiMistakeOpen}) async { + {required int lockId, required int faceEnErrUnlock}) async { final res = - await apiProvider.updateFacePreventMisrun(lockId, faceAntiMistakeOpen); + await apiProvider.updateFacePreventMisrun(lockId, faceEnErrUnlock); return VersionUndateEntity.fromJson(res.body); } diff --git a/lib/tools/pickers/style/picker_style.dart b/lib/tools/pickers/style/picker_style.dart index f32c87e8..5e58d124 100755 --- a/lib/tools/pickers/style/picker_style.dart +++ b/lib/tools/pickers/style/picker_style.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:star_lock/app_settings/app_colors.dart'; /// 基础样式 /// [showTitleBar] 是否显示头部(选择器以上的控件) 默认:true @@ -167,8 +168,8 @@ class PickerStyle { Container( alignment: Alignment.center, padding: const EdgeInsets.only(left: 12, right: 22), - child: const Text('确定', - style: TextStyle(color: Colors.blue, fontSize: 16.0)), + child: Text('确定', + style: TextStyle(color: AppColors.mainColor, fontSize: 16.0)), ); } diff --git a/lib/tools/showTFView.dart b/lib/tools/showTFView.dart index 56d332bc..af39f5f9 100755 --- a/lib/tools/showTFView.dart +++ b/lib/tools/showTFView.dart @@ -49,6 +49,7 @@ class ShowTFView extends StatelessWidget { height: 60.h, // color: Colors.white, // padding: EdgeInsets.only(left:20.w, right: 110.w), + margin: EdgeInsets.only(top: 20.w), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(15.w)),