app-starlock/lib/main/lockDetail/card/addICCard/addICCard_logic.dart
魏少阳 202c97e0d3 Merge branch 'bugly' into build-addGateway-20240814
# Conflicts:
#	android/app/src/main/AndroidManifest.xml
#	lib/login/login/starLock_login_logic.dart
#	lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart
#	lib/main/lockDetail/doorLockLog/doorLockLog_page.dart
#	lib/main/lockDetail/lockDetail/lockDetail_logic.dart
#	lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_logic.dart
#	lib/main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart
#	lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart
#	lib/mine/mineSet/mineSet/mineSet_logic.dart
#	lib/tools/advancedCalendar/src/widget.dart
#	pubspec.yaml
2024-12-04 14:25:23 +08:00

360 lines
13 KiB
Dart
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/main/lockDetail/card/addICCard/addICCard_entity.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:umeng_common_sdk/umeng_common_sdk.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_addICCardWithTimeCycleCoercion.dart';
import '../../../../blue/io_reply.dart';
import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/bugly/bugly_tool.dart';
import '../../../../tools/dateTool.dart';
import '../../../../tools/eventBusEventManage.dart';
import '../../../../tools/storage.dart';
import 'addICCard_state.dart';
class AddICCardLogic extends BaseGetXController{
AddICCardState state = AddICCardState();
// 监听设备返回的数据
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
// 添加IC卡开始
if((reply is SenderAddICCardWithTimeCycleCoercionReply) && (state.ifCurrentScreen.value == true)) {
_replyAddICCardBegin(reply);
}
// 添加卡确认
if(reply is SenderAddICCardConfirmationReply) {
_replyAddICCardConfirmation(reply);
}
});
}
Future<void> _replyAddICCardBegin(Reply reply) async {
final int status = reply.data[2];
BuglyTool.uploadException(
message: '添加卡开始,解析数据',
detail: '添加卡开始,解析数据 _replyAddICCardBegin:${reply.data}',
upload: false
);
switch(status){
case 0x00:
//成功
final List<int> cardNumberList = reply.data.sublist(reply.data.length - 2);
final String cardNumber = listChangInt(cardNumberList).toString();
// AppLog.log("添加卡号:$cardNumberList cardNumber:$cardNumber");
state.cardNumber.value = cardNumber.toString();
cancelBlueConnetctToastTimer();
state.ifAddState.value = true;
state.ifConnectScuess.value = true;
break;
case 0x06:
//无权限
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
final List<int> token = reply.data.sublist(5, 9);
final List<String> saveStrList = changeIntListToStringList(token);
Storage.setStringList(saveBlueToken, saveStrList);
// AppLog.log('添加卡token:$token');
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
keyID:'1',
userID:await Storage.getUid(),
cardNo:0,
useCountLimit:0xffff,
operate:0, // 0:注册 1修改 2:删除 3删除全部
isAdmin:state.isAdministrator.value == '2' ? 1 : 0,
isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫
isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环
weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环
startDate: int.parse(state.startDate.value)~/1000,
endDate: int.parse(state.endDate.value)~/1000,
startTime:DateTool().dateToHNString(state.effectiveDateTime.value),
endTime:DateTool().dateToHNString(state.failureDateTime.value),
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: token,
isBeforeAddUser: false
);
break;
default:
//失败
state.ifAddState.value = false;
break;
}
}
Future<void> _replyAddICCardConfirmation(Reply reply) async {
final int status = reply.data[2];
state.ifAddState.value = false;
BuglyTool.uploadException(
message: '添加卡结果,解析数据',
detail: '添加卡结果,解析数据 _replyAddICCardConfirmation:${reply.data}',
eventStr: '添加卡事件结果',
upload: true
);
final String getMobile = (await Storage.getMobile())!;
switch(status){
case 0x00:
//成功
UmengCommonSdk.onEvent('add_card', {
'lock_name':BlueManage().connectDeviceName,
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
'date':DateTool().getNowDateWithType(1),
'add_card_result':'成功',
});
switch(reply.data[5]){
case 0xff:
// 注册指纹失败
showToast('退出添加'.tr);
Get.close(1);
break;
case 0xFE:
// 管理员已满
showToast('管理员已满'.tr);
Get.close(1);
break;
case 0xFD:
// 用户已满
showToast('用户已满'.tr);
Get.close(1);
break;
case 0xFC:
// 指纹已满
showToast('锁上面添加卡已满'.tr);
Get.close(1);
break;
case 0xFB:
// 指纹已存在
showToast('卡已存在'.tr);
break;
default:
// 添加指纹中
// 当前注册数
addICCardData();
break;
}
break;
default:
//失败
UmengCommonSdk.onEvent('add_card', {
'lock_name':BlueManage().connectDeviceName,
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
'date':DateTool().getNowDateWithType(1),
'add_card_result':reply.data[2],
});
break;
}
}
// 添加卡片
Future<void> senderAddICCard() async {
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
final String command = SenderAddICCardWithTimeCycleCoercionCommand(
keyID:'1',
userID:await Storage.getUid(),
cardNo:0,
useCountLimit:0xffff,
operate:0, // 0:注册 1修改 2:删除 3删除全部
isAdmin:state.isAdministrator.value == '2' ? 1 : 0,
isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫
isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环
weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环
startDate: int.parse(state.startDate.value)~/1000,
endDate: int.parse(state.endDate.value)~/1000,
startTime:DateTool().dateToHNString(state.effectiveDateTime.value),
endTime:DateTool().dateToHNString(state.failureDateTime.value),
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList,
).toString();
showBlueConnetctToastTimer(action: () async {
final String getMobile = (await Storage.getMobile())!;
UmengCommonSdk.onEvent('add_card', {
'lock_name':BlueManage().connectDeviceName,
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
'date':DateTool().getNowDateWithType(1),
'add_card_result':'添加卡超时',
});
BuglyTool.uploadException(
message: '添加卡超时处理-添加卡失败',
detail: '添加卡超时处理,断开连接,添加卡失败--SenderAddICCardWithTimeCycleCoercionCommand:$command',
eventStr: '添加卡事件超时',
upload: true
);
Get.close(1);
});
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected){
cancelBlueConnetctToastTimer();
IoSenderManage.senderAddCardWithTimeCycleCoercionCommand(
keyID:'1',
userID:await Storage.getUid(),
cardNo:0,
useCountLimit:0xffff,
operate:0, // 0:注册 1修改 2:删除 3删除全部
isAdmin:state.isAdministrator.value == '2' ? 1 : 0,
isForce:state.isCoerced.value == '1' ? 1 : 0, // 是否是胁迫
isRound:state.selectType.value == '2' ? 1: 0, // 是否是循环
weekRound:DateTool().accordingTheCycleIntoTheCorrespondingNumber(state.weekDay.value), // 周循环
startDate: int.parse(state.startDate.value)~/1000,
endDate: int.parse(state.endDate.value)~/1000,
startTime:DateTool().dateToHNString(state.effectiveDateTime.value),
endTime:DateTool().dateToHNString(state.failureDateTime.value),
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList,
isBeforeAddUser: false
);
} else if (deviceConnectionState == BluetoothConnectionState.disconnected){
final String getMobile = (await Storage.getMobile())!;
UmengCommonSdk.onEvent('add_card', {
'lock_name':BlueManage().connectDeviceName,
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
'date':DateTool().getNowDateWithType(1),
'add_card_result':'添加卡断开连接',
});
BuglyTool.uploadException(
message: '添加卡超时处理-添加卡失败',
detail: '添加卡超时处理,断开连接,添加卡失败--SenderAddICCardWithTimeCycleCoercionCommand:$command',
eventStr: '添加卡事件断开连接',
upload: true
);
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
cancelBlueConnetctToastTimer();
Get.close(1);
}
});
}
// 取消添加指纹
Future<void> senderCancelAddCardCommand() async {
BlueManage().blueSendData(BlueManage().connectDeviceName, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected){
final List<String>? privateKey = await Storage.getStringList(saveBluePrivateKey);
final List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
final List<String>? signKey = await Storage.getStringList(saveBlueSignKey);
final List<int> signKeyDataList = changeStringListToIntList(signKey!);
final List<String>? token = await Storage.getStringList(saveBlueToken);
final List<int> getTokenList = changeStringListToIntList(token!);
IoSenderManage.senderCancelAddCardCommand(
keyID:'1',
userID:await Storage.getUid(),
needAuthor:1,
signKey:signKeyDataList,
privateKey:getPrivateKeyList,
token: getTokenList,
);
}else if (deviceConnectionState == BluetoothConnectionState.disconnected){
if(state.ifCurrentScreen.value == true){
showBlueConnetctToast();
}
cancelBlueConnetctToastTimer();
Get.close(1);
}
});
}
Future<void> addICCardData() async {
final AddICCardEntity entity = await ApiRepository.to.addICCardData(
lockId: state.lockId.value.toString(),
endDate: state.endDate.value,
cardName: state.cardName.value.toString(),
cardNumber: state.cardNumber.value.toString(),
cardType: int.parse(state.cardType.value),
addType: state.addType.value.toString(),
startDate: state.startDate.value,
isCoerced: state.isCoerced.value.toString(),
weekDay: state.weekDay.value,
startTime: int.parse(state.effectiveDateTime.value),
endTime: int.parse(state.failureDateTime.value),
cardRight: state.isAdministrator.value == '2' ? 1 : 0,
);
if (entity.errorCode!.codeIsSuccessful) {
updateIdCardUserNoLoadData(entity.data!.cardId.toString());
}
}
Future<void> updateIdCardUserNoLoadData(String cardId) async{
final LoginEntity entity = await ApiRepository.to.updateIdCardUserNoLoadData(
lockId: state.lockId.value.toString(),
cardId: cardId,
cardUserNo: state.cardNumber.value,
);
if(entity.errorCode!.codeIsSuccessful){
showToast('添加成功'.tr, something:(){
if(state.fromType.value == 2){
// 回调指纹号
eventBus.fire(ChickInAddStaffCardAndFingerprintBlockNumberEvent(state.cardNumber.value));
}else if(state.fromType.value == 1){
eventBus.fire(OtherTypeRefreshListEvent());
}
Get.close(2);
});
}
}
@override
void onReady() {
super.onReady();
_initReplySubscription();
}
@override
void onInit() {
super.onInit();
senderAddICCard();
}
@override
void onClose() {
_replySubscription.cancel();
}
}