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

View File

@ -1,10 +1,11 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/appRouters.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/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/login/login/entity/LoginEntity.dart';
import 'package:star_lock/mine/mine/starLockMine_state.dart'; import 'package:star_lock/mine/mine/starLockMine_state.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
@ -44,12 +45,13 @@ class StarLockLoginLogic extends BaseGetXController {
loginType: '1', loginType: '1',
password: state.pwd.value, password: state.pwd.value,
countryCode: state.countryCode.value, countryCode: state.countryCode.value,
username: state.emailOrPhone.value); username: state.emailOrPhone.value,
deviceInfo: state.deviceInfoMap.value);
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
Storage.saveLoginData(entity.data); Storage.saveLoginData(entity.data);
Storage.setBool(saveIsVip, entity.data!.isVip == 0 ? false : true); Storage.setBool(saveIsVip, entity.data!.isVip == 1);
eventBus.fire(MineInfoChangeRefreshUI()); eventBus.fire(MineInfoChangeRefreshUI());
XSJPushProvider().initJPushService(); XSJPushProvider().bindDeviceID();
XSJPushProvider().initLocalNotification(isCancelLocalPush: false); XSJPushProvider().initLocalNotification(isCancelLocalPush: false);
Get.offNamedUntil(Routers.starLockMain, (Route route) => false); Get.offNamedUntil(Routers.starLockMain, (Route route) => false);
BlueManage().scanDevices.clear(); // BlueManage().scanDevices.clear(); //
@ -86,4 +88,16 @@ class StarLockLoginLogic extends BaseGetXController {
state.onClose(); state.onClose();
super.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 emailOrPhoneFocusNode = FocusNode();
FocusNode pwdFocusNode = FocusNode(); FocusNode pwdFocusNode = FocusNode();
RxMap<String, dynamic> deviceInfoMap = <String, dynamic>{}.obs;
StarLockLoginState() { StarLockLoginState() {
// emailOrPhone.value = StoreService.to.getLastUserAccount() as String; // emailOrPhone.value = StoreService.to.getLastUserAccount() as String;

View File

@ -1,9 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.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/login/entity/LoginEntity.dart';
import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart'; import 'package:star_lock/login/register/entity/SendValidationCodeEntity.dart';
@ -33,8 +34,10 @@ class StarLockRegisterLogic extends BaseGetXController {
} }
Future<void> register() async { 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); showToast('密码不一致哦'.tr);
return; return;
} }
@ -43,12 +46,14 @@ class StarLockRegisterLogic extends BaseGetXController {
countryCode: int.parse(state.countryCode.value), countryCode: int.parse(state.countryCode.value),
account: state.phoneOrEmailStr.value, account: state.phoneOrEmailStr.value,
password: state.pwd.value, password: state.pwd.value,
verificationCode: state.verificationCode.value); verificationCode: state.verificationCode.value,
deviceInfo: state.deviceInfoMap.value);
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
showToast('注册成功'.tr); showToast('注册成功'.tr);
Get.back(result:<String, String>{
'phoneOrEmailStr':state.phoneOrEmailStr.value, Get.back(result: <String, String>{
'pwd':state.pwd.value 'phoneOrEmailStr': state.phoneOrEmailStr.value,
'pwd': state.pwd.value
}); });
} }
} }
@ -96,4 +101,16 @@ class StarLockRegisterLogic extends BaseGetXController {
state.codeIsOK && state.codeIsOK &&
(state.isIphoneType.value ? state.isIphone : state.isEmail); (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; RxString btnText = ''.obs;
int totalSeconds = 120; int totalSeconds = 120;
int currentSecond = 120; int currentSecond = 120;
RxMap<String, dynamic> deviceInfoMap = <String, dynamic>{}.obs;
void resetResend() { void resetResend() {
canResend.value = totalSeconds == currentSecond; canResend.value = totalSeconds == currentSecond;

View File

@ -193,18 +193,21 @@ class _StarLockRegisterPageState extends State<StarLockRegisterXHJPage> {
), ),
Obx(() => GestureDetector( Obx(() => GestureDetector(
onTap: 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}); // Navigator.pushNamed(context, Routers.safetyVerificationPage, arguments: {"countryCode":"+86", "account":state.phoneOrEmailStr.value});
if(state.pwd.value != state.surePwd.value){ if (state.pwd.value != state.surePwd.value) {
logic.showToast("密码不一致哦".tr); logic.showToast("密码不一致哦".tr);
return; return;
} }
var result = await Get.toNamed(Routers.safetyVerificationPage, var result = await Get.toNamed(
Routers.safetyVerificationPage,
arguments: { arguments: {
"countryCode": state.countryCode, "countryCode": state.countryCode,
"account": state.phoneOrEmailStr.value "account": state.phoneOrEmailStr.value
}); });
state.xWidth.value = (result as Map<String, dynamic>)['xWidth']; state.xWidth.value =
(result as Map<String, dynamic>)['xWidth'];
logic.sendValidationCode(); logic.sendValidationCode();
} }
: null, : 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/bugly/bugly_tool.dart';
import 'package:star_lock/tools/device_info_service.dart'; import 'package:star_lock/tools/device_info_service.dart';
import 'package:star_lock/tools/platform_info_services.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 'package:star_lock/translations/trans_lib.dart';
import 'app.dart'; import 'app.dart';
@ -27,6 +28,8 @@ FutureOr<void> main() async {
// bugly错误日志监控 // bugly错误日志监控
await BuglyTool.init(); await BuglyTool.init();
await XSJPushProvider().initJPushService();
runApp(const MyApp()); runApp(const MyApp());
if (AppPlatform.isAndroid) { if (AppPlatform.isAndroid) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,3 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.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 CardListLogic logic = Get.put(CardListLogic());
final CardListState state = Get.find<CardListLogic>().state; 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); final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) { if (isDemoMode == false) {
logic.getICCardListData().then((FingerprintListDataEntity value){ logic
if(mounted) { .getICCardListData(isRefresh: isRefresh)
.then((FingerprintListDataEntity value) {
if (mounted) {
setState(() {}); setState(() {});
} }
}); });
@ -46,12 +47,11 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
void initState() { void initState() {
super.initState(); super.initState();
getHttpData(); getHttpData(isRefresh: true);
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
backgroundColor: AppColors.mainBackgroundColor, backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar( appBar: TitleAppBar(
@ -67,7 +67,8 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
onPressed: () async { onPressed: () async {
final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); final bool? isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) { if (isDemoMode == false) {
ShowTipView().showIosTipWithContentDialog('重置后,该锁的卡都将被删除哦,确认要重置吗?'.tr, () async { ShowTipView().showIosTipWithContentDialog(
'重置后,该锁的卡都将被删除哦,确认要重置吗?'.tr, () async {
state.isDeletAll = true; state.isDeletAll = true;
state.deletKeyID = '0'; state.deletKeyID = '0';
state.deletCardNo = 0; state.deletCardNo = 0;
@ -82,34 +83,33 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
], ],
), ),
body: EasyRefreshTool( body: EasyRefreshTool(
onRefresh: (){ onRefresh: () {
logic.pageNo = 1; getHttpData(isRefresh: true);
getHttpData();
}, },
onLoad: (){ onLoad: () {
getHttpData(); getHttpData(isRefresh: false);
}, },
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
KeySearchWidget( KeySearchWidget(
editingController: state.searchController, editingController: state.searchController,
onSubmittedAction: () { onSubmittedAction: () {
logic.pageNo = 1; getHttpData(isRefresh: true);
getHttpData();
}, },
), ),
SizedBox(height: 20.h), SizedBox(height: 20.h),
Expanded(child: _buildMainUI()), Expanded(child: _buildMainUI()),
AddBottomWhiteBtn( AddBottomWhiteBtn(
btnName: '${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.card!.tr}', btnName:
'${TranslationLoader.lanKeys!.add!.tr}${TranslationLoader.lanKeys!.card!.tr}',
onClick: () async { onClick: () async {
final data = await Get.toNamed(Routers.addCardPage, arguments: <String, int>{ final data = await Get.toNamed(Routers.addCardPage,
'lockId': state.lockId.value, arguments: <String, int>{
'fromType': 1 // 1 2 'lockId': state.lockId.value,
}); 'fromType': 1 // 1 2
});
if (data != null) { if (data != null) {
logic.pageNo = 1; getHttpData(isRefresh: true);
getHttpData();
} }
}, },
), ),
@ -125,59 +125,69 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
Widget _buildMainUI() { Widget _buildMainUI() {
return Obx(() => state.fingerprintItemListData.value.isNotEmpty return Obx(() => state.fingerprintItemListData.value.isNotEmpty
? SlidableAutoCloseBehavior( ? SlidableAutoCloseBehavior(
child: ListView.separated( child: ListView.separated(
itemCount: state.fingerprintItemListData.value.length, itemCount: state.fingerprintItemListData.value.length,
itemBuilder: (BuildContext c, int index) { itemBuilder: (BuildContext c, int index) {
final FingerprintItemData fingerprintItemData = state.fingerprintItemListData.value[index]; final FingerprintItemData fingerprintItemData =
return Slidable( state.fingerprintItemListData.value[index];
key:ValueKey(fingerprintItemData.fingerprintId), return Slidable(
endActionPane: ActionPane( key: ValueKey(fingerprintItemData.fingerprintId),
extentRatio: 0.2, endActionPane: ActionPane(
motion: const ScrollMotion(), extentRatio: 0.2,
children: <Widget>[ motion: const ScrollMotion(),
SlidableAction( children: <Widget>[
onPressed: (BuildContext context){ SlidableAction(
ShowTipView().showIosTipWithContentDialog('确定要删除吗?'.tr, () async { onPressed: (BuildContext context) {
state.isDeletAll = false; ShowTipView().showIosTipWithContentDialog(
state.deletKeyID = fingerprintItemData.cardId.toString(); '确定要删除吗?'.tr, () async {
state.deletCardNo = int.parse(fingerprintItemData.cardNumber!); state.isDeletAll = false;
logic.senderAddICCard(); state.deletKeyID =
}); fingerprintItemData.cardId.toString();
}, state.deletCardNo =
backgroundColor: Colors.red, int.parse(fingerprintItemData.cardNumber!);
foregroundColor: Colors.white, logic.senderAddICCard();
label: '删除'.tr, });
padding: EdgeInsets.only(left: 5.w, right: 5.w), },
), 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', : NoData(
fingerprintItemData.cardName!, noDataHeight: 1.sh -
logic.getKeyType(fingerprintItemData), ScreenUtil().statusBarHeight -
logic.getKeyDateType(fingerprintItemData), () async { ScreenUtil().bottomBarHeight -
final data = await Get.toNamed( 190.h -
Routers.cardDetailPage, arguments: <String, FingerprintItemData>{ 64.h));
'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));
} }
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( return GestureDetector(
onTap: action, onTap: action,
child: Container( child: Container(
@ -201,14 +211,13 @@ class _CardListPageState extends State<CardListPage> with RouteAware {
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
Flexible( Flexible(
child: Text( child: Text(lockTypeTitle,
lockTypeTitle,
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, 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/custom_bottom_sheet.dart';
import '../../../../../tools/dateTool.dart'; import '../../../../../tools/dateTool.dart';
import '../../../../../tools/eventBusEventManage.dart'; import '../../../../../tools/eventBusEventManage.dart';
import '../../../../../tools/pickers/time_picker/time_utils.dart';
import '../../../../../tools/showTipView.dart'; import '../../../../../tools/showTipView.dart';
import '../../../lockOperatingRecord/keyOperationRecord_entity.dart'; import '../../../lockOperatingRecord/keyOperationRecord_entity.dart';
@ -22,6 +23,10 @@ typedef BlockIsHaveAllDataCallback = void Function(bool isAllData);
class ElectronicKeyDetailLogic extends BaseGetXController { class ElectronicKeyDetailLogic extends BaseGetXController {
final ElectronicKeyDetailState state = ElectronicKeyDetailState(); final ElectronicKeyDetailState state = ElectronicKeyDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
// //
Future<void> modifyKeyNameRequest() async { Future<void> modifyKeyNameRequest() async {
if (state.changeNameController.text.isEmpty) { if (state.changeNameController.text.isEmpty) {

View File

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

View File

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

View File

@ -176,7 +176,7 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
), ),
CommonItem( CommonItem(
leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr,
rightTitle: "", rightTitle: '',
isHaveLine: true, isHaveLine: true,
isHaveRightWidget: true, isHaveRightWidget: true,
isHaveDirection: true, isHaveDirection: true,
@ -261,7 +261,7 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
children: [ children: [
CommonItem( CommonItem(
leftTitel: TranslationLoader.lanKeys!.remoteUnlockingAllowed!.tr, leftTitel: TranslationLoader.lanKeys!.remoteUnlockingAllowed!.tr,
rightTitle: "", rightTitle: '',
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: SizedBox(width: 60.w, height: 50.h, child: _switch()), rightWidget: SizedBox(width: 60.w, height: 50.h, child: _switch()),
action: () {}), action: () {}),
@ -276,7 +276,7 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
children: [ children: [
Obx(() => CommonItem( Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr, leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle: "${state.beginTime.value}\n${state.endTime.value}", rightTitle: '${state.beginTime.value}\n${state.endTime.value}',
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
@ -297,10 +297,10 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
} }
})), })),
Obx(() => Visibility( Obx(() => Visibility(
visible: state.weekdaysList.isNotEmpty ? true : false, visible: state.weekdaysList.isNotEmpty,
child: CommonItem( child: CommonItem(
leftTitel: "有效日".tr, leftTitel: '有效日'.tr,
rightTitle: state.weekdaysList.value.join(",").toString(), rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
@ -323,9 +323,9 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
Obx(() => Visibility( Obx(() => Visibility(
visible: state.effectiveDateTime.value.isNotEmpty, visible: state.effectiveDateTime.value.isNotEmpty,
child: CommonItem( child: CommonItem(
leftTitel: "有效时间".tr, leftTitel: '有效时间'.tr,
rightTitle: rightTitle:
"${state.effectiveDateTime.value}-${state.failureDateTime.value}", '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
isHaveDirection: true, isHaveDirection: true,
action: () async { action: () async {
var result = await Get.toNamed( 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/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/view/sendElectronicKeyView_state.dart';
import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart'; import 'package:star_lock/mine/valueAddedServices/advancedFunctionRecord/advancedFunctionRecord_entity.dart';
import 'package:star_lock/network/api_repository.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/baseGetXController.dart';
import 'package:star_lock/tools/commonDataManage.dart'; import 'package:star_lock/tools/commonDataManage.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/eventBusEventManage.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/showTipView.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
@ -20,6 +21,10 @@ class SendElectronicKeyViewLogic extends BaseGetXController {
String type; String type;
final SendElectronicKeyViewState state = SendElectronicKeyViewState(); final SendElectronicKeyViewState state = SendElectronicKeyViewState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();

View File

@ -257,7 +257,7 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
visible: logic.state.weekdaysList.isNotEmpty, visible: logic.state.weekdaysList.isNotEmpty,
child: CommonItem( child: CommonItem(
leftTitel: '有效日'.tr, leftTitel: '有效日'.tr,
rightTitle: logic.state.weekdaysList.join(',').toString(), rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { 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/main/lockDetail/face/addFaceType/addFaceType_state.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../appRouters.dart'; import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart'; import '../../../../network/api_repository.dart';
class AddFaceTypeLogic extends BaseGetXController { class AddFaceTypeLogic extends BaseGetXController {
AddFaceTypeState state = AddFaceTypeState(); AddFaceTypeState state = AddFaceTypeState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
// //
Future<void> addFaceData() async { Future<void> addFaceData() async {
int faceType = 0; // :1;23:4 int faceType = 0; // :1;23:4

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -57,14 +57,14 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
if (state.selectType.value == "1") { if (state.selectType.value == '1') {
state.beginTime.value = DateTool().dateToYMDHNString( state.beginTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); // DateTime.now().millisecondsSinceEpoch.toString()); //
state.endTime.value = DateTool().dateToYMDHNString( state.endTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); // DateTime.now().millisecondsSinceEpoch.toString()); //
} else { } else {
state.beginTime.value = ""; // state.beginTime.value = ''; //
state.endTime.value = ""; // state.endTime.value = ''; //
} }
}); });
} }
@ -126,7 +126,7 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
Container(height: 10.h), Container(height: 10.h),
CommonItem( CommonItem(
leftTitel: titleStr, leftTitel: titleStr,
rightTitle: "", rightTitle: '',
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: getTFWidget(rightTitle)), rightWidget: getTFWidget(rightTitle)),
Container(height: 10.h), Container(height: 10.h),
@ -174,7 +174,7 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
children: [ children: [
Obx(() => CommonItem( Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr, leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle: "${state.beginTime.value}\n${state.endTime.value}", rightTitle: '${state.beginTime.value}\n${state.endTime.value}',
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
@ -197,8 +197,8 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
Obx(() => Visibility( Obx(() => Visibility(
visible: state.weekdaysList.isNotEmpty ? true : false, visible: state.weekdaysList.isNotEmpty ? true : false,
child: CommonItem( child: CommonItem(
leftTitel: "有效日", leftTitel: '有效日'.tr,
rightTitle: state.weekdaysList.value.join(",").toString(), rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
@ -221,9 +221,9 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
Obx(() => Visibility( Obx(() => Visibility(
visible: state.effectiveDateTime.value.isNotEmpty, visible: state.effectiveDateTime.value.isNotEmpty,
child: CommonItem( child: CommonItem(
leftTitel: "有效时间".tr, leftTitel: '有效时间'.tr,
rightTitle: rightTitle:
"${state.effectiveDateTime.value}-${state.failureDateTime.value}", '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
isHaveDirection: true, isHaveDirection: true,
action: () async { action: () async {
var result = await Get.toNamed(Routers.seletKeyCyclicDatePage, var result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
@ -255,8 +255,8 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
? true ? true
: false, : false,
child: CommonItem( child: CommonItem(
leftTitel: "是否为管理员".tr, leftTitel: '是否为管理员'.tr,
rightTitle: "", rightTitle: '',
isTipsImg: false, isTipsImg: false,
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: SizedBox( rightWidget: SizedBox(
@ -268,13 +268,13 @@ class _AddIrisTypePageState extends State<AddIrisTypePage> {
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) { if (isDemoMode == false) {
if (state.nameController.text.isEmpty) { if (state.nameController.text.isEmpty) {
logic.showToast("请输入姓名"); logic.showToast('请输入姓名');
return; return;
} }
logic.checkIrisNameDuplicated(state.nameController.text); logic.checkIrisNameDuplicated(state.nameController.text);
} else { } else {
// Get.toNamed(Routers.selectLockTypePage); // 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/main/lockDetail/iris/irisDetail/irisDetail_state.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.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/blue_manage.dart';
// import '../../../../blue/io_protocol/io_addICCard.dart'; // import '../../../../blue/io_protocol/io_addICCard.dart';
@ -20,6 +21,10 @@ import '../../../../tools/storage.dart';
class IrisDetailLogic extends BaseGetXController { class IrisDetailLogic extends BaseGetXController {
IrisDetailState state = IrisDetailState(); IrisDetailState state = IrisDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
// //
late StreamSubscription<Reply> _replySubscription; late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() { void _initReplySubscription() {

View File

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

View File

@ -253,6 +253,71 @@ class _LockDetailPageState extends State<LockDetailPage>
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
const Spacer(), 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( GestureDetector(
onTap: () { onTap: () {
if (state.openDoorBtnisUneable.value == true) { if (state.openDoorBtnisUneable.value == true) {
@ -282,7 +347,7 @@ class _LockDetailPageState extends State<LockDetailPage>
spreadRadius: 0, spreadRadius: 0,
), ),
]), ]),
margin: EdgeInsets.only(top: 20.h), margin: EdgeInsets.only(top: 0.h),
child: Stack( child: Stack(
alignment: AlignmentDirectional.center, alignment: AlignmentDirectional.center,
children: <Widget>[ children: <Widget>[
@ -326,10 +391,10 @@ class _LockDetailPageState extends State<LockDetailPage>
Padding( Padding(
padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h), padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Column( Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Text( Text(
TranslationLoader TranslationLoader
@ -339,76 +404,12 @@ class _LockDetailPageState extends State<LockDetailPage>
fontSize: 20.sp, fontSize: 20.sp,
), ),
), ),
SizedBox(
height: 16.h,
),
adminInfoView(center: false, max: false), 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.mainColor
: AppColors.btnDisableColor), : 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>[ if (add) ...<Widget>[
const Spacer(), const Spacer(),
GestureDetector( GestureDetector(

View File

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

View File

@ -89,7 +89,7 @@ class _BasicInformationPageState extends State<BasicInformationPage> {
visible: (state.lockBasicInfo.value.keyType ?? 0) == 4, visible: (state.lockBasicInfo.value.keyType ?? 0) == 4,
child: CommonItem( child: CommonItem(
leftTitel: '有效日'.tr, leftTitel: '有效日'.tr,
rightTitle: (state.lockBasicInfo.value.weekDays ?? []).join(',').toString(), rightTitle: logic.weekDayStr.join(',').toString(),
allHeight: 70.h, allHeight: 70.h,
isHaveLine: true), 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_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.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/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_otaUpgrade.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_protocol/io_processOtaUpgrade.dart';
import 'package:star_lock/blue/io_reply.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/io_tool.dart';
import 'package:star_lock/blue/io_tool/manager_event_bus.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/lockEscalation/version_entity.dart';
import 'package:star_lock/main/lockDetail/lockSet/lockSet/lockSet_logic.dart'; import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/commonDataManage.dart'; import 'package:star_lock/tools/commonDataManage.dart';
import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/showTipView.dart';
@ -34,17 +34,8 @@ class LockEscalationLogic extends BaseGetXController {
int otaIndex = 0; int otaIndex = 0;
Uint8List? otaBin; Uint8List? otaBin;
int startSecond = 0; int startSecond = 0;
Map? headJson = null; Map? headJson;
FwVersionEntity? entity;
//
Future<void> setLockSetGeneralSetting() async {
// var entity = await ApiRepository.to.getLockVersionInfoData(
// lockId: state.getKeyInfosData.value.lockId.toString(),
// );
// if(entity.errorCode!.codeIsSuccessful){
//
// }
}
// //
Future<void> otaUpdate() async { Future<void> otaUpdate() async {
@ -58,6 +49,10 @@ class LockEscalationLogic extends BaseGetXController {
} }
final File file = File(result.files.single.path!); final File file = File(result.files.single.path!);
final Uint8List data = await file.readAsBytes(); final Uint8List data = await file.readAsBytes();
stateUpData(data);
}
Future<void> stateUpData(Uint8List data) async {
headJson = await getHeadFile(data); headJson = await getHeadFile(data);
if (headJson is! Map) { if (headJson is! Map) {
return; return;
@ -69,10 +64,10 @@ class LockEscalationLogic extends BaseGetXController {
final String md5Str = md5.convert(otaBin!).toString(); final String md5Str = md5.convert(otaBin!).toString();
headJson!['fwMd5'] = md5Str; headJson!['fwMd5'] = md5Str;
ShowTipView().showIosTipWithContentDialog('未避免异常情况,请在门打开时升级'.tr, () async { ShowTipView().showIosTipWithContentDialog('未避免异常情况,请在门打开时升级'.tr, () async {
blueOTAUpgrade(headJson!, [0, 0, 0, 0]); blueOTAUpgrade(headJson!, <int>[0, 0, 0, 0]);
EasyLoading.show( EasyLoading.show(
status: '设备连接中...'.tr, maskType: EasyLoadingMaskType.black); 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, BlueManage().blueSendData(BlueManage().connectDeviceName,
(BluetoothConnectionState deviceConnectionState) async { (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) { if (deviceConnectionState == BluetoothConnectionState.connected) {
final privateKey = await Storage.getStringList(saveBluePrivateKey); final List<String>? privateKey =
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!); await Storage.getStringList(saveBluePrivateKey);
final signKey = await Storage.getStringList(saveBlueSignKey); final List<int> getPrivateKeyList =
changeStringListToIntList(privateKey!);
final List<String>? signKey =
await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!); final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final String uid = await Storage.getUid() ?? ''; final String uid = await Storage.getUid() ?? '';
BlueManage().writeCharacteristicWithResponse(OTAUpgradeCommand( BlueManage().writeCharacteristicWithResponse(OTAUpgradeCommand(
@ -236,17 +234,47 @@ class LockEscalationLogic extends BaseGetXController {
return bin; 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 @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
setLockSetGeneralSetting(); checkUpData();
} }
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
_replySubscription = _replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) { EventBusManager().eventBus!.on<Reply>().listen((Reply reply) {
if (reply is OTAUpgradeReply) { if (reply is OTAUpgradeReply) {
if (reply.status == 0x00) { if (reply.status == 0x00) {
// //

View File

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

View File

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

View File

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

View File

@ -1,4 +1,3 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -15,13 +14,13 @@ class LockSetState {
final lockId = 0.obs; final lockId = 0.obs;
var isOnlyOneData = false.obs; var isOnlyOneData = false.obs;
var isAttendance = 0.obs;// var isAttendance = 0.obs; //
var isOpenLockNeedOnline = 0.obs;// APP开锁时是否需联网 var isOpenLockNeedOnline = 0.obs; // APP开锁时是否需联网
var isLockPickingReminder = 0.obs;// var isUnlockReminder = 0.obs; //
var isOpenBlueBroadcast = 0.obs;// 广 var isOpenBlueBroadcast = 0.obs; // 广
var isOpenExceptionWarnings = 0.obs;// var isOpenExceptionWarnings = 0.obs; //
var isOpenStayWarn = 0.obs;// var isOpenStayWarn = 0.obs; //
var passwordTF = TextEditingController(); var passwordTF = TextEditingController();
@ -34,4 +33,4 @@ class LockSetState {
lockId.value = map["lockId"]; lockId.value = map["lockId"];
isOnlyOneData.value = map["isOnlyOneData"]; 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/main/lockDetail/palm/addPalmType/addPalmType_state.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/time_picker/time_utils.dart';
import '../../../../appRouters.dart'; import '../../../../appRouters.dart';
import '../../../../network/api_repository.dart'; import '../../../../network/api_repository.dart';
class AddPalmTypeLogic extends BaseGetXController { class AddPalmTypeLogic extends BaseGetXController {
AddPalmTypeState state = AddPalmTypeState(); AddPalmTypeState state = AddPalmTypeState();
List<dynamic> get weekDayStr {
return state.weekdaysList.map((e) => TimeUtils.translateWeekday(e)).toList();
}
// //
void addPalmData() async { void addPalmData() async {
var palmType = 0; // :1;23:4 var palmType = 0; // :1;23:4

View File

@ -57,14 +57,14 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
if (state.selectType.value == "1") { if (state.selectType.value == '1') {
state.beginTime.value = DateTool().dateToYMDHNString( state.beginTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); // DateTime.now().millisecondsSinceEpoch.toString()); //
state.endTime.value = DateTool().dateToYMDHNString( state.endTime.value = DateTool().dateToYMDHNString(
DateTime.now().millisecondsSinceEpoch.toString()); // DateTime.now().millisecondsSinceEpoch.toString()); //
} else { } else {
state.beginTime.value = ""; // state.beginTime.value = ''; //
state.endTime.value = ""; // state.endTime.value = ''; //
} }
}); });
} }
@ -126,7 +126,7 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
Container(height: 10.h), Container(height: 10.h),
CommonItem( CommonItem(
leftTitel: titleStr, leftTitel: titleStr,
rightTitle: "", rightTitle: '',
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: getTFWidget(rightTitle)), rightWidget: getTFWidget(rightTitle)),
Container(height: 10.h), Container(height: 10.h),
@ -174,7 +174,7 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
children: [ children: [
Obx(() => CommonItem( Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr, leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle: "${state.beginTime.value}\n${state.endTime.value}", rightTitle: '${state.beginTime.value}\n${state.endTime.value}',
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
@ -195,10 +195,10 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
} }
})), })),
Obx(() => Visibility( Obx(() => Visibility(
visible: state.weekdaysList.isNotEmpty ? true : false, visible: state.weekdaysList.isNotEmpty,
child: CommonItem( child: CommonItem(
leftTitel: "有效日", leftTitel: '有效日'.tr,
rightTitle: state.weekdaysList.value.join(",").toString(), rightTitle: logic.weekDayStr.join(',').toString(),
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
@ -221,9 +221,9 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
Obx(() => Visibility( Obx(() => Visibility(
visible: state.effectiveDateTime.value.isNotEmpty, visible: state.effectiveDateTime.value.isNotEmpty,
child: CommonItem( child: CommonItem(
leftTitel: "有效时间".tr, leftTitel: '有效时间'.tr,
rightTitle: rightTitle:
"${state.effectiveDateTime.value}-${state.failureDateTime.value}", '${state.effectiveDateTime.value}-${state.failureDateTime.value}',
isHaveDirection: true, isHaveDirection: true,
action: () async { action: () async {
var result = await Get.toNamed(Routers.seletKeyCyclicDatePage, var result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
@ -255,8 +255,8 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
? true ? true
: false, : false,
child: CommonItem( child: CommonItem(
leftTitel: "是否为管理员".tr, leftTitel: '是否为管理员'.tr,
rightTitle: "", rightTitle: '',
isTipsImg: false, isTipsImg: false,
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: SizedBox( rightWidget: SizedBox(
@ -268,13 +268,13 @@ class _AddPalmTypePageState extends State<AddPalmTypePage> {
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) { if (isDemoMode == false) {
if (state.nameController.text.isEmpty) { if (state.nameController.text.isEmpty) {
logic.showToast("请输入姓名"); logic.showToast('请输入姓名');
return; return;
} }
logic.checkPalmNameDuplicated(state.nameController.text); logic.checkPalmNameDuplicated(state.nameController.text);
} else { } else {
// Get.toNamed(Routers.selectLockTypePage); // 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/main/lockDetail/palm/palmDetail/palmDetail_state.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.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/blue_manage.dart';
// import '../../../../blue/io_protocol/io_addICCard.dart';
import '../../../../blue/io_reply.dart'; import '../../../../blue/io_reply.dart';
import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../network/api_repository.dart'; import '../../../../network/api_repository.dart';
import '../../../../tools/dateTool.dart'; import '../../../../tools/dateTool.dart';
import '../../../../tools/storage.dart'; import '../../../../tools/storage.dart';
@ -20,6 +19,10 @@ import '../../../../tools/storage.dart';
class PalmDetailLogic extends BaseGetXController { class PalmDetailLogic extends BaseGetXController {
PalmDetailState state = PalmDetailState(); PalmDetailState state = PalmDetailState();
List<dynamic> get weekDayStr {
return state.weekDay.map((e) => TimeUtils.translateWeekday(e)).toList();
}
// //
late StreamSubscription<Reply> _replySubscription; late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() { void _initReplySubscription() {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -17,7 +17,7 @@ class StarLockMineLogic extends BaseGetXController {
final MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo(); final MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo();
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
state.mineInfoData.value = entity.data!; 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); Storage.setBool(saveIsVip, state.isVip.value);
} }
} }

View File

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

View File

@ -1,5 +1,7 @@
import 'dart:async'; 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/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_state.dart';
import 'package:star_lock/tools/storage.dart';
import '../../../../network/api_repository.dart'; import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart'; import '../../../../tools/baseGetXController.dart';
@ -12,4 +14,18 @@ class ValueAddedServicesListLogic extends BaseGetXController {
var entity = await ApiRepository.to.getServicePackageBuyUrl(); var entity = await ApiRepository.to.getServicePackageBuyUrl();
if (entity.errorCode!.codeIsSuccessful) {} 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( _valueAddedServicesItem(
Image.asset('images/mine/icon_mine_valueAddedServices_vip.png'), Image.asset('images/mine/icon_mine_valueAddedServices_vip.png'),
TranslationLoader.lanKeys!.advancedFunction!.tr, () async { TranslationLoader.lanKeys!.advancedFunction!.tr, () async {
bool? isVip = await Storage.getBool(saveIsVip); final bool? isVip = await Storage.getBool(saveIsVip);
if (isVip == null || !isVip) { if (isVip == null || !isVip) {
// if (CommonDataManage().currentKeyInfo.isLockOwner != 1) { // if (CommonDataManage().currentKeyInfo.isLockOwner != 1) {
// logic.showToast('请先添加锁'); // logic.showToast('请先添加锁');
// } else { // } 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 { } else {
Get.toNamed(Routers.valueAddedServicesHighFunctionPage); Get.toNamed(Routers.valueAddedServicesHighFunctionPage);

View File

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

View File

@ -22,6 +22,7 @@ class ApiProvider extends BaseProvider {
String account, String account,
String password, String password,
String verificationCode, String verificationCode,
Map deviceInfo,
) => ) =>
post( post(
registerUrl.toUrl, registerUrl.toUrl,
@ -32,6 +33,7 @@ class ApiProvider extends BaseProvider {
'password': password, 'password': password,
'verificationCode': verificationCode, 'verificationCode': verificationCode,
'platId': '2', 'platId': '2',
'deviceInfo': deviceInfo,
})); }));
// post( // post(
@ -65,7 +67,7 @@ class ApiProvider extends BaseProvider {
})); }));
Future<Response> login(String loginType, String password, String countryCode, Future<Response> login(String loginType, String password, String countryCode,
String username) => String username, Map deviceInfo) =>
post( post(
loginUrl.toUrl, loginUrl.toUrl,
jsonEncode({ jsonEncode({
@ -74,7 +76,8 @@ class ApiProvider extends BaseProvider {
'platId': '2', 'platId': '2',
'uniqueid': '477E6814-289D-402A-9F49-F89A8BD05D63', 'uniqueid': '477E6814-289D-402A-9F49-F89A8BD05D63',
'countryCode': countryCode, 'countryCode': countryCode,
'username': username 'username': username,
'deviceInfo': deviceInfo,
})); }));
Future<Response> resetPassword( Future<Response> resetPassword(
@ -2127,6 +2130,17 @@ class ApiProvider extends BaseProvider {
Future<Response<dynamic>> getAppInfo() => Future<Response<dynamic>> getAppInfo() =>
post(appGetAppInfoURL.toUrl, jsonEncode(<String, int>{}), post(appGetAppInfoURL.toUrl, jsonEncode(<String, int>{}),
isShowErrMsg: false); 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 { 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/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart';
import 'package:star_lock/main/lockDetail/face/addFace/addFace_entity.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/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/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/coerceOpenDoor/coerceFingerprintList/coerceFingerprintList_entity.dart';
import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart';
@ -98,9 +99,10 @@ class ApiRepository {
required int countryCode, required int countryCode,
required String account, required String account,
required String password, required String password,
required String verificationCode}) async { required String verificationCode,
final res = await apiProvider.register( required Map deviceInfo}) async {
receiverType, countryCode, account, password, verificationCode); final res = await apiProvider.register(receiverType, countryCode, account,
password, verificationCode, deviceInfo);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -124,9 +126,10 @@ class ApiRepository {
{required String loginType, {required String loginType,
required String password, required String password,
required String countryCode, required String countryCode,
required String username}) async { required String username,
final res = required Map deviceInfo}) async {
await apiProvider.login(loginType, password, countryCode, username); final res = await apiProvider.login(
loginType, password, countryCode, username, deviceInfo);
return LoginEntity.fromJson(res.body); return LoginEntity.fromJson(res.body);
} }
@ -2154,8 +2157,15 @@ class ApiRepository {
// //
Future<GetAppInfo> getAppInfo() async { Future<GetAppInfo> getAppInfo() async {
final Response<dynamic> res = final Response<dynamic> res = await apiProvider.getAppInfo();
await apiProvider.getAppInfo();
return GetAppInfo.fromJson(res.body); 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 { class TimeUtils {
/// ///
static List calcYears({int begin = 1900, int end = 2100}) => 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}) { static List calcDay(int year, int month, {int begin = 1, int end = 31}) {
begin = begin < 1 ? 1 : begin; begin = begin < 1 ? 1 : begin;
int days = _calcDateCount(year, month); final int days = _calcDateCount(year, month);
if (end > days) { if (end > days) {
end = days; end = days;
} }
@ -37,11 +39,15 @@ class TimeUtils {
} }
static List _calcCount(begin, end) { static List _calcCount(begin, end) {
int length = end - begin + 1; final int length = end - begin + 1;
if (length == 0) return [begin]; if (length == 0) {
if (length < 0) return []; 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"; 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/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:jpush_flutter/jpush_flutter.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/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart';
import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/baseGetXController.dart';
@ -22,8 +23,15 @@ class XSJPushProvider {
return; return;
} }
String appKey;
if (F.isSKY) {
appKey = '7ff37d174c1a568a89e98dad';
} else {
appKey = '251fc8074820d122b6de58d2';
}
jpush.setup( jpush.setup(
appKey: '251fc8074820d122b6de58d2', appKey: appKey,
channel: 'flutter_channel', channel: 'flutter_channel',
production: false, production: false,
debug: true, debug: true,
@ -34,25 +42,24 @@ class XSJPushProvider {
); );
addJPushEventHandler(); addJPushEventHandler();
bindDeviceID();
} }
// //
void addJPushEventHandler() { void addJPushEventHandler() {
jpush.addEventHandler( jpush.addEventHandler(
onReceiveNotification: (Map<String, dynamic> message) async { onReceiveNotification: (Map<String, dynamic> message) async {
AppLog.log('onReceiveNotification: $message'); AppLog.log('onReceiveNotification: $message');
}, }, onOpenNotification: (Map<String, dynamic> message) async {
onOpenNotification: (Map<String, dynamic> message) async { AppLog.log('onOpenNotification: $message');
AppLog.log('onOpenNotification: $message'); }, onReceiveMessage: (Map<String, dynamic> message) async {
}, AppLog.log('onReceiveMessage: $message');
onReceiveMessage: (Map<String, dynamic> message) async { //
AppLog.log('onReceiveMessage: $message'); }, onReceiveNotificationAuthorization:
}, (Map<String, dynamic> message) async {
onReceiveNotificationAuthorization: (Map<String, dynamic> message) async { AppLog.log('onReceiveNotificationAuthorization: $message');
AppLog.log('onReceiveNotificationAuthorization: $message'); }, onInAppMessageShow: (Map<String, dynamic> message) async {
}, AppLog.log('onInAppMessageShow: $message');
); });
} }
//ID //ID