From 3ff1d01d19e64265f612407313334a7812223c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Fri, 14 Jun 2024 15:46:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=AC=E7=A7=BB=E9=94=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE=E5=A4=8D=E8=BD=AC=E7=A7=BB?= =?UTF-8?q?=E9=94=81=E6=A8=A1=E5=9D=97=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/lan/lan_en.json | 19 ++- images/lan/lan_keys.json | 19 ++- images/lan/lan_zh.json | 19 ++- lib/blue/io_protocol/io_factoryDataReset.dart | 9 +- .../io_protocol/io_transferSmartLock.dart | 108 ++++++++++++ .../io_protocol/io_updataLockCardList.dart | 4 +- lib/blue/io_type.dart | 12 ++ lib/blue/reciver_data.dart | 11 +- lib/blue/sender_beforeDataManage.dart | 155 +++++++++++++----- lib/blue/sender_data.dart | 45 +++-- lib/blue/sender_manage.dart | 22 +++ .../card/cardDetail/cardDetail_page.dart | 1 - .../lockDetail/lockDetail_page.dart | 1 + .../lockSet/lockSet/lockSet_state.dart | 38 ++--- .../lockMian/entity/lockListInfo_entity.dart | 4 + .../recipientInformation_logic.dart | 77 +++++---- .../recipientInformation_page.dart | 88 +++++----- .../recipientInformation_state.dart | 22 +-- .../selectBranch/selectBranch_page.dart | 42 +++-- .../transferSmartLock_logic.dart | 23 +-- .../transferSmartLock_page.dart | 113 +++++++++---- .../transferSmartLock_state.dart | 2 +- lib/network/api_provider.dart | 31 ++-- lib/network/api_repository.dart | 27 +-- lib/tools/commonDataManage.dart | 3 + lib/tools/eventBusEventManage.dart | 5 + 26 files changed, 626 insertions(+), 274 deletions(-) create mode 100644 lib/blue/io_protocol/io_transferSmartLock.dart diff --git a/images/lan/lan_en.json b/images/lan/lan_en.json index f902422b..7e3eedea 100755 --- a/images/lan/lan_en.json +++ b/images/lan/lan_en.json @@ -885,5 +885,22 @@ "请输入时间(秒)": "Please enter the time (seconds)", "加载数据失败": "Failed to load data", "重试": "Retry", - "升级中,是否退出": "During the upgrade, whether to exit" + "升级中,是否退出": "During the upgrade, whether to exit", + "下一步": "Next", + "公寓": "Apartment", + "个人用户": "Personal user", + "星寓": "Star apartment", + "账号": "Account", + + "请输入手机号或email": "Please enter mobile phone number or email", + "请输入星寓管理员的账号": "Please enter the account of the star apartment administrator", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "The selected smart lock will be transferred to the account you entered, and you will lose the management rights of the lock", + "暂不支持跨平台转移,敬请期待": "Cross-platform transfer is not supported for the time being, please look forward to it", + "移除坏锁": "Remove bad lock", + "转移确认": "Transfer confirmation", + "本次共转移": "This time a total of", + "把智能锁": "Smart lock", + "确认": "Confirm", + "移除成功": "Remove successfully", + "转移成功": "Transfer success" } diff --git a/images/lan/lan_keys.json b/images/lan/lan_keys.json index 8f5845a0..04ab9d8d 100755 --- a/images/lan/lan_keys.json +++ b/images/lan/lan_keys.json @@ -917,5 +917,22 @@ "请输入时间(秒)": "请输入时间(秒)", "加载数据失败": "加载数据失败", "重试": "重试", - "升级中,是否退出": "升级中,是否退出" + "升级中,是否退出": "升级中,是否退出", + "下一步": "下一步", + "公寓": "公寓", + "个人用户": "个人用户", + "星寓": "星寓", + "账号": "账号", + + "请输入手机号或email": "请输入手机号或email", + "请输入星寓管理员的账号": "请输入星寓管理员的账号", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权", + "暂不支持跨平台转移,敬请期待": "暂不支持跨平台转移,敬请期待", + "移除坏锁": "移除坏锁", + "转移确认": "转移确认", + "本次共转移": "本次共转移", + "把智能锁": "把智能锁", + "确认": "确认", + "移除成功": "移除成功", + "转移成功": "转移成功" } diff --git a/images/lan/lan_zh.json b/images/lan/lan_zh.json index 12c79ae2..7ab290e3 100755 --- a/images/lan/lan_zh.json +++ b/images/lan/lan_zh.json @@ -883,5 +883,22 @@ "请输入时间(秒)": "请输入时间(秒)", "加载数据失败": "加载数据失败", "重试": "重试", - "升级中,是否退出": "升级中,是否退出" + "升级中,是否退出": "升级中,是否退出", + "下一步": "下一步", + "公寓": "公寓", + "个人用户": "个人用户", + "星寓": "星寓", + "账号": "账号", + + "请输入手机号或email": "请输入手机号或email", + "请输入星寓管理员的账号": "请输入星寓管理员的账号", + "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权": "选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权", + "暂不支持跨平台转移,敬请期待": "暂不支持跨平台转移,敬请期待", + "移除坏锁": "移除坏锁", + "转移确认": "转移确认", + "本次共转移": "本次共转移", + "把智能锁": "把智能锁", + "确认": "确认", + "移除成功": "移除成功", + "转移成功": "转移成功" } diff --git a/lib/blue/io_protocol/io_factoryDataReset.dart b/lib/blue/io_protocol/io_factoryDataReset.dart index e4cc87e2..a2108cf8 100755 --- a/lib/blue/io_protocol/io_factoryDataReset.dart +++ b/lib/blue/io_protocol/io_factoryDataReset.dart @@ -1,13 +1,14 @@ -//TODO:添加用户 +//TODO:恢复出厂设置 import 'dart:convert'; -import '../io_tool/io_tool.dart'; -import '../sm4Encipher/sm4.dart'; +import 'package:crypto/crypto.dart' as crypto; + import '../io_reply.dart'; import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; +import '../sm4Encipher/sm4.dart'; class FactoryDataResetCommand extends SenderProtocol { diff --git a/lib/blue/io_protocol/io_transferSmartLock.dart b/lib/blue/io_protocol/io_transferSmartLock.dart new file mode 100644 index 00000000..2e3960e0 --- /dev/null +++ b/lib/blue/io_protocol/io_transferSmartLock.dart @@ -0,0 +1,108 @@ + +//TODO:转移智能锁 +import 'dart:convert'; + +import 'package:crypto/crypto.dart' as crypto; + +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; +import '../sm4Encipher/sm4.dart'; + +class TransferSmartLockCommand extends SenderProtocol { + + String? lockID; + String? userID; + String? keyID; + List? publicKey; + List? privateKey; + List? token; + int? needAuthor; + TransferSmartLockCommand({ + this.lockID, + this.userID, + this.keyID, + this.token, + this.needAuthor, + this.publicKey, + this.privateKey, + }) : super(CommandType.transferSmartLock); + + + @override + String toString() { + return 'TransferSmartLockCommand{lockID: $lockID, userID: $userID, ' + 'keyID: $keyID, publicKey: $publicKey, privateKey: $privateKey, ' + 'token: $token, needAuthor: $needAuthor}'; + } + + @override + List messageDetail() { + List data = []; + List ebcData = []; + + // 指令类型 + final int type = commandType!.typeValue; + final double typeDouble = type / 256; + final int type1 = typeDouble.toInt(); + final int type2 = type % 256; + data.add(type1); + data.add(type2); + + // 锁id 40 + final int lockIDLength = utf8.encode(lockID!).length; + data.addAll(utf8.encode(lockID!)); + data = getFixedLengthList(data, 40 - lockIDLength); + + //userID 20 + final int userIDLength = utf8.encode(userID!).length; + data.addAll(utf8.encode(userID!)); + data = getFixedLengthList(data, 20 - userIDLength); + + // token 长度4 首次请求 Token 填 0,如果锁需要鉴权 操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 当token失效或者第一次发送的时候token为0 + data.addAll(token!); + + if(needAuthor == 0){ + //AuthCodeLen 1 + data.add(0); + } else { + final List authCodeData = []; + + //userID + authCodeData.addAll(utf8.encode(lockID!)); + + //token 4 首次请求 Token 填 0,如果锁需要鉴权操作者身份,则会分配动态口令并在应答消息中返回,二次请求时带上。 + authCodeData.addAll(token!); + + authCodeData.addAll(publicKey!); + + // 把KeyID、authUserID、时间戳、公钥通过md5加密之后就是authCode + final crypto.Digest authCode = crypto.md5.convert(authCodeData); + + data.add(authCode.bytes.length); + data.addAll(authCode.bytes); + } + + if ((data.length % 16) != 0) { + final int add = 16 - data.length % 16; + for (int i = 0; i < add; i++) { + data.add(0); + } + } + + printLog(data); + // 拿到数据之后通过LockId进行SM4 ECB加密 key:544d485f633335373034383064613864 + ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB); + return ebcData; + } +} + +class TransferSmartLockReply extends Reply { + TransferSmartLockReply.parseData(CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + final int status = data[6]; + errorWithStstus(status); + } +} \ No newline at end of file diff --git a/lib/blue/io_protocol/io_updataLockCardList.dart b/lib/blue/io_protocol/io_updataLockCardList.dart index ac2360af..4f05fb30 100644 --- a/lib/blue/io_protocol/io_updataLockCardList.dart +++ b/lib/blue/io_protocol/io_updataLockCardList.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:crypto/crypto.dart' as crypto; + import '../io_reply.dart'; import '../io_sender.dart'; import '../io_tool/io_tool.dart'; import '../io_type.dart'; -import 'package:crypto/crypto.dart' as crypto; - import '../sm4Encipher/sm4.dart'; class UpdataLockCardListCommand extends SenderProtocol { diff --git a/lib/blue/io_type.dart b/lib/blue/io_type.dart index 7153475c..9bb992c9 100755 --- a/lib/blue/io_type.dart +++ b/lib/blue/io_type.dart @@ -3,6 +3,7 @@ enum CommandType { addUser, //增加用户 = 0x3001 deletUser, //删除用户 = 0x3002 editUser, //修改用户 = 0x3003 + transferSmartLock, //转移智能锁 = 0x300D factoryDataReset, //恢复出厂设置 = 0x3004 openLock, //开门 = 0x3005 readLockStatusInfo, //读取锁状态信息 = 0x300A @@ -84,6 +85,11 @@ extension ExtensionCommandType on CommandType { type = CommandType.cleanUpUsers; } break; + case 0x300D: + { + type = CommandType.transferSmartLock; + } + break; case 0x300A: { type = CommandType.readLockStatusInfo; @@ -199,6 +205,9 @@ extension ExtensionCommandType on CommandType { case CommandType.cleanUpUsers: type = 0x300C; break; + case CommandType.transferSmartLock: + type = 0x300D; + break; case CommandType.readLockStatusInfo: type = 0x300A; break; @@ -299,6 +308,9 @@ extension ExtensionCommandType on CommandType { case 0x300C: t = '清理用户'; break; + case 0x300D: + t = '转移智能锁'; + break; case 0x300A: t = '读取锁状态信息'; break; diff --git a/lib/blue/reciver_data.dart b/lib/blue/reciver_data.dart index 20db084a..6069abb7 100755 --- a/lib/blue/reciver_data.dart +++ b/lib/blue/reciver_data.dart @@ -22,7 +22,6 @@ import 'package:star_lock/blue/io_protocol/io_timing.dart'; import 'package:star_lock/blue/io_protocol/io_transferPermissions.dart'; import '../tools/storage.dart'; - import 'io_protocol/io_addFingerprintWithTimeCycleCoercion.dart'; import 'io_protocol/io_addICCardWithTimeCycleCoercion.dart'; import 'io_protocol/io_addStressPassword.dart'; @@ -37,7 +36,9 @@ import 'io_protocol/io_getWifiList.dart'; import 'io_protocol/io_openLock.dart'; import 'io_protocol/io_queryingFingerprintStatus.dart'; import 'io_protocol/io_referEventRecordNumber.dart'; +import 'io_protocol/io_senderCustomPasswords.dart'; import 'io_protocol/io_senderResetPasswords.dart'; +import 'io_protocol/io_transferSmartLock.dart'; import 'io_protocol/io_updataLockCardList.dart'; import 'io_protocol/io_updataLockFaceList.dart'; import 'io_protocol/io_updataLockFingerprintList.dart'; @@ -45,11 +46,10 @@ import 'io_protocol/io_updataLockPalmVeinList.dart'; import 'io_protocol/io_updataLockPasswordList.dart'; import 'io_protocol/io_updataLockSet.dart'; import 'io_reply.dart'; -import 'io_protocol/io_senderCustomPasswords.dart'; -import 'io_type.dart'; import 'io_tool/io_manager.dart'; import 'io_tool/io_tool.dart'; import 'io_tool/manager_event_bus.dart'; +import 'io_type.dart'; import 'sm4Encipher/sm4.dart'; class CommandReciverManager { @@ -172,6 +172,11 @@ class CommandReciverManager { reply = TransferPermissionsReply.parseData(commandType, data); } break; + case CommandType.transferSmartLock: + { + reply = TransferSmartLockReply.parseData(commandType, data); + } + break; case CommandType.factoryDataReset: { reply = FactoryDataResetReply.parseData(commandType, data); diff --git a/lib/blue/sender_beforeDataManage.dart b/lib/blue/sender_beforeDataManage.dart index f751832b..e34ba60c 100755 --- a/lib/blue/sender_beforeDataManage.dart +++ b/lib/blue/sender_beforeDataManage.dart @@ -1,6 +1,7 @@ + import 'dart:async'; -import 'package:star_lock/app_settings/app_settings.dart'; +import 'package:star_lock/blue/entity/lock_user_no_list_entity.dart'; import 'package:star_lock/blue/io_protocol/io_cleanUpUsers.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart'; @@ -14,15 +15,18 @@ import '../tools/commonDataManage.dart'; import '../tools/storage.dart'; import 'blue_manage.dart'; import 'io_protocol/io_addUser.dart'; +import 'io_protocol/io_transferSmartLock.dart'; import 'io_reply.dart'; import 'io_tool/io_tool.dart'; import 'io_tool/manager_event_bus.dart'; import 'sender_data.dart'; class SenderBeforeDataManage { - static SenderBeforeDataManage? _manager; + + factory SenderBeforeDataManage() => shareManager()!; SenderBeforeDataManage._init(); + static SenderBeforeDataManage? _manager; static SenderBeforeDataManage? shareManager() { _manager ??= SenderBeforeDataManage._init(); @@ -30,8 +34,6 @@ class SenderBeforeDataManage { return _manager; } - factory SenderBeforeDataManage() => shareManager()!; - SenderBeforeDataManage? get manager => shareManager(); void _init() { @@ -40,10 +42,12 @@ class SenderBeforeDataManage { // 监听设备返回的数据 StreamSubscription? _replySubscription; + // 是否是添加用户之前的调用 bool isBeforeAddUser = true; + // 启动订阅 void _initReplySubscription() { - _replySubscription ??= EventBusManager().eventBus!.on().listen((reply) async { + _replySubscription ??= EventBusManager().eventBus!.on().listen((Reply reply) async { // 添加用户 if (reply is AddUserReply && isBeforeAddUser == false) { _replyAddUserKey(reply); @@ -52,32 +56,36 @@ class SenderBeforeDataManage { if (reply is CleanUpUsersReply) { _cleanUpUsersReply(reply); } + + if (reply is TransferSmartLockReply) { + _transferSmartLockReply(reply); + } }); } // 解析添加用户订阅 Future _replyAddUserKey(Reply reply) async { - int status = reply.data[46]; + final int status = reply.data[46]; switch (status) { case 0x00: //成功 - CommonDataManage().currentLockUserNo = - listChangInt(reply.data.sublist(47, 49)); - CommonDataManage().currentKeyInfo.lockUserNo = - CommonDataManage().currentLockUserNo; - _updateLockUserNo(); + var userNoData = reply.data.sublist(47, 49); + CommonDataManage().currentLockUserNo = listChangInt(userNoData); + CommonDataManage().currentKeyInfo.lockUserNo = CommonDataManage().currentLockUserNo; + + _updateLockUserNo(userNoData); break; case 0x06: //无权限 - var token = reply.data.sublist(42, 46); - List strTokenList = changeIntListToStringList(token); + final List token = reply.data.sublist(42, 46); + final List strTokenList = changeIntListToStringList(token); Storage.setStringList(saveBlueToken, strTokenList); - var addUserData = await getAddUserKeyData(tokenList: token); + final List addUserData = await getAddUserKeyData(tokenList: token); eventBus.fire(LockAddUserSucceedEvent(addUserData, 1)); break; case 0x0c: //锁设备用户超过 32个,需要同步锁用户列表刷新 - var addUserData = await getCleanUpUsers(); + final List addUserData = await getCleanUpUsers(); CommandSenderManager().sendNormalData(addUserData); break; default: @@ -88,20 +96,20 @@ class SenderBeforeDataManage { // 解析清理用户订阅 Future _cleanUpUsersReply(Reply reply) async { - int status = reply.data[6]; + final int status = reply.data[6]; switch (status) { case 0x00: //成功 //添加用户 - var addUserData = await getAddUserKeyData(); + final List addUserData = await getAddUserKeyData(); CommandSenderManager().sendNormalData(addUserData); break; case 0x06: //无权限 - var token = reply.data.sublist(2, 6); - List strTokenList = changeIntListToStringList(token); + final List token = reply.data.sublist(2, 6); + final List strTokenList = changeIntListToStringList(token); Storage.setStringList(saveBlueToken, strTokenList); - var addUserData = await getCleanUpUsers(tokenList: token); + final List addUserData = await getCleanUpUsers(tokenList: token); CommandSenderManager().sendNormalData(addUserData); break; default: @@ -110,26 +118,52 @@ class SenderBeforeDataManage { } } + // 转移锁指令 + Future _transferSmartLockReply(Reply reply) async { + final int status = reply.data[6]; + switch (status) { + case 0x00: + //成功 + CommonDataManage().initUserNo = 0; + CommonDataManage().currentKeyInfo.initUserNo = 0; + + _updateLockInitUserNo(); + break; + case 0x06: + //无权限 + final List token = reply.data.sublist(2, 6); + final List strTokenList = changeIntListToStringList(token); + Storage.setStringList(saveBlueToken, strTokenList); + + final List transferSmartLockData = await getTransferSmartLockData(tokenList: token); + CommandSenderManager().sendNormalData(transferSmartLockData); + break; + default: + //失败 + break; + } + } + //获取清除用户列表指令 Future> getCleanUpUsers({List? tokenList}) async { - var entity = await ApiRepository.to + final LockUserNoListEntity entity = await ApiRepository.to .getLockUserNoList(lockId: CommonDataManage().currentKeyInfo.lockId!); if (!entity.errorCode!.codeIsSuccessful || - (entity.data?.userNos ?? []).isEmpty) { + (entity.data?.userNos ?? []).isEmpty) { throw Exception('ApiRepository.to.getLockUserNoList 访问失败'); } - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List publicKeyDataList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List publicKeyDataList = changeStringListToIntList(publicKey!); if (tokenList == null) { - var tokenKey = await Storage.getStringList(saveBlueToken); + final List? tokenKey = await Storage.getStringList(saveBlueToken); tokenList = changeStringListToIntList(tokenKey!); } - var cleanUpUsersData = CleanUpUsersCommand( + final CleanUpUsersCommand cleanUpUsersData = CleanUpUsersCommand( lockID: BlueManage().connectDeviceName, authUserID: CommonDataManage().currentKeyInfo.senderUserId!.toString(), keyID: CommonDataManage().currentKeyInfo.keyId.toString(), @@ -145,24 +179,24 @@ class SenderBeforeDataManage { //获取添加用户指令 Future> getAddUserKeyData({List? tokenList}) async { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); - var publicKey = await Storage.getStringList(saveBluePublicKey); - List publicKeyDataList = changeStringListToIntList(publicKey!); + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List publicKeyDataList = changeStringListToIntList(publicKey!); if (tokenList == null) { - var token = await Storage.getStringList(saveBlueToken); + final List? token = await Storage.getStringList(saveBlueToken); tokenList = changeStringListToIntList(token!); } - LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo; + final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo; DateTime? startTime; DateTime? endTime; - var startDateTime = 0; - var endDateTime = 0; + int startDateTime = 0; + int endDateTime = 0; bool isRound = false; - var useCountLimit = 0xffff; + int useCountLimit = 0xffff; if(currentKeyInfo.keyType == XSConstantMacro.keyTypeTime){ // 限时 startDateTime = currentKeyInfo.startDate! ~/ 1000; @@ -181,7 +215,7 @@ class SenderBeforeDataManage { } // AppLog.log("startTime.hour:${startTime!.hour} startTime.minute:${startTime!.minute} endTime.hour:${endTime!.hour} endTime.minute:${endTime!.minute}}"); - var addUserData = AddUserCommand( + final AddUserCommand addUserData = AddUserCommand( lockID: BlueManage().connectDeviceName, authUserID: currentKeyInfo.senderUserId!.toString(), keyID: currentKeyInfo.keyId.toString(), @@ -201,7 +235,7 @@ class SenderBeforeDataManage { endHour: isRound ? endTime!.hour : 0, endMin: isRound ? endTime!.minute : 0, role: currentKeyInfo.keyRight == 1 ? 1 : 0, - password: "123456", + password: '123456', needAuthor: 1, publicKey: publicKeyDataList, privateKey: getPrivateKeyList, @@ -209,13 +243,50 @@ class SenderBeforeDataManage { return addUserData.packageData(); } + //获取转移智能锁指令数据 + Future> getTransferSmartLockData({List? tokenList}) async { + final List? privateKey = await Storage.getStringList(saveBluePrivateKey); + final List getPrivateKeyList = changeStringListToIntList(privateKey!); + + final List? publicKey = await Storage.getStringList(saveBluePublicKey); + final List publicKeyDataList = changeStringListToIntList(publicKey!); + + if (tokenList == null) { + final List? token = await Storage.getStringList(saveBlueToken); + tokenList = changeStringListToIntList(token!); + } + final LockListInfoItemEntity currentKeyInfo = CommonDataManage().currentKeyInfo; + + final TransferSmartLockCommand transferSmartLockData = TransferSmartLockCommand( + lockID: BlueManage().connectDeviceName, + keyID: currentKeyInfo.keyId.toString(), + userID: await Storage.getUid(), + needAuthor: 1, + publicKey: publicKeyDataList, + privateKey: getPrivateKeyList, + token: tokenList); + return transferSmartLockData.packageData(); + } + // 普通用户接收电子钥匙之后 更新锁用户NO - void _updateLockUserNo() async { - LockNetTokenEntity entity = await ApiRepository.to.updateLockUserNo( + Future _updateLockUserNo(List dataList) async { + final LockNetTokenEntity entity = await ApiRepository.to.updateLockUserNo( keyId: CommonDataManage().currentKeyInfo.keyId.toString(), lockUserNo: CommonDataManage().currentKeyInfo.lockUserNo.toString()); if (entity.errorCode!.codeIsSuccessful) { - eventBus.fire(LockAddUserSucceedEvent([0], 0)); + eventBus.fire(RefreshLockListInfoDataEvent()); + eventBus.fire(LockAddUserSucceedEvent([0], 0)); + } + } + + // 更新锁用户InitUserNo + Future _updateLockInitUserNo() async { + final LockNetTokenEntity entity = await ApiRepository.to.updateLockInitUserNo( + lockId: CommonDataManage().currentKeyInfo.lockId ?? 0, + initUserNo: CommonDataManage().currentKeyInfo.initUserNo ?? 0); + if (entity.errorCode!.codeIsSuccessful) { + eventBus.fire(RefreshLockListInfoDataEvent()); + eventBus.fire(LockInitUserNoEvent()); } } diff --git a/lib/blue/sender_data.dart b/lib/blue/sender_data.dart index b8485900..3e4986b1 100755 --- a/lib/blue/sender_data.dart +++ b/lib/blue/sender_data.dart @@ -1,10 +1,10 @@ + import 'dart:async'; import '../app_settings/app_settings.dart'; import '../tools/commonDataManage.dart'; import '../tools/eventBusEventManage.dart'; import 'io_sender.dart'; -import 'io_type.dart'; import 'io_tool/io_model.dart'; import 'io_tool/manager_event_bus.dart'; import 'sender_beforeDataManage.dart'; @@ -12,27 +12,26 @@ import 'sender_beforeDataManage.dart'; typedef CommandSendCallBack = void Function(ErrorType errorType); class CommandSenderManager { - static final CommandSenderManager _manager = CommandSenderManager._init(); - factory CommandSenderManager() => _manager; - static CommandSenderManager getInstance() => _manager; - CommandSenderManager._init() { init(); } + static final CommandSenderManager _manager = CommandSenderManager._init(); + + static CommandSenderManager getInstance() => _manager; init() { - initLockAddUserSucceedEvent(); + _initLockAddUserSucceedEvent(); + _initTransferSmartLockSucceedEvent(); } - // 下级界面修改成功后传递数据 + // 蓝牙添加用户成功 继续发送上次未发送的数据 StreamSubscription? _passCurrentLockInformationEvent; - List dataBeforeAddTheUser = []; - - void initLockAddUserSucceedEvent() { + List dataBeforeAddTheUser = []; + void _initLockAddUserSucceedEvent() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _passCurrentLockInformationEvent = eventBus.on().listen((event) { + _passCurrentLockInformationEvent = eventBus.on().listen((LockAddUserSucceedEvent event) { if (event.type == 0) { sendNormalData(dataBeforeAddTheUser); } else { @@ -41,10 +40,18 @@ class CommandSenderManager { }); } + StreamSubscription? _transferSmartLockEvent; + List dataTransferSmartLock = []; + void _initTransferSmartLockSucceedEvent() { + // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus + _transferSmartLockEvent = eventBus.on().listen((LockInitUserNoEvent event) { + sendNormalData(dataTransferSmartLock); + }); + } + // CommandType lastCommandType = CommandType.readLockStatusInfo; bool canSendControlCommand = false; - //TODO:发送常规数据 Future managerSendData( {required SenderProtocol command, bool isBeforeAddUser = false, @@ -56,15 +63,22 @@ class CommandSenderManager { } SenderBeforeDataManage().isBeforeAddUser = isBeforeAddUser; - List value = command.packageData(); + final List value = command.packageData(); if (isBeforeAddUser == true) { // 如果是添加用户之前调用协议 直接发送 sendNormalData(value); } else { + // 当前锁被转移了 需要更新锁的userid 调用转移锁协议 + if(CommonDataManage().initUserNo == 1){ + final List entity = await SenderBeforeDataManage().getTransferSmartLockData(); + sendNormalData(entity); + dataTransferSmartLock = value; + return; + } // 添加用户之后调用协议就要判断是否添加用户 if (CommonDataManage().currentLockUserNo == 0) { // 如果LockUserNo为0,先添加用户 - var entity = await SenderBeforeDataManage().getAddUserKeyData(); + final List entity = await SenderBeforeDataManage().getAddUserKeyData(); sendNormalData(entity); dataBeforeAddTheUser = value; } else { @@ -73,7 +87,7 @@ class CommandSenderManager { } } - void sendNormalData(List data) async { + Future sendNormalData(List data) async { if (data.isNotEmpty) { EventBusManager().eventBusFir( EventSendModel(data: data, sendChannel: DataChannel.ble)); @@ -137,5 +151,6 @@ class CommandSenderManager { dispose() { _passCurrentLockInformationEvent?.cancel(); + _transferSmartLockEvent?.cancel(); } } diff --git a/lib/blue/sender_manage.dart b/lib/blue/sender_manage.dart index e2cd0759..04e3097c 100755 --- a/lib/blue/sender_manage.dart +++ b/lib/blue/sender_manage.dart @@ -278,6 +278,28 @@ class IoSenderManage { callBack: callBack); } + //todo:转移智能锁 + static void sendTransferSmartLockCommand( + {required String? lockID, + required String? userID, + required String? keyID, + required List? publicKey, + required List? privateKey, + required List? token, + required int? needAuthor, + CommandSendCallBack? callBack}) { + CommandSenderManager().managerSendData( + command: FactoryDataResetCommand( + lockID: lockID, + userID: userID, + keyID: keyID, + needAuthor: needAuthor, + publicKey: publicKey, + privateKey: privateKey, + token: token), + callBack: callBack); + } + //todo:恢复出厂设置 static void senderFactoryDataReset( {required String? lockID, diff --git a/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart b/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart index 73743c83..d6126b9d 100755 --- a/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart +++ b/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart @@ -100,7 +100,6 @@ class _CardDetailPageState extends State with RouteAware { state.starTime.value = data['starTime']; state.endTime.value = data['endTime']; state.weekDay.value = data['weekDay']; - }); } } diff --git a/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 196d7ba6..79e27ef0 100755 --- a/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -84,6 +84,7 @@ class _LockDetailPageState extends State Future loadData() async { state.keyInfos.value = widget.lockListInfoItemEntity; CommonDataManage().currentLockUserNo = state.keyInfos.value.lockUserNo!; + CommonDataManage().initUserNo = state.keyInfos.value.initUserNo!; CommonDataManage().currentKeyInfo = state.keyInfos.value; state.lockUserNo = state.keyInfos.value.lockUserNo!; diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSet_state.dart b/lib/main/lockDetail/lockSet/lockSet/lockSet_state.dart index e791f008..4ad0d0d7 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSet_state.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSet_state.dart @@ -5,32 +5,32 @@ import 'package:get/get.dart'; import 'lockSetInfo_entity.dart'; class LockSetState { - final lockSetInfoData = LockSetInfoData().obs; - final lockFeature = LockFeature().obs; - final lockSettingInfo = LockSettingInfo().obs; - final lockStatus = LockStatus().obs; - final lockBasicInfo = LockBasicInfo().obs; + final Rx lockSetInfoData = LockSetInfoData().obs; + final Rx lockFeature = LockFeature().obs; + final Rx lockSettingInfo = LockSettingInfo().obs; + final Rx lockStatus = LockStatus().obs; + final Rx lockBasicInfo = LockBasicInfo().obs; - final lockId = 0.obs; + final RxInt lockId = 0.obs; - var isOnlyOneData = false.obs; - var isAttendance = 0.obs; // 是否开启考勤 - var isOpenLockNeedOnline = 0.obs; // APP开锁时是否需联网 + RxBool isOnlyOneData = false.obs; + RxInt isAttendance = 0.obs; // 是否开启考勤 + RxInt isOpenLockNeedOnline = 0.obs; // APP开锁时是否需联网 - var isUnlockReminder = 0.obs; // 是否开启开锁提醒 - var isOpenBlueBroadcast = 0.obs; // 是否开启蓝牙广播 - var isOpenExceptionWarnings = 0.obs; // 是否开启异常警告 - var isOpenStayWarn = 0.obs; // 是否开启逗留警告 + RxInt isUnlockReminder = 0.obs; // 是否开启开锁提醒 + RxInt isOpenBlueBroadcast = 0.obs; // 是否开启蓝牙广播 + RxInt isOpenExceptionWarnings = 0.obs; // 是否开启异常警告 + RxInt isOpenStayWarn = 0.obs; // 是否开启逗留警告 - var passwordTF = TextEditingController(); + TextEditingController passwordTF = TextEditingController(); - var settingUpSupportFeatures = 0; - var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 - var deleteAdministratorIsHaveAllData = false.obs; // 删除管理员是否有所有数据 + int settingUpSupportFeatures = 0; + RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + RxBool deleteAdministratorIsHaveAllData = false.obs; // 删除管理员是否有所有数据 LockSetState() { Map map = Get.arguments; - lockId.value = map["lockId"]; - isOnlyOneData.value = map["isOnlyOneData"]; + lockId.value = map['lockId']; + isOnlyOneData.value = map['isOnlyOneData']; } } diff --git a/lib/main/lockMian/entity/lockListInfo_entity.dart b/lib/main/lockMian/entity/lockListInfo_entity.dart index ecb49bbd..d1860b4b 100755 --- a/lib/main/lockMian/entity/lockListInfo_entity.dart +++ b/lib/main/lockMian/entity/lockListInfo_entity.dart @@ -143,6 +143,7 @@ class LockListInfoItemEntity { int? hasGateway; int? appUnlockOnline; String? mac; + int? initUserNo; LockListInfoItemEntity({ this.keyId, @@ -180,6 +181,7 @@ class LockListInfoItemEntity { this.hasGateway, this.appUnlockOnline, this.mac, + this.initUserNo, }); LockListInfoItemEntity.fromJson(Map json) { @@ -224,6 +226,7 @@ class LockListInfoItemEntity { hasGateway = json['hasGateway']; appUnlockOnline = json['appUnlockOnline']; mac = json['mac']; + initUserNo = json['initUserNo']; } Map toJson() { @@ -269,6 +272,7 @@ class LockListInfoItemEntity { data['hasGateway'] = hasGateway; data['appUnlockOnline'] = appUnlockOnline; data['mac'] = mac; + data['initUserNo'] = initUserNo; return data; } diff --git a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart index bc8383f8..d4bec36e 100755 --- a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart +++ b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_logic.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import '../../../../main/lockMian/entity/lockListInfo_entity.dart'; import '../../../../network/api_repository.dart'; import '../../../../tools/eventBusEventManage.dart'; import '../../../../translations/trans_lib.dart'; @@ -13,8 +14,8 @@ class RecipientInformationLogic extends BaseGetXController{ // 转移智能锁确认 Future transferLockConfirmInfoData(void Function(RecipientInformationData recipientInformationData) action) async{ - var entity = await ApiRepository.to.transferLockConfirmInfoData( - receiverUserid: state.numberController.text, + final RecipientInformationEntity entity = await ApiRepository.to.transferLockConfirmInfoData( + receiverUsername: state.numberController.text, type: state.type.value.toString(), countryCode: state.countryCode.value ); @@ -29,32 +30,51 @@ class RecipientInformationLogic extends BaseGetXController{ // 转移智能锁 Future transferLockInfoData() async{ - var entity = await ApiRepository.to.transferLockInfoData( - receiverUserid: state.numberController.text, + final RecipientInformationEntity entity = await ApiRepository.to.transferLockInfoData( + receiverUsername: state.numberController.text, lockIdList: state.idList.value, countryCode: state.countryCode.value ); if(entity.errorCode!.codeIsSuccessful){ - Get.back(result: "scuess"); - eventBus.fire(RefreshLockListInfoDataEvent()); + showToast('转移成功'.tr, something: (){ + Get.back(result: 'scuess'); + }); } } // 移除坏锁 Future removeBrokenLockData() async{ - var entity = await ApiRepository.to.removeBrokenLockData( + final RecipientInformationEntity entity = await ApiRepository.to.removeBrokenLockData( lockIdList: state.idList.value, ); if(entity.errorCode!.codeIsSuccessful){ - eventBus.fire(RefreshLockListInfoDataEvent()); - Get.back(result: "scuess"); + showToast('移除成功'.tr, something: (){ + Get.back(result: 'scuess'); + }); + } + } + + // 查询账户密码 + Future checkLoginPassword() async { + final LockListInfoEntity entity = await ApiRepository.to.checkLoginPassword( + password: state.passwordTF.text, + ); + if (entity.errorCode!.codeIsSuccessful) { + Get.back(); + if (state.isFromType.value == 1) { + // 转移智能锁 transferGatewayInfoData + transferLockInfoData(); + } else { + // 转移网关 + transferGatewayInfoData(); + } } } // 转移网关确认 Future transferGateWayConfirmInfoData(void Function(RecipientInformationData recipientInformationData) action) async{ - var entity = await ApiRepository.to.transferGatewayConfirmInfoData( - receiverUserid: state.numberController.text, + final RecipientInformationEntity entity = await ApiRepository.to.transferGatewayConfirmInfoData( + receiverUsername: state.numberController.text, type: state.type.value.toString(), countryCode: state.countryCode.value ); @@ -65,13 +85,13 @@ class RecipientInformationLogic extends BaseGetXController{ // 转移网关 Future transferGatewayInfoData() async{ - var entity = await ApiRepository.to.transferGatewayInfoData( - receiverUserid: state.numberController.text, + final RecipientInformationEntity entity = await ApiRepository.to.transferGatewayInfoData( + receiverUsername: state.numberController.text, plugIdList: state.idList.value, countryCode: state.countryCode.value ); if(entity.errorCode!.codeIsSuccessful){ - Get.back(result: "scuess"); + Get.back(result: 'scuess'); } } @@ -79,16 +99,14 @@ class RecipientInformationLogic extends BaseGetXController{ void showDeletAlertDialog() { showCupertinoDialog( context: Get.context!, - builder: (context) { + builder: (BuildContext context) { return CupertinoAlertDialog( - title: const Text("提示"), + title: const Text('提示'), content: const Text('确定要移除所选中的坏锁吗?'), - actions: [ + actions: [ CupertinoDialogAction( child: Text(TranslationLoader.lanKeys!.cancel!.tr), - onPressed: () { - Get.back(); - }, + onPressed: Get.back, ), CupertinoDialogAction( child: Text(TranslationLoader.lanKeys!.sure!.tr), @@ -103,23 +121,4 @@ class RecipientInformationLogic extends BaseGetXController{ ); } - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - } - - @override - void onInit() { - // TODO: implement onInit - super.onInit(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - - } - } \ No newline at end of file diff --git a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart index 5eb86bc8..218e5bbf 100755 --- a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart +++ b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_page.dart @@ -1,3 +1,4 @@ + import 'package:flutter/material.dart'; import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; @@ -11,6 +12,8 @@ import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; import '../../../../../translations/trans_lib.dart'; import '../../../../tools/commonItem.dart'; +import '../../../../tools/customNetworkImage.dart'; +import '../../../../tools/showTipView.dart'; import 'recipientInformation_entity.dart'; class RecipientInformationPage extends StatefulWidget { @@ -61,7 +64,7 @@ class _RecipientInformationPageState extends State { state.type.value == 1 ? 'images/select_circle.png' : 'images/normal_circle.png', - '个人用户', () { + '个人用户'.tr, () { setState(() { state.type.value = 1; }); @@ -70,7 +73,7 @@ class _RecipientInformationPageState extends State { state.type.value == 2 ? 'images/select_circle.png' : 'images/normal_circle.png', - '星寓', () { + '星寓'.tr, () { setState(() { state.type.value = 2; }); @@ -90,9 +93,7 @@ class _RecipientInformationPageState extends State { mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox( - width: 40.w, - ), + SizedBox(width: 20.w), GestureDetector( child: Image.asset( leftIcon, @@ -100,9 +101,7 @@ class _RecipientInformationPageState extends State { height: 20.w, ), ), - SizedBox( - width: 16.w, - ), + SizedBox(width: 16.w), Text( leftTitle, style: TextStyle(fontSize: 24.sp), @@ -122,9 +121,9 @@ class _RecipientInformationPageState extends State { Row( children: [ SizedBox( - width: 40.w, + width: 20.w, ), - Text('账号', + Text('账号'.tr, style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 22.sp)), Expanded( @@ -136,7 +135,7 @@ class _RecipientInformationPageState extends State { decoration: InputDecoration( border: InputBorder.none, hintText: - state.type.value == 1 ? '请输入手机号或email' : '请输入星寓管理员的账号', + state.type.value == 1 ? '请输入手机号或email'.tr : '请输入星寓管理员的账号'.tr, hintStyle: TextStyle( color: AppColors.placeholderTextColor, fontSize: ScreenUtil().setSp(22), @@ -205,7 +204,7 @@ class _RecipientInformationPageState extends State { return Padding( padding: EdgeInsets.only(top: 20.h, bottom: 80.h), child: Text( - '选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权', + '选中的智能锁将会转移到您输入的账号中,您将失去锁的管理权'.tr, style: TextStyle(fontSize: 18.sp, color: AppColors.placeholderTextColor), textAlign: TextAlign.left, @@ -215,10 +214,10 @@ class _RecipientInformationPageState extends State { Widget _buildNextBtn(BuildContext context) { return SubmitBtn( - btnName: '下一步', + btnName: '下一步'.tr, onClick: () { if (state.numberController.text.isEmpty) { - logic.showToast('请输入手机号或email'); + logic.showToast('请输入手机号或email'.tr); return; } if (state.isFromType.value == 1) { @@ -228,7 +227,7 @@ class _RecipientInformationPageState extends State { showCupertinoAlertDialog(context, v); }); } else { - logic.showToast('暂不支持跨平台转移,敬请期待'); + logic.showToast('暂不支持跨平台转移,敬请期待'.tr); // Get.toNamed(Routers.selectBranchPage, arguments: { // "idList": state.idList.value, // "countryCode": state.countryCode.value, @@ -243,7 +242,7 @@ class _RecipientInformationPageState extends State { showCupertinoAlertDialog(context, v); }); } else { - logic.showToast('暂不支持跨平台转移,敬请期待'); + logic.showToast('暂不支持跨平台转移,敬请期待'.tr); // Get.toNamed(Routers.selectBranchPage, arguments: { // "idList": state.idList.value, @@ -263,7 +262,7 @@ class _RecipientInformationPageState extends State { TextButton( onPressed: logic.showDeletAlertDialog, child: Text( - '移除坏锁', + '移除坏锁'.tr, style: TextStyle( fontSize: 22.sp, color: AppColors.darkGrayTextColor), textAlign: TextAlign.end, @@ -295,14 +294,25 @@ class _RecipientInformationPageState extends State { child: Container( width: 400.w, height: 400.h, - color: Colors.white, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(20.w), + color: Colors.white + ), child: Column( children: [ SizedBox(height: 20.h), - Text('转移确认', style: TextStyle(fontSize: 24.sp)), + Text('转移确认'.tr, style: TextStyle(fontSize: 24.sp)), SizedBox(height: 20.h), - Image.asset('images/icon_lockGroup_item.png', - width: 70.h, height: 70.h, fit: BoxFit.fill), + ClipRRect( + borderRadius: BorderRadius.circular(40.w), + child:CustomNetworkImage( + url: recipientInformationData.headUrl!, + defaultUrl: 'images/controls_user.png', + width: 80.w, + height: 80.w) + ), + // Image.asset('images/icon_lockGroup_item.png', + // width: 70.h, height: 70.h, fit: BoxFit.fill), SizedBox(height: 15.h), Stack( alignment: Alignment.center, @@ -310,25 +320,25 @@ class _RecipientInformationPageState extends State { children: [ Text(recipientInformationData.nickname!, style: TextStyle(fontSize: 22.sp)), - Positioned( - left: (recipientInformationData.nickname!.length * 19.w) - .w, - child: Container( - width: 80.w, - color: Colors.red, - child: Center( - child: Text(state.type.value == 1 ? '个人用户' : '星寓', - style: TextStyle( - fontSize: 18.sp, color: Colors.white))), - ), - ) + // Positioned( + // left: (recipientInformationData.nickname!.length * 19.w) + // .w, + // child: Container( + // width: 80.w, + // color: Colors.red, + // child: Center( + // child: Text(state.type.value == 1 ? '个人用户'.tr : '星寓'.tr, + // style: TextStyle( + // fontSize: 18.sp, color: Colors.white))), + // ), + // ) ], ), SizedBox(height: 8.h), Text(recipientInformationData.userid!, style: TextStyle(fontSize: 22.sp)), SizedBox(height: 8.h), - Text('本次共转移${state.idList.value.length}把智能锁', + Text('本次共转移'.tr + '${state.idList.value.length}' + '把智能锁'.tr, style: TextStyle(fontSize: 20.sp)), SizedBox(height: 20.h), Row( @@ -349,13 +359,7 @@ class _RecipientInformationPageState extends State { ElevatedButton( onPressed: () { Get.back(); - if (state.isFromType.value == 1) { - // 转移智能锁 transferGatewayInfoData - logic.transferLockInfoData(); - } else { - // 转移网关 - logic.transferGatewayInfoData(); - } + ShowTipView().showTFViewAlertDialog(state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, logic.checkLoginPassword); }, style: ElevatedButton.styleFrom( foregroundColor: AppColors.appBarIconColor, backgroundColor: AppColors.mainColor, @@ -365,7 +369,7 @@ class _RecipientInformationPageState extends State { borderRadius: BorderRadius.all(Radius.circular(2)), ), ), - child: Text('确认', style: TextStyle(fontSize: 22.sp)), + child: Text('确认'.tr, style: TextStyle(fontSize: 22.sp)), ), ], ) diff --git a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_state.dart b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_state.dart index 52b1fb4d..4cac0c2e 100755 --- a/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_state.dart +++ b/lib/mine/mineSet/transferSmartLock/recipientInformation/recipientInformation_state.dart @@ -4,18 +4,20 @@ import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart import 'package:get/get.dart'; class RecipientInformationState{ - var type = 1.obs;// 1、个人用户 2、星寓用户 + RecipientInformationState() { + Map map = Get.arguments; + idList.value = map['idList']; + isFromType.value = map['isFromType']; + } + RxInt type = 1.obs;// 1、个人用户 2、星寓用户 final TextEditingController numberController = TextEditingController(); final FlutterContactPicker contactPicker = FlutterContactPicker(); late Contact contact; - final countryName = "中国".obs; - final countryCode = "86".obs; - final isFromType = 1.obs; // 1从转移智能锁过来 2 转移网关 - final idList = [].obs; - RecipientInformationState() { - Map map = Get.arguments; - idList.value = map["idList"]; - isFromType.value = map["isFromType"]; - } + TextEditingController passwordTF = TextEditingController(); + + final RxString countryName = '中国'.obs; + final RxString countryCode = '86'.obs; + final RxInt isFromType = 1.obs; // 1从转移智能锁过来 2 转移网关 + final RxList idList = [].obs; } \ No newline at end of file diff --git a/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart b/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart index 192c0ddf..89930069 100755 --- a/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart +++ b/lib/mine/mineSet/transferSmartLock/selectBranch/selectBranch_page.dart @@ -1,6 +1,8 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/mineSet/transferSmartLock/selectBranch/selectBranch_state.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; @@ -16,8 +18,8 @@ class SelectBranchPage extends StatefulWidget { } class _SelectBranchPageState extends State { - final logic = Get.put(SelectBranchLogic()); - final state = Get.find().state; + final SelectBranchLogic logic = Get.put(SelectBranchLogic()); + final SelectBranchState state = Get.find().state; @override Widget build(BuildContext context) { @@ -29,16 +31,12 @@ class _SelectBranchPageState extends State { backgroundColor: AppColors.mainColor, ), body: Column( - children: [ + children: [ _buildTopView(), - SizedBox( - height: 20.h, - ), + SizedBox(height: 20.h), Expanded(child: _buildMainUI()), _buildNextBtn(), - SizedBox( - height: 64.h, - ) + SizedBox(height: 64.h) ], ), ); @@ -51,17 +49,17 @@ class _SelectBranchPageState extends State { color: Colors.white, child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: [ + children: [ Padding( padding: EdgeInsets.only(left: 40.w, top: 20.h, bottom: 16.h), child: Text( - '公寓', + '公寓'.tr, style: TextStyle(fontSize: 28.sp), ), ), Obx(() => Padding( padding: EdgeInsets.only(left: 40.w), - child: Text('管理员:${state.receiverNumber.value}', + child: Text('管理员'.tr + ':${state.receiverNumber.value}', style: TextStyle( color: AppColors.darkGrayTextColor, fontSize: 24.sp)), )) @@ -73,7 +71,7 @@ class _SelectBranchPageState extends State { Widget _buildMainUI() { return ListView.separated( itemCount: 1, - separatorBuilder: (context, index) { + separatorBuilder: (BuildContext context, int index) { return Divider( height: 1, indent: 20.w, @@ -81,8 +79,8 @@ class _SelectBranchPageState extends State { color: AppColors.greyLineColor, ); }, - itemBuilder: (c, index) { - return _electronicKeyItem('images/normal_circle.png', "分组一", () {}); + itemBuilder: (BuildContext c, int index) { + return _electronicKeyItem('images/normal_circle.png', '分组一', () {}); }); } @@ -95,7 +93,7 @@ class _SelectBranchPageState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ SizedBox( width: 40.w, ), @@ -131,7 +129,7 @@ class _SelectBranchPageState extends State { // showCupertinoAlertDialog(context, RecipientInformationData()); }, child: Text( - '下一步', + '下一步'.tr, style: TextStyle(fontSize: 28.sp, color: Colors.white), )), ), @@ -159,9 +157,9 @@ class _SelectBranchPageState extends State { height: 370.h, color: Colors.white, child: Column( - children: [ + children: [ SizedBox(height: 20.h), - Text("转移确认", style: TextStyle(fontSize: 24.sp)), + Text('转移确认', style: TextStyle(fontSize: 24.sp)), SizedBox(height: 20.h), Image.asset('images/icon_lockGroup_item.png', width: 70.h, height: 70.h, fit: BoxFit.fill), SizedBox(height: 15.h), @@ -175,7 +173,7 @@ class _SelectBranchPageState extends State { child: Container( width: 80.w, color: Colors.red, - child: Center(child: Text(state.type.value == 1 ? "个人用户" : "星寓", style: TextStyle(fontSize: 18.sp, color: Colors.white))), + child: Center(child: Text(state.type.value == 1 ? '个人用户' : '星寓', style: TextStyle(fontSize: 18.sp, color: Colors.white))), ), ) ], @@ -183,11 +181,11 @@ class _SelectBranchPageState extends State { SizedBox(height: 8.h), Text(recipientInformationData.userid!, style: TextStyle(fontSize: 22.sp)), SizedBox(height: 8.h), - Text("本次共转移${state.idList.value.length}把智能锁", style: TextStyle(fontSize: 20.sp)), + Text('本次共转移${state.idList.value.length}把智能锁', style: TextStyle(fontSize: 20.sp)), SizedBox(height: 20.h), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ + children: [ ElevatedButton( onPressed: Get.back, style: ElevatedButton.styleFrom( diff --git a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_logic.dart b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_logic.dart index b7abde5f..cd1ad897 100755 --- a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_logic.dart +++ b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_logic.dart @@ -1,4 +1,6 @@ +import 'dart:async'; + import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../network/api_repository.dart'; import 'transferSmartLock_entity.dart'; @@ -9,30 +11,11 @@ class TransferSmartLockLogic extends BaseGetXController{ // 获取锁列表 Future getTransferLockListData() async{ - var entity = await ApiRepository.to.getTransferLockListData(); + final TransferSmartLockEntity entity = await ApiRepository.to.getTransferLockListData(searchStr: state.searchController.text); if(entity.errorCode!.codeIsSuccessful){ state.transferSmartLockListData.value = entity.data!.list!; } return entity; } - @override - void onReady() { - // TODO: implement onReady - super.onReady(); - // getTransferLockListData(); - } - - @override - void onInit() { - // TODO: implement onInit - super.onInit(); - } - - @override - void onClose() { - // TODO: implement onClose - super.onClose(); - - } } \ No newline at end of file diff --git a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart index 850598fd..5e317610 100755 --- a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart +++ b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_page.dart @@ -1,12 +1,16 @@ + import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_state.dart'; import '../../../../../appRouters.dart'; import '../../../../../app_settings/app_colors.dart'; import '../../../../../tools/titleAppBar.dart'; import '../../../../../translations/trans_lib.dart'; import '../../../../tools/EasyRefreshTool.dart'; +import '../../../../tools/appRouteObserver.dart'; +import '../../../../tools/eventBusEventManage.dart'; import '../../../../tools/keySearchWidget.dart'; import '../../../../tools/noData.dart'; import 'transferSmartLock_entity.dart'; @@ -19,9 +23,9 @@ class TransferSmartLockPage extends StatefulWidget { State createState() => _TransferSmartLockPageState(); } -class _TransferSmartLockPageState extends State { - final logic = Get.put(TransferSmartLockLogic()); - final state = Get.find().state; +class _TransferSmartLockPageState extends State with RouteAware { + final TransferSmartLockLogic logic = Get.put(TransferSmartLockLogic()); + final TransferSmartLockState state = Get.find().state; Future getHttpData() async { logic.getTransferLockListData().then((TransferSmartLockEntity value){ @@ -44,17 +48,17 @@ class _TransferSmartLockPageState extends State { barTitle: TranslationLoader.lanKeys!.selectiveLock!.tr, haveBack: true, backgroundColor: AppColors.mainColor, - actionsList: [ + actionsList: [ TextButton( onPressed: () { setState(() { if(state.isSelectAll == true){ - for (var element in state.transferSmartLockListData.value) { + for (final TransferSmartLockItemData element in state.transferSmartLockListData.value) { state.isSelectAll = false; element.select = 0; } }else{ - for (var element in state.transferSmartLockListData.value) { + for (final TransferSmartLockItemData element in state.transferSmartLockListData.value) { state.isSelectAll = true; element.select = 1; } @@ -68,29 +72,29 @@ class _TransferSmartLockPageState extends State { onRefresh: (){ getHttpData(); }, - child: Obx(() => state.transferSmartLockListData.value.isNotEmpty ? Column( - children: [ - // KeySearchWidget( - // editingController: state.searchController, - // onSubmittedAction: () { - // getHttpData(); - // }, - // ), + child: Column( + children: [ + KeySearchWidget( + editingController: state.searchController, + onSubmittedAction: () { + getHttpData(); + }, + ), SizedBox(height: 10.h), Expanded(child: _buildMainUI()), SizedBox(height: 20.h), _buildNextBtn(), SizedBox(height: 64.h) ], - ): NoData()), + ), ), ); } Widget _buildMainUI() { - return ListView.separated( + return Obx(() => state.transferSmartLockListData.value.isNotEmpty ? ListView.separated( itemCount: state.transferSmartLockListData.value.length, - separatorBuilder: (context, index) { + separatorBuilder: (BuildContext context, int index) { return Divider( height: 1, indent: 20.w, @@ -98,8 +102,8 @@ class _TransferSmartLockPageState extends State { color: AppColors.greyLineColor, ); }, - itemBuilder: (c, index) { - TransferSmartLockItemData transferSmartLockItemData = state.transferSmartLockListData.value[index]; + itemBuilder: (BuildContext c, int index) { + final TransferSmartLockItemData transferSmartLockItemData = state.transferSmartLockListData.value[index]; return _electronicKeyItem(transferSmartLockItemData, () { setState(() { if(transferSmartLockItemData.select == 1){ @@ -109,7 +113,7 @@ class _TransferSmartLockPageState extends State { } }); }); - }); + }): NoData()); } Widget _electronicKeyItem(TransferSmartLockItemData transferSmartLockItemData, Function() action) { @@ -117,17 +121,20 @@ class _TransferSmartLockPageState extends State { onTap: action, child: Container( color: Colors.white, - height: 90.h, + // height: 90.h, + padding: EdgeInsets.only(top: 10.h, bottom: 10.h), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, - children: [ + children: [ SizedBox(width: 20.w), Image.asset((transferSmartLockItemData.select == 1) ? 'images/icon_round_select.png' : 'images/icon_round_unSelect.png', width: 30.w, height: 30.w), SizedBox(width: 16.w), Image.asset('images/icon_lockGroup_item.png', width: 50.h, height: 50.h, fit: BoxFit.fill), SizedBox(width: 10.w), - Text(transferSmartLockItemData.lockAlias!, style: TextStyle(fontSize: 22.sp, color: AppColors.blackColor)) + Flexible( + child: Text(transferSmartLockItemData.lockAlias!, style: TextStyle(fontSize: 22.sp, color: AppColors.blackColor)), + ) ], ), ), @@ -143,28 +150,72 @@ class _TransferSmartLockPageState extends State { child: TextButton( onPressed: () async { bool isCanNext = false; - var idList = []; - for (var element in state.transferSmartLockListData.value) { + final List idList = []; + for (final TransferSmartLockItemData element in state.transferSmartLockListData.value) { if(element.select == 1){ isCanNext = true; idList.add(element.lockId); } } if(isCanNext == false){ - logic.showToast("请选择锁".tr); + logic.showToast('请选择锁'.tr); return; } - var data = await Get.toNamed(Routers.recipientInformationPage, arguments: { - "idList":idList, - "isFromType":1, + final data = await Get.toNamed(Routers.recipientInformationPage, arguments: { + 'idList':idList, + 'isFromType':1, }); if(data != null) { - logic.getTransferLockListData(); + await getHttpData(); + // eventBus.fire(RefreshLockListInfoDataEvent()); } }, - child: Text('下一步', style: TextStyle(fontSize: 28.sp, color: Colors.white), + child: Text('下一步'.tr, style: TextStyle(fontSize: 28.sp, color: Colors.white), )), ), ); } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + + /// 路由订阅 + AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + /// 取消路由订阅 + AppRouteObserver().routeObserver.unsubscribe(this); + super.dispose(); + } + + /// 从上级界面进入 当前界面即将出现 + @override + void didPush() { + super.didPush(); + + } + + /// 返回上一个界面 当前界面即将消失 + @override + void didPop() { + super.didPop(); + eventBus.fire(RefreshLockListInfoDataEvent()); + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + + } } diff --git a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_state.dart b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_state.dart index bd6670d8..fb6898e0 100755 --- a/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_state.dart +++ b/lib/mine/mineSet/transferSmartLock/transferSmartLockList/transferSmartLock_state.dart @@ -5,7 +5,7 @@ import 'package:get/get.dart'; import 'transferSmartLock_entity.dart'; class TransferSmartLockState{ - var transferSmartLockListData = [].obs; + RxList transferSmartLockListData = [].obs; final TextEditingController searchController = TextEditingController(); bool isSelectAll = false; } diff --git a/lib/network/api_provider.dart b/lib/network/api_provider.dart index 6bf76bb6..b3f90e6d 100755 --- a/lib/network/api_provider.dart +++ b/lib/network/api_provider.dart @@ -354,6 +354,15 @@ class ApiProvider extends BaseProvider { }), isUnShowLoading: true); + // 更新锁InitUserNo + Future updateLockInitUserNo(int lockId, int initUserNo) => post( + lockUpdateLockInfo.toUrl, + jsonEncode({ + 'lockId': lockId, + 'initUserNo': initUserNo, + }), + isUnShowLoading: true); + // 绑定蓝牙管理员 Future bindingBlueAdmin( String lockAlias, @@ -1449,27 +1458,29 @@ class ApiProvider extends BaseProvider { jsonEncode({'lockId': lockId, 'cardName': cardName})); // 获取转移锁锁列表 - Future getTransferLockListData() => - post(transferLockListURL.toUrl, jsonEncode({})); + Future getTransferLockListData(String searchStr) => + post(transferLockListURL.toUrl, jsonEncode({ + "searchStr":searchStr + })); // 转移智能锁确认 Future transferLockConfirmInfoData( - String receiverUserid, String type, String countryCode) => + String receiverUsername, String type, String countryCode) => post( transferLockConfirmURL.toUrl, jsonEncode({ - 'receiverUserid': receiverUserid, + 'receiverUsername': receiverUsername, 'type': type, 'countryCode': countryCode })); // 转移智能锁 Future transferLockInfoData( - String receiverUserid, List lockIdList, String countryCode) => + String receiverUsername, List lockIdList, String countryCode) => post( transferLockURL.toUrl, jsonEncode({ - 'receiverUserid': receiverUserid, + 'receiverUsername': receiverUsername, 'lockIdList': lockIdList, 'countryCode': countryCode })); @@ -1481,22 +1492,22 @@ class ApiProvider extends BaseProvider { // 转移网关确认 Future transferGatewayConfirmInfoData( - String receiverUserid, String type, String countryCode) => + String receiverUsername, String type, String countryCode) => post( transferGatewayConfirmURL.toUrl, jsonEncode({ - 'receiverUserid': receiverUserid, + 'receiverUsername': receiverUsername, 'type': type, 'countryCode': countryCode })); // 转移网关 Future transferGatewayInfoData( - String receiverUserid, List plugIdList, String countryCode) => + String receiverUsername, List plugIdList, String countryCode) => post( transferGatewayURL.toUrl, jsonEncode({ - 'receiverUserid': receiverUserid, + 'receiverUsername': receiverUsername, 'plugIdList': plugIdList, 'countryCode': countryCode })); diff --git a/lib/network/api_repository.dart b/lib/network/api_repository.dart index b7a46ad1..d62143d5 100755 --- a/lib/network/api_repository.dart +++ b/lib/network/api_repository.dart @@ -318,6 +318,13 @@ class ApiRepository { return LockNetTokenEntity.fromJson(res.body); } + // 更新锁用户 InitUserNo + Future updateLockInitUserNo( + {required int lockId, required int initUserNo}) async { + final res = await apiProvider.updateLockInitUserNo(lockId, initUserNo); + return LockNetTokenEntity.fromJson(res.body); + } + // 绑定蓝牙管理员 Future bindingBlueAdmin( {required String lockAlias, @@ -1639,28 +1646,28 @@ class ApiRepository { } // 获取转移锁锁列表 - Future getTransferLockListData() async { - final res = await apiProvider.getTransferLockListData(); + Future getTransferLockListData({required String searchStr}) async { + final res = await apiProvider.getTransferLockListData(searchStr); return TransferSmartLockEntity.fromJson(res.body); } // 转移智能锁确认 Future transferLockConfirmInfoData( - {required String receiverUserid, + {required String receiverUsername, required String type, required String countryCode}) async { final res = await apiProvider.transferLockConfirmInfoData( - receiverUserid, type, countryCode); + receiverUsername, type, countryCode); return RecipientInformationEntity.fromJson(res.body); } // 转移智能锁 Future transferLockInfoData( - {required String receiverUserid, + {required String receiverUsername, required List lockIdList, required String countryCode}) async { final res = await apiProvider.transferLockInfoData( - receiverUserid, lockIdList, countryCode); + receiverUsername, lockIdList, countryCode); return RecipientInformationEntity.fromJson(res.body); } @@ -1673,21 +1680,21 @@ class ApiRepository { // 转移网关确认 Future transferGatewayConfirmInfoData( - {required String receiverUserid, + {required String receiverUsername, required String type, required String countryCode}) async { final res = await apiProvider.transferGatewayConfirmInfoData( - receiverUserid, type, countryCode); + receiverUsername, type, countryCode); return RecipientInformationEntity.fromJson(res.body); } // 转移智能锁 Future transferGatewayInfoData( - {required String receiverUserid, + {required String receiverUsername, required List plugIdList, required String countryCode}) async { final res = await apiProvider.transferGatewayInfoData( - receiverUserid, plugIdList, countryCode); + receiverUsername, plugIdList, countryCode); return RecipientInformationEntity.fromJson(res.body); } diff --git a/lib/tools/commonDataManage.dart b/lib/tools/commonDataManage.dart index 4703000b..4c30352c 100755 --- a/lib/tools/commonDataManage.dart +++ b/lib/tools/commonDataManage.dart @@ -31,6 +31,9 @@ class CommonDataManage { // set setCurrentLockUserNo(int v) => _currentLockUserNo = v; // get getCurrentLockUserNo => _currentLockUserNo; + // 当前锁是否被转移 1-转移 0-未转移 + int initUserNo = 0; + LockSetInfoData currentLockSetInfoData = LockSetInfoData(); int dayLatestTime = (86400-1)*1000; diff --git a/lib/tools/eventBusEventManage.dart b/lib/tools/eventBusEventManage.dart index c72c44ae..36ba43a5 100755 --- a/lib/tools/eventBusEventManage.dart +++ b/lib/tools/eventBusEventManage.dart @@ -23,6 +23,11 @@ class LockAddUserSucceedEvent { LockAddUserSucceedEvent(this.dataList, this.type); } +/// 蓝牙转移用户更新成功 +class LockInitUserNoEvent { + LockInitUserNoEvent(); +} + /// 刷新锁详情数据 class RefreshLockDetailInfoDataEvent { RefreshLockDetailInfoDataEvent();