From 8c5355dd93bec4fdab6cf470fb87e3fabea2ebac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Thu, 18 Jan 2024 11:25:56 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E9=94=81=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E3=80=822=E3=80=81=E4=BC=98=E5=8C=96=E9=94=81=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=85=B6=E4=BB=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/blue/blue_manage.dart | 4 +- .../io_changeAdministratorPassword.dart | 143 +++++++++ star_lock/lib/blue/reciver_data.dart | 7 + star_lock/lib/blue/sender_manage.dart | 31 ++ .../card/addICCard/addICCard_logic.dart | 1 + .../card/cardDetail/cardDetail_logic.dart | 3 +- .../card/cardList/cardList_logic.dart | 1 + .../fingerprintDetail_logic.dart | 1 + .../fingerprintList_logic.dart | 1 + .../automaticBlocking_logic.dart | 8 +- .../adminOpenLockPassword_logic.dart | 249 +++++++++++++++- .../adminOpenLockPassword_page.dart | 40 ++- .../adminOpenLockPassword_state.dart | 12 +- .../basicInformation_logic.dart | 18 +- .../basicInformation_page.dart | 88 ++---- .../editLockName/editLockName_logic.dart | 2 + .../lockSeletGrouping_logic.dart | 6 + .../uploadElectricQuantity_logic.dart | 128 +++++++- .../uploadElectricQuantity_page.dart | 89 +++++- .../uploadElectricQuantity_state.dart | 5 + .../burglarAlarm/burglarAlarm_logic.dart | 6 +- .../checkInCreatCompany_logic.dart | 2 +- .../configuringWifi_logic.dart | 1 + .../lcokSet/lockSet/lockSetInfo_entity.dart | 15 +- .../lcokSet/lockSet/lockSet_logic.dart | 53 ++-- .../lcokSet/lockSet/lockSet_page.dart | 54 ++-- .../lockSoundSet/lockSoundSet_logic.dart | 1 + .../lcokSet/lockTime/lockTime_logic.dart | 1 + .../normallyOpenMode_logic.dart | 3 +- .../remoteUnlocking_logic.dart | 1 + .../resetButton/resetButton_logic.dart | 1 + .../lockDetail/lockDetail_logic.dart | 23 +- .../lockDetail/lockDetail_main_page.dart | 2 +- .../lockDetail/lockDetail_page.dart | 6 +- .../lockDetail/lockDetail_state.dart | 1 + .../lockMian/lockList/lockList_logic.dart | 28 -- .../main/lockMian/lockList/lockList_page.dart | 2 +- .../main/lockMian/lockMain/lockMain_page.dart | 2 +- .../addLock/nearbyLock/nearbyLock_logic.dart | 14 +- .../mine/addLock/saveLock/saveLock_logic.dart | 279 +++++++++++++++++- .../mine/addLock/saveLock/saveLock_state.dart | 6 + star_lock/lib/network/api.dart | 2 +- star_lock/lib/network/api_provider.dart | 9 + star_lock/lib/network/api_repository.dart | 9 + star_lock/lib/tools/baseGetXController.dart | 32 +- star_lock/lib/tools/eventBusEventManage.dart | 4 +- star_lock/lib/tools/showTFView.dart | 24 +- 47 files changed, 1186 insertions(+), 232 deletions(-) create mode 100644 star_lock/lib/blue/io_protocol/io_changeAdministratorPassword.dart diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 36eb4ecc..b5480d4d 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -347,13 +347,13 @@ class BlueManage { // 断开连接 Future disconnect(String deviceMAC) async { try { - connectDeviceMacAddress = ""; + connectDeviceMacAddress = ""; // if(_currentConnectionStream != null){ _currentConnectionStream?.cancel(); _currentConnectionStream = null; // } - print('disconnecting to device: $deviceMAC'); + print('disconnecting to device: $connectDeviceName'); } on Exception catch (e, _) { print("Error disconnecting from a device: $e"); } finally { diff --git a/star_lock/lib/blue/io_protocol/io_changeAdministratorPassword.dart b/star_lock/lib/blue/io_protocol/io_changeAdministratorPassword.dart new file mode 100644 index 00000000..369d4957 --- /dev/null +++ b/star_lock/lib/blue/io_protocol/io_changeAdministratorPassword.dart @@ -0,0 +1,143 @@ + +import 'dart:convert'; + +import '../io_tool/io_tool.dart'; +import '../sm4Encipher/sm4.dart'; +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_type.dart'; +import 'package:crypto/crypto.dart' as crypto; + +//TODO:修改管理员密码 +class ChangeAdministratorPasswordCommand extends SenderProtocol { + + String? keyID; + String? userID; + int? pwdNo; + String? pwd; + int? useCountLimit; + List? token; + int? startTime; + int? endTime; + int? needAuthor; + List? signKey; + List? privateKey; + + ChangeAdministratorPasswordCommand({ + this.keyID, + this.userID, + this.pwdNo, + this.pwd, + this.useCountLimit, + this.token, + this.startTime, + this.endTime, + this.needAuthor, + this.signKey, + this.privateKey, + }) : super(CommandType.generalExtendedCommond); + + @override + List messageDetail() { + List data = []; + List subData = []; + List ebcData = []; + + // 指令类型 + int type = commandType!.typeValue; + double typeDouble = type / 256; + int type1 = typeDouble.toInt(); + int type2 = type % 256; + data.add(type1); + data.add(type2); + + // 子命令类型 + data.add(2); + + // keyID 40 + int keyIDLength = utf8.encode(keyID!).length; + // print("${commandType!.typeValue}LockIDLength:$lockIDLength utf8.encode(lockID!)${utf8.encode(lockID!)}"); + subData.addAll(utf8.encode(keyID!)); + subData = getFixedLengthList(subData, 40 - keyIDLength); + + //userID 20 + int userIDLength = utf8.encode(userID!).length; + // print("${commandType!.typeValue}IDLength:$authUserIDLength utf8.encode(authUserID!)${utf8.encode(authUserID!)}"); + subData.addAll(utf8.encode(userID!)); + subData = getFixedLengthList(subData, 20 - userIDLength); + + // PwdNo + subData.add(1); + + // pwd 20 + int pwdLength = utf8.encode(pwd!).length; + // print("${commandType!.typeValue}keyIDLength:$keyIDLength utf8.encode(keyID!)${utf8.encode(keyID!)}"); + subData.addAll(utf8.encode(pwd!)); + subData = getFixedLengthList(subData, 20 - pwdLength); + + // UseCountLimit + subData.add(0xff); + + // token + subData.addAll(token!); + + // startTime 4 + subData.add((startTime! & 0xff000000) >> 24); + subData.add((startTime! & 0xff0000) >> 16); + subData.add((startTime! & 0xff00) >> 8); + subData.add((startTime! & 0xff)); + + // endTime 4 + subData.add((endTime! & 0xff000000) >> 24); + subData.add((endTime! & 0xff0000) >> 16); + subData.add((endTime! & 0xff00) >> 8); + subData.add((endTime! & 0xff)); + + if(needAuthor == 0){ + //AuthCodeLen 1 + subData.add(0); + } else { + List authCodeData = []; + + //KeyID + authCodeData.addAll(utf8.encode(keyID!)); + + //authUserID + authCodeData.addAll(utf8.encode(userID!)); + + //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 + authCodeData.addAll(token!); + + authCodeData.addAll(signKey!); + + print("${commandType!.typeValue}-authCodeData:$authCodeData"); + + // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode + var authCode = crypto.md5.convert(authCodeData); + + subData.add(authCode.bytes.length); + subData.addAll(authCode.bytes); + } + + data.add(subData.length); + data.addAll(subData); + + if ((data.length % 16) != 0) { + int add = (16 - data.length % 16); + for (int i = 0; i < add; i++) { + data.add(0); + } + } + print("${commandType!.typeName} SM4Data:$data"); + // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 + ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); + return ebcData; + } +} + +class ChangeAdministratorPasswordReply extends Reply { + ChangeAdministratorPasswordReply.parseData(CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + } +} \ No newline at end of file diff --git a/star_lock/lib/blue/reciver_data.dart b/star_lock/lib/blue/reciver_data.dart index 4f961968..1a87e517 100644 --- a/star_lock/lib/blue/reciver_data.dart +++ b/star_lock/lib/blue/reciver_data.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:star_lock/blue/blue_manage.dart'; +import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; import 'package:star_lock/blue/io_protocol/io_deletUser.dart'; import 'package:star_lock/blue/io_protocol/io_editUser.dart'; import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart'; @@ -180,6 +181,12 @@ class CommandReciverManager { // 子命令类型 int subType = data[3]; switch(subType){ + case 2: + { + // 修改管理员密码 + reply = ChangeAdministratorPasswordReply.parseData(commandType, data); + } + break; case 3: { // 设置开锁密码 diff --git a/star_lock/lib/blue/sender_manage.dart b/star_lock/lib/blue/sender_manage.dart index c479d474..32cc168c 100644 --- a/star_lock/lib/blue/sender_manage.dart +++ b/star_lock/lib/blue/sender_manage.dart @@ -1,6 +1,7 @@ import 'package:star_lock/blue/io_protocol/io_addICCard.dart'; import 'package:star_lock/blue/io_protocol/io_addStressICCard.dart'; +import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; import 'package:star_lock/blue/io_protocol/io_deletUser.dart'; import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; @@ -287,6 +288,36 @@ class IoSenderManage { ), callBack:callBack); } + //todo:修改管理员密码 + static void changeAdministratorPasswordCommand({ + required String? keyID, + required String? userID, + required int? pwdNo, + required String? pwd, + required int? useCountLimit, + required List? token, + required int? startTime, + required int? endTime, + required int? needAuthor, + required List? signKey, + required List? privateKey, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: ChangeAdministratorPasswordCommand( + keyID: keyID, + userID: userID, + pwdNo: pwdNo, + pwd:pwd, + useCountLimit: useCountLimit, + token: token, + startTime: startTime, + endTime: endTime, + needAuthor: needAuthor, + signKey: signKey, + privateKey: privateKey, + ), callBack:callBack); + } + //todo:添加指纹开始 static void senderAddFingerprintCommand({ required String? keyID, diff --git a/star_lock/lib/main/lockDetail/card/addICCard/addICCard_logic.dart b/star_lock/lib/main/lockDetail/card/addICCard/addICCard_logic.dart index d7d11aeb..9af2719e 100644 --- a/star_lock/lib/main/lockDetail/card/addICCard/addICCard_logic.dart +++ b/star_lock/lib/main/lockDetail/card/addICCard/addICCard_logic.dart @@ -51,6 +51,7 @@ class AddICCardLogic extends BaseGetXController{ //成功 print("${reply.commandType!.typeValue} 数据解析成功"); // state.cardNumber.value = reply.data.last.toString(); + cancelBlueConnetctToastTimer(); state.ifConnectScuess.value = true; break; case 0x06: diff --git a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart index 0e6d3fbf..8e71e68d 100644 --- a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart @@ -39,6 +39,7 @@ class CardDetailLogic extends BaseGetXController{ case 0x00: //成功 print("${reply.commandType!.typeValue} 数据解析成功"); + cancelBlueConnetctToastTimer(); dismissEasyLoading(); deletICCardData(); break; @@ -86,7 +87,7 @@ class CardDetailLogic extends BaseGetXController{ } } - // 删除卡片 + // 添加卡片 Future senderAddICCard() async { if(state.sureBtnState.value == 1){ return; diff --git a/star_lock/lib/main/lockDetail/card/cardList/cardList_logic.dart b/star_lock/lib/main/lockDetail/card/cardList/cardList_logic.dart index 3e0e4fc8..ce17ea23 100644 --- a/star_lock/lib/main/lockDetail/card/cardList/cardList_logic.dart +++ b/star_lock/lib/main/lockDetail/card/cardList/cardList_logic.dart @@ -50,6 +50,7 @@ class CardListLogic extends BaseGetXController { //成功 print("${reply.commandType!.typeValue} 数据解析成功"); state.isDeletCardData = false; + cancelBlueConnetctToastTimer(); deletICCardData(); break; case 0x06: diff --git a/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart b/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart index 55310ac9..27a7feea 100644 --- a/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_logic.dart @@ -40,6 +40,7 @@ class FingerprintDetailLogic extends BaseGetXController{ //成功 print("${reply.commandType!.typeValue} 数据解析成功"); state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); deletFingerprintsData(); break; diff --git a/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart b/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart index c091cf4a..fd642e6e 100644 --- a/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart +++ b/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_logic.dart @@ -50,6 +50,7 @@ class FingerprintListLogic extends BaseGetXController{ //成功 print("${reply.commandType!.typeValue} 数据解析成功"); state.isDeletFingerprintData = false; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); deletAllFingerprintsData(); break; diff --git a/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart index 53cc5e76..8bd033a7 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/automaticBlocking/automaticBlocking_logic.dart @@ -43,9 +43,10 @@ class AutomaticBlockingLogic extends BaseGetXController{ state.autoLockTime.value = autoTime; state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond = int.parse(state.autoLockTime.value); - eventBus.fire(RefreshLockListInfoDataEvent()); - eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - showToast("操作成功"); + showToast("操作成功", something: (){ + eventBus.fire(RefreshLockListInfoDataEvent()); + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + }); } } @@ -104,6 +105,7 @@ class AutomaticBlockingLogic extends BaseGetXController{ //成功 print("${reply.commandType}数据解析成功"); state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); setAutoUnLock(); break; diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart index b1ffa20e..2196811e 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_logic.dart @@ -1,18 +1,180 @@ +import 'dart:async'; + import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; +import 'package:star_lock/blue/io_type.dart'; import '../../../../../blue/blue_manage.dart'; +import '../../../../../blue/io_protocol/io_changeAdministratorPassword.dart'; +import '../../../../../blue/io_protocol/io_readAdminPassword.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 '../../../../../network/api_repository.dart'; import '../../../../../tools/baseGetXController.dart'; +import '../../../../../tools/eventBusEventManage.dart'; import '../../../../../tools/storage.dart'; -import '../basicInformation/basicInformation_state.dart'; +import 'adminOpenLockPassword_state.dart'; class AdminOpenLockPasswordLogic extends BaseGetXController{ - final BasicInformationState state = BasicInformationState(); + final AdminOpenLockPasswordState state = AdminOpenLockPasswordState(); + + // 获取解析后的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = EventBusManager().eventBus!.on().listen((reply) { + if (reply is ChangeAdministratorPasswordReply) { + _replyChangeAdministratorPassword(reply); + } + + if (reply is SenderReadAdminPasswordReply) { + _replyReadAdminPassword(reply); + } + }); + } + + // 修改管理员密码 + Future _replyChangeAdministratorPassword(Reply reply) async { + var token = reply.data.sublist(5, 9); + var saveStrList = changeIntListToStringList(token); + print("_replyFactoryDataResetKeyToken:$token"); + Storage.setStringList(saveBlueToken, saveStrList); + + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 数据解析成功"); + state.sureBtnState.value = 0; + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + state.adminPwd.value = state.changePwdController.text; + addLockAdminPassword(true); + break; + case 0x06: + //无权限 + print("${reply.commandType!.typeValue} 需要鉴权"); + + var signKey = await Storage.getStringList(saveBlueSignKey); + List signKeyDataList = changeStringListToIntList(signKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + IoSenderManage.changeAdministratorPasswordCommand( + keyID: "1", + userID: await Storage.getUid(), + pwdNo: 0, + pwd:state.changePwdController.text, + useCountLimit: 0xff, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: token); + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 失败"); + + break; + } + } + + // 读取管理员密码 + Future _replyReadAdminPassword(Reply reply) async { + var token = reply.data.sublist(5, 9); + var saveStrList = changeIntListToStringList(token); + Storage.setStringList(saveBlueToken, saveStrList); + + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 数据解析成功"); + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + + if(reply.data[5] > 0){ + reply.data.removeRange(0, 6); + // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面 + var getList = splitList(reply.data, 13); + print("getList:$getList"); + for(int i = 0; i getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List getPublicKeyList = changeStringListToIntList(publicKey!); + + IoSenderManage.senderReadAdminPasswordCommand( + keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), + userID: await Storage.getUid(), + role:0xff, + pwdNum:1, + pwdNo: 0, + token: getTokenList, + needAuthor: 1, + publicKey: getPublicKeyList, + privateKey: getPrivateKeyList + ); + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 失败"); + + break; + } + } // 读取支持功能-带参数 - Future _readAdminPassword() async { + Future readAdminPassword() async { + showEasyLoading(); + showBlueConnetctToastTimer(action: (){ + dismissEasyLoading(); + }); BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async { if (connectionState == DeviceConnectionState.connected) { var privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -28,24 +190,98 @@ class AdminOpenLockPasswordLogic extends BaseGetXController{ keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(), userID: await Storage.getUid(), role:0xff, - pwdNum:5, + pwdNum:1, pwdNo: 0, token: getTokenList, needAuthor: 1, publicKey: getPublicKeyList, privateKey: getPrivateKeyList ); + } else if (connectionState == DeviceConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + if(state.ifCurrentScreen.value == true){ + showBlueConnetctToast(); + } } }); } + // 修改管理员密码(同添加自定义开锁密码,指纹/密码/卡片前5个是管理员) + Future changeAdministratorPasswordCommand() async { + if(state.sureBtnState.value == 1){ + return; + } + state.sureBtnState.value = 1; + + showEasyLoading(); + showBlueConnetctToastTimer(action: (){ + dismissEasyLoading(); + state.sureBtnState.value = 0; + }); + BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState deviceConnectionState) async { + if (deviceConnectionState == DeviceConnectionState.connected) { + var signKey = await Storage.getStringList(saveBlueSignKey); + List signKeyDataList = changeStringListToIntList(signKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + print("openDoorTokenPubToken:$getTokenList"); + + IoSenderManage.changeAdministratorPasswordCommand( + keyID: "1", + userID: await Storage.getUid(), + pwdNo: 0, + pwd:state.changePwdController.text, + useCountLimit: 0xff, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList); + } else if (deviceConnectionState == DeviceConnectionState.disconnected) { + state.sureBtnState.value = 0; + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + if(state.ifCurrentScreen.value == true){ + showBlueConnetctToast(); + } + } + }); + } + + // 更新管理员密码 + void addLockAdminPassword(bool isChange) async { + var entity = await ApiRepository.to.setAdminPasswordData( + lockId: state.lockSetInfoData.value.lockBasicInfo!.lockId!, + adminPwd: state.adminPwd.value, + ); + if (entity.errorCode!.codeIsSuccessful) { + if(isChange == true){ + showToast("修改成功", something: (){ + state.lockBasicInfo.value.adminPwd = state.adminPwd.value; + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + }); + }else{ + showToast("上传成功", something: (){ + state.lockBasicInfo.value.adminPwd = state.adminPwd.value; + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + }); + } + } + } + @override void onReady() { // TODO: implement onReady super.onReady(); print("onReady()"); - _readAdminPassword(); + _initReplySubscription(); } @override @@ -59,7 +295,8 @@ class AdminOpenLockPasswordLogic extends BaseGetXController{ @override void onClose() { // TODO: implement onClose - + super.onClose(); + _replySubscription.cancel(); } } diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart index bc06ce26..85e8859b 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/tools/showTFView.dart'; @@ -7,6 +8,7 @@ import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/commonItem.dart'; import '../../../../../tools/titleAppBar.dart'; import '../../../../../translations/trans_lib.dart'; +import 'adminOpenLockPassword_logic.dart'; class AdminOpenLockPasswordPage extends StatefulWidget { const AdminOpenLockPasswordPage({Key? key}) : super(key: key); @@ -17,7 +19,8 @@ class AdminOpenLockPasswordPage extends StatefulWidget { } class _AdminOpenLockPasswordPageState extends State { - final TextEditingController _changePwdController = TextEditingController(); + final logic = Get.put(AdminOpenLockPasswordLogic()); + final state = Get.find().state; @override Widget build(BuildContext context) { @@ -29,14 +32,14 @@ class _AdminOpenLockPasswordPageState extends State { backgroundColor: AppColors.mainColor), body: Column( children: [ - CommonItem( + Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.password!.tr, - rightTitle: "123456", + rightTitle: state.adminPwd.value, isHaveLine: false, isHaveDirection: true, action: () { showCupertinoAlertDialog(context); - }), + })), Container( margin: EdgeInsets.all(30.w), child: Column( @@ -55,7 +58,9 @@ class _AdminOpenLockPasswordPageState extends State { height: 10.h, ), GestureDetector( - onTap: () {}, + onTap: () { + logic.readAdminPassword(); + }, child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ @@ -83,18 +88,29 @@ class _AdminOpenLockPasswordPageState extends State { context: context, builder: (BuildContext context) { return ShowTFView( - title: - "${TranslationLoader.lanKeys!.amend!.tr} ${TranslationLoader.lanKeys!.name!.tr}", + title: "管理员密码", tipTitle: "请输入", - controller: _changePwdController, + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + LengthLimitingTextInputFormatter(6), + ], + controller: state.changePwdController, sureClick: () { - //发送编辑钥匙名称请求 - if (_changePwdController.text.isNotEmpty) { - // modifyPwdRequest(); + if(state.changePwdController.text.length < 6){ + logic.showToast("请输入6位管理员密码"); + return; } + + if(state.changePwdController.text == state.lockBasicInfo.value.adminPwd!){ + logic.showToast("请输入新的管理员密码"); + return; + } + Get.back(); + logic.changeAdministratorPasswordCommand(); }, cancelClick: () { - Navigator.pop(context); + Get.back(); }, ); }, diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_state.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_state.dart index c369c1e8..e2363e4a 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_state.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_state.dart @@ -1,16 +1,24 @@ +import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../../lockSet/lockSetInfo_entity.dart'; -class BasicInformationState { +class AdminOpenLockPasswordState { var lockSetInfoData = LockSetInfoData().obs; var lockBasicInfo = LockBasicInfo().obs; + final TextEditingController changePwdController = TextEditingController(); + var adminPwd = "".obs;// 0普通状态可用 1不可用 - BasicInformationState() { + var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + var sureBtnState = 0.obs;// 0普通状态可用 1不可用 + + AdminOpenLockPasswordState() { var map = Get.arguments; lockSetInfoData.value = map["lockSetInfoData"]; lockBasicInfo.value = lockSetInfoData.value.lockBasicInfo!; + changePwdController.text = lockBasicInfo.value.adminPwd!; + adminPwd.value = lockBasicInfo.value.adminPwd!; } } diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_logic.dart index 0edd2624..98a1e9a9 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_logic.dart @@ -1,5 +1,9 @@ +import 'dart:async'; + import '../../../../../tools/baseGetXController.dart'; +import '../../../../../tools/eventBusEventManage.dart'; +import '../../lockSet/lockSet_logic.dart'; import 'basicInformation_state.dart'; class BasicInformationLogic extends BaseGetXController{ @@ -33,13 +37,22 @@ class BasicInformationLogic extends BaseGetXController{ // }, isShowLoading: true); // } + // 下级界面修改成功后传递数据 + StreamSubscription? _passCurrentLockInformationEvent; + void initLoadDataAction(BlockSetStateCallback blockSetStateCallback) { + // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus + _passCurrentLockInformationEvent = eventBus.on().listen((event) { + state.lockSetInfoData.value = event.lockSetInfoData; + blockSetStateCallback(); + }); + } + @override void onReady() { // TODO: implement onReady super.onReady(); print("onReady()"); - // _readAdminPassword(); } @override @@ -53,7 +66,8 @@ class BasicInformationLogic extends BaseGetXController{ @override void onClose() { // TODO: implement onClose - + super.onClose(); + _passCurrentLockInformationEvent?.cancel(); } } \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_page.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_page.dart index d84c534a..f391ea19 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/basicInformation/basicInformation_page.dart @@ -22,14 +22,15 @@ class _BasicInformationPageState extends State { final logic = Get.put(BasicInformationLogic()); final state = Get.find().state; - // late String _groupName = ""; - // late LockData _lockData; - // - // @override - // void initState() { - // super.initState(); - // _groupName = '未分组'; - // } + @override + void initState() { + // TODO: implement initState + super.initState(); + + logic.initLoadDataAction(() { + setState(() {}); + }); + } @override Widget build(BuildContext context) { @@ -49,32 +50,26 @@ class _BasicInformationPageState extends State { isHaveLine: true), CommonItem( leftTitel: "MAC/ID", - rightTitle: state.lockBasicInfo.value.mac, + rightTitle: "${state.lockBasicInfo.value.mac}/${state.lockBasicInfo.value.lockId}", allHeight: 70.h, isHaveLine: false), SizedBox( height: 10.h, ), - CommonItem( - leftTitel: TranslationLoader - .lanKeys!.electricQuantity!.tr, + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.electricQuantity!.tr, rightTitle: "${state.lockBasicInfo.value.electricQuantity}%", isHaveLine: true, isHaveDirection: true, action: () { - Navigator.pushNamed(context, - Routers.uploadElectricQuantityPage, - arguments: {'lockSetInfoData': state.lockSetInfoData.value}); - }), + Get.toNamed(Routers.uploadElectricQuantityPage, arguments: {'lockSetInfoData': state.lockSetInfoData.value}); + })), CommonItem( - leftTitel: TranslationLoader - .lanKeys!.periodValidity!.tr, - rightTitle: getUseDateStr(state.lockBasicInfo.value), + leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr, + rightTitle: logic.getUseKeyTypeStr(state.lockBasicInfo.value.startDate, state.lockBasicInfo.value.startDate, state.lockBasicInfo.value.keyType), allHeight: 70.h, isHaveLine: false), - SizedBox( - height: 10.h, - ), + SizedBox(height: 10.h), CommonItem( leftTitel: TranslationLoader.lanKeys!.lockName!.tr, @@ -89,33 +84,33 @@ class _BasicInformationPageState extends State { }); } }), - CommonItem( - leftTitel: - TranslationLoader.lanKeys!.lockGrouping!.tr, - // rightTitle: state.getKeyInfosData.value.groupName == "" ? _groupName : itemData.groupName, + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.lockGrouping!.tr, + rightTitle: state.lockBasicInfo.value.groupName, isHaveLine: true, isHaveDirection: true, action: () async { - Navigator.pushNamed( - context, Routers.lockSeletGroupingPage, + Get.toNamed(Routers.lockSeletGroupingPage, arguments: { 'lockSetInfoData': state.lockSetInfoData.value - }).then((val) { + })!.then((val) { if (val != null) { // mockNetworkDataRequest(); setState(() {}); } }); - }), + })), Visibility( visible: (state.lockBasicInfo.value.isLockOwner == 1 || state.lockBasicInfo.value.keyRight == 1) ? true : false, child: CommonItem( leftTitel: TranslationLoader.lanKeys!.adminOpenLockPassword!.tr, - rightTitle: "", + rightTitle: state.lockSetInfoData.value!.lockBasicInfo!.adminPwd, isHaveLine: true, isHaveDirection: true, action: () { - Navigator.pushNamed(context, Routers.adminOpenLockPasswordPage); + Get.toNamed(Routers.adminOpenLockPasswordPage, arguments: { + 'lockSetInfoData': state.lockSetInfoData.value + }); }), ), CommonItem( @@ -132,35 +127,6 @@ class _BasicInformationPageState extends State { ); } - //使用期限 - String getUseDateStr(LockBasicInfo indexEntity) { - String useDateStr = ''; - if (indexEntity.keyType == XSConstantMacro.keyTypeTime) { - //限期 - if (indexEntity.startDate != null && indexEntity.endDate != null) { - DateTime startDateStr = - DateTime.fromMillisecondsSinceEpoch(indexEntity.startDate!); - DateTime endDateStr = - DateTime.fromMillisecondsSinceEpoch(indexEntity.endDate!); - useDateStr = - '${startDateStr.toLocal().toString().substring(0, 16)}-${endDateStr.toLocal().toString().substring(0, 16)}'; - } else { - useDateStr = '限期'; - } - } else if (indexEntity.keyType == XSConstantMacro.keyTypeLong) { - //永久 - useDateStr = '永久'; - } else if (indexEntity.keyType == XSConstantMacro.keyTypeOnce) { - //单次 - useDateStr = '单次'; - } else if (indexEntity.keyType == XSConstantMacro.keyTypeLoop) { - //循环 - useDateStr = '循环'; - } - - return useDateStr; - } - //1:限期 2:永久 3:单次 4:循环 String getKeyTypeStr(int keyType) { String keyTypeStr = ""; diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/editLockName/editLockName_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/editLockName/editLockName_logic.dart index 3d3c7293..53123504 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/editLockName/editLockName_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/editLockName/editLockName_logic.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import '../../../../../network/api_repository.dart'; import '../../../../../tools/baseGetXController.dart'; +import '../../../../../tools/eventBusEventManage.dart'; import '../../../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; import 'editLockName_state.dart'; @@ -17,6 +18,7 @@ class EditLockNameLogic extends BaseGetXController{ if (entity.errorCode!.codeIsSuccessful) { showToast("修改成功"); state.lockBasicInfo.value.lockAlias = state.changeLockNameController.text; + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(3, state.lockBasicInfo.value.lockAlias!)); Get.back(result: { "lockBasicInfo":state.lockBasicInfo.value }); diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/lockSeletGrouping/lockSeletGrouping_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/lockSeletGrouping/lockSeletGrouping_logic.dart index b07a9237..6d9401f7 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/lockSeletGrouping/lockSeletGrouping_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/lockSeletGrouping/lockSeletGrouping_logic.dart @@ -1,6 +1,7 @@ import '../../../../../network/api_repository.dart'; import '../../../../../tools/baseGetXController.dart'; +import '../../../../../tools/eventBusEventManage.dart'; import '../../../electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; import 'lockSeletGrouping_state.dart'; @@ -23,7 +24,12 @@ class LockSeletGroupingLogic extends BaseGetXController { if (entity.errorCode!.codeIsSuccessful) { showToast("设置锁分组成功"); state.lockBasicInfo.value.groupId = itemData.keyGroupId; + state.lockBasicInfo.value.groupName = itemData.keyGroupName; mockNetworkDataRequest(); + state.lockSetInfoData.value.lockBasicInfo!.groupId = itemData.keyGroupId; + state.lockSetInfoData.value.lockBasicInfo!.groupName = itemData.keyGroupName; + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus.fire(RefreshLockListInfoDataEvent()); } } diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart index 9d7d8ad1..08ab30d7 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_logic.dart @@ -1,6 +1,18 @@ +import 'dart:async'; + +import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; + +import '../../../../../blue/blue_manage.dart'; +import '../../../../../blue/io_protocol/io_getStarLockStatusInfo.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 '../../../../../network/api_repository.dart'; import '../../../../../tools/baseGetXController.dart'; +import '../../../../../tools/eventBusEventManage.dart'; +import '../../../../../tools/storage.dart'; import '../../../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; import 'uploadElectricQuantity_state.dart'; @@ -8,11 +20,123 @@ class UploadElectricQuantityLogic extends BaseGetXController { final UploadElectricQuantityState state = UploadElectricQuantityState(); //电量更新请求 - Future uploadElectricQuantityRequest() async { - KeyOperationRecordEntity entity = await ApiRepository.to.uploadElectricQuantity('100', state.lockSetInfoData.value.lockId.toString()); + Future uploadElectricQuantityRequest(String electricQuantity) async { + KeyOperationRecordEntity entity = await ApiRepository.to.uploadElectricQuantity(electricQuantity, state.lockSetInfoData.value.lockId.toString()); if (entity.errorCode!.codeIsSuccessful) { + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, electricQuantity)); + eventBus.fire(RefreshLockListInfoDataEvent()); + showToast("锁电量更新成功"); } } + // 获取锁状态 + Future getStarLockStatus() async { + if(state.sureBtnState.value == 1){ + return; + } + state.sureBtnState.value = 1; + + showEasyLoading(); + showBlueConnetctToastTimer(action: (){ + dismissEasyLoading(); + state.sureBtnState.value = 0; + }); + BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState deviceConnectionState) async { + if (deviceConnectionState == DeviceConnectionState.connected) { + dismissEasyLoading(); + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + IoSenderManage.senderGetStarLockStatuInfo( + lockID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + privateKey: getPrivateKeyList, + ); + } else if (deviceConnectionState == DeviceConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + state.sureBtnState.value = 0; + if(state.ifCurrentScreen.value == true){ + showBlueConnetctToast(); + } + } + }); + } + + // 获取解析后的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = EventBusManager().eventBus!.on().listen((reply) { + // 获取锁状态信息 + if (reply is GetStarLockStatuInfoReply) { + _replyGetStarLockStatusInfo(reply); + } + }); + } + + // 获取星锁状态 + Future _replyGetStarLockStatusInfo(Reply reply) async { + int status = reply.data[2]; + switch (status) { + case 0x00: + //成功 + print("${reply.commandType}数据解析成功"); + state.sureBtnState.value = 0; + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + + // 电池剩余电量 + var battRemCap = reply.data[132]; + state.lockSetInfoData.value.lockBasicInfo!.electricQuantity = battRemCap; + state.uploadElectricQuantityDate.value = DateTime.now().millisecondsSinceEpoch; + state.lockSetInfoData.value.lockBasicInfo!.electricQuantityDate = DateTime.now().millisecondsSinceEpoch; + uploadElectricQuantityRequest(battRemCap.toString()); + break; + case 0x06: + //无权限 + print("${reply.commandType}需要鉴权"); + + break; + case 0x07: + //无权限 + print("${reply.commandType}用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType}权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType}失败"); + + break; + } + } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + print("NearbyLockLogic onReady()"); + + _initReplySubscription(); + } + + @override + void onInit() { + // TODO: implement onInit + print("NearbyLockLogic onInit()"); + super.onInit(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + _replySubscription.cancel(); + } + } \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart index 81aa1d45..bd34fc82 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_page.dart @@ -1,8 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../../../../app_settings/app_colors.dart'; +import '../../../../../blue/blue_manage.dart'; +import '../../../../../tools/appRouteObserver.dart'; +import '../../../../../tools/dateTool.dart'; import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/titleAppBar.dart'; import '../../../../../translations/trans_lib.dart'; @@ -16,7 +20,7 @@ class UploadElectricQuantityPage extends StatefulWidget { _UploadElectricQuantityPageState(); } -class _UploadElectricQuantityPageState extends State { +class _UploadElectricQuantityPageState extends State with RouteAware { final logic = Get.put(UploadElectricQuantityLogic()); final state = Get.find().state; @@ -45,16 +49,27 @@ class _UploadElectricQuantityPageState extends State SizedBox( height: 40.h, ), - Row( + Obx(() => Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Expanded( child: Text( - "${TranslationLoader.lanKeys!.electricQuantity!.tr} 100%", - style: TextStyle(fontSize: 20.sp), - )), + "${TranslationLoader.lanKeys!.electricQuantity!.tr} ${state.lockSetInfoData.value.lockBasicInfo!.electricQuantity}%", + style: TextStyle(fontSize: 20.sp), + )), ], - ), + )), + SizedBox(height: 10.h), + Obx(() => Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Text( + "电量更新时间:${DateTool().dateToYMDHNString(state.uploadElectricQuantityDate.value.toString())}", + style: TextStyle(fontSize: 20.sp), + )), + ], + )), SizedBox( height: 30.h, ), @@ -65,10 +80,68 @@ class _UploadElectricQuantityPageState extends State // margin: EdgeInsets.only(left: 03.w, right: 30.w, top: 20.w), padding: EdgeInsets.only(top: 20.w, bottom: 20.w), onClick: () { - logic.uploadElectricQuantityRequest(); + logic.getStarLockStatus(); }), ], ), - )); + ) + ); + } + + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + + /// 路由订阅 + AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + // TODO: implement dispose + /// 取消路由订阅 + AppRouteObserver().routeObserver.unsubscribe(this); + super.dispose(); + } + + /// 从上级界面进入 当前界面即将出现 + @override + void didPush() { + super.didPush(); + print("lockSet===didPush"); + state.ifCurrentScreen.value = true; + } + + /// 返回上一个界面 当前界面即将消失 + @override + void didPop() { + super.didPop(); + print("lockSet===didPop"); + logic.cancelBlueConnetctToastTimer(); + logic.dismissEasyLoading(); + BlueManage().stopScan(); + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + print("lockSet===didPopNext"); + state.ifCurrentScreen.value = true; + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + print("lockSet===didPushNext"); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + BlueManage().stopScan(); + state.ifCurrentScreen.value = false; + state.sureBtnState.value = 0; } } diff --git a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart index 686d8fff..ff88f1f5 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/basicInformation/uploadElectricQuantity/uploadElectricQuantity_state.dart @@ -6,10 +6,15 @@ import '../../lockSet/lockSetInfo_entity.dart'; class UploadElectricQuantityState { var lockSetInfoData = LockSetInfoData().obs; + var uploadElectricQuantityDate = 0.obs; + + var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + var sureBtnState = 0.obs;// 0普通状态可用 1不可用 UploadElectricQuantityState() { var map = Get.arguments; lockSetInfoData.value = map["lockSetInfoData"]; + uploadElectricQuantityDate.value = lockSetInfoData.value.lockBasicInfo!.electricQuantityDate!; } } \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart index 28bf0460..9f0a0179 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/burglarAlarm/burglarAlarm_logic.dart @@ -29,8 +29,9 @@ class BurglarAlarmLogic extends BaseGetXController{ state.burglarAlarmEnable.value = state.burglarAlarmEnable.value == 1 ? 0 : 1; state.lockSetInfoData.value.lockSettingInfo!.antiPrySwitch = state.burglarAlarmEnable.value; - eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - showToast("操作成功"); + showToast("操作成功", something: (){ + eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + }); } } @@ -86,6 +87,7 @@ class BurglarAlarmLogic extends BaseGetXController{ print("${reply.commandType}数据解析成功"); state.sureBtnState.value = 0; dismissEasyLoading(); + cancelBlueConnetctToastTimer(); _setLockSetGeneralSetting(); break; case 0x06: diff --git a/star_lock/lib/main/lockDetail/lcokSet/checkInCreatCompany/checkInCreatCompany_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/checkInCreatCompany/checkInCreatCompany_logic.dart index 43dc70a8..76881783 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/checkInCreatCompany/checkInCreatCompany_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/checkInCreatCompany/checkInCreatCompany_logic.dart @@ -36,7 +36,7 @@ class CheckInCreatCompanyLogic extends BaseGetXController{ state.lockSetInfoData.value.lockSettingInfo!.attendance = 1; print("333state.lockSetInfoData.value.lockSettingInfo!.attendance:${state.lockSetInfoData.value.lockSettingInfo!.attendance}"); eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, 1)); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, "1")); Get.back(); showToast("设置成功"); } diff --git a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart index 64a36aa8..dc000915 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart @@ -65,6 +65,7 @@ class ConfiguringWifiLogic extends BaseGetXController{ //成功 print("${reply.commandType}数据解析成功"); state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); showToast("配网成功"); break; diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSetInfo_entity.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSetInfo_entity.dart index fc19fd3e..059a7601 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSetInfo_entity.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSetInfo_entity.dart @@ -301,6 +301,8 @@ class LockFeature { } class LockBasicInfo { + int? lockId; + int? electricQuantityDate; int? keyId; String? model; int? electricQuantity; @@ -309,6 +311,7 @@ class LockBasicInfo { String? lockAlias; String? lockName; int? groupId; + String? groupName; List? groupData; String? adminPwd; int? keyType; @@ -320,7 +323,10 @@ class LockBasicInfo { int? lockUserNo; LockBasicInfo( - {this.keyId, + { + this.lockId, + this.electricQuantityDate, + this.keyId, this.model, this.electricQuantity, this.indate, @@ -328,6 +334,7 @@ class LockBasicInfo { this.lockAlias, this.lockName, this.groupId, + this.groupName, this.groupData, this.adminPwd, this.keyType, @@ -339,6 +346,8 @@ class LockBasicInfo { this.lockUserNo}); LockBasicInfo.fromJson(Map json) { + lockId = json['lockId']; + electricQuantityDate = json['electricQuantityDate']; keyId = json['keyId']; model = json['model']; electricQuantity = json['electricQuantity']; @@ -347,6 +356,7 @@ class LockBasicInfo { lockAlias = json['lockAlias']; lockName = json['lockName']; groupId = json['groupId']; + groupName = json['groupName']; if (json['groupData'] != null) { groupData = []; json['groupData'].forEach((v) { @@ -365,6 +375,8 @@ class LockBasicInfo { Map toJson() { final Map data = {}; + data['lockId'] = lockId; + data['electricQuantityDate'] = electricQuantityDate; data['keyId'] = keyId; data['model'] = model; data['electricQuantity'] = electricQuantity; @@ -373,6 +385,7 @@ class LockBasicInfo { data['lockAlias'] = lockAlias; data['lockName'] = lockName; data['groupId'] = groupId; + data['groupName'] = groupName; if (groupData != null) { data['groupData'] = groupData!.map((v) => v.toJson()).toList(); } diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart index d64a9380..e7cea7c2 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_logic.dart @@ -46,13 +46,12 @@ class LockSetLogic extends BaseGetXController { } // 设置支持功能(不带参数) - if (reply is SetSupportFunctionsNoParametersReply) { + if ((reply is SetSupportFunctionsNoParametersReply) && (state.ifCurrentScreen.value == true)) { _replySetSupportFunctionsWithParameters(reply); } // 读取支持功能(不带参数) - if ((reply is ReadSupportFunctionsNoParametersReply) && - (state.settingUpSupportFeatures == 56)) { + if ((reply is ReadSupportFunctionsNoParametersReply) && (state.settingUpSupportFeatures == 56)) { _readSupportFunctionsWithParametersReply(reply); } }); @@ -214,6 +213,7 @@ class LockSetLogic extends BaseGetXController { print("${reply.commandType}数据解析成功"); // Toast.show(msg: "操作成功");featureEnable = state.isOpenStayWarn.value == 1 ? 0 : 1; dismissEasyLoading(); + cancelBlueConnetctToastTimer(); if (state.settingUpSupportFeatures == 55) { // APP开锁时是否需联网 // state.isOpenLockNeedOnline.value = state.isOpenLockNeedOnline.value == 1 ? 0 : 1; @@ -376,9 +376,7 @@ class LockSetLogic extends BaseGetXController { dismissEasyLoading(); }); BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState connectionState) async { - cancelBlueConnetctToastTimer(); if (connectionState == DeviceConnectionState.connected) { - dismissEasyLoading(); var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); @@ -440,7 +438,7 @@ class LockSetLogic extends BaseGetXController { state.isOpenBlueBroadcast.value = state.lockSettingInfo.value.bluetoothBroadcast!; state.isOpenExceptionWarnings.value = state.lockSettingInfo.value.bluetoothBroadcast!; - + Get.log('请求成功333'); // await _readSupportFunctionsNoParameters(56); // _readSupportFunctionsNoParameters(62); } @@ -455,9 +453,13 @@ class LockSetLogic extends BaseGetXController { BlueManage().connectDeviceMacAddress = ""; eventBus.fire(RefreshLockListInfoDataEvent()); if(state.isOnlyOneData.value == true){ - Get.close(1); + Future.delayed(const Duration(milliseconds: 200)).then((e) { + Get.close(1); + }); }else{ - Get.close(2); + Future.delayed(const Duration(milliseconds: 200)).then((e) { + Get.close(2); + }); } } } @@ -472,9 +474,13 @@ class LockSetLogic extends BaseGetXController { BlueManage().connectDeviceMacAddress = ""; eventBus.fire(RefreshLockListInfoDataEvent()); if(state.isOnlyOneData.value == true){ - Get.close(1); + Future.delayed(const Duration(milliseconds: 200)).then((e) { + Get.close(1); + }); }else{ - Get.close(2); + Future.delayed(const Duration(milliseconds: 200)).then((e) { + Get.close(2); + }); } // Get.offAllNamed(Routers.starLockMain); } @@ -626,14 +632,13 @@ class LockSetLogic extends BaseGetXController { attendance: state.isAttendance.value == 1 ? 0 : 1, ); if (entity.errorCode!.codeIsSuccessful) { - eventBus.fire(RefreshLockListInfoDataEvent()); - state.isAttendance.value = (state.isAttendance.value == 1 ? 0 : 1); state.lockSettingInfo.value.attendance = state.isAttendance.value; - - eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSettingInfo.value.attendance!)); + showToast("设置成功", something: (){ + eventBus.fire(RefreshLockListInfoDataEvent()); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSettingInfo.value.attendance!.toString())); + }); print("state.lockSettingInfo.value.attendance:${state.lockSettingInfo.value.attendance}"); - showToast("设置成功"); } } @@ -644,12 +649,12 @@ class LockSetLogic extends BaseGetXController { unlockReminderPush: state.isLockPickingReminder.value == 1 ? 0 : 1, ); if (entity.errorCode!.codeIsSuccessful) { - eventBus.fire(RefreshLockListInfoDataEvent()); - state.isLockPickingReminder.value = (state.isLockPickingReminder.value == 1 ? 0 : 1); state.lockSettingInfo.value.unlockReminderPush = state.isLockPickingReminder.value; - showToast("设置成功"); - } else {} + showToast("设置成功", something: (){ + eventBus.fire(RefreshLockListInfoDataEvent()); + }); + } } // 设置是否打开开锁时是否需联网 @@ -659,14 +664,14 @@ class LockSetLogic extends BaseGetXController { appUnlockOnline: state.isOpenLockNeedOnline.value == 1 ? 0 : 1, ); if (entity.errorCode!.codeIsSuccessful) { - eventBus.fire(RefreshLockListInfoDataEvent()); - state.isOpenLockNeedOnline.value = (state.isOpenLockNeedOnline.value == 1 ? 0 : 1); state.lockSettingInfo.value.appUnlockOnline = state.isOpenLockNeedOnline.value; - eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSettingInfo.value.appUnlockOnline!)); - print("state.lockSettingInfo.value.appUnlockOnline:${state.lockSettingInfo.value.appUnlockOnline}"); - showToast("设置成功"); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, state.lockSettingInfo.value.appUnlockOnline!.toString())); + showToast("设置成功",something: (){ + eventBus.fire(RefreshLockListInfoDataEvent()); + print("state.lockSettingInfo.value.appUnlockOnline:${state.lockSettingInfo.value.appUnlockOnline}"); + }); } } diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart index 3130bd15..e4a2d627 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart @@ -645,35 +645,35 @@ class _LockSetPageState extends State with RouteAware { } // 异常警告 - CupertinoSwitch _lockExceptionWarningsSwitch() { - print("isOpenBlueBroadcast222:${state.isOpenExceptionWarnings.value}"); - return CupertinoSwitch( - activeColor: CupertinoColors.activeBlue, - trackColor: CupertinoColors.systemGrey5, - thumbColor: CupertinoColors.white, - value: (state.isOpenExceptionWarnings.value) == 1 ? true : false, - onChanged: (value) { - setState(() { - logic.sendBurglarAlarm(62); - }); - }, - ); - } + // CupertinoSwitch _lockExceptionWarningsSwitch() { + // print("isOpenBlueBroadcast222:${state.isOpenExceptionWarnings.value}"); + // return CupertinoSwitch( + // activeColor: CupertinoColors.activeBlue, + // trackColor: CupertinoColors.systemGrey5, + // thumbColor: CupertinoColors.white, + // value: (state.isOpenExceptionWarnings.value) == 1 ? true : false, + // onChanged: (value) { + // setState(() { + // logic.sendBurglarAlarm(62); + // }); + // }, + // ); + // } // 逗留警告 - CupertinoSwitch _lockStayWarnSwitch() { - return CupertinoSwitch( - activeColor: CupertinoColors.activeBlue, - trackColor: CupertinoColors.systemGrey5, - thumbColor: CupertinoColors.white, - value: (state.isOpenExceptionWarnings.value) == 1 ? true : false, - onChanged: (value) { - setState(() { - logic.sendBurglarAlarm(61); - }); - }, - ); - } + // CupertinoSwitch _lockStayWarnSwitch() { + // return CupertinoSwitch( + // activeColor: CupertinoColors.activeBlue, + // trackColor: CupertinoColors.systemGrey5, + // thumbColor: CupertinoColors.white, + // value: (state.isOpenExceptionWarnings.value) == 1 ? true : false, + // onChanged: (value) { + // setState(() { + // logic.sendBurglarAlarm(61); + // }); + // }, + // ); + // } // 支持蓝牙广播 CupertinoSwitch _lockBlueBroadcastSwitch() { diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart index a8be938d..344dc8b4 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSoundSet/lockSoundSet_logic.dart @@ -92,6 +92,7 @@ class LockSoundSetLogic extends BaseGetXController { //成功 print("${reply.commandType}数据解析成功"); state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); _setLockSetGeneralSetting(); break; diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart index 8b3545ca..072a40c2 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockTime/lockTime_logic.dart @@ -99,6 +99,7 @@ class LockTimeLogic extends BaseGetXController{ // state.dateTime.value = dataEime; state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); showToast("锁时间更新成功"); break; diff --git a/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart index 64441640..75ab6c3f 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/normallyOpenMode/normallyOpenMode_logic.dart @@ -51,7 +51,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ state.lockSetInfoData.value.lockSettingInfo!.passageMode = state.isOpenNormallyOpenMode.value == true ? 1:0; eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); - eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(2, state.lockSetInfoData.value.lockSettingInfo!.passageMode!)); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(2, state.lockSetInfoData.value.lockSettingInfo!.passageMode!.toString())); showToast("操作成功"); } } @@ -112,6 +112,7 @@ class NormallyOpenModeLogic extends BaseGetXController{ //成功 print("${reply.commandType}数据解析成功"); state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); configPassageMode(); break; diff --git a/star_lock/lib/main/lockDetail/lcokSet/remoteUnlocking/remoteUnlocking_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/remoteUnlocking/remoteUnlocking_logic.dart index e2992155..1f26a280 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/remoteUnlocking/remoteUnlocking_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/remoteUnlocking/remoteUnlocking_logic.dart @@ -85,6 +85,7 @@ class RemoteUnlockingLogic extends BaseGetXController{ //成功 print("${reply.commandType}数据解析成功"); state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); _remoteUnlockingOpenOrClose(); break; diff --git a/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart index cafd12c5..f9fe02aa 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/resetButton/resetButton_logic.dart @@ -86,6 +86,7 @@ class ResetButtonLogic extends BaseGetXController{ //成功 print("${reply.commandType}数据解析成功"); state.sureBtnState.value = 0; + cancelBlueConnetctToastTimer(); dismissEasyLoading(); _setLockSetGeneralSetting(); break; diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 0698489c..66cd304d 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -54,7 +54,7 @@ class LockDetailLogic extends BaseGetXController { } // 添加用户 - if (reply is AddUserReply) { + if ((reply is AddUserReply) && (state.ifCurrentScreen.value == true)) { _replyAddUserKey(reply); } }); @@ -302,6 +302,7 @@ class LockDetailLogic extends BaseGetXController { case 0x00: //成功 print("添加用户数据解析成功"); + cancelBlueConnetctToastTimer(); state.lockUserNo = reply.data[47]; _updateLockUserNo(); @@ -658,16 +659,24 @@ class LockDetailLogic extends BaseGetXController { _lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent = eventBus.on().listen((event) { if (event.type == 0) { // 0考勤 - state.isAttendance.value = event.setResult; - state.keyInfos.value.lockSetting!.attendance = event.setResult; + state.isAttendance.value = int.parse(event.setResult); + state.keyInfos.value.lockSetting!.attendance = int.parse(event.setResult); } else if (event.type == 1) { // 1 开锁时是否需联网 - state.isOpenLockNeedOnline.value = event.setResult; - state.keyInfos.value.lockSetting!.appUnlockOnline = event.setResult; + state.isOpenLockNeedOnline.value = int.parse(event.setResult); + state.keyInfos.value.lockSetting!.appUnlockOnline = int.parse(event.setResult); } else if (event.type == 2) { // 2 常开模式 - state.isOpenPassageMode.value = event.setResult; - state.keyInfos.value.passageMode = event.setResult; + state.isOpenPassageMode.value = int.parse(event.setResult); + state.keyInfos.value.passageMode = int.parse(event.setResult); + } else if (event.type == 3) { + // 3 修改了锁名字 + state.lockAlias.value = event.setResult; + state.keyInfos.value.lockAlias = event.setResult; + } else if (event.type == 4) { + // 4 更新了电量 + state.electricQuantity.value = int.parse(event.setResult); + state.keyInfos.value.electricQuantity = int.parse(event.setResult); } }); } diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart index 2391ef3a..8c8365d2 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart @@ -41,7 +41,7 @@ class _LockDetailMainPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.starLock!.tr, + barTitle: "星锁".tr, haveBack: true, backgroundColor: AppColors.mainColor), body: LockDetailPage(isOnlyOneData:isOnlyOneData, lockListInfoItemEntity: keyInfos), diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 1d1931ef..6fd9aa66 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -50,6 +50,7 @@ class _LockDetailPageState extends State state.keyInfos.value.lockSetting!.appUnlockOnline!; state.electricQuantity.value = state.keyInfos.value.electricQuantity!; state.isOpenPassageMode.value = state.keyInfos.value.passageMode!; + state.lockAlias.value = state.keyInfos.value.lockAlias!; BlueManage().connectDeviceName = state.keyInfos.value.bluetooth!.bluetoothDeviceName!; @@ -124,9 +125,8 @@ class _LockDetailPageState extends State width: 1.sw - 120.w * 2, child: Obx(() => Center( child: Text( - widget.lockListInfoItemEntity.lockAlias!, - style: - TextStyle(fontSize: 22.sp, fontWeight: FontWeight.w400, color: state.isOpenPassageMode.value == 1 ? AppColors.openPassageModeColor : AppColors.darkGrayTextColor), + state.lockAlias.value, + style: TextStyle(fontSize: 22.sp, fontWeight: FontWeight.w400, color: state.isOpenPassageMode.value == 1 ? AppColors.openPassageModeColor : AppColors.darkGrayTextColor), ))) ), Positioned( diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart index 74d851a3..4acdbaf2 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart @@ -26,6 +26,7 @@ class LockDetailState { var isOpenLockNeedOnline = 0.obs; // APP开锁时是否需联网 var electricQuantity = 0.obs; // 电量 var isOpenPassageMode = 0.obs; // 是否开启了常开模式 + var lockAlias = "".obs; // 锁名字 var currentDeviceUUid = "".obs;// 当前设备的uuid diff --git a/star_lock/lib/main/lockMian/lockList/lockList_logic.dart b/star_lock/lib/main/lockMian/lockList/lockList_logic.dart index ebd8d2c6..23f59875 100644 --- a/star_lock/lib/main/lockMian/lockList/lockList_logic.dart +++ b/star_lock/lib/main/lockMian/lockList/lockList_logic.dart @@ -7,34 +7,6 @@ import 'lockList_state.dart'; class LockListLogic extends BaseGetXController{ LockListState state = LockListState(); - String getUseKeyTypeStr(LockListInfoItemEntity indexEntity) { - String useDateStr = ''; - if (indexEntity.keyType == XSConstantMacro.keyTypeTime) { - //限期 - DateTime startDateStr = - DateTime.fromMillisecondsSinceEpoch(indexEntity.startDate!); - DateTime endDateStr = - DateTime.fromMillisecondsSinceEpoch(indexEntity.endDate!); - useDateStr = - '${startDateStr.toLocal().toString().substring(0, 16)} - ${endDateStr.toLocal().toString().substring(0, 16)}'; - } else if (indexEntity.keyType == XSConstantMacro.keyTypeLong) { - //永久 - // DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(indexEntity.date!); - // useDateStr = '${dateStr.toLocal().toString().substring(0, 16)}\n永久'; - useDateStr = '永久'; - } else if (indexEntity.keyType == XSConstantMacro.keyTypeOnce) { - //单次 - // DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(indexEntity.date!); - // useDateStr = '${dateStr.toLocal().toString().substring(0, 16)} \n单次'; - useDateStr = '单次'; - } else if (indexEntity.keyType == XSConstantMacro.keyTypeLoop) { - //循环 - useDateStr = '循环'; - } - - return useDateStr; - } - String showElectricIcon (int electricnumber){ if(electricnumber >= 100){ return 'images/main/icon_lockElectricLevel_5.png'; diff --git a/star_lock/lib/main/lockMian/lockList/lockList_page.dart b/star_lock/lib/main/lockMian/lockList/lockList_page.dart index d372a7d6..76fc80e4 100644 --- a/star_lock/lib/main/lockMian/lockList/lockList_page.dart +++ b/star_lock/lib/main/lockMian/lockList/lockList_page.dart @@ -202,7 +202,7 @@ class _LockListPageState extends State { children: [ SizedBox(width: 30.w), Text( - "${logic.getUseKeyTypeStr(keyInfo)}/${keyInfo.isLockOwner == 1 ? '超级管理员' : (keyInfo.keyRight == 1 ? "授权管理员" : "普通用户")}", + "${logic.getUseKeyTypeStr(keyInfo.startDate, keyInfo.endDate, keyInfo.keyType)}/${keyInfo.isLockOwner == 1 ? '超级管理员' : (keyInfo.keyRight == 1 ? "授权管理员" : "普通用户")}", style: TextStyle( fontSize: 18.sp, color: AppColors.darkGrayTextColor), ), diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart index 94edfc5b..470a6628 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart @@ -32,7 +32,7 @@ class _StarLockMainPageState extends State with BaseWidget { return Scaffold( backgroundColor: const Color(0xFFF5F5F5), appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.starLock!.tr, + barTitle: "星锁".tr, haveBack: false, haveOtherLeftWidget: true, leftWidget: Builder( diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 6e98fe8a..4b6718a0 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -1,24 +1,18 @@ import 'dart:async'; -import 'package:flutter/material.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:get/get.dart'; -import 'package:get_storage/get_storage.dart'; import 'package:star_lock/blue/io_protocol/io_getPrivateKey.dart'; import 'package:star_lock/blue/io_protocol/io_getPublicKey.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import '../../../appRouters.dart'; import '../../../blue/blue_manage.dart'; -import '../../../blue/io_protocol/io_addUser.dart'; import '../../../blue/io_protocol/io_getStarLockStatusInfo.dart'; import '../../../blue/io_reply.dart'; -import '../../../blue/io_tool/io_manager.dart'; -import '../../../blue/io_tool/io_model.dart'; import '../../../blue/io_tool/io_tool.dart'; import '../../../blue/io_tool/manager_event_bus.dart'; import '../../../blue/sender_manage.dart'; -import '../../../tools/dateTool.dart'; import '../../../tools/storage.dart'; import 'nearbyLock_state.dart'; @@ -245,8 +239,7 @@ class NearbyLockLogic extends BaseGetXController { var featureValueLength = reply.data[173]; // 锁特征值说明(本机能支持的功能) // 获取到锁给的字符数组 - var featureValue = - reply.data.sublist(index + 1, index + featureValueLength + 1); + var featureValue = reply.data.sublist(index + 1, index + featureValueLength + 1); String featureValueStr = asciiString(featureValue); state.featureValue = featureValueStr; // List allFeatureValueTwoList = charListChangeIntList(featureValue); @@ -256,9 +249,8 @@ class NearbyLockLogic extends BaseGetXController { // 使能特征值字符串长度 var featureEnValLength = reply.data[index]; // 使能锁特征值说明(本机启用的功能) - var featureEnVal = - reply.data.sublist(index + 1, index + featureEnValLength + 1); - String featureEnValStr = asciiString(featureValue); + var featureEnVal = reply.data.sublist(index + 1, index + featureEnValLength + 1); + String featureEnValStr = asciiString(featureEnVal); state.featureSettingValue = featureEnValStr; // List allFeatureEnValTwoList = charListChangeIntList(featureEnVal); // print("featureEnValLength:$featureEnValLength featureEnVal:$featureEnVal \n featureEnValStr:$featureEnValStr"); diff --git a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart index e45e89c0..593ad4c1 100644 --- a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -1,7 +1,13 @@ import 'dart:async'; +import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:get/get.dart'; +import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; +import 'package:star_lock/blue/io_protocol/io_senderCustomPasswords.dart'; +import 'package:star_lock/blue/io_type.dart'; import '../../../blue/blue_manage.dart'; import '../../../blue/io_protocol/io_addUser.dart'; @@ -12,6 +18,7 @@ import '../../../blue/sender_manage.dart'; import '../../../network/api_repository.dart'; import '../../../tools/baseGetXController.dart'; import '../../../tools/eventBusEventManage.dart'; +import '../../../tools/showTFView.dart'; import '../../../tools/storage.dart'; import 'saveLock_state.dart'; @@ -21,11 +28,19 @@ class SaveLockLogic extends BaseGetXController { // 获取解析后的数据 late StreamSubscription _replySubscription; void _initReplySubscription() { - _replySubscription = - EventBusManager().eventBus!.on().listen((reply) { + _replySubscription = EventBusManager().eventBus!.on().listen((reply) { if (reply is AddUserReply) { _replyAddUserKey(reply); } + + if (reply is SenderCustomPasswordsReply) { + _replySenderCustomPasswords(reply); + } + + if (reply is ChangeAdministratorPasswordReply) { + _replyChangeAdministratorPassword(reply); + } + }); } @@ -50,8 +65,6 @@ class SaveLockLogic extends BaseGetXController { state.lockUserNo = reply.data[47]; cancelBlueConnetctToastTimer(); - dismissEasyLoading(); - bindBlueAdmin(); break; case 0x06: @@ -97,10 +110,120 @@ class SaveLockLogic extends BaseGetXController { } } - // 保存事件,先调用蓝牙,蓝牙调用成功后再调用后台接口 - // saveLockAction(){ - // addUserConnectBlue(); - // } + // 添加管理员密码 + Future _replySenderCustomPasswords(Reply reply) async { + var token = reply.data.sublist(5, 9); + var saveStrList = changeIntListToStringList(token); + print("_replyFactoryDataResetKeyToken:$token"); + Storage.setStringList(saveBlueToken, saveStrList); + + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 数据解析成功"); + dismissEasyLoading(); + addLockAdminPassword(true); + break; + case 0x06: + //无权限 + print("${reply.commandType!.typeValue} 需要鉴权"); + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var signKey = await Storage.getStringList(saveBlueSignKey); + List signKeyDataList = changeStringListToIntList(signKey!); + + IoSenderManage.senderCustomPasswordsCommand( + keyID: "1", + userID: await Storage.getUid(), + pwdNo: 1, + pwd: "123456", + useCountLimit: 0xff, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: token); + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 失败"); + + break; + } + } + + // 修改管理员密码 + Future _replyChangeAdministratorPassword(Reply reply) async { + var token = reply.data.sublist(5, 9); + var saveStrList = changeIntListToStringList(token); + print("_replyFactoryDataResetKeyToken:$token"); + Storage.setStringList(saveBlueToken, saveStrList); + + int status = reply.data[2]; + print("status:$status"); + + switch (status) { + case 0x00: + //成功 + print("${reply.commandType!.typeValue} 数据解析成功"); + cancelBlueConnetctToastTimer(); + addLockAdminPassword(false); + break; + case 0x06: + //无权限 + print("${reply.commandType!.typeValue} 需要鉴权"); + + var signKey = await Storage.getStringList(saveBlueSignKey); + List signKeyDataList = changeStringListToIntList(signKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + IoSenderManage.changeAdministratorPasswordCommand( + keyID: "1", + userID: await Storage.getUid(), + pwdNo: 0, + pwd:state.adminPasswordTF.text, + useCountLimit: 0xff, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: token); + break; + case 0x07: + //无权限 + print("${reply.commandType!.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType!.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType!.typeValue} 失败"); + + break; + } + } // 添加用户 Future addUserConnectBlue() async { @@ -156,6 +279,81 @@ class SaveLockLogic extends BaseGetXController { }, isAddEquipment: true); } + // 设置管理员密码(同添加自定义开锁密码,指纹/密码/卡片前5个是管理员) + Future senderCustomPasswords() async { + var rng = Random(); + var number = rng.nextInt(900000) + 100000; // 生成 100000 到 999999 之间的随机整数 + state.adminPassword = number.toString(); + state.adminPasswordTF.text = number.toString(); + BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState deviceConnectionState) async { + if (deviceConnectionState == DeviceConnectionState.connected) { + var signKey = await Storage.getStringList(saveBlueSignKey); + List signKeyDataList = changeStringListToIntList(signKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + print("openDoorTokenPubToken:$getTokenList"); + + IoSenderManage.senderCustomPasswordsCommand( + keyID: "1", + userID: await Storage.getUid(), + pwdNo: 1, + pwd:state.adminPasswordTF.text, + useCountLimit: 0xff, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList); + } + }, isAddEquipment: true); + } + + // 修改管理员密码(同添加自定义开锁密码,指纹/密码/卡片前5个是管理员) + Future changeAdministratorPasswordCommand() async { + showEasyLoading(); + showBlueConnetctToastTimer(action: (){ + dismissEasyLoading(); + }); + BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState deviceConnectionState) async { + if (deviceConnectionState == DeviceConnectionState.connected) { + var signKey = await Storage.getStringList(saveBlueSignKey); + List signKeyDataList = changeStringListToIntList(signKey!); + + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + print("openDoorTokenPubToken:$getTokenList"); + + IoSenderManage.changeAdministratorPasswordCommand( + keyID: "1", + userID: await Storage.getUid(), + pwdNo: 0, + pwd:state.adminPasswordTF.text, + useCountLimit: 0xff, + startTime: 0x11223344, + endTime: 0x11223344, + needAuthor: 1, + signKey: signKeyDataList, + privateKey: getPrivateKeyList, + token: getTokenList); + } else if (deviceConnectionState == DeviceConnectionState.disconnected) { + print("444444"); + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + state.saveBtnIsUsable.value = true; + if(state.ifCurrentScreen.value == true){ + showBlueConnetctToast(); + } + } + }, isAddEquipment: true); + } void bindBlueAdmin() async{ // print("state.lockInfo:${state.lockInfo}"); @@ -200,12 +398,71 @@ class SaveLockLogic extends BaseGetXController { featureSettingParams: state.featureSettingParams, ); if (entity.errorCode!.codeIsSuccessful) { - BlueManage().disconnect(BlueManage().connectDeviceMacAddress); - eventBus.fire(RefreshLockListInfoDataEvent()); - Get.close(state.isFromMap == 1 ? 5 : 6); + state.lockId = entity.data!.lockId!; + senderCustomPasswords(); + + // BlueManage().disconnect(BlueManage().connectDeviceMacAddress); + // eventBus.fire(RefreshLockListInfoDataEvent()); + // Get.close(state.isFromMap == 1 ? 5 : 6); } } + // 更新管理员密码 + void addLockAdminPassword(bool isAddLockAdminPassword) async { + var entity = await ApiRepository.to.setAdminPasswordData( + lockId: state.lockId, + adminPwd: state.adminPasswordTF.text, + ); + if (entity.errorCode!.codeIsSuccessful) { + if(isAddLockAdminPassword == true){ + showDeletPasswordAlertDialog(); + }else{ + backAction(); + } + } + } + + void showDeletPasswordAlertDialog() { + showDialog( + context: Get.context!, + builder: (BuildContext context) { + return ShowTFView( + title: "管理员密码", + tipTitle: "如需修改,请输入新的管理员密码(6位),点击确定即可修改", + leftBtnTitle: "确定", + rightBtnTitle: "修改", + keyboardType: TextInputType.number, + inputFormatters: [ + FilteringTextInputFormatter.allow(RegExp('[0-9]')), + LengthLimitingTextInputFormatter(6), + ], + controller: state.adminPasswordTF, + sureClick: () { + if(state.adminPasswordTF.text.length < 6){ + showToast("请输入6位管理员密码"); + return; + } + + if(state.adminPasswordTF.text == state.adminPassword){ + showToast("请输入新的管理员密码"); + return; + } + changeAdministratorPasswordCommand(); + }, + cancelClick: () { + backAction(); + }, + ); + }, + ); + } + + void backAction(){ + BlueManage().disconnect(BlueManage().connectDeviceMacAddress); + eventBus.fire(RefreshLockListInfoDataEvent()); + Get.close(state.isFromMap == 1 ? 6 : 7); + } + @override void onReady() { // TODO: implement onReady diff --git a/star_lock/lib/mine/addLock/saveLock/saveLock_state.dart b/star_lock/lib/mine/addLock/saveLock/saveLock_state.dart index 092fd554..bf1c6584 100644 --- a/star_lock/lib/mine/addLock/saveLock/saveLock_state.dart +++ b/star_lock/lib/mine/addLock/saveLock/saveLock_state.dart @@ -9,6 +9,7 @@ class SaveLockState { var aliName = ''.obs; var pwdTimestamp= 0.obs; var addressInfo = {}.obs; + TextEditingController aliNameController = TextEditingController(); var lockUserNo = 0; @@ -21,6 +22,11 @@ class SaveLockState { var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 var saveBtnIsUsable = true.obs; // 保存按钮是否可用 + // 管理员密码 + var adminPasswordTF = TextEditingController(); + var adminPassword = ''; + var lockId = 0; + SaveLockState() { aliName.value = BlueManage().connectDeviceName; aliNameController.text = aliName.value; diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index 71022d2a..f0a20abb 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -1,6 +1,6 @@ abstract class Api { // static String baseAddress = "https://pre.lock.star-lock.cn:8093"; //预发布环境 - static String baseAddress = "http://192.168.56.101:8099"; //联调环境 + static String baseAddress = "https://dev.lock.star-lock.cn"; //联调环境 // static String baseAddress = "http://192.168.1.15:8022"; //谢总本地 final String baseUrl = "$baseAddress/api"; diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 12143824..7cdd771f 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -656,6 +656,15 @@ class ApiProvider extends BaseProvider { 'lockId': lockId, })); + // 设置管理员开锁密码 + Future setAdminPasswordData(int lockId, String adminPwd) => + post( + updateLockSettingUrl.toUrl, + jsonEncode({ + 'lockId': lockId, + 'adminPwd': adminPwd, + })); + // 获取服务器当前时间 Future getServerDatetimeLoadData(String lockId) => post( getServerDatetimeUrl.toUrl, diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 1ab08a0c..c5c3a563 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -703,6 +703,15 @@ class ApiRepository { return GetServerDatetimeEntity.fromJson(res.body); } + // 设置管理员密码 + Future setAdminPasswordData({ + required int lockId, + required String adminPwd, + }) async { + final res = await apiProvider.setAdminPasswordData(lockId, adminPwd); + return GetServerDatetimeEntity.fromJson(res.body); + } + // 获取服务器当前时间 Future getServerDatetimeData({ required String lockId, diff --git a/star_lock/lib/tools/baseGetXController.dart b/star_lock/lib/tools/baseGetXController.dart index 68504bf1..260a1b40 100644 --- a/star_lock/lib/tools/baseGetXController.dart +++ b/star_lock/lib/tools/baseGetXController.dart @@ -5,6 +5,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import '../common/XSConstantMacro/XSConstantMacro.dart'; import 'manager/client_manager.dart'; class BaseGetXController extends GetxController{ @@ -86,9 +87,9 @@ class BaseGetXController extends GetxController{ } void showToast(String status,{Function? something}) { - EasyLoading.showToast(status,duration: 2000.milliseconds); + EasyLoading.showToast(status,duration: 1000.milliseconds); if(something != null) { - delay(duration: 2100.milliseconds,something: something); + delay(duration: 1100.milliseconds,something: something); } } @@ -114,8 +115,33 @@ class BaseGetXController extends GetxController{ Get.offAllNamed(Routers.starLockLoginPage); } - // Future loginSuccess({LoginEntity? loginEntity, bool byToken = false}) async => ClientManager().loginSuccess(loginEntity: loginEntity,byToken: byToken); + String getUseKeyTypeStr(int? startDate, int? endDate,int? keyType) { + String useDateStr = ''; + if (keyType == XSConstantMacro.keyTypeTime) { + //限期 + DateTime startDateStr = + DateTime.fromMillisecondsSinceEpoch(startDate!); + DateTime endDateStr = + DateTime.fromMillisecondsSinceEpoch(endDate!); + useDateStr = + '${startDateStr.toLocal().toString().substring(0, 16)} - ${endDateStr.toLocal().toString().substring(0, 16)}'; + } else if (keyType == XSConstantMacro.keyTypeLong) { + //永久 + // DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(indexEntity.date!); + // useDateStr = '${dateStr.toLocal().toString().substring(0, 16)}\n永久'; + useDateStr = '永久'; + } else if (keyType == XSConstantMacro.keyTypeOnce) { + //单次 + // DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(indexEntity.date!); + // useDateStr = '${dateStr.toLocal().toString().substring(0, 16)} \n单次'; + useDateStr = '单次'; + } else if (keyType == XSConstantMacro.keyTypeLoop) { + //循环 + useDateStr = '循环'; + } + return useDateStr; + } static List splitList(List list, int len) { if (len <= 1) { diff --git a/star_lock/lib/tools/eventBusEventManage.dart b/star_lock/lib/tools/eventBusEventManage.dart index 21c7bab3..05c36ea0 100644 --- a/star_lock/lib/tools/eventBusEventManage.dart +++ b/star_lock/lib/tools/eventBusEventManage.dart @@ -45,8 +45,8 @@ class LockGroupEditGroupLockRefreshEvent { /// 锁设置里面开启关闭刷新锁详情 class LockSetChangeSetRefreshLockDetailWithType { - int type; // 0 考勤 1开锁时是否需联网 2常开模式 - int setResult; + int type; // 0 考勤 1开锁时是否需联网 2常开模式 3修改了锁名字 4修改了电量 + String setResult; LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult); } diff --git a/star_lock/lib/tools/showTFView.dart b/star_lock/lib/tools/showTFView.dart index e9dc6ea2..5f82ffb3 100644 --- a/star_lock/lib/tools/showTFView.dart +++ b/star_lock/lib/tools/showTFView.dart @@ -9,19 +9,25 @@ import '../translations/trans_lib.dart'; class ShowTFView extends StatelessWidget { String? title; String? tipTitle; + String? leftBtnTitle; + String? rightBtnTitle; TextEditingController? controller; List? inputFormatters; + TextInputType? keyboardType; Function()? sureClick; Function()? cancelClick; ShowTFView( {Key? key, - this.title, - this.tipTitle, - this.controller, - this.inputFormatters, - this.sureClick, - this.cancelClick}) + this.title, + this.tipTitle, + this.leftBtnTitle, + this.rightBtnTitle, + this.controller, + this.inputFormatters, + this.keyboardType, + this.sureClick, + this.cancelClick}) : super(key: key); @override @@ -48,6 +54,7 @@ class ShowTFView extends StatelessWidget { controller: controller, autofocus: false, inputFormatters: inputFormatters, + keyboardType: keyboardType, decoration: InputDecoration( contentPadding: const EdgeInsets.only(left: 5, top: -8, bottom: 6), @@ -63,7 +70,7 @@ class ShowTFView extends StatelessWidget { actions: [ CupertinoDialogAction( child: Text( - TranslationLoader.lanKeys!.cancel!.tr, + leftBtnTitle ?? TranslationLoader.lanKeys!.cancel!.tr, style: const TextStyle(color: Colors.black), ), onPressed: () { @@ -75,7 +82,8 @@ class ShowTFView extends StatelessWidget { }, ), CupertinoDialogAction( - child: Text(TranslationLoader.lanKeys!.sure!.tr, + child: Text( + rightBtnTitle ?? TranslationLoader.lanKeys!.sure!.tr, style: const TextStyle(color: Colors.black)), onPressed: () { if (sureClick != null) {