Merge branch 'release' of gitee.com:starlock-cn/app-starlock into release

This commit is contained in:
“DaisyWu” 2024-07-17 17:29:40 +08:00
commit f86c35a5ee
22 changed files with 494 additions and 209 deletions

View File

@ -656,6 +656,7 @@
"刷新": "Refresh",
"手动配网": "Manual distribution network",
"远距离": "Long distance",
"中距离": "Medium distance",
"近距离": "Short distance",
"锁时间更新成功": "Lock time update success",
"锁用户": "Lock user",
@ -925,5 +926,10 @@
"发送钥匙": "Send key",
"进度": "Progress",
"失败": "Failure",
"人脸详情": "Face details"
"人脸详情": "Face details",
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 1.5 meters in front of the door, the face recognition unlocking will be automatically started.",
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.8 meters in front of the door, the face recognition unlocking will be automatically started.",
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "When someone is sensed about 0.5 meters in front of the door, the face recognition unlocking will be automatically started.",
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "The sensing distance has been turned off, you need to manually touch any key on the keyboard to perform face recognition unlocking.",
"防误开已打开,时间是": "The anti-mistake opening has been turned on, and the time is"
}

View File

@ -682,6 +682,7 @@
"刷新": "刷新",
"手动配网": "手动配网",
"远距离": "远距离",
"中距离": "中距离",
"近距离": "近距离",
"锁时间更新成功": "锁时间更新成功",
"锁用户": "锁用户",
@ -957,5 +958,11 @@
"发送钥匙": "发送钥匙",
"进度": "进度",
"失败": "失败",
"人脸详情": "人脸详情"
"人脸详情": "人脸详情",
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
"防误开已打开,时间是": "防误开已打开,时间是"
}

View File

@ -655,6 +655,7 @@
"刷新": "刷新",
"手动配网": "手动配网",
"远距离": "远距离",
"中距离": "中距离",
"近距离": "近距离",
"锁时间更新成功": "锁时间更新成功",
"锁用户": "锁用户",
@ -922,6 +923,11 @@
"发送钥匙": "发送钥匙",
"进度": "进度",
"失败": "失败",
"人脸详情": "人脸详情"
"人脸详情": "人脸详情",
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
"防误开已打开,时间是": "防误开已打开,时间是"
}

View File

@ -84,6 +84,7 @@ import 'main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdayS
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart';
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart';
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart';
import 'main/lockDetail/doorLockLog/doorLockLogDetail/doorLockLogDetail_page.dart';
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart';
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart';
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart';
@ -488,6 +489,7 @@ abstract class Routers {
static const String batchExportLogPage = '/batchExportLogPage'; //
static const String exportSuccessPage = '/exportSuccessPage'; //
static const String viewExportRecordPage = '/viewExportRecordPage'; //
static const String doorLockLogDetailPage = '/doorLockLogDetailPage'; //
static const String login = '/login'; //
}
@ -1146,5 +1148,7 @@ abstract class AppRouters {
page: () => const ViewExportRecordPage()),
GetPage<dynamic>(
name: Routers.expireKeyChangeValidityDatePage, page: () => const ExpireKeyChangeValidityDatePage()),
GetPage<dynamic>(
name: Routers.doorLockLogDetailPage, page: () => const DoorLockLogDetailPage()),
];
}

View File

@ -0,0 +1,9 @@
import 'package:star_lock/tools/baseGetXController.dart';
import 'doorLockLogDetail_state.dart';
class DoorLockLogDetailLogic extends BaseGetXController {
final DoorLockLogDetailState state = DoorLockLogDetailState();
}

View File

