diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index ad990535..9a30d5fd 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -9,6 +9,7 @@ "remoteControl":"RemoteControl", "face":"face", "operatingRecord":"Operating Record", + "doorLockLog":"Door lock log", "number":"Number", "additive":"Additive", "addTime":"Add Time", diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 8dbabe4d..0fd01e10 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -9,6 +9,7 @@ "remoteControl":"remoteControl", "face":"face", "operatingRecord":"operatingRecord", + "doorLockLog":"doorLockLog", "number":"number", "additive":"additive", "addTime":"addTime", diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index dee2a389..abddb75e 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -9,6 +9,7 @@ "remoteControl":"遥控", "face":"人脸", "operatingRecord":"操作记录", + "doorLockLog":"门锁日志", "number":"号", "additive":"添加者", "addTime":"添加时间", diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index f4b0beb6..0cecc553 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -1,6 +1,7 @@ import 'package:get/get.dart'; import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart'; import 'package:star_lock/login/register/starLock_register_binding.dart'; +import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart'; @@ -408,6 +409,7 @@ abstract class Routers { static const passwordKeyDetailChangeDatePage = '/passwordKeyDetailChangeDatePage'; //密码更改时间 static const realTimePicturePage = '/realTimePicturePage'; //实时监控画面 + static const doorLockLogPage = '/doorLockLogPage'; //门锁日志 } abstract class AppRouters { @@ -993,6 +995,7 @@ abstract class AppRouters { page: () => const PasswordKeyDetailChangeDatePage()), GetPage( name: Routers.realTimePicturePage, - page: () => const RealTimePicturePage()) + page: () => const RealTimePicturePage()), + GetPage(name: Routers.doorLockLogPage, page: () => const DoorLockLogPage()) ]; } diff --git a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart new file mode 100644 index 00000000..6ce5fb16 --- /dev/null +++ b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart @@ -0,0 +1,280 @@ +import 'dart:async'; + +import 'package:flutter_easyloading/flutter_easyloading.dart'; +import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; +import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_state.dart'; +import 'package:star_lock/main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart'; +import 'package:star_lock/tools/toast.dart'; + +import '../../../blue/blue_manage.dart'; +import '../../../blue/io_protocol/io_referEventRecordTime.dart'; +import '../../../blue/io_reply.dart'; +import '../../../blue/io_tool/io_tool.dart'; +import '../../../blue/io_tool/manager_event_bus.dart'; +import '../../../blue/sender_manage.dart'; +import '../../../network/api_repository.dart'; +import '../../../tools/baseGetXController.dart'; +import '../../../tools/storage.dart'; +import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; + +class DoorLockLogLogic extends BaseGetXController { + DoorLockLogState state = DoorLockLogState(); + + // 获取解析后的数据 + late StreamSubscription _replySubscription; + void _initReplySubscription() { + _replySubscription = + EventBusManager().eventBus!.on().listen((reply) { + // if(reply is SenderReferEventRecordNumberReply) { + // _replyReferEventRecordNumber(reply); + // } + + if (reply is SenderReferEventRecordTimeReply) { + _replyReferEventRecordTime(reply); + } + }); + } + + // 根据数量查解析数据 + // Future _replyReferEventRecordNumber(Reply reply) async { + // int status = reply.data[2]; + // switch(status){ + // case 0x00: + // //成功 + // print("${reply.commandType}数据解析成功"); + // // _getLockStatus(); + // break; + // case 0x06: + // //无权限 + // print("${reply.commandType}需要鉴权"); + // + // break; + // case 0x07: + // //无权限 + // print("${reply.commandType}用户无权限"); + // + // break; + // case 0x09: + // // 权限校验错误 + // print("${reply.commandType}权限校验错误"); + // + // break; + // default: + // //失败 + // print("${reply.commandType}失败"); + // + // break; + // } + // } + + // 根据时间查解析数据 + 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); + print("getList:$getList"); + var uploadList = []; + for (int i = 0; i < getList.length; i++) { + var indexList = getList[i]; + print("indexList:$indexList"); + var indexMap = {}; + indexMap["seq"] = indexList[0].toString(); + indexMap["user"] = indexList[3].toString(); + indexMap["pwd"] = indexList[2].toString(); + indexMap["success"] = "1"; + indexMap["type"] = indexList[1].toString(); + + int value = ((0xff & indexList[(4)]) << 24 | + (0xff & indexList[5]) << 16 | + (0xff & indexList[6]) << 8 | + (0xFF & indexList[7])); + // indexMap["date"] = DateTool().dateToYMDHNSString("$value"); + // print("value:${DateTool().dateToYMDHNSString("$value")}"); + + indexMap["date"] = "${value * 1000}"; + uploadList.add(indexMap); + } + lockRecordUploadData(uploadList); + // print("reply.data:${reply.data} getList:$getList}"); + } + break; + case 0x06: + //无权限 + print("${reply.commandType}需要鉴权"); + + break; + case 0x07: + //无权限 + print("${reply.commandType}用户无权限"); + + break; + case 0x09: + // 权限校验错误 + print("${reply.commandType}权限校验错误"); + + break; + default: + //失败 + print("${reply.commandType}失败"); + + break; + } + } + + // 查询事件记录(页数查询) + // Future senderReferEventRecordNumber() async { + // BlueManage().bludSendData(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async { + // if (state == DeviceConnectionState.connected) { + // var privateKey = await Storage.getStringList(saveBluePrivateKey); + // List getPrivateKeyList = changeStringListToIntList(privateKey!); + // + // var token = await Storage.getStringList(saveBlueToken); + // List getTokenList = changeStringListToIntList(token!); + // + // var publicKey = await Storage.getStringList(saveBluePublicKey); + // List getPublicKeyList = changeStringListToIntList(publicKey!); + // + // IoSenderManage.senderReferEventRecordNumberCommand( + // keyID:BlueManage().connectDeviceName, + // userID:await Storage.getUid(), + // logsCount:20, + // logsNo:1, + // token:getTokenList, + // needAuthor:1, + // publicKey:getPublicKeyList, + // privateKey:getPrivateKeyList, + // ); + // } + // }); + // } + + // 查询事件记录(时间查询) + Future senderReferEventRecordTime(int time) async { + BlueManage().bludSendData(BlueManage().connectDeviceName, + (DeviceConnectionState state) async { + if (state == DeviceConnectionState.connected) { + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var token = await Storage.getStringList(saveBlueToken); + List getTokenList = changeStringListToIntList(token!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List getPublicKeyList = changeStringListToIntList(publicKey!); + + EasyLoading.show(); + IoSenderManage.senderReferEventRecordTimeCommand( + keyID: BlueManage().connectDeviceName, + userID: await Storage.getUid(), + logsCount: 20, + // time:DateTime.now().millisecondsSinceEpoch~/1000, + time: time, + token: getTokenList, + needAuthor: 1, + publicKey: getPublicKeyList, + privateKey: getPrivateKeyList, + ); + } + }); + } + + //请求操作记录列表 + void mockNetworkDataRequest() async { + KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordList( + '', + "", + '0', + state.keyInfos.value.lockId.toString(), + '1', + '1', + '20', + '', + '', + '', + '', + '', + '', + ''); + 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! ~/ 1000); + } + } + + // 操作记录上传 + 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 + Future onReady() async { + // TODO: implement onReady + super.onReady(); + print("onReady()"); + + // 获取是否是演示模式 演示模式不获取接口 + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + _initReplySubscription(); + + mockNetworkDataRequest(); + } + } + + @override + Future onInit() async { + // TODO: implement onInit + super.onInit(); + print("onInit()"); + + // 获取是否是演示模式 演示模式不获取接口 + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + getLockRecordLastUploadDataTime(); + // senderReferEventRecordTime(); + // senderReferEventRecordNumber(); + } + } + + @override + Future onClose() async { + // TODO: implement onClose + super.onClose(); + + // 获取是否是演示模式 演示模式不获取接口 + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + _replySubscription.cancel(); + } + } +} diff --git a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart new file mode 100644 index 00000000..b978f8e0 --- /dev/null +++ b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_advanced_calendar/flutter_advanced_calendar.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_logic.dart'; +import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; + +import '../../../app_settings/app_colors.dart'; +import '../../../tools/custom_bottom_sheet.dart'; +import '../../../tools/noData.dart'; +import '../../../tools/storage.dart'; +import '../../../tools/titleAppBar.dart'; +import '../../../tools/toast.dart'; +import '../../../translations/trans_lib.dart'; + +class DoorLockLogPage extends StatefulWidget { + const DoorLockLogPage({Key? key}) : super(key: key); + + @override + State createState() => _DoorLockLogPageState(); +} + +class _DoorLockLogPageState extends State { + final logic = Get.put(DoorLockLogLogic()); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: TranslationLoader.lanKeys!.doorLockLog!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + IconButton( + icon: Image.asset( + 'images/icon_bar_more.png', + height: 30.h, + width: 10.w, + ), + onPressed: () async { + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + // JhPopMenus.showLinePop(context, clickCallback: (index, selText) { + // print('选中index: $index'); + // print('选中text: $selText'); + // if (index == 0) { + // logic.mockNetworkDataRequest(); + // } else if (index == 1) { + // logic.clearOperationRecordRequest(); + // } + // }, listData: [ + // {'text': '读取记录'}, + // {'text': '清空记录'}, + // {'text': '导出记录'}, + // ]); + + _openModalBottomSheet(); + } else { + // Get.toNamed(Routers.seletLockTypePage); + Toast.show(msg: "演示模式"); + } + }, + ), + ], + ), + body: SingleChildScrollView( + child: Column( + children: [ + AdvancedCalendar( + controller: state.calendarControllerCustom, + events: state.events, + weekLineHeight: 50.0.h, + startWeekDay: 1, + innerDot: true, + keepLineSize: true, + calendarTextStyle: TextStyle( + fontSize: 22.sp, + fontWeight: FontWeight.w500, + height: 1.3125, + letterSpacing: 0, + ), + headerStyle: TextStyle( + fontSize: 22.sp, + fontWeight: FontWeight.w500, + height: 1.3125, + letterSpacing: 0, + ), + ), + ], + ), + ), + ); + } + + String getTypeIcon(int type) { + String title = 'images/controls_user.png'; + switch (type) { + case 1: + // 蓝牙开锁 + title = 'images/controls_user.png'; + break; + case 4: + // 密码开锁 + title = 'images/icon_password.png'; + break; + case 7: + // ic卡 + title = 'images/icon_card.png'; + break; + case 8: + // 指纹开锁 + title = 'images/icon_fingerprint.png'; + break; + default: + break; + } + return title; + } + + Future _openModalBottomSheet() async { + showModalBottomSheet( + context: context, + shape: RoundedRectangleBorder( + borderRadius: BorderRadiusDirectional.circular(10)), + builder: (BuildContext context) { + return AlertBottomWidget( + topTitle: '', + items: const ['读取记录', '清空记录', '导出记录'], + chooseCallback: (value) { + int getSelectIndex = value; + if (getSelectIndex == 0) { + logic.mockNetworkDataRequest(); + } else if (getSelectIndex == 1) { + logic.clearOperationRecordRequest(); + } + }, + ); + }); + } +} diff --git a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart new file mode 100644 index 00000000..a2566e5b --- /dev/null +++ b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart @@ -0,0 +1,21 @@ +import 'package:flutter_advanced_calendar/flutter_advanced_calendar.dart'; +import 'package:get/get.dart'; + +import '../../lockMian/entity/lockListInfo_entity.dart'; +import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart'; + +class DoorLockLogState { + final keyInfos = LockListInfoItemEntity().obs; + final lockOperatingRecordListData = [].obs; + final calendarControllerToday = AdvancedCalendarController.today(); + final calendarControllerCustom = + AdvancedCalendarController(DateTime(2024, 01, 09)); + final events = [ + DateTime.now(), + DateTime(2024, 10, 10), + ]; + + DoorLockLogState() { + keyInfos.value = Get.arguments["keyInfo"]; + } +} diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index acd6f7d8..0ddc3ad4 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -92,7 +92,7 @@ class _LockDetailPageState extends State ), Obx(() => Visibility( visible: state.iSClosedUnlockSuccessfulPopup.value, - // visible: true, + // visible: true, child: GestureDetector( onTap: () { state.iSClosedUnlockSuccessfulPopup.value = false; @@ -434,7 +434,9 @@ class _LockDetailPageState extends State // 操作记录 bottomItem('images/main/icon_main_operatingRecord.png', TranslationLoader.lanKeys!.operatingRecord!.tr, () { - Get.toNamed(Routers.lockOperatingRecordPage, + // Get.toNamed(Routers.lockOperatingRecordPage, + // arguments: {"keyInfo": widget.lockListInfoItemEntity}); + Get.toNamed(Routers.doorLockLogPage, arguments: {"keyInfo": widget.lockListInfoItemEntity}); }), // 视频日志 @@ -561,12 +563,14 @@ class _LockDetailPageState extends State alignment: Alignment.center, children: [ Image.asset( - state.iSOpenLock.value == true ? 'images/main/unlocked_bg.png' : 'images/main/locked_bg.png', + state.iSOpenLock.value == true + ? 'images/main/unlocked_bg.png' + : 'images/main/locked_bg.png', width: 358.w, height: 348.h, ), Positioned( - top: (1.sh - ScreenUtil().statusBarHeight * 2)/ 2, + top: (1.sh - ScreenUtil().statusBarHeight * 2) / 2, child: Column( children: [ Text( diff --git a/star_lock/lib/translations/lanKeyEntity.dart b/star_lock/lib/translations/lanKeyEntity.dart index e54dff82..4ea4d5d2 100644 --- a/star_lock/lib/translations/lanKeyEntity.dart +++ b/star_lock/lib/translations/lanKeyEntity.dart @@ -1,457 +1,458 @@ class LanKeyEntity { - LanKeyEntity( - {this.starLock, - this.clickUnlockAndHoldDownClose, - this.checkingIn, - this.electronicKey, - this.password, - this.card, - this.fingerprint, - this.remoteControl, - this.face, - this.operatingRecord, - this.number, - this.additive, - this.addTime, - this.reset, - this.sendKey, - this.timeLimit, - this.permanent, - this.once, - this.circulation, - this.receiver, - this.pleaseEnterNumberOrEmail, - this.name, - this.enterYourName, - this.effectiveTime, - this.failureTime, - this.effectiveDate, - this.failureDate, - this.monday, - this.tuesday, - this.wednesday, - this.thursday, - this.friday, - this.saturday, - this.sunday, - this.mondayShort, - this.tuesdayShort, - this.wednesdayShort, - this.thursdayShort, - this.fridayShort, - this.saturdayShort, - this.sundayShort, - this.realNameAuthentication, - this.sendKeyBottomTip, - this.send, - this.periodValidity, - this.sendGroupKey, - this.lock, - this.pleaseAdd, - this.pleaseSelet, - this.remoteUnlockingAllowed, - this.pleaseEnter, - this.getPassword, - this.custom, - this.clearAll, - this.recursiveDevice, - this.pleaseNameYourPassword, - this.pleaseEnterDigitsNumber, - this.getPasswordTip1, - this.getPasswordTip2, - this.getPasswordTip3, - this.getPasswordTip4, - this.getPasswordTip5, - this.getPasswordTip6, - this.getTip, - this.addTip, - this.sender, - this.senderTime, - this.keyDetail, - this.detail, - this.delete, - this.passwordDetail, - this.share, - this.amend, - this.sure, - this.cancel, - this.add, - this.accountNumber, - this.volumeAuthorizationLock, - this.authorizedAdminTip, - this.lockOperatingRecordTip, - this.rankingList, - this.earlyArrivalList, - this.lateList, - this.hardWorkingList, - this.basicInformation, - this.wirelessKeyboard, - this.doorMagnetic, - this.remoteUnlocking, - this.automaticBlocking, - this.normallyOpenMode, - this.automaticUnLock, - this.automaticUnLockTip, - this.lockSound, - this.burglarAlarm, - this.resetButton, - this.lockTime, - this.diagnose, - this.uploadData, - this.importOtherLockData, - this.lockEscalation, - this.markedHouseState, - this.unlockReminder, - this.unlockQRCode, - this.lockNumber, - this.electricQuantity, - this.lockName, - this.lockGrouping, - this.selectGroup, - this.createNewGroup, - this.adminOpenLockPassword, - this.update, - this.updateElectricQuantityTip, - this.adminOpenLockPasswordTip, - this.updateLockAdminPassword, - this.whenScreenFlashesClickNext, - this.theScreenNeverFlickered, - this.enterNumberOrPressSet, - this.theLocationOfTheSetKeyWillBeDifferent, - this.pressAndHoldTheResetButtonTwoSeconds, - this.nearbyEquipment, - this.noData, - this.doorMagneticListTopTip, - this.remoteUnlockingPageTip, - this.currentMode, - this.delayTime, - this.automaticBlockingTip, - this.time, - this.normallyOpen, - this.date, - this.begin, - this.end, - this.allDay, - this.save, - this.normallyOpenModeTip, - this.pleaseSeletLockVolume, - this.lockSoundTip, - this.low, - this.lower, - this.medium, - this.high, - this.higher, - this.burglarAlarmTip, - this.resetButtonTip1, - this.resetButtonTip2, - this.calibrationTime, - this.setTheDSTMode, - this.diagnoseTip, - this.uploading, - this.uploadDataTip, - this.importOtherLockDataTip, - this.haveNewVersion, - this.currentVersion, - this.newVersion, - this.upgrade, - this.leisure, - this.checkedIn, - this.company, - this.staff, - this.work, - this.workday, - this.holidays, - this.punchingMode, - this.whetherTheEmployeeHasAKey, - this.selectKey, - this.officeHours, - this.closingTime, - this.thisWeek, - this.singleDayWeekend, - this.twoDaysOff, - this.oddOrEvenDaysOff, - this.year, - this.month, - this.libertyDay, - this.coverDate, - this.addedHoliday, - this.startDate, - this.accessDate, - this.mustFillIn, - this.endDate, - this.dailyCharts, - this.monthlyLeaderboard, - this.noAttendanceRecord, - this.everyoneIsVeryMotivated, - this.workingHoursWereNotReleased, - this.beLate, - this.leaveEarly, - this.noCardPunched, - this.holidayInfo, - this.lanEnglish, - this.lanChinese, - this.multilingual, - this.addLock, - this.lockAddress, - this.selectLockType, - this.videoIntercomDoorLock, - this.NFCPassiveLock, - this.addDevice, - this.gateway, - this.message, - this.supportStaff, - this.set, - this.moreServices, - this.moreSet, - this.prompTone, - this.touchUnlock, - this.pushNotification, - this.lockUserManagement, - this.ownedKey, - this.authorityManagement, - this.associatedDevice, - this.associatedName, - this.device, - this.authorizedAdmin, - this.addAuthorizedAdmin, - this.lockGroup, - this.transferSmartLock, - this.selectiveLock, - this.recipientInformation, - this.transferGateway, - this.multiLanguage, - this.lockScreen, - this.closed, - this.opened, - this.close, - this.open, - this.hideInvalidUnlockPermissions, - this.appUnlockRequiresMobilePhoneAccessToTheLock, - this.valueAddedServices, - this.about, - this.userAgreement, - this.privacyPolicy, - this.personalInformationCollectionList, - this.applicationPermissionDescription, - this.thirdPartyInformationSharingList, - this.logout, - this.deleteAccount, - this.personalInformation, - this.avatar, - this.nickName, - this.changeNickName, - this.modifyAccount, - this.resetPasswords, - this.safetyProblem, - this.modifyAccountTip, - this.pleaseEnterAccountNumber, - this.pleaseEnterNewAccountNumber, - this.changeIphoneTip, - this.changeEmailTip, - this.goBind, - this.originalPassword, - this.newPassword, - this.surePassword, - this.safetyProblemTip, - this.problemOne, - this.problemTwo, - this.problemThree, - this.pleaseEnterYourAnswer, - this.aboutToExpire, - this.deAuthorize, - this.changeName, - this.designation, - this.state, - this.wifiName, - this.networkMAC, - this.gatewayUpgrade, - this.gatewayConnectionLock, - this.strongSignal, - this.mediumSignal, - this.averageSignal, - this.weakSignal, - this.selectGatewayType, - this.addGateway, - this.turnThePowerBackOn, - this.indicatorLight, - this.seletGatewayTypeNextTip, - this.selectGateway, - this.gatewayConfigurationWifiTip, - this.wifiPassward, - this.pleaseEnterTheWiFiPassword, - this.gatewayName, - this.pleaseEnterGatewayName, - this.wifiMAC, - this.ipAddress, - this.subnetMask, - this.defaultGateway, - this.automaticallyGetTheDNSServerAddress, - this.preferredDNS, - this.alternativeDNS, - this.noStaticIPIsUsed, - this.allLock, - this.searchAllLockType, - this.doorLock, - this.padlock, - this.safeLock, - this.intelligentLockCore, - this.itelligentAccessControl, - this.parkingLock, - this.bicycleLock, - this.longRangeControl, - this.lightTouchScreen, - this.lightTouchScreenTip, - this.next, - this.nearbyLock, - this.addSuccessfullyPleaseRename, - this.whenAddingLockThePhoneMustBeNextToTheLock, - this.login, - this.register, - this.forgetPassword, - this.readAndAgree, - this.verificationCode, - this.registerPasswordTip, - this.iphone, - this.email, - this.mobileNumber, - this.countryAndRegion, - this.selet, - this.businessCooperation, - this.officialWebsite, - this.computerWebVersion, - this.hotelSystem, - this.manualWebVersion, - this.introduce, - this.note, - this.mail, - this.advancedFunction, - this.pushMessage, - this.recordsRetention, - this.smsBuyTip, - this.emailBuyTip, - this.currentRemainingQuantity, - this.buy, - this.customSMSTemplate, - this.customMailTemplate, - this.record, - this.buyRealNameTip, - this.buyRealNameSeletYouWantBuyTip, - this.forTheFirstTime, - this.onceDay, - this.weekOnce, - this.monthOnce, - this.currentState, - this.onTrial, - this.haveNotOpened, - this.advancedFeaturesAndBenefitsContent, - this.smsTemplate, - this.emailTemplate, - this.cardIssuingtool, - this.titleForBuyingAdvancedFeatures, - this.tipsForBuyingAdvancedFeatures, - this.freeTrial, - this.openNow, - this.buySMS, - this.buyMail, - this.buyRealNameAuthenticationTimes, - this.enablingAdvancedFeatures, - this.chooseAPackage, - this.modeOfPayment, - this.alipay, - this.goToPay, - this.customTemplatesTip, - this.haveOpened, - this.unHaveOpenedTip1, - this.unHaveOpenedTip2, - this.freeTrialKeywords, - this.goToTheOpen, - this.creatingANewTemplate, - this.type, - this.templateContent, - this.preview, - this.hello, - this.yourRoomIs, - this.roomName, - this.theCodeToOpenTheDoorIs, - this.templateTip1, - this.templateTip2, - this.templateTip3, - this.expectedNotoCount, - this.templateTip4, - this.and, - this.willBeReplacedWithTheActualValue, - this.downloadLink, - this.lockScreenTip, - this.hideInvalidUnlockPermissionsTip, - this.appUnlockRequiresMobilePhoneAccessToTheLockTip, - this.checkAll, - this.getVerificationCode, - this.configuringWiFi, - this.pleaseEnterWifiName, - this.wifiPwd, - this.pleaseEnterWifiPwd, - this.wifiDistributionNetwork, - this.attendanceRecord, - this.edit, - this.stressFingerprint, - this.effectiveDay, - this.whetherTheEmployeeHasPassword, - this.whetherTheEmployeeHasCard, - this.whetherTheEmployeeHasFingerprint, - this.seletPassword, - this.seletCard, - this.seletFingerprint, - this.getKey, - this.getCard, - this.getFingerprint, - this.safeVerify, - this.deleteAccountTips, - this.humanFace, - this.monitoring, - this.videoLog, - this.messageReminding, - this.superAdmin, - this.normalUser, - this.gatewayDevice, - this.illumination, - this.doorOpener, - this.faceUnlocks, - this.catEyeSet, - this.openingDirectionSet, - this.motorPowerSetting, - this.bluetoothBroadcast, - this.whetherInternetRequiredWhenUnlocking, - this.selectTheLockToJoinTheGroup, - this.lockTrCount, - this.xiaomiIOTPlatform, - this.connectBlueErrorTip, - this.pleaseEnterAGroupName, - this.hint, - this.areYouSureYouWantToDeleteIt, - this.faceUnlocksSet, - this.automaticBrighteningScreen, - this.sensingDistance, - this.sensingDistanceTip, - this.preventWrongOpening, - this.preventWrongOpeningTip, - this.remote, - this.closeRange, - this.addAndUseFaceWhenUnlocking, - this.addAndUseFaceWhenUnlockingTip, - this.second, - this.motorPowerSettingTip, - this.miniwatt, - this.miniwattTip, - this.highPower, - this.highPowerTip, - this.openingDirectionSetTip, - this.openLeft, - this.openRight, - this.judgmentMethod, - this.judgmentMethodContent, - this.stressPassword, - this.stressCard, - }); + LanKeyEntity({ + this.starLock, + this.clickUnlockAndHoldDownClose, + this.checkingIn, + this.electronicKey, + this.password, + this.card, + this.fingerprint, + this.remoteControl, + this.face, + this.operatingRecord, + this.doorLockLog, + this.number, + this.additive, + this.addTime, + this.reset, + this.sendKey, + this.timeLimit, + this.permanent, + this.once, + this.circulation, + this.receiver, + this.pleaseEnterNumberOrEmail, + this.name, + this.enterYourName, + this.effectiveTime, + this.failureTime, + this.effectiveDate, + this.failureDate, + this.monday, + this.tuesday, + this.wednesday, + this.thursday, + this.friday, + this.saturday, + this.sunday, + this.mondayShort, + this.tuesdayShort, + this.wednesdayShort, + this.thursdayShort, + this.fridayShort, + this.saturdayShort, + this.sundayShort, + this.realNameAuthentication, + this.sendKeyBottomTip, + this.send, + this.periodValidity, + this.sendGroupKey, + this.lock, + this.pleaseAdd, + this.pleaseSelet, + this.remoteUnlockingAllowed, + this.pleaseEnter, + this.getPassword, + this.custom, + this.clearAll, + this.recursiveDevice, + this.pleaseNameYourPassword, + this.pleaseEnterDigitsNumber, + this.getPasswordTip1, + this.getPasswordTip2, + this.getPasswordTip3, + this.getPasswordTip4, + this.getPasswordTip5, + this.getPasswordTip6, + this.getTip, + this.addTip, + this.sender, + this.senderTime, + this.keyDetail, + this.detail, + this.delete, + this.passwordDetail, + this.share, + this.amend, + this.sure, + this.cancel, + this.add, + this.accountNumber, + this.volumeAuthorizationLock, + this.authorizedAdminTip, + this.lockOperatingRecordTip, + this.rankingList, + this.earlyArrivalList, + this.lateList, + this.hardWorkingList, + this.basicInformation, + this.wirelessKeyboard, + this.doorMagnetic, + this.remoteUnlocking, + this.automaticBlocking, + this.normallyOpenMode, + this.automaticUnLock, + this.automaticUnLockTip, + this.lockSound, + this.burglarAlarm, + this.resetButton, + this.lockTime, + this.diagnose, + this.uploadData, + this.importOtherLockData, + this.lockEscalation, + this.markedHouseState, + this.unlockReminder, + this.unlockQRCode, + this.lockNumber, + this.electricQuantity, + this.lockName, + this.lockGrouping, + this.selectGroup, + this.createNewGroup, + this.adminOpenLockPassword, + this.update, + this.updateElectricQuantityTip, + this.adminOpenLockPasswordTip, + this.updateLockAdminPassword, + this.whenScreenFlashesClickNext, + this.theScreenNeverFlickered, + this.enterNumberOrPressSet, + this.theLocationOfTheSetKeyWillBeDifferent, + this.pressAndHoldTheResetButtonTwoSeconds, + this.nearbyEquipment, + this.noData, + this.doorMagneticListTopTip, + this.remoteUnlockingPageTip, + this.currentMode, + this.delayTime, + this.automaticBlockingTip, + this.time, + this.normallyOpen, + this.date, + this.begin, + this.end, + this.allDay, + this.save, + this.normallyOpenModeTip, + this.pleaseSeletLockVolume, + this.lockSoundTip, + this.low, + this.lower, + this.medium, + this.high, + this.higher, + this.burglarAlarmTip, + this.resetButtonTip1, + this.resetButtonTip2, + this.calibrationTime, + this.setTheDSTMode, + this.diagnoseTip, + this.uploading, + this.uploadDataTip, + this.importOtherLockDataTip, + this.haveNewVersion, + this.currentVersion, + this.newVersion, + this.upgrade, + this.leisure, + this.checkedIn, + this.company, + this.staff, + this.work, + this.workday, + this.holidays, + this.punchingMode, + this.whetherTheEmployeeHasAKey, + this.selectKey, + this.officeHours, + this.closingTime, + this.thisWeek, + this.singleDayWeekend, + this.twoDaysOff, + this.oddOrEvenDaysOff, + this.year, + this.month, + this.libertyDay, + this.coverDate, + this.addedHoliday, + this.startDate, + this.accessDate, + this.mustFillIn, + this.endDate, + this.dailyCharts, + this.monthlyLeaderboard, + this.noAttendanceRecord, + this.everyoneIsVeryMotivated, + this.workingHoursWereNotReleased, + this.beLate, + this.leaveEarly, + this.noCardPunched, + this.holidayInfo, + this.lanEnglish, + this.lanChinese, + this.multilingual, + this.addLock, + this.lockAddress, + this.selectLockType, + this.videoIntercomDoorLock, + this.NFCPassiveLock, + this.addDevice, + this.gateway, + this.message, + this.supportStaff, + this.set, + this.moreServices, + this.moreSet, + this.prompTone, + this.touchUnlock, + this.pushNotification, + this.lockUserManagement, + this.ownedKey, + this.authorityManagement, + this.associatedDevice, + this.associatedName, + this.device, + this.authorizedAdmin, + this.addAuthorizedAdmin, + this.lockGroup, + this.transferSmartLock, + this.selectiveLock, + this.recipientInformation, + this.transferGateway, + this.multiLanguage, + this.lockScreen, + this.closed, + this.opened, + this.close, + this.open, + this.hideInvalidUnlockPermissions, + this.appUnlockRequiresMobilePhoneAccessToTheLock, + this.valueAddedServices, + this.about, + this.userAgreement, + this.privacyPolicy, + this.personalInformationCollectionList, + this.applicationPermissionDescription, + this.thirdPartyInformationSharingList, + this.logout, + this.deleteAccount, + this.personalInformation, + this.avatar, + this.nickName, + this.changeNickName, + this.modifyAccount, + this.resetPasswords, + this.safetyProblem, + this.modifyAccountTip, + this.pleaseEnterAccountNumber, + this.pleaseEnterNewAccountNumber, + this.changeIphoneTip, + this.changeEmailTip, + this.goBind, + this.originalPassword, + this.newPassword, + this.surePassword, + this.safetyProblemTip, + this.problemOne, + this.problemTwo, + this.problemThree, + this.pleaseEnterYourAnswer, + this.aboutToExpire, + this.deAuthorize, + this.changeName, + this.designation, + this.state, + this.wifiName, + this.networkMAC, + this.gatewayUpgrade, + this.gatewayConnectionLock, + this.strongSignal, + this.mediumSignal, + this.averageSignal, + this.weakSignal, + this.selectGatewayType, + this.addGateway, + this.turnThePowerBackOn, + this.indicatorLight, + this.seletGatewayTypeNextTip, + this.selectGateway, + this.gatewayConfigurationWifiTip, + this.wifiPassward, + this.pleaseEnterTheWiFiPassword, + this.gatewayName, + this.pleaseEnterGatewayName, + this.wifiMAC, + this.ipAddress, + this.subnetMask, + this.defaultGateway, + this.automaticallyGetTheDNSServerAddress, + this.preferredDNS, + this.alternativeDNS, + this.noStaticIPIsUsed, + this.allLock, + this.searchAllLockType, + this.doorLock, + this.padlock, + this.safeLock, + this.intelligentLockCore, + this.itelligentAccessControl, + this.parkingLock, + this.bicycleLock, + this.longRangeControl, + this.lightTouchScreen, + this.lightTouchScreenTip, + this.next, + this.nearbyLock, + this.addSuccessfullyPleaseRename, + this.whenAddingLockThePhoneMustBeNextToTheLock, + this.login, + this.register, + this.forgetPassword, + this.readAndAgree, + this.verificationCode, + this.registerPasswordTip, + this.iphone, + this.email, + this.mobileNumber, + this.countryAndRegion, + this.selet, + this.businessCooperation, + this.officialWebsite, + this.computerWebVersion, + this.hotelSystem, + this.manualWebVersion, + this.introduce, + this.note, + this.mail, + this.advancedFunction, + this.pushMessage, + this.recordsRetention, + this.smsBuyTip, + this.emailBuyTip, + this.currentRemainingQuantity, + this.buy, + this.customSMSTemplate, + this.customMailTemplate, + this.record, + this.buyRealNameTip, + this.buyRealNameSeletYouWantBuyTip, + this.forTheFirstTime, + this.onceDay, + this.weekOnce, + this.monthOnce, + this.currentState, + this.onTrial, + this.haveNotOpened, + this.advancedFeaturesAndBenefitsContent, + this.smsTemplate, + this.emailTemplate, + this.cardIssuingtool, + this.titleForBuyingAdvancedFeatures, + this.tipsForBuyingAdvancedFeatures, + this.freeTrial, + this.openNow, + this.buySMS, + this.buyMail, + this.buyRealNameAuthenticationTimes, + this.enablingAdvancedFeatures, + this.chooseAPackage, + this.modeOfPayment, + this.alipay, + this.goToPay, + this.customTemplatesTip, + this.haveOpened, + this.unHaveOpenedTip1, + this.unHaveOpenedTip2, + this.freeTrialKeywords, + this.goToTheOpen, + this.creatingANewTemplate, + this.type, + this.templateContent, + this.preview, + this.hello, + this.yourRoomIs, + this.roomName, + this.theCodeToOpenTheDoorIs, + this.templateTip1, + this.templateTip2, + this.templateTip3, + this.expectedNotoCount, + this.templateTip4, + this.and, + this.willBeReplacedWithTheActualValue, + this.downloadLink, + this.lockScreenTip, + this.hideInvalidUnlockPermissionsTip, + this.appUnlockRequiresMobilePhoneAccessToTheLockTip, + this.checkAll, + this.getVerificationCode, + this.configuringWiFi, + this.pleaseEnterWifiName, + this.wifiPwd, + this.pleaseEnterWifiPwd, + this.wifiDistributionNetwork, + this.attendanceRecord, + this.edit, + this.stressFingerprint, + this.effectiveDay, + this.whetherTheEmployeeHasPassword, + this.whetherTheEmployeeHasCard, + this.whetherTheEmployeeHasFingerprint, + this.seletPassword, + this.seletCard, + this.seletFingerprint, + this.getKey, + this.getCard, + this.getFingerprint, + this.safeVerify, + this.deleteAccountTips, + this.humanFace, + this.monitoring, + this.videoLog, + this.messageReminding, + this.superAdmin, + this.normalUser, + this.gatewayDevice, + this.illumination, + this.doorOpener, + this.faceUnlocks, + this.catEyeSet, + this.openingDirectionSet, + this.motorPowerSetting, + this.bluetoothBroadcast, + this.whetherInternetRequiredWhenUnlocking, + this.selectTheLockToJoinTheGroup, + this.lockTrCount, + this.xiaomiIOTPlatform, + this.connectBlueErrorTip, + this.pleaseEnterAGroupName, + this.hint, + this.areYouSureYouWantToDeleteIt, + this.faceUnlocksSet, + this.automaticBrighteningScreen, + this.sensingDistance, + this.sensingDistanceTip, + this.preventWrongOpening, + this.preventWrongOpeningTip, + this.remote, + this.closeRange, + this.addAndUseFaceWhenUnlocking, + this.addAndUseFaceWhenUnlockingTip, + this.second, + this.motorPowerSettingTip, + this.miniwatt, + this.miniwattTip, + this.highPower, + this.highPowerTip, + this.openingDirectionSetTip, + this.openLeft, + this.openRight, + this.judgmentMethod, + this.judgmentMethodContent, + this.stressPassword, + this.stressCard, + }); LanKeyEntity.fromJson(dynamic json) { starLock = json['starLock']; @@ -464,6 +465,7 @@ class LanKeyEntity { remoteControl = json['remoteControl']; face = json['face']; operatingRecord = json['operatingRecord']; + doorLockLog = json['doorLockLog']; number = json['number']; additive = json['additive']; addTime = json['addTime']; @@ -905,7 +907,8 @@ class LanKeyEntity { openingDirectionSet = json['openingDirectionSet']; motorPowerSetting = json['motorPowerSetting']; bluetoothBroadcast = json['bluetoothBroadcast']; - whetherInternetRequiredWhenUnlocking = json['whetherInternetRequiredWhenUnlocking']; + whetherInternetRequiredWhenUnlocking = + json['whetherInternetRequiredWhenUnlocking']; selectTheLockToJoinTheGroup = json['selectTheLockToJoinTheGroup']; lockTrCount = json['lockTrCount']; xiaomiIOTPlatform = json['xiaomiIOTPlatform']; @@ -950,6 +953,7 @@ class LanKeyEntity { String? remoteControl; String? face; String? operatingRecord; + String? doorLockLog; String? number; String? additive; String? addTime; @@ -1426,6 +1430,7 @@ class LanKeyEntity { map['remoteControl'] = remoteControl; map['face'] = face; map['operatingRecord'] = operatingRecord; + map['doorLockLog'] = doorLockLog; map['number'] = number; map['additive'] = additive; map['addTime'] = addTime; @@ -1864,7 +1869,8 @@ class LanKeyEntity { map['openingDirectionSet'] = openingDirectionSet; map['motorPowerSetting'] = motorPowerSetting; map['bluetoothBroadcast'] = bluetoothBroadcast; - map['whetherInternetRequiredWhenUnlocking'] = whetherInternetRequiredWhenUnlocking; + map['whetherInternetRequiredWhenUnlocking'] = + whetherInternetRequiredWhenUnlocking; map['selectTheLockToJoinTheGroup'] = selectTheLockToJoinTheGroup; map['lockTrCount'] = lockTrCount; map['xiaomiIOTPlatform'] = xiaomiIOTPlatform; diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index 3d0aaea4..8de9c333 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -134,6 +134,8 @@ dependencies: flutter_voice_processor: ^1.1.0 #监听网络连接状态 connectivity_plus: ^5.0.2 + flutter_advanced_calendar: ^1.4.1 + dev_dependencies: flutter_test: sdk: flutter