1,新增门锁日志页面类(未完成)

This commit is contained in:
Daisy 2024-01-09 14:05:18 +08:00
parent b107e19f69
commit 8d3b11d548
10 changed files with 921 additions and 460 deletions

View File

@ -9,6 +9,7 @@
"remoteControl":"RemoteControl", "remoteControl":"RemoteControl",
"face":"face", "face":"face",
"operatingRecord":"Operating Record", "operatingRecord":"Operating Record",
"doorLockLog":"Door lock log",
"number":"Number", "number":"Number",
"additive":"Additive", "additive":"Additive",
"addTime":"Add Time", "addTime":"Add Time",

View File

@ -9,6 +9,7 @@
"remoteControl":"remoteControl", "remoteControl":"remoteControl",
"face":"face", "face":"face",
"operatingRecord":"operatingRecord", "operatingRecord":"operatingRecord",
"doorLockLog":"doorLockLog",
"number":"number", "number":"number",
"additive":"additive", "additive":"additive",
"addTime":"addTime", "addTime":"addTime",

View File

@ -9,6 +9,7 @@
"remoteControl":"遥控", "remoteControl":"遥控",
"face":"人脸", "face":"人脸",
"operatingRecord":"操作记录", "operatingRecord":"操作记录",
"doorLockLog":"门锁日志",
"number":"号", "number":"号",
"additive":"添加者", "additive":"添加者",
"addTime":"添加时间", "addTime":"添加时间",

View File

@ -1,6 +1,7 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart'; import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart';
import 'package:star_lock/login/register/starLock_register_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/lockUserList/lockUserList_page.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart';
@ -408,6 +409,7 @@ abstract class Routers {
static const passwordKeyDetailChangeDatePage = static const passwordKeyDetailChangeDatePage =
'/passwordKeyDetailChangeDatePage'; // '/passwordKeyDetailChangeDatePage'; //
static const realTimePicturePage = '/realTimePicturePage'; // static const realTimePicturePage = '/realTimePicturePage'; //
static const doorLockLogPage = '/doorLockLogPage'; //
} }
abstract class AppRouters { abstract class AppRouters {
@ -993,6 +995,7 @@ abstract class AppRouters {
page: () => const PasswordKeyDetailChangeDatePage()), page: () => const PasswordKeyDetailChangeDatePage()),
GetPage( GetPage(
name: Routers.realTimePicturePage, name: Routers.realTimePicturePage,
page: () => const RealTimePicturePage()) page: () => const RealTimePicturePage()),
GetPage(name: Routers.doorLockLogPage, page: () => const DoorLockLogPage())
]; ];
} }

View File

@ -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<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
// if(reply is SenderReferEventRecordNumberReply) {
// _replyReferEventRecordNumber(reply);
// }
if (reply is SenderReferEventRecordTimeReply) {
_replyReferEventRecordTime(reply);
}
});
}
//
// Future<void> _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<void> _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<void> senderReferEventRecordNumber() async {
// BlueManage().bludSendData(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async {
// if (state == DeviceConnectionState.connected) {
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var token = await Storage.getStringList(saveBlueToken);
// List<int> getTokenList = changeStringListToIntList(token!);
//
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> 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<void> senderReferEventRecordTime(int time) async {
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState state) async {
if (state == DeviceConnectionState.connected) {
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> 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<void> onReady() async {
// TODO: implement onReady
super.onReady();
print("onReady()");
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_initReplySubscription();
mockNetworkDataRequest();
}
}
@override
Future<void> onInit() async {
// TODO: implement onInit
super.onInit();
print("onInit()");
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
getLockRecordLastUploadDataTime();
// senderReferEventRecordTime();
// senderReferEventRecordNumber();
}
}
@override
Future<void> onClose() async {
// TODO: implement onClose
super.onClose();
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_replySubscription.cancel();
}
}
}

View File

@ -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<DoorLockLogPage> createState() => _DoorLockLogPageState();
}
class _DoorLockLogPageState extends State<DoorLockLogPage> {
final logic = Get.put(DoorLockLogLogic());
final state = Get.find<DoorLockLogLogic>().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();
}
},
);
});
}
}

