Merge branch 'release' of gitee.com:starlock-cn/app-starlock into release
This commit is contained in:
commit
f86c35a5ee
@ -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"
|
||||
}
|
||||
|
||||
@ -682,6 +682,7 @@
|
||||
"刷新": "刷新",
|
||||
"手动配网": "手动配网",
|
||||
"远距离": "远距离",
|
||||
"中距离": "中距离",
|
||||
"近距离": "近距离",
|
||||
"锁时间更新成功": "锁时间更新成功",
|
||||
"锁用户": "锁用户",
|
||||
@ -957,5 +958,11 @@
|
||||
"发送钥匙": "发送钥匙",
|
||||
"进度": "进度",
|
||||
"失败": "失败",
|
||||
"人脸详情": "人脸详情"
|
||||
"人脸详情": "人脸详情",
|
||||
|
||||
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
|
||||
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
|
||||
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
|
||||
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
|
||||
"防误开已打开,时间是": "防误开已打开,时间是"
|
||||
}
|
||||
|
||||
@ -655,6 +655,7 @@
|
||||
"刷新": "刷新",
|
||||
"手动配网": "手动配网",
|
||||
"远距离": "远距离",
|
||||
"中距离": "中距离",
|
||||
"近距离": "近距离",
|
||||
"锁时间更新成功": "锁时间更新成功",
|
||||
"锁用户": "锁用户",
|
||||
@ -922,6 +923,11 @@
|
||||
"发送钥匙": "发送钥匙",
|
||||
"进度": "进度",
|
||||
"失败": "失败",
|
||||
"人脸详情": "人脸详情"
|
||||
"人脸详情": "人脸详情",
|
||||
|
||||
"感应到门前约1.5米有人时,将自动启动面部识别开锁。": "感应到门前约1.5米有人时,将自动启动面部识别开锁。",
|
||||
"感应到门前约0.8米有人时,将自动启动面部识别开锁。": "感应到门前约0.8米有人时,将自动启动面部识别开锁。",
|
||||
"感应到门前约0.5米有人时,将自动启动面部识别开锁。": "感应到门前约0.5米有人时,将自动启动面部识别开锁。",
|
||||
"感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。": "感应距离已关闭,需手动触摸键盘任意键,进行面部识别开锁。",
|
||||
"防误开已打开,时间是": "防误开已打开,时间是"
|
||||
}
|
||||
|
||||
@ -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()),
|
||||
];
|
||||
}
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
|
||||
import 'doorLockLogDetail_state.dart';
|
||||
|
||||
class DoorLockLogDetailLogic extends BaseGetXController {
|
||||
final DoorLockLogDetailState state = DoorLockLogDetailState();
|
||||
|
||||
}
|
||||
@ -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)),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@ -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){
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
@ -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防误开
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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);
|
||||
});
|
||||
}),
|
||||
|
||||
@ -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,
|
||||
}));
|
||||
|
||||
// 设置面容自动亮屏
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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)),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -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)),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user