Merge branch 'release' of https://gitee.com/starlock-cn/app-starlock into release
This commit is contained in:
commit
56ddcb8498
@ -2,14 +2,14 @@
|
||||
"starLock": "Star Lock",
|
||||
"lockThrough": "Lock Through",
|
||||
"clickUnlockAndHoldDownClose": "Click To Unlock And Hold Down to Close",
|
||||
"checkingIn": "Checking In",
|
||||
"electronicKey": "Electronic Key",
|
||||
"checkingIn": "CheckIn",
|
||||
"electronicKey": "KeyCard",
|
||||
"password": "Password",
|
||||
"card": "Card",
|
||||
"fingerprint": "Fingerprint",
|
||||
"remoteControl": "RemoteControl",
|
||||
"fingerprint": "Finger",
|
||||
"remoteControl": "RemCtrl",
|
||||
"face": "face",
|
||||
"operatingRecord": "Operating Record",
|
||||
"operatingRecord": "OpLog",
|
||||
"doorLockLog": "Door lock log",
|
||||
"number": "Number",
|
||||
"additive": "Additive",
|
||||
@ -217,7 +217,7 @@
|
||||
"aboutToExpire": "About to expire",
|
||||
"deAuthorize": "de-authorize",
|
||||
"changeName": "Change name",
|
||||
"authorizedAdmin": "Authorized Admin",
|
||||
"authorizedAdmin": "Admin",
|
||||
"addAuthorizedAdmin": "Adding an Authorized Administrator",
|
||||
"lockGroup": "Lock Group",
|
||||
"transferSmartLock": "Transfer Smart Lock",
|
||||
@ -407,10 +407,10 @@
|
||||
"getFingerprint": "Get Fingerprint",
|
||||
"safeVerify": "Security verification",
|
||||
"deleteAccountTips": "After deleting the account, all your information and related records will be completely deleted from the platform, and can not be recovered, delete or not",
|
||||
"humanFace": "Human Face",
|
||||
"humanFace": "HmFace",
|
||||
"monitoring": "Monitoring",
|
||||
"videoLog": "Video Log",
|
||||
"messageReminding": "Message Reminding",
|
||||
"messageReminding": "Notice",
|
||||
"superAdmin": "Super Admin",
|
||||
"normalUser": "Normal User",
|
||||
"gatewayDevice": "Gateway Device",
|
||||
@ -454,7 +454,7 @@
|
||||
"videoSlot": "Video slot",
|
||||
"密码": "Password",
|
||||
"卡": "Card",
|
||||
"指纹": "Fingerprint",
|
||||
"指纹": "Finger",
|
||||
"人脸": "Face",
|
||||
"配件商城": "Lock Mall",
|
||||
"公司名称": "Company Name",
|
||||
@ -487,7 +487,7 @@
|
||||
"钥匙将在": "The key will be in",
|
||||
"天后失效": "Days later invalid",
|
||||
"电量更新时间:": "Power update time:",
|
||||
"新增配件": "Add accessories",
|
||||
"新增配件": "Add",
|
||||
"请在锁旁边完成第一次开锁": "Please complete the first unlock next to the lock",
|
||||
"正在开锁中...": "Unlocking...",
|
||||
"你的钥匙": "Your key",
|
||||
@ -906,5 +906,20 @@
|
||||
"转移成功": "Transfer success",
|
||||
"该已锁被删除": "The locked is deleted",
|
||||
"授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Authorized administrators can only view and manage the keys, passwords, etc. they issued",
|
||||
"添加授权管理员": "Add authorized administrator"
|
||||
"添加授权管理员": "Add authorized administrator",
|
||||
"导出记录":"Export record",
|
||||
"选择时间段":"Select time period",
|
||||
"导出":"Export",
|
||||
"批量导出":"Batch export",
|
||||
"读取记录":"Read record",
|
||||
"手机需联网":"NeedNet",
|
||||
"设备":"Device",
|
||||
"消息":"Message",
|
||||
"智能分析":"Intelligent analytics",
|
||||
"精准识别设备事件,过滤无效信息":"Accurately identify device events and filter out invalid information",
|
||||
"系统设置":"System settings",
|
||||
"系统的全局配置在此项内进行设置":"The global configuration of the system is set in this item",
|
||||
"导出操作记录":"Export operation record",
|
||||
"立即查看":"View now",
|
||||
"导出成功":"Export success"
|
||||
}
|
||||
|
||||
@ -938,5 +938,20 @@
|
||||
"转移成功": "转移成功",
|
||||
"该已锁被删除": "该已锁被删除",
|
||||
"授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限",
|
||||
"添加授权管理员": "添加授权管理员"
|
||||
"添加授权管理员": "添加授权管理员",
|
||||
"导出记录":"导出记录",
|
||||
"选择时间段":"选择时间段",
|
||||
"导出":"导出",
|
||||
"批量导出":"批量导出",
|
||||
"读取记录":"读取记录",
|
||||
"手机需联网":"手机需联网",
|
||||
"设备":"设备",
|
||||
"消息":"消息",
|
||||
"智能分析":"智能分析",
|
||||
"精准识别设备事件,过滤无效信息":"精准识别设备事件,过滤无效信息",
|
||||
"系统设置":"系统设置",
|
||||
"系统的全局配置在此项内进行设置":"系统的全局配置在此项内进行设置",
|
||||
"导出操作记录":"导出操作记录",
|
||||
"立即查看":"立即查看",
|
||||
"导出成功":"导出成功"
|
||||
}
|
||||
|
||||
@ -903,5 +903,20 @@
|
||||
"转移成功": "转移成功",
|
||||
"该已锁被删除": "该已锁被删除",
|
||||
"授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限",
|
||||
"添加授权管理员": "添加授权管理员"
|
||||
"添加授权管理员": "添加授权管理员",
|
||||
"导出记录":"导出记录",
|
||||
"选择时间段":"选择时间段",
|
||||
"导出":"导出",
|
||||
"批量导出":"批量导出",
|
||||
"读取记录":"读取记录",
|
||||
"手机需联网":"手机需联网",
|
||||
"设备":"设备",
|
||||
"消息":"消息",
|
||||
"智能分析":"智能分析",
|
||||
"精准识别设备事件,过滤无效信息":"精准识别设备事件,过滤无效信息",
|
||||
"系统设置":"系统设置",
|
||||
"系统的全局配置在此项内进行设置":"系统的全局配置在此项内进行设置",
|
||||
"导出操作记录":"导出操作记录",
|
||||
"立即查看":"立即查看",
|
||||
"导出成功":"导出成功"
|
||||
}
|
||||
|
||||
BIN
ios/.DS_Store
vendored
BIN
ios/.DS_Store
vendored
Binary file not shown.
@ -121,6 +121,10 @@
|
||||
</array>
|
||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||
<false/>
|
||||
<key>NSFileProtectionKey</key>
|
||||
<string>NSFileProtectionCompleteUntilFirstUserAuthentication</string>
|
||||
<key>UIFileSharingEnabled</key>
|
||||
<true/>
|
||||
<key>io.flutter.embedded_views_preview</key>
|
||||
<true/>
|
||||
</dict>
|
||||
|
||||
@ -48,12 +48,19 @@
|
||||
self.textToShare = paramDic[@"shareText"];
|
||||
self.urlToShare = paramDic[@"urlToShare"];
|
||||
}
|
||||
//分享的url
|
||||
NSURL *urlToShare = [NSURL URLWithString:self.urlToShare];
|
||||
// NSURL *urlToShare = [NSURL URLWithString:@"https://pre.lock.star-lock.cn:8093/login"];
|
||||
if ([self.urlToShare isEqualToString:"fileShare"]) {
|
||||
// 创建要分享或操作的文件对象
|
||||
let fileURL = URL(fileURLWithPath: "/path/to/file.pdf")
|
||||
|
||||
//在这里呢 如果想分享图片 就把图片添加进去 文字什么的通上
|
||||
NSArray *activityItems = @[self.textToShare,urlToShare];
|
||||
// 将文件对象添加到数组中
|
||||
let activityItems = [fileURL]
|
||||
} else {
|
||||
//分享的url
|
||||
NSURL *urlToShare = [NSURL URLWithString:self.urlToShare];
|
||||
|
||||
//在这里呢 如果想分享图片 就把图片添加进去 文字什么的通上
|
||||
NSArray *activityItems = @[self.textToShare,urlToShare];
|
||||
}
|
||||
|
||||
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
|
||||
|
||||
|
||||
@ -6,8 +6,10 @@ import 'package:star_lock/login/login/starLock_login_xhj_page.dart';
|
||||
import 'package:star_lock/login/register/starLock_register_binding.dart';
|
||||
import 'package:star_lock/login/register/starLock_register_xhj_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/accessoriesList/accessoriesList_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_page.dart';
|
||||
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart';
|
||||
@ -15,6 +17,7 @@ import 'package:star_lock/main/lockDetail/face/faceDetail/faceDetail_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/iris/addIris/addIris_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/iris/irisList/irisList_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_main_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeCustomMode/catEyeCustomMode_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/videoSlot/videoSlot_page.dart';
|
||||
@ -22,7 +25,6 @@ import 'package:star_lock/main/lockDetail/lockSet/faceUnlock/faceUnlock_page.dar
|
||||
import 'package:star_lock/main/lockDetail/lockSet/liveVideo/liveVideo_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/motorPower/motorPower_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/openDoorDirection/openDoorDirection_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_main_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/messageWarn/addFamily/addFamily_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_page.dart';
|
||||
import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpenDoor/coerceFingerprint/coerceFingerprint_page.dart';
|
||||
@ -62,6 +64,8 @@ import 'login/login/starLock_login_page.dart';
|
||||
import 'login/register/starLock_register_page.dart';
|
||||
import 'login/selectCountryRegion/selectCountryRegion_page.dart';
|
||||
import 'main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart';
|
||||
import 'main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_page.dart';
|
||||
import 'main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_page.dart';
|
||||
import 'main/lockDetail/card/addCardType/addCardType_page.dart';
|
||||
import 'main/lockDetail/card/addICCard/addICCard_page.dart';
|
||||
import 'main/lockDetail/card/cardDetail/cardDetail_page.dart';
|
||||
@ -79,9 +83,13 @@ import 'main/lockDetail/checkingIn/checkingInSetWorkdaySet/checkingInSetWorkdayS
|
||||
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetAddStaff/checkingInAddStaff_page.dart';
|
||||
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart';
|
||||
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_page.dart';
|
||||
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart';
|
||||
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart';
|
||||
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyPeriodValidity/electronicKeyPeriodValidity_page.dart';
|
||||
import 'main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_page.dart';
|
||||
import 'main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicManageKey/massSendElectronicKeyManage_page.dart';
|
||||
import 'main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart';
|
||||
import 'main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart';
|
||||
import 'main/lockDetail/face/addFace/addFace_page.dart';
|
||||
import 'main/lockDetail/face/addFaceType/addFaceType_page.dart';
|
||||
import 'main/lockDetail/face/faceList/faceList_page.dart';
|
||||
@ -90,6 +98,7 @@ import 'main/lockDetail/fingerprint/addFingerprintSelectType/addFingerprintType_
|
||||
import 'main/lockDetail/fingerprint/addFingerprintTip/addFingerprintTip_page.dart';
|
||||
import 'main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart';
|
||||
import 'main/lockDetail/fingerprint/fingerprintList/fingerprintList_page.dart';
|
||||
import 'main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart';
|
||||
import 'main/lockDetail/lockSet/automaticBlocking/automaticBlocking_page.dart';
|
||||
import 'main/lockDetail/lockSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart';
|
||||
import 'main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_page.dart';
|
||||
@ -122,6 +131,8 @@ import 'main/lockDetail/lockSet/wirelessKeyboard/selectWirelessKeyboard/selectWi
|
||||
import 'main/lockDetail/lockSet/wirelessKeyboard/wirelessKeyboardList/wirelessKeyboard_page.dart';
|
||||
import 'main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart';
|
||||
import 'main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart';
|
||||
import 'main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart';
|
||||
import 'main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart';
|
||||
import 'main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart';
|
||||
import 'main/lockDetail/realTimePicture/realTimePicture_page.dart';
|
||||
import 'main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_page.dart';
|
||||
@ -132,18 +143,9 @@ import 'main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart';
|
||||
import 'main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart';
|
||||
import 'main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart';
|
||||
import 'main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart';
|
||||
import 'main/lockMian/lockMain/lockMain_page.dart';
|
||||
import 'mine/about/about_page.dart';
|
||||
import 'mine/addLock/addLock/addLock_page.dart';
|
||||
import 'main/lockDetail/authorizedAdmin/authorizedAdminList/authorizedAdminList_page.dart';
|
||||
import 'main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLockManage/volumeAuthorizationLockManage_page.dart';
|
||||
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_page.dart';
|
||||
import 'main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart';
|
||||
import 'main/lockDetail/electronicKey/electronicKeyList/electronicKeyList_page.dart';
|
||||
import 'main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart';
|
||||
import 'main/lockDetail/lockOperatingRecord/lockOperatingRecord_page.dart';
|
||||
import 'main/lockDetail/passwordKey/passwordKeyDetail/passwordKeyDetail_page.dart';
|
||||
import 'main/lockDetail/passwordKey/passwordKeyList/passwordKeyList_page.dart';
|
||||
import 'main/lockMian/lockMain/lockMain_page.dart';
|
||||
import 'mine/addLock/addLockSelectCountry/addLockSelectCountry_page.dart';
|
||||
import 'mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart';
|
||||
import 'mine/addLock/lockAddress/lockAddress/lockAddress_page.dart';
|
||||
@ -162,11 +164,11 @@ import 'mine/message/messageDetail/messageDetail_page.dart';
|
||||
import 'mine/message/messageList/messageList_page.dart';
|
||||
import 'mine/mine/starLockMine_page.dart';
|
||||
import 'mine/mineMultiLanguage/mineMultiLanguage_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart';
|
||||
import 'mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart';
|
||||
import 'mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_page.dart';
|
||||
@ -174,6 +176,7 @@ import 'mine/mineSet/authorityManagement/authorityManagement_page.dart';
|
||||
import 'mine/mineSet/authorityManagement/getDeviceList_page.dart';
|
||||
import 'mine/mineSet/authorityManagement/getNameList_page.dart';
|
||||
import 'mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministratorManage/addAuthorizedAdministratorManage_page.dart';
|
||||
import 'mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart';
|
||||
import 'mine/mineSet/hideInvalidUnlockPermissions/hideInvalidUnlockPermissions_page.dart';
|
||||
import 'mine/mineSet/lockGroup/groupEditLock/groupEditLock_page.dart';
|
||||
import 'mine/mineSet/lockGroup/lockGroupDetailList/lockItemList_page.dart';
|
||||
@ -192,7 +195,6 @@ import 'mine/valueAddedServices/valueAddedServicesNoteAndEmailDetail/valueAddedS
|
||||
import 'mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_page.dart';
|
||||
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart';
|
||||
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart';
|
||||
import 'mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart';
|
||||
import 'starLockApplication/starLockApplication.dart';
|
||||
import 'tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart';
|
||||
|
||||
@ -486,6 +488,9 @@ abstract class Routers {
|
||||
'/advancedFunctionRecordPage'; //高级功能购买记录
|
||||
static const String administratorAssociationLockPage =
|
||||
'/administratorAssociationLockPage'; //我的设置-授权管理员-关联锁
|
||||
static const String batchExportLogPage = '/batchExportLogPage'; //批量导出操作记录
|
||||
static const String exportSuccessPage = '/exportSuccessPage'; //导出成功
|
||||
static const String viewExportRecordPage = '/viewExportRecordPage'; //查看导出记录
|
||||
|
||||
static const String login = '/login'; //登录
|
||||
}
|
||||
@ -498,7 +503,7 @@ abstract class AppRouters {
|
||||
),
|
||||
GetPage<dynamic>(
|
||||
name: Routers.login,
|
||||
page: () => F.sw(
|
||||
page: () => F.sw(
|
||||
skyCall: () => const StarLockLoginPage(),
|
||||
xhjCall: () => const StarLockLoginXHJPage()),
|
||||
),
|
||||
@ -1143,8 +1148,16 @@ abstract class AppRouters {
|
||||
GetPage<dynamic>(
|
||||
name: Routers.administratorAssociationLockPage,
|
||||
page: () => const AdministratorAssociationLockPage()),
|
||||
GetPage(
|
||||
GetPage<dynamic>(
|
||||
name: Routers.expireKeyChangeDatePage,
|
||||
page: () => const ExpireKeyChangeDatePage()),
|
||||
GetPage<dynamic>(
|
||||
name: Routers.batchExportLogPage,
|
||||
page: () => const BatchExportLogPage()),
|
||||
GetPage<dynamic>(
|
||||
name: Routers.exportSuccessPage, page: () => const ExportSuccessPage()),
|
||||
GetPage<dynamic>(
|
||||
name: Routers.viewExportRecordPage,
|
||||
page: () => const ViewExportRecordPage()),
|
||||
];
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
class IoModelVendor {
|
||||
|
||||
static String vendor_XHJ = 'XHJ';
|
||||
static String model_XHJ_SYD = 'SYD-BLE-01';
|
||||
static String model_XHJ_SYD = 'SYD8811-751';
|
||||
static String model_XHJ_JL = 'JL-BLE-01';
|
||||
|
||||
static String vendor_XL = 'XL';
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_state.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportRecordDialog/exportRecord_entity.dart';
|
||||
import 'package:star_lock/network/api_repository.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
|
||||
class BatchExportLogLogic extends BaseGetXController {
|
||||
BatchExportLogState state = BatchExportLogState();
|
||||
|
||||
//操作记录-导出锁记录
|
||||
Future<void> exportLockRecordsRequest() async {
|
||||
final ExportRecordEntity entity =
|
||||
await ApiRepository.to.batchExportLockRecords(
|
||||
lockIds: state.lockIdList,
|
||||
startDate:
|
||||
DateTime.tryParse(state.beginTime.value)!.millisecondsSinceEpoch,
|
||||
endDate: DateTime.tryParse(state.endTime.value)!.millisecondsSinceEpoch,
|
||||
);
|
||||
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
final String url = entity.data!.fileUrl!;
|
||||
//下载文件地址
|
||||
final String filePath = await downloadAndSaveFile(url);
|
||||
Get.toNamed(Routers.exportSuccessPage,
|
||||
arguments: <String, String>{'filePath': filePath});
|
||||
} else {
|
||||
throw 'Export failed with error code ${entity.errorCode}';
|
||||
}
|
||||
}
|
||||
|
||||
// 下载并保存文件
|
||||
Future<String> downloadAndSaveFile(String url) async {
|
||||
final http.Response response = await http.get(Uri.parse(url));
|
||||
if (response.statusCode == 200) {
|
||||
final Directory directory = await getApplicationDocumentsDirectory();
|
||||
final File file = File('${directory.path}/exported_file.pdf');
|
||||
await file.writeAsBytes(response.bodyBytes);
|
||||
return file.path;
|
||||
} else {
|
||||
throw 'Failed to download file';
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,120 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/app_settings/app_colors.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_logic.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/batchExportLog/batchExportLog_state.dart';
|
||||
import 'package:star_lock/tools/commonItem.dart';
|
||||
import 'package:star_lock/tools/dateTool.dart';
|
||||
import 'package:star_lock/tools/pickers/pickers.dart';
|
||||
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
|
||||
import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart';
|
||||
import 'package:star_lock/tools/submitBtn.dart';
|
||||
import 'package:star_lock/tools/titleAppBar.dart';
|
||||
import 'package:star_lock/translations/trans_lib.dart';
|
||||
|
||||
class BatchExportLogPage extends StatefulWidget {
|
||||
const BatchExportLogPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<BatchExportLogPage> createState() => _BatchExportLogPageState();
|
||||
}
|
||||
|
||||
class _BatchExportLogPageState extends State<BatchExportLogPage>
|
||||
with RouteAware {
|
||||
final BatchExportLogLogic logic = Get.put(BatchExportLogLogic());
|
||||
final BatchExportLogState state = Get.find<BatchExportLogLogic>().state;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle: '导出操作记录'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
),
|
||||
body: Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.lock!.tr,
|
||||
rightTitle: state.lockIdList.isEmpty
|
||||
? TranslationLoader.lanKeys!.pleaseSelect!.tr
|
||||
: state.lockIdList.length.toString(),
|
||||
isHaveDirection: true,
|
||||
action: () async {
|
||||
final result = await Get.toNamed(
|
||||
Routers.massSendLockGroupListPage,
|
||||
arguments: <String, Object>{
|
||||
'keyLimits': '1',
|
||||
'lockIdList': state.lockIdList
|
||||
});
|
||||
if (result != null && result.isNotEmpty) {
|
||||
final List selectLockIdList = result['selectLockIdList'];
|
||||
state.lockIdList.clear();
|
||||
selectLockIdList.forEach((element) {
|
||||
state.lockIdList.add(element);
|
||||
});
|
||||
setState(() {});
|
||||
}
|
||||
}),
|
||||
SizedBox(
|
||||
height: 10.h,
|
||||
),
|
||||
keyTimeWidget(),
|
||||
SizedBox(
|
||||
height: 60.h,
|
||||
),
|
||||
SubmitBtn(
|
||||
btnName: '导出'.tr,
|
||||
onClick: () {
|
||||
if (state.lockIdList.isEmpty) {
|
||||
logic.showToast('请选择锁'.tr);
|
||||
return;
|
||||
}
|
||||
logic.exportLockRecordsRequest();
|
||||
}),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// 生效失效时间
|
||||
Widget keyTimeWidget() {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr,
|
||||
rightTitle: state.beginTime.value,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.beginTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMD, onConfirm: (PDuration p) {
|
||||
state.beginTime.value = DateTool().getYMDHNDateString(p, 2);
|
||||
});
|
||||
})),
|
||||
Obx(() => CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.failureTime!.tr,
|
||||
rightTitle: state.endTime.value,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
final PDuration selectDate =
|
||||
PDuration.parse(DateTime.tryParse(state.endTime.value));
|
||||
Pickers.showDatePicker(context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMD, onConfirm: (PDuration p) {
|
||||
state.endTime.value = DateTool().getYMDHNDateString(p, 2);
|
||||
});
|
||||
})),
|
||||
Container(height: 10.h),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
class BatchExportLogState {
|
||||
List<int> lockIdList = <int>[]; //选中的锁ID列表
|
||||
|
||||
RxString beginTime =
|
||||
DateFormat('yyyy-MM-dd').format(DateTime.now()).obs; //默认为当前时间 开始时间
|
||||
RxString endTime =
|
||||
DateFormat('yyyy-MM-dd').format(DateTime.now()).obs; //默认为当前时间 结束时间
|
||||
}
|
||||
@ -6,6 +6,7 @@ import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_logic.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_state.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportRecordDialog/exportRecordDialog_page.dart';
|
||||
import 'package:star_lock/tools/EasyRefreshTool.dart';
|
||||
import 'package:star_lock/tools/advancedCalendar/src/widget.dart';
|
||||
import 'package:star_lock/tools/commonDataManage.dart';
|
||||
@ -41,7 +42,8 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
backgroundColor: AppColors.mainColor,
|
||||
actionsList: <Widget>[
|
||||
Visibility(
|
||||
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1,
|
||||
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 ||
|
||||
CommonDataManage().currentKeyInfo.keyRight == 1,
|
||||
child: GestureDetector(
|
||||
child: Image.asset(
|
||||
'images/icon_tips_Q.png',
|
||||
@ -53,19 +55,22 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
ShowTipView().showSureAlertDialog(
|
||||
'1.锁没有联网,密码、IC卡、指纹等开门记录无法实时上传,可以点击右上角按钮,然后读取记录。\n2.只能保留一定时间内的记录,如果您需要保留历史记录,可以点击右上角按钮,然后导出记录',
|
||||
tipTitle: '看不到操作记录,可能原因有',
|
||||
sureStr: '我知道了');
|
||||
sureStr: '我知道了'.tr);
|
||||
},
|
||||
)),
|
||||
Visibility(
|
||||
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1,
|
||||
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 ||
|
||||
CommonDataManage().currentKeyInfo.keyRight == 1,
|
||||
child: PopupMenuButton<String>(
|
||||
onSelected: _onMenuItemSelected,
|
||||
color: Colors.black,
|
||||
itemBuilder: (BuildContext context) {
|
||||
return <PopupMenuEntry<String>>[
|
||||
_buildCustomPopupMenuItem('读取记录'),
|
||||
const PopupMenuDivider(),
|
||||
_buildCustomPopupMenuItem('清空记录'),
|
||||
if (CommonDataManage().currentKeyInfo.isLockOwner == 1)
|
||||
const PopupMenuDivider(),
|
||||
if (CommonDataManage().currentKeyInfo.isLockOwner == 1)
|
||||
_buildCustomPopupMenuItem('清空记录'),
|
||||
const PopupMenuDivider(),
|
||||
_buildCustomPopupMenuItem('导出记录'),
|
||||
];
|
||||
@ -131,7 +136,19 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
}
|
||||
break;
|
||||
case '导出记录':
|
||||
{}
|
||||
{
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return ExportRecordDialog(
|
||||
onExport: (String filePath) {
|
||||
Get.toNamed(Routers.exportSuccessPage,
|
||||
arguments: <String, String>{'filePath': filePath});
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -264,7 +281,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
'$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}用" : ""}${timelineData.recordTypeName}',
|
||||
'$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}',
|
||||
textAlign: TextAlign.left,
|
||||
style: TextStyle(
|
||||
color: Colors.black,
|
||||
|
||||
@ -7,59 +7,63 @@ import 'package:star_lock/tools/menuItem/dropDownItem.dart';
|
||||
import '../../lockMian/entity/lockListInfo_entity.dart';
|
||||
|
||||
class DoorLockLogState {
|
||||
final lockLogEntity = DoorLockLogEntity().obs;
|
||||
final keyInfos = LockListInfoItemEntity().obs;
|
||||
final lockLogItemList = <DoorLockLogDataItem>[].obs;
|
||||
final calendarControllerToday = AdvancedCalendarController.today();
|
||||
final calendarControllerCustom = AdvancedCalendarController.today();
|
||||
final events = <DateTime>[
|
||||
// 当前选择的日期
|
||||
|
||||
DoorLockLogState() {
|
||||
keyInfos.value = Get.arguments['keyInfo'];
|
||||
}
|
||||
final Rx<DoorLockLogEntity> lockLogEntity = DoorLockLogEntity().obs;
|
||||
final Rx<LockListInfoItemEntity> keyInfos = LockListInfoItemEntity().obs;
|
||||
final RxList<DoorLockLogDataItem> lockLogItemList =
|
||||
<DoorLockLogDataItem>[].obs;
|
||||
final AdvancedCalendarController calendarControllerToday =
|
||||
AdvancedCalendarController.today();
|
||||
final AdvancedCalendarController calendarControllerCustom =
|
||||
AdvancedCalendarController.today();
|
||||
final List<DateTime> events = <DateTime>[
|
||||
DateTime.now(),
|
||||
DateTime(2024, 10, 10),
|
||||
];
|
||||
|
||||
final startDate =
|
||||
final RxInt startDate =
|
||||
DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day)
|
||||
.millisecondsSinceEpoch
|
||||
.obs;
|
||||
final endDate = (DateTime(
|
||||
DateTime.now().year, DateTime.now().month, DateTime.now().day + 1)
|
||||
.subtract(const Duration(milliseconds: 1)))
|
||||
final RxInt endDate = DateTime(
|
||||
DateTime.now().year, DateTime.now().month, DateTime.now().day + 1)
|
||||
.subtract(const Duration(milliseconds: 1))
|
||||
.millisecondsSinceEpoch
|
||||
.obs;
|
||||
|
||||
var dropdownTitle = '全部事件'.tr.obs;
|
||||
var dropdownValue = XSConstantMacro.lockEventTypeAll.obs;
|
||||
RxString dropdownTitle = '全部事件'.tr.obs;
|
||||
RxInt dropdownValue = XSConstantMacro.lockEventTypeAll.obs;
|
||||
|
||||
List<DropDownItem> getDropDownItemList = [
|
||||
List<DropDownItem> getDropDownItemList = <DropDownItem>[
|
||||
DropDownItem(
|
||||
itemTitle: "全部事件".tr,
|
||||
itemTitle: '全部事件'.tr,
|
||||
itemValue: XSConstantMacro.lockEventTypeAll.toString(),
|
||||
isCheked: false),
|
||||
DropDownItem(
|
||||
itemTitle: "开锁事件".tr,
|
||||
itemTitle: '开锁事件'.tr,
|
||||
itemValue: XSConstantMacro.lockEventTypeOpenDoor.toString(),
|
||||
isCheked: false),
|
||||
DropDownItem(
|
||||
itemTitle: "异常事件".tr,
|
||||
itemTitle: '异常事件'.tr,
|
||||
itemValue: XSConstantMacro.lockEventTypeAbnormal.toString(),
|
||||
isCheked: false),
|
||||
DropDownItem(
|
||||
itemTitle: "门铃事件".tr,
|
||||
itemTitle: '门铃事件'.tr,
|
||||
itemValue: XSConstantMacro.lockEventTypeDoorbell.toString(),
|
||||
isCheked: false),
|
||||
DropDownItem(
|
||||
itemTitle: "视频事件".tr,
|
||||
itemTitle: '视频事件'.tr,
|
||||
itemValue: XSConstantMacro.lockEventTypeVideo.toString(),
|
||||
isCheked: false),
|
||||
];
|
||||
|
||||
var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示
|
||||
var operateDate = 0; // 按日期查询消息记录的时间戳
|
||||
var ifHaveNext = false; // 页码
|
||||
var logCountPage = 10; // 蓝牙记录一页多少个
|
||||
var currentSelectDate = DateTime.now().obs; // 当前选择的日期
|
||||
|
||||
DoorLockLogState() {
|
||||
keyInfos.value = Get.arguments["keyInfo"];
|
||||
}
|
||||
RxBool ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示
|
||||
int operateDate = 0; // 按日期查询消息记录的时间戳
|
||||
bool ifHaveNext = false; // 页码
|
||||
int logCountPage = 10; // 蓝牙记录一页多少个
|
||||
Rx<DateTime> currentSelectDate = DateTime.now().obs;
|
||||
}
|
||||
|
||||
@ -0,0 +1 @@
|
||||
|
||||
@ -0,0 +1,235 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:http/http.dart' as http;
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/app_settings/app_colors.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportRecordDialog/exportRecord_entity.dart';
|
||||
import 'package:star_lock/network/api_repository.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
import 'package:star_lock/tools/commonDataManage.dart';
|
||||
import 'package:star_lock/tools/pickers/pickers.dart';
|
||||
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
|
||||
import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart';
|
||||
import 'package:star_lock/tools/showTipView.dart';
|
||||
import 'package:star_lock/tools/submitBtn.dart';
|
||||
|
||||
class ExportRecordDialog extends StatelessWidget {
|
||||
const ExportRecordDialog({required this.onExport, Key? key})
|
||||
: super(key: key);
|
||||
final Function(String) onExport;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
child: Container(
|
||||
color: Colors.transparent,
|
||||
child: GestureDetector(
|
||||
onTap: () {},
|
||||
child: Center(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 60.w),
|
||||
child: _DerivedRecordWidget(onExport: onExport),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _DerivedRecordWidget extends StatefulWidget {
|
||||
const _DerivedRecordWidget({required this.onExport, Key? key})
|
||||
: super(key: key);
|
||||
final Function(String) onExport;
|
||||
|
||||
@override
|
||||
__DerivedRecordWidgetState createState() => __DerivedRecordWidgetState();
|
||||
}
|
||||
|
||||
class __DerivedRecordWidgetState extends State<_DerivedRecordWidget> {
|
||||
DateTime? startDate = DateTime.now();
|
||||
DateTime? endDate = DateTime.now();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Center(
|
||||
child: IntrinsicHeight(
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 20.h),
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.circular(16.w),
|
||||
),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
'导出记录'.tr,
|
||||
style: TextStyle(fontSize: 22.sp),
|
||||
),
|
||||
SizedBox(height: 16.h),
|
||||
Text(
|
||||
'选择时间段'.tr,
|
||||
style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.bold),
|
||||
),
|
||||
SizedBox(height: 26.h),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
_buildDateContainer(
|
||||
DateFormat('yyyy-MM-dd').format(startDate!),
|
||||
_showStartDatePicker),
|
||||
Text(
|
||||
'--',
|
||||
style: TextStyle(fontSize: 24.sp),
|
||||
),
|
||||
_buildDateContainer(DateFormat('yyyy-MM-dd').format(endDate!),
|
||||
_showEndDatePicker),
|
||||
],
|
||||
),
|
||||
SizedBox(height: 26.h),
|
||||
Divider(
|
||||
height: 1.sp,
|
||||
color: AppColors.greyLineColor,
|
||||
),
|
||||
SizedBox(height: 26.h),
|
||||
SubmitBtn(
|
||||
btnName: '导出'.tr,
|
||||
onClick: _handleExport,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: <Widget>[
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
Get.toNamed(Routers.batchExportLogPage);
|
||||
},
|
||||
child: Text(
|
||||
'批量导出'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 22.sp,
|
||||
color: AppColors.mainColor,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildDateContainer(String date, VoidCallback onPressed) {
|
||||
return GestureDetector(
|
||||
onTap: onPressed,
|
||||
child: Container(
|
||||
width: 200.w,
|
||||
height: 60.h,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: AppColors.greyLineColor,
|
||||
width: 1.w,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(8.w),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
date,
|
||||
style: TextStyle(fontSize: 24.sp),
|
||||
),
|
||||
Icon(
|
||||
Icons.arrow_drop_down,
|
||||
size: 30.w,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _showStartDatePicker() {
|
||||
final PDuration selectDate = PDuration.parse(startDate ?? DateTime.now());
|
||||
Pickers.showDatePicker(
|
||||
context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMD,
|
||||
onConfirm: (PDuration p) {
|
||||
setState(() {
|
||||
startDate = DateTime(p.year!, p.month!, p.day!);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _showEndDatePicker() {
|
||||
final PDuration selectDate = PDuration.parse(endDate ?? DateTime.now());
|
||||
Pickers.showDatePicker(
|
||||
context,
|
||||
selectDate: selectDate,
|
||||
mode: DateMode.YMD,
|
||||
onConfirm: (PDuration p) {
|
||||
setState(() {
|
||||
endDate = DateTime(p.year!, p.month!, p.day!);
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _handleExport() {
|
||||
if (startDate == null || endDate == null) {
|
||||
ShowTipView().showSureAlertDialog(
|
||||
'请选择开始和结束日期'.tr,
|
||||
tipTitle: '提示'.tr,
|
||||
sureStr: '我知道了'.tr,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
exportLockRecordsRequest();
|
||||
}
|
||||
|
||||
//操作记录-导出锁记录
|
||||
Future<void> exportLockRecordsRequest() async {
|
||||
final ExportRecordEntity entity = await ApiRepository.to.exportLockRecords(
|
||||
lockId: CommonDataManage().currentKeyInfo.lockId ?? 0,
|
||||
startDate: startDate!.millisecondsSinceEpoch,
|
||||
endDate: endDate!.millisecondsSinceEpoch,
|
||||
);
|
||||
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
final String url = entity.data!.fileUrl!;
|
||||
//下载文件地址
|
||||
final String filePath = await downloadAndSaveFile(url);
|
||||
widget.onExport(filePath);
|
||||
// return url;
|
||||
} else {
|
||||
throw 'Export failed with error code ${entity.errorCode}';
|
||||
}
|
||||
}
|
||||
|
||||
// 下载并保存文件
|
||||
Future<String> downloadAndSaveFile(String url) async {
|
||||
final http.Response response = await http.get(Uri.parse(url));
|
||||
if (response.statusCode == 200) {
|
||||
final Directory directory = await getApplicationDocumentsDirectory();
|
||||
final File file = File('${directory.path}/exported_file.xlsx');
|
||||
await file.writeAsBytes(response.bodyBytes);
|
||||
return file.path;
|
||||
} else {
|
||||
throw 'Failed to download file';
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
|
||||
@ -0,0 +1,40 @@
|
||||
class ExportRecordEntity {
|
||||
ExportRecordEntity(
|
||||
{this.errorCode, this.description, this.errorMsg, this.data});
|
||||
ExportRecordEntity.fromJson(Map<String, dynamic> json) {
|
||||
errorCode = json['errorCode'];
|
||||
description = json['description'];
|
||||
errorMsg = json['errorMsg'];
|
||||
data = json['data'] != null ? Data.fromJson(json['data']) : null;
|
||||
}
|
||||
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;
|
||||
if (this.data != null) {
|
||||
data['data'] = this.data!.toJson();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class Data {
|
||||
Data({this.fileUrl});
|
||||
|
||||
Data.fromJson(Map<String, dynamic> json) {
|
||||
fileUrl = json['fileUrl'];
|
||||
}
|
||||
String? fileUrl;
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['fileUrl'] = fileUrl;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_state.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
|
||||
class ExportSuccessLogic extends BaseGetXController {
|
||||
ExportSuccessState state = ExportSuccessState();
|
||||
}
|
||||
@ -0,0 +1,243 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:star_lock/appRouters.dart';
|
||||
import 'package:star_lock/app_settings/app_colors.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_logic.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportSuccess/exportSuccess_state.dart';
|
||||
import 'package:star_lock/tools/NativeInteractionTool.dart';
|
||||
import 'package:star_lock/tools/commonDataManage.dart';
|
||||
import 'package:star_lock/tools/submitBtn.dart';
|
||||
import 'package:star_lock/tools/titleAppBar.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:open_file/open_file.dart';
|
||||
|
||||
class ExportSuccessPage extends StatefulWidget {
|
||||
const ExportSuccessPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<ExportSuccessPage> createState() => _ExportSuccessPageState();
|
||||
}
|
||||
|
||||
class _ExportSuccessPageState extends State<ExportSuccessPage> with RouteAware {
|
||||
final ExportSuccessLogic logic = Get.put(ExportSuccessLogic());
|
||||
final ExportSuccessState state = Get.find<ExportSuccessLogic>().state;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle: '导出'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
),
|
||||
body: sendElectronicKeySucceed(),
|
||||
);
|
||||
}
|
||||
|
||||
// 导出成功
|
||||
|
||||
Widget sendElectronicKeySucceed() {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
height: 250.h,
|
||||
width: 1.sw,
|
||||
color: Colors.white,
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
SizedBox(
|
||||
height: 30.h,
|
||||
),
|
||||
Image.asset(
|
||||
'images/icon_send_success.png',
|
||||
width: 100.w,
|
||||
height: 100.w,
|
||||
),
|
||||
SizedBox(
|
||||
height: 20.h,
|
||||
),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
'导出成功'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 26.sp,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.w500),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 60.h,
|
||||
),
|
||||
SubmitBtn(
|
||||
btnName: '立即查看'.tr,
|
||||
onClick: () {
|
||||
OpenFile.open(state.getFilePath.value);
|
||||
NativeInteractionTool()
|
||||
.loadNativeFileShare(shareText: state.getFilePath.value);
|
||||
|
||||
// openFile(state.getFilePath.value);
|
||||
// previewFile();
|
||||
// Get.toNamed(Routers.viewExportRecordPage,
|
||||
// arguments: <String, Object>{
|
||||
// 'filePath': state.getFilePath.value,
|
||||
// });
|
||||
// Get.toNamed(Routers.webviewShowPage, arguments: <String, Object>{
|
||||
// 'url': state.getFilePath.value,
|
||||
// 'title': '查看操作记录'.tr
|
||||
// });
|
||||
}),
|
||||
SizedBox(
|
||||
height: 20.h,
|
||||
),
|
||||
OutLineBtn(
|
||||
btnName: '分享'.tr,
|
||||
onClick: () {
|
||||
_openModalBottomSheet();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
// Future<void> openFile(String filePath) async {
|
||||
// final File file = File(filePath);
|
||||
// if (await file.exists()) {
|
||||
// await launchUrl(Uri.parse('file://$filePath'));
|
||||
// } else {
|
||||
// throw 'File not found';
|
||||
// }
|
||||
// }
|
||||
|
||||
Future<void> previewFile() async {
|
||||
// 获取本地文件路径
|
||||
final Directory appDocDir = await getApplicationDocumentsDirectory();
|
||||
final String appDocPath = appDocDir.path;
|
||||
final String filePath = '$appDocPath/exported_file.xlsx';
|
||||
|
||||
// 检查文件是否存在
|
||||
final File file = File(filePath);
|
||||
if (await file.exists()) {
|
||||
// 使用url_launcher打开文件
|
||||
final bool launched = await launchUrl(Uri.parse(filePath));
|
||||
if (!launched) {
|
||||
throw 'Could not launch $filePath';
|
||||
}
|
||||
} else {
|
||||
print('File does not exist');
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _openModalBottomSheet() async {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadiusDirectional.circular(10)),
|
||||
constraints: BoxConstraints(maxHeight: 270.h),
|
||||
builder: (BuildContext context) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
SizedBox(
|
||||
width: ScreenUtil().screenWidth,
|
||||
height: 160.h,
|
||||
child: ListView(
|
||||
scrollDirection: Axis.horizontal, //横向滚动
|
||||
children: initBottomSheetList()),
|
||||
),
|
||||
Container(
|
||||
height: 8.h,
|
||||
color: AppColors.greyBackgroundColor,
|
||||
),
|
||||
TextButton(
|
||||
style: ButtonStyle(
|
||||
overlayColor:
|
||||
MaterialStateProperty.all<Color>(Colors.white)),
|
||||
child: Text(
|
||||
'取消'.tr,
|
||||
style: TextStyle(
|
||||
color: Colors.black, fontSize: ScreenUtil().setSp(24)),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.pop(context);
|
||||
},
|
||||
)
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
List<Widget> initBottomSheetList() {
|
||||
final List<Widget> widgetList = <Widget>[];
|
||||
|
||||
widgetList.add(buildCenter3('images/icon_wechat.png', '微信好友'.tr, 0));
|
||||
widgetList.add(buildCenter3('images/icon_message.png', '短信'.tr, 1));
|
||||
widgetList.add(buildCenter3('images/icon_email.png', '邮件'.tr, 2));
|
||||
widgetList.add(buildCenter3('images/icon_more.png', '更多'.tr, 3));
|
||||
|
||||
return widgetList;
|
||||
}
|
||||
|
||||
GestureDetector buildCenter3(
|
||||
String imageName, String titleStr, int itemIndex) {
|
||||
return GestureDetector(
|
||||
child: Container(
|
||||
width: 120.w,
|
||||
// height: 64.h,
|
||||
margin:
|
||||
EdgeInsets.only(top: 20.w, bottom: 20.w, left: 10.w, right: 10.w),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Image.asset(
|
||||
imageName,
|
||||
width: 50.w,
|
||||
height: 50.h,
|
||||
),
|
||||
SizedBox(
|
||||
height: 16.w,
|
||||
),
|
||||
Text(
|
||||
titleStr,
|
||||
style: TextStyle(
|
||||
fontSize: ScreenUtil().setSp(20), color: Colors.black),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
onTap: () => jumpSmartDeviceRoute(itemIndex),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> jumpSmartDeviceRoute(int itemIndex) async {
|
||||
Get.back();
|
||||
// final String pwdShareStr = logic.getShareContentStr();
|
||||
switch (itemIndex) {
|
||||
case 0: //微信好友
|
||||
// NativeInteractionTool().loadNativeShare(shareText: pwdShareStr);
|
||||
break;
|
||||
case 1: //短信
|
||||
case 2: //邮件
|
||||
Get.toNamed(Routers.sendEmailNotificationPage,
|
||||
arguments: <String, Object?>{
|
||||
'receiver': '',
|
||||
'channelType': itemIndex == 1 ? 1 : 2,
|
||||
'keyId': CommonDataManage().currentKeyInfo.keyId,
|
||||
});
|
||||
break;
|
||||
case 3: //更多
|
||||
// NativeInteractionTool().loadNativeShare(shareText: pwdShareStr);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,10 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class ExportSuccessState {
|
||||
ExportSuccessState() {
|
||||
final Map map = Get.arguments;
|
||||
getFilePath.value = map['filePath'];
|
||||
}
|
||||
|
||||
RxString getFilePath = ''.obs;
|
||||
}
|
||||
@ -0,0 +1,6 @@
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_state.dart';
|
||||
import 'package:star_lock/tools/baseGetXController.dart';
|
||||
|
||||
class ViewExportRecordLogic extends BaseGetXController {
|
||||
ViewExportRecordState state = ViewExportRecordState();
|
||||
}
|
||||
@ -0,0 +1,70 @@
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:star_lock/app_settings/app_colors.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_logic.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/viewExportRecord/viewExportRecord_state.dart';
|
||||
import 'package:star_lock/tools/titleAppBar.dart';
|
||||
|
||||
class ViewExportRecordPage extends StatefulWidget {
|
||||
const ViewExportRecordPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<ViewExportRecordPage> createState() => _ViewExportRecordPageState();
|
||||
}
|
||||
|
||||
class _ViewExportRecordPageState extends State<ViewExportRecordPage>
|
||||
with RouteAware {
|
||||
final ViewExportRecordLogic logic = Get.put(ViewExportRecordLogic());
|
||||
final ViewExportRecordState state = Get.find<ViewExportRecordLogic>().state;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle: '查看导出记录'.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor,
|
||||
),
|
||||
body: Center(
|
||||
child: state.excelData.isEmpty
|
||||
? const CircularProgressIndicator()
|
||||
: SingleChildScrollView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
child: SingleChildScrollView(
|
||||
scrollDirection: Axis.vertical,
|
||||
child: DataTable(
|
||||
columns: List.generate(
|
||||
state.excelData[0].length,
|
||||
(int index) => DataColumn(
|
||||
label: Text('${state.excelData[0][index]}'),
|
||||
),
|
||||
),
|
||||
rows: List.generate(
|
||||
state.excelData.length - 1,
|
||||
(int index) => DataRow(
|
||||
cells: List.generate(
|
||||
state.excelData[index + 1].length,
|
||||
(int cellIndex) => DataCell(
|
||||
Text('${state.excelData[index + 1][cellIndex]}'),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class ViewExportRecordState {
|
||||
ViewExportRecordState() {
|
||||
final Map map = Get.arguments;
|
||||
getFilePath.value = map['filePath'];
|
||||
}
|
||||
|
||||
RxString getFilePath = ''.obs;
|
||||
List<List<dynamic>> excelData = [];
|
||||
}
|
||||
@ -778,7 +778,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
? AppColors.mainColor
|
||||
: AppColors.btnDisableColor),
|
||||
),
|
||||
if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w),
|
||||
if (add) SizedBox(width: 20.w) else SizedBox(width: 20.w),
|
||||
FlavorsImg(
|
||||
child: Image.asset('images/main/icon_lockDetail_needNetwork.png',
|
||||
width: 24.w,
|
||||
@ -789,7 +789,7 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
),
|
||||
SizedBox(width: 6.w),
|
||||
Text(
|
||||
'手机需联网',
|
||||
'手机需联网'.tr,
|
||||
style: TextStyle(
|
||||
fontSize: 20.sp,
|
||||
color: state.isOpenLockNeedOnline.value == 1
|
||||
|
||||
@ -646,7 +646,10 @@ class LockSetLogic extends BaseGetXController {
|
||||
recordType: recordType,
|
||||
records: records,
|
||||
isUnShowLoading: true);
|
||||
if (entity.errorCode!.codeIsSuccessful) {}
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
await getLockSettingInfoData();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@ -28,7 +28,9 @@ class LockSetPage extends StatefulWidget {
|
||||
|
||||
class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
final LockSetLogic logic = Get.put(LockSetLogic());
|
||||
final LockSetState state = Get.find<LockSetLogic>().state;
|
||||
final LockSetState state = Get
|
||||
.find<LockSetLogic>()
|
||||
.state;
|
||||
|
||||
Future<void> getHttpData() async {
|
||||
logic.getLockSettingInfoData().then((LockSetInfoEntity value) {
|
||||
@ -49,26 +51,29 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle: TranslationLoader.lanKeys!.set!.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor),
|
||||
body: EasyRefreshTool(
|
||||
onRefresh: () {
|
||||
getHttpData();
|
||||
},
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Obx(() => ListView(
|
||||
children: getListWidget(),
|
||||
)),
|
||||
),
|
||||
],
|
||||
),
|
||||
));
|
||||
return GetBuilder<LockSetLogic>(builder: (LockSetLogic logic) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.mainBackgroundColor,
|
||||
appBar: TitleAppBar(
|
||||
barTitle: TranslationLoader.lanKeys!.set!.tr,
|
||||
haveBack: true,
|
||||
backgroundColor: AppColors.mainColor),
|
||||
body: EasyRefreshTool(
|
||||
onRefresh: () {
|
||||
getHttpData();
|
||||
},
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: Obx(() =>
|
||||
ListView(
|
||||
children: getListWidget(),
|
||||
)),
|
||||
),
|
||||
],
|
||||
),
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
// 根据权限显示不同的列表
|
||||
@ -93,45 +98,53 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.basicInformationPage,
|
||||
arguments: <String, LockSetInfoData>{'lockSetInfoData': state.lockSetInfoData.value});
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}),
|
||||
SizedBox(height: 10.h),
|
||||
// 自动闭锁
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockFeature.value.autoLock == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.autoLock ?? 0) > 0
|
||||
? '${state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond ?? 0}s'
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0
|
||||
// ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s"
|
||||
// : TranslationLoader.lanKeys!.closed!.tr),
|
||||
action: () {
|
||||
Get.toNamed(Routers.automaticBlockingPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value,
|
||||
// 'lockBasicInfo': state.lockBasicInfo.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.autoLock == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.autoLock ?? 0) > 0
|
||||
? '${state.lockSetInfoData.value.lockSettingInfo!
|
||||
.autoLockSecond ?? 0}s'
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0
|
||||
// ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s"
|
||||
// : TranslationLoader.lanKeys!.closed!.tr),
|
||||
action: () {
|
||||
Get.toNamed(Routers.automaticBlockingPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value,
|
||||
// 'lockBasicInfo': state.lockBasicInfo.value
|
||||
});
|
||||
}))),
|
||||
// 常开模式
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockFeature.value.passageMode == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) == 1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.normallyOpenModePage, arguments: <String, Object>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value,
|
||||
'lockBasicInfo': state.lockBasicInfo.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.passageMode == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) ==
|
||||
1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.normallyOpenModePage,
|
||||
arguments: <String, Object>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value,
|
||||
'lockBasicInfo': state.lockBasicInfo.value
|
||||
});
|
||||
}))),
|
||||
Visibility(
|
||||
visible: true,
|
||||
child: CommonItem(
|
||||
@ -140,7 +153,8 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.lockTimePage, arguments: <String, LockSetInfoData>{
|
||||
Get.toNamed(
|
||||
Routers.lockTimePage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
})),
|
||||
@ -174,7 +188,9 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.basicInformationPage,
|
||||
arguments: <String, LockSetInfoData>{'lockSetInfoData': state.lockSetInfoData.value});
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}),
|
||||
SizedBox(height: 10.h),
|
||||
//by DaisyWu 田总:移至锁详情配件区
|
||||
@ -226,24 +242,27 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
// })),
|
||||
// SizedBox(height: 10.h),
|
||||
// 自动闭锁
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockFeature.value.autoLock == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr,
|
||||
rightTitle: state.lockSettingInfo.value.autoLock! > 0
|
||||
? '${state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond}s'
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0
|
||||
// ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s"
|
||||
// : TranslationLoader.lanKeys!.closed!.tr),
|
||||
action: () {
|
||||
Get.toNamed(Routers.automaticBlockingPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.autoLock == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr,
|
||||
rightTitle: state.lockSettingInfo.value.autoLock! > 0
|
||||
? '${state.lockSetInfoData.value.lockSettingInfo!
|
||||
.autoLockSecond}s'
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
// isHaveRightWidget: true,
|
||||
// rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0
|
||||
// ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s"
|
||||
// : TranslationLoader.lanKeys!.closed!.tr),
|
||||
action: () {
|
||||
Get.toNamed(Routers.automaticBlockingPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
// 锁声音
|
||||
Obx(() {
|
||||
String titleStr = '';
|
||||
@ -276,73 +295,87 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.lockSoundSetPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
Get.toNamed(Routers.lockSoundSetPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}));
|
||||
}),
|
||||
// 防撬报警
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockFeature.value.antiPrySwitch == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.burglarAlarm!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.antiPrySwitch ?? 0) == 1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.burglarAlarmPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.antiPrySwitch == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.burglarAlarm!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.antiPrySwitch ??
|
||||
0) == 1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.burglarAlarmPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
SizedBox(height: 10.h),
|
||||
// 常开模式
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockFeature.value.passageMode == 1,
|
||||
// visible: true,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) == 1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.normallyOpenModePage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.passageMode == 1,
|
||||
// visible: true,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) ==
|
||||
1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.normallyOpenModePage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
// 远程开锁
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockFeature.value.remoteUnlock == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.remoteUnlocking!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.remoteUnlock ?? 0) == 1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.remoteUnlockingPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.remoteUnlock == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.remoteUnlocking!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.remoteUnlock ?? 0) ==
|
||||
1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.remoteUnlockingPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
// 重置键
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.resetSwitch == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.resetButton!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.resetSwitch ?? 0) == 1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.resetButtonPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
state.lockFeature.value.resetSwitch == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.resetButton!.tr,
|
||||
rightTitle: (state.lockSettingInfo.value.resetSwitch ?? 0) ==
|
||||
1
|
||||
? TranslationLoader.lanKeys!.opened!.tr
|
||||
: TranslationLoader.lanKeys!.closed!.tr,
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.resetButtonPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
SizedBox(height: 10.h),
|
||||
//---田总新增展示
|
||||
// Obx(() =>
|
||||
@ -355,9 +388,10 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.faceUnlockPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
Get.toNamed(Routers.faceUnlockPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
})),
|
||||
// ),
|
||||
// 消息提醒
|
||||
@ -370,21 +404,25 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.msgNotificationPage,
|
||||
arguments: <String, int?>{'lockId': state.lockSetInfoData.value.lockId});
|
||||
arguments: <String, int?>{
|
||||
'lockId': state.lockSetInfoData.value.lockId
|
||||
});
|
||||
})),
|
||||
//猫眼设置
|
||||
Obx(() => Visibility(
|
||||
visible: state.lockFeature.value.isSupportCatEye == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.catEyeSet!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.catEyeSetPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
Obx(() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.isSupportCatEye == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.catEyeSet!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.catEyeSetPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
}))),
|
||||
// Obx(() =>
|
||||
//自动亮屏已包括至面容开锁模块
|
||||
// Visibility(
|
||||
@ -420,9 +458,10 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveDirection: true,
|
||||
isHaveLine: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.openDoorDirectionPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
Get.toNamed(Routers.openDoorDirectionPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
})),
|
||||
// 电机功率设置
|
||||
Visibility(
|
||||
@ -472,58 +511,66 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
// }),
|
||||
// 考勤
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.attendance == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.checkingIn!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _openCheckInSwitch())),
|
||||
() =>
|
||||
Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
state.lockFeature.value.attendance == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.checkingIn!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _openCheckInSwitch())),
|
||||
),
|
||||
// 开锁提醒
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.unlockReminder == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _lockRemindSwitch())),
|
||||
() =>
|
||||
Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
state.lockFeature.value.unlockReminder == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _lockRemindSwitch())),
|
||||
),
|
||||
// APP开锁时是否需联网
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.appUnlockOnline == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader
|
||||
.lanKeys!.whetherInternetRequiredWhenUnlocking!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: false,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _openLockNeedOnlineSwitch()),
|
||||
),
|
||||
() =>
|
||||
Visibility(
|
||||
visible: state.lockBasicInfo.value.isLockOwner == 1 &&
|
||||
state.lockFeature.value.appUnlockOnline == 1,
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader
|
||||
.lanKeys!.whetherInternetRequiredWhenUnlocking!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: false,
|
||||
isHaveRightWidget: true,
|
||||
rightWidget: _openLockNeedOnlineSwitch()),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 10.h),
|
||||
// wifi配网
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: state.lockFeature.value.wifi == 1,
|
||||
child: CommonItem(
|
||||
leftTitel:
|
||||
() =>
|
||||
Visibility(
|
||||
visible: state.lockFeature.value.wifi == 1,
|
||||
child: CommonItem(
|
||||
leftTitel:
|
||||
TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr,
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.wifiListPage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
// Get.toNamed(Routers.configuringWifiPage, arguments: {
|
||||
// 'lockSetInfoData': state.lockSetInfoData.value
|
||||
// });
|
||||
})),
|
||||
rightTitle: '',
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.wifiListPage,
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
// Get.toNamed(Routers.configuringWifiPage, arguments: {
|
||||
// 'lockSetInfoData': state.lockSetInfoData.value
|
||||
// });
|
||||
})),
|
||||
),
|
||||
// Obx(() =>
|
||||
// 锁时间
|
||||
@ -535,7 +582,8 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
isHaveLine: true,
|
||||
isHaveDirection: true,
|
||||
action: () {
|
||||
Get.toNamed(Routers.lockTimePage, arguments: <String, LockSetInfoData>{
|
||||
Get.toNamed(
|
||||
Routers.lockTimePage, arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
})),
|
||||
@ -628,13 +676,17 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
|
||||
thumbColor: CupertinoColors.white,
|
||||
value: state.isAttendance.value == 1,
|
||||
onChanged: (bool value) {
|
||||
logic.openCheckingInData((CheckingInInfoDataEntity checkingInInfoDataEntity) {
|
||||
logic.openCheckingInData((
|
||||
CheckingInInfoDataEntity checkingInInfoDataEntity) {
|
||||
if (checkingInInfoDataEntity.data!.companyId == 0) {
|
||||
// logic.showCupertinoAlertDialog(context);
|
||||
ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () {
|
||||
ShowTipView().showIosTipWithContentDialog(
|
||||
'创建公司后,考勤功能才能使用'.tr, () {
|
||||
// 删除锁
|
||||
Get.toNamed(Routers.checkInCreatCompanyPage,
|
||||
arguments: <String, LockSetInfoData>{'lockSetInfoData': state.lockSetInfoData.value});
|
||||
arguments: <String, LockSetInfoData>{
|
||||
'lockSetInfoData': state.lockSetInfoData.value
|
||||
});
|
||||
});
|
||||
} else {
|
||||
logic.setLockSetGeneralSetting();
|
||||
|
||||
@ -27,7 +27,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
|
||||
//获取密码请求
|
||||
Future<void> getKeyboardPwdRequest() async {
|
||||
int startDate = DateTool().dateToTimestamp(state.beginTime.value, 1);
|
||||
final int endDate = DateTool().dateToTimestamp(state.endTime.value, 1);
|
||||
int endDate = DateTool().dateToTimestamp(state.endTime.value, 1);
|
||||
final int lockId = state.keyInfo.value.lockId!;
|
||||
String getKeyType = '0';
|
||||
|
||||
@ -55,6 +55,10 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
|
||||
showToast('失效时间要大于当前时间'.tr);
|
||||
return;
|
||||
}
|
||||
//endDate 设置当天凌晨 0 点
|
||||
final DateTime now = DateTime.now();
|
||||
startDate =
|
||||
DateTime(now.year, now.month, now.day).millisecondsSinceEpoch;
|
||||
}
|
||||
|
||||
// 芯连需要生效时间
|
||||
@ -221,6 +225,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
|
||||
// late DateTime getStartDateTime;
|
||||
// 监听设备返回的数据
|
||||
late StreamSubscription<Reply> _replySubscription;
|
||||
|
||||
void _initReplySubscription() {
|
||||
_replySubscription =
|
||||
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
|
||||
@ -436,7 +441,8 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
|
||||
case 3:
|
||||
//自定义
|
||||
if (state.isPermanent.value == false) {
|
||||
useDateStr = '类型:自定义-限时\n有效期:${state.customBeginTime.value} -- ${state.customEndTime.value}';
|
||||
useDateStr =
|
||||
'类型:自定义-限时\n有效期:${state.customBeginTime.value} -- ${state.customEndTime.value}';
|
||||
} else {
|
||||
useDateStr = '类型:自定义-永久';
|
||||
}
|
||||
|
||||
@ -225,7 +225,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
Visibility(
|
||||
visible: CommonDataManage().currentKeyInfo.vendor == 'XHJ',
|
||||
visible: CommonDataManage().currentKeyInfo.vendor != 'XHJ',
|
||||
child: CommonItem(
|
||||
leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr,
|
||||
rightTitle: state.beginTime.value,
|
||||
|
||||
@ -36,7 +36,7 @@ class LockMainLogic extends BaseGetXController {
|
||||
isUnShowLoading: isUnShowLoading,
|
||||
);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
await loadMainDataLogic(entity.data!);
|
||||
await loadMainDataLogic(entity.data!);
|
||||
}
|
||||
return entity;
|
||||
}
|
||||
@ -149,7 +149,8 @@ class LockMainLogic extends BaseGetXController {
|
||||
final LockListInfoEntity entity = await ApiRepository.to.getStarLockInfo(
|
||||
keyId: keyId,
|
||||
);
|
||||
if (entity.errorCode!.codeIsSuccessful) {
|
||||
if (entity.errorCode!.codeIsSuccessful &&
|
||||
(entity.data?.groupList ?? <GroupList>[]).isNotEmpty) {
|
||||
state.lockListInfoGroupEntity.value.groupList ??= <GroupList>[];
|
||||
final GroupList list = entity.data!.groupList!.first;
|
||||
final LockListInfoItemEntity listItem =
|
||||
|
||||
@ -257,4 +257,5 @@ abstract class Api {
|
||||
final String keyNoticeTemplateURL = '/key/getNoticeTemplate'; //获取电子钥匙通知模板
|
||||
final String keyNoticeSubmitURL = '/key/noticeSubmit'; //发送短信、邮件通知
|
||||
final String lockUpdateLockInfo = '/lock/updateLockInfo'; //更新锁固件版本
|
||||
final String exportLockRecordsURL = '/lockRecords/export'; //导出锁操作记录
|
||||
}
|
||||
|
||||
@ -397,8 +397,12 @@ class ApiProvider extends BaseProvider {
|
||||
}));
|
||||
|
||||
// 获取锁信息列表
|
||||
Future<Response> getStarLockListInfo(int pageNo, int pageSize,
|
||||
{bool isUnShowLoading = true, int? keyId,}) =>
|
||||
Future<Response> getStarLockListInfo(
|
||||
int pageNo,
|
||||
int pageSize, {
|
||||
bool isUnShowLoading = true,
|
||||
int? keyId,
|
||||
}) =>
|
||||
post(
|
||||
getStarLockInfoURL.toUrl,
|
||||
jsonEncode(<String, dynamic>{
|
||||
@ -1460,9 +1464,7 @@ class ApiProvider extends BaseProvider {
|
||||
|
||||
// 获取转移锁锁列表
|
||||
Future<Response> getTransferLockListData(String searchStr) =>
|
||||
post(transferLockListURL.toUrl, jsonEncode({
|
||||
"searchStr":searchStr
|
||||
}));
|
||||
post(transferLockListURL.toUrl, jsonEncode({"searchStr": searchStr}));
|
||||
|
||||
// 转移智能锁确认
|
||||
Future<Response> transferLockConfirmInfoData(
|
||||
@ -2288,6 +2290,34 @@ class ApiProvider extends BaseProvider {
|
||||
'fwVersion': fwVersion,
|
||||
}),
|
||||
);
|
||||
|
||||
Future<Response<dynamic>> exportLockRecords(
|
||||
int lockId,
|
||||
int startDate,
|
||||
int endDate,
|
||||
) =>
|
||||
post(
|
||||
exportLockRecordsURL.toUrl,
|
||||
jsonEncode(<String, dynamic>{
|
||||
'lockId': lockId,
|
||||
'startDate': startDate,
|
||||
'endDate': endDate,
|
||||
}),
|
||||
);
|
||||
|
||||
Future<Response<dynamic>> batchExportLockRecords(
|
||||
List<int> lockIds,
|
||||
int startDate,
|
||||
int endDate,
|
||||
) =>
|
||||
post(
|
||||
exportLockRecordsURL.toUrl,
|
||||
jsonEncode(<String, dynamic>{
|
||||
'lockIds': lockIds,
|
||||
'startDate': startDate,
|
||||
'endDate': endDate,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
extension ExtensionString on String {
|
||||
|
||||
@ -4,6 +4,7 @@ import 'package:star_lock/login/login/app_get_version.dart';
|
||||
import 'package:star_lock/login/selectCountryRegion/common/countryRegionEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/authorizedAdmin/authorizedAdmin/notice_template_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/doorLockLog/exportRecordDialog/exportRecord_entity.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_entity.dart';
|
||||
@ -1657,7 +1658,8 @@ class ApiRepository {
|
||||
}
|
||||
|
||||
// 获取转移锁锁列表
|
||||
Future<TransferSmartLockEntity> getTransferLockListData({required String searchStr}) async {
|
||||
Future<TransferSmartLockEntity> getTransferLockListData(
|
||||
{required String searchStr}) async {
|
||||
final res = await apiProvider.getTransferLockListData(searchStr);
|
||||
return TransferSmartLockEntity.fromJson(res.body);
|
||||
}
|
||||
@ -2302,4 +2304,26 @@ class ApiRepository {
|
||||
await apiProvider.getLockUpdateLockInfo(lockId, fwVersion);
|
||||
return UpdateLockInfoEntity.fromJson(res.body);
|
||||
}
|
||||
|
||||
//导出锁记录
|
||||
Future<ExportRecordEntity> exportLockRecords({
|
||||
required int lockId,
|
||||
required int startDate,
|
||||
required int endDate,
|
||||
}) async {
|
||||
final Response<dynamic> res =
|
||||
await apiProvider.exportLockRecords(lockId, startDate, endDate);
|
||||
return ExportRecordEntity.fromJson(res.body);
|
||||
}
|
||||
|
||||
//批量导出锁记录
|
||||
Future<ExportRecordEntity> batchExportLockRecords({
|
||||
required List<int> lockIds,
|
||||
required int startDate,
|
||||
required int endDate,
|
||||
}) async {
|
||||
final Response<dynamic> res =
|
||||
await apiProvider.batchExportLockRecords(lockIds, startDate, endDate);
|
||||
return ExportRecordEntity.fromJson(res.body);
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,8 +21,14 @@ class NativeInteractionTool {
|
||||
///加载原生分享
|
||||
void loadNativeShare({required String shareText}) {
|
||||
final String urlToShare = '${F.apiPrefix}/apps';
|
||||
sendChannel.invokeMethod(
|
||||
'loadNativeShare', <String, String>{'shareText': shareText,'urlToShare':urlToShare});
|
||||
sendChannel.invokeMethod('loadNativeShare',
|
||||
<String, String>{'shareText': shareText, 'urlToShare': urlToShare});
|
||||
}
|
||||
|
||||
///加载原生文件分享
|
||||
void loadNativeFileShare({required String shareText}) {
|
||||
sendChannel.invokeMethod('loadNativeShare',
|
||||
<String, String>{'shareText': shareText, 'urlToShare': 'fileShare'});
|
||||
}
|
||||
|
||||
///获取设备蓝牙状态
|
||||
|
||||
@ -74,15 +74,13 @@ class MessageManagement {
|
||||
case MessageConstant.lockSetChange:
|
||||
final int keyId = data['keyId'];
|
||||
final int lockId = data['lockId'];
|
||||
final Map<String, dynamic> extra = data['updateFieldList'];
|
||||
if (extra['appUnlockOnline'] != null) {
|
||||
final String appUnlockOnline = extra['appUnlockOnline'];
|
||||
eventBus.fire(
|
||||
LockSetChangeSetRefreshLockDetailWithType(1, appUnlockOnline));
|
||||
eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId));
|
||||
}
|
||||
// 暂时只用刷新
|
||||
// final Map<Object?, Object?> extra = data['updateFieldList'];
|
||||
// if (extra['appUnlockOnline'] != null) {
|
||||
// final String appUnlockOnline = extra['appUnlockOnline']!.toString();
|
||||
// }
|
||||
eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId));
|
||||
break;
|
||||
|
||||
default:
|
||||
throw Exception('无法识别eventNo 参数:$eventNo');
|
||||
}
|
||||
|
||||
@ -73,8 +73,9 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
# 1.0.62+2024061301:xhj 线上环境,对外发布,提交测试:处理华为拒审
|
||||
# 1.0.63+2024061302:xhj 线上环境,提交测试:回归 bug
|
||||
# 1.0.65+2024061801:xhj 线上环境,提交测试:回归 bug
|
||||
# 1.0.66+2024061802:xhj 线上环境,提交测试:回归 bug
|
||||
|
||||
version: 1.0.65+2024061801
|
||||
version: 1.0.66+2024061802
|
||||
|
||||
environment:
|
||||
sdk: '>=2.12.0 <3.0.0'
|
||||
@ -216,6 +217,7 @@ dependencies:
|
||||
file_picker: ^5.3.1
|
||||
# 错误日志监控
|
||||
flutter_bugly_plugin: ^0.0.9
|
||||
open_file: ^3.3.2
|
||||
|
||||
dependency_overrides:
|
||||
#强制设置google_maps_flutter_ios 为 2.5.2
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user