View File

@ -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 = <KeyRecordDataItem>[].obs;
final calendarControllerToday = AdvancedCalendarController.today();
final calendarControllerCustom =
AdvancedCalendarController(DateTime(2024, 01, 09));
final events = <DateTime>[
DateTime.now(),
DateTime(2024, 10, 10),
];
DoorLockLogState() {
keyInfos.value = Get.arguments["keyInfo"];
}
}

View File

@ -92,7 +92,7 @@ class _LockDetailPageState extends State<LockDetailPage>
), ),
Obx(() => Visibility( Obx(() => Visibility(
visible: state.iSClosedUnlockSuccessfulPopup.value, visible: state.iSClosedUnlockSuccessfulPopup.value,
// visible: true, // visible: true,
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {
state.iSClosedUnlockSuccessfulPopup.value = false; state.iSClosedUnlockSuccessfulPopup.value = false;
@ -434,7 +434,9 @@ class _LockDetailPageState extends State<LockDetailPage>
// //
bottomItem('images/main/icon_main_operatingRecord.png', bottomItem('images/main/icon_main_operatingRecord.png',
TranslationLoader.lanKeys!.operatingRecord!.tr, () { TranslationLoader.lanKeys!.operatingRecord!.tr, () {
Get.toNamed(Routers.lockOperatingRecordPage, // Get.toNamed(Routers.lockOperatingRecordPage,
// arguments: {"keyInfo": widget.lockListInfoItemEntity});
Get.toNamed(Routers.doorLockLogPage,
arguments: {"keyInfo": widget.lockListInfoItemEntity}); arguments: {"keyInfo": widget.lockListInfoItemEntity});
}), }),
// //
@ -561,12 +563,14 @@ class _LockDetailPageState extends State<LockDetailPage>
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
Image.asset( 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, width: 358.w,
height: 348.h, height: 348.h,
), ),
Positioned( Positioned(
top: (1.sh - ScreenUtil().statusBarHeight * 2)/ 2, top: (1.sh - ScreenUtil().statusBarHeight * 2) / 2,
child: Column( child: Column(
children: [ children: [
Text( Text(

View File

@ -1,457 +1,458 @@
class LanKeyEntity { class LanKeyEntity {
LanKeyEntity( LanKeyEntity({
{this.starLock, this.starLock,
this.clickUnlockAndHoldDownClose, this.clickUnlockAndHoldDownClose,
this.checkingIn, this.checkingIn,
this.electronicKey, this.electronicKey,
this.password, this.password,
this.card, this.card,
this.fingerprint, this.fingerprint,
this.remoteControl, this.remoteControl,
this.face, this.face,
this.operatingRecord, this.operatingRecord,
this.number, this.doorLockLog,
this.additive, this.number,
this.addTime, this.additive,
this.reset, this.addTime,
this.sendKey, this.reset,
this.timeLimit, this.sendKey,
this.permanent, this.timeLimit,
this.once, this.permanent,
this.circulation, this.once,
this.receiver, this.circulation,
this.pleaseEnterNumberOrEmail, this.receiver,
this.name, this.pleaseEnterNumberOrEmail,
this.enterYourName, this.name,
this.effectiveTime, this.enterYourName,
this.failureTime, this.effectiveTime,
this.effectiveDate, this.failureTime,
this.failureDate, this.effectiveDate,
this.monday, this.failureDate,
this.tuesday, this.monday,
this.wednesday, this.tuesday,
this.thursday, this.wednesday,
this.friday, this.thursday,
this.saturday, this.friday,
this.sunday, this.saturday,
this.mondayShort, this.sunday,
this.tuesdayShort, this.mondayShort,
this.wednesdayShort, this.tuesdayShort,
this.thursdayShort, this.wednesdayShort,
this.fridayShort, this.thursdayShort,
this.saturdayShort, this.fridayShort,
this.sundayShort, this.saturdayShort,
this.realNameAuthentication, this.sundayShort,
this.sendKeyBottomTip, this.realNameAuthentication,
this.send, this.sendKeyBottomTip,
this.periodValidity, this.send,
this.sendGroupKey, this.periodValidity,
this.lock, this.sendGroupKey,
this.pleaseAdd, this.lock,
this.pleaseSelet, this.pleaseAdd,
this.remoteUnlockingAllowed, this.pleaseSelet,
this.pleaseEnter, this.remoteUnlockingAllowed,
this.getPassword, this.pleaseEnter,
this.custom, this.getPassword,
this.clearAll, this.custom,
this.recursiveDevice, this.clearAll,
this.pleaseNameYourPassword, this.recursiveDevice,
this.pleaseEnterDigitsNumber, this.pleaseNameYourPassword,
this.getPasswordTip1, this.pleaseEnterDigitsNumber,
this.getPasswordTip2, this.getPasswordTip1,
this.getPasswordTip3, this.getPasswordTip2,
this.getPasswordTip4, this.getPasswordTip3,
this.getPasswordTip5, this.getPasswordTip4,
this.getPasswordTip6, this.getPasswordTip5,
this.getTip, this.getPasswordTip6,
this.addTip, this.getTip,
this.sender, this.addTip,
this.senderTime, this.sender,
this.keyDetail, this.senderTime,
this.detail, this.keyDetail,
this.delete, this.detail,
this.passwordDetail, this.delete,
this.share, this.passwordDetail,
this.amend, this.share,
this.sure, this.amend,
this.cancel, this.sure,
this.add, this.cancel,
this.accountNumber, this.add,
this.volumeAuthorizationLock, this.accountNumber,
this.authorizedAdminTip, this.volumeAuthorizationLock,
this.lockOperatingRecordTip, this.authorizedAdminTip,
this.rankingList, this.lockOperatingRecordTip,
this.earlyArrivalList, this.rankingList,
this.lateList, this.earlyArrivalList,
this.hardWorkingList, this.lateList,
this.basicInformation, this.hardWorkingList,
this.wirelessKeyboard, this.basicInformation,
this.doorMagnetic, this.wirelessKeyboard,
this.remoteUnlocking, this.doorMagnetic,
this.automaticBlocking, this.remoteUnlocking,
this.normallyOpenMode, this.automaticBlocking,
this.automaticUnLock, this.normallyOpenMode,
this.automaticUnLockTip, this.automaticUnLock,
this.lockSound, this.automaticUnLockTip,
this.burglarAlarm, this.lockSound,
this.resetButton, this.burglarAlarm,
this.lockTime, this.resetButton,
this.diagnose, this.lockTime,
this.uploadData, this.diagnose,
this.importOtherLockData, this.uploadData,
this.lockEscalation, this.importOtherLockData,
this.markedHouseState, this.lockEscalation,
this.unlockReminder, this.markedHouseState,
this.unlockQRCode, this.unlockReminder,
this.lockNumber, this.unlockQRCode,
this.electricQuantity, this.lockNumber,
this.lockName, this.electricQuantity,
this.lockGrouping, this.lockName,
this.selectGroup, this.lockGrouping,
this.createNewGroup, this.selectGroup,
this.adminOpenLockPassword, this.createNewGroup,
this.update, this.adminOpenLockPassword,
this.updateElectricQuantityTip, this.update,
this.adminOpenLockPasswordTip, this.updateElectricQuantityTip,
this.updateLockAdminPassword, this.adminOpenLockPasswordTip,
this.whenScreenFlashesClickNext, this.updateLockAdminPassword,
this.theScreenNeverFlickered, this.whenScreenFlashesClickNext,
this.enterNumberOrPressSet, this.theScreenNeverFlickered,
this.theLocationOfTheSetKeyWillBeDifferent, this.enterNumberOrPressSet,
this.pressAndHoldTheResetButtonTwoSeconds, this.theLocationOfTheSetKeyWillBeDifferent,
this.nearbyEquipment, this.pressAndHoldTheResetButtonTwoSeconds,
this.noData, this.nearbyEquipment,
this.doorMagneticListTopTip, this.noData,
this.remoteUnlockingPageTip, this.doorMagneticListTopTip,
this.currentMode, this.remoteUnlockingPageTip,
this.delayTime, this.currentMode,
this.automaticBlockingTip, this.delayTime,
this.time, this.automaticBlockingTip,
this.normallyOpen, this.time,
this.date, this.normallyOpen,
this.begin, this.date,
this.end, this.begin,
this.allDay, this.end,
this.save, this.allDay,
this.normallyOpenModeTip, this.save,
this.pleaseSeletLockVolume, this.normallyOpenModeTip,
this.lockSoundTip, this.pleaseSeletLockVolume,
this.low, this.lockSoundTip,
this.lower, this.low,
this.medium, this.lower,
this.high, this.medium,
this.higher, this.high,
this.burglarAlarmTip, this.higher,
this.resetButtonTip1, this.burglarAlarmTip,
this.resetButtonTip2, this.resetButtonTip1,
this.calibrationTime, this.resetButtonTip2,
this.setTheDSTMode, this.calibrationTime,
this.diagnoseTip, this.setTheDSTMode,
this.uploading, this.diagnoseTip,
this.uploadDataTip, this.uploading,
this.importOtherLockDataTip, this.uploadDataTip,
this.haveNewVersion, this.importOtherLockDataTip,
this.currentVersion, this.haveNewVersion,
this.newVersion, this.currentVersion,
this.upgrade, this.newVersion,
this.leisure, this.upgrade,
this.checkedIn, this.leisure,
this.company, this.checkedIn,
this.staff, this.company,
this.work, this.staff,
this.workday, this.work,
this.holidays, this.workday,
this.punchingMode, this.holidays,
this.whetherTheEmployeeHasAKey, this.punchingMode,
this.selectKey, this.whetherTheEmployeeHasAKey,
this.officeHours, this.selectKey,
this.closingTime, this.officeHours,
this.thisWeek, this.closingTime,
this.singleDayWeekend, this.thisWeek,
this.twoDaysOff, this.singleDayWeekend,
this.oddOrEvenDaysOff, this.twoDaysOff,
this.year, this.oddOrEvenDaysOff,
this.month, this.year,
this.libertyDay, this.month,
this.coverDate, this.libertyDay,
this.addedHoliday, this.coverDate,
this.startDate, this.addedHoliday,
this.accessDate, this.startDate,
this.mustFillIn, this.accessDate,
this.endDate, this.mustFillIn,
this.dailyCharts, this.endDate,
this.monthlyLeaderboard, this.dailyCharts,
this.noAttendanceRecord, this.monthlyLeaderboard,
this.everyoneIsVeryMotivated, this.noAttendanceRecord,
this.workingHoursWereNotReleased, this.everyoneIsVeryMotivated,
this.beLate, this.workingHoursWereNotReleased,
this.leaveEarly, this.beLate,
this.noCardPunched, this.leaveEarly,
this.holidayInfo, this.noCardPunched,
this.lanEnglish, this.holidayInfo,
this.lanChinese, this.lanEnglish,
this.multilingual, this.lanChinese,
this.addLock, this.multilingual,
this.lockAddress, this.addLock,
this.selectLockType, this.lockAddress,
this.videoIntercomDoorLock, this.selectLockType,
this.NFCPassiveLock, this.videoIntercomDoorLock,
this.addDevice, this.NFCPassiveLock,
this.gateway, this.addDevice,
this.message, this.gateway,
this.supportStaff, this.message,
this.set, this.supportStaff,
this.moreServices, this.set,
this.moreSet, this.moreServices,
this.prompTone, this.moreSet,
this.touchUnlock, this.prompTone,
this.pushNotification, this.touchUnlock,
this.lockUserManagement, this.pushNotification,
this.ownedKey, this.lockUserManagement,
this.authorityManagement, this.ownedKey,
this.associatedDevice, this.authorityManagement,
this.associatedName, this.associatedDevice,
this.device, this.associatedName,
this.authorizedAdmin, this.device,
this.addAuthorizedAdmin, this.authorizedAdmin,
this.lockGroup, this.addAuthorizedAdmin,
this.transferSmartLock, this.lockGroup,
this.selectiveLock, this.transferSmartLock,
this.recipientInformation, this.selectiveLock,
this.transferGateway, this.recipientInformation,
this.multiLanguage, this.transferGateway,
this.lockScreen, this.multiLanguage,
this.closed, this.lockScreen,
this.opened, this.closed,
this.close, this.opened,
this.open, this.close,
this.hideInvalidUnlockPermissions, this.open,
this.appUnlockRequiresMobilePhoneAccessToTheLock, this.hideInvalidUnlockPermissions,
this.valueAddedServices, this.appUnlockRequiresMobilePhoneAccessToTheLock,
this.about, this.valueAddedServices,
this.userAgreement, this.about,
this.privacyPolicy, this.userAgreement,
this.personalInformationCollectionList, this.privacyPolicy,
this.applicationPermissionDescription, this.personalInformationCollectionList,
this.thirdPartyInformationSharingList, this.applicationPermissionDescription,
this.logout, this.thirdPartyInformationSharingList,
this.deleteAccount, this.logout,
this.personalInformation, this.deleteAccount,
this.avatar, this.personalInformation,
this.nickName, this.avatar,
this.changeNickName, this.nickName,
this.modifyAccount, this.changeNickName,
this.resetPasswords, this.modifyAccount,
this.safetyProblem, this.resetPasswords,
this.modifyAccountTip, this.safetyProblem,
this.pleaseEnterAccountNumber, this.modifyAccountTip,
this.pleaseEnterNewAccountNumber, this.pleaseEnterAccountNumber,
this.changeIphoneTip, this.pleaseEnterNewAccountNumber,
this.changeEmailTip, this.changeIphoneTip,
this.goBind, this.changeEmailTip,
this.originalPassword, this.goBind,
this.newPassword, this.originalPassword,
this.surePassword, this.newPassword,
this.safetyProblemTip, this.surePassword,
this.problemOne, this.safetyProblemTip,
this.problemTwo, this.problemOne,
this.problemThree, this.problemTwo,
this.pleaseEnterYourAnswer, this.problemThree,
this.aboutToExpire, this.pleaseEnterYourAnswer,
this.deAuthorize, this.aboutToExpire,
this.changeName, this.deAuthorize,
this.designation, this.changeName,
this.state, this.designation,
this.wifiName, this.state,
this.networkMAC, this.wifiName,
this.gatewayUpgrade, this.networkMAC,
this.gatewayConnectionLock, this.gatewayUpgrade,
this.strongSignal, this.gatewayConnectionLock,
this.mediumSignal, this.strongSignal,
this.averageSignal, this.mediumSignal,
this.weakSignal, this.averageSignal,
this.selectGatewayType, this.weakSignal,
this.addGateway, this.selectGatewayType,
this.turnThePowerBackOn, this.addGateway,
this.indicatorLight, this.turnThePowerBackOn,
this.seletGatewayTypeNextTip, this.indicatorLight,
this.selectGateway, this.seletGatewayTypeNextTip,
this.gatewayConfigurationWifiTip, this.selectGateway,
this.wifiPassward, this.gatewayConfigurationWifiTip,
this.pleaseEnterTheWiFiPassword, this.wifiPassward,
this.gatewayName, this.pleaseEnterTheWiFiPassword,
this.pleaseEnterGatewayName, this.gatewayName,
this.wifiMAC, this.pleaseEnterGatewayName,
this.ipAddress, this.wifiMAC,
this.subnetMask, this.ipAddress,
this.defaultGateway, this.subnetMask,
this.automaticallyGetTheDNSServerAddress, this.defaultGateway,
this.preferredDNS, this.automaticallyGetTheDNSServerAddress,
this.alternativeDNS, this.preferredDNS,
this.noStaticIPIsUsed, this.alternativeDNS,
this.allLock, this.noStaticIPIsUsed,
this.searchAllLockType, this.allLock,
this.doorLock, this.searchAllLockType,
this.padlock, this.doorLock,
this.safeLock, this.padlock,
this.intelligentLockCore, this.safeLock,
this.itelligentAccessControl, this.intelligentLockCore,
this.parkingLock, this.itelligentAccessControl,
this.bicycleLock, this.parkingLock,
this.longRangeControl, this.bicycleLock,
this.lightTouchScreen, this.longRangeControl,
this.lightTouchScreenTip, this.lightTouchScreen,
this.next, this.lightTouchScreenTip,
this.nearbyLock, this.next,
this.addSuccessfullyPleaseRename, this.nearbyLock,
this.whenAddingLockThePhoneMustBeNextToTheLock, this.addSuccessfullyPleaseRename,
this.login, this.whenAddingLockThePhoneMustBeNextToTheLock,
this.register, this.login,
this.forgetPassword, this.register,
this.readAndAgree, this.forgetPassword,
this.verificationCode, this.readAndAgree,
this.registerPasswordTip, this.verificationCode,
this.iphone, this.registerPasswordTip,
this.email, this.iphone,
this.mobileNumber, this.email,
this.countryAndRegion, this.mobileNumber,
this.selet, this.countryAndRegion,
this.businessCooperation, this.selet,
this.officialWebsite, this.businessCooperation,
this.computerWebVersion, this.officialWebsite,
this.hotelSystem, this.computerWebVersion,
this.manualWebVersion, this.hotelSystem,
this.introduce, this.manualWebVersion,
this.note, this.introduce,
this.mail, this.note,
this.advancedFunction, this.mail,
this.pushMessage, this.advancedFunction,
this.recordsRetention, this.pushMessage,
this.smsBuyTip, this.recordsRetention,
this.emailBuyTip, this.smsBuyTip,
this.currentRemainingQuantity, this.emailBuyTip,
this.buy, this.currentRemainingQuantity,
this.customSMSTemplate, this.buy,
this.customMailTemplate, this.customSMSTemplate,
this.record, this.customMailTemplate,
this.buyRealNameTip, this.record,
this.buyRealNameSeletYouWantBuyTip, this.buyRealNameTip,
this.forTheFirstTime, this.buyRealNameSeletYouWantBuyTip,
this.onceDay, this.forTheFirstTime,
this.weekOnce, this.onceDay,
this.monthOnce, this.weekOnce,
this.currentState, this.monthOnce,
this.onTrial, this.currentState,
this.haveNotOpened, this.onTrial,
this.advancedFeaturesAndBenefitsContent, this.haveNotOpened,
this.smsTemplate, this.advancedFeaturesAndBenefitsContent,
this.emailTemplate, this.smsTemplate,
this.cardIssuingtool, this.emailTemplate,
this.titleForBuyingAdvancedFeatures, this.cardIssuingtool,
this.tipsForBuyingAdvancedFeatures, this.titleForBuyingAdvancedFeatures,
this.freeTrial, this.tipsForBuyingAdvancedFeatures,
this.openNow, this.freeTrial,
this.buySMS, this.openNow,
this.buyMail, this.buySMS,
this.buyRealNameAuthenticationTimes, this.buyMail,
this.enablingAdvancedFeatures, this.buyRealNameAuthenticationTimes,
this.chooseAPackage, this.enablingAdvancedFeatures,
this.modeOfPayment, this.chooseAPackage,
this.alipay, this.modeOfPayment,
this.goToPay, this.alipay,
this.customTemplatesTip, this.goToPay,
this.haveOpened, this.customTemplatesTip,
this.unHaveOpenedTip1, this.haveOpened,
this.unHaveOpenedTip2, this.unHaveOpenedTip1,
this.freeTrialKeywords, this.unHaveOpenedTip2,
this.goToTheOpen, this.freeTrialKeywords,
this.creatingANewTemplate, this.goToTheOpen,
this.type, this.creatingANewTemplate,
this.templateContent, this.type,
this.preview, this.templateContent,
this.hello, this.preview,
this.yourRoomIs, this.hello,
this.roomName, this.yourRoomIs,
this.theCodeToOpenTheDoorIs, this.roomName,
this.templateTip1, this.theCodeToOpenTheDoorIs,
this.templateTip2, this.templateTip1,
this.templateTip3, this.templateTip2,
this.expectedNotoCount, this.templateTip3,
this.templateTip4, this.expectedNotoCount,
this.and, this.templateTip4,
this.willBeReplacedWithTheActualValue, this.and,
this.downloadLink, this.willBeReplacedWithTheActualValue,
this.lockScreenTip, this.downloadLink,
this.hideInvalidUnlockPermissionsTip, this.lockScreenTip,
this.appUnlockRequiresMobilePhoneAccessToTheLockTip, this.hideInvalidUnlockPermissionsTip,
this.checkAll, this.appUnlockRequiresMobilePhoneAccessToTheLockTip,
this.getVerificationCode, this.checkAll,
this.configuringWiFi, this.getVerificationCode,
this.pleaseEnterWifiName, this.configuringWiFi,
this.wifiPwd, this.pleaseEnterWifiName,
this.pleaseEnterWifiPwd, this.wifiPwd,
this.wifiDistributionNetwork, this.pleaseEnterWifiPwd,
this.attendanceRecord, this.wifiDistributionNetwork,
this.edit, this.attendanceRecord,
this.stressFingerprint, this.edit,
this.effectiveDay, this.stressFingerprint,
this.whetherTheEmployeeHasPassword, this.effectiveDay,
this.whetherTheEmployeeHasCard, this.whetherTheEmployeeHasPassword,
this.whetherTheEmployeeHasFingerprint, this.whetherTheEmployeeHasCard,
this.seletPassword, this.whetherTheEmployeeHasFingerprint,
this.seletCard, this.seletPassword,
this.seletFingerprint, this.seletCard,
this.getKey, this.seletFingerprint,
this.getCard, this.getKey,
this.getFingerprint, this.getCard,
this.safeVerify, this.getFingerprint,
this.deleteAccountTips, this.safeVerify,
this.humanFace, this.deleteAccountTips,
this.monitoring, this.humanFace,
this.videoLog, this.monitoring,
this.messageReminding, this.videoLog,
this.superAdmin, this.messageReminding,
this.normalUser, this.superAdmin,
this.gatewayDevice, this.normalUser,
this.illumination, this.gatewayDevice,
this.doorOpener, this.illumination,
this.faceUnlocks, this.doorOpener,
this.catEyeSet, this.faceUnlocks,
this.openingDirectionSet, this.catEyeSet,
this.motorPowerSetting, this.openingDirectionSet,
this.bluetoothBroadcast, this.motorPowerSetting,
this.whetherInternetRequiredWhenUnlocking, this.bluetoothBroadcast,
this.selectTheLockToJoinTheGroup, this.whetherInternetRequiredWhenUnlocking,
this.lockTrCount, this.selectTheLockToJoinTheGroup,
this.xiaomiIOTPlatform, this.lockTrCount,
this.connectBlueErrorTip, this.xiaomiIOTPlatform,
this.pleaseEnterAGroupName, this.connectBlueErrorTip,
this.hint, this.pleaseEnterAGroupName,
this.areYouSureYouWantToDeleteIt, this.hint,
this.faceUnlocksSet, this.areYouSureYouWantToDeleteIt,
this.automaticBrighteningScreen, this.faceUnlocksSet,
this.sensingDistance, this.automaticBrighteningScreen,
this.sensingDistanceTip, this.sensingDistance,
this.preventWrongOpening, this.sensingDistanceTip,
this.preventWrongOpeningTip, this.preventWrongOpening,
this.remote, this.preventWrongOpeningTip,
this.closeRange, this.remote,
this.addAndUseFaceWhenUnlocking, this.closeRange,
this.addAndUseFaceWhenUnlockingTip, this.addAndUseFaceWhenUnlocking,
this.second, this.addAndUseFaceWhenUnlockingTip,
this.motorPowerSettingTip, this.second,
this.miniwatt, this.motorPowerSettingTip,
this.miniwattTip, this.miniwatt,
this.highPower, this.miniwattTip,
this.highPowerTip, this.highPower,
this.openingDirectionSetTip, this.highPowerTip,
this.openLeft, this.openingDirectionSetTip,
this.openRight, this.openLeft,
this.judgmentMethod, this.openRight,
this.judgmentMethodContent, this.judgmentMethod,
this.stressPassword, this.judgmentMethodContent,
this.stressCard, this.stressPassword,
}); this.stressCard,
});
LanKeyEntity.fromJson(dynamic json) { LanKeyEntity.fromJson(dynamic json) {
starLock = json['starLock']; starLock = json['starLock'];
@ -464,6 +465,7 @@ class LanKeyEntity {
remoteControl = json['remoteControl']; remoteControl = json['remoteControl'];
face = json['face']; face = json['face'];
operatingRecord = json['operatingRecord']; operatingRecord = json['operatingRecord'];
doorLockLog = json['doorLockLog'];
number = json['number']; number = json['number'];
additive = json['additive']; additive = json['additive'];
addTime = json['addTime']; addTime = json['addTime'];
@ -905,7 +907,8 @@ class LanKeyEntity {
openingDirectionSet = json['openingDirectionSet']; openingDirectionSet = json['openingDirectionSet'];
motorPowerSetting = json['motorPowerSetting']; motorPowerSetting = json['motorPowerSetting'];
bluetoothBroadcast = json['bluetoothBroadcast']; bluetoothBroadcast = json['bluetoothBroadcast'];
whetherInternetRequiredWhenUnlocking = json['whetherInternetRequiredWhenUnlocking']; whetherInternetRequiredWhenUnlocking =
json['whetherInternetRequiredWhenUnlocking'];
selectTheLockToJoinTheGroup = json['selectTheLockToJoinTheGroup']; selectTheLockToJoinTheGroup = json['selectTheLockToJoinTheGroup'];
lockTrCount = json['lockTrCount']; lockTrCount = json['lockTrCount'];
xiaomiIOTPlatform = json['xiaomiIOTPlatform']; xiaomiIOTPlatform = json['xiaomiIOTPlatform'];
@ -950,6 +953,7 @@ class LanKeyEntity {
String? remoteControl; String? remoteControl;
String? face; String? face;
String? operatingRecord; String? operatingRecord;
String? doorLockLog;
String? number; String? number;
String? additive; String? additive;
String? addTime; String? addTime;
@ -1426,6 +1430,7 @@ class LanKeyEntity {
map['remoteControl'] = remoteControl; map['remoteControl'] = remoteControl;
map['face'] = face; map['face'] = face;
map['operatingRecord'] = operatingRecord; map['operatingRecord'] = operatingRecord;
map['doorLockLog'] = doorLockLog;
map['number'] = number; map['number'] = number;
map['additive'] = additive; map['additive'] = additive;
map['addTime'] = addTime; map['addTime'] = addTime;
@ -1864,7 +1869,8 @@ class LanKeyEntity {
map['openingDirectionSet'] = openingDirectionSet; map['openingDirectionSet'] = openingDirectionSet;
map['motorPowerSetting'] = motorPowerSetting; map['motorPowerSetting'] = motorPowerSetting;
map['bluetoothBroadcast'] = bluetoothBroadcast; map['bluetoothBroadcast'] = bluetoothBroadcast;
map['whetherInternetRequiredWhenUnlocking'] = whetherInternetRequiredWhenUnlocking; map['whetherInternetRequiredWhenUnlocking'] =
whetherInternetRequiredWhenUnlocking;
map['selectTheLockToJoinTheGroup'] = selectTheLockToJoinTheGroup; map['selectTheLockToJoinTheGroup'] = selectTheLockToJoinTheGroup;
map['lockTrCount'] = lockTrCount; map['lockTrCount'] = lockTrCount;
map['xiaomiIOTPlatform'] = xiaomiIOTPlatform; map['xiaomiIOTPlatform'] = xiaomiIOTPlatform;

View File

@ -134,6 +134,8 @@ dependencies:
flutter_voice_processor: ^1.1.0 flutter_voice_processor: ^1.1.0
#监听网络连接状态 #监听网络连接状态
connectivity_plus: ^5.0.2 connectivity_plus: ^5.0.2
flutter_advanced_calendar: ^1.4.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter