diff --git a/star_lock/android/app/build.gradle b/star_lock/android/app/build.gradle index 4cd73a75..f2aea2f4 100644 --- a/star_lock/android/app/build.gradle +++ b/star_lock/android/app/build.gradle @@ -43,8 +43,9 @@ android { } defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.star_lock" + applicationId "cn.starlock.lock" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. // minSdkVersion flutter.minSdkVersion @@ -53,28 +54,39 @@ android { targetSdkVersion 33 versionCode flutterVersionCode.toInteger() versionName flutterVersionName + + ndk { + //设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so) + abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","x86_64" + } } -// signingConfigs { -// release { -// storeFile file("key/keystore.jks") -// storePassword '123456' -// keyAlias = 'key0' -// keyPassword '123456' -// } -// } + signingConfigs { + release { + storeFile file("starlock.keystore") + storePassword '123456' + keyAlias = 'starlock' + keyPassword '123456' + } + debug { + storeFile file("starlock.keystore") + storePassword '123456' + keyAlias = 'starlock' + keyPassword '123456' + } + } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.release + } + debug { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --debug` works. signingConfig signingConfigs.debug } -// debug { -// // TODO: Add your own signing config for the release build. -// // Signing with the debug keys for now, so `flutter run --release` works. -// signingConfig signingConfigs.release -// } } } @@ -84,4 +96,6 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation('com.amap.api:location:5.6.0') + implementation('com.amap.api:3dmap:8.1.0') } diff --git a/star_lock/android/app/src/main/AndroidManifest.xml b/star_lock/android/app/src/main/AndroidManifest.xml index 5b60fd8f..43b621ea 100644 --- a/star_lock/android/app/src/main/AndroidManifest.xml +++ b/star_lock/android/app/src/main/AndroidManifest.xml @@ -13,10 +13,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + diff --git a/star_lock/android/build.gradle b/star_lock/android/build.gradle index d8f74fdf..eeb73c04 100644 --- a/star_lock/android/build.gradle +++ b/star_lock/android/build.gradle @@ -15,7 +15,8 @@ buildscript { allprojects { repositories { google() - mavenCentral() +// mavenCentral() + jcenter() } } diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index ff7f42b9..d68f1e09 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -94,7 +94,8 @@ import 'main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dar import 'main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart'; import 'main/lockDetail/passwordKey/passwordKeyManage/passwordKeyManage_page.dart'; import 'main/lockMian/lockMain/lockMain_page.dart'; -import 'mine/addLock/lockAddress/lockAddress_page.dart'; +import 'mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart'; +import 'mine/addLock/lockAddress/lockAddress/lockAddress_page.dart'; import 'mine/addLock/nearbyLock/nearbyLock_page.dart'; import 'mine/addLock/saveLock/saveLock_page.dart'; import 'mine/addLock/seletLockType/seletLockType_page.dart'; @@ -145,6 +146,7 @@ abstract class Routers { static const addLockPage = '/AddLockPage'; // 选择锁类型 static const nearbyLockPage = '/NearbyLockPage'; // 附近的锁 static const lockAddressPage = '/LockAddressPage'; // 锁地址 + static const lockAddressGaoDePage = '/LockAddressGaoDePage'; // 锁地址-高德 static const saveLockPage = '/SaveLockPage'; // 保存锁 static const lockDetailMainPage = '/LockDetailMainPage'; // 锁详情 static const electronicKeyListPage = '/ElectronicKeyListPage'; // 电子钥匙列表 @@ -807,6 +809,9 @@ abstract class AppRouters { GetPage( name: Routers.adminDetailChangeDatePage, page: () => const AdminDetailChangeDatePage()), + GetPage( + name: Routers.lockAddressGaoDePage, + page: () => const LockAddressGaoDePage()), GetPage( name: Routers.expireLockChangeDatePage, page: () => const ExpireLockChangeDatePage()), diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 65349ffb..3a38a19e 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -71,7 +71,7 @@ class BlueManage{ if(device.name.isEmpty){ return; } - print("startScanDevice:${device}"); + // print("startScanDevice:${device}"); if (((device.serviceUuids.isNotEmpty ? device.serviceUuids[0] : "").toString().contains("758824")) && ((device.serviceUuids.isNotEmpty ? device.serviceUuids[0] : "").toString()[31] != "1") && (device.rssi >= -100)) { final knownDeviceIndex = _scanDevices.indexWhere((d) => d.id == device.id); @@ -146,8 +146,20 @@ class BlueManage{ print('Discovering services finished'); if(isFrist == true){ - // 第一次添加锁的时候需要先获取公钥 - IoSenderManage.getPublicKey(lockId: deviceName); + // var publicKey = await Storage.getStringList(saveBluePublicKey); + // List publicKeyDataList = changeStringListToIntList(publicKey!); + // if(publicKeyDataList.isNotEmpty ){ + // IoSenderManage.getPrivateKey( + // lockId:BlueManage().connectDeviceName, + // keyID:"1", + // authUserID:"1", + // nowTime:1, + // publicKeyData:publicKeyDataList, + // needAuthor:1); + // }else{ + // 第一次添加锁的时候需要先获取公钥 + IoSenderManage.getPublicKey(lockId: deviceName); + // } } connectStateCallBack!(connectionStateUpdate.connectionState); } on Exception catch (e) { @@ -250,11 +262,12 @@ class BlueManage{ _flutterReactiveBle!.subscribeToCharacteristic(characteristic).listen((data) { // code to handle incoming data print("subscribeToCharacteristic: deviceId = ${characteristic.deviceId} characteristicId =${characteristic.characteristicId}---上报来的数据data = $data"); - var dataLen = data[8] * 256 + data[9];// 高16位用来指示后面数据块内容的长度 + var dataLen = 0;// 高16位用来指示后面数据块内容的长度 if((data[0] != 0xEF)&&(data[1] != 0x01)&&(data[2] != 0xEE)&&(data[3] != 0x02)){ // 分包 allData.addAll(data); }else{ + dataLen = data[8] * 256 + data[9]; allData = []; // 初始化数组为空 if(dataLen > (data.length - 12)){ @@ -278,7 +291,7 @@ class BlueManage{ Future writeCharacteristicWithResponse(List value) async { QualifiedCharacteristic characteristic = QualifiedCharacteristic(characteristicId: characteristicIdWrite, serviceId: serviceId, deviceId: connectDeviceMacAddress); print('Write with characteristicId:${characteristic.characteristicId} serviceId:${characteristic.serviceId} deviceId:${characteristic.deviceId} value : $value \nhexStr:${radixHex16String(value)}'); - int mtuLength = await _flutterReactiveBle!.requestMtu(deviceId: characteristic.deviceId, mtu: 30); + int mtuLength = await _flutterReactiveBle!.requestMtu(deviceId: characteristic.deviceId, mtu: 512); print("mtuLength:$mtuLength"); try { List valueList = value; diff --git a/star_lock/lib/blue/io_protocol/io_addUser.dart b/star_lock/lib/blue/io_protocol/io_addUser.dart index 1f6081aa..1f702f78 100644 --- a/star_lock/lib/blue/io_protocol/io_addUser.dart +++ b/star_lock/lib/blue/io_protocol/io_addUser.dart @@ -74,6 +74,7 @@ class AddUserCommand extends SenderProtocol { data = getFixedLengthList(data, 40 - keyIDLength); //userID 要接受钥匙的用户的useid 20 + print("添加授权管理员userId:${userID}"); int userIDLength = utf8.encode(userID!).length; // print("${commandType!.typeValue}userIDLength:$userIDLength utf8.encode(userID!)${utf8.encode(userID!)}"); data.addAll(utf8.encode(userID!)); diff --git a/star_lock/lib/blue/io_protocol/io_getStarLockStatusInfo.dart b/star_lock/lib/blue/io_protocol/io_getStarLockStatusInfo.dart new file mode 100644 index 00000000..40e59e19 --- /dev/null +++ b/star_lock/lib/blue/io_protocol/io_getStarLockStatusInfo.dart @@ -0,0 +1,114 @@ + +import 'dart:convert'; + +import '../io_reply.dart'; +import '../io_sender.dart'; +import '../io_tool/io_tool.dart'; +import '../io_type.dart'; +import '../sm4Encipher/sm4.dart'; + +class GetStarLockStatuInfoCommand extends SenderProtocol { + + String? lockID; + String? userID; + List? privateKey; + GetStarLockStatuInfoCommand({ + this.lockID, + this.userID, + this.privateKey + }) : super(CommandType.readStarLockStatusInfo); + + @override + List messageDetail() { + List data = []; + List ebcData = []; + + // 指令类型 + int type = commandType!.typeValue; + double typeDouble = type / 256; + int type1 = typeDouble.toInt(); + int type2 = type % 256; + data.add(type1); + data.add(type2); + + // 锁id 40 + int lockIDLength = utf8.encode(lockID!).length; + // print("addUserLockIDLength:$lockIDLength utf8.encode(lockID!)${utf8.encode(lockID!)}"); + data.addAll(utf8.encode(lockID!)); + data = getFixedLengthList(data, 40 - lockIDLength); + + //userID 要接受钥匙的用户的useid 20 + int userIDLength = utf8.encode(userID!).length; + // print("userIDLength:$userIDLength utf8.encode(userID!)${utf8.encode(userID!)}"); + data.addAll(utf8.encode(userID!)); + data = getFixedLengthList(data, 20 - userIDLength); + + 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 GetStarLockStatuInfoReply extends Reply { + GetStarLockStatuInfoReply.parseData(CommandType commandType, List dataDetail) + : super.parseData(commandType, dataDetail) { + data = dataDetail; + + int status = data[2]; + switch(status){ + case 0x00: + //成功 + print("${commandType.typeValue} 数据解析成功"); + + // 厂商名称 + var vendor = data.sublist(3, 23); + // print("softVersion:$softVersion"); + + // 锁设备类型 + var product = data[23]; + // print("product:product"); + + // 产品名称 + var model = data.sublist(24, 44); + // print("model:model"); + + // 软件版本 + var fwVersion = data.sublist(44, 64); + // print("fwVersion:fwVersion"); + + // 硬件版本 + var hwVersion = data.sublist(64, 84); + // print("hwVersion:hwVersion"); + + + break; + case 0x06: + //无权限 + print("${commandType.typeValue} 需要鉴权"); + + break; + case 0x07: + //无权限 + print("${commandType.typeValue} 用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${commandType.typeValue} 权限校验错误"); + + break; + default: + //失败 + print("${commandType.typeValue} 领锁失败"); + + break; + } + } +} \ No newline at end of file diff --git a/star_lock/lib/blue/io_protocol/io_referEventRecordNumber.dart b/star_lock/lib/blue/io_protocol/io_referEventRecordNumber.dart index 2baa175b..fb907e2a 100644 --- a/star_lock/lib/blue/io_protocol/io_referEventRecordNumber.dart +++ b/star_lock/lib/blue/io_protocol/io_referEventRecordNumber.dart @@ -47,6 +47,7 @@ class SenderReferEventRecordNumberCommand extends SenderProtocol { // 子命令类型 data.add(40); + print("timeType:${40}"); // keyID 40 int keyIDLength = utf8.encode(keyID!).length; diff --git a/star_lock/lib/blue/io_protocol/io_referEventRecordNumberTime.dart b/star_lock/lib/blue/io_protocol/io_referEventRecordTime.dart similarity index 91% rename from star_lock/lib/blue/io_protocol/io_referEventRecordNumberTime.dart rename to star_lock/lib/blue/io_protocol/io_referEventRecordTime.dart index 2c18fc6e..a9c9230e 100644 --- a/star_lock/lib/blue/io_protocol/io_referEventRecordNumberTime.dart +++ b/star_lock/lib/blue/io_protocol/io_referEventRecordTime.dart @@ -9,7 +9,7 @@ import '../io_type.dart'; import '../sm4Encipher/sm4.dart'; import 'package:crypto/crypto.dart' as crypto; -class SenderReferEventRecordNumberTimeCommand extends SenderProtocol { +class SenderReferEventRecordTimeCommand extends SenderProtocol { String? keyID; String? userID; @@ -20,7 +20,7 @@ class SenderReferEventRecordNumberTimeCommand extends SenderProtocol { List? publicKey; List? privateKey; - SenderReferEventRecordNumberTimeCommand({ + SenderReferEventRecordTimeCommand({ this.keyID, this.userID, this.logsCount, @@ -47,7 +47,7 @@ class SenderReferEventRecordNumberTimeCommand extends SenderProtocol { // 子命令类型 data.add(41); - + print("timeType:${41}"); // keyID 40 int keyIDLength = utf8.encode(keyID!).length; subData.addAll(utf8.encode(keyID!)); @@ -112,8 +112,8 @@ class SenderReferEventRecordNumberTimeCommand extends SenderProtocol { } } -class SenderReferEventRecordNumberTimeReply extends Reply { - SenderReferEventRecordNumberTimeReply.parseData(CommandType commandType, List dataDetail) +class SenderReferEventRecordTimeReply extends Reply { + SenderReferEventRecordTimeReply.parseData(CommandType commandType, List dataDetail) : super.parseData(commandType, dataDetail) { data = dataDetail; } diff --git a/star_lock/lib/blue/io_type.dart b/star_lock/lib/blue/io_type.dart index 5fdf5d82..d4b62956 100644 --- a/star_lock/lib/blue/io_type.dart +++ b/star_lock/lib/blue/io_type.dart @@ -17,6 +17,7 @@ enum CommandType { opsUnlocks, // 运维开锁 0x30f2 writeHotelInfo, // 写酒店信息 = 0x3016 readHotelInfo, //读酒店信息 0x3017 + readStarLockStatusInfo, //读星锁状态信息 0x3040 } extension ExtensionCommandType on CommandType { @@ -104,6 +105,11 @@ extension ExtensionCommandType on CommandType { type = CommandType.readHotelInfo; } break; + case 0x3040: + { + type = CommandType.readStarLockStatusInfo; + } + break; } return type; } @@ -159,6 +165,9 @@ extension ExtensionCommandType on CommandType { case CommandType.readHotelInfo: type = 0x3017; break; + case CommandType.readStarLockStatusInfo: + type = 0x3040; + break; } // AppLog.log('数组组装指令类型:$name commandIndex:${IoManager // ().commandIndex}'); @@ -232,6 +241,9 @@ extension ExtensionCommandType on CommandType { case 0x3017: t = '读酒店信息'; break; + case 0x3040: + t = '读星锁状态信息'; + break; } return t; diff --git a/star_lock/lib/blue/reciver_data.dart b/star_lock/lib/blue/reciver_data.dart index 4bf691c9..622f748d 100644 --- a/star_lock/lib/blue/reciver_data.dart +++ b/star_lock/lib/blue/reciver_data.dart @@ -8,6 +8,7 @@ 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'; import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart'; +import 'package:star_lock/blue/io_protocol/io_referEventRecordTime.dart'; import 'package:star_lock/blue/io_protocol/io_timing.dart'; import 'package:star_lock/blue/io_protocol/io_transferPermissions.dart'; @@ -234,6 +235,12 @@ class CommandReciverManager { reply = SenderReferEventRecordNumberReply.parseData(commandType, data); } break; + case 41: + { + // 事件查询记录 + reply = SenderReferEventRecordTimeReply.parseData(commandType, data); + } + break; case 51: { // wifi配网结果 diff --git a/star_lock/lib/blue/sender_manage.dart b/star_lock/lib/blue/sender_manage.dart index b32882e9..fc941e4a 100644 --- a/star_lock/lib/blue/sender_manage.dart +++ b/star_lock/lib/blue/sender_manage.dart @@ -19,7 +19,7 @@ import 'io_protocol/io_getPublicKey.dart'; import 'io_protocol/io_openLock.dart'; import 'io_protocol/io_queryingFingerprintStatus.dart'; import 'io_protocol/io_referEventRecordNumber.dart'; -import 'io_protocol/io_referEventRecordNumberTime.dart'; +import 'io_protocol/io_referEventRecordTime.dart'; import 'io_protocol/io_senderCustomPasswords.dart'; import 'io_protocol/io_timing.dart'; import 'io_protocol/io_transferPermissions.dart'; @@ -390,7 +390,7 @@ class IoSenderManage { } //todo:事件记录(时间查询) - static void senderReferEventRecordNumberTimeCommand({ + static void senderReferEventRecordTimeCommand({ required String? keyID, required String? userID, required int? logsCount, @@ -401,7 +401,7 @@ class IoSenderManage { required List? privateKey, CommandSendCallBack? callBack}) { CommandSenderManager().managerSendData( - command: SenderReferEventRecordNumberTimeCommand( + command: SenderReferEventRecordTimeCommand( keyID: keyID, userID: userID, logsCount: logsCount, diff --git a/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart b/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart index 510f92a0..38ca6395 100644 --- a/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart +++ b/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_logic.dart @@ -71,6 +71,11 @@ class AuthorizedAdminLogic extends BaseGetXController { // 权限校验错误 print("${reply.commandType!.typeValue} 权限校验错误"); + break; + case 0x14: + // 权限校验错误 + print("${reply.commandType!.typeValue} 用户已存在"); + break; default: //失败 @@ -99,7 +104,7 @@ class AuthorizedAdminLogic extends BaseGetXController { print("status:$status"); // userNo = reply.data[46]; - print("status:$status"); + // print("status:$status"); switch(status){ case 0x00: //成功 @@ -118,15 +123,15 @@ class AuthorizedAdminLogic extends BaseGetXController { List publicKeyDataList = changeStringListToIntList(publicKey!); IoSenderManage.senderAddUser( - lockID:BlueManage().connectDeviceName, + lockID: BlueManage().connectDeviceName, authUserID:await Storage.getUid(), keyID:"1", - userID:await Storage.getUid(), + userID:state.addUserId.value, openMode:1, - keyType:1, - startDate:0x11223344, - expireDate:0x11223344, - role:255, + keyType:(state.type.value == "1") ? 0 : 1, + startDate:state.effectiveDateTime.value.millisecondsSinceEpoch, + expireDate:state.failureDateTime.value.millisecondsSinceEpoch, + role:0, password:"123456", needAuthor:1, publicKey:publicKeyDataList, @@ -251,8 +256,9 @@ class AuthorizedAdminLogic extends BaseGetXController { if (entity.errorCode!.codeIsSuccessful) { print('发送电子钥匙成功'); state.isSendSuccess.value = true; - Toast.show(msg: "添加成功"); - // addUserConnectBlue(entity.data!.receiverUser!.id.toString()); + // Toast.show(msg: "添加成功"); + state.addUserId.value = entity.data!.receiverUser!.id.toString(); + addUserConnectBlue(state.addUserId.value); } else { // Toast.show(msg: '${entity.errorMsg}'); if (entity.errorCode == 425) { diff --git a/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart b/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart index 335f7510..a6c74c8a 100644 --- a/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart +++ b/star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_state.dart @@ -29,7 +29,7 @@ class AuthorizedAdminState { var weekdaysList = [].obs; var isCreateUser = false.obs; //用户未注册时传1 已注册传0 - + var addUserId = ''.obs; AuthorizedAdminState() { Map map = Get.arguments; lockMainEntity.value = map["lockMainEntity"]; 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 5cf6aa04..5203084f 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart @@ -334,8 +334,8 @@ class _LockSetPageState extends State with RouteAware { btnName: TranslationLoader.lanKeys!.delete!.tr, isDelete: true, onClick: () { - logic.deletUserAction(); - // logic.deletLockInfoData(); + // logic.deletUserAction(); + logic.deletLockInfoData(); }), ), ], diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index cf2e3c45..7f9dfb61 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -417,9 +417,9 @@ class LockDetailLogic extends BaseGetXController{ print("onReady()"); _initReplySubscription(); - // BlueManage().startScan((v){ - // - // }); + BlueManage().startScan((v){ + + }); } @override diff --git a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart new file mode 100644 index 00000000..474a1d77 --- /dev/null +++ b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart @@ -0,0 +1,47 @@ +class LockOperatingRecordGetLastRecordTimeEntity { + int? errorCode; + String? description; + String? errorMsg; + Data? data; + + LockOperatingRecordGetLastRecordTimeEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + LockOperatingRecordGetLastRecordTimeEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null ? Data.fromJson(json['data']) : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class Data { + String? lockId; + int? operateDate; + + Data( + {this.lockId, this.operateDate}); + + Data.fromJson(Map json) { + lockId = json['lockId']; + operateDate = json['operateDate']; + } + + Map toJson() { + final Map data = {}; + data['lockId'] = lockId; + data['operateDate'] = operateDate; + return data; + } +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart index 58c8bb7f..a6c0942e 100644 --- a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart +++ b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart @@ -1,17 +1,24 @@ import 'dart:async'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; +import 'package:star_lock/tools/toast.dart'; import '../../../blue/blue_manage.dart'; import '../../../blue/io_protocol/io_referEventRecordNumber.dart'; +import '../../../blue/io_protocol/io_referEventRecordTime.dart'; import '../../../blue/io_reply.dart'; import '../../../blue/io_tool/io_manager.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/dateTool.dart'; import '../../../tools/storage.dart'; +import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; +import 'lockOperatingRecordGetLastRecordTime_entity.dart'; import 'lockOperatingRecord_state.dart'; class LockOperatingRecordLogic extends BaseGetXController{ @@ -24,10 +31,14 @@ class LockOperatingRecordLogic extends BaseGetXController{ if(reply is SenderReferEventRecordNumberReply) { _replyReferEventRecordNumber(reply); } + + if(reply is SenderReferEventRecordTimeReply) { + _replyReferEventRecordTime(reply); + } }); } - // 校时数据解析 + // 根据数量查解析数据 Future _replyReferEventRecordNumber(Reply reply) async { int status = reply.data[2]; switch(status){ @@ -59,6 +70,64 @@ class LockOperatingRecordLogic extends BaseGetXController{ } } + // 根据时间查解析数据 + Future _replyReferEventRecordTime(Reply reply) async { + int status = reply.data[2]; + switch(status){ + case 0x00: + //成功 + print("${reply.commandType}数据解析成功"); + if(reply.data[5] > 0){ + reply.data.removeRange(0, 6); + // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面 + var getList = splitList(reply.data, 8); + var uploadList = []; + for(int i = 0; i senderReferEventRecordNumber() async { BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async { @@ -87,7 +156,7 @@ class LockOperatingRecordLogic extends BaseGetXController{ } // 查询事件记录(时间查询) - Future senderReferEventRecordNumberTime() async { + Future senderReferEventRecordTime(int time) async { BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async { if (state == DeviceConnectionState.connected) { var privateKey = await Storage.getStringList(saveBluePrivateKey); @@ -99,11 +168,13 @@ class LockOperatingRecordLogic extends BaseGetXController{ var publicKey = await Storage.getStringList(saveBluePublicKey); List getPublicKeyList = changeStringListToIntList(publicKey!); - IoSenderManage.senderReferEventRecordNumberTimeCommand( + EasyLoading.show(); + IoSenderManage.senderReferEventRecordTimeCommand( keyID:BlueManage().connectDeviceName, userID:await Storage.getUid(), logsCount:20, - time:DateTime.now().millisecondsSinceEpoch~/1000, + // time:DateTime.now().millisecondsSinceEpoch~/1000, + time: time, token:getTokenList, needAuthor:1, publicKey:getPublicKeyList, @@ -113,6 +184,60 @@ class LockOperatingRecordLogic extends BaseGetXController{ }); } + //请求操作记录列表 + void mockNetworkDataRequest() async { + KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordList( + '0', + state.keyInfos.value.keyId.toString(), + '0', + state.keyInfos.value.lockId.toString(), + '1', + '1', + '20', + '0', + '', + '', + '', + '', + '', + ''); + if (entity.errorCode!.codeIsSuccessful) { + print("操作记录列表成功:${entity.data?.itemList}"); + state.lockOperatingRecordListData.value = entity.data!.itemList!; + }else{ + + } + } + + // 查询锁记录最后时间 + void getLockRecordLastUploadDataTime() async { + LockOperatingRecordGetLastRecordTimeEntity entity = + await ApiRepository.to.getLockRecordLastUploadDataTime(lockId: state.keyInfos.value.lockId.toString()); + if (entity.errorCode!.codeIsSuccessful) { + senderReferEventRecordTime(entity.data!.operateDate!); + } + } + + // 操作记录上传 + void lockRecordUploadData(List list) async { + KeyOperationRecordEntity entity = + await ApiRepository.to.lockRecordUploadData( + lockId: state.keyInfos.value.lockId.toString(), + records: list); + if (entity.errorCode!.codeIsSuccessful) { + mockNetworkDataRequest(); + } + } + + //清空操作记录 + void clearOperationRecordRequest() async { + KeyOperationRecordEntity entity = + await ApiRepository.to.clearOperationRecord('28'); + if (entity.errorCode!.codeIsSuccessful) { + Toast.show(msg: "清除数据成功"); + } + } + @override void onReady() { // TODO: implement onReady @@ -120,6 +245,8 @@ class LockOperatingRecordLogic extends BaseGetXController{ print("onReady()"); _initReplySubscription(); + + mockNetworkDataRequest(); } @override @@ -128,8 +255,9 @@ class LockOperatingRecordLogic extends BaseGetXController{ super.onInit(); print("onInit()"); - // senderReferEventRecordNumberTime(); - senderReferEventRecordNumber(); + getLockRecordLastUploadDataTime(); + // senderReferEventRecordTime(); + // senderReferEventRecordNumber(); } @override diff --git a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart index f4fcd5a4..5ad8e2c5 100644 --- a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart +++ b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart @@ -8,6 +8,7 @@ import 'package:star_lock/main/lockMian/entity/lockInfoEntity.dart'; import '../../../app_settings/app_colors.dart'; import '../../../tools/jh_pop_menus.dart'; +import '../../../tools/noData.dart'; import '../../../tools/titleAppBar.dart'; import '../../../translations/trans_lib.dart'; import 'lockOperatingRecord_logic.dart'; @@ -24,18 +25,18 @@ class _LockOperatingRecordPageState extends State { final logic = Get.put(LockOperatingRecordLogic()); final state = Get.find().state; - late KeyInfos keyInfo; - late LockMainEntity lockMainEntity; + // late KeyInfos keyInfo; + // late LockMainEntity lockMainEntity; @override Widget build(BuildContext context) { - dynamic obj = ModalRoute.of(context)?.settings.arguments; - if (obj != null && (obj["lockMainEntity"] != null)) { - lockMainEntity = obj["lockMainEntity"]; - } - if (obj != null && (obj["keyInfo"] != null)) { - keyInfo = obj["keyInfo"]; - } + // dynamic obj = ModalRoute.of(context)?.settings.arguments; + // if (obj != null && (obj["lockMainEntity"] != null)) { + // lockMainEntity = obj["lockMainEntity"]; + // } + // if (obj != null && (obj["keyInfo"] != null)) { + // keyInfo = obj["keyInfo"]; + // } return Scaffold( backgroundColor: AppColors.mainBackgroundColor, @@ -55,9 +56,9 @@ class _LockOperatingRecordPageState extends State { print('选中index: $index'); print('选中text: $selText'); if (index == 0) { - mockNetworkDataRequest(); + logic.mockNetworkDataRequest(); } else if (index == 1) { - clearOperationRecordRequest(); + logic.clearOperationRecordRequest(); } }, listData: [ {'text': '读取记录'}, @@ -68,90 +69,26 @@ class _LockOperatingRecordPageState extends State { ), ], ), - body: FutureBuilder>( - future: mockNetworkDataRequest(), - builder: (BuildContext context, - AsyncSnapshot> snapshot) { - //请求结束 - if (snapshot.connectionState == ConnectionState.done) { - if (snapshot.hasError) { - //请求失败 - return const Text('请求失败'); - } else { - //请求成功 - final List itemDataList = snapshot.data!; - - return Column( - children: [ - Container( - padding: EdgeInsets.all(20.h), - child: Text( - TranslationLoader.lanKeys!.lockOperatingRecordTip!.tr, - textAlign: TextAlign.start, - style: TextStyle(fontSize: 20.sp), - ), - ), - _searchWidget(), - SizedBox( - height: 10.h, - ), - Expanded(child: _buildMainUI(itemDataList)), - ], - ); - } - } else { - //请求未结束 显示loading - return Container(); - } - }), + body: Column( + children: [ + Container( + padding: EdgeInsets.all(20.h), + child: Text( + TranslationLoader.lanKeys!.lockOperatingRecordTip!.tr, + textAlign: TextAlign.start, + style: TextStyle(fontSize: 20.sp), + ), + ), + _searchWidget(), + SizedBox( + height: 10.h, + ), + Expanded(child: _buildMainUI()), + ], + ), ); } - //请求操作记录列表 - Future> mockNetworkDataRequest() async { - KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordList( - '0', - keyInfo.keyId.toString(), - '0', - keyInfo.lockId.toString(), - '1', - '1', - '20', - '0', - '', - '', - '', - '', - '', - ''); - if (entity.errorCode!.codeIsSuccessful) { - print("操作记录列表成功:${entity.data?.itemList}"); - } - final data = entity.data; - if (data != null) { - return data.itemList!; - } else { - List dataList = []; - return dataList; - } - } - - //清空操作记录 - Future> clearOperationRecordRequest() async { - KeyOperationRecordEntity entity = - await ApiRepository.to.clearOperationRecord('28'); - if (entity.errorCode!.codeIsSuccessful) { - print("操作记录列表成功:${entity.data?.itemList}"); - } - final data = entity.data; - if (data != null) { - return data.itemList!; - } else { - List dataList = []; - return dataList; - } - } - Widget _searchWidget() { return Container( height: 60.h, @@ -187,11 +124,11 @@ class _LockOperatingRecordPageState extends State { ); } - Widget _buildMainUI(List itemDataList) { - return ListView.separated( - itemCount: itemDataList.length, + Widget _buildMainUI() { + return Obx(() => state.lockOperatingRecordListData.value.isNotEmpty ? ListView.separated( + itemCount: state.lockOperatingRecordListData.length, itemBuilder: (c, index) { - KeyRecordDataItem dataItem = itemDataList[index]; + KeyRecordDataItem dataItem = state.lockOperatingRecordListData[index]; int? operateDate = dataItem.operateDate; DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(operateDate!); String operateDateStr = @@ -201,7 +138,7 @@ class _LockOperatingRecordPageState extends State { 'images/controls_user.png', dataItem.username ?? "未知", '$operateDateStr用${dataItem.recordTypeName}', - () {}); + () {}); }, separatorBuilder: (BuildContext context, int index) { return const Divider( @@ -209,7 +146,7 @@ class _LockOperatingRecordPageState extends State { color: AppColors.greyLineColor, ); }, - ); + ) : const NoData()); } Widget _dateItem(String lockDate) { diff --git a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_state.dart b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_state.dart index 9f0c41f1..ae11a1c0 100644 --- a/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_state.dart +++ b/star_lock/lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_state.dart @@ -1,4 +1,15 @@ +import 'package:get/get.dart'; + +import '../../lockMian/entity/lockInfoEntity.dart'; +import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; + class LockOperatingRecordState{ + final keyInfos = KeyInfos().obs; + final lockOperatingRecordListData = [].obs; + + LockOperatingRecordState() { + keyInfos.value = Get.arguments["keyInfo"]; + } } \ No newline at end of file diff --git a/star_lock/lib/main/lockMian/entity/lockInfoEntity.dart b/star_lock/lib/main/lockMian/entity/lockInfoEntity.dart index 37dbf908..8bc6bffb 100644 --- a/star_lock/lib/main/lockMian/entity/lockInfoEntity.dart +++ b/star_lock/lib/main/lockMian/entity/lockInfoEntity.dart @@ -441,13 +441,13 @@ class KeyInfos { } class LockVersion { - int? scene; - int? protocolVersion; + String? scene; + String? protocolVersion; String? logoUrl; - int? orgId; + String? orgId; bool? showAdminKbpwdFlag; - int? protocolType; - int? groupId; + String? protocolType; + String? groupId; LockVersion( {this.scene, diff --git a/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_logic.dart b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_logic.dart new file mode 100644 index 00000000..5a9df4f8 --- /dev/null +++ b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_logic.dart @@ -0,0 +1,81 @@ + + +import 'package:amap_flutter_location/amap_flutter_location.dart'; +import 'package:amap_flutter_location/amap_location_option.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; + +import 'lockAddressGaoDe_state.dart'; + +class LockAddressGaoDeLogic extends BaseGetXController{ + LockAddressGaoDeState state = LockAddressGaoDeState(); + + // Future requestPermission() async { + // final status = await Permission.location.request(); + // print("Permission.location.request()=status:$status"); + // // state.permissionStatus = status; + // switch (status) { + // case PermissionStatus.denied: + // print("拒绝"); + // break; + // case PermissionStatus.granted: + // requestLocation(); + // break; + // case PermissionStatus.limited: + // print("限制"); + // break; + // default: + // print("其他状态"); + // requestLocation(); + // break; + // } + // } + // + // Future requestLocation() async { + // state.location = AMapFlutterLocation() + // ..setLocationOption(AMapLocationOption()) + // ..onLocationChanged().listen((event) { + // print("listenLocationChanged$event"); + // state.latitude.value = double.parse(event['latitude'] as String); + // state.longitude.value = double.parse(event['longitude'] as String); + // if (state.latitude.value != 0 && state.longitude.value != 0) { + // // widget.callback(event); + // state.addressInfo.value = event; + // // currentLocation = CameraPosition( + // // target: LatLng(latitude, longitude), + // // zoom: 10, + // // ); + // } + // }) + // ..startLocation(); + // } + + @override + void onReady() { + // TODO: implement onReady + super.onReady(); + print("onReady()"); + + } + + @override + void onInit() { + // TODO: implement onInit + super.onInit(); + print("onInit()"); + + // AMapFlutterLocation.updatePrivacyAgree(true); + // AMapFlutterLocation.updatePrivacyShow(true, true); + // AMapFlutterLocation.setApiKey("11d49b3f4fc09c04a02bbb7500925ba2", "883a3355d2d77c2fdc2667030dc97ffe"); + // + // requestPermission(); + } + + @override + void onClose() { + // TODO: implement onClose + super.onClose(); + print("地图界面onClose()"); + } + +} \ No newline at end of file diff --git a/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart new file mode 100644 index 00000000..bb1c6e0c --- /dev/null +++ b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart @@ -0,0 +1,212 @@ + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:amap_flutter_location/amap_flutter_location.dart'; +import 'package:amap_flutter_location/amap_location_option.dart'; + +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:amap_flutter_map/amap_flutter_map.dart'; +import 'package:amap_flutter_base/amap_flutter_base.dart'; + +import '../../../../appRouters.dart'; +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; +import '../../../../tools/toast.dart'; +import '../../../../translations/trans_lib.dart'; + +// typedef BlockAddressMapCallback = void Function(dynamic addressMap); + +class LockAddressGaoDePage extends StatefulWidget { + // BlockAddressMapCallback callback; + + const LockAddressGaoDePage({Key? key}) : super(key: key); + + @override + State createState() => _LockAddressGaoDePageState(); +} + +class _LockAddressGaoDePageState extends State{ + // 高德地图 + static const AMapApiKey amapApiKeys = AMapApiKey(iosKey: '883a3355d2d77c2fdc2667030dc97ffe', androidKey: '11d49b3f4fc09c04a02bbb7500925ba2'); + + AMapController? mapController; + AMapFlutterLocation? location; + + PermissionStatus? permissionStatus; + Map? addressInfo; + + @override + void initState() { + super.initState(); + + AMapFlutterLocation.updatePrivacyAgree(true); + AMapFlutterLocation.updatePrivacyShow(true, true); + AMapFlutterLocation.setApiKey("11d49b3f4fc09c04a02bbb7500925ba2", "883a3355d2d77c2fdc2667030dc97ffe"); + + requestPermission(); + } + + Future requestPermission() async { + final status = await Permission.location.request(); + print("Permission.location.request()=status:$status"); + permissionStatus = status; + switch (status) { + case PermissionStatus.denied: + print("拒绝"); + break; + case PermissionStatus.granted: + requestLocation(); + break; + case PermissionStatus.limited: + print("限制"); + break; + default: + print("其他状态"); + requestLocation(); + break; + } + } + + Future requestLocation() async { + location = AMapFlutterLocation() + ..setLocationOption(AMapLocationOption()) + ..onLocationChanged().listen((event) { + print("listenLocationChanged$event"); + // double? latitude = double.parse(event['latitude']); + // double? longitude = double.parse(event['longitude'] as String); + if (event.isNotEmpty) { + // widget.callback(event); + setState(() { + addressInfo = event; + // currentLocation = CameraPosition( + // target: LatLng(latitude, longitude), + // zoom: 10, + // ); + }); + } + }) + ..startLocation(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: TranslationLoader.lanKeys!.lockAddress!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + TextButton( + child: Text( + TranslationLoader.lanKeys!.next!.tr, + style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + onPressed: () { + if(addressInfo!.isEmpty){ + Toast.show(msg:"还未获取到位置信息哦,请耐心等待一下!"); + return; + } + Get.toNamed(Routers.saveLockPage, arguments: addressInfo); + // Navigator.pushNamed(context, Routers.saveLockPage); + }, + ), + ], + ), + body: + addressInfo != null ? + Container( + width: 1.sw, + // height: 1.sh, + child: Stack( + children: [ + SizedBox( + // height: 1.sh - 40.h, + // width: 1.sw, + child: + (addressInfo!["address"].toString().isNotEmpty) ? + AMapWidget( + apiKey: amapApiKeys, + // 初始化地图中心 + initialCameraPosition: ( + CameraPosition( + target: LatLng(double.parse(addressInfo!['latitude'] as String), double.parse(addressInfo!['longitude'] as String)), + zoom: 10.0, + ) + ), + //定位小蓝点 + myLocationStyleOptions: MyLocationStyleOptions( + true, + ), + // 普通地图normal,卫星地图satellite,夜间视图night,导航视图 navi,公交视图bus, + mapType: MapType.normal, + // 缩放级别范围 + minMaxZoomPreference: const MinMaxZoomPreference(3, 20), + // 隐私政策包含高德 必须填写 + privacyStatement: const AMapPrivacyStatement(hasAgree: true, hasContains: true, hasShow: true), + // 地图创建成功时返回AMapController + onMapCreated: (AMapController controller) { + mapController = controller; + }, + ) + : Container(), + ), + Positioned( + left: 20.w, right: 20.w, bottom: 100.h, + child: Container( + // height: h(106), + decoration: BoxDecoration( + color: AppColors.mainColor, + borderRadius: BorderRadius.circular(15.w), + ), + child:Column( + children: [ + Container( + // height: h(53), + padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), + child: Row( + children: [ + Image.asset('images/main/icon_addUserShowAddress.png', width: 30.w, height: 30.w), + SizedBox(width: 10.w), + Expanded( + child: Text(addressInfo!["address"].toString() ?? "", style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, overflow: TextOverflow.clip)) + ), + ], + ), + ), + // Container(height: 1.h, color: const Color(0xFF021732),), + // Container( + // // height: h(52), + // padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), + // child: Row( + // children: [ + // Image.asset('images/main/icon_addUserAddressShowTime.png', width: 30.w, height: 30.w), + // SizedBox(width: 10.w,), + // Expanded( + // child: Text(DateTool().getNowDateYMDHM(), style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500),) + // ), + // ], + // ), + // ), + ], + ) + ),), + ], + ), + ) + : const Center(child: Text('地图加载中,请稍候。。。')), + ); + + } + + @override + void dispose() { + super.dispose(); + + location?.destroy(); + print("地图界面销毁了"); + } +} diff --git a/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_state.dart b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_state.dart new file mode 100644 index 00000000..55ce401a --- /dev/null +++ b/star_lock/lib/mine/addLock/lockAddress/gaode/lockAddressGaoDe_state.dart @@ -0,0 +1,17 @@ + +import 'package:amap_flutter_location/amap_flutter_location.dart'; +import 'package:amap_flutter_map/amap_flutter_map.dart'; +import 'package:amap_flutter_base/amap_flutter_base.dart'; +import 'package:get/get.dart'; +import 'package:permission_handler/permission_handler.dart'; + +class LockAddressGaoDeState{ + +// AMapController? mapController; +// AMapFlutterLocation? location; +// // PermissionStatus? permissionStatus; +// +// final addressInfo = {}.obs; +// final latitude = 39.909187.obs; +// final longitude = 116.397451.obs; +} \ No newline at end of file diff --git a/star_lock/lib/mine/addLock/lockAddress/lockAddressGoogle_page.dart b/star_lock/lib/mine/addLock/lockAddress/google/lockAddressGoogle_page.dart similarity index 100% rename from star_lock/lib/mine/addLock/lockAddress/lockAddressGoogle_page.dart rename to star_lock/lib/mine/addLock/lockAddress/google/lockAddressGoogle_page.dart diff --git a/star_lock/lib/mine/addLock/lockAddress/lockAddress_logic.dart b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart similarity index 90% rename from star_lock/lib/mine/addLock/lockAddress/lockAddress_logic.dart rename to star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart index dbbd7ccc..b3589a61 100644 --- a/star_lock/lib/mine/addLock/lockAddress/lockAddress_logic.dart +++ b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_logic.dart @@ -1,5 +1,5 @@ -import '../../../tools/baseGetXController.dart'; +import '../../../../tools/baseGetXController.dart'; import 'lockAddress_state.dart'; class LockAddressLogic extends BaseGetXController { diff --git a/star_lock/lib/mine/addLock/lockAddress/lockAddress_page.dart b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_page.dart similarity index 73% rename from star_lock/lib/mine/addLock/lockAddress/lockAddress_page.dart rename to star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_page.dart index afb0e135..039f8709 100644 --- a/star_lock/lib/mine/addLock/lockAddress/lockAddress_page.dart +++ b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_page.dart @@ -4,14 +4,15 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/tools/toast.dart'; -import '../../../appRouters.dart'; -import '../../../app_settings/app_colors.dart'; -import '../../../main.dart'; -import '../../../tools/titleAppBar.dart'; -import '../../../translations/trans_lib.dart'; +import '../../../../appRouters.dart'; +import '../../../../app_settings/app_colors.dart'; +import '../../../../main.dart'; +import '../../../../tools/titleAppBar.dart'; +import '../../../../translations/trans_lib.dart'; -import 'lockAddressGaoDe_page.dart'; +import '../gaode/lockAddressGaoDe_page.dart'; class LockAddressPage extends StatefulWidget { const LockAddressPage({Key? key}) : super(key: key); @@ -38,23 +39,27 @@ class _LockAddressPageState extends State with RouteAware{ style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { + if(addressInfo!.isEmpty){ + Toast.show(msg:"请先获取到位置信息哦!"); + return; + } Get.toNamed(Routers.saveLockPage, arguments: addressInfo); // Navigator.pushNamed(context, Routers.saveLockPage); }, ), ], ), - body: LockAddressGaoDePage(callback: (addressInfoMap){ - addressInfo = addressInfoMap; - },) - // body: Container(), + // body: LockAddressGaoDePage(callback: (addressInfoMap){ + // addressInfo = addressInfoMap; + // },) + body: Container(), ); } @override void dispose() { super.dispose(); - routeObserver.unsubscribe(this); + // routeObserver.unsubscribe(this); print("地图界面销毁了"); } diff --git a/star_lock/lib/mine/addLock/lockAddress/lockAddress_state.dart b/star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_state.dart similarity index 100% rename from star_lock/lib/mine/addLock/lockAddress/lockAddress_state.dart rename to star_lock/lib/mine/addLock/lockAddress/lockAddress/lockAddress_state.dart diff --git a/star_lock/lib/mine/addLock/lockAddress/lockAddressGaoDe_page.dart b/star_lock/lib/mine/addLock/lockAddress/lockAddressGaoDe_page.dart deleted file mode 100644 index 85df2314..00000000 --- a/star_lock/lib/mine/addLock/lockAddress/lockAddressGaoDe_page.dart +++ /dev/null @@ -1,183 +0,0 @@ - -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:amap_flutter_location/amap_flutter_location.dart'; -import 'package:amap_flutter_location/amap_location_option.dart'; - -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'package:amap_flutter_map/amap_flutter_map.dart'; -import 'package:amap_flutter_base/amap_flutter_base.dart'; - -import '../../../app_settings/app_colors.dart'; - -typedef BlockAddressMapCallback = void Function(dynamic addressMap); - -class LockAddressGaoDePage extends StatefulWidget { - BlockAddressMapCallback callback; - - LockAddressGaoDePage({Key? key, required this.callback}) : super(key: key); - - @override - State createState() => _LockAddressGaoDePageState(); -} - -class _LockAddressGaoDePageState extends State{ - // 高德地图 - static const AMapApiKey amapApiKeys = AMapApiKey(iosKey: '883a3355d2d77c2fdc2667030dc97ffe', androidKey: '11d49b3f4fc09c04a02bbb7500925ba2'); - - AMapController? mapController; - AMapFlutterLocation? location; - - PermissionStatus? permissionStatus; - Map? addressInfo; - - @override - void initState() { - super.initState(); - AMapFlutterLocation.setApiKey("11d49b3f4fc09c04a02bbb7500925ba2", "883a3355d2d77c2fdc2667030dc97ffe"); - AMapFlutterLocation.updatePrivacyAgree(true); - AMapFlutterLocation.updatePrivacyShow(true, true); - - requestPermission(); - } - - Future requestPermission() async { - final status = await Permission.location.request(); - permissionStatus = status; - switch (status) { - case PermissionStatus.denied: - print("拒绝"); - break; - case PermissionStatus.granted: - requestLocation(); - break; - case PermissionStatus.limited: - print("限制"); - break; - default: - print("其他状态"); - requestLocation(); - break; - } - } - - void requestLocation() { - location = AMapFlutterLocation() - ..setLocationOption(AMapLocationOption()) - ..onLocationChanged().listen((event) { - print("listenLocationChanged$event"); - double? latitude = double.parse(event['latitude'] as String); - double? longitude = double.parse(event['longitude'] as String); - if (latitude != 0 && longitude != 0) { - widget.callback(event); - setState(() { - addressInfo = event; - // currentLocation = CameraPosition( - // target: LatLng(latitude, longitude), - // zoom: 10, - // ); - }); - } - }) - ..startLocation(); - } - - @override - Widget build(BuildContext context) { - if (addressInfo?['latitude'] == null || - addressInfo?['longitude'] == null || - addressInfo?['errorCode'] == 0) { - return const Center(child: Text('地图加载中,请稍候。。。')); - } - - var latitude = 39.909187; - var longitude = 116.397451; - if(addressInfo!.containsKey('latitude')){ - latitude = double.parse(addressInfo!['latitude'] as String); - longitude = double.parse(addressInfo!['longitude'] as String); - } - - return Stack( - children: [ - Container( - height: MediaQuery.of(context).size.height, - width: MediaQuery.of(context).size.width, - child: (addressInfo!["address"].toString().isNotEmpty) ? AMapWidget( - apiKey: amapApiKeys, - // 初始化地图中心 - initialCameraPosition: ( - CameraPosition( - target: LatLng(latitude, longitude), - zoom: 10.0, - ) - ), - //定位小蓝点 - myLocationStyleOptions: MyLocationStyleOptions( - true, - ), - // 普通地图normal,卫星地图satellite,夜间视图night,导航视图 navi,公交视图bus, - mapType: MapType.normal, - // 缩放级别范围 - minMaxZoomPreference: const MinMaxZoomPreference(3, 20), - // 隐私政策包含高德 必须填写 - privacyStatement: const AMapPrivacyStatement(hasAgree: true, hasContains: true, hasShow: true), - // 地图创建成功时返回AMapController - onMapCreated: (AMapController controller) { - mapController = controller; - }, - ): Container(), - ), - Positioned( - left: 20.w, right: 20.w, bottom: 100.h, - child: Container( - // height: h(106), - decoration: BoxDecoration( - color: AppColors.mainColor, - borderRadius: BorderRadius.circular(15.w), - ), - child:Column( - children: [ - Container( - // height: h(53), - padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), - child: Row( - children: [ - Image.asset('images/main/icon_addUserShowAddress.png', width: 30.w, height: 30.w), - SizedBox(width: 10.w), - Expanded( - child: Text(addressInfo!["address"].toString() ?? "", style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, overflow: TextOverflow.clip)) - ), - ], - ), - ), - // Container(height: 1.h, color: const Color(0xFF021732),), - // Container( - // // height: h(52), - // padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w), - // child: Row( - // children: [ - // Image.asset('images/main/icon_addUserAddressShowTime.png', width: 30.w, height: 30.w), - // SizedBox(width: 10.w,), - // Expanded( - // child: Text(DateTool().getNowDateYMDHM(), style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500),) - // ), - // ], - // ), - // ), - ], - ) - ),), - ], - ); - } - - @override - void dispose() { - super.dispose(); - - location?.destroy(); - print("地图界面销毁了"); - } -} diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index 0dac691c..bf78b58c 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -51,8 +51,8 @@ class NearbyLockLogic extends BaseGetXController{ //成功 print("获取公钥成功"); // 储存公钥 - var tokenData = reply.data.sublist(3); - var saveStrList = changeIntListToStringList(tokenData); + var publicKey = reply.data.sublist(3); + var saveStrList = changeIntListToStringList(publicKey); Storage.setStringList(saveBluePublicKey, saveStrList); IoSenderManage.getPrivateKey( @@ -60,7 +60,7 @@ class NearbyLockLogic extends BaseGetXController{ keyID:"1", authUserID:"1", nowTime:1, - publicKeyData:tokenData, + publicKeyData:publicKey, needAuthor:1); break; case 0x07: @@ -95,7 +95,7 @@ class NearbyLockLogic extends BaseGetXController{ var saveSignKeyList = changeIntListToStringList(signKey); Storage.setStringList(saveBlueSignKey, saveSignKeyList); - Get.toNamed(Routers.lockAddressPage); + Get.toNamed(Routers.lockAddressGaoDePage); break; case 0x07: //无权限 @@ -117,7 +117,7 @@ class NearbyLockLogic extends BaseGetXController{ void onReady() { // TODO: implement onReady super.onReady(); - print("onReady()"); + print("NearbyLockLogic onReady()"); _initReplySubscription(); } @@ -126,7 +126,7 @@ class NearbyLockLogic extends BaseGetXController{ void onInit() { // TODO: implement onInit super.onInit(); - print("onInit()"); + print("NearbyLockLogic onInit()"); // 进来第一步开始扫描 BlueManage().startScan((v){ diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart index e8f88f20..ad0c28d0 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_page.dart @@ -24,8 +24,17 @@ class _NearbyLockPageState extends State { final logic = Get.put(NearbyLockLogic()); final state = Get.find().state; + @override + void initState() { + // TODO: implement initState + super.initState(); + + print("NearbyLockLogic initState()"); + } + @override Widget build(BuildContext context) { + print("NearbyLockLogic build()"); return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( @@ -47,6 +56,7 @@ class _NearbyLockPageState extends State { state.seletLockName.value = state.devices[index].name; // print("connect-lockId:${state.devices[index].id} deviceName:${state.devices[index].name}"); logic.connect(state.devices[index].id, state.devices[index].name); + // Get.toNamed(Routers.lockAddressGaoDePage); }); }, separatorBuilder: (BuildContext context, int index) { @@ -70,6 +80,7 @@ class _NearbyLockPageState extends State { children: [ Container( height: 89.h, + width: 1.sw, color: Colors.white, child: Row( children: [ diff --git a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart index 65f8347d..6624acc3 100644 --- a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -275,6 +275,7 @@ class SaveLockLogic extends BaseGetXController { // 获取锁状态 Future _getLockStatus() async { + print("connectDeviceMacAddress:${BlueManage().connectDeviceMacAddress} connectDeviceName:${BlueManage().connectDeviceName}"); // 进来之后首先连接 BlueManage().judgeReconnect(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async { if (state == DeviceConnectionState.connected) { diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index 240eda61..d3acbcf6 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -16,10 +16,13 @@ abstract class Api { final String electronicKeyListURL = '/key/listUser'; //电子钥匙列表 final String sendElectronicKeyURL = '/key/send'; //发送电子钥匙 final String resetElectronicKeyURL = '/key/reset'; //重置电子钥匙 - final String keyOperationRecordURL = '/lockRecords/list'; //电子钥匙操作记录 + final String keyOperationRecordURL = '/lockRecords/list'; //操作记录 final String uploadElectricQuantityURL = '/room/uploadElectricQuantity'; //锁电量更新 + final String lockRecordUploadURL = '/lockRecords/fromLock'; //操作上传 + final String getLockRecordLastUploadDataTimeURL = '/lockRecords/getLastRecordTime'; //查询锁记录最后时间 + final String bindingBlueAdminURL = '/lock/bindAdmin'; //绑定蓝牙管理员 final String modifyKeyNameURL = '/key/modifyKeyName'; //修改锁名称 final String modifyKeyNameForAdminURL = diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index b7054e82..963c5bdf 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -254,6 +254,26 @@ class ApiProvider extends BaseProvider { 'fingerprintId': fingerprintId })); + // 锁记录上传 + Future lockRecordUploadData( + String lockId, + List records) => + post( + lockRecordUploadURL.toUrl, + jsonEncode({ + 'lockId': lockId, + 'records': records, + })); + + // 查询锁记录最后时间 + Future getLockRecordLastUploadDataTime( + String lockId) => + post( + getLockRecordLastUploadDataTimeURL.toUrl, + jsonEncode({ + 'lockId': lockId, + })); + // 绑定蓝牙管理员 Future bindingBlueAdmin( String bindingDate, diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index d297ea35..69c4f077 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -29,6 +29,7 @@ import '../main/lockDetail/lcokSet/configuringWifi/configuringWifiEntity.dart'; import '../main/lockDetail/lcokSet/lockSet/CheckingInInfoDataEntity.dart'; import '../main/lockDetail/lcokSet/lockTime/GetServerDatetimeEntity.dart'; import '../main/lockDetail/lcokSet/normallyOpenMode/GetPassageModeConfigEntity.dart'; +import '../main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart'; import '../main/lockDetail/otherTypeKey/addFingerprint/addFingerprint/addFingerprint_entity.dart'; import '../main/lockDetail/otherTypeKey/addICCard/addICCard_entity.dart'; import '../main/lockDetail/otherTypeKey/otherTypeKeyList/fingerprintListData_entity.dart'; @@ -208,6 +209,28 @@ class ApiRepository { return KeyOperationRecordEntity.fromJson(res.body); } + //操作记录上传 + Future lockRecordUploadData( + { + required String lockId, + required List records + }) async { + final res = await apiProvider.lockRecordUploadData( + lockId, + records); + return KeyOperationRecordEntity.fromJson(res.body); + } + + // 查询锁记录最后时间 + Future getLockRecordLastUploadDataTime( + { + required String lockId + }) async { + final res = await apiProvider.getLockRecordLastUploadDataTime( + lockId); + return LockOperatingRecordGetLastRecordTimeEntity.fromJson(res.body); + } + // 绑定蓝牙管理员 Future bindingBlueAdmin( {required String bindingDate, diff --git a/star_lock/lib/tools/baseGetXController.dart b/star_lock/lib/tools/baseGetXController.dart index 62b3a781..96ef0d2f 100644 --- a/star_lock/lib/tools/baseGetXController.dart +++ b/star_lock/lib/tools/baseGetXController.dart @@ -84,6 +84,28 @@ class BaseGetXController extends GetxController{ } // Future loginSuccess({LoginEntity? loginEntity, bool byToken = false}) async => ClientManager().loginSuccess(loginEntity: loginEntity,byToken: byToken); + + + static List splitList(List list, int len) { + if (len <= 1) { + return [list]; + } + List result = []; + int index = 1; + while (true) { + if (index * len < list.length) { + List temp = list.skip((index - 1) * len).take(len).toList(); + result.add(temp); + index++; + continue; + } + List temp = list.skip((index - 1) * len).toList(); + result.add(temp); + break; + } + return result; + } + }