1,新增人脸添加相关图片及页面(未完成)

2,新增人脸相关接口(未完成)人脸列表、添加人脸、校验人脸名称是否重复、更新人脸用户接口
3,新增人脸相关协议命令(未完善)
This commit is contained in:
Daisy 2024-01-23 18:12:51 +08:00
parent 95d138f66e
commit 2b7a351347
27 changed files with 2855 additions and 751 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@ -6,6 +6,7 @@ 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';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart';
import 'package:star_lock/main/lockDetail/face/faceDetail/faceDetail_page.dart';
import 'package:star_lock/main/lockDetail/lcokSet/addFamily/addFamily_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/addFamily/addFamily_page.dart';
import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart';
import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_page.dart'; import 'package:star_lock/main/lockDetail/lcokSet/catEyeSet/catEyeSet/catEyeSet_page.dart';
@ -378,7 +379,7 @@ abstract class Routers {
static const openDoorDirectionPage = '/openDoorDirectionPage'; // static const openDoorDirectionPage = '/openDoorDirectionPage'; //
static const catEyeWorkModePage = '/catEyeWorkModePage'; // static const catEyeWorkModePage = '/catEyeWorkModePage'; //
static const msgNotificationPage = '/msgNotificationPage'; // static const msgNotificationPage = '/msgNotificationPage'; //
static const addFaceTipPage = '/addFaceTipPage'; // static const addFacePage = '/addFacePage'; //
static const nDaysUnopenedPage = '/nDaysUnopenedPage'; //N天未开门 static const nDaysUnopenedPage = '/nDaysUnopenedPage'; //N天未开门
static const notificationModePage = '/notificationModePage'; // static const notificationModePage = '/notificationModePage'; //
static const openDoorNotifyPage = '/openDoorNotifyPage'; // static const openDoorNotifyPage = '/openDoorNotifyPage'; //
@ -411,6 +412,8 @@ abstract class Routers {
static const fingerprintDetailPage = '/FingerprintDetailPage'; // static const fingerprintDetailPage = '/FingerprintDetailPage'; //
static const faceList = '/FaceList'; // static const faceList = '/FaceList'; //
static const addFaceTypeManagePage = '/AddFaceTypeManagePage'; // static const addFaceTypeManagePage = '/AddFaceTypeManagePage'; //
static const faceDetailPage = '/faceDetailPage'; //
static const passwordKeyDetailChangeDatePage = static const passwordKeyDetailChangeDatePage =
'/passwordKeyDetailChangeDatePage'; // '/passwordKeyDetailChangeDatePage'; //
static const realTimePicturePage = '/realTimePicturePage'; // static const realTimePicturePage = '/realTimePicturePage'; //
@ -937,7 +940,7 @@ abstract class AppRouters {
GetPage( GetPage(
name: Routers.msgNotificationPage, name: Routers.msgNotificationPage,
page: () => const MsgNotificationPage()), page: () => const MsgNotificationPage()),
GetPage(name: Routers.addFaceTipPage, page: () => const AddFaceTipPage()), GetPage(name: Routers.addFacePage, page: () => const AddFacePage()),
GetPage( GetPage(
name: Routers.nDaysUnopenedPage, page: () => const NDaysUnopenedPage()), name: Routers.nDaysUnopenedPage, page: () => const NDaysUnopenedPage()),
GetPage( GetPage(
@ -1013,6 +1016,7 @@ abstract class AppRouters {
name: Routers.catEyeCustomModePage, name: Routers.catEyeCustomModePage,
page: () => const CatEyeCustomModePage()), page: () => const CatEyeCustomModePage()),
GetPage(name: Routers.videoSlotPage, page: (() => const VideoSlotPage())), GetPage(name: Routers.videoSlotPage, page: (() => const VideoSlotPage())),
GetPage(name: Routers.liveVideoPage, page: (() => const LiveVideoPage())) GetPage(name: Routers.liveVideoPage, page: (() => const LiveVideoPage())),
GetPage(name: Routers.faceDetailPage, page: (() => const FaceDetailPage())),
]; ];
} }

View File