@ -0,0 +1,57 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/titleAppBar.dart';
import 'doorLockLogDetail_logic.dart';
import 'doorLockLogDetail_state.dart';
class DoorLockLogDetailPage extends StatefulWidget {
const DoorLockLogDetailPage({Key? key}) : super(key: key);
@override
State<DoorLockLogDetailPage> createState() => _DoorLockLogDetailPageState();
}
class _DoorLockLogDetailPageState extends State<DoorLockLogDetailPage> {
final DoorLockLogDetailLogic logic = Get.put(DoorLockLogDetailLogic());
final DoorLockLogDetailState state = Get.find<DoorLockLogDetailLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: '操作记录详情',
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: EdgeInsets.all(20.w),
child: Text('操作时间:${DateTool().dateIntToYMDHNString(state.timelineDataItem.value.operateDate)}', style: TextStyle(fontSize: 23.sp)),
),
Container(
width: 1.sw,
padding: EdgeInsets.all(15.w),
margin: EdgeInsets.only(left:20.w, right: 20.w, bottom: 20.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10.w),
),
child: Text(state.timelineDataItem.value.recordDetailStr ?? '', style: TextStyle(fontSize: 25.sp)),
),
],
),
),
);
}
}

View File

@ -0,0 +1,15 @@
import 'package:get/get.dart';
import '../doorLockLog_entity.dart';
class DoorLockLogDetailState {
DoorLockLogDetailState() {
final Map map = Get.arguments;
if(map['doorLockLogDataItem'] != null){
timelineDataItem.value = map['doorLockLogDataItem'];
}
}
Rx<DoorLockLogDataItem> timelineDataItem = DoorLockLogDataItem().obs;
}

View File

