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

# Conflicts:
#	lib/login/register/starLock_register_logic.dart
#	lib/login/register/starLock_register_page.dart
#	lib/login/register/starLock_register_state.dart
#	lib/main/lockDetail/face/faceDetail/faceDetail_logic.dart
#	lib/main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart
#	lib/main/lockDetail/lockSet/lockSet/lockSet_page.dart
This commit is contained in:
魏少阳 2024-06-03 14:00:23 +08:00
commit 8381506bdd
67 changed files with 1307 additions and 843 deletions

View File

@ -337,7 +337,6 @@
"customSMSTemplate": "Custom SMS Template",
"customMailTemplate": "Custom Mail Template",
"record": "Record",
"forTheFirstTime": "For the first time",
"onceDay": "once a day",
"weekOnce": "once a week",
@ -789,53 +788,51 @@
"文件校验失败 0x02": "File verification failed 0x02",
"文件校验失败 0x03": "File verification failed 0x03",
"固件升级完成": "Firmware upgrade completed",
"记录":"Record",
"开通高级功能后才可以对锁进行管理":"You can manage locks only after the advanced function is enabled",
"去开通":"Go and Activate",
"实名认证":"Real-name authentication",
"当前剩余数量":"Current surplus quantity",
"购买":"Buy",
"实名认证为付费功能,请购买后再使用":"Real-name authentication is a paid function, please use it after purchase",
"密码不一致哦":"The passwords are inconsistent",
"退出添加":"Quit adding",
"管理员已满":"Admin full",
"记录": "Record",
"开通高级功能后才可以对锁进行管理": "You can manage locks only after the advanced function is enabled",
"去开通": "Go and Activate",
"实名认证": "Real-name authentication",
"当前剩余数量": "Current surplus quantity",
"购买": "Buy",
"实名认证为付费功能,请购买后再使用": "Real-name authentication is a paid function, please use it after purchase",
"密码不一致哦": "The passwords are inconsistent",
"退出添加": "Quit adding",
"管理员已满": "Admin full",
"用户已满": "The user is full",
"锁上面添加指纹已满": "Add fingerprint on lock is full",
"指纹已存在": "The fingerprint already exists.",
"锁上面添加人脸已满": "Lock above add face is full",
"人脸已存在": "The face already exists",
"锁上面添加卡已满":"Lock above add card is full",
"锁上面添加卡已满": "Lock above add card is full",
"卡已存在": "Card already exists",
"锁上面添加密码已满": "Lock above add password is full",
"密码已存在": "Password already exists",
"请输入密码": "Please enter password",
"暂无密码,无需重置": "No password, no need to reset",
"真实姓名":"Real name",
"身份证号":"ID number",
"请输入真实姓名":"Please enter your real name",
"请输入身份证号":"Please enter your ID number",
"请输入身份证号和真实姓名":"Please enter your ID number and real name",
"点击返回设备配对":"Tap Back to device pairing",
"无法连接?尝试升级":"Can't connect?Upgrade attempted",
"固件升级提示":"Firmware upgrade prompt",
"请先获取固件文件到手机本地,再选择升级":"Please obtain the firmware file to the local phone first, and then select Upgrade",
"固件升级中":"The firmware is being upgraded",
"取消升级":"Cancel the upgrade",
"固件传输中":"Firmware in transit",
"关闭":"Shut down",
"传输中'":"In transit",
"操作记录":"Operation record",
"修改姓名":"Modify name",
"传输中":"In transit",
"发送人":"Sender",
"发送时间":"Send time",
"钥匙详情":"Key details",
"姓名":"Name",
"发送":"Send",
"请确认姓名全名和身份证号码是否正确":"Please confirm that the full name and ID number are correct",
"传输期间请勿离开当前页面":"Do not leave the current page during transfer",
"真实姓名": "Real name",
"身份证号": "ID number",
"请输入真实姓名": "Please enter your real name",
"请输入身份证号": "Please enter your ID number",
"请输入身份证号和真实姓名": "Please enter your ID number and real name",
"点击返回设备配对": "Tap Back to device pairing",
"无法连接?尝试升级": "Can't connect?Upgrade attempted",
"固件升级提示": "Firmware upgrade prompt",
"请先获取固件文件到手机本地,再选择升级": "Please obtain the firmware file to the local phone first, and then select Upgrade",
"固件升级中": "The firmware is being upgraded",
"取消升级": "Cancel the upgrade",
"固件传输中": "Firmware in transit",
"关闭": "Shut down",
"传输中'": "In transit",
"操作记录": "Operation record",
"修改姓名": "Modify name",
"传输中": "In transit",
"发送人": "Sender",
"发送时间": "Send time",
"钥匙详情": "Key details",
"姓名": "Name",
"发送": "Send",
"请确认姓名全名和身份证号码是否正确": "Please confirm that the full name and ID number are correct",
"传输期间请勿离开当前页面": "Do not leave the current page during transfer",
"机型": "models",
"硬件版本": "Hardware version",
"固件版本": "Firmware version",
@ -846,15 +843,23 @@
"操作失败,请确认锁是否在附近,或重启手机蓝牙后再试。": "The operation failed. Please confirm whether the lock is nearby, or restart your phone's Bluetooth and try again.",
"如果是全自动锁,请使屏幕变亮": "If it is a fully automatic lock, please make the screen brighter",
"正在尝试闭锁……": "Attempting to lock...",
"清空记录":"Clear record",
"是否要删除操作记录?":"Do you want to delete the operation record?",
"被删除的记录不能恢复":"The deleted record cannot be restored",
"全部事件":"All events",
"开锁事件":"Unlock event",
"异常事件":"Abnormal event",
"门铃事件":"Doorbell event",
"视频事件":"Video event",
"请开启蓝牙":"Please turn on Bluetooth",
"请选择有效日":"Please select the effective day",
"公司名字长度不能小于 6 ": "The length of the company name cannot be less than 6"
"清空记录": "Clear record",
"是否要删除操作记录?": "Do you want to delete the operation record?",
"被删除的记录不能恢复": "The deleted record cannot be restored",
"全部事件": "All events",
"开锁事件": "Unlock event",
"异常事件": "Abnormal event",
"门铃事件": "Doorbell event",
"视频事件": "Video event",
"请开启蓝牙": "Please turn on Bluetooth",
"请选择有效日": "Please select the effective day",
"公司名字长度不能小于 6 ": "The length of the company name cannot be less than 6",
"已是最新版本": "It is the latest version",
"一": "Mon",
"二": "Tue",
"三": "Wed",
"四": "Thu",
"五": "Fri",
"六": "Sat",
"日": "Sun"
}

View File

@ -885,5 +885,13 @@
"视频事件":"视频事件",
"请开启蓝牙":"请开启蓝牙",
"请选择有效日":"请选择有效日",
"公司名字长度不能小于 6 ": "公司名字长度不能小于 6 "
"公司名字长度不能小于 6 ": "公司名字长度不能小于 6 ",
"已是最新版本": "已是最新版本",
"一":"一",
"二":"二",
"三":"三",
"四":"四",
"五":"五",
"六":"六",
"日":"日"
}

View File