@ -0,0 +1,153 @@
import 'dart:convert';
import '../io_tool/io_tool.dart';
import '../sm4Encipher/sm4.dart';
import '../io_reply.dart';
import '../io_sender.dart';
import '../io_type.dart';
import 'package:crypto/crypto.dart' as crypto;
///TODO:
/*
UseCountLimit 0 UseCountLimit 0FingerNo 255userId Delete All !@#
**/
class SenderAddFaceCommand extends SenderProtocol {
String? keyID;
String? userID;
int? faceNo;
int? useCountLimit;
List<int>? token;
int? startTime;
int? endTime;
int? needAuthor;
List<int>? publicKey;
List<int>? privateKey;
SenderAddFaceCommand({
this.keyID,
this.userID,
this.faceNo,
this.useCountLimit,
this.token,
this.startTime,
this.endTime,
this.needAuthor,
this.publicKey,
this.privateKey,
}) : super(CommandType.generalExtendedCommond);
@override
List<int> messageDetail() {
List<int> data = [];
List<int> subData = [];
List<int> ebcData = [];
//
int type = commandType!.typeValue;
double typeDouble = type / 256;
int type1 = typeDouble.toInt();
int type2 = type % 256;
data.add(type1);
data.add(type2);
// --
data.add(81);
// keyID 40
int keyIDLength = utf8.encode(keyID!).length;
// print("${commandType!.typeValue}LockIDLength:$lockIDLength utf8.encode(lockID!)${utf8.encode(lockID!)}");
subData.addAll(utf8.encode(keyID!));
subData = getFixedLengthList(subData, 40 - keyIDLength);
//userID 20
int userIDLength = utf8.encode(userID!).length;
// print("${commandType!.typeValue}IDLength:$authUserIDLength utf8.encode(authUserID!)${utf8.encode(authUserID!)}");
subData.addAll(utf8.encode(userID!));
subData = getFixedLengthList(subData, 20 - userIDLength);
// PwdNo
subData.add(faceNo!);
// UseCountLimit
subData.add(useCountLimit!);
// token
subData.addAll(token!);
// startTime 4
subData.add((startTime! & 0xff000000) >> 24);
subData.add((startTime! & 0xff0000) >> 16);
subData.add((startTime! & 0xff00) >> 8);
subData.add((startTime! & 0xff));
// endTime 4
subData.add((endTime! & 0xff000000) >> 24);
subData.add((endTime! & 0xff0000) >> 16);
subData.add((endTime! & 0xff00) >> 8);
subData.add((endTime! & 0xff));
if (needAuthor == 0) {
//AuthCodeLen 1
subData.add(0);
} else {
List<int> authCodeData = [];
//authUserID
authCodeData.addAll(utf8.encode(userID!));
//KeyID
authCodeData.addAll(utf8.encode(keyID!));
//token 4 Token 0
authCodeData.addAll(token!);
authCodeData.addAll(publicKey!);
print("${commandType!.typeValue}-authCodeData:$authCodeData");
// KeyIDauthUserIDmd5加密之后就是authCode
var authCode = crypto.md5.convert(authCodeData);
subData.add(authCode.bytes.length);
subData.addAll(authCode.bytes);
}
data.add(subData.length);
data.addAll(subData);
if ((data.length % 16) != 0) {
int add = (16 - data.length % 16);
for (int i = 0; i < add; i++) {
data.add(0);
}
}
print("${commandType!.typeName} SM4Data:$data");
// LockId进行SM4 ECB加密 key:544d485f633335373034383064613864
ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB);
return ebcData;
}
}
class SenderAddFaceReply extends Reply {
SenderAddFaceReply.parseData(CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}
class SenderAddFaceProcessReply extends Reply {
SenderAddFaceProcessReply.parseData(
CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}
class SenderAddFaceConfirmationReply extends Reply {
SenderAddFaceConfirmationReply.parseData(
CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}

View File

@ -0,0 +1,118 @@
//TODO:
import 'dart:convert';
import '../io_reply.dart';
import '../io_sender.dart';
import '../io_tool/io_tool.dart';
import '../io_type.dart';
import '../sm4Encipher/sm4.dart';
import 'package:crypto/crypto.dart' as crypto;
class SenderQueryingFaceStatusCommand extends SenderProtocol {
String? keyID;
String? userID;
int? role;
int? fingerCount;
int? fingerNo;
List<int>? token;
int? needAuthor;
List<int>? publicKey;
List<int>? privateKey;
SenderQueryingFaceStatusCommand({
this.keyID,
this.userID,
this.role,
this.fingerCount,
this.fingerNo,
this.token,
this.needAuthor,
this.publicKey,
this.privateKey,
}) : super(CommandType.generalExtendedCommond);
@override
List<int> messageDetail() {
List<int> data = [];
List<int> subData = [];
List<int> ebcData = [];
//
int type = commandType!.typeValue;
double typeDouble = type / 256;
int type1 = typeDouble.toInt();
int type2 = type % 256;
data.add(type1);
data.add(type2);
// --
data.add(80);
// keyID 40
int keyIDLength = utf8.encode(keyID!).length;
subData.addAll(utf8.encode(keyID!));
subData = getFixedLengthList(subData, 40 - keyIDLength);
//userID 20
int userIDLength = utf8.encode(userID!).length;
subData.addAll(utf8.encode(userID!));
subData = getFixedLengthList(subData, 20 - userIDLength);
// role
subData.add(role!);
// fingerCount
subData.add(fingerCount!);
// FingerNo
subData.add(fingerNo!);
if (needAuthor == 0) {
//AuthCodeLen 1
subData.add(0);
} else {
List<int> authCodeData = [];
//authUserID
authCodeData.addAll(utf8.encode(userID!));
//KeyID
authCodeData.addAll(utf8.encode(keyID!));
//token 4 Token 0
authCodeData.addAll(token!);
authCodeData.addAll(publicKey!);
print("${commandType!.typeValue}-authCodeData:$authCodeData");
// KeyIDauthUserIDmd5加密之后就是authCode
var authCode = crypto.md5.convert(authCodeData);
subData.add(authCode.bytes.length);
subData.addAll(authCode.bytes);
}
data.add(subData.length);
data.addAll(subData);
if ((data.length % 16) != 0) {
int add = (16 - data.length % 16);
for (int i = 0; i < add; i++) {
data.add(0);
}
}
print("${commandType!.typeName} SM4Data:$data");
// LockId进行SM4 ECB加密 key:544d485f633335373034383064613864
ebcData = SM4.encrypt(data, key: privateKey, mode: SM4CryptoMode.ECB);
return ebcData;
}
}
class SenderQueryingFaceStatusReply extends Reply {
SenderQueryingFaceStatusReply.parseData(
CommandType commandType, List<int> dataDetail)
: super.parseData(commandType, dataDetail) {
data = dataDetail;
}
}

View File

@ -1,14 +1,14 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:star_lock/blue/blue_manage.dart'; import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_addFace.dart';
import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart'; import 'package:star_lock/blue/io_protocol/io_changeAdministratorPassword.dart';
import 'package:star_lock/blue/io_protocol/io_deletUser.dart'; import 'package:star_lock/blue/io_protocol/io_deletUser.dart';
import 'package:star_lock/blue/io_protocol/io_editUser.dart'; import 'package:star_lock/blue/io_protocol/io_editUser.dart';
import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart'; import 'package:star_lock/blue/io_protocol/io_factoryDataReset.dart';
import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart'; import 'package:star_lock/blue/io_protocol/io_getLockStatu.dart';
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart'; import 'package:star_lock/blue/io_protocol/io_readAdminPassword.dart';
import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsNoParameters.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsNoParameters.dart';
import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsWithParameters.dart'; import 'package:star_lock/blue/io_protocol/io_readSupportFunctionsWithParameters.dart';
@ -44,29 +44,31 @@ import 'io_tool/manager_event_bus.dart';
import 'sm4Encipher/sm4.dart'; import 'sm4Encipher/sm4.dart';
class CommandReciverManager { class CommandReciverManager {
static void appDataReceive(List<int> data) async { static void appDataReceive(List<int> data) async {
/// ///
if(data.isEmpty){ if (data.isEmpty) {
return; return;
} }
int dataSize = data.length; int dataSize = data.length;
// 13 // 13
if(dataSize < 13){ if (dataSize < 13) {
return; return;
} }
print("appDataReceiveData:$data"); // &&(data[4] == 0x11) print("appDataReceiveData:$data"); // &&(data[4] == 0x11)
if((data[0] == 0xEF)&&(data[1] == 0x01)&&(data[2] == 0xEE)&&(data[3] == 0x02)){ if ((data[0] == 0xEF) &&
var tmpType = (data[7] & 0x0f);// (data[1] == 0x01) &&
(data[2] == 0xEE) &&
(data[3] == 0x02)) {
var tmpType = (data[7] & 0x0f); //
// print("temType:$tmpType"); // print("temType:$tmpType");
var dataLen = data[8] * 256 + data[9];// 16 var dataLen = data[8] * 256 + data[9]; // 16
var oriLen = data[10] * 256 + data[11];// 16 var oriLen = data[10] * 256 + data[11]; // 16
// print("dataLen:$dataLen oriLen:$oriLen"); // print("dataLen:$dataLen oriLen:$oriLen");
// List<int> dataList = []; // List<int> dataList = [];
List<int> oriDataList = []; List<int> oriDataList = [];
switch(tmpType){ switch (tmpType) {
case 0: // case 0: //
// for (var i = 0; i < oriLen ; i++) { // for (var i = 0; i < oriLen ; i++) {
// oriDataList.add(data[12 + i]); // oriDataList.add(data[12 + i]);
@ -84,7 +86,9 @@ class CommandReciverManager {
// //
// String key = SM4.createHexKey(key: IoManager().getCurrentDeviceLockId); // String key = SM4.createHexKey(key: IoManager().getCurrentDeviceLockId);
oriDataList = SM4.decrypt(getDataList, key: utf8.encode(BlueManage().connectDeviceName), mode: SM4CryptoMode.ECB); oriDataList = SM4.decrypt(getDataList,
key: utf8.encode(BlueManage().connectDeviceName),
mode: SM4CryptoMode.ECB);
oriDataList = oriDataList.sublist(0, oriLen); oriDataList = oriDataList.sublist(0, oriLen);
// print("SM4 oriDataList:$oriDataList"); // print("SM4 oriDataList:$oriDataList");
break; break;
@ -98,11 +102,11 @@ class CommandReciverManager {
// print("getPrivateKeyList$getPrivateKeyList"); // print("getPrivateKeyList$getPrivateKeyList");
// //
oriDataList = SM4.decrypt(getDataList, key: getPrivateKeyList, mode: SM4CryptoMode.ECB); oriDataList = SM4.decrypt(getDataList,
key: getPrivateKeyList, mode: SM4CryptoMode.ECB);
oriDataList = oriDataList.sublist(0, oriLen); oriDataList = oriDataList.sublist(0, oriLen);
print("SM4 oriDataList:$oriDataList"); print("SM4 oriDataList:$oriDataList");
break; break;
} }
parseData(oriDataList).then((value) { parseData(oriDataList).then((value) {
EasyLoading.dismiss(); EasyLoading.dismiss();
@ -113,14 +117,14 @@ class CommandReciverManager {
} }
static Future<Reply?> parseData(List<int> data) async { static Future<Reply?> parseData(List<int> data) async {
if(data.isNotEmpty){ if (data.isNotEmpty) {
var cmd = data[0] * 256 + data[1]; var cmd = data[0] * 256 + data[1];
CommandType commandType = ExtensionCommandType.getCommandType(cmd); CommandType commandType = ExtensionCommandType.getCommandType(cmd);
await IoManager().increaseCommandIndex(); await IoManager().increaseCommandIndex();
// data.removeRange(0, 2); // data.removeRange(0, 2);
// print("111111data cmd:$cmd commandType:$commandType data:$data"); // print("111111data cmd:$cmd commandType:$commandType data:$data");
var reply; var reply;
switch(commandType) { switch (commandType) {
case CommandType.getLockPublicKey: case CommandType.getLockPublicKey:
{ {
reply = GetPublicKeyReply.parseData(commandType, data); reply = GetPublicKeyReply.parseData(commandType, data);
@ -180,17 +184,19 @@ class CommandReciverManager {
{ {
// //
int subType = data[3]; int subType = data[3];
switch(subType){ switch (subType) {
case 2: case 2:
{ {
// //
reply = ChangeAdministratorPasswordReply.parseData(commandType, data); reply = ChangeAdministratorPasswordReply.parseData(
commandType, data);
} }
break; break;
case 3: case 3:
{ {
// //
reply = SenderCustomPasswordsReply.parseData(commandType, data); reply =
SenderCustomPasswordsReply.parseData(commandType, data);
} }
break; break;
case 4: case 4:
@ -202,13 +208,15 @@ class CommandReciverManager {
case 15: case 15:
{ {
// () // ()
reply = SenderCheckingUserInfoCountReply.parseData(commandType, data); reply = SenderCheckingUserInfoCountReply.parseData(
commandType, data);
} }
break; break;
case 20: case 20:
{ {
// //
reply = SenderCheckingCardStatusReply.parseData(commandType, data); reply = SenderCheckingCardStatusReply.parseData(
commandType, data);
} }
break; break;
case 21: case 21:
@ -220,43 +228,50 @@ class CommandReciverManager {
case 22: case 22:
{ {
// //
reply = SenderAddICCardConfirmationReply.parseData(commandType, data); reply = SenderAddICCardConfirmationReply.parseData(
commandType, data);
} }
break; break;
case 30: case 30:
{ {
// //
reply = SenderQueryingFingerprintStatusReply.parseData(commandType, data); reply = SenderQueryingFingerprintStatusReply.parseData(
commandType, data);
} }
break; break;
case 31: case 31:
{ {
// //
reply = SenderAddFingerprintReply.parseData(commandType, data); reply =
SenderAddFingerprintReply.parseData(commandType, data);
} }
break; break;
case 32: case 32:
{ {
// //
reply = SenderAddFingerprintConfirmationReply.parseData(commandType, data); reply = SenderAddFingerprintConfirmationReply.parseData(
commandType, data);
} }
break; break;
case 33: case 33:
{ {
// //
reply = SenderAddFingerprintProcessReply.parseData(commandType, data); reply = SenderAddFingerprintProcessReply.parseData(
commandType, data);
} }
break; break;
case 40: case 40:
{ {
// //
reply = SenderReferEventRecordNumberReply.parseData(commandType, data); reply = SenderReferEventRecordNumberReply.parseData(
commandType, data);
} }
break; break;
case 41: case 41:
{ {
// //
reply = SenderReferEventRecordTimeReply.parseData(commandType, data); reply = SenderReferEventRecordTimeReply.parseData(
commandType, data);
} }
break; break;
// case 50: // case 50:
@ -268,55 +283,92 @@ class CommandReciverManager {
case 51: case 51:
{ {
// wifi配网结果 // wifi配网结果
reply = SenderConfiguringWifiReply.parseData(commandType, data); reply =
SenderConfiguringWifiReply.parseData(commandType, data);
} }
break; break;
case 60: case 60:
{ {
// //
reply = SenderAddStressPasswordReply.parseData(commandType, data); reply =
SenderAddStressPasswordReply.parseData(commandType, data);
} }
break; break;
case 61: case 61:
{ {
// //
reply = SenderAddStressICCardReply.parseData(commandType, data); reply =
SenderAddStressICCardReply.parseData(commandType, data);
} }
break; break;
case 62: case 62:
{ {
// //
reply = SenderAddStressFingerprintReply.parseData(commandType, data); reply = SenderAddStressFingerprintReply.parseData(
commandType, data);
} }
break; break;
case 70: case 70:
{ {
// ()/ // ()/
reply = SetSupportFunctionsNoParametersReply.parseData(commandType, data); reply = SetSupportFunctionsNoParametersReply.parseData(
commandType, data);
} }
break; break;
case 71: case 71:
{ {
// ()/ // ()/
reply = ReadSupportFunctionsNoParametersReply.parseData(commandType, data); reply = ReadSupportFunctionsNoParametersReply.parseData(
commandType, data);
} }
break; break;
case 72: case 72:
{ {
// () // ()
reply = SetSupportFunctionsWithParametersReply.parseData(commandType, data); reply = SetSupportFunctionsWithParametersReply.parseData(
commandType, data);
} }
break; break;
case 73: case 73:
{ {
// () // ()
reply = ReadSupportFunctionsWithParametersReply.parseData(commandType, data); reply = ReadSupportFunctionsWithParametersReply.parseData(
commandType, data);
} }
break; break;
case 74: case 74:
{ {
// //
reply = SenderReadAdminPasswordReply.parseData(commandType, data); reply =
SenderReadAdminPasswordReply.parseData(commandType, data);
}
break;
case 80:
{
//
reply = SenderQueryingFaceStatusReply.parseData(
commandType, data);
}
break;
case 81:
{
//
reply = SenderAddFaceReply.parseData(commandType, data);
}
break;
case 82:
{
//
reply = SenderAddFaceConfirmationReply.parseData(
commandType, data);
}
break;
case 83:
{
//
reply =
SenderAddFaceProcessReply.parseData(commandType, data);
} }
break; break;
} }
@ -326,5 +378,4 @@ class CommandReciverManager {
return reply; return reply;
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,294 @@
import 'dart:async';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:get/get.dart';
import 'package:star_lock/blue/io_protocol/io_addFace.dart';
import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/main/lockDetail/face/addFace/addFace_state.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import '../../../../../blue/blue_manage.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';
class AddFaceLogic extends BaseGetXController {
final AddFaceState state = AddFaceState();
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) async {
//
if (reply is SenderAddFaceReply) {
_replyAddFaceBegin(reply);
}
//
if (reply is SenderAddFaceProcessReply) {
_replyAddFaceProcess(reply);
}
//
if (reply is SenderAddFaceConfirmationReply) {
_replyAddFaceConfirmation(reply);
}
});
}
Future<void> _replyAddFaceBegin(Reply reply) async {
int status = reply.data[2];
print("status:$status");
switch (status) {
case 0x00:
//
print("${reply.commandType!.typeValue} 人脸开始数据解析成功");
state.ifConnectScuess.value = true;
//
state.maxRegCount.value = reply.data[10];
print("人脸开始state.maxRegCount.value:${state.maxRegCount.value}");
// state.fingerprintNumber.value = reply.data.last.toString();
break;
case 0x06:
//
print("${reply.commandType!.typeValue} 需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = reply.data.sublist(5, 9);
var saveStrList = changeIntListToStringList(token);
print("_replyAddFaceReplyToken:$token");
Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderAddFaceCommand(
keyID: "1",
userID: await Storage.getUid(),
faceNo: 1,
useCountLimit: 0xff,
// startTime:0x11223344,
// endTime:0x11223344,
startTime: state.startDate.value ~/ 1000,
endTime: state.endDate.value ~/ 1000,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: token,
);
break;
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} 失败");
break;
}
}
Future<void> _replyAddFaceProcess(Reply reply) async {
int status = reply.data[2];
print("33 status:$status");
switch (status) {
case 0x00:
//
print("${reply.commandType!.typeValue} 注册人脸过程数据解析成功");
if (reply.data[5] == 255) {
//
print("${reply.commandType!.typeValue} 注册人脸过程失败");
showToast("添加失败");
Get.close(2);
} else {
// state.addFaceProcessNumber.value++;
//
state.regIndex.value = reply.data[6];
print("state.regIndex.value:${state.regIndex.value}");
}
break;
case 0x06:
//
break;
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} 注册人脸过程default失败");
break;
}
}
Future<void> _replyAddFaceConfirmation(Reply reply) async {
int status = reply.data[2];
print("status:$status");
switch (status) {
case 0x00:
//
print("${reply.commandType!.typeValue} 人脸确认数据解析成功");
// print("添加人脸确认成功,调用添加指纹接口");
if (state.faceNumber.value == (reply.data[6]).toString()) {
return;
} else {
state.faceNumber.value = (reply.data[6]).toString();
}
addFaceData();
break;
case 0x06:
//
break;
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} 人脸确认default失败");
break;
}
}
//
Future<void> senderAddFace() async {
showBlueConnetctToastTimer(action: () {
Get.close(1);
});
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected) {
cancelBlueConnetctToastTimer();
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
print(
"openDoorTokenPubToken:$getTokenList state.startDate.value:${state.startDate.value}");
IoSenderManage.senderAddFaceCommand(
keyID: "1",
userID: await Storage.getUid(),
faceNo: 1,
useCountLimit: 0xff,
// startTime:0x11223344,
// endTime:0x11223344,
startTime: state.startDate.value ~/ 1000,
endTime: state.endDate.value ~/ 1000,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
);
} else if (deviceConnectionState == DeviceConnectionState.disconnected) {
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
cancelBlueConnetctToastTimer();
Get.close(1);
}
});
}
//
void addFaceData() async {
var entity = await ApiRepository.to.addFaceData(
lockId: state.lockId.value,
faceName: state.faceName.value,
faceNumber: state.faceNumber.value,
faceType: state.faceType.value,
startDate: state.startDate.value,
endDate: state.endDate.value,
featureData: state.featureData.value,
addType: state.addType.value,
cyclicConfig: state.cyclicConfig.value,
);
if (entity.errorCode!.codeIsSuccessful) {
// Toast.show(msg: "添加成功");
updateFaceUserNoLoadData(entity.data!.fingerprintId.toString());
}
}
//
void updateFaceUserNoLoadData(String faceId) async {
var entity = await ApiRepository.to.updateFaceUserNoLoadData(
faceId: faceId,
lockId: state.lockId.value.toString(),
faceUserNo: state.faceNumber.value,
);
if (entity.errorCode!.codeIsSuccessful) {
showToast("添加成功");
if (state.fromType.value == 2) {
//
eventBus
.fire(ChickInAddStaffCardAndFingerprintBlockNumberEvent(faceId));
} else if (state.fromType.value == 1) {
eventBus.fire(OtherTypeRefreshListEvent());
}
Get.close(2);
}
}
@override
void onReady() {
// TODO: implement onReady
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
//
// senderAddFace();
}
@override
void onClose() {
// TODO: implement onClose
super.onClose();
_replySubscription.cancel();
}
}

View File

@ -1,39 +1,40 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/face/addFace/addFace_logic.dart';
import '../../../../../appRouters.dart';
import '../../../../../app_settings/app_colors.dart'; import '../../../../../app_settings/app_colors.dart';
import '../../../../../tools/submitBtn.dart'; import '../../../../../tools/submitBtn.dart';
import '../../../../../tools/titleAppBar.dart'; import '../../../../../tools/titleAppBar.dart';
import '../../../../../translations/trans_lib.dart'; import '../../../../../translations/trans_lib.dart';
class AddFaceTipPage extends StatefulWidget { class AddFacePage extends StatefulWidget {
const AddFaceTipPage({Key? key}) : super(key: key); const AddFacePage({Key? key}) : super(key: key);
@override @override
State<AddFaceTipPage> createState() => _AddFaceTipPageState(); State<AddFacePage> createState() => _AddFacePageState();
} }
class _AddFaceTipPageState extends State<AddFaceTipPage> { class _AddFacePageState extends State<AddFacePage> {
final logic = Get.put(AddFaceLogic());
final state = Get.find<AddFaceLogic>().state;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: Colors.white, backgroundColor: Colors.white,
appBar: TitleAppBar( appBar: TitleAppBar(
barTitle: "${TranslationLoader.lanKeys!.addTip!.tr}${TranslationLoader.lanKeys!.face!.tr}", barTitle:
"${TranslationLoader.lanKeys!.addTip!.tr}${TranslationLoader.lanKeys!.face!.tr}",
haveBack: true, haveBack: true,
backgroundColor: AppColors.mainColor), backgroundColor: AppColors.mainColor),
body: ListView( body: ListView(
// mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SizedBox( SizedBox(
height: 50.h, height: 50.h,
), ),
Image.asset( Image.asset(
'images/main/icon_main_addFace.png', 'images/main/icon_addFace_step1.png',
width: 100.w, width: 100.w,
height: 457.h, height: 457.h,
fit: BoxFit.fitHeight, fit: BoxFit.fitHeight,
@ -48,9 +49,8 @@ class _AddFaceTipPageState extends State<AddFaceTipPage> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
"请单人正对门锁,距离一个成年人手臂长度(约0.6米).\n保持脸部无遮挡,露出五官", "请单人正对门锁,距离一个成年人手臂长度\n(约0.6米)。\n保持脸部无遮挡,露出五官。",
// TranslationLoader.lanKeys!.lightTouchScreenTip!.tr, textAlign: TextAlign.left,
textAlign: TextAlign.center,
maxLines: null, maxLines: null,
style: style:
TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600), TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
@ -62,15 +62,32 @@ class _AddFaceTipPageState extends State<AddFaceTipPage> {
SizedBox( SizedBox(
height: 120.h, height: 120.h,
), ),
Container( Obx(
padding: EdgeInsets.only(left: 20.w, right: 20.w), () => state.isClickAddFace.value == false
child: SubmitBtn( ? Container(
btnName: "开始添加", //TranslationLoader.lanKeys!.next!.tr, padding: EdgeInsets.only(left: 20.w, right: 20.w),
borderRadius: 20.w, child: SubmitBtn(
onClick: () { btnName:
EasyLoading.showToast("请确保在设备附近,设备未被连接,设备已打开", duration: 2000.milliseconds); "准备好了,开始添加", //TranslationLoader.lanKeys!.next!.tr,
}), borderRadius: 20.w,
), onClick: () {
state.isClickAddFace.value = true;
logic.senderAddFace();
}),
)
: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'正在录入中...',
style: TextStyle(
color: AppColors.darkGrayTextColor,
fontSize: 22.sp),
textAlign: TextAlign.center,
)
],
),
)
], ],
), ),
); );

View File

@ -0,0 +1,35 @@
import 'package:get/get.dart';
class AddFaceState {
var ifCurrentScreen = true.obs; // ,
var ifConnectScuess = false.obs;
var maxRegCount = 0.obs; //
var regIndex = 0.obs; //
var faceNumber = "".obs;
final lockId = 0.obs;
final endDate = 0.obs;
final addType = "".obs;
final faceName = "".obs;
final faceType = 0.obs;
final startDate = 0.obs;
final cyclicConfig = [].obs;
final fromType = 1.obs;
final featureData = ''.obs;
final isClickAddFace = false.obs;
AddFaceState() {
Map map = Get.arguments;
lockId.value = map["lockId"];
endDate.value = map["endDate"];
addType.value = map["addType"];
faceName.value = map["faceName"];
faceType.value = map["faceType"];
startDate.value = map["startDate"];
lockId.value = map["lockId"];
cyclicConfig.value = map["cyclicConfig"];
fromType.value = map["fromType"];
}
}

View File

@ -1,8 +1,96 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/face/addFaceType/addFaceType_state.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'addFaceType_state.dart'; import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart';
class AddFaceTypeLogic extends BaseGetXController{ class AddFaceTypeLogic extends BaseGetXController {
AddFaceTypeState state = AddFaceTypeState(); AddFaceTypeState state = AddFaceTypeState();
//
void addFaceData() async {
var faceType = 0; // :1;23:4
var startDate = "";
var endDate = "";
if (state.seletType.value == "0") {
faceType = 1;
startDate = "0";
endDate = "0";
} else if (state.seletType.value == "1") {
faceType = 2;
if (state.beginTimeTimestamp.value.isEmpty) {
showToast("请选择开始时间");
return;
}
if (state.endTimeTimestamp.value.isEmpty) {
showToast("请选择结束时间");
return;
}
// if(DateTime.now().millisecondsSinceEpoch > int.parse(state.beginTimeTimestamp.value)){
// Toast.show(msg: "生效时间要大于当前时间");
// return;
// }
if (int.parse(state.beginTimeTimestamp.value) >=
int.parse(state.endTimeTimestamp.value)) {
showToast("失效时间要大于生效时间");
return;
}
startDate = state.beginTimeTimestamp.value;
endDate = state.endTimeTimestamp.value;
} else if (state.seletType.value == "2") {
if (state.effectiveDateTime.value <= 0) {
showToast("请选择生效时间");
return;
}
if (state.failureDateTime.value <= 0) {
showToast("请选择失效时间");
return;
}
if (state.weekdaysList.value.isEmpty) {
showToast("请选择有效日");
return;
}
// if(DateTime.now().millisecondsSinceEpoch >= state.effectiveDateTime.value){
// Toast.show(msg: "生效时间要大于当前时间");
// return;
// }
if (state.effectiveDateTime.value >= state.failureDateTime.value) {
showToast("失效时间要大于生效时间");
return;
}
startDate = state.effectiveDateTime.value.toString();
endDate = state.failureDateTime.value.toString();
faceType = 4;
}
//
Get.toNamed(Routers.addFacePage, arguments: {
"lockId": state.lockId.value,
"endDate": int.parse(endDate),
"addType": "1",
"faceName": state.nameController.text,
"faceNumber": "123456",
"faceType": faceType,
"startDate": int.parse(startDate),
"cyclicConfig": state.weekdaysList.value,
"fromType": state.fromType.value,
});
}
//
void checkFaceNameDuplicated(String faceName) async {
var entity = await ApiRepository.to.checkFaceNameDuplicatedData(
lockId: state.lockId.value.toString(),
faceName: faceName,
);
if (entity.errorCode!.codeIsSuccessful) {
addFaceData();
}
}
} }

View File

@ -181,8 +181,7 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> {
logic.showToast("请输入姓名"); logic.showToast("请输入姓名");
return; return;
} }
logic.checkFaceNameDuplicated(state.nameController.text);
Get.toNamed(Routers.addFaceTipPage);
} else { } else {
// Get.toNamed(Routers.seletLockTypePage); // Get.toNamed(Routers.seletLockTypePage);
logic.showToast("演示模式"); logic.showToast("演示模式");
@ -293,19 +292,4 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> {
), ),
); );
} }
//isStressFingerprint false: ture:
CupertinoSwitch _isStressFingerprint() {
return CupertinoSwitch(
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: true,
onChanged: (value) {
setState(() {
// state.isStressFingerprint.value = value;
});
},
);
}
} }

View File

@ -1,16 +1,25 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
class AddFaceTypeState{ class AddFaceTypeState {
var beginTime = "".obs;// final lockId = 0.obs;
var endTime = "".obs;// final seletType = "0".obs; // 0 1 2
var beginTimeTimestamp = "".obs;// final fromType = 1.obs; // // 1 2
var endTimeTimestamp = "".obs;// final isStressFingerprint = false.obs;
var effectiveDateTime = 0.obs;// var beginTime = "".obs; //
var failureDateTime = 0.obs;// var endTime = "".obs; //
var beginTimeTimestamp = "".obs; //
var endTimeTimestamp = "".obs; //
var effectiveDateTime = 0.obs; //
var failureDateTime = 0.obs; //
var weekdaysList = [].obs; var weekdaysList = [].obs;
final TextEditingController nameController = TextEditingController(); final TextEditingController nameController = TextEditingController();
AddFaceTypeState() {
Map map = Get.arguments;
lockId.value = map["lockId"];
fromType.value = map["fromType"];
}
} }

View File

@ -0,0 +1,193 @@
import 'dart:async';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:get/get.dart';
import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/main/lockDetail/face/faceDetail/faceDetail_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_addFingerprint.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/storage.dart';
class FaceDetailLogic extends BaseGetXController {
FaceDetailState state = FaceDetailState();
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
// ()
if ((reply is SenderAddFingerprintReply)) {
_replyAddFingerprintBegin(reply);
}
});
}
//
Future<void> _replyAddFingerprintBegin(Reply reply) async {
int status = reply.data[2];
print("status:$status");
switch (status) {
case 0x00:
//
print("${reply.commandType!.typeValue} 数据解析成功");
state.sureBtnState.value = 0;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
deletFingerprintsData();
break;
case 0x06:
//
print("${reply.commandType!.typeValue} 需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
String? userID = await Storage.getUid();
IoSenderManage.senderAddFingerprintCommand(
keyID: state.keyId.value.toString(),
userID: userID,
fingerNo: int.parse(state.typeNumber.value),
useCountLimit: 0,
startTime: state.effectiveDateTime.value,
endTime: state.failureDateTime.value,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
);
break;
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} 失败");
break;
}
}
//
Future<void> senderAddFingerprint() async {
if (state.sureBtnState.value == 1) {
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected) {
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
String? userID = await Storage.getUid();
IoSenderManage.senderAddFingerprintCommand(
keyID: state.keyId.value.toString(),
userID: userID,
fingerNo: int.parse(state.typeNumber.value),
useCountLimit: 0,
startTime: state.effectiveDateTime.value,
endTime: state.failureDateTime.value,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
);
} else if (deviceConnectionState == DeviceConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
}
});
}
//
void deletFingerprintsData() async {
var entity = await ApiRepository.to.deletFingerprintsData(
fingerprintId: state.faceItemData.value.faceId.toString(),
lockId: state.faceItemData.value.lockId.toString(),
type: "0",
deleteType: "1");
if (entity.errorCode!.codeIsSuccessful) {
showToast("删除成功", something: () {
Get.back(result: "addScuess");
});
}
}
//
void editFingerprintsData() async {
var entity = await ApiRepository.to.editFingerprintsData(
fingerprintId: state.keyId.value.toString(),
lockId: state.faceItemData.value.lockId.toString(),
weekDay: state.weekDay.value,
startDate: state.effectiveDateTime.value.toString(),
endDate: state.failureDateTime.value.toString(),
isCoerced: state.isStressFingerprint.value ? "2" : "1",
fingerprintName: state.changeNameController.text,
changeType: "1",
);
if (entity.errorCode!.codeIsSuccessful) {
showToast("修改成功", something: () {
Get.back(result: "addScuess");
});
}
}
@override
void onReady() {
// TODO: implement onReady
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
@override
void onClose() {
// TODO: implement onClose
super.onClose();
_replySubscription.cancel();
}
}

View File

@ -0,0 +1,374 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/face/faceDetail/faceDetail_logic.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/commonItem.dart';
import '../../../../tools/dateTool.dart';
import '../../../../tools/showIosTipView.dart';
import '../../../../tools/showTFView.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart';
class FaceDetailPage extends StatefulWidget {
const FaceDetailPage({Key? key}) : super(key: key);
@override
State<FaceDetailPage> createState() => _FingerprintDetailPageState();
}
class _FingerprintDetailPageState extends State<FaceDetailPage>
with RouteAware {
final logic = Get.put(FaceDetailLogic());
final state = Get.find<FaceDetailLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: "指纹详情",
haveBack: true,
backgroundColor: AppColors.mainColor,
// actionsList: [
// TextButton(
// child: Text(TranslationLoader.lanKeys!.share!.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp),),
// onPressed: () {
//
// },
// ),
// ],
),
body: Column(
children: [
Obx(() => CommonItem(
leftTitel:
"${TranslationLoader.lanKeys!.fingerprint!.tr}${TranslationLoader.lanKeys!.number!.tr}",
rightTitle: state.typeNumber.value,
isHaveDirection: false,
isHaveLine: true)),
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.name!.tr,
rightTitle: state.typeName.value,
isHaveDirection: true,
isHaveLine: true,
action: () {
showCupertinoAlertDialog(context);
})),
Obx(() => Visibility(
visible: (state.keyType.value == 4 || state.keyType.value == 2)
? true
: false,
child: CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
allHeight: 70.h,
// rightTitle:"2023.09.19 11:27\n2023.09.25 11:27",
rightTitle: state.keyType.value == 1
? "永久"
: "${DateTool().dateToYMDHNString(state.effectiveDateTime.value.toString())}\n${DateTool().dateToYMDHNString(state.failureDateTime.value.toString())}",
isHaveDirection: true,
isHaveLine: true,
action: () async {
// switch(state.type.value){
// case 0:
// //
//
// break;
// case 1:
//
if (state.keyType.value == 2) {
//
var data = await Get.toNamed(
Routers.otherTypeKeyChangeDatePage,
arguments: {
"fingerprintItemData": state.faceItemData.value,
"pushType": 1,
});
if (data != null) {
setState(() {
state.effectiveDateTime.value =
data["beginTimeTimestamp"];
state.failureDateTime.value =
data["endTimeTimestamp"];
});
}
} else if (state.keyType.value == 4) {
//
var data = await Get.toNamed(
Routers.otherTypeKeyChangeValidityDatePage,
arguments: {
"fingerprintItemData": state.faceItemData.value,
});
if (data != null) {
setState(() {
state.effectiveDateTime.value =
data["beginTimeTimestamp"];
state.failureDateTime.value =
data["endTimeTimestamp"];
state.weekDay.value = data["weekDay"];
});
}
}
}))),
Obx(() => Visibility(
visible: state.keyType.value == 4 ? true : false,
child: Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr,
rightTitle: state.weekDay.value.join(','),
isHaveDirection: true,
action: () async {
//
var data = await Get.toNamed(
Routers.otherTypeKeyChangeValidityDatePage,
arguments: {
"fingerprintItemData": state.faceItemData.value,
});
if (data != null) {
setState(() {
state.effectiveDateTime.value =
data["beginTimeTimestamp"];
state.failureDateTime.value = data["endTimeTimestamp"];
state.weekDay.value = data["weekDay"];
});
}
})))),
Container(height: 10.h),
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.additive!.tr,
rightTitle: state.adder.value,
isHaveLine: true,
action: () {})),
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.addTime!.tr,
rightTitle:
DateTool().dateToYMDHNString(state.addTime.value.toString()),
action: () {})),
SizedBox(height: 10.h),
Container(height: 10.h),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.operatingRecord!.tr,
rightTitle: "",
isHaveDirection: true,
action: () {
//
Get.toNamed(Routers.keyOperationRecordPage, arguments: {
'lockId': state.faceItemData.value.lockId.toString(),
'faceId': state.faceItemData.value.faceId.toString()
});
}),
// SizedBox(height: 40.h),
// addControlsBtn(type),
SizedBox(height: 30.h),
SubmitBtn(
btnName: TranslationLoader.lanKeys!.delete!.tr,
isDelete: true,
borderRadius: 20.w,
margin: EdgeInsets.only(
left: 30.w, right: 30.w, top: 30.w, bottom: 30.w),
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
onClick: () {
showIosTipViewDialog(context);
}),
],
),
);
}
// Widget addControlsBtn(int type) {
// List<Widget> widgetList = [];
// List<Map<String, dynamic>> routerList = [];
// //
// if (type == 0) {
// routerList.add({
// 'btnTitle': '设置密码',
// 'routerName': Routers.passwordKeyDetailPage,
// 'type': 9
// });
// routerList.add({
// 'btnTitle': '设置指纹',
// 'routerName': Routers.otherTypeKeyManagePage,
// 'type': 1
// });
// routerList.add({
// 'btnTitle': '设置遥控',
// 'routerName': Routers.otherTypeKeyManagePage,
// 'type': 2
// });
// } else if (type == 1) {
// //
// routerList.add({
// 'btnTitle': '设置密码',
// 'routerName': Routers.passwordKeyDetailPage,
// 'type': 9
// });
// routerList.add({
// 'btnTitle': '设置卡',
// 'routerName': Routers.otherTypeKeyManagePage,
// 'type': 0
// });
// routerList.add({
// 'btnTitle': '设置遥控',
// 'routerName': Routers.otherTypeKeyManagePage,
// 'type': 2
// });
// } else if (type == 2) {
// //
// routerList.add({
// 'btnTitle': '设置密码',
// 'routerName': Routers.passwordKeyDetailPage,
// 'type': 9
// });
// routerList.add({
// 'btnTitle': '设置卡',
// 'routerName': Routers.otherTypeKeyManagePage,
// 'type': 0
// });
// routerList.add({
// 'btnTitle': '设置指纹',
// 'routerName': Routers.otherTypeKeyManagePage,
// 'type': 1
// });
// }
//
// for (int i = 0; i < routerList.length; i++) {
// widgetList.add(SizedBox(
// width: ScreenUtil().screenWidth - 40.w,
// height: 60.h,
// child: OutlinedButton(
// style: OutlinedButton.styleFrom(
// // backgroundColor: Colors.white,
// side: BorderSide(width: 1, color: AppColors.mainColor)),
// onPressed: () {
// if (routerList[i]['type'] == 9) {
// Navigator.pushNamed(context, Routers.passwordKeyManagePage);
// } else {
// Navigator.pushNamed(context, Routers.otherTypeKeyManagePage,
// arguments: routerList[i]['type']);
// }
// },
// child: Text(
// routerList[i]['btnTitle'],
// style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
// )),
// ));
//
// widgetList.add(
// SizedBox(
// height: 10.h,
// ),
// );
// }
//
// return Column(
// children: widgetList,
// );
// }
void showCupertinoAlertDialog(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return ShowTFView(
title:
"${TranslationLoader.lanKeys!.amend!.tr}${TranslationLoader.lanKeys!.name!.tr}",
tipTitle: "",
controller: state.changeNameController,
sureClick: () {
if (state.changeNameController.text.isEmpty) {
logic.showToast("请输入姓名");
return;
}
Get.back();
//
logic.editFingerprintsData();
},
cancelClick: () {
Get.back();
},
);
});
}
void showIosTipViewDialog(BuildContext context) {
showDialog(
context: context,
builder: (BuildContext context) {
return ShowIosTipView(
title: "提示",
tipTitle: "确定要删除吗?",
sureClick: () {
Get.back();
//
logic.senderAddFingerprint();
},
cancelClick: () {
Get.back();
},
);
});
}
@override
void didChangeDependencies() {
// TODO: implement didChangeDependencies
super.didChangeDependencies();
///
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
// TODO: implement dispose
///
AppRouteObserver().routeObserver.unsubscribe(this);
super.dispose();
}
///
@override
void didPush() {
super.didPush();
print("lockSet===didPush");
state.ifCurrentScreen.value = true;
}
///
@override
void didPop() {
super.didPop();
print("lockSet===didPop");
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
BlueManage().stopScan();
state.ifCurrentScreen.value = false;
state.sureBtnState.value = 0;
}
///
@override
void didPopNext() {
super.didPopNext();
print("lockSet===didPopNext");
state.ifCurrentScreen.value = true;
}
///
@override
void didPushNext() {
super.didPushNext();
print("lockSet===didPushNext");
logic.cancelBlueConnetctToastTimer();
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
BlueManage().stopScan();
state.ifCurrentScreen.value = false;
state.sureBtnState.value = 0;
}
}