@ -73,7 +73,8 @@ class DoorLockLogDataItem {
this.headUrl,
this.userid,
this.keyboardPwd,
this.recordStr});
this.recordStr,
this.recordDetailStr});
DoorLockLogDataItem.fromJson(Map<String, dynamic> json) {
recordId = json['recordId'];
@ -89,6 +90,7 @@ class DoorLockLogDataItem {
userid = json['userid'];
keyboardPwd = json['keyboardPwd'];
recordStr = json['recordStr'];
recordDetailStr = json['recordDetailStr'];
}
int? recordId;
int? lockId;
@ -103,6 +105,7 @@ class DoorLockLogDataItem {
String? userid;
String? keyboardPwd;
String? recordStr;
String? recordDetailStr;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
@ -119,6 +122,7 @@ class DoorLockLogDataItem {
data['userid'] = userid;
data['keyboardPwd'] = keyboardPwd;
data['recordStr'] = recordStr;
data['recordDetailStr'] = recordDetailStr;
return data;
}
}

View File

@ -26,7 +26,7 @@ class DoorLockLogLogic extends BaseGetXController {
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if (reply is SenderReferEventRecordTimeReply &&
state.ifCurrentScreen.value == true) {
_replyReferEventRecordTime(reply);
@ -50,19 +50,22 @@ class DoorLockLogLogic extends BaseGetXController {
if (reply.data.length < 17) {
return;
}
final getList = splitList(reply.data, 17);
final List<List<int>> getList = splitList(reply.data, 17);
// AppLog.log("getList:$getList");
final uploadList = [];
final List uploadList = [];
for (int i = 0; i < getList.length; i++) {
final indexList = getList[i];
final List<int> indexList = getList[i];
// AppLog.log("indexList:$indexList");
final indexMap = {};
final Map indexMap = {};
indexMap['type'] = indexList[0].toString();
final int operateDate = 0;
const int operateDate = 0;
if (indexList[0] == 2) {
final passwordData = indexList.sublist(7, 17);
final password = utf8String(passwordData);
indexMap['user'] = password.toString();
final int userNo = (indexList[1] * 256) + indexList[2];
indexMap['user'] = userNo.toString();
final List<int> passwordData = indexList.sublist(7, 17);
final String password = utf8String(passwordData);
indexMap['password'] = password.toString();
} else {
final int userNo = (indexList[1] * 256) + indexList[2];
indexMap['user'] = userNo.toString();
@ -70,10 +73,10 @@ class DoorLockLogLogic extends BaseGetXController {
indexMap['success'] = '1';
final int time = ((0xff & indexList[(3)]) << 24 |
final int time = (0xff & indexList[3]) << 24 |
(0xff & indexList[4]) << 16 |
(0xff & indexList[5]) << 8 |
(0xFF & indexList[6]));
(0xFF & indexList[6]);
indexMap['date'] = '${time * 1000}';
uploadList.add(indexMap);
@ -108,14 +111,14 @@ class DoorLockLogLogic extends BaseGetXController {
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState connectionStateState) async {
if (connectionStateState == BluetoothConnectionState.connected) {
final privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final token = await Storage.getStringList(saveBlueToken);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
final publicKey = await Storage.getStringList(saveBluePublicKey);
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList =
changeStringListToIntList(publicKey!);
@ -230,11 +233,10 @@ class DoorLockLogLogic extends BaseGetXController {
@override
Future<void> onReady() async {
// TODO: implement onReady
super.onReady();
//
final isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
// _initReplySubscription();

View File

@ -274,56 +274,63 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
final String formattedTime =
'${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}';
return Padding(
padding: EdgeInsets.only(left: 20.w, top: 20.h),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
// '$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}',
timelineData.recordStr ?? '',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 24.sp,
fontWeight: FontWeight.w600,
return GestureDetector(
onTap: () {
Get.toNamed(Routers.doorLockLogDetailPage, arguments: {
'doorLockLogDataItem': timelineData
});
},
child: Padding(
padding: EdgeInsets.only(left: 20.w, top: 20.h),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
// '$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}',
timelineData.recordStr ?? '',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 24.sp,
fontWeight: FontWeight.w600,
),
),
),
SizedBox(
height: 10.h,
),
GestureDetector(
onTap: () {
Get.toNamed(Routers.videoLogDetailPage);
},
child: Stack(
children: <Widget>[
if (timelineData.imagesUrl!.isNotEmpty)
Image.network(
timelineData.imagesUrl!,
width: 260.w,
height: 260.h,
)
else
Container(),
Positioned(
top: 150.h,
left: 10.w,
child: Image(
image: const AssetImage(
'images/main/icon_lockLog_play.png'),
width: 24.w,
height: 20.w,
SizedBox(
height: 10.h,
),
GestureDetector(
onTap: () {
Get.toNamed(Routers.videoLogDetailPage);
},
child: Stack(
children: <Widget>[
if (timelineData.imagesUrl!.isNotEmpty)
Image.network(
timelineData.imagesUrl!,
width: 260.w,
height: 260.h,
)
else
Container(),
Positioned(
top: 150.h,
left: 10.w,
child: Image(
image: const AssetImage(
'images/main/icon_lockLog_play.png'),
width: 24.w,
height: 20.w,
),
),
),
],
],
),
),
),
SizedBox(
height: 20.h,
),
],
SizedBox(
height: 20.h,
),
],
),
),
);
},

View File

@ -172,7 +172,7 @@ class FingerprintDetailLogic extends BaseGetXController{
changeType: '1',
startTime: int.parse(state.startDate.value),
endTime: int.parse(state.endTime.value),
fingerprintType: state.fingerprintItemData.value.fingerprintType!,
fingerprintType: state.keyType.value,
fingerRight: state.isAdministrator.value ? 1 : 0,
);
if(entity.errorCode!.codeIsSuccessful){

View File

@ -110,6 +110,12 @@ class AutomaticBlockingLogic extends BaseGetXController {
// ()
Future<void> sendAutoLock() async {
final String autoTime = state.timeController.text;
if (int.parse(autoTime) > 60) {
showToast('请输入小于或等于60的数字'.tr);
return;
}
if (state.sureBtnState.value == 1) {
return;
}

View File

@ -1,74 +1,215 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/versionUndate/versionUndate_entity.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_setSupportFunctionsWithParameters.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 '../../../../tools/eventBusEventManage.dart';
import '../../../../tools/storage.dart';
class FaceUnlockLogic extends BaseGetXController {
final FaceUnlockState state = FaceUnlockState();
//
Future<LockSetInfoEntity> getLockSettingInfoData() async {
LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData(
lockId: state.lockSetInfoData.value.lockId.toString(),
);
if (entity.errorCode!.codeIsSuccessful) {
state.lockSetInfoData.value = entity.data!;
state.faceOn.value =
entity.data!.lockSettingInfo!.faceSwitch == 0 ? false : true;
state.autoBright.value =
entity.data!.lockSettingInfo!.faceAutoLightScreen == 0 ? false : true;
state.senseDistance.value =
entity.data!.lockSettingInfo!.faceInductionDistance! == 0
? '远距离'.tr
: '近距离'.tr;
state.antiMisoperation.value =
entity.data!.lockSettingInfo!.faceAntiMistakeOpen!;
}
return entity;
}
//
void updateFaceSwitch() async {
var entity = await ApiRepository.to.updateFaceSwitch(
Future<void> updateFaceSwitch() async {
final VersionUndateEntity entity = await ApiRepository.to.updateFaceSwitch(
lockId: state.lockSetInfoData.value.lockId ?? 0,
faceSwitch: state.faceOn.value == false ? 0 : 1,
);
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr);
}
}
//
void updateFaceConfig() async {
var entity = await ApiRepository.to.updateFaceAutoLightScreen(
lockId: state.lockSetInfoData.value.lockId ?? 0,
faceAutoLightScreen: state.autoBright.value == false ? 0 : 1,
);
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr);
showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
}
}
//
void updateFaceSenseDistance() async {
var entity = await ApiRepository.to.updateFaceSenseDistance(
Future<void> updateFaceSenseDistance() async {
int faceInductionDistance = 0;
if(state.senseDistance.value == '远距离'.tr){
faceInductionDistance = 1;
}
if(state.senseDistance.value == '中距离'.tr){
faceInductionDistance = 2;
}
if(state.senseDistance.value == '近距离'.tr){
faceInductionDistance = 3;
}
if(state.senseDistance.value == '关闭'.tr){
faceInductionDistance = 0;
}
final VersionUndateEntity entity = await ApiRepository.to.updateFaceSenseDistance(
lockId: state.lockSetInfoData.value.lockId ?? 0,
faceInductionDistance: state.senseDistance.value == '远距离'.tr ? 0 : 1,
faceInductionDistance: faceInductionDistance,
);
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功'.tr);
showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
}
}
//
void updateFacePreventMisrun() async {
var entity = await ApiRepository.to.updateFacePreventMisrun(
Future<void> updateFacePreventMisrun() async {
final VersionUndateEntity entity = await ApiRepository.to.updateFacePreventMisrun(
lockId: state.lockSetInfoData.value.lockId ?? 0,
faceAntiMistakeOpen: state.antiMisoperation.value,
faceEnErrUnlock: state.antiMisoperation.value,
);
if (entity.errorCode!.codeIsSuccessful) {
showToast('设置成功');
showToast('设置成功'.tr, something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
Get.back();
});
}
}
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if(reply is SetSupportFunctionsWithParametersReply && (state.ifCurrentScreen.value == true)) {
_replySetSupportFunctionsWithParameters(reply);
}
});
}
//
Future<void> _replySetSupportFunctionsWithParameters(Reply reply) async {
final int status = reply.data[2];
switch(status){
case 0x00:
//
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
switch(state.setType.value){
case 0:
updateFaceSwitch();
break;
case 1:
updateFaceSenseDistance();
break;
case 2:
updateFacePreventMisrun();
break;
}
break;
case 0x06:
//
break;
default:
break;
}
}
// ()
Future<void> sendFaceUnlock() async {
if(state.sureBtnState.value == 1){
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async {
if (connectionState == BluetoothConnectionState.connected) {
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
final List<String>? publicKey = await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
final List<int> list = <int>[];
//
list.add(state.faceOn.value ? 1 : 0);
//
int faceInductionDistance = 0;
if(state.senseDistance.value == '远距离'.tr){
faceInductionDistance = 3;
}else if(state.senseDistance.value == '中距离'.tr){
faceInductionDistance = 2;
}else if(state.senseDistance.value == '近距离'.tr){
faceInductionDistance = 1;
}else if(state.senseDistance.value == '关闭'.tr){
faceInductionDistance = 0;
}
list.add(faceInductionDistance);
//
list.add(state.antiMisoperation.value);
IoSenderManage.setSupportFunctionsWithParametersCommand(
keyID: state.lockSetInfoData.value.lockBasicInfo!.keyId.toString(),
userID: await Storage.getUid(),
featureBit: 5,
featureParaLength: 3,
featureData: list,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList);
} else if (connectionState == BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
}
});
}
String getSensingDistanceString(){
if(state.senseDistance.value == '远距离'.tr){
return '感应到门前约1.5米有人时,将自动启动面部识别开锁。'.tr;
}else if(state.senseDistance.value == '中距离'.tr){
return '感应到门前约0.8米有人时,将自动启动面部识别开锁。'.tr;
}else if(state.senseDistance.value == '近距离'.tr){
return '感应到门前约0.5米有人时,将自动启动面部识别开锁。'.tr;
}else{
return '感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。'.tr;
}
}
@override
void onReady() {
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
super.onInit();
// _readSupportFunctionsWithParameters();
}
@override
void onClose() {
super.onClose();
_replySubscription.cancel();
}
}

View File

@ -1,12 +1,16 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_logic.dart';
import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_state.dart';
import 'package:star_lock/tools/custom_bottom_sheet.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/commonItem.dart';
import '../../../../tools/pickers/pickers.dart';
import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart';
@ -18,14 +22,8 @@ class FaceUnlockPage extends StatefulWidget {
}
class _FaceUnlockPageState extends State<FaceUnlockPage> {
final logic = Get.put(FaceUnlockLogic());
final state = Get.find<FaceUnlockLogic>().state;
@override
void initState() {
super.initState();
logic.getLockSettingInfoData();
}
final FaceUnlockLogic logic = Get.put(FaceUnlockLogic());
final FaceUnlockState state = Get.find<FaceUnlockLogic>().state;
@override
Widget build(BuildContext context) {
@ -36,45 +34,42 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
haveBack: true,
backgroundColor: AppColors.mainColor),
body: Obx(() => Column(
children: [
children: <Widget>[
Container(
margin: EdgeInsets.only(left: 20.w),
child: CommonItem(
leftTitel: TranslationLoader.lanKeys!.faceUnlocks!.tr,
rightTitle: "",
rightTitle: '',
allHeight: 70.h,
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: SizedBox(
width: 60.w, height: 50.h, child: _switch(1))),
),
Container(
margin: EdgeInsets.only(left: 20.w),
child: CommonItem(
leftTitel: TranslationLoader
.lanKeys!.automaticBrighteningScreen!.tr,
rightTitle: "",
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: SizedBox(
width: 60.w, height: 50.h, child: _switch(2))),
),
_buildSubTitleItem(
TranslationLoader.lanKeys!.sensingDistance!.tr,
TranslationLoader.lanKeys!.sensingDistanceTip!.tr,
state.senseDistance.value, () {
// TranslationLoader.lanKeys!.sensingDistanceTip!.tr,
logic.getSensingDistanceString(),
state.senseDistance.value,
state.faceOn.value, () {
_openBottomItemSheet(state.senseDistanceList.value, 0);
}),
SizedBox(
height: 30.h,
),
SizedBox(height: 30.h),
_buildSubTitleItem(
TranslationLoader.lanKeys!.preventWrongOpening!.tr,
TranslationLoader.lanKeys!.preventWrongOpeningTip!.tr,
state.antiMisoperation.value == 0
? '关闭'
: '${state.antiMisoperation.value}', () {
_openBottomItemSheet(state.antiMisoperationStrList.value, 1);
? TranslationLoader.lanKeys!.preventWrongOpeningTip!.tr
:'防误开已打开,时间是'.tr + state.antiMisoperation.value.toString() + ''.tr,
// state.antiMisoperation.value == 0 ? '关闭' :
'${state.antiMisoperation.value}' + ''.tr,
state.faceOn.value, () {
Pickers.showSinglePicker(Get.context!, data: state.antiMisoperationStrList.value, onConfirm: (var data, int position) {
AppLog.log('data = $data, position = $position');
state.antiMisoperation.value = position;
state.setType.value = 2;
logic.sendFaceUnlock();
});
// _openBottomItemSheet(state.antiMisoperationStrList.value, 1);
}),
Expanded(
child: SizedBox(
@ -88,28 +83,27 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
)));
}
Widget _buildSubTitleItem(
String leftStr, String subTitle, String rightStr, Function()? action) {
Widget _buildSubTitleItem(String leftStr, String subTitle, String rightStr, bool isAble, Function()? action) {
return GestureDetector(
onTap: action,
onTap: isAble ? action : null,
child: Container(
margin: EdgeInsets.only(left: 20.sp, right: 20.sp, top: 20.h),
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
children: <Widget>[
SizedBox(
width: 20.w,
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
children: <Widget>[
Container(
alignment: Alignment.centerLeft,
child: Text(
leftStr,
style: TextStyle(fontSize: 24.sp, color: Colors.black),
style: TextStyle(fontSize: 24.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor),
),
),
SizedBox(
@ -133,7 +127,7 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
Text(
rightStr,
style: TextStyle(
fontSize: 22.sp, color: AppColors.darkGrayTextColor),
fontSize: 22.sp, color: isAble ? Colors.black : AppColors.placeholderTextColor),
),
SizedBox(
width: 10.w,
@ -169,16 +163,13 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: getIndex == 1 ? state.faceOn.value : state.autoBright.value,
onChanged: (value) {
value: state.faceOn.value, // getIndex == 1 ? state.faceOn.value : state.autoBright.value,
onChanged: (bool value) {
if (getIndex == 1) {
//
state.faceOn.value = value;
logic.updateFaceSwitch();
} else {
//
state.autoBright.value = value;
logic.updateFaceConfig();
state.setType.value = 0;
logic.sendFaceUnlock();
}
},
);
@ -193,18 +184,11 @@ class _FaceUnlockPageState extends State<FaceUnlockPage> {
return AlertBottomWidget(
topTitle: '',
items: bottomItemList,
chooseCallback: (value) {
if (clickIndex == 0) {
//
state.senseDistance.value =
state.senseDistanceList.value[value];
logic.updateFaceSenseDistance();
} else if (clickIndex == 1) {
//
state.antiMisoperation.value =
state.antiMisoperationList.value[value];
logic.updateFacePreventMisrun();
}
chooseCallback: (int value) {
state.senseDistance.value =
state.senseDistanceList.value[value];
state.setType.value = 1;
logic.sendFaceUnlock();
},
);
});

View File

@ -1,3 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
@ -7,26 +8,54 @@ import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSetInfo_entity.dar
import '../../../../translations/trans_lib.dart';
class FaceUnlockState {
var lockSetInfoData = LockSetInfoData().obs;
var isCheck = false.obs;
var faceOn = false.obs; //
var autoBright = false.obs; //
var senseDistance = TranslationLoader.lanKeys!.remote!.tr.obs; //
var antiMisoperation = 0.obs; //
var senseDistanceList = [
TranslationLoader.lanKeys!.remote!.tr,
TranslationLoader.lanKeys!.closeRange!.tr
].obs;
var antiMisoperationList = [0, 5, 10, 15, 30, 60].obs;
var antiMisoperationStrList = [
TranslationLoader.lanKeys!.close!.tr,
'5${TranslationLoader.lanKeys!.second!.tr}',
'10${TranslationLoader.lanKeys!.second!.tr}',
'15${TranslationLoader.lanKeys!.second!.tr}',
'30${TranslationLoader.lanKeys!.second!.tr}',
'60${TranslationLoader.lanKeys!.second!.tr}'
FaceUnlockState() {
Map map = Get.arguments;
if (map['lockSetInfoData'] != null) {
lockSetInfoData.value = map['lockSetInfoData'];
faceOn.value = lockSetInfoData.value.lockSettingInfo!.faceSwitch != 0;
// autoBright.value = lockSetInfoData.value.lockSettingInfo!.faceAutoLightScreen != 0;
switch(lockSetInfoData.value.lockSettingInfo!.faceInductionDistance!){
case 1:
senseDistance.value = '远距离';
break;
case 2:
senseDistance.value = '中距离';
break;
case 3:
senseDistance.value = '近距离';
break;
case 0:
senseDistance.value = '关闭';
break;
}
antiMisoperation.value = lockSetInfoData.value.lockSettingInfo!.faceEnErrUnlock!;
}
for(int i = 0; i < 31; i++) {
antiMisoperationStrList.add(i.toString() + ''.tr);
}
}
Rx<LockSetInfoData> lockSetInfoData = LockSetInfoData().obs;
// RxBool isCheck = false.obs;
RxBool faceOn = false.obs; //
// RxBool autoBright = false.obs; //
RxString senseDistance = TranslationLoader.lanKeys!.remote!.tr.obs; //
RxInt antiMisoperation = 0.obs; //
RxList<String> senseDistanceList = <String>[
'远距离'.tr,
'中距离'.tr,
'近距离'.tr,
'关闭'.tr
].obs;
// RxList<int> antiMisoperationList = <int>[0, 5, 10, 15, 30, 60].obs;
RxList<String> antiMisoperationStrList = <String>[].obs;
// TextEditingController antiMisoperationStrController = TextEditingController();
//
final TextStyle titleStyle = TextStyle(
color: Colors.black, fontSize: 24.sp, fontWeight: FontWeight.w500);
@ -34,7 +63,7 @@ class FaceUnlockState {
final TextStyle subTipsStyle =
TextStyle(color: AppColors.placeholderTextColor, fontSize: 22.sp);
late InlineSpan tipsPreviewSpan = TextSpan(children: [
late InlineSpan tipsPreviewSpan = TextSpan(children: <InlineSpan>[
TextSpan(
text: '${TranslationLoader.lanKeys!.addAndUseFaceWhenUnlocking!.tr}:\n',
style: titleStyle),
@ -43,10 +72,8 @@ class FaceUnlockState {
style: subTipsStyle),
]);
FaceUnlockState() {
Map map = Get.arguments;
if (map['lockSetInfoData'] != null) {
lockSetInfoData.value = map['lockSetInfoData'];
}
}
RxBool ifCurrentScreen = true.obs; // ,
RxInt sureBtnState = 0.obs;
RxInt setType = 0.obs; // 0 1 2
}

View File

@ -490,9 +490,10 @@ class LockSettingInfo {
int? faceSwitch; // 0: 1:
int? faceAutoLightScreen; // 0: 1:
int? faceInductionDistance; //
int? faceAntiMistakeOpen; // 0: 1:
// int? faceAntiMistakeOpen; // 0: 1:
int? autoLightScreen; //- 0: 1:
int? autoLightScreenTime; //-
int? faceEnErrUnlock; //
// List<CatEyeModeConfig>? catEyeConfigList;
// int? faceSwitch; // 0: 1:
@ -538,9 +539,10 @@ class LockSettingInfo {
this.faceSwitch,
this.faceAutoLightScreen,
this.faceInductionDistance,
this.faceAntiMistakeOpen,
// this.faceAntiMistakeOpen,
this.autoLightScreen,
this.autoLightScreenTime,
this.faceEnErrUnlock,
// this.dayNotOpenDoorSwitch,
// this.dayNotOpenDoorValue,
// this.doorNotCloseSwitch,
@ -589,9 +591,11 @@ class LockSettingInfo {
faceSwitch = json['faceSwitch'];
faceAutoLightScreen = json['faceAutoLightScreen'];
faceInductionDistance = json['faceInductionDistance'];
faceAntiMistakeOpen = json['faceAntiMistakeOpen'];
// faceAntiMistakeOpen = json['faceAntiMistakeOpen'];
autoLightScreen = json['autoLightScreen'];
autoLightScreenTime = json['autoLightScreenTime'];
faceEnErrUnlock = json['faceEnErrUnlock'];
// dayNotOpenDoorSwitch = json['dayNotOpenDoorSwitch'];
// dayNotOpenDoorValue = json['dayNotOpenDoorValue'];
// doorNotCloseSwitch = json['doorNotCloseSwitch'];
@ -636,9 +640,11 @@ class LockSettingInfo {
data['faceSwitch'] = faceSwitch;
data['faceAutoLightScreen'] = faceAutoLightScreen;
data['faceInductionDistance'] = faceInductionDistance;
data['faceAntiMistakeOpen'] = faceAntiMistakeOpen;
// data['faceAntiMistakeOpen'] = faceAntiMistakeOpen;
data['autoLightScreen'] = autoLightScreen;
data['autoLightScreenTime'] = autoLightScreenTime;
data['faceEnErrUnlock'] = faceEnErrUnlock;
// data['dayNotOpenDoorSwitch'] = dayNotOpenDoorSwitch;
// data['dayNotOpenDoorValue'] = dayNotOpenDoorValue;
// data['doorNotCloseSwitch'] = doorNotCloseSwitch;

View File

@ -191,7 +191,7 @@ class PasswordKeyDetailLogic extends BaseGetXController {
case 3:
// 3 24使
useDateStr =
'${startDateStr.toLocal().toString().substring(0, 16)}\n${endDateStr.toLocal().toString().substring(0, 16)}';
'${startDateStr.toLocal().toString().substring(0, 16)}\n${DateTime.fromMillisecondsSinceEpoch(state.itemData.value.endDate!-1).toLocal().toString().substring(0, 16)}';
state.isCirculation.value = false;
break;
case 4:

View File

@ -243,7 +243,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
day: DateTime.now().day,
hour: 24),
// minDate: PDuration.now(),
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
mode: DateMode.YMDHM, hourShow24: true, onConfirm: (PDuration p) {
state.beginTime.value = DateTool().getYMDHNDateString(p, 4);
});
}),
@ -266,7 +266,9 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
year: DateTime.now().year,
month: DateTime.now().month,
day: DateTime.now().day),
mode: DateMode.YMDH, onConfirm: (PDuration p) {
mode: DateMode.YMDH,
hourShow24: true,
onConfirm: (PDuration p) {
state.endTime.value = DateTool().getYMDHNDateString(p, 4);
});
}),

View File

@ -1881,7 +1881,7 @@ class ApiProvider extends BaseProvider {
//
Future<Response> updateFaceSwitch(int lockId, int faceSwitch) => post(
updateFaceConfigURL.toUrl,
updateLockSettingUrl.toUrl,
jsonEncode({
'lockId': lockId,
'faceSwitch': faceSwitch,
@ -1891,7 +1891,7 @@ class ApiProvider extends BaseProvider {
Future<Response> updateFaceSenseDistance(
int lockId, int faceInductionDistance) =>
post(
updateFaceConfigURL.toUrl,
updateLockSettingUrl.toUrl,
jsonEncode({
'lockId': lockId,
'faceInductionDistance': faceInductionDistance,
@ -1899,12 +1899,12 @@ class ApiProvider extends BaseProvider {
//
Future<Response> updateFacePreventMisrun(
int lockId, int faceAntiMistakeOpen) =>
int lockId, int faceEnErrUnlock) =>
post(
updateFaceConfigURL.toUrl,
updateLockSettingUrl.toUrl,
jsonEncode({
'lockId': lockId,
'faceAntiMistakeOpen': faceAntiMistakeOpen,
'faceEnErrUnlock': faceEnErrUnlock,
}));
//

View File

@ -1941,9 +1941,9 @@ class ApiRepository {
//
Future<VersionUndateEntity> updateFacePreventMisrun(
{required int lockId, required int faceAntiMistakeOpen}) async {
{required int lockId, required int faceEnErrUnlock}) async {
final res =
await apiProvider.updateFacePreventMisrun(lockId, faceAntiMistakeOpen);
await apiProvider.updateFacePreventMisrun(lockId, faceEnErrUnlock);
return VersionUndateEntity.fromJson(res.body);
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:star_lock/app_settings/app_colors.dart';
///
/// [showTitleBar] true
@ -167,8 +168,8 @@ class PickerStyle {
Container(
alignment: Alignment.center,
padding: const EdgeInsets.only(left: 12, right: 22),
child: const Text('确定',
style: TextStyle(color: Colors.blue, fontSize: 16.0)),
child: Text('确定',
style: TextStyle(color: AppColors.mainColor, fontSize: 16.0)),
);
}

View File

@ -49,6 +49,7 @@ class ShowTFView extends StatelessWidget {
height: 60.h,
// color: Colors.white,
// padding: EdgeInsets.only(left:20.w, right: 110.w),
margin: EdgeInsets.only(top: 20.w),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15.w)),