From 941433498db402fd97a05e7ece5ab103f6c65551 Mon Sep 17 00:00:00 2001 From: GeJiaXiang <353358601@qq.com> Date: Fri, 22 Mar 2024 15:27:19 +0800 Subject: [PATCH 1/4] fix --- star_lock/README.md | 2 ++ star_lock/pubspec.yaml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/star_lock/README.md b/star_lock/README.md index 4ee83f4c..1ecf099c 100644 --- a/star_lock/README.md +++ b/star_lock/README.md @@ -75,6 +75,8 @@ flutter build apk --split-per-abi --release --flavor sky -t lib/main_sky.dart 注意修改“VersionCode”为版本代码 ```bash +cp build/app/outputs/apk/sky/release/app-sky-armeabi-v7a-release.apk /d/www/SkyReleases/app-sky-32-release-VersionCode.apk +cp build/app/outputs/apk/sky/release/app-sky-arm64-v8a-release.apk /d/www/SkyReleases/app-sky-64-release-VersionCode.apk cp build/app/outputs/apk/sky/release/app-sky-universal-release.apk /d/www/SkyReleases/app-sky-universal-release-VersionCode.apk ``` ## 获取编译包的签名 diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index 33973666..6c027ca9 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -20,7 +20,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # 版本说明: # 1.0.18+2024032001:修复同意隐私政策前获取SN # 1.0.18+2024032002:修复注册页布局错乱;修复第二次才可以删除锁的问题;修改申请权限字符串 -# 1.0.18+20240321:打包给欧阳测试 +# 1.0.18+20240321(2024032101):打包给欧阳测试 # 1.0.20+2024032102:修复Apple Store App Tracking Transparency权限问题 version: 1.0.20+2024032102 From 9f365a82c0da0887071bf0159f789a187eb81519 Mon Sep 17 00:00:00 2001 From: GeJiaXiang <353358601@qq.com> Date: Fri, 22 Mar 2024 15:33:17 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=B0=A2=E6=80=BB=E7=8E=AF=E8=8A=82=E5=8F=A3=E5=91=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/flavorizr.yaml | 10 ++++++++++ star_lock/lib/flavors.dart | 12 ++++++++++-- star_lock/lib/main_xie.dart | 8 ++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 star_lock/lib/main_xie.dart diff --git a/star_lock/flavorizr.yaml b/star_lock/flavorizr.yaml index 8515329a..a4e6d12e 100644 --- a/star_lock/flavorizr.yaml +++ b/star_lock/flavorizr.yaml @@ -51,6 +51,16 @@ app: flavorDimensions: "flavor-type" flavors: + xie: + app: + name: "星锁-xie" + icon: "assets/icon/dev.png" + android: + applicationId: "com.starlock.lock.xie" + customConfig: + signingConfig: signingConfigs.pre + ios: + bundleId: "com.starlock.lock.xie" dev: app: name: "星锁-dev" diff --git a/star_lock/lib/flavors.dart b/star_lock/lib/flavors.dart index b92a882c..39d9a0f2 100644 --- a/star_lock/lib/flavors.dart +++ b/star_lock/lib/flavors.dart @@ -1,4 +1,5 @@ enum Flavor { + xie, dev, pre, sky, @@ -20,6 +21,8 @@ class F { static String get title { switch (appFlavor) { + case Flavor.xie: + return '星锁-xie'; case Flavor.dev: return '星锁-dev'; case Flavor.pre: @@ -35,6 +38,8 @@ class F { static String get navTitle { switch (appFlavor) { + case Flavor.xie: + return '星锁-xie'; case Flavor.dev: return '星锁-dev'; case Flavor.pre: @@ -50,10 +55,12 @@ class F { static String get apiPrefix { switch (appFlavor) { + // case Flavor.ge: + // return 'https://ge.lock.star-lock.cn'; + case Flavor.xie: + return 'http://192.168.1.15:8022'; case Flavor.dev: return 'https://dev.lock.star-lock.cn'; - // return "http://192.168.1.15:8022"; //谢总本地 - // "https://ge.lock.star-lock.cn"; //葛工开发环境地址 case Flavor.pre: return 'https://pre.lock.star-lock.cn'; case Flavor.sky: @@ -69,6 +76,7 @@ class F { // StarLockAMapKey static StarLockAMapKey get aMapKey { switch (appFlavor) { + case Flavor.xie: case Flavor.dev: return const StarLockAMapKey( androidKey: 'b56b681ee89f4db43a5aa1879ae8cbfe', diff --git a/star_lock/lib/main_xie.dart b/star_lock/lib/main_xie.dart new file mode 100644 index 00000000..cd62b84c --- /dev/null +++ b/star_lock/lib/main_xie.dart @@ -0,0 +1,8 @@ +import 'flavors.dart'; + +import 'main.dart' as runner; + +Future main() async { + F.appFlavor = Flavor.xie; + await runner.main(); +} From f2f28a212b694f4a3d2db92f7f0b8284f1d280d9 Mon Sep 17 00:00:00 2001 From: GeJiaXiang <353358601@qq.com> Date: Fri, 22 Mar 2024 15:53:51 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=B0=A2=E6=80=BB?= =?UTF-8?q?=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/android/app/build.gradle | 20 +++++++++++++++--- .../src/xie/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4098 bytes .../src/xie/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2622 bytes .../src/xie/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5808 bytes .../src/xie/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9444 bytes .../xie/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 13692 bytes 6 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 star_lock/android/app/src/xie/res/mipmap-hdpi/ic_launcher.png create mode 100644 star_lock/android/app/src/xie/res/mipmap-mdpi/ic_launcher.png create mode 100644 star_lock/android/app/src/xie/res/mipmap-xhdpi/ic_launcher.png create mode 100644 star_lock/android/app/src/xie/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 star_lock/android/app/src/xie/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/star_lock/android/app/build.gradle b/star_lock/android/app/build.gradle index f95e017f..8dc22d6e 100644 --- a/star_lock/android/app/build.gradle +++ b/star_lock/android/app/build.gradle @@ -36,7 +36,13 @@ android { keyAlias = 'starlock' keyPassword '123456' } - // 下面的pre、sky、xhj 都是自定义变量,自身不起任何作用,而是看哪里引用了它们 + // 下面的xie、pre、sky、xhj 都是自定义变量,自身不起任何作用,而是看哪里引用了它们 + xie { + storeFile file("starlock.keystore") + storePassword '123456' + keyAlias = 'starlock' + keyPassword '123456' + } pre { storeFile file("starlock.keystore") storePassword '123456' @@ -57,10 +63,18 @@ android { keyPassword 'xhj8872' } } + // ----- BEGIN flavorDimensions (autogenerated by flutter_flavorizr) ----- flavorDimensions "flavor-type" productFlavors { + xie { + dimension "flavor-type" + applicationId "com.starlock.lock.xie" + signingConfig signingConfigs.pre + resValue "string", "app_name", "星锁-xie" + manifestPlaceholders.JPUSH_PKGNAME = "com.starlock.lock.xie" + } dev { dimension "flavor-type" applicationId "com.starlock.lock.dev" @@ -93,8 +107,7 @@ android { // ----- END flavorDimensions (autogenerated by flutter_flavorizr) ----- - - compileSdkVersion flutter.compileSdkVersion + compileSdkVersion flutter.compileSdkVersion ndkVersion flutter.ndkVersion lintOptions{ @@ -163,6 +176,7 @@ android { // 真实的解决办法 minifyEnabled false shrinkResources false + productFlavors.xie.signingConfig signingConfigs.pre productFlavors.dev.signingConfig signingConfigs.pre productFlavors.pre.signingConfig signingConfigs.pre productFlavors.sky.signingConfig signingConfigs.sky diff --git a/star_lock/android/app/src/xie/res/mipmap-hdpi/ic_launcher.png b/star_lock/android/app/src/xie/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c4abfb2f3a3ace7e97c2307305a1be8578320384 GIT binary patch literal 4098 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⋘DfC`mar4;o5@;?An`{$}?p^vtL>)U*f9pCYD@{?4DQvVp z|LtkQ93a?`Nnhbh_v0aZE!g3WpT(uGoNNIQJkUsQc)# zK}l;|wAFGVWJf-x-PtC2M#pFj54Z$bdsh>J)PM7J1Bgu*ED4yG0KB5^y=%V+SHp1x zK1u#4^@xZ9KOE_F<4e>~Men=+Fe5OGIIBoEGHAeb;KHRoQ)Ylry$)>Okmi7-u=+$+ z?d5{t^6Jd2L|#yZf08G@{d8_Po>j?mn8edP6wI^pWFey$ZtnE|81D=v7@;Oq~!IN3rN_= z2oS|^1qRNSyP=B4(7Xq#h$5X$jg|X$3NL*HA}qH-Luf3Y$o&}&cW-kt4#)*OazG$E zWnjX)u%K)^e3jDLD05IKq zujm-&un~1X-t!t3t*eDd%U+bH?UDcb#GF-H|HwY;x4I9AGQLs6bs;-(!I{+Ssok3p z*}>6QTV0b$B~{0dh_7Bk%*t3)FYmyl)qWGqy#jPTW)Cu=_dE!U1pQWFpTl9}F$A~`v+7cKLjvj8?HnmaRUPnxwP2#nfQ;3F(C zbN=-Qf8Dq&4d?JQUBH3;+C64$$f^y!eJzwXaFQU50-Nng=44GORKsv~Uv)>7mhS_B zA$s@gADpt0`R-7h&vi)}SQzj)^eIHw@h;!M&^wxkK@XX8FC_;914NhL; zJ7p%pyC>RMY^7(+_=#O4iCe0Zp)9y}m)&1ScOgNZS3gFr0iKWi>)@-$r% zgj&CuWAiGJ4L^nlk4EdWZKv-f(-LgY$(RHQzbUfGo7F*x%w*BViOU^YhRTLfr9A26cr8;yw7HLNcCF&xT}Zsdj7V>+PJUf@AB*=;@1y*nrOax z(Gi@hN98x<&1$Ay3PP33<$ONhcE|rI5{X3r1xsr23CscVGynhq07*qoM6N<$f*T0` AbpQYW literal 0 HcmV?d00001 diff --git a/star_lock/android/app/src/xie/res/mipmap-mdpi/ic_launcher.png b/star_lock/android/app/src/xie/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6ef8ace4ce55b40ea33f5f52683467516767c46c GIT binary patch literal 2622 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 aX#5W!{>5e6r7>Ut0000 Date: Sat, 23 Mar 2024 11:23:38 +0800 Subject: [PATCH 4/4] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E5=8F=AA?= =?UTF-8?q?=E6=9C=89=E4=B8=80=E6=8A=8A=E9=94=81=E6=97=B6=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=94=81=E4=B9=8B=E5=90=8E=EF=BC=8C=E5=BC=80=E4=B8=8D?= =?UTF-8?q?=E9=94=81=E9=97=AE=E9=A2=98=E3=80=822=E3=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=85=B6=E4=BB=96bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/lib/blue/blue_manage.dart | 48 +++++------ .../io_protocol/io_senderCustomPasswords.dart | 4 +- star_lock/lib/blue/reciver_data.dart | 11 +-- .../safetyVerification_page.dart | 2 +- .../starLock_forgetPassword_logic.dart | 2 +- .../starLock_forgetPassword_page.dart | 2 +- .../card/cardDetail/cardDetail_logic.dart | 8 +- .../card/cardDetail/cardDetail_page.dart | 62 +++----------- .../card/cardDetail/cardDetail_state.dart | 1 - .../card/cardList/cardList_page.dart | 30 ++++--- .../otherTypeKeyChangeDate_logic.dart | 4 + .../otherTypeKeyChangeDate_page.dart | 4 +- .../otherTypeKeyChangeDate_state.dart | 26 ++++-- .../otherTypeKeyChangeValidityDate_logic.dart | 3 + .../otherTypeKeyChangeValidityDate_page.dart | 6 +- .../electronicKeyDetail_page.dart | 9 +- .../electronicKeyDetailChangeDate_logic.dart | 48 +++++------ .../electronicKeyDetailChangeDate_page.dart | 85 ++++++++++++------- .../electronicKeyDetailChangeDate_state.dart | 12 +-- .../sendElectronicKey_page.dart | 11 ++- .../sendElectronicKey_state.dart | 1 + .../fingerprintDetail_page.dart | 2 + .../fingerprintList/fingerprintList_page.dart | 16 ++-- .../lockDetail/lockDetail_logic.dart | 61 ++++++------- .../lockDetail/lockDetail_page.dart | 4 + .../lockDetail/lockDetail_state.dart | 4 + .../remoteUnlocking_logic.dart | 2 + .../passwordKeyDetail_logic.dart | 31 ++++--- .../passwordKeyDetail_page.dart | 34 +++++--- .../passwordKeyDetailChangeDate_logic.dart | 26 +++++- .../passwordKeyDetailChangeDate_page.dart | 22 ++++- .../passwordKeyList_logic.dart | 2 +- .../passwordKeyList/passwordKeyList_page.dart | 16 ++-- .../mine/addLock/saveLock/saveLock_logic.dart | 2 +- star_lock/lib/network/api_provider.dart | 16 +++- star_lock/lib/network/api_provider_base.dart | 2 +- star_lock/lib/network/api_repository.dart | 13 ++- star_lock/lib/tools/eventBusEventManage.dart | 2 +- 38 files changed, 363 insertions(+), 271 deletions(-) diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 55574400..2c301a41 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -69,7 +69,7 @@ class BlueManage { BlueManage? get manager => shareManager(); void _initBlue(){ - print("蓝牙功能初始化监听"); + Get.log("蓝牙功能初始化监听"); _initSendStreamSubscription(); _initAdapterStateStateSubscription(); // _initListenscanResults(); @@ -79,7 +79,7 @@ class BlueManage { void _initGetMtuSubscription() { _mtuSubscription ??= bluetoothConnectDevice!.mtu.listen((value) { _mtuSize = value - 3; - print('mtuSize:$_mtuSize'); + Get.log('mtuSize:$_mtuSize'); }); } @@ -196,7 +196,7 @@ class BlueManage { // EventBusManager().eventBusFir(scanDevices); // FlutterBluePlus.stopScan(); }, onError: (e) { - print("Scan Error:$e", ); + Get.log("Scan Error:$e", ); }); FlutterBluePlus.cancelWhenScanComplete(subscription); @@ -257,7 +257,7 @@ class BlueManage { List devicesList = scanDevices; if(isAddEquipment == false){ startScan(10, (List scanDevices){ - print("扫描到的设备:$scanDevices"); + Get.log("扫描到的设备:$scanDevices"); devicesList = scanDevices; _connectDevice(devicesList, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); }); @@ -268,20 +268,20 @@ class BlueManage { Future _connectDevice( List devicesList, String deviceName, ConnectStateCallBack connectStateCallBack, {bool isAddEquipment = false}) async { // 判断数组列表里面是否有这个设备 - print("devicesList:$devicesList"); + Get.log("devicesList:$devicesList"); final knownDeviceIndex = devicesList.indexWhere((d) => d.advertisementData.advName == deviceName); if (knownDeviceIndex >= 0) { // 存在的时候赋值 connectDeviceMacAddress = devicesList[knownDeviceIndex].advertisementData.advName; bluetoothConnectDevice = devicesList[knownDeviceIndex].device; - print('bluetoothConnectDevice: $bluetoothConnectDevice'); + Get.log('bluetoothConnectDevice: $bluetoothConnectDevice'); scanResult = devicesList[knownDeviceIndex]; _initGetMtuSubscription(); _initListenConnectionState(); } - print("1 connectDeviceId:$connectDeviceMacAddress connectDeviceName:$connectDeviceName"); + Get.log("1 connectDeviceId:$connectDeviceMacAddress connectDeviceName:$connectDeviceName"); // stopScan(); if (connectDeviceMacAddress.isEmpty) { // connectStateCallBack(BluetoothConnectionState.disconnected!); @@ -319,26 +319,26 @@ class BlueManage { } // await bluetoothConnectDevice!.connect(); - print("5555555:回调状态:$bluetoothConnectionState"); + Get.log("5555555:回调状态:$bluetoothConnectionState"); if (bluetoothConnectionState == BluetoothConnectionState.connected) { try { bluetoothConnectDevice!.discoverServices().then((services) { - print("333333333"); + Get.log("333333333"); for (BluetoothService service in services) { - // print("11111service.remoteId:${service.remoteId}" + // Get.log("11111service.remoteId:${service.remoteId}" // " service.uuid:${service.uuid}" // " service.characteristics:${service.characteristics}" // " service.includedServices:${service.includedServices}"); if(service.uuid == _serviceIdConnect){ for (BluetoothCharacteristic characteristic in service.characteristics) { - // print("22222characteristic.remoteId:${characteristic.remoteId}" + // Get.log("22222characteristic.remoteId:${characteristic.remoteId}" // " characteristic.uuid:${characteristic.uuid}" // " characteristic.secondaryServiceUuid:${characteristic.secondaryServiceUuid}" // " characteristic.characteristicUuid:${characteristic.characteristicUuid}"); if (characteristic.characteristicUuid == _characteristicIdSubscription) { - print("44444444"); + Get.log("44444444"); _subScribeToCharacteristic(characteristic); - print('Discovering services finished'); + Get.log('Discovering services finished'); bluetoothConnectionState = BluetoothConnectionState.connected; connectStateCallBack(bluetoothConnectionState!); } @@ -350,7 +350,7 @@ class BlueManage { bluetoothConnectionState = BluetoothConnectionState.disconnected; Get.log("5555 回调状态:$bluetoothConnectionState"); connectStateCallBack(bluetoothConnectionState!); - print('Error occurred when discovering services: $e'); + Get.log('Error occurred when discovering services: $e'); rethrow; } } @@ -363,27 +363,27 @@ class BlueManage { int? dataLen; _subScribeToCharacteristic(BluetoothCharacteristic characteristic) async { final subscription = characteristic.onValueReceived.listen((data) { - print("启动对特性的通知。当特性的值发生变化时,设备会发送一个通知"); - print("订阅获取的数据:$data"); + Get.log("启动对特性的通知。当特性的值发生变化时,设备会发送一个通知"); + Get.log("订阅获取的数据:$data"); if(data == lastTimeData || data.isEmpty){ return; }else{ lastTimeData = data; } // code to handle incoming data - // print("subscribeToCharacteristic: deviceId = ${characteristic.deviceId} characteristicId =${characteristic.characteristicId}---上报来的数据data = $data"); + // Get.log("subscribeToCharacteristic: deviceId = ${characteristic.deviceId} characteristicId =${characteristic.characteristicId}---上报来的数据data = $data"); if ((data[0] == 0xEF) && (data[1] == 0x01) && (data[2] == 0xEE) && (data[3] == 0x02)) { // 当包有头时 // 判断是否需要分包 dataLen = data[8] * 256 + data[9]; // 高16位用来指示后面数据块内容的长度 - // print("dataLen1111:$dataLen getDataLength:${data.length}"); + // Get.log("dataLen1111:$dataLen getDataLength:${data.length}"); if (dataLen! + 12 > data.length) { // 当前包的长度小于实际的包时 分包添加 不解析 allData.addAll(data); } else { // 当前包的长度小于实际的包时 不分包 解析 allData.addAll(data); - // print("dataLen2222:$dataLen getDataLength:${data.length}"); + // Get.log("dataLen2222:$dataLen getDataLength:${data.length}"); CommandReciverManager.appDataReceive(allData); // 发送完解析初始化数组 allData = []; @@ -475,20 +475,20 @@ class BlueManage { try { List valueList = value; List subData = splitList(valueList, _mtuSize!); - print( + Get.log( 'writeCharacteristicWithResponse 得到的分割数据:$subData'); for (int i = 0; i < subData.length; i++) { await characteristic.write(subData[i]).then((value) async { await Future.delayed(const Duration(milliseconds: 1)).then(( value) async { - print('分包发送成功了'); + Get.log('分包发送成功了'); }); }); } } on Exception catch (e, s) { - print('Error occurred when writing: $e'); - print(s); + Get.log('Error occurred when writing: $e'); + // Get.log(s); rethrow; } } @@ -563,7 +563,7 @@ class BlueManage { await bluetoothConnectDevice!.disconnect(); Get.log("断开连接成功"); } on Exception catch (e, _) { - print("Error disconnecting from a device: $e"); + Get.log("Error disconnecting from a device: $e"); } finally { bluetoothConnectionState = BluetoothConnectionState.disconnected; } diff --git a/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart b/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart index f0d272cf..e041fdce 100644 --- a/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart +++ b/star_lock/lib/blue/io_protocol/io_senderCustomPasswords.dart @@ -70,7 +70,7 @@ class SenderCustomPasswordsCommand extends SenderProtocol { subData = getFixedLengthList(subData, 20 - userIDLength); // PwdNo - subData.add(1); + subData.add(pwdNo!); // pwd 20 int pwdLength = utf8.encode(pwd!).length; @@ -79,7 +79,7 @@ class SenderCustomPasswordsCommand extends SenderProtocol { subData = getFixedLengthList(subData, 20 - pwdLength); // UseCountLimit - subData.add(0xff); + subData.add(useCountLimit!); // token subData.addAll(token!); diff --git a/star_lock/lib/blue/reciver_data.dart b/star_lock/lib/blue/reciver_data.dart index 5dc31958..b16c8d7b 100644 --- a/star_lock/lib/blue/reciver_data.dart +++ b/star_lock/lib/blue/reciver_data.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:get/get.dart'; import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/blue/io_protocol/io_addFace.dart'; import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; @@ -56,7 +57,7 @@ class CommandReciverManager { return; } - print("appDataReceiveData:$data"); // &&(data[4] == 0x11) + Get.log("appDataReceiveData:$data"); // &&(data[4] == 0x11) if ((data[0] == 0xEF) && (data[1] == 0x01) && (data[2] == 0xEE) && @@ -110,11 +111,11 @@ class CommandReciverManager { break; } parseData(oriDataList).then((value) async { - print("parseData222 data:$value"); + Get.log("parseData222 data:$value"); EasyLoading.dismiss(); await EventBusManager().eventBusFir(value); }).catchError((error) { - print("Error occurred while parsing data: $error"); + Get.log("Error occurred while parsing data: $error"); }); } // print('✅ 执行结束 _buffer:${_buffer.length}'); @@ -126,7 +127,7 @@ class CommandReciverManager { CommandType commandType = ExtensionCommandType.getCommandType(cmd); await IoManager().increaseCommandIndex(); // data.removeRange(0, 2); - print("parseData cmd:$cmd commandType:$commandType data:$data"); + Get.log("parseData cmd:$cmd commandType:$commandType data:$data"); var reply; switch (commandType) { case CommandType.getLockPublicKey: @@ -151,7 +152,7 @@ class CommandReciverManager { break; case CommandType.openLock: { - print("openLockReply data:$data"); + Get.log("openLockReply data:$data"); reply = OpenDoorReply.parseData(commandType, data); } break; diff --git a/star_lock/lib/common/safetyVerification/safetyVerification_page.dart b/star_lock/lib/common/safetyVerification/safetyVerification_page.dart index 5d910149..523aef71 100644 --- a/star_lock/lib/common/safetyVerification/safetyVerification_page.dart +++ b/star_lock/lib/common/safetyVerification/safetyVerification_page.dart @@ -135,7 +135,7 @@ class _SafetyVerificationPageState extends State with Ti return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.about!.tr, + barTitle: "安全验证", haveBack: true, backgroundColor: AppColors.mainColor), body: Container( diff --git a/star_lock/lib/login/forgetPassword/starLock_forgetPassword_logic.dart b/star_lock/lib/login/forgetPassword/starLock_forgetPassword_logic.dart index 4a6e5723..47f50841 100644 --- a/star_lock/lib/login/forgetPassword/starLock_forgetPassword_logic.dart +++ b/star_lock/lib/login/forgetPassword/starLock_forgetPassword_logic.dart @@ -47,7 +47,7 @@ class StarLockForgetPasswordLogic extends BaseGetXController { void sendValidationCode() async { var entity = await ApiRepository.to.sendValidationCode( // state.countryCode.value, - countryCode:"+86", + countryCode:state.countryCode.value, account:state.phoneStr.value, channel:state.codeType.value, codeType:'2', diff --git a/star_lock/lib/login/forgetPassword/starLock_forgetPassword_page.dart b/star_lock/lib/login/forgetPassword/starLock_forgetPassword_page.dart index a017903b..9948afb2 100644 --- a/star_lock/lib/login/forgetPassword/starLock_forgetPassword_page.dart +++ b/star_lock/lib/login/forgetPassword/starLock_forgetPassword_page.dart @@ -33,7 +33,7 @@ class _StarLockForgetPasswordPageState backgroundColor: const Color(0xFFFFFFFF), appBar: TitleAppBar( barTitle: - "${TranslationLoader.lanKeys!.reset!.tr}${TranslationLoader.lanKeys!.password!.tr}", + "忘记密码", haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( diff --git a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart index 1c3462fa..8faa4af8 100644 --- a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_logic.dart @@ -147,10 +147,14 @@ class CardDetailLogic extends BaseGetXController{ isCoerced: state.isStressFingerprint.value ? "2" : "1", cardName: state.changeNameController.text, changeType: "1", + startTime: 0, + endTime: 0, + cardType: 0, ); if(entity.errorCode!.codeIsSuccessful){ - showToast("修改成功"); - Get.back(result: "addScuess"); + showToast("修改成功", something: (){ + Get.back(result: "addScuess"); + }); } } diff --git a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart index 7814b496..06fd82ea 100644 --- a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart +++ b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_page.dart @@ -63,7 +63,7 @@ class _CardDetailPageState extends State with RouteAware { showCupertinoAlertDialog(context); })), Obx(() => Visibility( - visible: (state.keyType.value == 4 || state.keyType.value == 2) ? true : false, + visible: (state.keyType.value == 4 || state.keyType.value == 2 || state.keyType.value == 1) ? true : false, child: CommonItem( leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr, allHeight: 70.h, @@ -72,29 +72,24 @@ class _CardDetailPageState extends State with RouteAware { isHaveDirection: true, isHaveLine: true, action: () async { - // switch(state.type.value){ - // case 0: - // // 卡 - // - // break; - // case 1: // 当是指纹的时候 - if(state.keyType.value == 2){ + if(state.keyType.value == 2 || state.keyType.value == 1){ // 限时 var data = await Get.toNamed(Routers.otherTypeKeyChangeDatePage, arguments: { - "pushType": state.type.value, + "pushType": 0, "fingerprintItemData": state.fingerprintItemData.value, }); if(data != null) { setState(() { state.effectiveDateTime.value = data["beginTimeTimestamp"]; state.failureDateTime.value = data["endTimeTimestamp"]; + state.keyType.value = 2; }); } }else if(state.keyType.value == 4){ // 循环 var data = await Get.toNamed(Routers.otherTypeKeyChangeValidityDatePage, arguments: { - "pushType": state.type.value, + "pushType": 0, "fingerprintItemData": state.fingerprintItemData.value, }); if(data != null) { @@ -105,12 +100,6 @@ class _CardDetailPageState extends State with RouteAware { }); } } - // break; - // case 2: - // // 遥控 - // - // break; - // } }))), Obx(() => Visibility( visible: state.keyType.value == 4 ? true : false, @@ -119,15 +108,8 @@ class _CardDetailPageState extends State with RouteAware { rightTitle: state.weekDay.value.join(','), isHaveDirection: true, action: () async { - // switch(state.type.value){ - // case 0: - // // 卡 - // - // break; - // case 1: - // 当是指纹的时候 var data = await Get.toNamed(Routers.otherTypeKeyChangeValidityDatePage, arguments: { - "pushType": state.type.value, + "pushType": 0, "fingerprintItemData": state.fingerprintItemData.value, }); if(data != null) { @@ -137,12 +119,6 @@ class _CardDetailPageState extends State with RouteAware { state.weekDay.value = data["weekDay"]; }); } - // break; - // case 2: - // // 遥控 - // - // break; - // } }))) ), Container(height: 10.h), @@ -172,28 +148,10 @@ class _CardDetailPageState extends State with RouteAware { rightTitle: "", isHaveDirection: true, action: () { - switch (state.type.value) { - case 0: - // 卡 - Get.toNamed(Routers.keyOperationRecordPage, arguments: { - 'lockId': state.fingerprintItemData.value.lockId.toString(), - 'cardId': state.fingerprintItemData.value.cardId.toString() - }); - break; - case 1: - // 指纹 - Get.toNamed(Routers.keyOperationRecordPage, arguments: { - 'lockId': state.fingerprintItemData.value.lockId.toString(), - 'fingerprintId': state.fingerprintItemData.value.fingerprintId.toString() - }); - break; - case 2: - - break; - default: - break; - } - + Get.toNamed(Routers.keyOperationRecordPage, arguments: { + 'lockId': state.fingerprintItemData.value.lockId.toString(), + 'cardId': state.fingerprintItemData.value.cardId.toString() + }); }), // SizedBox(height: 40.h), // addControlsBtn(type), diff --git a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_state.dart b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_state.dart index eb1b2b95..42329358 100644 --- a/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_state.dart +++ b/star_lock/lib/main/lockDetail/card/cardDetail/cardDetail_state.dart @@ -7,7 +7,6 @@ import '../../fingerprint/fingerprintList/fingerprintListData_entity.dart'; class CardDetailState{ final fingerprintItemData = FingerprintItemData().obs; - final type = 0.obs;// 0卡 1指纹 2遥控 final TextEditingController changeNameController = TextEditingController(); diff --git a/star_lock/lib/main/lockDetail/card/cardList/cardList_page.dart b/star_lock/lib/main/lockDetail/card/cardList/cardList_page.dart index 1d35e5d7..de7991f9 100644 --- a/star_lock/lib/main/lockDetail/card/cardList/cardList_page.dart +++ b/star_lock/lib/main/lockDetail/card/cardList/cardList_page.dart @@ -98,8 +98,7 @@ class _CardListPageState extends State with RouteAware { btnName: '${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.card!.tr}', onClick: () async { - var data = - await Get.toNamed(Routers.addCardTypeManagePage, arguments: { + var data = await Get.toNamed(Routers.addCardTypeManagePage, arguments: { "lockId": state.lockId.value, "fromType": 1 // 1从添加钥匙列表进入 2从考勤添加员工入口进入 }); @@ -133,7 +132,7 @@ class _CardListPageState extends State with RouteAware { children: [ SlidableAction( onPressed: (BuildContext context){ - showIosTipViewDialog(context); + showIosTipViewDialog(fingerprintItemData); }, backgroundColor: Colors.red, foregroundColor: Colors.white, @@ -152,7 +151,8 @@ class _CardListPageState extends State with RouteAware { "fingerprintItemData": fingerprintItemData, }); if (data != null) { - logic.getICCardListData(); + logic.pageNo = 1; + getHttpData(); } }), ); @@ -167,9 +167,9 @@ class _CardListPageState extends State with RouteAware { ) : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 190.h - 64.h)); } - void showIosTipViewDialog(BuildContext context) { + void showIosTipViewDialog(FingerprintItemData fingerprintItemData) { showDialog( - context: context, + context: Get.context!, builder: (BuildContext context) { return ShowIosTipView( title: "提示", @@ -179,6 +179,8 @@ class _CardListPageState extends State with RouteAware { state.isDeletCardData = true; state.isDeletAll = false; state.deletUserID = (await Storage.getUid())!; + state.deletKeyID = fingerprintItemData.cardId.toString(); + state.deletCardNo = int.parse(fingerprintItemData.cardNumber!); logic.senderAddICCard(); }, cancelClick: () { @@ -235,16 +237,18 @@ class _CardListPageState extends State with RouteAware { ], ), SizedBox(height: 5.h), - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text(showTime, + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Flexible( + child: Text(showTime, + maxLines: 1, + overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 18.sp, color: AppColors.placeholderTextColor)), - ], - ), + ), + ], ), SizedBox(width: 20.h), ], diff --git a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_logic.dart b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_logic.dart index a759dad3..9d495544 100644 --- a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_logic.dart +++ b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_logic.dart @@ -64,6 +64,9 @@ class OtherTypeKeyChangeDateLogic extends BaseGetXController{ isCoerced: state.fingerprintItemData.value.isCoerced == 1 ? "2" : "1", cardName: state.fingerprintItemData.value.cardName!, changeType: '1', + startTime: 0, + endTime: 0, + cardType: 0, ); if(entity.errorCode!.codeIsSuccessful){ showToast("修改成功"); @@ -71,6 +74,7 @@ class OtherTypeKeyChangeDateLogic extends BaseGetXController{ "beginTimeTimestamp":state.beginTimeTimestamp.value, "endTimeTimestamp":state.endTimeTimestamp.value, }); + eventBus.fire(OtherTypeRefreshListEvent()); } } } \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart index bbbce875..37794197 100644 --- a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart +++ b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_page.dart @@ -76,7 +76,7 @@ class _OtherTypeKeyChangeDatePageState Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) { setState(() { - state.beginTime.value = "${p.year}.${p.month.toString().padLeft(2, '0')}.${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; + state.beginTime.value = "${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; state.beginTimeTimestamp.value = DateTime.parse(state.beginTime.value).millisecondsSinceEpoch; }); }); @@ -89,7 +89,7 @@ class _OtherTypeKeyChangeDatePageState Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) { setState(() { - state.endTime.value = "${p.year}.${p.month.toString().padLeft(2, '0')}.${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; + state.endTime.value = "${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; state.endTimeTimestamp.value = DateTime.parse(state.endTime.value).millisecondsSinceEpoch; }); }); diff --git a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_state.dart b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_state.dart index 1dc7721c..44a5953c 100644 --- a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_state.dart +++ b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeDate/otherTypeKeyChangeDate_state.dart @@ -15,12 +15,28 @@ class OtherTypeKeyChangeDateState{ OtherTypeKeyChangeDateState() { Map map = Get.arguments; + if(map["pushType"] != null){ + fingerprintItemData.value = map["fingerprintItemData"]; + } pushType.value = map["pushType"]; - fingerprintItemData.value = map["fingerprintItemData"]; + if(map["fingerprintItemData"] != null){ + fingerprintItemData.value = map["fingerprintItemData"]; + } - beginTime.value = DateTool().dateToYMDHNString(fingerprintItemData.value.startDate.toString()); - endTime.value = DateTool().dateToYMDHNString(fingerprintItemData.value.endDate.toString()); - beginTimeTimestamp.value = fingerprintItemData.value.startDate!; - endTimeTimestamp.value = fingerprintItemData.value.endDate!; + if(fingerprintItemData.value.startDate == 0 && fingerprintItemData.value.endDate == 0){ + // getStartDate = "${formatDate(DateTime.now(), [yyyy,'-',mm,'-', dd, ' ', HH,])}:00"; //生效时间 + // // state.selectEffectiveDate.value = getStartDate; + // state.itemData.value.startDate = DateTime.parse(getStartDate).millisecondsSinceEpoch; + + beginTime.value = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()); + endTime.value = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()); + beginTimeTimestamp.value = DateTime.now().millisecondsSinceEpoch; + endTimeTimestamp.value = DateTime.now().millisecondsSinceEpoch; + }else{ + beginTime.value = DateTool().dateToYMDHNString(fingerprintItemData.value.startDate.toString()); + endTime.value = DateTool().dateToYMDHNString(fingerprintItemData.value.endDate.toString()); + beginTimeTimestamp.value = fingerprintItemData.value.startDate!; + endTimeTimestamp.value = fingerprintItemData.value.endDate!; + } } } \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_logic.dart b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_logic.dart index 101ae3a6..025ff513 100644 --- a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_logic.dart +++ b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_logic.dart @@ -43,6 +43,9 @@ class OtherTypeKeyChangeValidityDateLogic extends BaseGetXController{ isCoerced: state.fingerprintItemData.value.isCoerced == 1 ? "2" : "1", cardName: state.fingerprintItemData.value.cardName!, changeType: '1', + startTime: 0, + endTime: 0, + cardType: 0, ); if(entity.errorCode!.codeIsSuccessful){ showToast("修改成功"); diff --git a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart index 54155847..5e943309 100644 --- a/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart +++ b/star_lock/lib/main/lockDetail/card/otherTypeKeyChangeValidityDate/otherTypeKeyChangeValidityDate_page.dart @@ -31,7 +31,7 @@ class _OtherTypeKeyChangeValidityDatePageState return Scaffold( backgroundColor: AppColors.mainBackgroundColor, appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.normallyOpenMode!.tr, + barTitle: "修改有效期", haveBack: true, backgroundColor: AppColors.mainColor), body: ListView( @@ -175,7 +175,7 @@ class _OtherTypeKeyChangeValidityDatePageState '${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour!.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}') .millisecondsSinceEpoch; state.beginTime.value = - "${p.year}.${p.month.toString().padLeft(2, '0')}.${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; + "${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; }); }); })), @@ -192,7 +192,7 @@ class _OtherTypeKeyChangeValidityDatePageState '${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour!.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}') .millisecondsSinceEpoch; state.endTime.value = - "${p.year}.${p.month.toString().padLeft(2, '0')}.${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; + "${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}"; }); }); })), diff --git a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart index 50d2553e..7a9a4e01 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart @@ -163,9 +163,14 @@ class _ElectronicKeyDetailPageState extends State { state.beginTimeTimestamp.value = data["beginTimeTimestamp"]; state.endTimeTimestamp.value = data["endTimeTimestamp"]; state.beginTime.value = DateTool() - .dateToYMDHNString(state.beginTimeTimestamp.value.toString()); + .dateToYMDHNString((state.beginTimeTimestamp.value*1000).toString()); state.endTime.value = DateTool() - .dateToYMDHNString(state.endTimeTimestamp.value.toString()); + .dateToYMDHNString((state.endTimeTimestamp.value*1000).toString()); + // print("state.beginTime.value:${state.beginTime.value}" + // "state.endTime.value:${state.endTime.value}" + // "state.beginTimeTimestamp.value:${state.beginTimeTimestamp.value}" + // "state.endTimeTimestamp.value:${state.endTimeTimestamp.value}"); + setState(() {}); } }); } diff --git a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart index 360d7244..a8d2f845 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart @@ -11,33 +11,26 @@ class ElectronicKeyDetailChangeDateLogic extends BaseGetXController { final ElectronicKeyDetailChangeDateState state = ElectronicKeyDetailChangeDateState(); - //更新密码请求 - Future updatePwdRequest() async { - PasswordKeyEntity entity = await ApiRepository.to.updatePasswordKey( - lockId: state.itemData.value.lockId!, - keyboardPwdId: state.pwdId.value.toString(), - keyboardPwdName: state.inputNameController.text, - newKeyboardPwd: state.inputPwdController.text, - startDate: state.effectiveDateTime.millisecondsSinceEpoch, - endDate: state.failureDateTime.millisecondsSinceEpoch, - changeType: state.changeType.value, - hoursStart: state.hoursStart.value, - hoursEnd: state.hoursEnd.value, - isCoerced: state.isCoerced.value); - if (entity.errorCode!.codeIsSuccessful) { - showToast("修改成功", something: () { - eventBus.fire(ElectronicKeyListRefreshUI()); - eventBus.fire(AuthorizedAdminPageRefreshUI()); - Get.back(); - }); - } - } - //编辑电子钥匙有效期请求 Future updateKeyDateRequest() async { - var beginTimeTimestamp = - state.effectiveDateTime.millisecondsSinceEpoch ~/ 1000; - var endTimeTimestamp = state.failureDateTime.millisecondsSinceEpoch ~/ 1000; + // var beginTimeTimestamp = + // state.effectiveDateTime.millisecondsSinceEpoch ~/ 1000; + // var endTimeTimestamp = state.failureDateTime.millisecondsSinceEpoch ~/ 1000; + // if (beginTimeTimestamp > endTimeTimestamp || + // beginTimeTimestamp == endTimeTimestamp) { + // showToast("失效时间需大于生效时间"); + // return; + // } + // + // if (endTimeTimestamp < DateTime.now().millisecondsSinceEpoch ~/ 1000) { + // showToast("生效时间需大于当前时间"); + // return; + // } + + // print("state.itemData.value.startDate!:${state.itemData.value.startDate!}"); + // print("state.itemData.value.endDate!:${state.itemData.value.endDate!}"); + var beginTimeTimestamp = state.itemData.value.startDate! ~/ 1000; + var endTimeTimestamp = state.itemData.value.endDate! ~/ 1000; if (beginTimeTimestamp > endTimeTimestamp || beginTimeTimestamp == endTimeTimestamp) { showToast("失效时间需大于生效时间"); @@ -48,11 +41,12 @@ class ElectronicKeyDetailChangeDateLogic extends BaseGetXController { showToast("生效时间需大于当前时间"); return; } + KeyOperationRecordEntity entity = await ApiRepository.to.updateKeyDate( state.itemData.value.keyId.toString(), state.itemData.value.lockId.toString(), - state.failureDateTime.millisecondsSinceEpoch.toString(), - state.effectiveDateTime.millisecondsSinceEpoch.toString(), + state.itemData.value.endDate!.toString(), + state.itemData.value.startDate!.toString(), state.weekDays.value, state.itemData.value.keyType! == 1 ? 2 : state.itemData.value.keyType!); if (entity.errorCode!.codeIsSuccessful) { diff --git a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart index c3dc9cab..56a9dcfe 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart @@ -1,3 +1,4 @@ +import 'package:date_format/date_format.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -40,14 +41,7 @@ class _ElectronicKeyDetailChangeDateState style: TextStyle(color: Colors.white, fontSize: 24.sp), ), onPressed: () { - if (state.fromType.value == "1") { - } else { - if (state.lockId.value != 0 && state.pwdId.value.isNotEmpty) { - logic.updatePwdRequest(); - } else { - logic.updateKeyDateRequest(); - } - } + logic.updateKeyDateRequest(); }, ), ], @@ -57,51 +51,76 @@ class _ElectronicKeyDetailChangeDateState } Widget buildMainUI() { - // String getStartDate = ""; - // String getEndDate = ""; - // if (state.itemData.value.startDate != null) { - // DateTime startDateStr = - // DateTime.fromMillisecondsSinceEpoch(state.itemData.value.startDate!); - // getStartDate = startDateStr.toLocal().toString().substring(0, 16); - // } - // - // if (state.itemData.value.endDate != null) { - // DateTime endDateStr = - // DateTime.fromMillisecondsSinceEpoch(state.itemData.value.endDate!); - // getEndDate = endDateStr.toLocal().toString().substring(0, 16); - // } + String getStartDate = ""; + String getEndDate = ""; + if (state.itemData.value.startDate != 0) { + DateTime startDateStr = + DateTime.fromMillisecondsSinceEpoch(state.itemData.value.startDate!); + getStartDate = startDateStr.toLocal().toString().substring(0, 16); + }else{ + // DateTime startDateStr = + // DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch); + // getStartDate = startDateStr.toLocal().toString().substring(0, 16); + + getStartDate = "${formatDate(DateTime.now(), [yyyy,'-',mm,'-', dd, ' ', HH,])}:00"; //生效时间 + // state.selectEffectiveDate.value = getStartDate; + state.itemData.value.startDate = DateTime.parse(getStartDate).millisecondsSinceEpoch; + // print("state.selectEffectiveDate.value:${state.selectEffectiveDate.value}"); + } + + if (state.itemData.value.endDate != 0) { + DateTime endDateStr = + DateTime.fromMillisecondsSinceEpoch(state.itemData.value.endDate!); + getEndDate = endDateStr.toLocal().toString().substring(0, 16); + }else{ + // DateTime endDateStr = + // DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch); + // getEndDate = endDateStr.toLocal().toString().substring(0, 16); + + getEndDate = "${formatDate(DateTime.now(), [yyyy, '-', mm, '-', dd, ' ', HH,])}:00"; //失效时间 + state.itemData.value.endDate = DateTime.parse(getEndDate).millisecondsSinceEpoch; + // print("state.selectFailureDate.value:${state.selectFailureDate.value}"); + } + return Column( children: [ Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr, - rightTitle: state.selectEffectiveDate.value, + rightTitle: state.selectEffectiveDate.value.isNotEmpty + ? state.selectEffectiveDate.value + : getStartDate, isHaveLine: true, isHaveDirection: true, action: () { Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) { - state.effectiveDateTime = XSDateUtils.parseDateTime( - '${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}', - 'yyyy-MM-dd HH:mm'); - state.selectEffectiveDate.value = XSDateUtils.formatDateTime( - state.effectiveDateTime, 'yyyy-MM-dd HH:mm'); + state.selectEffectiveDate.value = + '${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}'; + // state.effectiveDateTime = DateTime.parse(state.selectEffectiveDate.value); + state.itemData.value.startDate = DateTime.parse(state.selectEffectiveDate.value).millisecondsSinceEpoch; }); })), Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.failureTime!.tr, - rightTitle: state.selectFailureDate.value, + rightTitle: state.selectFailureDate.value.isNotEmpty + ? state.selectFailureDate.value + : getEndDate, isHaveDirection: true, action: () { Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) { - state.failureDateTime = XSDateUtils.parseDateTime( - '${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}', - 'yyyy-MM-dd HH:mm'); - state.selectFailureDate.value = XSDateUtils.formatDateTime( - state.failureDateTime, 'yyyy-MM-dd HH:mm'); + state.selectFailureDate.value = + '${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}'; + // state.failureDateTime = DateTime.parse(state.selectFailureDate.value); + state.itemData.value.endDate = DateTime.parse(state.selectFailureDate.value).millisecondsSinceEpoch; //更新结束时间 }); })), ], ); } + + String intToStr(int v) { + return (v < 10) ? "0$v" : "$v"; + } + } diff --git a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart index 960a6961..e7c134dc 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart @@ -15,11 +15,11 @@ class ElectronicKeyDetailChangeDateState { final hoursEnd = 0.obs; final pwdId = ''.obs; final lockId = 0.obs; - final fromType = ''.obs; + // final fromType = ''.obs; final selectEffectiveDate = ''.obs; //生效时间 final selectFailureDate = ''.obs; //失效时间 - DateTime effectiveDateTime = DateTime.now(); - DateTime failureDateTime = DateTime.now(); + // DateTime effectiveDateTime = DateTime.now(); + // DateTime failureDateTime = DateTime.now(); final weekDays = [].obs; ElectronicKeyDetailChangeDateState() { @@ -38,8 +38,8 @@ class ElectronicKeyDetailChangeDateState { if ((map["lockId"] != null)) { lockId.value = map["lockId"]; } - if ((map["fromType"] != null)) { - fromType.value = map["fromType"]; - } + // if ((map["fromType"] != null)) { + // fromType.value = map["fromType"]; + // } } } diff --git a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart index 73e0e881..3a2b5d61 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart @@ -31,7 +31,6 @@ class SendElectronicKeyPage extends StatefulWidget { class _SendElectronicKeyPageState extends State { final logic = Get.put(SendElectronicKeyLogic()); final state = Get.find().state; - bool isDemoMode = true; @override initState() { @@ -41,7 +40,7 @@ class _SendElectronicKeyPageState extends State { } Future getDemoMode() async { - isDemoMode = (await Storage.getBool(ifIsDemoModeOrNot))!; + state.isDemoMode = (await Storage.getBool(ifIsDemoModeOrNot))!; } @override @@ -49,7 +48,7 @@ class _SendElectronicKeyPageState extends State { state.type.value = widget.type; return SingleChildScrollView( - child: isDemoMode ? indexChangeWidget() : Obx(() => indexChangeWidget()), + child: state.isDemoMode ? indexChangeWidget() : Obx(() => indexChangeWidget()), ); } @@ -269,7 +268,7 @@ class _SendElectronicKeyPageState extends State { SubmitBtn( btnName: TranslationLoader.lanKeys!.send!.tr, onClick: () { - if (isDemoMode == false) { + if (state.isDemoMode == false) { // DateTime startDateTime = DateTime( // state.effectiveDateTime.value.year, // state.effectiveDateTime.value.month, @@ -313,7 +312,7 @@ class _SendElectronicKeyPageState extends State { TextButton( onPressed: () { // 获取是否是演示模式 演示模式不获取接口 - if (isDemoMode == false) { + if (state.isDemoMode == false) { Navigator.pushNamed( context, Routers.massSendElectronicKeyManagePage); } else { @@ -520,7 +519,7 @@ class _SendElectronicKeyPageState extends State { // 远程开锁 Widget remoteUnlockingWidget() { return Visibility( - visible: isDemoMode + visible: state.isDemoMode ? false : (state.keyInfo.value.lockSetting!.remoteUnlock == 1 ? true : false), child: Column( diff --git a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart index 238890ae..d2a0cd48 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart @@ -36,6 +36,7 @@ class SendElectronicKeyState { var weekdaysList = [].obs; var isCreateUser = false.obs; //用户未注册时传1 已注册传0 + var isDemoMode = false; final sendSucceedType = 0.obs; final timeLimitTips = '接收者在有效期内可以不限次数使用'; //限时 diff --git a/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart b/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart index 9db2d8ed..91defe23 100644 --- a/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart +++ b/star_lock/lib/main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart @@ -93,6 +93,7 @@ class _FingerprintDetailPageState extends State with Rout }else if(state.keyType.value == 4){ // 循环 var data = await Get.toNamed(Routers.otherTypeKeyChangeValidityDatePage, arguments: { + "pushType": 1, "fingerprintItemData": state.fingerprintItemData.value, }); if(data != null) { @@ -114,6 +115,7 @@ class _FingerprintDetailPageState extends State with Rout action: () async { // 当是指纹的时候 var data = await Get.toNamed(Routers.otherTypeKeyChangeValidityDatePage, arguments: { + "pushType": 1, "fingerprintItemData": state.fingerprintItemData.value, }); if(data != null) { diff --git a/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart b/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart index 6d004520..0a8d44cc 100644 --- a/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart +++ b/star_lock/lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart @@ -245,16 +245,18 @@ class _FingerprintListPageState extends State with RouteAwa ], ), SizedBox(height: 5.h), - Container( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text(showTime, + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Flexible( + child: Text(showTime, + maxLines: 1, + overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 18.sp, color: AppColors.placeholderTextColor)), - ], - ), + ), + ], ), SizedBox(width: 20.h), ], diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 5013efe9..765de6a7 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -29,12 +29,11 @@ class LockDetailLogic extends BaseGetXController { final LockDetailState state = LockDetailState(); // 监听设备返回的数据 - late StreamSubscription _replySubscription; - void _initReplySubscription() { - _replySubscription = - EventBusManager().eventBus!.on().listen((reply) async { + void initReplySubscription() { + state.replySubscription = EventBusManager().eventBus!.on().listen((reply) async { + Get.log("锁详情收到了蓝牙解析消息 reply:${reply.commandType}"); // 开门 - if (reply is OpenDoorReply) { + if (reply is OpenDoorReply && state.ifCurrentScreen.value == true) { _replyOpenLock(reply); } @@ -63,12 +62,12 @@ class LockDetailLogic extends BaseGetXController { // 开门数据解析 Future _replyOpenLock(Reply reply) async { int status = reply.data[6]; - print("replyOpenLock status:$status"); + Get.log("replyOpenLock status:$status"); switch (status) { case 0x00: //成功 - print("${reply.commandType}数据解析成功"); + Get.log("${reply.commandType}数据解析成功"); // _showFullScreenOverlay(Get.context!); state.iSClosedUnlockSuccessfulPopup.value = true; @@ -98,7 +97,7 @@ class LockDetailLogic extends BaseGetXController { break; case 0x06: //无权限 - print("${reply.commandType}需要鉴权"); + Get.log("${reply.commandType}需要鉴权"); var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); @@ -109,7 +108,7 @@ class LockDetailLogic extends BaseGetXController { var tokenData = reply.data.sublist(2, 6); var saveStrList = changeIntListToStringList(tokenData); Storage.setStringList(saveBlueToken, saveStrList); - print("openDoorToken:$tokenData"); + Get.log("openDoorToken:$tokenData"); IoSenderManage.senderOpenLock( keyID: BlueManage().connectDeviceName, @@ -243,7 +242,7 @@ class LockDetailLogic extends BaseGetXController { switch (status) { case 0x00: //成功 - print("${reply.commandType}数据解析成功"); + Get.log("${reply.commandType}数据解析成功"); if (reply.data[5] > 0) { reply.data.removeRange(0, 6); // 把得到的数据按8位分割成数组 然后塞进一个新的数组里面 @@ -277,22 +276,22 @@ class LockDetailLogic extends BaseGetXController { break; case 0x06: //无权限 - print("${reply.commandType}需要鉴权"); + Get.log("${reply.commandType}需要鉴权"); break; case 0x07: //无权限 - print("${reply.commandType}用户无权限"); + Get.log("${reply.commandType}用户无权限"); break; case 0x09: // 权限校验错误 - print("${reply.commandType}权限校验错误"); + Get.log("${reply.commandType}权限校验错误"); break; default: //失败 - print("${reply.commandType}失败"); + Get.log("${reply.commandType}失败"); break; } @@ -330,7 +329,7 @@ class LockDetailLogic extends BaseGetXController { break; case 0x06: //无权限 - print("需要鉴权"); + Get.log("需要鉴权"); var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); @@ -355,17 +354,17 @@ class LockDetailLogic extends BaseGetXController { break; case 0x07: //无权限 - print("用户无权限"); + Get.log("用户无权限"); break; case 0x09: // 权限校验错误 - print("添加用户权限校验错误"); + Get.log("添加用户权限校验错误"); break; default: //失败 - print("领锁失败"); + Get.log("领锁失败"); break; } @@ -393,7 +392,7 @@ class LockDetailLogic extends BaseGetXController { if (token != null) { getTokenList = changeStringListToIntList(token); } - print( + Get.log( "BlueManage().connectDeviceName:${BlueManage().connectDeviceName} authUserID:${state.senderUserId.toString()} keyID:${state.keyInfos.value.keyId.toString()} userID:${await Storage.getUid()}"); IoSenderManage.senderAddUser( lockID: BlueManage().connectDeviceName, @@ -638,7 +637,7 @@ class LockDetailLogic extends BaseGetXController { .getLockNetToken(lockId: state.keyInfos.value.lockId.toString()); if (entity.errorCode!.codeIsSuccessful) { state.lockNetToken = entity.data!.token!; - print("state.lockNetToken:${state.lockNetToken}"); + Get.log("state.lockNetToken:${state.lockNetToken}"); openDoorAction(1); } } @@ -693,11 +692,9 @@ class LockDetailLogic extends BaseGetXController { // } /// 锁设置里面开启关闭考勤刷新锁详情 - StreamSubscription? - _lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent; - void _initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() { + void initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent = eventBus.on().listen((event) { + state.lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent = eventBus.on().listen((event) { if (event.type == 0) { // 0考勤 state.isAttendance.value = int.parse(event.setResult); @@ -707,7 +704,7 @@ class LockDetailLogic extends BaseGetXController { state.isOpenLockNeedOnline.value = int.parse(event.setResult); state.keyInfos.value.lockSetting!.appUnlockOnline = int.parse(event.setResult); - print("state.isOpenLockNeedOnline.value:${state.isOpenLockNeedOnline.value}"); + Get.log("state.isOpenLockNeedOnline.value:${state.isOpenLockNeedOnline.value}"); } else if (event.type == 2) { // 2 常开模式 state.isOpenPassageMode.value = int.parse(event.setResult); @@ -720,6 +717,9 @@ class LockDetailLogic extends BaseGetXController { // 4 更新了电量 state.electricQuantity.value = int.parse(event.setResult); state.keyInfos.value.electricQuantity = int.parse(event.setResult); + } else if (event.type == 5) { + // 5 远程开锁 + state.keyInfos.value.lockSetting!.remoteUnlock = int.parse(event.setResult); } eventBus.fire(RefreshLockDetailInfoDataEvent()); }); @@ -862,9 +862,9 @@ class LockDetailLogic extends BaseGetXController { super.onReady(); openBlueSet(); - - _initReplySubscription(); - _initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction(); + Get.log("LockDetailPage onReady"); + // _initReplySubscription(); + // _initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction(); // _scanListDiscoveredDeviceSubscriptionAction(); } @@ -872,6 +872,7 @@ class LockDetailLogic extends BaseGetXController { void onInit() { // TODO: implement onInit super.onInit(); + Get.log("LockDetailPage onInit"); // 进来获取锁状态 // connectBlue(); @@ -880,9 +881,9 @@ class LockDetailLogic extends BaseGetXController { @override void onClose() { // TODO: implement onClose + super.onClose(); + Get.log("LockDetailPage onClose"); - _replySubscription.cancel(); - _lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent!.cancel(); // _scanListDiscoveredDeviceSubscription.cancel(); } diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index 888ac3db..6c3b6b93 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -53,6 +53,8 @@ class _LockDetailPageState extends State with TickerProviderStat }); _initRefreshLockDetailInfoDataEventAction(); + logic.initReplySubscription(); + logic.initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction(); } @override @@ -936,6 +938,8 @@ class _LockDetailPageState extends State with TickerProviderStat AppRouteObserver().routeObserver.unsubscribe(this); state.closedUnlockSuccessfulTimer?.cancel(); _lockRefreshLockDetailInfoDataEvent?.cancel(); + state.replySubscription.cancel(); + state.lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent!.cancel(); if (state.animationController != null) { state.animationController!.dispose(); diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart index 9acdd804..be2989f4 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '../../../blue/io_reply.dart'; import '../../lockMian/entity/lockListInfo_entity.dart'; // enum RKConnectState { @@ -17,6 +18,9 @@ import '../../lockMian/entity/lockListInfo_entity.dart'; class LockDetailState { Rx keyInfos = LockListInfoItemEntity().obs; + late StreamSubscription replySubscription; + StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent; + String lockNetToken = ""; var lockUserNo = 0; var senderUserId = 0; diff --git a/star_lock/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart b/star_lock/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart index 3050d41a..c14c9223 100644 --- a/star_lock/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart +++ b/star_lock/lib/main/lockDetail/lockSet/remoteUnlocking/remoteUnlocking_logic.dart @@ -30,6 +30,8 @@ class RemoteUnlockingLogic extends BaseGetXController{ state.lockSetInfoData.value.lockSettingInfo!.remoteUnlock = state.remoteEnable.value; print("state.remoteEnable.value:${state.remoteEnable.value} state.getKeyInfosData.value.remoteEnable:${state.lockSetInfoData.value.lockSettingInfo!.remoteUnlock}"); eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value)); + eventBus.fire(RefreshLockListInfoDataEvent()); + eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(5, state.lockSetInfoData.value.lockSettingInfo!.remoteUnlock!.toString())); }); } } diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart index 74095356..fcdb554f 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_logic.dart @@ -6,7 +6,7 @@ import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/eventBusEventManage.dart'; class PasswordKeyDetailLogic extends BaseGetXController { - final PasswordKeyDetailState state = PasswordKeyDetailState(); + PasswordKeyDetailState state = PasswordKeyDetailState(); //删除密码请求 deleteType:1-蓝牙 2-网关 Future deletePwdRequest() async { @@ -15,8 +15,9 @@ class PasswordKeyDetailLogic extends BaseGetXController { state.itemData.value.keyboardPwdId.toString(), 1); if (entity.errorCode!.codeIsSuccessful) { - showToast("删除成功"); - Get.back(); + showToast("删除成功", something: (){ + Get.back(); + }); } } @@ -32,19 +33,21 @@ class PasswordKeyDetailLogic extends BaseGetXController { changeType: state.changeType.value, hoursStart: state.itemData.value.hoursStart!, hoursEnd: state.itemData.value.hoursEnd!, - isCoerced: state.itemData.value.isCoerced!.toString()); + isCoerced: state.itemData.value.isCoerced!.toString(), + keyboardPwdType: state.itemData.value.keyboardPwdType!); if (entity.errorCode!.codeIsSuccessful) { - showToast("修改成功"); - if(changType == 1){ - // 修改名字 - state.keyboardPwdName.value = state.inputNameController.text; - }else if(changType == 2){ - // 修改密码 - state.keyboardPwd.value = state.inputPwdController.text; - } - print("state.itemData.value.keyboardPwd:${state.itemData.value.keyboardPwd} state.itemData.value.keyboardPwdName:${state.itemData.value.keyboardPwdName}"); Get.back(); - eventBus.fire(GetPasswordListRefreshUI()); + showToast("修改成功", something: (){ + if(changType == 1){ + // 修改名字 + state.keyboardPwdName.value = state.inputNameController.text; + }else if(changType == 2){ + // 修改密码 + state.keyboardPwd.value = state.inputPwdController.text; + } + print("state.itemData.value.keyboardPwd:${state.itemData.value.keyboardPwd} state.itemData.value.keyboardPwdName:${state.itemData.value.keyboardPwdName}"); + eventBus.fire(GetPasswordListRefreshUI()); + }); } } diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart index cf5dabd8..3ad74b39 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart @@ -74,23 +74,30 @@ class _PasswordKeyDetailPageState extends State { showCupertinoAlertDialog( context, state.inputNameController); })), - CommonItem( + Obx(() => CommonItem( leftTitel: "有效期", rightTitle: logic.getUseDateStr(), isHaveDirection: ((state.itemData.value.keyboardPwdType! > 3 && state.itemData.value.keyboardPwdType! < 15) || state.itemData.value.keyboardPwdType! == 1) ? false : true, allHeight: - state.itemData.value.keyboardPwdType == 3 ? 90.h : 65.h, - action: () { + state.itemData.value.keyboardPwdType == 3 ? 90.h : 65.h, + action: () async { if ((state.itemData.value.keyboardPwdType! > 3 && state.itemData.value.keyboardPwdType! < 15 ) || state.itemData.value.keyboardPwdType! == 1) { return; } - Get.toNamed(Routers.passwordKeyDetailChangeDatePage, - arguments: { - 'itemData': state.itemData.value, - }); - }), + var backData = await Get.toNamed(Routers.passwordKeyDetailChangeDatePage, arguments: { + 'itemData': state.itemData.value, + }); + if (backData != null) { + print("backData:$backData beginTimeTimestamp:${backData["beginTimeTimestamp"]} endTimeTimestamp:${backData["endTimeTimestamp"]}"); + state.itemData.value.startDate = int.parse(backData["beginTimeTimestamp"])*1000; + state.itemData.value.endDate = int.parse(backData["endTimeTimestamp"])*1000; + // 改了日期之后,永久只能改限时的 + state.itemData.value.keyboardPwdType = 3; + setState(() {}); + } + })), Container(height: 10.h), CommonItem( leftTitel: TranslationLoader.lanKeys!.sender!.tr, @@ -213,16 +220,21 @@ class _PasswordKeyDetailPageState extends State { title: inputController == state.inputNameController ? "${TranslationLoader.lanKeys!.amend!.tr}${TranslationLoader.lanKeys!.name!.tr}" : "${TranslationLoader.lanKeys!.amend!.tr}${TranslationLoader.lanKeys!.password!.tr}", - tipTitle: inputController.text.isNotEmpty ? inputController.text : "请输入", + tipTitle: inputController.text.isNotEmpty ? inputController.text : "请输入6-9位密码", controller: inputController, keyboardType: inputController == state.inputNameController ? TextInputType.text : TextInputType.number, sureClick: () { //发送编辑钥匙名称请求 - if (inputController.text.isNotEmpty) { - logic.updatePwdRequest(inputController == state.inputNameController ? 1 : 2); + if(inputController == state.inputPwdController){ + if (inputController.text.isEmpty || inputController.text.length < 6 || inputController.text.length > 9) { + logic.showToast("请输入6-9位密码"); + return; + } } + + logic.updatePwdRequest(inputController == state.inputNameController ? 1 : 2); }, cancelClick: () { Navigator.pop(context); diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart index 6dd252b5..a268610d 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_logic.dart @@ -7,9 +7,25 @@ import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../tools/eventBusEventManage.dart'; class PasswordKeyDetailChangeDateLogic extends BaseGetXController { - final PasswordKeyDetailChangeDateState state = PasswordKeyDetailChangeDateState(); + PasswordKeyDetailChangeDateState state = PasswordKeyDetailChangeDateState(); + //更新密码请求 Future updatePwdRequest() async { + // print("state.itemData.value.startDate!:${state.itemData.value.startDate!}"); + // print("state.itemData.value.endDate!:${state.itemData.value.endDate!}"); + var beginTimeTimestamp = state.itemData.value.startDate! ~/ 1000; + var endTimeTimestamp = state.itemData.value.endDate! ~/ 1000; + if (beginTimeTimestamp > endTimeTimestamp || + beginTimeTimestamp == endTimeTimestamp) { + showToast("失效时间需大于生效时间"); + return; + } + + if (endTimeTimestamp < DateTime.now().millisecondsSinceEpoch ~/ 1000) { + showToast("生效时间需大于当前时间"); + return; + } + PasswordKeyEntity entity = await ApiRepository.to.updatePasswordKey( lockId: state.itemData.value.lockId!, keyboardPwdId: state.itemData.value.keyboardPwdId.toString(), @@ -20,11 +36,15 @@ class PasswordKeyDetailChangeDateLogic extends BaseGetXController { changeType: '1', hoursStart: state.itemData.value.hoursStart!, hoursEnd: state.itemData.value.hoursEnd!, - isCoerced: "1"); + isCoerced: "1", + keyboardPwdType: 3); if (entity.errorCode!.codeIsSuccessful) { showToast("修改成功", something: (){ eventBus.fire(GetPasswordListRefreshUI()); - Get.back(); + Get.back(result: { + "beginTimeTimestamp": beginTimeTimestamp.toString(), + "endTimeTimestamp": endTimeTimestamp.toString(), + }); }); } } diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart index dd3d335a..020b92cb 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyDetailChangeDate/passwordKeyDetailChangeDate_page.dart @@ -1,3 +1,4 @@ +import 'package:date_format/date_format.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; @@ -53,16 +54,33 @@ class _PasswordKeyDetailChangeDatePage Widget buildMainUI() { String getStartDate = ""; String getEndDate = ""; - if (state.itemData.value.startDate != null) { + if (state.itemData.value.startDate != 0) { DateTime startDateStr = DateTime.fromMillisecondsSinceEpoch(state.itemData.value.startDate!); getStartDate = startDateStr.toLocal().toString().substring(0, 16); + }else{ + // DateTime startDateStr = + // DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch); + // getStartDate = startDateStr.toLocal().toString().substring(0, 16); + + getStartDate = "${formatDate(DateTime.now(), [yyyy,'-',mm,'-', dd, ' ', HH,])}:00"; //生效时间 + // state.selectEffectiveDate.value = getStartDate; + state.itemData.value.startDate = DateTime.parse(getStartDate).millisecondsSinceEpoch; + // print("state.selectEffectiveDate.value:${state.selectEffectiveDate.value}"); } - if (state.itemData.value.endDate != null) { + if (state.itemData.value.endDate != 0) { DateTime endDateStr = DateTime.fromMillisecondsSinceEpoch(state.itemData.value.endDate!); getEndDate = endDateStr.toLocal().toString().substring(0, 16); + }else{ + // DateTime endDateStr = + // DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch); + // getEndDate = endDateStr.toLocal().toString().substring(0, 16); + + getEndDate = "${formatDate(DateTime.now(), [yyyy, '-', mm, '-', dd, ' ', HH,])}:00"; //失效时间 + state.itemData.value.endDate = DateTime.parse(getEndDate).millisecondsSinceEpoch; + // print("state.selectFailureDate.value:${state.selectFailureDate.value}"); } return Column( diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart index 1b73dff5..e3d82d98 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_logic.dart @@ -90,7 +90,7 @@ class PasswordKeyListLogic extends BaseGetXController { case 5: //周未循环 5 在周未开始和结束时间指定时间段内有效 useDateStr = - '${sendDateStr.toLocal().toString().substring(0, 16)} 周末$starHour:00-$endHour:00 循环'; + '${startDateStr.toLocal().toString().substring(0, 16)} 周末$starHour:00-$endHour:00 循环'; break; case 6: //每日循环 6 每天开始和结束时间指定时间段内有效 diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart index 1beec62b..194b5770 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart @@ -221,18 +221,22 @@ class _PasswordKeyListPageState extends State { ), SizedBox(width: 10.w), passwordKeyListItem.keyboardPwdStatus == 2 ? Text('已过期', style: TextStyle(color: Colors.red, fontSize: 20.sp),) : Container(), - SizedBox(width: 15.w) + // SizedBox(width: 15.w) ], ), SizedBox(height: 5.h), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Text( - useDateStr, - style: TextStyle( - fontSize: 18.sp, - color: AppColors.placeholderTextColor), + Flexible( + child: Text( + useDateStr, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 18.sp, + color: AppColors.placeholderTextColor), + ), ), ], ), diff --git a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart index 720e3d93..df3fb9d1 100644 --- a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -141,7 +141,7 @@ class SaveLockLogic extends BaseGetXController { keyID: "1", userID: await Storage.getUid(), pwdNo: 254, - pwd: "123456", + pwd: state.adminPasswordTF.text, useCountLimit: 0xff, startTime: 0x11223344, endTime: 0x11223344, diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 22175c64..2e90cac0 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -440,7 +440,8 @@ class ApiProvider extends BaseProvider { String changeType, String isCoerced, int hoursStart, - int hoursEnd) => + int hoursEnd, + int keyboardPwdType) => post( updatePasswordKeyURL.toUrl, jsonEncode({ @@ -453,7 +454,8 @@ class ApiProvider extends BaseProvider { 'changeType': changeType, 'isCoerced': isCoerced, 'hoursStart': hoursStart, - 'hoursEnd': hoursEnd + 'hoursEnd': hoursEnd, + "keyboardPwdType": keyboardPwdType })); Future clearOperationRecord(String lockId) => @@ -1172,7 +1174,10 @@ class ApiProvider extends BaseProvider { String endDate, String isCoerced, List weekDay, - String changeType) => + String changeType, + int startTime, + int endTime, + int cardType,) => post( editICCardURL.toUrl, jsonEncode({ @@ -1183,7 +1188,10 @@ class ApiProvider extends BaseProvider { 'endDate': endDate, 'isCoerced': isCoerced, 'weekDay': weekDay, - 'changeType': changeType + 'changeType': changeType, + 'startTime': startTime, + 'endTime': endTime, + 'cardType': cardType })); // 删除卡 diff --git a/star_lock/lib/network/api_provider_base.dart b/star_lock/lib/network/api_provider_base.dart index 668add51..688fa545 100644 --- a/star_lock/lib/network/api_provider_base.dart +++ b/star_lock/lib/network/api_provider_base.dart @@ -57,7 +57,7 @@ class BaseProvider extends GetConnect with Api { statusText: res.statusText, ); } else {} - // print('得到的数据======>${res.bodyString}'); + print('得到的数据======>${res.bodyString}'); getDataResult(res.body); return res; } diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 09d2f251..cb19a028 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -435,7 +435,8 @@ class ApiRepository { required String changeType, required String isCoerced, required int hoursStart, - required int hoursEnd}) async { + required int hoursEnd, + required int keyboardPwdType}) async { final res = await apiProvider.updateKeyboardPwd( lockId, keyboardPwdId, @@ -446,7 +447,8 @@ class ApiRepository { changeType, isCoerced, hoursStart, - hoursEnd); + hoursEnd, + keyboardPwdType); return PasswordKeyEntity.fromJson(res.body); } @@ -1314,9 +1316,12 @@ class ApiRepository { required String endDate, required String isCoerced, required List weekDay, - required String changeType}) async { + required String changeType, + required int startTime, + required int endTime, + required int cardType,}) async { final res = await apiProvider.editICCardData(lockId, cardId, cardName, - startDate, endDate, isCoerced, weekDay, changeType); + startDate, endDate, isCoerced, weekDay, changeType, startTime, endTime, cardType); return LoginEntity.fromJson(res.body); } diff --git a/star_lock/lib/tools/eventBusEventManage.dart b/star_lock/lib/tools/eventBusEventManage.dart index 12848c59..da944c40 100644 --- a/star_lock/lib/tools/eventBusEventManage.dart +++ b/star_lock/lib/tools/eventBusEventManage.dart @@ -50,7 +50,7 @@ class LockGroupEditGroupLockRefreshEvent { /// 锁设置里面开启关闭刷新锁详情 class LockSetChangeSetRefreshLockDetailWithType { - int type; // 0 考勤 1开锁时是否需联网 2常开模式 3修改了锁名字 4修改了电量 + int type; // 0 考勤 1开锁时是否需联网 2常开模式 3修改了锁名字 4修改了电量 5远程开锁 String setResult; LockSetChangeSetRefreshLockDetailWithType(this.type, this.setResult); }