View File

@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart';
class FaceDetailState {
final faceItemData = FaceItemData().obs;
final TextEditingController changeNameController = TextEditingController();
final typeNumber = "".obs; //
final typeName = "".obs; //
var effectiveDateTime = 0.obs; //
var failureDateTime = 0.obs; //
final keyType = 0.obs; // :1;23:4
var weekDay = [].obs; //
var adder = "".obs; //
var addTime = 0.obs; //
var keyId = 0.obs;
var ifCurrentScreen = true.obs; // ,
var sureBtnState = 0.obs; // 0() 1()
final isStressFingerprint = false.obs;
FaceDetailState() {
Map map = Get.arguments;
faceItemData.value = map["faceItemData"];
keyId.value = faceItemData.value.faceId!;
typeNumber.value = faceItemData.value.faceNumber!;
typeName.value = faceItemData.value.faceName!;
changeNameController.text = typeName.value;
effectiveDateTime.value = faceItemData.value.startDate!;
failureDateTime.value = faceItemData.value.endDate!;
keyType.value = faceItemData.value.faceType!;
adder.value = faceItemData.value.senderUsername!;
addTime.value = faceItemData.value.createDate!;
weekDay.value = faceItemData.value.cyclicConfig!;
}
}

View File

@ -0,0 +1,131 @@
class FaceListDataEntity {
int? errorCode;
String? description;
String? errorMsg;
Data? data;
FaceListDataEntity(
{this.errorCode, this.description, this.errorMsg, this.data});
FaceListDataEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
return data;
}
}
class Data {
List<FaceItemData>? list;
int? pageNo;
int? pageSize;
int? pages;
int? total;
Data({this.list, this.pageNo, this.pageSize, this.pages, this.total});
Data.fromJson(Map<String, dynamic> json) {
if (json['list'] != null) {
list = <FaceItemData>[];
json['list'].forEach((v) {
list!.add(FaceItemData.fromJson(v));
});
}
pageNo = json['pageNo'];
pageSize = json['pageSize'];
pages = json['pages'];
total = json['total'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (list != null) {
data['list'] = list!.map((v) => v.toJson()).toList();
}
data['pageNo'] = pageNo;
data['pageSize'] = pageSize;
data['pages'] = pages;
data['total'] = total;
return data;
}
}
class FaceItemData {
int? lockId;
int? faceId;
String? faceName;
String? faceNumber;
int? startDate;
int? endDate;
int? status;
int? addType;
int? faceType;
List? cyclicConfig;
String? featureData;
int? createDate;
String? senderUsername;
String? validTimeStr;
FaceItemData(
{this.lockId,
this.faceId,
this.faceName,
this.faceNumber,
this.startDate,
this.endDate,
this.status,
this.addType,
this.faceType,
this.cyclicConfig,
this.featureData,
this.createDate,
this.senderUsername,
this.validTimeStr});
FaceItemData.fromJson(Map<String, dynamic> json) {
lockId = json['lockId'];
faceId = json['faceId'];
faceName = json['faceName'];
faceNumber = json['faceNumber'];
startDate = json['startDate'];
endDate = json['endDate'];
status = json['status'];
addType = json['addType'];
faceType = json['faceType'];
cyclicConfig = json['cyclicConfig'];
featureData = json['featureData'];
createDate = json['createDate'];
senderUsername = json['senderUsername'];
validTimeStr = json['validTimeStr'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['lockId'] = lockId;
data['faceId'] = faceId;
data['faceName'] = faceName;
data['faceNumber'] = faceNumber;
data['startDate'] = startDate;
data['endDate'] = endDate;
data['status'] = status;
data['addType'] = addType;
data['faceType'] = faceType;
data['cyclicConfig'] = cyclicConfig;
data['featureData'] = featureData;
data['createDate'] = createDate;
data['senderUsername'] = senderUsername;
data['validTimeStr'] = validTimeStr;
return data;
}
}

View File

@ -1,8 +1,427 @@
import 'dart:async';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:star_lock/blue/io_protocol/io_addFace.dart';
import 'package:star_lock/blue/io_protocol/io_queryingFaceStatus.dart';
import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/main/lockDetail/face/faceList/faceList_state.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'faceList_state.dart'; import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_checkingUserInfoCount.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/eventBusEventManage.dart';
import '../../../../tools/storage.dart';
class FaceListLogic extends BaseGetXController{ class FaceListLogic extends BaseGetXController {
FaceListState state = FaceListState(); FaceListState state = FaceListState();
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
// ()
if ((reply is SenderAddFaceReply) && (state.isDeletFaceData == true)) {
_replyAddFaceBegin(reply);
}
if (reply is SenderQueryingFaceStatusReply) {
//
_replyQueryingFaceStatus(reply);
}
if (reply is SenderCheckingUserInfoCountReply) {
_replyCheckingUserInfoCount(reply);
}
});
}
// ---
Future<void> _replyAddFaceBegin(Reply reply) async {
int status = reply.data[2];
print("status:$status");
switch (status) {
case 0x00:
//
print("${reply.commandType!.typeValue} list人脸数据解析成功");
state.isDeletFaceData = false;
cancelBlueConnetctToastTimer();
dismissEasyLoading();
deletAllFacesData();
break;
case 0x06:
//
print("${reply.commandType!.typeValue} 需要鉴权");
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderAddFaceCommand(
keyID: state.deletKeyID,
userID: state.deletUserID,
faceNo: state.deletFaceNo,
useCountLimit: 0,
startTime: 0x11223344,
endTime: 0x11223344,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
);
break;
case 0x07:
//
print("${reply.commandType!.typeValue} 用户无权限");
break;
case 0x09:
//
print("${reply.commandType!.typeValue} 权限校验错误");
break;
default:
//
print("${reply.commandType!.typeValue} list人脸失败");
break;
}
}
//
Future<void> _replyQueryingFaceStatus(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> _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> _replyCheckingUserInfoCount(Reply reply) async {
int status = reply.data[2];
//
int userNum = reply.data[5];
// print("userNum:$userNum");
//
int fingerNum = reply.data[6];
// print("fingerNum:$fingerNum");
//
int pwdNum = reply.data[7];
//
int cardNum = reply.data[8];
//
int logsNum = reply.data[9];
//
int verNo = reply.data[10];
//
int maxAdminFingerNum = reply.data[11];
//
int maxUserFingerNum = reply.data[12];
//
int maxAdminPassNum = reply.data[13];
//
int maxUserPassNum = reply.data[14];
//
int maxAdminCardNum = reply.data[15];
//
int maxUserCardNum = reply.data[16];
//
var serialNo = reply.data.sublist(17, 21);
print("serialNo:$serialNo");
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> senderQueryingFaceStatus() 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!);
IoSenderManage.senderQueryingFaceStatusCommand(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
role: 0xff,
fingerCount: 20,
fingerNo: 1,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList,
);
}
});
}
// ()
Future<void> senderCheckingUserInfoCount() 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!);
IoSenderManage.senderCheckingUserInfoCountCommand(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
role: 0xff,
nowTime: DateTime.now().millisecondsSinceEpoch ~/ 1000,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList,
);
}
});
}
//
Future<void> senderAddFace() async {
showEasyLoading();
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
});
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected) {
var publicKey = await Storage.getStringList(saveBluePublicKey);
List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderAddFaceCommand(
keyID: state.deletKeyID,
userID: state.deletUserID,
faceNo: state.deletFaceNo,
useCountLimit: 0,
startTime: 0x11223344,
endTime: 0x11223344,
needAuthor: 1,
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
);
} else if (deviceConnectionState == DeviceConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
}
});
}
//
void getFaceListData() async {
var entity = await ApiRepository.to.getFaceListData(
lockId: state.lockId.value.toString(),
pageNo: '1',
pageSize: '20',
searchStr: state.searchController.text,
);
if (entity.errorCode!.codeIsSuccessful) {
state.faceItemListData.value = entity.data!.list!;
}
}
//
void deletAllFacesData() async {
var fingerprintId = "";
var type = "1";
if (state.isDeletAll == false) {
fingerprintId = state.deletKeyID;
type = "0";
}
print("delet fingerprintId $fingerprintId");
var entity = await ApiRepository.to.deletFingerprintsData(
fingerprintId: fingerprintId,
lockId: state.lockId.value.toString(),
type: type,
deleteType: "1");
if (entity.errorCode!.codeIsSuccessful) {
if (state.isDeletAll == false) {
showToast("删除成功");
} else {
showToast("重置成功");
}
state.isDeletFaceData = false;
getFaceListData();
}
}
//
late StreamSubscription _teamEvent;
void _initRefreshAction() {
_teamEvent = eventBus.on<OtherTypeRefreshListEvent>().listen((event) {
getFaceListData();
});
}
@override
Future<void> onReady() async {
// TODO: implement onReady
super.onReady();
print("onReady()");
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
// print("aaaaaaa:$isDemoMode");
if (isDemoMode == false) {
_initReplySubscription();
_initRefreshAction();
getFaceListData();
}
}
@override
Future<void> onInit() async {
// TODO: implement onInit
super.onInit();
print("onInit()");
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
// senderQueryingFingerprintStatus();
// senderCheckingCardStatus();
// senderCheckingUserInfoCount();
}
}
@override
Future<void> onClose() async {
// TODO: implement onClose
super.onClose();
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_replySubscription.cancel();
_teamEvent.cancel();
}
}
} }