@ -855,5 +855,13 @@
"视频事件": "视频事件",
"请开启蓝牙": "请开启蓝牙",
"请选择有效日": "请选择有效日",
"公司名字长度不能小于 6 ": "公司名字长度不能小于 6 "
"公司名字长度不能小于 6 ": "公司名字长度不能小于 6 ",
"已是最新版本": "已是最新版本",
"一": "一",
"二": "二",
"三": "三",
"四": "四",
"五": "五",
"六": "六",
"日": "日"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -1,3 +1,7 @@
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import '../../flavors.dart';
class XSConstantMacro {
@ -85,4 +89,25 @@ class XSConstantMacro {
static int webBuyTypeVip = 3; //VIP购买
static int webBuyTypeAuth = 4; //
static int webBuyTypeShop = 5; //
//
Future<Map<String, dynamic>> getDeviceInfoData() async {
final DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
final Map<String, dynamic> deviceData = <String, dynamic>{};
if (Platform.isAndroid) {
final AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
deviceData['deviceBrand'] = androidInfo.brand;
deviceData['deviceModel'] = androidInfo.model;
deviceData['deviceVersion'] = androidInfo.version.release;
deviceData['deviceType'] = 10;
} else if (Platform.isIOS) {
final IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
deviceData['deviceBrand'] = iosInfo.name;
deviceData['deviceModel'] = iosInfo.model;
deviceData['deviceVersion'] = iosInfo.systemVersion;
deviceData['deviceType'] = 20;
}
return deviceData;
}
}

View File

@ -29,6 +29,7 @@ class F {
static String get name => appFlavor?.name ?? '';
static bool get isXHJ => appFlavor == Flavor.xhj;
static bool get isSKY => appFlavor == Flavor.sky;
//便
static dynamic sw(

View File

@ -1,10 +1,11 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/mine/mine/starLockMine_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -44,12 +45,13 @@ class StarLockLoginLogic extends BaseGetXController {
loginType: '1',
password: state.pwd.value,
countryCode: state.countryCode.value,
username: state.emailOrPhone.value);
username: state.emailOrPhone.value,
deviceInfo: state.deviceInfoMap.value);
if (entity.errorCode!.codeIsSuccessful) {
Storage.saveLoginData(entity.data);
Storage.setBool(saveIsVip, entity.data!.isVip == 0 ? false : true);
Storage.setBool(saveIsVip, entity.data!.isVip == 1);
eventBus.fire(MineInfoChangeRefreshUI());
XSJPushProvider().initJPushService();
XSJPushProvider().bindDeviceID();
XSJPushProvider().initLocalNotification(isCancelLocalPush: false);
Get.offNamedUntil(Routers.starLockMain, (Route route) => false);
BlueManage().scanDevices.clear(); //
@ -86,4 +88,16 @@ class StarLockLoginLogic extends BaseGetXController {
state.onClose();
super.onClose();
}
@override
void onReady() {
super.onReady();
XSConstantMacro().getDeviceInfoData().then((Map<String, dynamic> data) {
state.deviceInfoMap.value = data;
}).catchError((error) {
//
AppLog.log('获取设备信息时出错: $error');
});
}
}

View File

@ -19,6 +19,7 @@ class StarLockLoginState {
FocusNode emailOrPhoneFocusNode = FocusNode();
FocusNode pwdFocusNode = FocusNode();
RxMap<String, dynamic> deviceInfoMap = <String, dynamic>{}.obs;
StarLockLoginState() {
// emailOrPhone.value = StoreService.to.getLastUserAccount() as String;

View File

@ -1,9 +1,10 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart';
@ -33,8 +34,10 @@ class StarLockRegisterLogic extends BaseGetXController {
}
Future<void> register() async {
// AppLog.log("state.pwd.value:${state.pwd.value} state.surePwd.value:${state.surePwd.value}");
if(state.pwd.value != state.surePwd.value){
AppLog.log(
'state.pwd.value:${state.pwd.value} state.surePwd.value:${state.surePwd.value}');
if (state.pwd.value != state.surePwd.value) {
showToast('密码不一致哦'.tr);
return;
}
@ -43,12 +46,14 @@ class StarLockRegisterLogic extends BaseGetXController {
countryCode: int.parse(state.countryCode.value),
account: state.phoneOrEmailStr.value,
password: state.pwd.value,
verificationCode: state.verificationCode.value);
verificationCode: state.verificationCode.value,
deviceInfo: state.deviceInfoMap.value);
if (entity.errorCode!.codeIsSuccessful) {
showToast('注册成功'.tr);
Get.back(result:<String, String>{
'phoneOrEmailStr':state.phoneOrEmailStr.value,
'pwd':state.pwd.value
Get.back(result: <String, String>{
'phoneOrEmailStr': state.phoneOrEmailStr.value,
'pwd': state.pwd.value
});
}
}
@ -96,4 +101,16 @@ class StarLockRegisterLogic extends BaseGetXController {
state.codeIsOK &&
(state.isIphoneType.value ? state.isIphone : state.isEmail);
}
@override
void onReady() {
super.onReady();
XSConstantMacro().getDeviceInfoData().then((Map<String, dynamic> data) {
state.deviceInfoMap.value = data;
}).catchError((error) {
//
AppLog.log('获取设备信息时出错: $error');
});
}
}

View File

@ -36,6 +36,7 @@ class StarLockRegisterState {
RxString btnText = ''.obs;
int totalSeconds = 120;
int currentSecond = 120;
RxMap<String, dynamic> deviceInfoMap = <String, dynamic>{}.obs;
void resetResend() {
canResend.value = totalSeconds == currentSecond;

View File

@ -193,18 +193,21 @@ class _StarLockRegisterPageState extends State<StarLockRegisterXHJPage> {
),
Obx(() => GestureDetector(
onTap:
state.phoneOrEmailStrIsOK.value && state.canResend.value ? () async {
state.phoneOrEmailStrIsOK.value && state.canResend.value
? () async {
// Navigator.pushNamed(context, Routers.safetyVerificationPage, arguments: {"countryCode":"+86", "account":state.phoneOrEmailStr.value});
if(state.pwd.value != state.surePwd.value){
logic.showToast("密码不一致哦".tr);
return;
}
var result = await Get.toNamed(Routers.safetyVerificationPage,
if (state.pwd.value != state.surePwd.value) {
logic.showToast("密码不一致哦".tr);
return;
}
var result = await Get.toNamed(
Routers.safetyVerificationPage,
arguments: {
"countryCode": state.countryCode,
"account": state.phoneOrEmailStr.value
});
state.xWidth.value = (result as Map<String, dynamic>)['xWidth'];
state.xWidth.value =
(result as Map<String, dynamic>)['xWidth'];
logic.sendValidationCode();
}
: null,

View File

@ -9,6 +9,7 @@ import 'package:star_lock/flavors.dart';
import 'package:star_lock/tools/bugly/bugly_tool.dart';
import 'package:star_lock/tools/device_info_service.dart';
import 'package:star_lock/tools/platform_info_services.dart';
import 'package:star_lock/tools/xs_jPhush.dart';
import 'package:star_lock/translations/trans_lib.dart';
import 'app.dart';
@ -27,6 +28,8 @@ FutureOr<void> main() async {
// bugly错误日志监控
await BuglyTool.init();
await XSJPushProvider().initJPushService();
runApp(const MyApp());
if (AppPlatform.isAndroid) {

View File

@ -2,6 +2,7 @@
import 'package:get/get.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart';
@ -11,6 +12,10 @@ import 'addCardType_state.dart';
class AddCardTypeLogic extends BaseGetXController{
AddCardTypeState state = AddCardTypeState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
Future<void> addCardData() async {
int carType = 0; // :1;23:4

View File

@ -210,7 +210,7 @@ class _AddCardPageState extends State<AddCardPage>
visible: state.weekdaysList.isNotEmpty,
child: CommonItem(
leftTitel: '有效日'.tr,
rightTitle: state.weekdaysList.value.join(',').toString(),
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
@ -7,6 +6,7 @@ import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart';
@ -19,15 +19,22 @@ import '../../../../tools/dateTool.dart';
import '../../../../tools/storage.dart';
import 'cardDetail_state.dart';
class CardDetailLogic extends BaseGetXController{
class CardDetailLogic extends BaseGetXController {
CardDetailState state = CardDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
// ()
if((reply is SenderAddICCardWithTimeCycleCoercionReply) && (state.ifCurrentScreen.value == true)) {
if ((reply is SenderAddICCardWithTimeCycleCoercionReply) &&
(state.ifCurrentScreen.value == true)) {
_replyAddICCardBegin(reply);
}
});
@ -37,23 +44,26 @@ class CardDetailLogic extends BaseGetXController{
Future<void> _replyAddICCardBegin(Reply reply) async {
final int status = reply.data[2];
switch(status){
switch (status) {
case 0x00:
//
cancelBlueConnetctToastTimer();
dismissEasyLoading();
if(state.isDeletCard.value == true){
if (state.isDeletCard.value == true) {
deletICCardData();
}else{
} else {
editICCardData();
}
break;
case 0x06:
//
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<int> token = reply.data.sublist(5, 9);
@ -61,25 +71,29 @@ class CardDetailLogic extends BaseGetXController{
Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
keyID:state.keyId.value.toString(),
userID:await Storage.getUid(),
cardNo:int.parse(state.typeNumber.value),
useCountLimit:0xffff,
operate:state.isDeletCard.value ? 2 : 1, // 0: 1 2: 3
isAdmin:state.isAdministrator.value == true ? 1 : 0,
isForce:state.isStressCard.value == true ? 1 : 0, //
isRound:state.keyType.value == 4 ? 1: 0, //
weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), //
startDate: int.parse(state.startDate.value)~/1000,
endDate: int.parse(state.endDate.value)~/1000,
startTime:DateTool().dateToHNString(state.starTime.value),
endTime:DateTool().dateToHNString(state.endTime.value),
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: token,
isBeforeAddUser: false
);
keyID: state.keyId.value.toString(),
userID: await Storage.getUid(),
cardNo: int.parse(state.typeNumber.value),
useCountLimit: 0xffff,
operate: state.isDeletCard.value ? 2 : 1,
// 0: 1 2: 3
isAdmin: state.isAdministrator.value == true ? 1 : 0,
isForce: state.isStressCard.value == true ? 1 : 0,
//
isRound: state.keyType.value == 4 ? 1 : 0,
//
weekRound: DateTool().accordingTheCycleIntoTheCorrespondingNumber(
state.weekDay.value),
//
startDate: int.parse(state.startDate.value) ~/ 1000,
endDate: int.parse(state.endDate.value) ~/ 1000,
startTime: DateTool().dateToHNString(state.starTime.value),
endTime: DateTool().dateToHNString(state.endTime.value),
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: token,
isBeforeAddUser: false);
break;
default:
//
@ -89,52 +103,61 @@ class CardDetailLogic extends BaseGetXController{
//
Future<void> senderAddICCard() async {
if(state.sureBtnState.value == 1){
if (state.sureBtnState.value == 1) {
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected){
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
keyID:state.keyId.value.toString(),
userID:await Storage.getUid(),
cardNo:int.parse(state.typeNumber.value),
useCountLimit:0xffff,
operate:state.isDeletCard.value ? 2 : 1, // 0: 1 2: 3
isAdmin:state.isAdministrator.value == true ? 1 : 0,
isForce:state.isStressCard.value == true ? 1 : 0, //
isRound:state.keyType.value == 4 ? 1: 0, //
weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), //
startDate: int.parse(state.startDate.value)~/1000,
endDate: int.parse(state.endDate.value)~/1000,
startTime:DateTool().dateToHNString(state.starTime.value),
endTime:DateTool().dateToHNString(state.endTime.value),
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList,
isBeforeAddUser: false
);
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
keyID: state.keyId.value.toString(),
userID: await Storage.getUid(),
cardNo: int.parse(state.typeNumber.value),
useCountLimit: 0xffff,
operate: state.isDeletCard.value ? 2 : 1,
// 0: 1 2: 3
isAdmin: state.isAdministrator.value == true ? 1 : 0,
isForce: state.isStressCard.value == true ? 1 : 0,
//
isRound: state.keyType.value == 4 ? 1 : 0,
//
weekRound: DateTool().accordingTheCycleIntoTheCorrespondingNumber(
state.weekDay.value),
//
startDate: int.parse(state.startDate.value) ~/ 1000,
endDate: int.parse(state.endDate.value) ~/ 1000,
startTime: DateTool().dateToHNString(state.starTime.value),
endTime: DateTool().dateToHNString(state.endTime.value),
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
isBeforeAddUser: false);
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
}
@ -142,7 +165,7 @@ class CardDetailLogic extends BaseGetXController{
}
// iC卡
Future<void> editICCardData() async{
Future<void> editICCardData() async {
final LoginEntity entity = await ApiRepository.to.editICCardData(
cardId: state.keyId.value.toString(),
lockId: state.fingerprintItemData.value.lockId.toString(),
@ -154,39 +177,40 @@ class CardDetailLogic extends BaseGetXController{
changeType: '1',
startTime: int.parse(state.starTime.value),
endTime: int.parse(state.endTime.value),
cardType:state.keyType.value,
cardType: state.keyType.value,
cardRight: state.isAdministrator.value ? 1 : 0,
);
if(entity.errorCode!.codeIsSuccessful){
showToast('修改成功'.tr, something: (){
if (entity.errorCode!.codeIsSuccessful) {
showToast('修改成功'.tr, something: () {
eventBus.fire(OtherTypeRefreshListEvent());
});
}
}
// IC卡
Future<void> deletICCardData() async{
Future<void> deletICCardData() async {
final LoginEntity entity = await ApiRepository.to.deletIcCardData(
cardId: state.fingerprintItemData.value.cardId.toString(),
lockId: state.fingerprintItemData.value.lockId.toString(),
type: '0',
deleteType:'1'
);
if(entity.errorCode!.codeIsSuccessful){
showToast('删除成功'.tr, something: (){
deleteType: '1');
if (entity.errorCode!.codeIsSuccessful) {
showToast('删除成功'.tr, something: () {
Get.back(result: 'addScuess');
});
}
}
String getKeyTypeShowDateTime(){
String getKeyTypeShowDateTime() {
String useDateStr = '';
if(state.keyType.value == 1){
if (state.keyType.value == 1) {
useDateStr = '永久'.tr;
}else if(state.keyType.value == 2){
useDateStr = '${DateTool().dateToYMDHNString(state.startDate.value)}\n${DateTool().dateToYMDHNString(state.endDate.value)}';
} else if(state.keyType.value == 4){
useDateStr = '${DateTool().dateToYMDString(state.startDate.value)}\n${DateTool().dateToYMDString(state.endDate.value)}';
} else if (state.keyType.value == 2) {
useDateStr =
'${DateTool().dateToYMDHNString(state.startDate.value)}\n${DateTool().dateToYMDHNString(state.endDate.value)}';
} else if (state.keyType.value == 4) {
useDateStr =
'${DateTool().dateToYMDString(state.startDate.value)}\n${DateTool().dateToYMDString(state.endDate.value)}';
}
return useDateStr;
}
@ -204,5 +228,4 @@ class CardDetailLogic extends BaseGetXController{
_replySubscription.cancel();
}
}
}

View File

@ -114,7 +114,7 @@ class _CardDetailPageState extends State<CardDetailPage> with RouteAware {
visible: state.keyType.value == 4,
child: Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr,
rightTitle: state.weekDay.value.join(','),
rightTitle: logic.weekDayStr.join(','),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
@ -27,10 +26,11 @@ class CardListLogic extends BaseGetXController {
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
// ()
if((reply is SenderAddICCardWithTimeCycleCoercionReply) && (state.ifCurrentScreen.value == true)) {
if ((reply is SenderAddICCardWithTimeCycleCoercionReply) &&
(state.ifCurrentScreen.value == true)) {
_replyAddICCardBegin(reply);
}
});
@ -40,7 +40,7 @@ class CardListLogic extends BaseGetXController {
Future<void> _replyAddICCardBegin(Reply reply) async {
final int status = reply.data[2];
switch(status){
switch (status) {
case 0x00:
//
cancelBlueConnetctToastTimer();
@ -48,10 +48,13 @@ class CardListLogic extends BaseGetXController {
break;
case 0x06:
//
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<int> token = reply.data.sublist(5, 9);
@ -59,25 +62,24 @@ class CardListLogic extends BaseGetXController {
Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
keyID:state.deletKeyID,
userID:(await Storage.getUid())!,
cardNo:state.deletCardNo,
useCountLimit:0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin:0,
isForce:0, //
isRound:0, //
weekRound:0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime:'0',
endTime:'0',
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: token,
isBeforeAddUser: false
);
keyID: state.deletKeyID,
userID: (await Storage.getUid())!,
cardNo: state.deletCardNo,
useCountLimit: 0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin: 0,
isForce: 0, //
isRound: 0, //
weekRound: 0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime: '0',
endTime: '0',
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: token,
isBeforeAddUser: false);
break;
default:
//
@ -88,44 +90,48 @@ class CardListLogic extends BaseGetXController {
//
Future<void> senderAddICCard() async {
showEasyLoading();
showBlueConnetctToastTimer(action: (){
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected){
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
keyID:state.deletKeyID,
userID:(await Storage.getUid())!,
cardNo:state.deletCardNo,
useCountLimit:0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin:0,
isForce:0, //
isRound:0, //
weekRound:0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime:'0',
endTime:'0',
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList,
isBeforeAddUser: false
);
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
keyID: state.deletKeyID,
userID: (await Storage.getUid())!,
cardNo: state.deletCardNo,
useCountLimit: 0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin: 0,
isForce: 0, //
isRound: 0, //
weekRound: 0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime: '0',
endTime: '0',
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
isBeforeAddUser: false);
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
if(state.ifCurrentScreen.value == true){
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
}
@ -133,32 +139,34 @@ class CardListLogic extends BaseGetXController {
}
// IC卡列表
Future<FingerprintListDataEntity> getICCardListData() async{
final FingerprintListDataEntity entity = await ApiRepository.to.getICCardListData(
Future<FingerprintListDataEntity> getICCardListData(
{required bool isRefresh}) async {
//
if (isRefresh) {
state.fingerprintItemListData.clear();
pageNo = 1;
}
final FingerprintListDataEntity entity =
await ApiRepository.to.getICCardListData(
lockId: state.lockId.value.toString(),
pageNo: pageNo.toString(),
pageSize: pageSize,
searchStr: state.searchController.text,
);
if(entity.errorCode!.codeIsSuccessful){
if (pageNo == 1) {
state.fingerprintItemListData.value = entity.data!.list!;
pageNo++;
} else {
if (entity.data!.list!.isNotEmpty) {
state.fingerprintItemListData.value.addAll(entity.data!.list!);
pageNo++;
}
}
if (entity.errorCode!.codeIsSuccessful) {
//
state.fingerprintItemListData.addAll(entity.data!.list!);
//
pageNo++;
}
return entity;
}
// IC卡
Future<void> deletICCardData() async{
Future<void> deletICCardData() async {
String cardId = '';
String type = '1';
if(state.isDeletAll == false){
if (state.isDeletAll == false) {
cardId = state.deletKeyID;
type = '0';
}
@ -166,18 +174,15 @@ class CardListLogic extends BaseGetXController {
cardId: cardId,
lockId: state.lockId.value.toString(),
type: type,
deleteType:'1'
);
if(entity.errorCode!.codeIsSuccessful){
if(state.isDeletAll == false){
showToast('删除成功'.tr, something: (){
pageNo = 1;
getICCardListData();
deleteType: '1');
if (entity.errorCode!.codeIsSuccessful) {
if (state.isDeletAll == false) {
showToast('删除成功'.tr, something: () {
getICCardListData(isRefresh: true);
});
}else{
showToast('重置成功'.tr, something: (){
pageNo = 1;
getICCardListData();
} else {
showToast('重置成功'.tr, something: () {
getICCardListData(isRefresh: true);
});
}
}
@ -186,44 +191,48 @@ class CardListLogic extends BaseGetXController {
//
late StreamSubscription _teamEvent;
void _initRefreshAction() {
_teamEvent = eventBus.on<OtherTypeRefreshListEvent>().listen((OtherTypeRefreshListEvent event) {
pageNo = 1;
getICCardListData();
_teamEvent = eventBus
.on<OtherTypeRefreshListEvent>()
.listen((OtherTypeRefreshListEvent event) {
getICCardListData(isRefresh: true);
});
}
String getKeyType(FingerprintItemData fingerprintItemData){
String keyTypeStr = '';//
if(fingerprintItemData.cardStatus == 1){
if(fingerprintItemData.startDate! > DateTime.now().millisecondsSinceEpoch){
String getKeyType(FingerprintItemData fingerprintItemData) {
String keyTypeStr = ''; //
if (fingerprintItemData.cardStatus == 1) {
if (fingerprintItemData.startDate! >
DateTime.now().millisecondsSinceEpoch) {
keyTypeStr = '未生效'.tr;
}
}else if(fingerprintItemData.cardStatus == 2){
} else if (fingerprintItemData.cardStatus == 2) {
keyTypeStr = '已失效'.tr;
}
return keyTypeStr;
}
String getKeyDateType(FingerprintItemData fingerprintItemData){
String keyDateTypeStr = '';// :1;23:4
if(fingerprintItemData.cardType! == 1){
keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久';
}else if(fingerprintItemData.cardType! == 2){
keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
}else if(fingerprintItemData.cardType! == 4){
keyDateTypeStr = '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
String getKeyDateType(FingerprintItemData fingerprintItemData) {
String keyDateTypeStr = ''; // :1;23:4
if (fingerprintItemData.cardType! == 1) {
keyDateTypeStr =
'${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} 永久';
} else if (fingerprintItemData.cardType! == 2) {
keyDateTypeStr =
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
} else if (fingerprintItemData.cardType! == 4) {
keyDateTypeStr =
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
}
return keyDateTypeStr;
}
@override
Future<void> onReady() async {
super.onReady();
//
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false){
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_initReplySubscription();
_initRefreshAction();
@ -239,10 +248,10 @@ class CardListLogic extends BaseGetXController {
Future<void> onClose() async {
super.onClose();
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false) {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_replySubscription.cancel();
_teamEvent.cancel();
}
}
}
}

View File

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -31,11 +30,13 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
final CardListLogic logic = Get.put(CardListLogic());
final CardListState state = Get.find<CardListLogic>().state;
Future<void> getHttpData() async {
Future<void> getHttpData({required bool isRefresh}) async {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
logic.getICCardListData().then((FingerprintListDataEntity value){
if(mounted) {
logic
.getICCardListData(isRefresh: isRefresh)
.then((FingerprintListDataEntity value) {
if (mounted) {
setState(() {});
}
});
@ -46,12 +47,11 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
void initState() {
super.initState();
getHttpData();
getHttpData(isRefresh: true);
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
@ -67,7 +67,8 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
onPressed: () async {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
ShowTipView().showIosTipWithContentDialog('重置后,该锁的卡都将被删除哦,确认要重置吗?'.tr, () async {
ShowTipView().showIosTipWithContentDialog(
'重置后,该锁的卡都将被删除哦,确认要重置吗?'.tr, () async {
state.isDeletAll = true;
state.deletKeyID = '0';
state.deletCardNo = 0;
@ -82,34 +83,33 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
],
),
body: EasyRefreshTool(
onRefresh: (){
logic.pageNo = 1;
getHttpData();
onRefresh: () {
getHttpData(isRefresh: true);
},
onLoad: (){
getHttpData();
onLoad: () {
getHttpData(isRefresh: false);
},
child: Column(
children: <Widget>[
KeySearchWidget(
editingController: state.searchController,
onSubmittedAction: () {
logic.pageNo = 1;
getHttpData();
getHttpData(isRefresh: true);
},
),
SizedBox(height: 20.h),
Expanded(child: _buildMainUI()),
AddBottomWhiteBtn(
btnName: '${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.card!.tr}',
btnName:
'${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.card!.tr}',
onClick: () async {
final data = await Get.toNamed(Routers.addCardPage, arguments: <String, int>{
'lockId': state.lockId.value,
'fromType': 1 // 1 2
});
final data = await Get.toNamed(Routers.addCardPage,
arguments: <String, int>{
'lockId': state.lockId.value,
'fromType': 1 // 1 2
});
if (data != null) {
logic.pageNo = 1;
getHttpData();
getHttpData(isRefresh: true);
}
},
),
@ -125,59 +125,69 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
Widget _buildMainUI() {
return Obx(() => state.fingerprintItemListData.value.isNotEmpty
? SlidableAutoCloseBehavior(
child: ListView.separated(
itemCount: state.fingerprintItemListData.value.length,
itemBuilder: (BuildContext c, int index) {
final FingerprintItemData fingerprintItemData = state.fingerprintItemListData.value[index];
return Slidable(
key:ValueKey(fingerprintItemData.fingerprintId),
endActionPane: ActionPane(
extentRatio: 0.2,
motion: const ScrollMotion(),
children: <Widget>[
SlidableAction(
onPressed: (BuildContext context){
ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, () async {
state.isDeletAll = false;
state.deletKeyID = fingerprintItemData.cardId.toString();
state.deletCardNo = int.parse(fingerprintItemData.cardNumber!);
logic.senderAddICCard();
});
},
backgroundColor: Colors.red,
foregroundColor: Colors.white,
label: '删除'.tr,
padding: EdgeInsets.only(left: 5.w, right: 5.w),
),
],
child: ListView.separated(
itemCount: state.fingerprintItemListData.value.length,
itemBuilder: (BuildContext c, int index) {
final FingerprintItemData fingerprintItemData =
state.fingerprintItemListData.value[index];
return Slidable(
key: ValueKey(fingerprintItemData.fingerprintId),
endActionPane: ActionPane(
extentRatio: 0.2,
motion: const ScrollMotion(),
children: <Widget>[
SlidableAction(
onPressed: (BuildContext context) {
ShowTipView().showIosTipWithContentDialog(
'确定要删除吗?'.tr, () async {
state.isDeletAll = false;
state.deletKeyID =
fingerprintItemData.cardId.toString();
state.deletCardNo =
int.parse(fingerprintItemData.cardNumber!);
logic.senderAddICCard();
});
},
backgroundColor: Colors.red,
foregroundColor: Colors.white,
label: '删除'.tr,
padding: EdgeInsets.only(left: 5.w, right: 5.w),
),
],
),
child: _keyItem(
'images/icon_card.png',
fingerprintItemData.cardName!,
logic.getKeyType(fingerprintItemData),
logic.getKeyDateType(fingerprintItemData), () async {
final data = await Get.toNamed(Routers.cardDetailPage,
arguments: <String, FingerprintItemData>{
'fingerprintItemData': fingerprintItemData,
});
if (data != null) {
getHttpData(isRefresh: true);
}
}),
);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
),
child: _keyItem(
'images/icon_card.png',
fingerprintItemData.cardName!,
logic.getKeyType(fingerprintItemData),
logic.getKeyDateType(fingerprintItemData), () async {
final data = await Get.toNamed(
Routers.cardDetailPage, arguments: <String, FingerprintItemData>{
'fingerprintItemData': fingerprintItemData,
});
if (data != null) {
logic.pageNo = 1;
getHttpData();
}
}),
);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
),
) : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 190.h - 64.h));
)
: NoData(
noDataHeight: 1.sh -
ScreenUtil().statusBarHeight -
ScreenUtil().bottomBarHeight -
190.h -
64.h));
}
Widget _keyItem(String lockTypeIcon, String lockTypeTitle, String ifInvalidation, String showTime, Function() action) {
Widget _keyItem(String lockTypeIcon, String lockTypeTitle,
String ifInvalidation, String showTime, Function() action) {
return GestureDetector(
onTap: action,
child: Container(
@ -201,14 +211,13 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
child: Row(
children: <Widget>[
Flexible(
child: Text(
lockTypeTitle,
child: Text(lockTypeTitle,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor)
),
style: TextStyle(
fontSize: 24.sp,
color: AppColors.blackColor)),
),
],
),
),

View File

@ -14,6 +14,7 @@ import '../../../../../tools/commonDataManage.dart';
import '../../../../../tools/custom_bottom_sheet.dart';
import '../../../../../tools/dateTool.dart';
import '../../../../../tools/eventBusEventManage.dart';
import '../../../../../tools/pickers/time_picker/time_utils.dart';
import '../../../../../tools/showTipView.dart';
import '../../../lockOperatingRecord/keyOperationRecord_entity.dart';
@ -22,6 +23,10 @@ typedef BlockIsHaveAllDataCallback = void Function(bool isAllData);
class ElectronicKeyDetailLogic extends BaseGetXController {
final ElectronicKeyDetailState state = ElectronicKeyDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
Future<void> modifyKeyNameRequest() async {
if (state.changeNameController.text.isEmpty) {

View File

@ -147,7 +147,7 @@ class _ElectronicKeyDetailPageState extends State<ElectronicKeyDetailPage> {
visible: state.keyType.value == 4 ? true : false,
child: Obx(() => CommonItem(
leftTitel: '有效日'.tr,
rightTitle: state.weekDay.value.join(','),
rightTitle: logic.weekDayStr.join(','),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -1,5 +1,6 @@
import 'package:get/get.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../../common/XSConstantMacro/XSConstantMacro.dart';
import '../../../../../network/api_repository.dart';
import '../../../../../tools/dateTool.dart';
@ -9,6 +10,10 @@ import 'massSendElectronicKey_state.dart';
class MassSendElectronicKeyLogic extends BaseGetXController {
MassSendElectronicKeyState state = MassSendElectronicKeyState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
Future<void> massKeyChecksRequest() async {
String getFailureDateTime = '0';

View File

@ -176,7 +176,7 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr,
rightTitle: "",
rightTitle: '',
isHaveLine: true,
isHaveRightWidget: true,
isHaveDirection: true,
@ -261,7 +261,7 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
children: [
CommonItem(
leftTitel: TranslationLoader.lanKeys!.remoteUnlockingAllowed!.tr,
rightTitle: "",
rightTitle: '',
isHaveRightWidget: true,
rightWidget: SizedBox(width: 60.w, height: 50.h, child: _switch()),
action: () {}),
@ -276,7 +276,7 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
children: [
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle: "${state.beginTime.value}\n${state.endTime.value}",
rightTitle: '${state.beginTime.value}\n${state.endTime.value}',
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -297,10 +297,10 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
}
})),
Obx(() => Visibility(
visible: state.weekdaysList.isNotEmpty ? true : false,
visible: state.weekdaysList.isNotEmpty,
child: CommonItem(
leftTitel: "有效日".tr,
rightTitle: state.weekdaysList.value.join(",").toString(),
leftTitel: '有效日'.tr,
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -323,9 +323,9 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
Obx(() => Visibility(
visible: state.effectiveDateTime.value.isNotEmpty,
child: CommonItem(
leftTitel: "有效时间".tr,
leftTitel: '有效时间'.tr,
rightTitle:
"${state.effectiveDateTime.value}-${state.failureDateTime.value}",
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
isHaveDirection: true,
action: () async {
var result = await Get.toNamed(

View File

@ -6,12 +6,13 @@ import 'package:star_lock/main/lockDetail/authorizedAdmin/authorizedAdmin/author
import 'package:star_lock/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/regularExpression.dart';
import 'package:star_lock/tools/showCupertinoAlertView.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/commonDataManage.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import 'package:star_lock/tools/regularExpression.dart';
import 'package:star_lock/tools/showCupertinoAlertView.dart';
import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/tools/storage.dart';
@ -20,6 +21,10 @@ class SendElectronicKeyViewLogic extends BaseGetXController {
String type;
final SendElectronicKeyViewState state = SendElectronicKeyViewState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
@override
void onInit() {
super.onInit();

View File

@ -257,7 +257,7 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
visible: logic.state.weekdaysList.isNotEmpty,
child: CommonItem(
leftTitel: '有效日'.tr,
rightTitle: logic.state.weekdaysList.join(',').toString(),
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -3,12 +3,17 @@ import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/main/lockDetail/face/addFaceType/addFaceType_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart';
class AddFaceTypeLogic extends BaseGetXController {
AddFaceTypeState state = AddFaceTypeState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
Future<void> addFaceData() async {
int faceType = 0; // :1;23:4

View File

@ -209,7 +209,7 @@ class _AddFaceTypePageState extends State<AddFaceTypePage> with SingleTickerProv
visible: state.weekdaysList.isNotEmpty,
child: CommonItem(
leftTitel: '有效日'.tr,
rightTitle: state.weekdaysList.value.join(',').toString(),
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -3,11 +3,14 @@ import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/blue/io_protocol/io_addFace.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/main/lockDetail/face/faceDetail/faceDetail_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_reply.dart';
import '../../../../blue/io_tool/io_tool.dart';
@ -19,6 +22,10 @@ import '../../../../tools/storage.dart';
class FaceDetailLogic extends BaseGetXController {
FaceDetailState state = FaceDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {

View File

@ -117,7 +117,7 @@ class _FaceDetailPageState extends State<FaceDetailPage> with RouteAware {
visible: state.keyType.value == 4,
child: Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr,
rightTitle: state.weekDay.value.join(','),
rightTitle: logic.weekDayStr.join(','),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -2,6 +2,7 @@
import 'package:get/get.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/dateTool.dart';
@ -10,6 +11,10 @@ import 'addFingerprintType_state.dart';
class AddFingerprintTypeLogic extends BaseGetXController{
AddFingerprintState state = AddFingerprintState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
Future<void> addFingerprintsData() async {
int fingerprintType = 0; // :1;23:4

View File

@ -202,7 +202,7 @@ class _AddFingerprintTypePageState extends State<AddFingerprintTypePage> with Si
visible: state.weekdaysList.isNotEmpty,
child: CommonItem(
leftTitel: '有效日'.tr,
rightTitle: state.weekdaysList.value.join(',').toString(),
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -5,6 +5,7 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_addFingerprintWithTimeCycleCoercion.dart';
import '../../../../blue/io_reply.dart';
@ -20,6 +21,10 @@ import 'fingerprintDetail_state.dart';
class FingerprintDetailLogic extends BaseGetXController{
FingerprintDetailState state = FingerprintDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {

View File

@ -120,7 +120,7 @@ class _FingerprintDetailPageState extends State<FingerprintDetailPage>
visible: state.keyType.value == 4,
child: Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr,
rightTitle: state.weekDay.value.join(','),
rightTitle: logic.weekDayStr.join(','),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
@ -18,15 +17,17 @@ import '../../../../tools/storage.dart';
import 'fingerprintListData_entity.dart';
import 'fingerprintList_state.dart';
class FingerprintListLogic extends BaseGetXController{
class FingerprintListLogic extends BaseGetXController {
FingerprintListState state = FingerprintListState();
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
// ()
if((reply is SenderAddFingerprintWithTimeCycleCoercionReply) && (state.ifCurrentScreen.value == true)) {
if ((reply is SenderAddFingerprintWithTimeCycleCoercionReply) &&
(state.ifCurrentScreen.value == true)) {
_replyAddFingerprintBegin(reply);
}
@ -45,7 +46,7 @@ class FingerprintListLogic extends BaseGetXController{
Future<void> _replyAddFingerprintBegin(Reply reply) async {
final int status = reply.data[2];
switch(status){
switch (status) {
case 0x00:
//
cancelBlueConnetctToastTimer();
@ -54,10 +55,13 @@ class FingerprintListLogic extends BaseGetXController{
break;
case 0x06:
//
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<int> token = reply.data.sublist(5, 9);
@ -65,25 +69,24 @@ class FingerprintListLogic extends BaseGetXController{
Storage.setStringList(saveBlueToken, saveStrList);
IoSenderManage.senderAddFingerprintWithTimeCycleCoercionCommand(
keyID:state.deletKeyID,
userID:(await Storage.getUid())!,
fingerNo:state.deletFingerNo,
useCountLimit:0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin:0,
isForce:0, //
isRound:0, //
weekRound:0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime:'0',
endTime:'0',
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: token,
isBeforeAddUser: false
);
keyID: state.deletKeyID,
userID: (await Storage.getUid())!,
fingerNo: state.deletFingerNo,
useCountLimit: 0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin: 0,
isForce: 0, //
isRound: 0, //
weekRound: 0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime: '0',
endTime: '0',
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: token,
isBeforeAddUser: false);
break;
default:
//
@ -245,81 +248,124 @@ class FingerprintListLogic extends BaseGetXController{
//
Future<void> senderAddFingerprint() async {
showEasyLoading();
showBlueConnetctToastTimer(action: (){
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected){
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderAddFingerprintWithTimeCycleCoercionCommand(
keyID:state.deletKeyID,
userID:(await Storage.getUid())!,
fingerNo:state.deletFingerNo,
useCountLimit:0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin:0,
isForce:0, //
isRound:0, //
weekRound:0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime:'0',
endTime:'0',
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList,
isBeforeAddUser: false
);
} else if (deviceConnectionState == BluetoothConnectionState.disconnected) {
keyID: state.deletKeyID,
userID: (await Storage.getUid())!,
fingerNo: state.deletFingerNo,
useCountLimit: 0xffff,
operate: state.isDeletAll == true ? 3 : 2, // 0: 1 2: 3
isAdmin: 0,
isForce: 0, //
isRound: 0, //
weekRound: 0, //
startDate: 0x11223344,
endDate: 0x11223344,
startTime: '0',
endTime: '0',
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList,
isBeforeAddUser: false);
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
if(state.ifCurrentScreen.value == true){
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
}
});
}
/**
* //
Future<PasswordKeyListEntity> mockNetworkDataRequest(
{required bool isRefresh}) async {
//
if (isRefresh) {
state.itemDataList.clear();
pageNo = 1;
}
final PasswordKeyListEntity entity = await ApiRepository.to.passwordKeyList(
state.keyInfo.value.keyStatus.toString(),
state.keyInfo.value.lockId.toString(),
pageNo.toString(),
pageSize.toString(),
state.searchController.text);
if (entity.errorCode!.codeIsSuccessful) {
//
state.itemDataList.addAll(entity.data!.itemList!);
//
pageNo++;
}
return entity;
}
*/
//
Future<FingerprintListDataEntity> getFingerprintsListData() async{
// state.fingerprintItemListData.value.clear();
final FingerprintListDataEntity entity = await ApiRepository.to.getFingerprintsListData(
Future<FingerprintListDataEntity> getFingerprintsListData(
{required bool isRefresh}) async {
//
if (isRefresh) {
state.fingerprintItemListData.clear();
pageNo = 1;
}
final FingerprintListDataEntity entity =
await ApiRepository.to.getFingerprintsListData(
lockId: state.lockId.value.toString(),
pageNo: pageNo.toString(),
pageSize: pageSize.toString(),
searchStr: state.searchController.text,
);
if(entity.errorCode!.codeIsSuccessful){
if (pageNo == 1) {
state.fingerprintItemListData.value = entity.data!.list!;
pageNo++;
} else {
if (entity.data!.list!.isNotEmpty) {
state.fingerprintItemListData.value.addAll(entity.data!.list!);
pageNo++;
}
}
// if (entity.errorCode!.codeIsSuccessful) {
// if (pageNo == 1) {
// state.fingerprintItemListData.value = entity.data!.list!;
// pageNo++;
// } else {
// if (entity.data!.list!.isNotEmpty) {
// state.fingerprintItemListData.value.addAll(entity.data!.list!);
// pageNo++;
// }
// }
// }
if (entity.errorCode!.codeIsSuccessful) {
//
state.fingerprintItemListData.addAll(entity.data!.list!);
//
pageNo++;
}
return entity;
}
//
Future<void> deletAllFingerprintsData() async{
Future<void> deletAllFingerprintsData() async {
String fingerprintId = '';
String type = '1';
if(state.isDeletAll == false){
if (state.isDeletAll == false) {
fingerprintId = state.deletKeyID;
type = '0';
}
@ -327,18 +373,15 @@ class FingerprintListLogic extends BaseGetXController{
fingerprintId: fingerprintId,
lockId: state.lockId.value.toString(),
type: type,
deleteType:'1'
);
if(entity.errorCode!.codeIsSuccessful){
if(state.isDeletAll == false){
showToast('删除成功'.tr, something:(){
pageNo = 1;
getFingerprintsListData();
deleteType: '1');
if (entity.errorCode!.codeIsSuccessful) {
if (state.isDeletAll == false) {
showToast('删除成功'.tr, something: () {
getFingerprintsListData(isRefresh: true);
});
}else{
showToast('重置成功'.tr, something:(){
pageNo = 1;
getFingerprintsListData();
} else {
showToast('重置成功'.tr, something: () {
getFingerprintsListData(isRefresh: true);
});
}
}
@ -347,35 +390,39 @@ class FingerprintListLogic extends BaseGetXController{
//
late StreamSubscription _teamEvent;
void _initRefreshAction() {
_teamEvent = eventBus.on<OtherTypeRefreshListEvent>().listen((OtherTypeRefreshListEvent event) {
pageNo = 1;
getFingerprintsListData();
_teamEvent = eventBus
.on<OtherTypeRefreshListEvent>()
.listen((OtherTypeRefreshListEvent event) {
getFingerprintsListData(isRefresh: true);
});
}
String getKeyType(FingerprintItemData fingerprintItemData){
String getKeyType(FingerprintItemData fingerprintItemData) {
// fingerprintStatus 1: 2:
String keyTypeStr = '';//
String keyTypeStr = ''; //
// (fingerprintItemData.fingerprintType! != 1) ? (fingerprintItemData.endDate! < DateTime.now().millisecondsSinceEpoch ? "已失效" : "") : ""
if(fingerprintItemData.fingerprintStatus == 1){
if(fingerprintItemData.startDate! > DateTime.now().millisecondsSinceEpoch){
if (fingerprintItemData.fingerprintStatus == 1) {
if (fingerprintItemData.startDate! >
DateTime.now().millisecondsSinceEpoch) {
keyTypeStr = '未生效'.tr;
}
}else if(fingerprintItemData.fingerprintStatus == 2){
} else if (fingerprintItemData.fingerprintStatus == 2) {
keyTypeStr = '已失效'.tr;
}
return keyTypeStr;
}
String getKeyDateType(FingerprintItemData fingerprintItemData){
String keyDateTypeStr = '';// :1;23:4
if(fingerprintItemData.fingerprintType! == 1){
keyDateTypeStr = "${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${"永久".tr}";
}else if(fingerprintItemData.fingerprintType! == 2){
keyDateTypeStr = '${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
}else if(fingerprintItemData.fingerprintType! == 4){
keyDateTypeStr = '${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
String getKeyDateType(FingerprintItemData fingerprintItemData) {
String keyDateTypeStr = ''; // :1;23:4
if (fingerprintItemData.fingerprintType! == 1) {
keyDateTypeStr =
"${DateTool().dateToYMDHNString(fingerprintItemData.createDate.toString())} ${"永久".tr}";
} else if (fingerprintItemData.fingerprintType! == 2) {
keyDateTypeStr =
'${DateTool().dateToYMDHNString(fingerprintItemData.startDate.toString())} - ${DateTool().dateToYMDHNString(fingerprintItemData.endDate.toString())} 限时';
} else if (fingerprintItemData.fingerprintType! == 4) {
keyDateTypeStr =
'${DateTool().dateToYMDString(fingerprintItemData.startDate.toString())}-${DateTool().dateToYMDString(fingerprintItemData.endDate.toString())} 循环';
}
return keyDateTypeStr;
}
@ -385,8 +432,8 @@ class FingerprintListLogic extends BaseGetXController{
super.onReady();
//
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false){
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_initReplySubscription();
_initRefreshAction();
@ -402,10 +449,10 @@ class FingerprintListLogic extends BaseGetXController{
Future<void> onClose() async {
super.onClose();
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false) {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_replySubscription.cancel();
_teamEvent.cancel();
}
}
}
}

View File

@ -1,5 +1,4 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -9,12 +8,10 @@ import 'package:star_lock/main/lockDetail/fingerprint/fingerprintList/fingerprin
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../tools/EasyRefreshTool.dart';
import '../../../../tools/appRouteObserver.dart';
import '../../../../tools/keySearchWidget.dart';
import '../../../../tools/noData.dart';
import '../../../../tools/showIosTipView.dart';
import '../../../../tools/showTipView.dart';
import '../../../../tools/storage.dart';
import '../../../../tools/submitBtn.dart';
@ -30,14 +27,17 @@ class FingerprintListPage extends StatefulWidget {
State<FingerprintListPage> createState() => _FingerprintListPageState();
}
class _FingerprintListPageState extends State<FingerprintListPage> with RouteAware {
class _FingerprintListPageState extends State<FingerprintListPage>
with RouteAware {
final FingerprintListLogic logic = Get.put(FingerprintListLogic());
final FingerprintListState state = Get.find<FingerprintListLogic>().state;
Future<void> getHttpData() async {
Future<void> getHttpData({required bool isRefresh}) async {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
logic.getFingerprintsListData().then((FingerprintListDataEntity value){
logic
.getFingerprintsListData(isRefresh: isRefresh)
.then((FingerprintListDataEntity value) {
if (mounted) {
setState(() {});
}
@ -49,7 +49,7 @@ class _FingerprintListPageState extends State<FingerprintListPage> with RouteAwa
void initState() {
super.initState();
getHttpData();
getHttpData(isRefresh: true);
}
@override
@ -83,20 +83,18 @@ class _FingerprintListPageState extends State<FingerprintListPage> with RouteAwa
],
),
body: EasyRefreshTool(
onRefresh: (){
logic.pageNo = 1;
getHttpData();
onRefresh: () {
getHttpData(isRefresh: true);
},
onLoad: (){
getHttpData();
onLoad: () {
getHttpData(isRefresh: false);
},
child: Column(
children: <Widget>[
KeySearchWidget(
editingController: state.searchController,
onSubmittedAction: () {
logic.pageNo = 1;
getHttpData();
getHttpData(isRefresh: true);
},
),
SizedBox(
@ -104,16 +102,16 @@ class _FingerprintListPageState extends State<FingerprintListPage> with RouteAwa
),
Expanded(child: _buildMainUI()),
AddBottomWhiteBtn(
btnName: '${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.fingerprint!.tr}',
btnName:
'${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.fingerprint!.tr}',
onClick: () async {
final data =
await Get.toNamed(Routers.addFingerprintTypePage, arguments: <String, int>{
'lockId': state.lockId.value,
'fromType': 1 // 1 2
});
final data = await Get.toNamed(Routers.addFingerprintTypePage,
arguments: <String, int>{
'lockId': state.lockId.value,
'fromType': 1 // 1 2
});
if (data != null) {
logic.pageNo = 1;
getHttpData();
getHttpData(isRefresh: true);
}
},
),
@ -127,61 +125,70 @@ class _FingerprintListPageState extends State<FingerprintListPage> with RouteAwa
Widget _buildMainUI() {
return Obx(() => state.fingerprintItemListData.value.isNotEmpty
? SlidableAutoCloseBehavior(
child: ListView.separated(
itemCount: state.fingerprintItemListData.value.length,
itemBuilder: (BuildContext c, int index) {
final FingerprintItemData fingerprintItemData = state.fingerprintItemListData.value[index];
//
return Slidable(
key:ValueKey(fingerprintItemData.fingerprintId),
endActionPane: ActionPane(
extentRatio: 0.2,
motion: const ScrollMotion(),
children: <Widget>[
SlidableAction(
onPressed: (BuildContext context){
ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, () async {
state.isDeletAll = false;
state.deletKeyID = fingerprintItemData.fingerprintId.toString();
state.deletFingerNo = int.parse(fingerprintItemData.fingerprintNumber!);
logic.senderAddFingerprint();
});
},
backgroundColor: Colors.red,
// foregroundColor: Colors.white,
label: '删除'.tr,
padding: EdgeInsets.only(left: 5.w, right: 5.w),
),
],
child: ListView.separated(
itemCount: state.fingerprintItemListData.value.length,
itemBuilder: (BuildContext c, int index) {
final FingerprintItemData fingerprintItemData =
state.fingerprintItemListData.value[index];
//
return Slidable(
key: ValueKey(fingerprintItemData.fingerprintId),
endActionPane: ActionPane(
extentRatio: 0.2,
motion: const ScrollMotion(),
children: <Widget>[
SlidableAction(
onPressed: (BuildContext context) {
ShowTipView().showIosTipWithContentDialog(
'确定要删除吗?'.tr, () async {
state.isDeletAll = false;
state.deletKeyID =
fingerprintItemData.fingerprintId.toString();
state.deletFingerNo = int.parse(
fingerprintItemData.fingerprintNumber!);
logic.senderAddFingerprint();
});
},
backgroundColor: Colors.red,
// foregroundColor: Colors.white,
label: '删除'.tr,
padding: EdgeInsets.only(left: 5.w, right: 5.w),
),
],
),
child: _keyItem(
'images/icon_fingerprint.png',
fingerprintItemData.fingerprintName!,
logic.getKeyType(fingerprintItemData),
logic.getKeyDateType(fingerprintItemData), () async {
final data = await Get.toNamed(Routers.fingerprintDetailPage,
arguments: <String, FingerprintItemData>{
'fingerprintItemData': fingerprintItemData,
});
if (data != null) {
getHttpData(isRefresh: true);
}
}),
);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
),
child: _keyItem(
'images/icon_fingerprint.png',
fingerprintItemData.fingerprintName!,
logic.getKeyType(fingerprintItemData),
logic.getKeyDateType(fingerprintItemData), () async {
final data = await Get.toNamed(
Routers.fingerprintDetailPage,
arguments: <String, FingerprintItemData>{
'fingerprintItemData': fingerprintItemData,
});
if (data != null) {
logic.pageNo = 1;
getHttpData();
}
}),
);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
),
) : NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 190.h - 64.h));
)
: NoData(
noDataHeight: 1.sh -
ScreenUtil().statusBarHeight -
ScreenUtil().bottomBarHeight -
190.h -
64.h));
}
Widget _keyItem(String lockTypeIcon, String lockTypeTitle, String ifInvalidation, String showTime, Function() action) {
Widget _keyItem(String lockTypeIcon, String lockTypeTitle,
String ifInvalidation, String showTime, Function() action) {
return GestureDetector(
onTap: action,
child: Container(
@ -205,24 +212,24 @@ class _FingerprintListPageState extends State<FingerprintListPage> with RouteAwa
// mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
SizedBox(
width: ifInvalidation.isNotEmpty ? 1.sw - 110.w - 100.w : 1.sw - 110.w - 50.w,
width: ifInvalidation.isNotEmpty
? 1.sw - 110.w - 100.w
: 1.sw - 110.w - 50.w,
child: Row(
children: <Widget>[
Flexible(
child: Text(
lockTypeTitle,
child: Text(lockTypeTitle,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor)
),
style: TextStyle(
fontSize: 24.sp,
color: AppColors.blackColor)),
),
],
),
),
Text(ifInvalidation,
style: TextStyle(
fontSize: 22.sp, color: Colors.red)),
style: TextStyle(fontSize: 22.sp, color: Colors.red)),
SizedBox(width: 10.w),
],
),
@ -301,5 +308,4 @@ class _FingerprintListPageState extends State<FingerprintListPage> with RouteAwa
}
state.ifCurrentScreen.value = false;
}
}

View File

@ -2,12 +2,17 @@ import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/iris/addIrisType/addIrisType_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart';
class AddIrisTypeLogic extends BaseGetXController {
AddIrisTypeState state = AddIrisTypeState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
void addIrisData() async {
var irisType = 0; // :1;23:4

View File

@ -57,14 +57,14 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (state.selectType.value == "1") {
if (state.selectType.value == '1') {
state.beginTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); //
state.endTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); //
} else {
state.beginTime.value = ""; //
state.endTime.value = ""; //
state.beginTime.value = ''; //
state.endTime.value = ''; //
}
});
}
@ -126,7 +126,7 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
Container(height: 10.h),
CommonItem(
leftTitel: titleStr,
rightTitle: "",
rightTitle: '',
isHaveRightWidget: true,
rightWidget: getTFWidget(rightTitle)),
Container(height: 10.h),
@ -174,7 +174,7 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
children: [
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle: "${state.beginTime.value}\n${state.endTime.value}",
rightTitle: '${state.beginTime.value}\n${state.endTime.value}',
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -197,8 +197,8 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
Obx(() => Visibility(
visible: state.weekdaysList.isNotEmpty ? true : false,
child: CommonItem(
leftTitel: "有效日",
rightTitle: state.weekdaysList.value.join(",").toString(),
leftTitel: '有效日'.tr,
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -221,9 +221,9 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
Obx(() => Visibility(
visible: state.effectiveDateTime.value.isNotEmpty,
child: CommonItem(
leftTitel: "有效时间".tr,
leftTitel: '有效时间'.tr,
rightTitle:
"${state.effectiveDateTime.value}-${state.failureDateTime.value}",
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
isHaveDirection: true,
action: () async {
var result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
@ -255,8 +255,8 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
? true
: false,
child: CommonItem(
leftTitel: "是否为管理员".tr,
rightTitle: "",
leftTitel: '是否为管理员'.tr,
rightTitle: '',
isTipsImg: false,
isHaveRightWidget: true,
rightWidget: SizedBox(
@ -268,13 +268,13 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
if (state.nameController.text.isEmpty) {
logic.showToast("请输入姓名");
logic.showToast('请输入姓名');
return;
}
logic.checkIrisNameDuplicated(state.nameController.text);
} else {
// Get.toNamed(Routers.selectLockTypePage);
logic.showToast("演示模式");
logic.showToast('演示模式');
}
}),
],

View File

@ -6,6 +6,7 @@ import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/main/lockDetail/iris/irisDetail/irisDetail_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../blue/blue_manage.dart';
// import '../../../../blue/io_protocol/io_addICCard.dart';
@ -20,6 +21,10 @@ import '../../../../tools/storage.dart';
class IrisDetailLogic extends BaseGetXController {
IrisDetailState state = IrisDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {

View File

@ -108,7 +108,7 @@ class _CardDetailPageState extends State<CardDetailPage> with RouteAware {
visible: state.keyType.value == 4 ? true : false,
child: Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr,
rightTitle: state.weekDay.value.join(','),
rightTitle: logic.weekDayStr.join(','),
isHaveDirection: true,
isHaveLine: true,
action: () async {

View File

@ -253,6 +253,71 @@ class _LockDetailPageState extends State<LockDetailPage>
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
const Spacer(),
GestureDetector(
onTap: () {
ShowTipView().showSureAlertDialog(
"${"锁电量更新时间:".tr}${DateTool().dateToYMDHNString(state.keyInfos.value.electricQuantityDate!.toString())}");
},
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Image.asset(showElectricIcon(state.electricQuantity.value),
width: 30.w, height: 24.w),
SizedBox(width: 2.w),
Text('${state.electricQuantity.value}%',
style: TextStyle(
fontSize: 18.sp,
color: AppColors.darkGrayTextColor)),
SizedBox(width: 2.w),
Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
),
SizedBox(width: 20.w),
],
),
SizedBox(
height: 15.h,
),
Visibility(
visible: state
.keyInfos.value.lockFeature!.isSupportBackupBattery ==
1,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FlavorsImg(
child: Image.asset(
showElectricIcon(
state.electricQuantityStandby.value),
width: 30.w,
height: 24.w),
),
SizedBox(width: 2.w),
Text('${state.electricQuantityStandby.value}%',
style: TextStyle(
fontSize: 18.sp,
color: AppColors.darkGrayTextColor)),
SizedBox(width: 2.w),
FlavorsImg(
child: Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
),
),
SizedBox(width: 20.w),
],
),
)
],
),
),
GestureDetector(
onTap: () {
if (state.openDoorBtnisUneable.value == true) {
@ -282,7 +347,7 @@ class _LockDetailPageState extends State<LockDetailPage>
spreadRadius: 0,
),
]),
margin: EdgeInsets.only(top: 20.h),
margin: EdgeInsets.only(top: 0.h),
child: Stack(
alignment: AlignmentDirectional.center,
children: <Widget>[
@ -326,10 +391,10 @@ class _LockDetailPageState extends State<LockDetailPage>
Padding(
padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
TranslationLoader
@ -339,76 +404,12 @@ class _LockDetailPageState extends State<LockDetailPage>
fontSize: 20.sp,
),
),
SizedBox(
height: 16.h,
),
adminInfoView(center: false, max: false),
],
),
GestureDetector(
onTap: () {
ShowTipView().showSureAlertDialog(
"${"锁电量更新时间:".tr}${DateTool().dateToYMDHNString(state.keyInfos.value.electricQuantityDate!.toString())}");
},
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Image.asset(
showElectricIcon(state.electricQuantity.value),
width: 30.w,
height: 24.w),
SizedBox(width: 2.w),
Text('${state.electricQuantity.value}%',
style: TextStyle(
fontSize: 18.sp,
color: AppColors.darkGrayTextColor)),
SizedBox(width: 2.w),
Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
),
SizedBox(width: 20.w),
],
),
SizedBox(
height: 15.h,
),
Visibility(
visible: state.keyInfos.value.lockFeature!
.isSupportBackupBattery ==
1,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FlavorsImg(
child: Image.asset(
showElectricIcon(
state.electricQuantityStandby.value),
width: 30.w,
height: 24.w),
),
SizedBox(width: 2.w),
Text('${state.electricQuantityStandby.value}%',
style: TextStyle(
fontSize: 18.sp,
color: AppColors.darkGrayTextColor)),
SizedBox(width: 2.w),
FlavorsImg(
child: Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
),
),
SizedBox(width: 20.w),
],
),
)
],
),
)
],
),
)
@ -760,6 +761,24 @@ class _LockDetailPageState extends State<LockDetailPage>
? AppColors.mainColor
: AppColors.btnDisableColor),
),
if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w),
FlavorsImg(
child: Image.asset('images/main/icon_lockDetail_needNetwork.png',
width: 24.w,
height: 20.w,
color: state.keyInfos.value.appUnlockOnline == 1
? AppColors.mainColor
: AppColors.btnDisableColor),
),
SizedBox(width: 6.w),
Text(
'手机需联网',
style: TextStyle(
fontSize: 20.sp,
color: state.keyInfos.value.appUnlockOnline == 1
? AppColors.mainColor
: AppColors.btnDisableColor),
),
if (add) ...<Widget>[
const Spacer(),
GestureDetector(

View File

@ -1,21 +1,31 @@
import 'dart:async';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../../tools/baseGetXController.dart';
import '../../../../../tools/eventBusEventManage.dart';
import '../../lockSet/lockSet_logic.dart';
import 'basicInformation_state.dart';
class BasicInformationLogic extends BaseGetXController{
class BasicInformationLogic extends BaseGetXController {
final BasicInformationState state = BasicInformationState();
List<dynamic> get weekDayStr {
return state.lockBasicInfo.value.weekDays
?.map((e) => TimeUtils.translateWeekday(e))
.toList() ??
[];
}
//
StreamSubscription? _passCurrentLockInformationEvent;
void initLoadDataAction(BlockSetStateCallback blockSetStateCallback) {
// eventBus
_passCurrentLockInformationEvent = eventBus.on<PassCurrentLockInformationEvent>().listen((PassCurrentLockInformationEvent event) {
_passCurrentLockInformationEvent = eventBus
.on<PassCurrentLockInformationEvent>()
.listen((PassCurrentLockInformationEvent event) {
state.lockSetInfoData.value = event.lockSetInfoData;
blockSetStateCallback();
});
@ -25,7 +35,8 @@ class BasicInformationLogic extends BaseGetXController{
void onReady() {
super.onReady();
AppLog.log('厂商 vendor:${state.lockBasicInfo.value.vendor} 型号 model:${state.lockBasicInfo.value.model}');
AppLog.log(
'厂商 vendor:${state.lockBasicInfo.value.vendor} 型号 model:${state.lockBasicInfo.value.model}');
}
@override
@ -33,5 +44,4 @@ class BasicInformationLogic extends BaseGetXController{
super.onClose();
_passCurrentLockInformationEvent?.cancel();
}
}
}

View File

@ -89,7 +89,7 @@ class _BasicInformationPageState extends State<BasicInformationPage> {
visible: (state.lockBasicInfo.value.keyType ?? 0) == 4,
child: CommonItem(
leftTitel: '有效日'.tr,
rightTitle: (state.lockBasicInfo.value.weekDays ?? []).join(',').toString(),
rightTitle: logic.weekDayStr.join(',').toString(),
allHeight: 70.h,
isHaveLine: true),
)),

View File

@ -8,15 +8,15 @@ import 'package:file_picker/file_picker.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:http/http.dart' as http;
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.dart';
import 'package:star_lock/blue/io_protocol/io_processOtaUpgrade.dart';
import 'package:star_lock/blue/io_reply.dart';
import 'package:star_lock/blue/io_tool/io_tool.dart';
import 'package:star_lock/blue/io_tool/manager_event_bus.dart';
import 'package:star_lock/blue/sender_manage.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSet_logic.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/version_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/commonDataManage.dart';
import 'package:star_lock/tools/showTipView.dart';
@ -34,17 +34,8 @@ class LockEscalationLogic extends BaseGetXController {
int otaIndex = 0;
Uint8List? otaBin;
int startSecond = 0;
Map? headJson = null;
//
Future<void> setLockSetGeneralSetting() async {
// var entity = await ApiRepository.to.getLockVersionInfoData(
// lockId: state.getKeyInfosData.value.lockId.toString(),
// );
// if(entity.errorCode!.codeIsSuccessful){
//
// }
}
Map? headJson;
FwVersionEntity? entity;
//
Future<void> otaUpdate() async {
@ -58,6 +49,10 @@ class LockEscalationLogic extends BaseGetXController {
}
final File file = File(result.files.single.path!);
final Uint8List data = await file.readAsBytes();
stateUpData(data);
}
Future<void> stateUpData(Uint8List data) async {
headJson = await getHeadFile(data);
if (headJson is! Map) {
return;
@ -69,10 +64,10 @@ class LockEscalationLogic extends BaseGetXController {
final String md5Str = md5.convert(otaBin!).toString();
headJson!['fwMd5'] = md5Str;
ShowTipView().showIosTipWithContentDialog('未避免异常情况,请在门打开时升级'.tr, () async {
blueOTAUpgrade(headJson!, [0, 0, 0, 0]);
blueOTAUpgrade(headJson!, <int>[0, 0, 0, 0]);
EasyLoading.show(
status: '设备连接中...'.tr, maskType: EasyLoadingMaskType.black);
Future.delayed(const Duration(seconds: 4), EasyLoading.dismiss);
Future<void>.delayed(const Duration(seconds: 4), EasyLoading.dismiss);
});
}
@ -81,9 +76,12 @@ class LockEscalationLogic extends BaseGetXController {
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
final privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final String uid = await Storage.getUid() ?? '';
BlueManage().writeCharacteristicWithResponse(OTAUpgradeCommand(
@ -236,17 +234,47 @@ class LockEscalationLogic extends BaseGetXController {
return bin;
}
//
Future<void> checkUpData() async {
final String model = CommonDataManage().currentKeyInfo.model ?? '';
String currentVersion = CommonDataManage().currentKeyInfo.fwVersion ?? '';
if (currentVersion.split('.').length >= 3) {
currentVersion = currentVersion.split('.')[0] +
'.' +
currentVersion.split('.')[1] +
'.' +
currentVersion.split('.')[2];
}
state.showVersion.value = currentVersion;
entity = await ApiRepository.to
.getFwVersion(model: model, currentVersion: currentVersion);
state.isShowUpDataBtn.value = entity?.data?.isUpdate == 1;
state.showNewVersion.value = entity?.data?.version??'';
}
//
Future<void> downloadTheFile() async {
if (entity?.data?.downloadUrl == null) {
return;
}
final String url = entity!.data!.downloadUrl!;
final http.Response response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
stateUpData(response.bodyBytes);
}
}
@override
void onReady() {
super.onReady();
setLockSetGeneralSetting();
checkUpData();
}
@override
void onInit() {
super.onInit();
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if (reply is OTAUpgradeReply) {
if (reply.status == 0x00) {
//

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/tools/commonDataManage.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/submitBtn.dart';
@ -63,29 +64,46 @@ class _LockEscalationPageState extends State<LockEscalationPage> {
SizedBox(
width: 10.w,
),
Text(
// TranslationLoader.lanKeys!.haveNewVersion!.tr,
"未发现新版本",
style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
)
Obx(() {
if (logic.state.isShowUpDataBtn.value) {
return Text(
TranslationLoader.lanKeys!.haveNewVersion!.tr + logic.state.showNewVersion.value,
style:
TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
);
} else {
return Text(
'已是最新版本'.tr,
style:
TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
);
}
})
],
),
SizedBox(
height: 30.h,
),
Text(
"${TranslationLoader.lanKeys!.currentVersion!.tr}1.0.0",
style: TextStyle(fontSize: 18.sp, color: AppColors.darkGrayTextColor),
),
Obx(() {
return Text(
'${TranslationLoader.lanKeys!.currentVersion!.tr}${logic.state.showVersion.value}',
style:
TextStyle(fontSize: 18.sp, color: AppColors.darkGrayTextColor),
);
}),
SizedBox(
height: 40.h,
),
Obx(() {
return !logic.state.otaUpdateIng.value
final bool show = !logic.state.otaUpdateIng.value &&
logic.state.isShowUpDataBtn.value;
return show
? SubmitBtn(
btnName: TranslationLoader.lanKeys!.upgrade!.tr,
onClick: () {})
: SizedBox();
onClick: () {
logic.downloadTheFile();
})
: const SizedBox();
}),
SizedBox(
height: 10.h,

View File

@ -1,6 +1,9 @@
import 'package:get/get.dart';
class LockEscalationState {
var otaUpdateIng = false.obs;
var otaProgress = 0.00.obs;
RxBool otaUpdateIng = false.obs;
RxDouble otaProgress = 0.00.obs;
RxBool isShowUpDataBtn = false.obs;
RxString showVersion = '1.0.0'.obs;
RxString showNewVersion = '1.0.0'.obs;
}

View File

@ -0,0 +1,48 @@
class FwVersionEntity {
FwVersionEntity({this.errorCode, this.description, this.errorMsg, this.data});
FwVersionEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
if (json['data'] is Map) {
data = Data.fromJson(json['data']);
}
}
int? errorCode;
String? description;
String? errorMsg;
Data? data;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
data['data'] = this.data;
return data;
}
}
class Data {
Data.fromJson(Map<String, dynamic> json) {
isUpdate = json['isUpdate'];
downloadUrl = json['downloadUrl'];
description = json['description'];
}
int? isUpdate;
String? downloadUrl;
String? description;
String? version;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['isUpdate'] = isUpdate;
data['downloadUrl'] = downloadUrl;
data['description'] = description;
data['version'] = version;
return data;
}
}

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'package:flutter/scheduler.dart';
@ -64,7 +63,8 @@ class LockSetLogic extends BaseGetXController {
// }
//
if (reply is UpdataLockSetReply && (state.ifCurrentScreen.value == true)) {
if (reply is UpdataLockSetReply &&
(state.ifCurrentScreen.value == true)) {
_replyUpdataLockSetReply(reply);
}
});
@ -128,11 +128,13 @@ class LockSetLogic extends BaseGetXController {
//
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? publicKey =
await Storage.getStringList(saveBluePublicKey);
final List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
final List<int> publicKeyDataList =
changeStringListToIntList(publicKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
@ -217,16 +219,19 @@ class LockSetLogic extends BaseGetXController {
//
Future<void> _replyUpdataLockSetReply(Reply reply) async {
final int status = reply.data[2];
switch(status){
switch (status) {
case 0x00:
//
//
dismissEasyLoading();
cancelBlueConnetctToastTimer();
_lockDataUpload(uploadType:1, recordType:0, records:reply.data.sublist(7, reply.data.length));
_lockDataUpload(
uploadType: 1,
recordType: 0,
records: reply.data.sublist(7, reply.data.length));
break;
case 0x06:
//
//
final List<int> token = reply.data.sublist(3, 7);
final List<String> saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList);
@ -294,11 +299,13 @@ class LockSetLogic extends BaseGetXController {
if (connectionState == BluetoothConnectionState.connected) {
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? publicKey =
await Storage.getStringList(saveBluePublicKey);
final List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
final List<int> publicKeyDataList =
changeStringListToIntList(publicKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
@ -358,14 +365,16 @@ class LockSetLogic extends BaseGetXController {
if (connectionState == BluetoothConnectionState.connected) {
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
final List<String>? publicKey =
await Storage.getStringList(saveBluePublicKey);
final List<int> getPublicKeyList = changeStringListToIntList(publicKey!);
final List<int> getPublicKeyList =
changeStringListToIntList(publicKey!);
state.settingUpSupportFeatures = type;
@ -404,7 +413,8 @@ class LockSetLogic extends BaseGetXController {
//
Future<LockSetInfoEntity> getLockSettingInfoData() async {
final LockSetInfoEntity entity = await ApiRepository.to.getLockSettingInfoData(
final LockSetInfoEntity entity =
await ApiRepository.to.getLockSettingInfoData(
lockId: state.lockId.toString(),
);
if (entity.errorCode!.codeIsSuccessful) {
@ -425,6 +435,8 @@ class LockSetLogic extends BaseGetXController {
state.lockSettingInfo.value.bluetoothBroadcast!;
state.isOpenExceptionWarnings.value =
state.lockSettingInfo.value.bluetoothBroadcast!;
state.isUnlockReminder.value =
state.lockSettingInfo.value.unlockReminder!;
}
return entity;
}
@ -432,7 +444,8 @@ class LockSetLogic extends BaseGetXController {
//
Future<void> openCheckingInData(
BlockSetCheckInCallback blockSetCheckInCallback) async {
final CheckingInInfoDataEntity entity = await ApiRepository.to.openCheckingInData(
final CheckingInInfoDataEntity entity =
await ApiRepository.to.openCheckingInData(
lockId: state.lockSetInfoData.value.lockId.toString(),
);
if (entity.errorCode!.codeIsSuccessful) {
@ -459,15 +472,15 @@ class LockSetLogic extends BaseGetXController {
//
Future<void> setLockPickingReminder() async {
final LoginEntity entity = await ApiRepository.to.setLockPickingReminderData(
final LoginEntity entity =
await ApiRepository.to.setLockPickingReminderData(
lockId: state.lockSetInfoData.value.lockId!,
unlockReminder: state.isLockPickingReminder.value == 1 ? 0 : 1,
unlockReminder: state.isUnlockReminder.value == 1 ? 0 : 1,
);
if (entity.errorCode!.codeIsSuccessful) {
state.isLockPickingReminder.value =
(state.isLockPickingReminder.value == 1 ? 0 : 1);
state.lockSettingInfo.value.unlockReminderPush =
state.isLockPickingReminder.value;
state.isUnlockReminder.value =
(state.isUnlockReminder.value == 1 ? 0 : 1);
state.lockSettingInfo.value.unlockReminder = state.isUnlockReminder.value;
showToast('设置成功'.tr, something: () {
eventBus.fire(RefreshLockListInfoDataEvent());
});
@ -519,7 +532,8 @@ class LockSetLogic extends BaseGetXController {
ShowTipView().showIosTipWithContentDialog('删除锁后,所有信息都会一起删除,确定删除锁吗?'.tr,
() {
//
ShowTipView().showTFViewAlertDialog(state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
ShowTipView().showTFViewAlertDialog(
state.passwordTF, '请输入登录密码'.tr, '请输入登录密码'.tr, checkLoginPassword);
});
} else if (state.lockBasicInfo.value.keyRight == 1) {
//
@ -597,7 +611,8 @@ class LockSetLogic extends BaseGetXController {
Future<void> getUpdataLockSet() async {
// showBlueConnetctToastTimer(action: (){
// });
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionState) async {
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState connectionState) async {
if (connectionState == BluetoothConnectionState.connected) {
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
@ -614,7 +629,8 @@ class LockSetLogic extends BaseGetXController {
//
Future<void> updataLockSet(List<int> token) async {
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
@ -626,26 +642,21 @@ class LockSetLogic extends BaseGetXController {
token: token,
needAuthor: 1,
signKey: signKeyDataList,
privateKey: getPrivateKeyList
);
privateKey: getPrivateKeyList);
}
//
Future<void> _lockDataUpload({
required int uploadType,
required int recordType,
required List records
}) async{
Future<void> _lockDataUpload(
{required int uploadType,
required int recordType,
required List records}) async {
final LoginEntity entity = await ApiRepository.to.lockDataUpload(
lockId: CommonDataManage().currentKeyInfo.lockId!,
uploadType:uploadType,
uploadType: uploadType,
recordType: recordType,
records:records,
isUnShowLoading: true
);
if(entity.errorCode!.codeIsSuccessful){
}
records: records,
isUnShowLoading: true);
if (entity.errorCode!.codeIsSuccessful) {}
}
@override
@ -659,7 +670,6 @@ class LockSetLogic extends BaseGetXController {
@override
void onClose() {
_replySubscription.cancel();
_passCurrentLockInformationEvent!.cancel();
// _scanListDiscoveredDeviceSubscription.cancel();

View File

@ -653,9 +653,9 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: state.isLockPickingReminder.value == 1,
value: state.isUnlockReminder.value == 1,
onChanged: (bool value) {
setState(logic.setLockPickingReminder);
logic.setLockPickingReminder();
},
);
}

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'package:flutter/material.dart';
@ -15,13 +14,13 @@ class LockSetState {
final lockId = 0.obs;
var isOnlyOneData = false.obs;
var isAttendance = 0.obs;//
var isOpenLockNeedOnline = 0.obs;// APP开锁时是否需联网
var isAttendance = 0.obs; //
var isOpenLockNeedOnline = 0.obs; // APP开锁时是否需联网
var isLockPickingReminder = 0.obs;//
var isOpenBlueBroadcast = 0.obs;// 广
var isOpenExceptionWarnings = 0.obs;//
var isOpenStayWarn = 0.obs;//
var isUnlockReminder = 0.obs; //
var isOpenBlueBroadcast = 0.obs; // 广
var isOpenExceptionWarnings = 0.obs; //
var isOpenStayWarn = 0.obs; //
var passwordTF = TextEditingController();
@ -34,4 +33,4 @@ class LockSetState {
lockId.value = map["lockId"];
isOnlyOneData.value = map["isOnlyOneData"];
}
}
}

View File

@ -2,12 +2,17 @@ import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/palm/addPalmType/addPalmType_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart';
class AddPalmTypeLogic extends BaseGetXController {
AddPalmTypeState state = AddPalmTypeState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
void addPalmData() async {
var palmType = 0; // :1;23:4

View File

@ -57,14 +57,14 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (state.selectType.value == "1") {
if (state.selectType.value == '1') {
state.beginTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); //
state.endTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); //
} else {
state.beginTime.value = ""; //
state.endTime.value = ""; //
state.beginTime.value = ''; //
state.endTime.value = ''; //
}
});
}
@ -126,7 +126,7 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
Container(height: 10.h),
CommonItem(
leftTitel: titleStr,
rightTitle: "",
rightTitle: '',
isHaveRightWidget: true,
rightWidget: getTFWidget(rightTitle)),
Container(height: 10.h),
@ -174,7 +174,7 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
children: [
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle: "${state.beginTime.value}\n${state.endTime.value}",
rightTitle: '${state.beginTime.value}\n${state.endTime.value}',
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -195,10 +195,10 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
}
})),
Obx(() => Visibility(
visible: state.weekdaysList.isNotEmpty ? true : false,
visible: state.weekdaysList.isNotEmpty,
child: CommonItem(
leftTitel: "有效日",
rightTitle: state.weekdaysList.value.join(",").toString(),
leftTitel: '有效日'.tr,
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -221,9 +221,9 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
Obx(() => Visibility(
visible: state.effectiveDateTime.value.isNotEmpty,
child: CommonItem(
leftTitel: "有效时间".tr,
leftTitel: '有效时间'.tr,
rightTitle:
"${state.effectiveDateTime.value}-${state.failureDateTime.value}",
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
isHaveDirection: true,
action: () async {
var result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
@ -255,8 +255,8 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
? true
: false,
child: CommonItem(
leftTitel: "是否为管理员".tr,
rightTitle: "",
leftTitel: '是否为管理员'.tr,
rightTitle: '',
isTipsImg: false,
isHaveRightWidget: true,
rightWidget: SizedBox(
@ -268,13 +268,13 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
if (state.nameController.text.isEmpty) {
logic.showToast("请输入姓名");
logic.showToast('请输入姓名');
return;
}
logic.checkPalmNameDuplicated(state.nameController.text);
} else {
// Get.toNamed(Routers.selectLockTypePage);
logic.showToast("演示模式");
logic.showToast('演示模式');
}
}),
],

View File

@ -6,13 +6,12 @@ import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/main/lockDetail/palm/palmDetail/palmDetail_state.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../blue/blue_manage.dart';
// import '../../../../blue/io_protocol/io_addICCard.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/dateTool.dart';
import '../../../../tools/storage.dart';
@ -20,6 +19,10 @@ import '../../../../tools/storage.dart';
class PalmDetailLogic extends BaseGetXController {
PalmDetailState state = PalmDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {

View File

@ -34,14 +34,14 @@ class _PalmDetailPageState extends State<PalmDetailPage> with RouteAware {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: "手掌详情",
barTitle: '手掌详情',
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: ListView(
children: [
Obx(() => CommonItem(
leftTitel: "手掌号",
leftTitel: '手掌号',
rightTitle: state.typeNumber.value,
isHaveDirection: false,
isHaveLine: true)),
@ -72,14 +72,14 @@ class _PalmDetailPageState extends State<PalmDetailPage> with RouteAware {
var data = await Get.toNamed(
Routers.otherTypeKeyChangeDatePage,
arguments: {
"pushType": 0,
"fingerprintItemData":
'pushType': 0,
'fingerprintItemData':
state.fingerprintItemData.value,
});
if (data != null) {
setState(() {
state.starDate.value = data["beginTimeTimestamp"];
state.endDate.value = data["endTimeTimestamp"];
state.starDate.value = data['beginTimeTimestamp'];
state.endDate.value = data['endTimeTimestamp'];
state.keyType.value = 2;
});
}
@ -88,68 +88,68 @@ class _PalmDetailPageState extends State<PalmDetailPage> with RouteAware {
var data = await Get.toNamed(
Routers.otherTypeKeyChangeValidityDatePage,
arguments: {
"pushType": 0,
"fingerprintItemData":
'pushType': 0,
'fingerprintItemData':
state.fingerprintItemData.value,
});
if (data != null) {
setState(() {
state.starDate.value = data["starDate"];
state.endDate.value = data["endDate"];
state.starTime.value = data["starTime"];
state.endTime.value = data["endTime"];
state.weekDay.value = data["weekDay"];
state.starDate.value = data['starDate'];
state.endDate.value = data['endDate'];
state.starTime.value = data['starTime'];
state.endTime.value = data['endTime'];
state.weekDay.value = data['weekDay'];
});
}
}
}))),
Obx(() => Visibility(
visible: state.keyType.value == 4 ? true : false,
visible: state.keyType.value == 4 ,
child: Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveDay!.tr,
rightTitle: state.weekDay.value.join(','),
rightTitle: logic.weekDayStr.join(','),
isHaveDirection: true,
isHaveLine: true,
action: () async {
var data = await Get.toNamed(
Routers.otherTypeKeyChangeValidityDatePage,
arguments: {
"pushType": 0,
"fingerprintItemData":
'pushType': 0,
'fingerprintItemData':
state.fingerprintItemData.value,
});
if (data != null) {
setState(() {
state.starDate.value = data["starDate"];
state.endDate.value = data["endDate"];
state.starTime.value = data["starTime"];
state.endTime.value = data["endTime"];
state.weekDay.value = data["weekDay"];
state.starDate.value = data['starDate'];
state.endDate.value = data['endDate'];
state.starTime.value = data['starTime'];
state.endTime.value = data['endTime'];
state.weekDay.value = data['weekDay'];
});
}
})))),
Obx(() => Visibility(
visible: state.keyType.value == 4 ? true : false,
child: Obx(() => CommonItem(
leftTitel: "有效时间",
leftTitel: '有效时间',
rightTitle:
"${DateTool().dateToHNString(state.starTime.value)}-${DateTool().dateToHNString(state.endTime.value)}",
'${DateTool().dateToHNString(state.starTime.value)}-${DateTool().dateToHNString(state.endTime.value)}',
isHaveDirection: true,
action: () async {
var data = await Get.toNamed(
Routers.otherTypeKeyChangeValidityDatePage,
arguments: {
"pushType": 0,
"fingerprintItemData":
'pushType': 0,
'fingerprintItemData':
state.fingerprintItemData.value,
});
if (data != null) {
setState(() {
state.starDate.value = data["starDate"];
state.endDate.value = data["endDate"];
state.starTime.value = data["starTime"];
state.endTime.value = data["endTime"];
state.weekDay.value = data["validityValue"];
state.starDate.value = data['starDate'];
state.endDate.value = data['endDate'];
state.starTime.value = data['starTime'];
state.endTime.value = data['endTime'];
state.weekDay.value = data['validityValue'];
});
}
})))),
@ -166,7 +166,7 @@ class _PalmDetailPageState extends State<PalmDetailPage> with RouteAware {
SizedBox(height: 10.h),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.operatingRecord!.tr,
rightTitle: "",
rightTitle: '',
isHaveDirection: true,
action: () {
// Get.toNamed(Routers.keyOperationRecordPage, arguments: {
@ -199,11 +199,11 @@ class _PalmDetailPageState extends State<PalmDetailPage> with RouteAware {
return ShowTFView(
title:
"${TranslationLoader.lanKeys!.amend!.tr}${TranslationLoader.lanKeys!.name!.tr}",
tipTitle: "",
tipTitle: '',
controller: state.changeNameController,
sureClick: () {
if (state.changeNameController.text.isEmpty) {
logic.showToast("请输入姓名");
logic.showToast('请输入姓名');
return;
}
Get.back();
@ -222,8 +222,8 @@ class _PalmDetailPageState extends State<PalmDetailPage> with RouteAware {
context: context,
builder: (BuildContext context) {
return ShowIosTipView(
title: "提示",
tipTitle: "确定要删除吗?",
title: '提示',
tipTitle: '确定要删除吗?',
sureClick: () async {
Get.back();
String? idStr = await Storage.getUid();

View File

@ -25,13 +25,16 @@ class PasswordKeyListLogic extends BaseGetXController {
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
// ()
if ((reply is SenderCustomPasswordsReply) && (state.ifCurrentScreen.value == true)) {
if ((reply is SenderCustomPasswordsReply) &&
(state.ifCurrentScreen.value == true)) {
_replyAddPassword(reply);
}
if ((reply is SenderResetPasswordsReply) && (state.ifCurrentScreen.value == true)) {
if ((reply is SenderResetPasswordsReply) &&
(state.ifCurrentScreen.value == true)) {
_replyResetPassword(reply);
}
});
@ -49,10 +52,13 @@ class PasswordKeyListLogic extends BaseGetXController {
break;
case 0x06:
//
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<int> token = reply.data.sublist(5, 9);
@ -95,10 +101,13 @@ class PasswordKeyListLogic extends BaseGetXController {
break;
case 0x06:
//
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<int> token = reply.data.sublist(5, 9);
@ -131,11 +140,14 @@ class PasswordKeyListLogic extends BaseGetXController {
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
@ -182,11 +194,14 @@ class PasswordKeyListLogic extends BaseGetXController {
BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? privateKey =
await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
@ -255,26 +270,16 @@ class PasswordKeyListLogic extends BaseGetXController {
state.itemDataList.addAll(entity.data!.itemList!);
//
pageNo++;
// if (pageNo == 1) {
// state.itemDataList.value.clear();
// state.itemDataList.value = entity.data!.itemList!;
// pageNo++;
// } else {
// if (entity.data!.itemList!.isNotEmpty) {
// state.itemDataList.value.addAll(entity.data!.itemList!);
// pageNo++;
// }
// }
}
return entity;
}
//
Future<void> resetPasswordKeyListRequest() async {
final PasswordKeyListEntity entity = await ApiRepository.to.keyboardPwdReset(
lockId: state.keyInfo.value.lockId.toString(),
passwordKey: state.encrpyKey);
final PasswordKeyListEntity entity = await ApiRepository.to
.keyboardPwdReset(
lockId: state.keyInfo.value.lockId.toString(),
passwordKey: state.encrpyKey);
if (entity.errorCode!.codeIsSuccessful) {
showToast('重置成功'.tr, something: () {
pageNo = 1;
@ -390,8 +395,9 @@ class PasswordKeyListLogic extends BaseGetXController {
StreamSubscription? _getPasswordListRefreshUIEvent;
void _getPasswordListRefreshUIAction() {
// eventBus
_getPasswordListRefreshUIEvent =
eventBus.on<GetPasswordListRefreshUI>().listen((GetPasswordListRefreshUI event) {
_getPasswordListRefreshUIEvent = eventBus
.on<GetPasswordListRefreshUI>()
.listen((GetPasswordListRefreshUI event) {
mockNetworkDataRequest(isRefresh: true);
});
}

View File

@ -354,7 +354,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
return Column(
children: <Widget>[
CommonItem(
leftTitel: '有效日',
leftTitel: '有效日'.tr,
rightTitle: state.loopModeStr.value,
isHaveLine: true,
isHaveDirection: true,

View File

@ -1,11 +1,16 @@
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import 'addRemoteControl_state.dart';
class AddRemoteControlLoigc extends BaseGetXController{
AddRemoteControlState state = AddRemoteControlState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
@override
void onInit() {

View File

@ -130,7 +130,7 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
children: [
CommonItem(
leftTitel: titleStr,
rightTitle: "",
rightTitle: '',
isHaveRightWidget: true,
rightWidget: getTFWidget(rightTitle)),
Container(height: 10.h),
@ -161,8 +161,8 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
rightTitle: state.timeLimitEndTime.value,
isHaveDirection: true,
action: () {
PDuration selectDate =
PDuration.parse(DateTime.tryParse(state.timeLimitEndTime.value));
PDuration selectDate = PDuration.parse(
DateTime.tryParse(state.timeLimitEndTime.value));
Pickers.showDatePicker(context,
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (p) {
state.timeLimitEndTime.value =
@ -181,7 +181,7 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle:
"${state.cycleBeginTime.value}\n${state.cycleEndTime.value}",
'${state.cycleBeginTime.value}\n${state.cycleEndTime.value}',
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -202,10 +202,10 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
}
})),
Obx(() => Visibility(
visible: state.weekdaysList.isNotEmpty ? true : false,
visible: state.weekdaysList.isNotEmpty,
child: CommonItem(
leftTitel: "有效日".tr,
rightTitle: state.weekdaysList.value.join(",").toString(),
leftTitel: '有效日'.tr,
rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true,
isHaveLine: true,
action: () async {
@ -228,9 +228,9 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
Obx(() => Visibility(
visible: state.effectiveDateTime.value.isNotEmpty,
child: CommonItem(
leftTitel: "有效时间".tr,
leftTitel: '有效时间'.tr,
rightTitle:
"${state.effectiveDateTime.value}-${state.failureDateTime.value}",
'${state.effectiveDateTime.value}-${state.failureDateTime.value}',
isHaveDirection: true,
action: () async {
var result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
@ -270,14 +270,14 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
if (state.nameController.text.isEmpty) {
logic.showToast("请输入姓名");
logic.showToast('请输入姓名');
return;
}
logic.showToast("请确保在设备附近");
logic.showToast('请确保在设备附近');
// logic.addFingerprintsData();
} else {
// Get.toNamed(Routers.selectLockTypePage);
logic.showToast("演示模式");
logic.showToast('演示模式');
}
}),
],
@ -307,7 +307,7 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
height: 20.h,
),
Text(
"操作成功,密码为",
'操作成功,密码为',
style: TextStyle(
fontSize: 32.sp,
color: Colors.black,
@ -317,7 +317,7 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
height: 10.h,
),
Text(
"62689876",
'62689876',
style: TextStyle(
fontSize: 60.sp,
color: Colors.black,
@ -423,15 +423,15 @@ class _AddRemoteControlPageState extends State<AddRemoteControlPage>
}
final List<ItemView> _itemTabs = <ItemView>[
ItemView(title: TranslationLoader.lanKeys!.permanent!.tr, selectType: "0"),
ItemView(title: TranslationLoader.lanKeys!.timeLimit!.tr, selectType: "1"),
ItemView(title: TranslationLoader.lanKeys!.permanent!.tr, selectType: '0'),
ItemView(title: TranslationLoader.lanKeys!.timeLimit!.tr, selectType: '1'),
ItemView(
title: TranslationLoader.lanKeys!.circulation!.tr, selectType: "2"),
title: TranslationLoader.lanKeys!.circulation!.tr, selectType: '2'),
];
final List<ItemView> _fromCheckInTypeItemTabs = <ItemView>[
ItemView(title: TranslationLoader.lanKeys!.permanent!.tr, selectType: "0"),
ItemView(title: TranslationLoader.lanKeys!.timeLimit!.tr, selectType: "1"),
ItemView(title: TranslationLoader.lanKeys!.permanent!.tr, selectType: '0'),
ItemView(title: TranslationLoader.lanKeys!.timeLimit!.tr, selectType: '1'),
];
TabBar _tabBar() {

View File

@ -133,6 +133,7 @@ class LockListInfoItemEntity {
LockFeature? lockFeature;
LockSetting? lockSetting;
int? hasGateway;
int? appUnlockOnline;
String? mac;
LockListInfoItemEntity({
@ -169,6 +170,7 @@ class LockListInfoItemEntity {
this.model,
this.vendor,
this.hasGateway,
this.appUnlockOnline,
this.mac,
});
@ -212,6 +214,7 @@ class LockListInfoItemEntity {
? LockSetting.fromJson(json['lockSetting'])
: null;
hasGateway = json['hasGateway'];
appUnlockOnline = json['appUnlockOnline'];
mac = json['mac'];
}
@ -256,6 +259,7 @@ class LockListInfoItemEntity {
data['lockSetting'] = lockSetting!.toJson();
}
data['hasGateway'] = hasGateway;
data['appUnlockOnline'] = appUnlockOnline;
data['mac'] = mac;
return data;
}

View File

@ -58,12 +58,12 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
WidgetsBinding.instance.addPostFrameCallback((_) async {
logic.pageNo = 1;
getHttpData();
_initLoadDataAction();
setState(() {});
});
_initLoadDataAction();
}
@override

View File

@ -17,7 +17,7 @@ class StarLockMineLogic extends BaseGetXController {
final MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo();
if (entity.errorCode!.codeIsSuccessful) {
state.mineInfoData.value = entity.data!;
state.isVip.value = state.mineInfoData.value.isVip! == 0 ? false : true;
state.isVip.value = state.mineInfoData.value.isVip! == 1;
Storage.setBool(saveIsVip, state.isVip.value);
}
}

View File

@ -115,7 +115,7 @@ class AdvancedFeaturesWebLogic extends BaseGetXController {
if (canGoBack) {
await state.webBuyView.goBack();
} else if (state.allowReturn) {
Get.back();
Get.back(result: true);
} else {
if (_lastPressedAt == null ||
DateTime.now().difference(_lastPressedAt!) >

View File

@ -1,5 +1,7 @@
import 'dart:async';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_state.dart';
import 'package:star_lock/tools/storage.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart';
@ -12,4 +14,18 @@ class ValueAddedServicesListLogic extends BaseGetXController {
var entity = await ApiRepository.to.getServicePackageBuyUrl();
if (entity.errorCode!.codeIsSuccessful) {}
}
//
Future<void> getUserInfoRequest() async {
final MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo();
if (entity.errorCode!.codeIsSuccessful) {
Storage.setBool(saveIsVip, entity.data!.isVip! == 1);
}
}
@override
Future<void> onReady() async {
super.onReady();
getUserInfoRequest();
}
}

View File

@ -66,14 +66,19 @@ class _ValueAddedServicesPageListState
_valueAddedServicesItem(
Image.asset('images/mine/icon_mine_valueAddedServices_vip.png'),
TranslationLoader.lanKeys!.advancedFunction!.tr, () async {
bool? isVip = await Storage.getBool(saveIsVip);
final bool? isVip = await Storage.getBool(saveIsVip);
if (isVip == null || !isVip) {
// if (CommonDataManage().currentKeyInfo.isLockOwner != 1) {
// logic.showToast('请先添加锁');
// } else {
Get.toNamed(Routers.advancedFeaturesWebPage, arguments: {
'webBuyType': XSConstantMacro.webBuyTypeVip,
});
//
final result = await Get.toNamed(Routers.advancedFeaturesWebPage,
arguments: <String, int>{
'webBuyType': XSConstantMacro.webBuyTypeVip,
});
if (result != null && result.isNotEmpty) {
logic.getUserInfoRequest();
}
// }
} else {
Get.toNamed(Routers.valueAddedServicesHighFunctionPage);

View File

@ -240,4 +240,5 @@ abstract class Api {
final String lockDataUploadUrl = '/lockRecords/lockDataUpload'; //
final String getNoticeTemplateURL = '/key/getNoticeTemplate'; //
final String appGetAppInfoURL = '/app/getAppInfo'; //APP基本信息
final String appGetFwVersionURL = '/app/getFwVersion'; //
}

View File

@ -22,6 +22,7 @@ class ApiProvider extends BaseProvider {
String account,
String password,
String verificationCode,
Map deviceInfo,
) =>
post(
registerUrl.toUrl,
@ -32,6 +33,7 @@ class ApiProvider extends BaseProvider {
'password': password,
'verificationCode': verificationCode,
'platId': '2',
'deviceInfo': deviceInfo,
}));
// post(
@ -65,7 +67,7 @@ class ApiProvider extends BaseProvider {
}));
Future<Response> login(String loginType, String password, String countryCode,
String username) =>
String username, Map deviceInfo) =>
post(
loginUrl.toUrl,
jsonEncode({
@ -74,7 +76,8 @@ class ApiProvider extends BaseProvider {
'platId': '2',
'uniqueid': '477E6814-289D-402A-9F49-F89A8BD05D63',
'countryCode': countryCode,
'username': username
'username': username,
'deviceInfo': deviceInfo,
}));
Future<Response> resetPassword(
@ -2127,6 +2130,17 @@ class ApiProvider extends BaseProvider {
Future<Response<dynamic>> getAppInfo() =>
post(appGetAppInfoURL.toUrl, jsonEncode(<String, int>{}),
isShowErrMsg: false);
// App固件信息
Future<Response<dynamic>> getFwVersion(String model, String currentVersion) =>
post(
appGetFwVersionURL.toUrl,
jsonEncode(<String, dynamic>{
'model': model,
'currentVersion': currentVersion,
}),
isUnShowLoading: true,
);
}
extension ExtensionString on String {

View File

@ -9,6 +9,7 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart';
import 'package:star_lock/main/lockDetail/face/addFace/addFace_entity.dart';
import 'package:star_lock/main/lockDetail/lockSet/basicInformation/basicInformation/KeyDetailEntity.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockEscalation/version_entity.dart';
import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_entity.dart';
import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_entity.dart';
import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart';
@ -98,9 +99,10 @@ class ApiRepository {
required int countryCode,
required String account,
required String password,
required String verificationCode}) async {
final res = await apiProvider.register(
receiverType, countryCode, account, password, verificationCode);
required String verificationCode,
required Map deviceInfo}) async {
final res = await apiProvider.register(receiverType, countryCode, account,
password, verificationCode, deviceInfo);
return LoginEntity.fromJson(res.body);
}
@ -124,9 +126,10 @@ class ApiRepository {
{required String loginType,
required String password,
required String countryCode,
required String username}) async {
final res =
await apiProvider.login(loginType, password, countryCode, username);
required String username,
required Map deviceInfo}) async {
final res = await apiProvider.login(
loginType, password, countryCode, username, deviceInfo);
return LoginEntity.fromJson(res.body);
}
@ -2154,8 +2157,15 @@ class ApiRepository {
//
Future<GetAppInfo> getAppInfo() async {
final Response<dynamic> res =
await apiProvider.getAppInfo();
final Response<dynamic> res = await apiProvider.getAppInfo();
return GetAppInfo.fromJson(res.body);
}
//
Future<FwVersionEntity> getFwVersion(
{required String model, required String currentVersion}) async {
final Response<dynamic> res =
await apiProvider.getFwVersion(model, currentVersion);
return FwVersionEntity.fromJson(res.body);
}
}

View File

@ -1,3 +1,5 @@
import 'package:get/get_utils/get_utils.dart';
class TimeUtils {
///
static List calcYears({int begin = 1900, int end = 2100}) =>
@ -14,7 +16,7 @@ class TimeUtils {
static List calcDay(int year, int month, {int begin = 1, int end = 31}) {
begin = begin < 1 ? 1 : begin;
int days = _calcDateCount(year, month);
final int days = _calcDateCount(year, month);
if (end > days) {
end = days;
}
@ -37,11 +39,15 @@ class TimeUtils {
}
static List _calcCount(begin, end) {
int length = end - begin + 1;
if (length == 0) return [begin];
if (length < 0) return [];
final int length = end - begin + 1;
if (length == 0) {
return [begin];
}
if (length < 0) {
return [];
}
return List.generate(length, (index) => begin + index);
return List.generate(length, (int index) => begin + index);
}
//
@ -68,7 +74,22 @@ class TimeUtils {
return (v < 10) ? "0$v" : "$v";
}
// String _checkStr(String v) {
// return v == null ? "" : v;
// }
static String translateWeekday(int number,[int index=1]) {
final List<String> weekDays = <String>[
''.tr,
''.tr,
''.tr,
''.tr,
''.tr,
''.tr,
''.tr
];
final String days = weekDays[number- index];
return days; //
}
// String _checkStr(String v) {
// return v == null ? "" : v;
// }
}

View File

@ -3,6 +3,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:jpush_flutter/jpush_flutter.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -22,8 +23,15 @@ class XSJPushProvider {
return;
}
String appKey;
if (F.isSKY) {
appKey = '7ff37d174c1a568a89e98dad';
} else {
appKey = '251fc8074820d122b6de58d2';
}
jpush.setup(
appKey: '251fc8074820d122b6de58d2',
appKey: appKey,
channel: 'flutter_channel',
production: false,
debug: true,
@ -34,25 +42,24 @@ class XSJPushProvider {
);
addJPushEventHandler();
bindDeviceID();
}
//
void addJPushEventHandler() {
jpush.addEventHandler(
onReceiveNotification: (Map<String, dynamic> message) async {
AppLog.log('onReceiveNotification: $message');
},
onOpenNotification: (Map<String, dynamic> message) async {
AppLog.log('onOpenNotification: $message');
},
onReceiveMessage: (Map<String, dynamic> message) async {
AppLog.log('onReceiveMessage: $message');
},
onReceiveNotificationAuthorization: (Map<String, dynamic> message) async {
AppLog.log('onReceiveNotificationAuthorization: $message');
},
);
onReceiveNotification: (Map<String, dynamic> message) async {
AppLog.log('onReceiveNotification: $message');
}, onOpenNotification: (Map<String, dynamic> message) async {
AppLog.log('onOpenNotification: $message');
}, onReceiveMessage: (Map<String, dynamic> message) async {
AppLog.log('onReceiveMessage: $message');
//
}, onReceiveNotificationAuthorization:
(Map<String, dynamic> message) async {
AppLog.log('onReceiveNotificationAuthorization: $message');
}, onInAppMessageShow: (Map<String, dynamic> message) async {
AppLog.log('onInAppMessageShow: $message');
});
}
//ID