View File

@ -1,8 +1,10 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart';
import 'package:star_lock/tools/keySearchWidget.dart';
import 'package:star_lock/tools/left_slide_actions.dart';
import '../../../../appRouters.dart'; import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart'; import '../../../../app_settings/app_colors.dart';
@ -53,86 +55,99 @@ class _FaceListState extends State<FaceList> {
), ),
body: Column( body: Column(
children: [ children: [
_searchWidget(), KeySearchWidget(
editingController: state.searchController,
onSubmittedAction: () {
logic.getFaceListData();
},
),
SizedBox( SizedBox(
height: 20.h, height: 20.h,
), ),
Expanded(child: _buildMainUI()), Expanded(child: _buildMainUI()),
AddBottomWhiteBtn( AddBottomWhiteBtn(
btnName: btnName:
'${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.face!.tr}', '${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.face!.tr}',
onClick: () async { onClick: () async {
var data = var data =
await Get.toNamed(Routers.addFaceTypeManagePage); await Get.toNamed(Routers.addFaceTypeManagePage, arguments: {
"lockId": state.lockId.value,
"fromType": 1 // 1 2
});
if (data != null) { if (data != null) {
// logic.getFaceListData();
} }
}, },
), ),
SizedBox( SizedBox(height: 64.h)
height: 64.h,
)
], ],
), ),
); );
} }
Widget _searchWidget() {
return Container(
height: 60.h,
margin: EdgeInsets.only(top: 20.w, left: 20.w, right: 10.w),
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(5)),
child: TextField(
//
maxLines: 1,
controller: state.searchController,
autofocus: false,
onChanged: (value) {
print("onChanged:$value");
},
onEditingComplete: () {
print("onEditingComplete:");
},
onSubmitted: (value) {
//
},
decoration: InputDecoration(
//
contentPadding: const EdgeInsets.only(
top: 12.0, left: -19.0, right: -15.0, bottom: 8.0),
hintText: TranslationLoader.lanKeys!.pleaseEnter!.tr,
hintStyle: TextStyle(fontSize: 22.sp, height: 3.0),
//线
border: InputBorder.none,
//
icon: Padding(
padding: EdgeInsets.only(
top: 20.h, bottom: 20.h, right: 20.w, left: 10.w),
child: Image.asset(
'images/main/icon_main_search.png',
width: 40.w,
height: 40.w,
),
),
),
),
);
}
Widget _buildMainUI() { Widget _buildMainUI() {
String typeImgName = 'images/icon_card.png'; {
return Obx(() => state.faceItemListData.value.isNotEmpty
return const NoData(); ? ListView.separated(
itemCount: state.faceItemListData.value.length,
itemBuilder: (c, index) {
FaceItemData getFaceItemData =
state.faceItemListData.value[index];
//
if (index < state.faceItemListData.value.length) {
return LeftSlideActions(
key: Key(getFaceItemData.faceName!),
actionsWidth: 60,
actions: [
_buildDeleteBtn(getFaceItemData),
],
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(1)),
),
child: _keyItem(
'images/icon_fingerprint.png',
getFaceItemData.faceName!,
(getFaceItemData.faceType! != 1)
? (getFaceItemData.endDate! <
DateTime.now().millisecondsSinceEpoch
? "已失效"
: "")
: "",
getFaceItemData.validTimeStr!,
// fingerprintItemData.fingerprintType! == 1
// ? "永久"
// : "${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())}",
() async {
var data =
await Get.toNamed(Routers.faceDetailPage, arguments: {
"faceItemData": getFaceItemData,
});
if (data != null) {
logic.getFaceListData();
}
}),
);
}
return const SizedBox.shrink();
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
)
: const NoData());
}
} }
Widget _buildDeleteBtn(String idStr) { Widget _buildDeleteBtn(FaceItemData faceItemData) {
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
// : // :
showIosTipViewDialog(context, idStr); state.deletKeyID = faceItemData.faceId.toString();
state.deletFaceNo = int.parse(faceItemData.faceNumber!);
showIosTipViewDialog(context);
}, },
child: Container( child: Container(
width: 60, width: 60,
@ -151,7 +166,7 @@ class _FaceListState extends State<FaceList> {
); );
} }
void showIosTipViewDialog(BuildContext context, String keyId) { void showIosTipViewDialog(BuildContext context) {
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
@ -159,8 +174,11 @@ class _FaceListState extends State<FaceList> {
title: "提示", title: "提示",
tipTitle: "确定要删除吗?", tipTitle: "确定要删除吗?",
sureClick: () async { sureClick: () async {
// Get.back();
state.isDeletFaceData = true;
state.isDeletAll = false;
state.deletUserID = (await Storage.getUid())!;
logic.senderAddFace();
}, },
cancelClick: () { cancelClick: () {
Get.back(); Get.back();
@ -170,8 +188,8 @@ class _FaceListState extends State<FaceList> {
); );
} }
Widget _keyItem(String lockTypeIcon, String lockTypeTitle, String showTime, Widget _keyItem(String lockTypeIcon, String lockTypeTitle,
Function() action) { String ifInvalidation, String showTime, Function() action) {
return GestureDetector( return GestureDetector(
onTap: action, onTap: action,
child: Container( child: Container(
@ -192,24 +210,26 @@ class _FaceListState extends State<FaceList> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.start, // mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text(lockTypeTitle, Text(lockTypeTitle,
style: TextStyle( style: TextStyle(
fontSize: 24.sp, color: AppColors.blackColor)), fontSize: 24.sp, color: AppColors.blackColor)),
Expanded(child: Container()),
Text(ifInvalidation,
style: TextStyle(fontSize: 22.sp, color: Colors.red)),
SizedBox(width: 10.w),
], ],
), ),
SizedBox(height: 5.h), SizedBox(height: 5.h),
Container( Row(
child: Row( mainAxisAlignment: MainAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, children: [
children: [ Text(showTime,
Text(showTime, style: TextStyle(
style: TextStyle( fontSize: 18.sp,
fontSize: 18.sp, color: AppColors.placeholderTextColor)),
color: AppColors.placeholderTextColor)), ],
],
),
), ),
SizedBox(width: 20.h), SizedBox(width: 20.h),
], ],
@ -222,13 +242,13 @@ class _FaceListState extends State<FaceList> {
); );
} }
void showDeletAlertDialog(BuildContext context,) { void showDeletAlertDialog(BuildContext context) {
showCupertinoDialog( showCupertinoDialog(
context: context, context: context,
builder: (context) { builder: (context) {
return CupertinoAlertDialog( return CupertinoAlertDialog(
title: const Text("提示"), title: const Text("提示"),
content: const Text('重置后信息都会清除哦,确认要重置吗?'), content: const Text('重置后,该锁的人脸都将被删除哦,确认要重置吗?'),
actions: [ actions: [
CupertinoDialogAction( CupertinoDialogAction(
child: Text(TranslationLoader.lanKeys!.cancel!.tr), child: Text(TranslationLoader.lanKeys!.cancel!.tr),
@ -239,8 +259,13 @@ class _FaceListState extends State<FaceList> {
CupertinoDialogAction( CupertinoDialogAction(
child: Text(TranslationLoader.lanKeys!.sure!.tr), child: Text(TranslationLoader.lanKeys!.sure!.tr),
onPressed: () { onPressed: () {
// Navigator.pop(context);
state.isDeletFaceData = true;
state.isDeletAll = true;
state.deletKeyID = "1";
state.deletUserID = "DeleteAll!@#";
state.deletFaceNo = 255;
logic.senderAddFace();
}, },
), ),
], ],

View File

@ -1,6 +1,24 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart';
class FaceListState{ class FaceListState {
final TextEditingController searchController = TextEditingController(); final TextEditingController searchController = TextEditingController();
final lockId = 0.obs;
//
var isDeletFaceData = false;
var isDeletAll = false;
var deletKeyID = "";
var deletUserID = "DeleteAll!@#";
var deletFaceNo = 0;
final faceItemListData = <FaceItemData>[].obs;
var ifCurrentScreen = true.obs; // ,
FaceListState() {
Map map = Get.arguments;
lockId.value = map["lockId"];
}
} }

View File

@ -105,6 +105,11 @@ abstract class Api {
final String checkFingerprintNameURL = final String checkFingerprintNameURL =
'/fingerprint/checkFingerprintName'; // '/fingerprint/checkFingerprintName'; //
final String getFaceListURL = '/face/list'; //
final String addFaceURL = '/face/add'; //
final String checkFaceNameURL = '/face/checkFaceName'; //
final String updateFaceUserNoURL = '/face/updateFaceUserNo'; //
final String getICCardListURL = '/identityCard/list'; // IC卡列表 final String getICCardListURL = '/identityCard/list'; // IC卡列表
final String addICCardURL = '/identityCard/add'; // IC卡 final String addICCardURL = '/identityCard/add'; // IC卡
final String editICCardURL = '/identityCard/update'; // IC卡 final String editICCardURL = '/identityCard/update'; // IC卡

View File

@ -169,9 +169,9 @@ class ApiProvider extends BaseProvider {
})); }));
Future<Response> modifyKeyName( Future<Response> modifyKeyName(
String keyId, String keyId,
String lockId, String lockId,
String keyName, String keyName,
) => ) =>
post( post(
modifyKeyNameURL.toUrl, modifyKeyNameURL.toUrl,
@ -261,7 +261,7 @@ class ApiProvider extends BaseProvider {
'lockId': lockId, 'lockId': lockId,
'records': records, 'records': records,
}), }),
isUnShowLoading:true); isUnShowLoading: true);
// //
Future<Response> getLockRecordLastUploadDataTime(String lockId) => post( Future<Response> getLockRecordLastUploadDataTime(String lockId) => post(
@ -346,10 +346,7 @@ class ApiProvider extends BaseProvider {
// //
Future<Response> deletOwnerKeyInfo(String lockId, String keyId) => post( Future<Response> deletOwnerKeyInfo(String lockId, String keyId) => post(
deleteElectronicKeyURL.toUrl, deleteElectronicKeyURL.toUrl,
jsonEncode({ jsonEncode({'lockId': lockId, 'keyId': keyId}));
'lockId': lockId,
'keyId': keyId
}));
// //
Future<Response> checkLoginPassword(String password) => post( Future<Response> checkLoginPassword(String password) => post(
@ -477,9 +474,9 @@ class ApiProvider extends BaseProvider {
// //
Future<Response> deleteGroup(int groupId) => post( Future<Response> deleteGroup(int groupId) => post(
lockDeletGroupURL.toUrl, lockDeletGroupURL.toUrl,
jsonEncode({ jsonEncode({
'groupId': groupId, 'groupId': groupId,
})); }));
// //
Future<Response> lockGroupAddLock(List lockIds, int groupId) => post( Future<Response> lockGroupAddLock(List lockIds, int groupId) => post(
@ -555,7 +552,8 @@ class ApiProvider extends BaseProvider {
/// ///
// //
Future<Response> setAutoUnlockLoadData(int lockId, int autoLock, int autoLockSecond) => Future<Response> setAutoUnlockLoadData(
int lockId, int autoLock, int autoLockSecond) =>
post( post(
updateLockSettingUrl.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
@ -565,7 +563,8 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> setLockSoundData(int lockId, int lockSound, int lockSoundVolume) => Future<Response> setLockSoundData(
int lockId, int lockSound, int lockSoundVolume) =>
post( post(
updateLockSettingUrl.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
@ -575,18 +574,16 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> setBurglarAlarmData( Future<Response> setBurglarAlarmData(int lockId, int antiPrySwitch) => post(
int lockId, int antiPrySwitch) => updateLockSettingUrl.toUrl,
post( jsonEncode({
updateLockSettingUrl.toUrl, 'lockId': lockId,
jsonEncode({ 'antiPrySwitch': antiPrySwitch,
'lockId': lockId, }));
'antiPrySwitch': antiPrySwitch,
}));
// //
Future<Response> setOpenDoorDirectionData( Future<Response> setOpenDoorDirectionData(
int lockId, int openDirectionValue) => int lockId, int openDirectionValue) =>
post( post(
updateLockSettingUrl.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
@ -595,7 +592,8 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> remoteUnlockingOpenOrCloseLoadData(int lockId, int remoteUnlock) => Future<Response> remoteUnlockingOpenOrCloseLoadData(
int lockId, int remoteUnlock) =>
post( post(
updateLockSettingUrl.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
@ -604,22 +602,20 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> setResetButtonData(int lockId, int resetSwitch) => Future<Response> setResetButtonData(int lockId, int resetSwitch) => post(
post( updateLockSettingUrl.toUrl,
updateLockSettingUrl.toUrl, jsonEncode({
jsonEncode({ 'lockId': lockId,
'lockId': lockId, 'resetSwitch': resetSwitch,
'resetSwitch': resetSwitch, }));
}));
// //
Future<Response> setCheckInData(int lockId, int resetSwitch) => Future<Response> setCheckInData(int lockId, int resetSwitch) => post(
post( updateLockSettingUrl.toUrl,
updateLockSettingUrl.toUrl, jsonEncode({
jsonEncode({ 'lockId': lockId,
'lockId': lockId, 'attendance': resetSwitch,
'attendance': resetSwitch, }));
}));
// //
Future<Response> setOpenLockNeedOnlineData(int lockId, int appUnlockOnline) => Future<Response> setOpenLockNeedOnlineData(int lockId, int appUnlockOnline) =>
@ -631,16 +627,16 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> setRoomStatusData(int lockId, int roomStatus) => Future<Response> setRoomStatusData(int lockId, int roomStatus) => post(
post( setRoomStatusURL.toUrl,
setRoomStatusURL.toUrl, jsonEncode({
jsonEncode({ 'lockId': lockId,
'lockId': lockId, 'roomStatus': roomStatus,
'roomStatus': roomStatus, }));
}));
// //
Future<Response> setNormallyModeData(int lockId, int passageMode, List passageModeConfig) => Future<Response> setNormallyModeData(
int lockId, int passageMode, List passageModeConfig) =>
post( post(
updateLockSettingUrl.toUrl, updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
@ -657,13 +653,12 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> setAdminPasswordData(int lockId, String adminPwd) => Future<Response> setAdminPasswordData(int lockId, String adminPwd) => post(
post( updateLockSettingUrl.toUrl,
updateLockSettingUrl.toUrl, jsonEncode({
jsonEncode({ 'lockId': lockId,
'lockId': lockId, 'adminPwd': adminPwd,
'adminPwd': adminPwd, }));
}));
// //
Future<Response> getServerDatetimeLoadData(String lockId) => post( Future<Response> getServerDatetimeLoadData(String lockId) => post(
@ -703,9 +698,9 @@ class ApiProvider extends BaseProvider {
})); }));
Future<Response> updateLockName( Future<Response> updateLockName(
String lockId, String lockId,
String lockName, String lockName,
) => ) =>
post( post(
updateLockNameURL.toUrl, updateLockNameURL.toUrl,
jsonEncode({ jsonEncode({
@ -741,8 +736,10 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> setLockPickingReminderData(int lockId, int unlockReminderPush) => Future<Response> setLockPickingReminderData(
post(updateLockSettingUrl.toUrl, int lockId, int unlockReminderPush) =>
post(
updateLockSettingUrl.toUrl,
jsonEncode({ jsonEncode({
'lockId': lockId, 'lockId': lockId,
'unlockReminderPush': unlockReminderPush, 'unlockReminderPush': unlockReminderPush,
@ -1015,15 +1012,62 @@ class ApiProvider extends BaseProvider {
// //
Future<Response> checkFingerprintNameDuplicatedData( Future<Response> checkFingerprintNameDuplicatedData(
String lockId, String lockId, String fingerprintName) =>
String fingerprintName) => post(checkFingerprintNameURL.toUrl,
jsonEncode({'lockId': lockId, 'fingerprintName': fingerprintName}));
//
Future<Response> getFaceListData(
String lockId, String pageNo, String pageSize, String searchStr) =>
post( post(
checkFingerprintNameURL.toUrl, getFaceListURL.toUrl,
jsonEncode({ jsonEncode({
'lockId': lockId, 'lockId': lockId,
'fingerprintName': fingerprintName 'pageNo': pageNo,
'pageSize': pageSize,
'searchStr': searchStr,
})); }));
//
Future<Response> addFaceData(
int lockId,
String faceName,
String faceNumber,
int faceType,
int startDate,
int endDate,
String featureData,
String addType,
List cyclicConfig,
) =>
post(
addFaceURL.toUrl,
jsonEncode({
'lockId': lockId,
'faceName': faceName,
'faceNumber': faceNumber,
'faceType': faceType,
'startDate': startDate,
'endDate': endDate,
'featureData': featureData,
'addType': addType,
'cyclicConfig': cyclicConfig,
}));
//
Future<Response> checkFaceNameDuplicatedData(
String lockId, String faceName) =>
post(checkFaceNameURL.toUrl,
jsonEncode({'lockId': lockId, 'faceName': faceName}));
//
Future<Response> updateFaceUserNoLoadData(
String faceId, String lockId, String faceUserNo) =>
post(
updateFaceUserNoURL.toUrl,
jsonEncode(
{'faceId': faceId, 'lockId': lockId, 'faceUserNo': faceUserNo}));
// IC卡列表 // IC卡列表
Future<Response> getICCardListData( Future<Response> getICCardListData(
String lockId, String pageNo, String pageSize, String searchStr) => String lockId, String pageNo, String pageSize, String searchStr) =>
@ -1063,8 +1107,15 @@ class ApiProvider extends BaseProvider {
})); }));
// ICCard // ICCard
Future<Response> editICCardData(String lockId, String cardId, String cardName, Future<Response> editICCardData(
String startDate, String endDate, String isCoerced, List weekDay, String changeType) => String lockId,
String cardId,
String cardName,
String startDate,
String endDate,
String isCoerced,
List weekDay,
String changeType) =>
post( post(
editICCardURL.toUrl, editICCardURL.toUrl,
jsonEncode({ jsonEncode({
@ -1100,14 +1151,9 @@ class ApiProvider extends BaseProvider {
// //
Future<Response> checkCardNameDuplicatedData( Future<Response> checkCardNameDuplicatedData(
String lockId, String lockId, String cardName) =>
String cardName) => post(checkCardNameURL.toUrl,
post( jsonEncode({'lockId': lockId, 'cardName': cardName}));
checkCardNameURL.toUrl,
jsonEncode({
'lockId': lockId,
'cardName': cardName
}));
// //
Future<Response> getTransferLockListData() => Future<Response> getTransferLockListData() =>
@ -1179,12 +1225,11 @@ class ApiProvider extends BaseProvider {
'searchStr': searchStr 'searchStr': searchStr
})); }));
Future<Response> deletLockUser(int uid) => Future<Response> deletLockUser(int uid) => post(
post( deletLockUserURL.toUrl,
deletLockUserURL.toUrl, jsonEncode({
jsonEncode({ 'uid': uid,
'uid': uid, }));
}));
Future<Response> keyListByUser(String pageNo, String pageSize, String uid) => Future<Response> keyListByUser(String pageNo, String pageSize, String uid) =>
post(keyListByUserURL.toUrl, post(keyListByUserURL.toUrl,
@ -1227,14 +1272,9 @@ class ApiProvider extends BaseProvider {
Future<Response> userSettingsInfo() => Future<Response> userSettingsInfo() =>
post(userSettingsInfoURL.toUrl, jsonEncode({})); post(userSettingsInfoURL.toUrl, jsonEncode({}));
Future<Response> canSendKey( Future<Response> canSendKey(String endDate, List lockIdList) => post(
String endDate, List lockIdList) => canSendKeyURL.toUrl,
post( jsonEncode({'endDate': endDate, 'lockIdList': lockIdList}));
canSendKeyURL.toUrl,
jsonEncode({
'endDate': endDate,
'lockIdList': lockIdList
}));
Future<Response> batchSendKey( Future<Response> batchSendKey(
String endDate, String endDate,
@ -1381,7 +1421,8 @@ class ApiProvider extends BaseProvider {
jsonEncode({"questionAndAnswerList": questionAndAnswerList})); jsonEncode({"questionAndAnswerList": questionAndAnswerList}));
// upToken updateUserInfo // upToken updateUserInfo
Future<Response> getUpToken(String module, String typeKey, String type, String filename, int size) => Future<Response> getUpToken(String module, String typeKey, String type,
String filename, int size) =>
post( post(
getUpTokenURL.toUrl, getUpTokenURL.toUrl,
jsonEncode({ jsonEncode({
@ -1392,7 +1433,8 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> uploadFile(String url, dynamic boay) => post(url, boay, isUnUploadFile: false, contentType:'multipart/form-data'); Future<Response> uploadFile(String url, dynamic boay) => post(url, boay,
isUnUploadFile: false, contentType: 'multipart/form-data');
//Token //Token
Future<Response> unbindPhoneToken(String verificationCode) => post( Future<Response> unbindPhoneToken(String verificationCode) => post(

View File

@ -4,6 +4,7 @@ import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyO
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserListEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserListEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart';
import 'package:star_lock/main/lockDetail/face/faceList/faceListData_entity.dart';
import 'package:star_lock/main/lockDetail/lcokSet/basicInformation/basicInformation/KeyDetailEntity.dart'; import 'package:star_lock/main/lockDetail/lcokSet/basicInformation/basicInformation/KeyDetailEntity.dart';
import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart';
import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart';
@ -217,7 +218,8 @@ class ApiRepository {
} }
// //
Future<KeyOperationRecordEntity> lockRecordUploadData({required String lockId, required List records}) async { Future<KeyOperationRecordEntity> lockRecordUploadData(
{required String lockId, required List records}) async {
final res = await apiProvider.lockRecordUploadData(lockId, records); final res = await apiProvider.lockRecordUploadData(lockId, records);
return KeyOperationRecordEntity.fromJson(res.body); return KeyOperationRecordEntity.fromJson(res.body);
} }
@ -236,22 +238,23 @@ class ApiRepository {
} }
// NO // NO
Future<LockNetTokenEntity> updateLockUserNo({required String keyId, required String lockUserNo}) async { Future<LockNetTokenEntity> updateLockUserNo(
{required String keyId, required String lockUserNo}) async {
final res = await apiProvider.updateLockUserNo(keyId, lockUserNo); final res = await apiProvider.updateLockUserNo(keyId, lockUserNo);
return LockNetTokenEntity.fromJson(res.body); return LockNetTokenEntity.fromJson(res.body);
} }
// //
Future<SaveLockEntity> bindingBlueAdmin( Future<SaveLockEntity> bindingBlueAdmin(
{ required String lockAlias, {required String lockAlias,
required Map position, required Map position,
required Map bluetooth, required Map bluetooth,
required Map lockInfo, required Map lockInfo,
required String lockUserNo, required String lockUserNo,
required String pwdTimestamp, required String pwdTimestamp,
required String featureValue, required String featureValue,
required String featureSettingValue, required String featureSettingValue,
required List featureSettingParams}) async { required List featureSettingParams}) async {
final res = await apiProvider.bindingBlueAdmin( final res = await apiProvider.bindingBlueAdmin(
lockAlias, lockAlias,
position, position,
@ -275,24 +278,17 @@ class ApiRepository {
// //
Future<KeyOperationRecordEntity> modifyKeyName( Future<KeyOperationRecordEntity> modifyKeyName(
{ {required String keyId,
required String keyId, required String lockId,
required String lockId, required String keyName}) async {
required String keyName final res = await apiProvider.modifyKeyName(keyId, lockId, keyName);
}) async {
final res =
await apiProvider.modifyKeyName(keyId, lockId, keyName);
return KeyOperationRecordEntity.fromJson(res.body); return KeyOperationRecordEntity.fromJson(res.body);
} }
//() //()
Future<KeyOperationRecordEntity> updateLockName( Future<KeyOperationRecordEntity> updateLockName(
{ {required String lockId, required String lockName}) async {
required String lockId, final res = await apiProvider.updateLockName(lockId, lockName);
required String lockName
}) async {
final res =
await apiProvider.updateLockName(lockId, lockName);
return KeyOperationRecordEntity.fromJson(res.body); return KeyOperationRecordEntity.fromJson(res.body);
} }
@ -373,7 +369,8 @@ class ApiRepository {
} }
// //
Future<LockListInfoEntity> checkLoginPassword({required String password}) async { Future<LockListInfoEntity> checkLoginPassword(
{required String password}) async {
final res = await apiProvider.checkLoginPassword(password); final res = await apiProvider.checkLoginPassword(password);
return LockListInfoEntity.fromJson(res.body); return LockListInfoEntity.fromJson(res.body);
} }
@ -463,10 +460,8 @@ class ApiRepository {
} }
// //
Future<MassSendLockGroupListEntity> editLockGroupRequest({ Future<MassSendLockGroupListEntity> editLockGroupRequest(
required int groupId, {required int groupId, required String groupName}) async {
required String groupName
}) async {
final res = await apiProvider.editLockGroupRequest(groupId, groupName); final res = await apiProvider.editLockGroupRequest(groupId, groupName);
return MassSendLockGroupListEntity.fromJson(res.body); return MassSendLockGroupListEntity.fromJson(res.body);
} }
@ -486,29 +481,21 @@ class ApiRepository {
// //
Future<MassSendLockGroupListEntity> deleteGroup(int groupId) async { Future<MassSendLockGroupListEntity> deleteGroup(int groupId) async {
final res = final res = await apiProvider.deleteGroup(groupId);
await apiProvider.deleteGroup(groupId);
return MassSendLockGroupListEntity.fromJson(res.body); return MassSendLockGroupListEntity.fromJson(res.body);
} }
// //
Future<MassSendLockGroupListEntity> lockGroupAddLock( Future<MassSendLockGroupListEntity> lockGroupAddLock(
{ {required List lockIds, required int groupId}) async {
required List lockIds, final res = await apiProvider.lockGroupAddLock(lockIds, groupId);
required int groupId
}) async {
final res =
await apiProvider.lockGroupAddLock(lockIds, groupId);
return MassSendLockGroupListEntity.fromJson(res.body); return MassSendLockGroupListEntity.fromJson(res.body);
} }
// //
Future<MassSendLockGroupListEntity> lockGroupDeletLock( Future<MassSendLockGroupListEntity> lockGroupDeletLock(
{ {required List lockIds}) async {
required List lockIds final res = await apiProvider.lockGroupDeletLock(lockIds);
}) async {
final res =
await apiProvider.lockGroupDeletLock(lockIds);
return MassSendLockGroupListEntity.fromJson(res.body); return MassSendLockGroupListEntity.fromJson(res.body);
} }
@ -590,8 +577,8 @@ class ApiRepository {
required int autoLock, required int autoLock,
required int autoLockSecond, required int autoLockSecond,
}) async { }) async {
final res = final res = await apiProvider.setAutoUnlockLoadData(
await apiProvider.setAutoUnlockLoadData(lockId, autoLock, autoLockSecond); lockId, autoLock, autoLockSecond);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -602,7 +589,7 @@ class ApiRepository {
required int lockSoundVolume, required int lockSoundVolume,
}) async { }) async {
final res = final res =
await apiProvider.setLockSoundData(lockId, lockSound, lockSoundVolume); await apiProvider.setLockSoundData(lockId, lockSound, lockSoundVolume);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -611,8 +598,7 @@ class ApiRepository {
required int lockId, required int lockId,
required int antiPrySwitch, required int antiPrySwitch,
}) async { }) async {
final res = final res = await apiProvider.setBurglarAlarmData(lockId, antiPrySwitch);
await apiProvider.setBurglarAlarmData(lockId, antiPrySwitch);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -649,7 +635,8 @@ class ApiRepository {
required int lockId, required int lockId,
required int appUnlockOnline, required int appUnlockOnline,
}) async { }) async {
final res = await apiProvider.setOpenLockNeedOnlineData(lockId, appUnlockOnline); final res =
await apiProvider.setOpenLockNeedOnlineData(lockId, appUnlockOnline);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -659,7 +646,7 @@ class ApiRepository {
required int openDirectionValue, required int openDirectionValue,
}) async { }) async {
final res = final res =
await apiProvider.setOpenDoorDirectionData(lockId, openDirectionValue); await apiProvider.setOpenDoorDirectionData(lockId, openDirectionValue);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -678,8 +665,8 @@ class ApiRepository {
required int passageMode, required int passageMode,
required List passageModeConfig, required List passageModeConfig,
}) async { }) async {
final res = final res = await apiProvider.setNormallyModeData(
await apiProvider.setNormallyModeData(lockId, passageMode, passageModeConfig); lockId, passageMode, passageModeConfig);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -785,10 +772,8 @@ class ApiRepository {
} }
// //
Future<KeyDetailEntity> canSendKey( Future<KeyDetailEntity> canSendKey(String endDate, List lockIdList) async {
String endDate, List lockIdList) async { final res = await apiProvider.canSendKey(endDate, lockIdList);
final res =
await apiProvider.canSendKey(endDate, lockIdList);
return KeyDetailEntity.fromJson(res.body); return KeyDetailEntity.fromJson(res.body);
} }
@ -928,7 +913,8 @@ class ApiRepository {
required int lockId, required int lockId,
required int unlockReminderPush, required int unlockReminderPush,
}) async { }) async {
final res = await apiProvider.setLockPickingReminderData(lockId, unlockReminderPush); final res = await apiProvider.setLockPickingReminderData(
lockId, unlockReminderPush);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -1168,13 +1154,58 @@ class ApiRepository {
// //
Future<LoginEntity> checkFingerprintNameDuplicatedData( Future<LoginEntity> checkFingerprintNameDuplicatedData(
{required String lockId, {required String lockId, required String fingerprintName}) async {
required String fingerprintName}) async {
final res = await apiProvider.checkFingerprintNameDuplicatedData( final res = await apiProvider.checkFingerprintNameDuplicatedData(
lockId, fingerprintName); lockId, fingerprintName);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
//
Future<FaceListDataEntity> getFaceListData({
required String lockId,
required String pageNo,
required String pageSize,
required String searchStr,
}) async {
final res =
await apiProvider.getFaceListData(lockId, pageNo, pageSize, searchStr);
return FaceListDataEntity.fromJson(res.body);
}
//
Future<AddFingerprintEntity> addFaceData({
required int lockId,
required String faceName,
required String faceNumber,
required int faceType,
required int startDate,
required int endDate,
required String featureData,
required String addType,
required List cyclicConfig,
}) async {
final res = await apiProvider.addFaceData(lockId, faceName, faceNumber,
faceType, startDate, endDate, featureData, addType, cyclicConfig);
return AddFingerprintEntity.fromJson(res.body);
}
//
Future<LoginEntity> checkFaceNameDuplicatedData(
{required String lockId, required String faceName}) async {
final res = await apiProvider.checkFaceNameDuplicatedData(lockId, faceName);
return LoginEntity.fromJson(res.body);
}
//
Future<LoginEntity> updateFaceUserNoLoadData(
{required String faceId,
required String lockId,
required String faceUserNo}) async {
final res =
await apiProvider.updateFaceUserNoLoadData(faceId, lockId, faceUserNo);
return LoginEntity.fromJson(res.body);
}
// Ic卡列表 // Ic卡列表
Future<FingerprintListDataEntity> getICCardListData({ Future<FingerprintListDataEntity> getICCardListData({
required String lockId, required String lockId,
@ -1214,8 +1245,8 @@ class ApiRepository {
required String isCoerced, required String isCoerced,
required List weekDay, required List weekDay,
required String changeType}) async { required String changeType}) async {
final res = await apiProvider.editICCardData( final res = await apiProvider.editICCardData(lockId, cardId, cardName,
lockId, cardId, cardName, startDate, endDate, isCoerced, weekDay, changeType); startDate, endDate, isCoerced, weekDay, changeType);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -1242,10 +1273,8 @@ class ApiRepository {
// //
Future<LoginEntity> checkCardNameDuplicatedData( Future<LoginEntity> checkCardNameDuplicatedData(
{required String lockId, {required String lockId, required String cardName}) async {
required String cardName}) async { final res = await apiProvider.checkCardNameDuplicatedData(lockId, cardName);
final res = await apiProvider.checkCardNameDuplicatedData(
lockId, cardName);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -1391,24 +1420,21 @@ class ApiRepository {
// upToken updateUserInfo // upToken updateUserInfo
Future<MinePersonGetUploadFileInfoEntity> getUpToken( Future<MinePersonGetUploadFileInfoEntity> getUpToken(
{ {required String module,
required String module, required String typeKey,
required String typeKey, required String type,
required String type, required String filename,
required String filename, required int size}) async {
required int size final res =
} await apiProvider.getUpToken(module, typeKey, type, filename, size);
) async {
final res = await apiProvider.getUpToken(module, typeKey, type, filename, size);
return MinePersonGetUploadFileInfoEntity.fromJson(res.body); return MinePersonGetUploadFileInfoEntity.fromJson(res.body);
} }
// //
Future<LoginEntity> uploadFile( Future<LoginEntity> uploadFile({
{ required String url,
required String url, required dynamic body,
required dynamic body, }) async {
}) async {
final res = await apiProvider.uploadFile(url, body); final res = await apiProvider.uploadFile(url, body);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }

View File

@ -4,7 +4,8 @@ import 'package:get/get.dart';
import 'package:get/get_connect/http/src/request/request.dart'; import 'package:get/get_connect/http/src/request/request.dart';
FutureOr<dynamic> responseLogInterceptor(Request request, Response response) { FutureOr<dynamic> responseLogInterceptor(Request request, Response response) {
Get.log('HTTP request:${request.url}\n RESPONSE => stataCode:${response.statusCode} ${response.body} ${response.headers}'); Get.log(
'HTTP request:${request.url}\n RESPONSE => stataCode:${response.statusCode} ${response.bodyString} ${response.headers}');
EasyLoading.dismiss(animation: true); EasyLoading.dismiss(animation: true);
return response; return response;
} }

View File

@ -16,29 +16,29 @@ class XSAliyunPushProvider {
} }
Future<void> _onNotification(Map<dynamic, dynamic> message) async { Future<void> _onNotification(Map<dynamic, dynamic> message) async {
print('onNotification: $message'); // print('onNotification: $message');
} }
Future<void> _onAndroidNotificationReceivedInApp( Future<void> _onAndroidNotificationReceivedInApp(
Map<dynamic, dynamic> message) async { Map<dynamic, dynamic> message) async {
print('onAndroidNotificationReceivedInApp: $message'); // print('onAndroidNotificationReceivedInApp: $message');
} }
Future<void> _onMessage(Map<dynamic, dynamic> message) async { Future<void> _onMessage(Map<dynamic, dynamic> message) async {
print('onMessage: $message'); // print('onMessage: $message');
} }
Future<void> _onNotificationOpened(Map<dynamic, dynamic> message) async { Future<void> _onNotificationOpened(Map<dynamic, dynamic> message) async {
print('onNotificationOpened: $message'); // print('onNotificationOpened: $message');
} }
Future<void> _onNotificationRemoved(Map<dynamic, dynamic> message) async { Future<void> _onNotificationRemoved(Map<dynamic, dynamic> message) async {
print('onNotificationRemoved: $message'); // print('onNotificationRemoved: $message');
} }
Future<void> _onAndroidNotificationClickedWithNoAction( Future<void> _onAndroidNotificationClickedWithNoAction(
Map<dynamic, dynamic> message) async { Map<dynamic, dynamic> message) async {
print('onAndroidNotificationClickedWithNoAction: $message'); // print('onAndroidNotificationClickedWithNoAction: $message');
} }
Future<void> _onIOSChannelOpened(Map<dynamic, dynamic> message) async {} Future<void> _onIOSChannelOpened(Map<dynamic, dynamic> message) async {}
@ -86,7 +86,7 @@ class XSAliyunPushProvider {
// Toast.show(msg: "初始化推送成功"); // Toast.show(msg: "初始化推送成功");
} else { } else {
String errorMsg = initResult['errorMsg']; String errorMsg = initResult['errorMsg'];
print('初始化推送失败,原因为:$errorMsg'); // print('初始化推送失败,原因为:$errorMsg');
// Toast.show(msg: '初始化推送失败, errorMsg: $errorMsg.}'); // Toast.show(msg: '初始化推送失败, errorMsg: $errorMsg.}');
} }
}); });
@ -106,7 +106,7 @@ class XSAliyunPushProvider {
} else { } else {
String errorMsg = initResult['errorMsg']; String errorMsg = initResult['errorMsg'];
// Toast.show(msg: '初始化辅助通道成功, errorMsg: $errorMsg'); // Toast.show(msg: '初始化辅助通道成功, errorMsg: $errorMsg');
print("初始化辅助通道失败,原因为:$errorMsg"); // print("初始化辅助通道失败,原因为:$errorMsg");
} }
}); });