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

This commit is contained in:
魏少阳 2024-06-21 09:32:52 +08:00
commit 56ddcb8498
36 changed files with 1309 additions and 294 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -2,14 +2,14 @@
"starLock": "Star Lock", "starLock": "Star Lock",
"lockThrough": "Lock Through", "lockThrough": "Lock Through",
"clickUnlockAndHoldDownClose": "Click To Unlock And Hold Down to Close", "clickUnlockAndHoldDownClose": "Click To Unlock And Hold Down to Close",
"checkingIn": "Checking In", "checkingIn": "CheckIn",
"electronicKey": "Electronic Key", "electronicKey": "KeyCard",
"password": "Password", "password": "Password",
"card": "Card", "card": "Card",
"fingerprint": "Fingerprint", "fingerprint": "Finger",
"remoteControl": "RemoteControl", "remoteControl": "RemCtrl",
"face": "face", "face": "face",
"operatingRecord": "Operating Record", "operatingRecord": "OpLog",
"doorLockLog": "Door lock log", "doorLockLog": "Door lock log",
"number": "Number", "number": "Number",
"additive": "Additive", "additive": "Additive",
@ -217,7 +217,7 @@
"aboutToExpire": "About to expire", "aboutToExpire": "About to expire",
"deAuthorize": "de-authorize", "deAuthorize": "de-authorize",
"changeName": "Change name", "changeName": "Change name",
"authorizedAdmin": "Authorized Admin", "authorizedAdmin": "Admin",
"addAuthorizedAdmin": "Adding an Authorized Administrator", "addAuthorizedAdmin": "Adding an Authorized Administrator",
"lockGroup": "Lock Group", "lockGroup": "Lock Group",
"transferSmartLock": "Transfer Smart Lock", "transferSmartLock": "Transfer Smart Lock",
@ -407,10 +407,10 @@
"getFingerprint": "Get Fingerprint", "getFingerprint": "Get Fingerprint",
"safeVerify": "Security verification", "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", "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", "monitoring": "Monitoring",
"videoLog": "Video Log", "videoLog": "Video Log",
"messageReminding": "Message Reminding", "messageReminding": "Notice",
"superAdmin": "Super Admin", "superAdmin": "Super Admin",
"normalUser": "Normal User", "normalUser": "Normal User",
"gatewayDevice": "Gateway Device", "gatewayDevice": "Gateway Device",
@ -454,7 +454,7 @@
"videoSlot": "Video slot", "videoSlot": "Video slot",
"密码": "Password", "密码": "Password",
"卡": "Card", "卡": "Card",
"指纹": "Fingerprint", "指纹": "Finger",
"人脸": "Face", "人脸": "Face",
"配件商城": "Lock Mall", "配件商城": "Lock Mall",
"公司名称": "Company Name", "公司名称": "Company Name",
@ -487,7 +487,7 @@
"钥匙将在": "The key will be in", "钥匙将在": "The key will be in",
"天后失效": "Days later invalid", "天后失效": "Days later invalid",
"电量更新时间:": "Power update time:", "电量更新时间:": "Power update time:",
"新增配件": "Add accessories", "新增配件": "Add",
"请在锁旁边完成第一次开锁": "Please complete the first unlock next to the lock", "请在锁旁边完成第一次开锁": "Please complete the first unlock next to the lock",
"正在开锁中...": "Unlocking...", "正在开锁中...": "Unlocking...",
"你的钥匙": "Your key", "你的钥匙": "Your key",
@ -906,5 +906,20 @@
"转移成功": "Transfer success", "转移成功": "Transfer success",
"该已锁被删除": "The locked is deleted", "该已锁被删除": "The locked is deleted",
"授权管理员只能查看和管理自己下发的钥匙、密码等权限": "Authorized administrators can only view and manage the keys, passwords, etc. they issued", "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "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"
} }

View File

@ -938,5 +938,20 @@
"转移成功": "转移成功", "转移成功": "转移成功",
"该已锁被删除": "该已锁被删除", "该已锁被删除": "该已锁被删除",
"授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限", "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限",
"添加授权管理员": "添加授权管理员" "添加授权管理员": "添加授权管理员",
"导出记录":"导出记录",
"选择时间段":"选择时间段",
"导出":"导出",
"批量导出":"批量导出",
"读取记录":"读取记录",
"手机需联网":"手机需联网",
"设备":"设备",
"消息":"消息",
"智能分析":"智能分析",
"精准识别设备事件,过滤无效信息":"精准识别设备事件,过滤无效信息",
"系统设置":"系统设置",
"系统的全局配置在此项内进行设置":"系统的全局配置在此项内进行设置",
"导出操作记录":"导出操作记录",
"立即查看":"立即查看",
"导出成功":"导出成功"
} }

View File

@ -903,5 +903,20 @@
"转移成功": "转移成功", "转移成功": "转移成功",
"该已锁被删除": "该已锁被删除", "该已锁被删除": "该已锁被删除",
"授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限", "授权管理员只能查看和管理自己下发的钥匙、密码等权限": "授权管理员只能查看和管理自己下发的钥匙、密码等权限",
"添加授权管理员": "添加授权管理员" "添加授权管理员": "添加授权管理员",
"导出记录":"导出记录",
"选择时间段":"选择时间段",
"导出":"导出",
"批量导出":"批量导出",
"读取记录":"读取记录",
"手机需联网":"手机需联网",
"设备":"设备",
"消息":"消息",
"智能分析":"智能分析",
"精准识别设备事件,过滤无效信息":"精准识别设备事件,过滤无效信息",
"系统设置":"系统设置",
"系统的全局配置在此项内进行设置":"系统的全局配置在此项内进行设置",
"导出操作记录":"导出操作记录",
"立即查看":"立即查看",
"导出成功":"导出成功"
} }

BIN
ios/.DS_Store vendored

Binary file not shown.

View File

@ -121,6 +121,10 @@
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>NSFileProtectionKey</key>
<string>NSFileProtectionCompleteUntilFirstUserAuthentication</string>
<key>UIFileSharingEnabled</key>
<true/>
<key>io.flutter.embedded_views_preview</key> <key>io.flutter.embedded_views_preview</key>
<true/> <true/>
</dict> </dict>

View File

@ -48,12 +48,19 @@
self.textToShare = paramDic[@"shareText"]; self.textToShare = paramDic[@"shareText"];
self.urlToShare = paramDic[@"urlToShare"]; self.urlToShare = paramDic[@"urlToShare"];
} }
//url if ([self.urlToShare isEqualToString:"fileShare"]) {
NSURL *urlToShare = [NSURL URLWithString:self.urlToShare]; //
// NSURL *urlToShare = [NSURL URLWithString:@"https://pre.lock.star-lock.cn:8093/login"]; 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]; UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];

View File

@ -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_binding.dart';
import 'package:star_lock/login/register/starLock_register_xhj_page.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/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/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/lockUserList/lockUserList_page.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupList_page.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart'; import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart';
@ -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/addIris/addIris_page.dart';
import 'package:star_lock/main/lockDetail/iris/addIrisType/addIrisTypeManage/addIrisTypeManage_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/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/catEyeCustomMode/catEyeCustomMode_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/catEyeSet/catEyeSet/catEyeSet_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'; 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/liveVideo/liveVideo_page.dart';
import 'package:star_lock/main/lockDetail/lockSet/motorPower/motorPower_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/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/addFamily/addFamily_page.dart';
import 'package:star_lock/main/lockDetail/messageWarn/lockUser/lockUser_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'; 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/register/starLock_register_page.dart';
import 'login/selectCountryRegion/selectCountryRegion_page.dart'; import 'login/selectCountryRegion/selectCountryRegion_page.dart';
import 'main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_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/addCardType/addCardType_page.dart';
import 'main/lockDetail/card/addICCard/addICCard_page.dart'; import 'main/lockDetail/card/addICCard/addICCard_page.dart';
import 'main/lockDetail/card/cardDetail/cardDetail_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/checkingInSetAddStaff/checkingInAddStaff_page.dart';
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart'; import 'main/lockDetail/checkingIn/checkingInStaff/checkingInSetStaffList/checkingInStaffList_page.dart';
import 'main/lockDetail/checkingIn/checkingInStaff/checkingInStaffDetail/checkingInStaffDetail_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/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/massSendElectronicKey/massSendElectronicKey/massSendElectronicManageKey/massSendElectronicKeyManage_page.dart';
import 'main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_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/addFace/addFace_page.dart';
import 'main/lockDetail/face/addFaceType/addFaceType_page.dart'; import 'main/lockDetail/face/addFaceType/addFaceType_page.dart';
import 'main/lockDetail/face/faceList/faceList_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/addFingerprintTip/addFingerprintTip_page.dart';
import 'main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart'; import 'main/lockDetail/fingerprint/fingerprintDetail/fingerprintDetail_page.dart';
import 'main/lockDetail/fingerprint/fingerprintList/fingerprintList_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/automaticBlocking/automaticBlocking_page.dart';
import 'main/lockDetail/lockSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart'; import 'main/lockDetail/lockSet/basicInformation/adminOpenLockPassword/adminOpenLockPassword_page.dart';
import 'main/lockDetail/lockSet/basicInformation/basicInformation/basicInformation_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/lockSet/wirelessKeyboard/wirelessKeyboardList/wirelessKeyboard_page.dart';
import 'main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart'; import 'main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart';
import 'main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_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/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart';
import 'main/lockDetail/realTimePicture/realTimePicture_page.dart'; import 'main/lockDetail/realTimePicture/realTimePicture_page.dart';
import 'main/lockDetail/remoteControl/addRemoteControl/addRemoteControl_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/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart';
import 'main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart'; import 'main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart';
import 'main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_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/about/about_page.dart';
import 'mine/addLock/addLock/addLock_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/addLockSelectCountry/addLockSelectCountry_page.dart';
import 'mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart'; import 'mine/addLock/lockAddress/gaode/lockAddressGaoDe_page.dart';
import 'mine/addLock/lockAddress/lockAddress/lockAddress_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/message/messageList/messageList_page.dart';
import 'mine/mine/starLockMine_page.dart'; import 'mine/mine/starLockMine_page.dart';
import 'mine/mineMultiLanguage/mineMultiLanguage_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/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_page.dart';
import 'mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart'; import 'mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccountNext/minePersonInfoEditAccountNext_page.dart';
import 'mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart'; import 'mine/minePersonInfo/minePersonInfoEditIphone/minePersonInfoEditIphone_page.dart';
import 'mine/minePersonInfo/minePersonInfoEditName/minePersonInfoEditName_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/minePersonInfoResetPassword/minePersonInfoResetPassword_page.dart';
import 'mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart'; import 'mine/minePersonInfo/minePersonInfoSetSafetyProblem/minePersonInfoSetSafetyProblem_page.dart';
import 'mine/mineSet/appUnlockNeedMobileNetworkingLock/appUnlockNeedMobileNetworkingLock_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/getDeviceList_page.dart';
import 'mine/mineSet/authorityManagement/getNameList_page.dart'; import 'mine/mineSet/authorityManagement/getNameList_page.dart';
import 'mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator/addAuthorizedAdministratorManage/addAuthorizedAdministratorManage_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/hideInvalidUnlockPermissions/hideInvalidUnlockPermissions_page.dart';
import 'mine/mineSet/lockGroup/groupEditLock/groupEditLock_page.dart'; import 'mine/mineSet/lockGroup/groupEditLock/groupEditLock_page.dart';
import 'mine/mineSet/lockGroup/lockGroupDetailList/lockItemList_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/valueAddedServicesRealName/value_added_services_real_name_page.dart';
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart'; import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart';
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart'; import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart';
import 'mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart';
import 'starLockApplication/starLockApplication.dart'; import 'starLockApplication/starLockApplication.dart';
import 'tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart'; import 'tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart';
@ -486,6 +488,9 @@ abstract class Routers {
'/advancedFunctionRecordPage'; // '/advancedFunctionRecordPage'; //
static const String administratorAssociationLockPage = static const String administratorAssociationLockPage =
'/administratorAssociationLockPage'; //-- '/administratorAssociationLockPage'; //--
static const String batchExportLogPage = '/batchExportLogPage'; //
static const String exportSuccessPage = '/exportSuccessPage'; //
static const String viewExportRecordPage = '/viewExportRecordPage'; //
static const String login = '/login'; // static const String login = '/login'; //
} }
@ -498,7 +503,7 @@ abstract class AppRouters {
), ),
GetPage<dynamic>( GetPage<dynamic>(
name: Routers.login, name: Routers.login,
page: () => F.sw( page: () => F.sw(
skyCall: () => const StarLockLoginPage(), skyCall: () => const StarLockLoginPage(),
xhjCall: () => const StarLockLoginXHJPage()), xhjCall: () => const StarLockLoginXHJPage()),
), ),
@ -1143,8 +1148,16 @@ abstract class AppRouters {
GetPage<dynamic>( GetPage<dynamic>(
name: Routers.administratorAssociationLockPage, name: Routers.administratorAssociationLockPage,
page: () => const AdministratorAssociationLockPage()), page: () => const AdministratorAssociationLockPage()),
GetPage( GetPage<dynamic>(
name: Routers.expireKeyChangeDatePage, name: Routers.expireKeyChangeDatePage,
page: () => const 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()),
]; ];
} }

View File

@ -4,7 +4,7 @@
class IoModelVendor { class IoModelVendor {
static String vendor_XHJ = 'XHJ'; 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 model_XHJ_JL = 'JL-BLE-01';
static String vendor_XL = 'XL'; static String vendor_XL = 'XL';

View File

@ -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';
}
}
}

View 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),
],
);
}
}

View File

@ -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; //
}

View File

@ -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_entity.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_logic.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/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/EasyRefreshTool.dart';
import 'package:star_lock/tools/advancedCalendar/src/widget.dart'; import 'package:star_lock/tools/advancedCalendar/src/widget.dart';
import 'package:star_lock/tools/commonDataManage.dart'; import 'package:star_lock/tools/commonDataManage.dart';
@ -41,7 +42,8 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
backgroundColor: AppColors.mainColor, backgroundColor: AppColors.mainColor,
actionsList: <Widget>[ actionsList: <Widget>[
Visibility( Visibility(
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1, visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 ||
CommonDataManage().currentKeyInfo.keyRight == 1,
child: GestureDetector( child: GestureDetector(
child: Image.asset( child: Image.asset(
'images/icon_tips_Q.png', 'images/icon_tips_Q.png',
@ -53,19 +55,22 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
ShowTipView().showSureAlertDialog( ShowTipView().showSureAlertDialog(
'1.锁没有联网密码、IC卡、指纹等开门记录无法实时上传可以点击右上角按钮然后读取记录。\n2.只能保留一定时间内的记录,如果您需要保留历史记录,可以点击右上角按钮,然后导出记录', '1.锁没有联网密码、IC卡、指纹等开门记录无法实时上传可以点击右上角按钮然后读取记录。\n2.只能保留一定时间内的记录,如果您需要保留历史记录,可以点击右上角按钮,然后导出记录',
tipTitle: '看不到操作记录,可能原因有', tipTitle: '看不到操作记录,可能原因有',
sureStr: '我知道了'); sureStr: '我知道了'.tr);
}, },
)), )),
Visibility( Visibility(
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1, visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 ||
CommonDataManage().currentKeyInfo.keyRight == 1,
child: PopupMenuButton<String>( child: PopupMenuButton<String>(
onSelected: _onMenuItemSelected, onSelected: _onMenuItemSelected,
color: Colors.black, color: Colors.black,
itemBuilder: (BuildContext context) { itemBuilder: (BuildContext context) {
return <PopupMenuEntry<String>>[ return <PopupMenuEntry<String>>[
_buildCustomPopupMenuItem('读取记录'), _buildCustomPopupMenuItem('读取记录'),
const PopupMenuDivider(), if (CommonDataManage().currentKeyInfo.isLockOwner == 1)
_buildCustomPopupMenuItem('清空记录'), const PopupMenuDivider(),
if (CommonDataManage().currentKeyInfo.isLockOwner == 1)
_buildCustomPopupMenuItem('清空记录'),
const PopupMenuDivider(), const PopupMenuDivider(),
_buildCustomPopupMenuItem('导出记录'), _buildCustomPopupMenuItem('导出记录'),
]; ];
@ -131,7 +136,19 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
} }
break; break;
case '导出记录': case '导出记录':
{} {
showDialog(
context: context,
builder: (BuildContext context) {
return ExportRecordDialog(
onExport: (String filePath) {
Get.toNamed(Routers.exportSuccessPage,
arguments: <String, String>{'filePath': filePath});
},
);
},
);
}
break; break;
} }
} }
@ -264,7 +281,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Text( Text(
'$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}" : ""}${timelineData.recordTypeName}', '$formattedTime ${timelineData.username!.isNotEmpty ? "${timelineData.username}操作" : ""}${timelineData.recordTypeName}',
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: TextStyle( style: TextStyle(
color: Colors.black, color: Colors.black,

View File

@ -7,59 +7,63 @@ import 'package:star_lock/tools/menuItem/dropDownItem.dart';
import '../../lockMian/entity/lockListInfo_entity.dart'; import '../../lockMian/entity/lockListInfo_entity.dart';
class DoorLockLogState { class DoorLockLogState {
final lockLogEntity = DoorLockLogEntity().obs; //
final keyInfos = LockListInfoItemEntity().obs;
final lockLogItemList = <DoorLockLogDataItem>[].obs; DoorLockLogState() {
final calendarControllerToday = AdvancedCalendarController.today(); keyInfos.value = Get.arguments['keyInfo'];
final calendarControllerCustom = AdvancedCalendarController.today(); }
final events = <DateTime>[ 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.now(),
DateTime(2024, 10, 10), DateTime(2024, 10, 10),
]; ];
final startDate = final RxInt startDate =
DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day) DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day)
.millisecondsSinceEpoch .millisecondsSinceEpoch
.obs; .obs;
final endDate = (DateTime( final RxInt endDate = DateTime(
DateTime.now().year, DateTime.now().month, DateTime.now().day + 1) DateTime.now().year, DateTime.now().month, DateTime.now().day + 1)
.subtract(const Duration(milliseconds: 1))) .subtract(const Duration(milliseconds: 1))
.millisecondsSinceEpoch .millisecondsSinceEpoch
.obs; .obs;
var dropdownTitle = '全部事件'.tr.obs; RxString dropdownTitle = '全部事件'.tr.obs;
var dropdownValue = XSConstantMacro.lockEventTypeAll.obs; RxInt dropdownValue = XSConstantMacro.lockEventTypeAll.obs;
List<DropDownItem> getDropDownItemList = [ List<DropDownItem> getDropDownItemList = <DropDownItem>[
DropDownItem( DropDownItem(
itemTitle: "全部事件".tr, itemTitle: '全部事件'.tr,
itemValue: XSConstantMacro.lockEventTypeAll.toString(), itemValue: XSConstantMacro.lockEventTypeAll.toString(),
isCheked: false), isCheked: false),
DropDownItem( DropDownItem(
itemTitle: "开锁事件".tr, itemTitle: '开锁事件'.tr,
itemValue: XSConstantMacro.lockEventTypeOpenDoor.toString(), itemValue: XSConstantMacro.lockEventTypeOpenDoor.toString(),
isCheked: false), isCheked: false),
DropDownItem( DropDownItem(
itemTitle: "异常事件".tr, itemTitle: '异常事件'.tr,
itemValue: XSConstantMacro.lockEventTypeAbnormal.toString(), itemValue: XSConstantMacro.lockEventTypeAbnormal.toString(),
isCheked: false), isCheked: false),
DropDownItem( DropDownItem(
itemTitle: "门铃事件".tr, itemTitle: '门铃事件'.tr,
itemValue: XSConstantMacro.lockEventTypeDoorbell.toString(), itemValue: XSConstantMacro.lockEventTypeDoorbell.toString(),
isCheked: false), isCheked: false),
DropDownItem( DropDownItem(
itemTitle: "视频事件".tr, itemTitle: '视频事件'.tr,
itemValue: XSConstantMacro.lockEventTypeVideo.toString(), itemValue: XSConstantMacro.lockEventTypeVideo.toString(),
isCheked: false), isCheked: false),
]; ];
var ifCurrentScreen = true.obs; // , RxBool ifCurrentScreen = true.obs; // ,
var operateDate = 0; // int operateDate = 0; //
var ifHaveNext = false; // bool ifHaveNext = false; //
var logCountPage = 10; // int logCountPage = 10; //
var currentSelectDate = DateTime.now().obs; // Rx<DateTime> currentSelectDate = DateTime.now().obs;
DoorLockLogState() {
keyInfos.value = Get.arguments["keyInfo"];
}
} }

View File

@ -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';
}
}
}

View File

@ -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;
}
}

View File

@ -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();
}

View File

@ -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:
}
}
}

View File

@ -0,0 +1,10 @@
import 'package:get/get.dart';
class ExportSuccessState {
ExportSuccessState() {
final Map map = Get.arguments;
getFilePath.value = map['filePath'];
}
RxString getFilePath = ''.obs;
}

View File

@ -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();
}

View File

@ -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]}'),
),
),
),
),
),
),
),
),
);
}
}

View File

@ -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 = [];
}

View File

@ -778,7 +778,7 @@ class _LockDetailPageState extends State<LockDetailPage>
? AppColors.mainColor ? AppColors.mainColor
: AppColors.btnDisableColor), : 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( FlavorsImg(
child: Image.asset('images/main/icon_lockDetail_needNetwork.png', child: Image.asset('images/main/icon_lockDetail_needNetwork.png',
width: 24.w, width: 24.w,
@ -789,7 +789,7 @@ class _LockDetailPageState extends State<LockDetailPage>
), ),
SizedBox(width: 6.w), SizedBox(width: 6.w),
Text( Text(
'手机需联网', '手机需联网'.tr,
style: TextStyle( style: TextStyle(
fontSize: 20.sp, fontSize: 20.sp,
color: state.isOpenLockNeedOnline.value == 1 color: state.isOpenLockNeedOnline.value == 1

View File

@ -646,7 +646,10 @@ class LockSetLogic extends BaseGetXController {
recordType: recordType, recordType: recordType,
records: records, records: records,
isUnShowLoading: true); isUnShowLoading: true);
if (entity.errorCode!.codeIsSuccessful) {} if (entity.errorCode!.codeIsSuccessful) {
await getLockSettingInfoData();
update();
}
} }
@override @override

View File

@ -28,7 +28,9 @@ class LockSetPage extends StatefulWidget {
class _LockSetPageState extends State<LockSetPage> with RouteAware { class _LockSetPageState extends State<LockSetPage> with RouteAware {
final LockSetLogic logic = Get.put(LockSetLogic()); final LockSetLogic logic = Get.put(LockSetLogic());
final LockSetState state = Get.find<LockSetLogic>().state; final LockSetState state = Get
.find<LockSetLogic>()
.state;
Future<void> getHttpData() async { Future<void> getHttpData() async {
logic.getLockSettingInfoData().then((LockSetInfoEntity value) { logic.getLockSettingInfoData().then((LockSetInfoEntity value) {
@ -49,26 +51,29 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return GetBuilder<LockSetLogic>(builder: (LockSetLogic logic) {
backgroundColor: AppColors.mainBackgroundColor, return Scaffold(
appBar: TitleAppBar( backgroundColor: AppColors.mainBackgroundColor,
barTitle: TranslationLoader.lanKeys!.set!.tr, appBar: TitleAppBar(
haveBack: true, barTitle: TranslationLoader.lanKeys!.set!.tr,
backgroundColor: AppColors.mainColor), haveBack: true,
body: EasyRefreshTool( backgroundColor: AppColors.mainColor),
onRefresh: () { body: EasyRefreshTool(
getHttpData(); onRefresh: () {
}, getHttpData();
child: Column( },
children: <Widget>[ child: Column(
Expanded( children: <Widget>[
child: Obx(() => ListView( Expanded(
children: getListWidget(), child: Obx(() =>
)), ListView(
), children: getListWidget(),
], )),
), ),
)); ],
),
));
});
} }
// //
@ -93,45 +98,53 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.basicInformationPage, Get.toNamed(Routers.basicInformationPage,
arguments: <String, LockSetInfoData>{'lockSetInfoData': state.lockSetInfoData.value}); arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}), }),
SizedBox(height: 10.h), SizedBox(height: 10.h),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockFeature.value.autoLock == 1, Visibility(
child: CommonItem( visible: state.lockFeature.value.autoLock == 1,
leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, child: CommonItem(
rightTitle: (state.lockSettingInfo.value.autoLock ?? 0) > 0 leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr,
? '${state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond ?? 0}s' rightTitle: (state.lockSettingInfo.value.autoLock ?? 0) > 0
: TranslationLoader.lanKeys!.closed!.tr, ? '${state.lockSetInfoData.value.lockSettingInfo!
isHaveLine: true, .autoLockSecond ?? 0}s'
isHaveDirection: true, : TranslationLoader.lanKeys!.closed!.tr,
// isHaveRightWidget: true, isHaveLine: true,
// rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0 isHaveDirection: true,
// ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s" // isHaveRightWidget: true,
// : TranslationLoader.lanKeys!.closed!.tr), // rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0
action: () { // ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s"
Get.toNamed(Routers.automaticBlockingPage, arguments: <String, LockSetInfoData>{ // : TranslationLoader.lanKeys!.closed!.tr),
'lockSetInfoData': state.lockSetInfoData.value, action: () {
// 'lockBasicInfo': state.lockBasicInfo.value Get.toNamed(Routers.automaticBlockingPage,
}); arguments: <String, LockSetInfoData>{
}))), 'lockSetInfoData': state.lockSetInfoData.value,
// 'lockBasicInfo': state.lockBasicInfo.value
});
}))),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockFeature.value.passageMode == 1, Visibility(
child: CommonItem( visible: state.lockFeature.value.passageMode == 1,
leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr, child: CommonItem(
rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) == 1 leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr,
? TranslationLoader.lanKeys!.opened!.tr rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) ==
: TranslationLoader.lanKeys!.closed!.tr, 1
isHaveLine: true, ? TranslationLoader.lanKeys!.opened!.tr
isHaveDirection: true, : TranslationLoader.lanKeys!.closed!.tr,
action: () { isHaveLine: true,
Get.toNamed(Routers.normallyOpenModePage, arguments: <String, Object>{ isHaveDirection: true,
'lockSetInfoData': state.lockSetInfoData.value, action: () {
'lockBasicInfo': state.lockBasicInfo.value Get.toNamed(Routers.normallyOpenModePage,
}); arguments: <String, Object>{
}))), 'lockSetInfoData': state.lockSetInfoData.value,
'lockBasicInfo': state.lockBasicInfo.value
});
}))),
Visibility( Visibility(
visible: true, visible: true,
child: CommonItem( child: CommonItem(
@ -140,7 +153,8 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveLine: true, isHaveLine: true,
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.lockTimePage, arguments: <String, LockSetInfoData>{ Get.toNamed(
Routers.lockTimePage, arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value 'lockSetInfoData': state.lockSetInfoData.value
}); });
})), })),
@ -174,7 +188,9 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.basicInformationPage, Get.toNamed(Routers.basicInformationPage,
arguments: <String, LockSetInfoData>{'lockSetInfoData': state.lockSetInfoData.value}); arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}), }),
SizedBox(height: 10.h), SizedBox(height: 10.h),
//by DaisyWu //by DaisyWu
@ -226,24 +242,27 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
// })), // })),
// SizedBox(height: 10.h), // SizedBox(height: 10.h),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockFeature.value.autoLock == 1, Visibility(
child: CommonItem( visible: state.lockFeature.value.autoLock == 1,
leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr, child: CommonItem(
rightTitle: state.lockSettingInfo.value.autoLock! > 0 leftTitel: TranslationLoader.lanKeys!.automaticBlocking!.tr,
? '${state.lockSetInfoData.value.lockSettingInfo!.autoLockSecond}s' rightTitle: state.lockSettingInfo.value.autoLock! > 0
: TranslationLoader.lanKeys!.closed!.tr, ? '${state.lockSetInfoData.value.lockSettingInfo!
isHaveLine: true, .autoLockSecond}s'
isHaveDirection: true, : TranslationLoader.lanKeys!.closed!.tr,
// isHaveRightWidget: true, isHaveLine: true,
// rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0 isHaveDirection: true,
// ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s" // isHaveRightWidget: true,
// : TranslationLoader.lanKeys!.closed!.tr), // rightWidget: rightText((state.lockSetInfoData.value.lockSetting!.autoLock ?? 0) > 0
action: () { // ? "${state.lockSetInfoData.value.lockSetting!.autoLockSecond ?? 0}s"
Get.toNamed(Routers.automaticBlockingPage, arguments: <String, LockSetInfoData>{ // : TranslationLoader.lanKeys!.closed!.tr),
'lockSetInfoData': state.lockSetInfoData.value action: () {
}); Get.toNamed(Routers.automaticBlockingPage,
}))), arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}))),
// //
Obx(() { Obx(() {
String titleStr = ''; String titleStr = '';
@ -276,73 +295,87 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveLine: true, isHaveLine: true,
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.lockSoundSetPage, arguments: <String, LockSetInfoData>{ Get.toNamed(Routers.lockSoundSetPage,
'lockSetInfoData': state.lockSetInfoData.value arguments: <String, LockSetInfoData>{
}); 'lockSetInfoData': state.lockSetInfoData.value
});
})); }));
}), }),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockFeature.value.antiPrySwitch == 1, Visibility(
child: CommonItem( visible: state.lockFeature.value.antiPrySwitch == 1,
leftTitel: TranslationLoader.lanKeys!.burglarAlarm!.tr, child: CommonItem(
rightTitle: (state.lockSettingInfo.value.antiPrySwitch ?? 0) == 1 leftTitel: TranslationLoader.lanKeys!.burglarAlarm!.tr,
? TranslationLoader.lanKeys!.opened!.tr rightTitle: (state.lockSettingInfo.value.antiPrySwitch ??
: TranslationLoader.lanKeys!.closed!.tr, 0) == 1
isHaveLine: true, ? TranslationLoader.lanKeys!.opened!.tr
isHaveDirection: true, : TranslationLoader.lanKeys!.closed!.tr,
action: () { isHaveLine: true,
Get.toNamed(Routers.burglarAlarmPage, arguments: <String, LockSetInfoData>{ isHaveDirection: true,
'lockSetInfoData': state.lockSetInfoData.value action: () {
}); Get.toNamed(Routers.burglarAlarmPage,
}))), arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}))),
SizedBox(height: 10.h), SizedBox(height: 10.h),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockFeature.value.passageMode == 1, Visibility(
// visible: true, visible: state.lockFeature.value.passageMode == 1,
child: CommonItem( // visible: true,
leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr, child: CommonItem(
rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) == 1 leftTitel: TranslationLoader.lanKeys!.normallyOpenMode!.tr,
? TranslationLoader.lanKeys!.opened!.tr rightTitle: (state.lockSettingInfo.value.passageMode ?? 0) ==
: TranslationLoader.lanKeys!.closed!.tr, 1
isHaveLine: true, ? TranslationLoader.lanKeys!.opened!.tr
isHaveDirection: true, : TranslationLoader.lanKeys!.closed!.tr,
action: () { isHaveLine: true,
Get.toNamed(Routers.normallyOpenModePage, arguments: <String, LockSetInfoData>{ isHaveDirection: true,
'lockSetInfoData': state.lockSetInfoData.value action: () {
}); Get.toNamed(Routers.normallyOpenModePage,
}))), arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}))),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockFeature.value.remoteUnlock == 1, Visibility(
child: CommonItem( visible: state.lockFeature.value.remoteUnlock == 1,
leftTitel: TranslationLoader.lanKeys!.remoteUnlocking!.tr, child: CommonItem(
rightTitle: (state.lockSettingInfo.value.remoteUnlock ?? 0) == 1 leftTitel: TranslationLoader.lanKeys!.remoteUnlocking!.tr,
? TranslationLoader.lanKeys!.opened!.tr rightTitle: (state.lockSettingInfo.value.remoteUnlock ?? 0) ==
: TranslationLoader.lanKeys!.closed!.tr, 1
isHaveLine: true, ? TranslationLoader.lanKeys!.opened!.tr
isHaveDirection: true, : TranslationLoader.lanKeys!.closed!.tr,
action: () { isHaveLine: true,
Get.toNamed(Routers.remoteUnlockingPage, arguments: <String, LockSetInfoData>{ isHaveDirection: true,
'lockSetInfoData': state.lockSetInfoData.value action: () {
}); Get.toNamed(Routers.remoteUnlockingPage,
}))), arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}))),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.resetSwitch == 1, Visibility(
child: CommonItem( visible: state.lockBasicInfo.value.isLockOwner == 1 &&
leftTitel: TranslationLoader.lanKeys!.resetButton!.tr, state.lockFeature.value.resetSwitch == 1,
rightTitle: (state.lockSettingInfo.value.resetSwitch ?? 0) == 1 child: CommonItem(
? TranslationLoader.lanKeys!.opened!.tr leftTitel: TranslationLoader.lanKeys!.resetButton!.tr,
: TranslationLoader.lanKeys!.closed!.tr, rightTitle: (state.lockSettingInfo.value.resetSwitch ?? 0) ==
isHaveLine: true, 1
isHaveDirection: true, ? TranslationLoader.lanKeys!.opened!.tr
action: () { : TranslationLoader.lanKeys!.closed!.tr,
Get.toNamed(Routers.resetButtonPage, arguments: <String, LockSetInfoData>{ isHaveLine: true,
'lockSetInfoData': state.lockSetInfoData.value isHaveDirection: true,
}); action: () {
}))), Get.toNamed(Routers.resetButtonPage,
arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}))),
SizedBox(height: 10.h), SizedBox(height: 10.h),
//--- //---
// Obx(() => // Obx(() =>
@ -355,9 +388,10 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveLine: true, isHaveLine: true,
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.faceUnlockPage, arguments: <String, LockSetInfoData>{ Get.toNamed(Routers.faceUnlockPage,
'lockSetInfoData': state.lockSetInfoData.value arguments: <String, LockSetInfoData>{
}); 'lockSetInfoData': state.lockSetInfoData.value
});
})), })),
// ), // ),
// //
@ -370,21 +404,25 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.msgNotificationPage, Get.toNamed(Routers.msgNotificationPage,
arguments: <String, int?>{'lockId': state.lockSetInfoData.value.lockId}); arguments: <String, int?>{
'lockId': state.lockSetInfoData.value.lockId
});
})), })),
// //
Obx(() => Visibility( Obx(() =>
visible: state.lockFeature.value.isSupportCatEye == 1, Visibility(
child: CommonItem( visible: state.lockFeature.value.isSupportCatEye == 1,
leftTitel: TranslationLoader.lanKeys!.catEyeSet!.tr, child: CommonItem(
rightTitle: '', leftTitel: TranslationLoader.lanKeys!.catEyeSet!.tr,
isHaveLine: true, rightTitle: '',
isHaveDirection: true, isHaveLine: true,
action: () { isHaveDirection: true,
Get.toNamed(Routers.catEyeSetPage, arguments: <String, LockSetInfoData>{ action: () {
'lockSetInfoData': state.lockSetInfoData.value Get.toNamed(Routers.catEyeSetPage,
}); arguments: <String, LockSetInfoData>{
}))), 'lockSetInfoData': state.lockSetInfoData.value
});
}))),
// Obx(() => // Obx(() =>
// //
// Visibility( // Visibility(
@ -420,9 +458,10 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () { action: () {
Get.toNamed(Routers.openDoorDirectionPage, arguments: <String, LockSetInfoData>{ Get.toNamed(Routers.openDoorDirectionPage,
'lockSetInfoData': state.lockSetInfoData.value arguments: <String, LockSetInfoData>{
}); 'lockSetInfoData': state.lockSetInfoData.value
});
})), })),
// //
Visibility( Visibility(
@ -472,58 +511,66 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
// }), // }),
// //
Obx( Obx(
() => Visibility( () =>
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.attendance == 1, Visibility(
child: CommonItem( visible: state.lockBasicInfo.value.isLockOwner == 1 &&
leftTitel: TranslationLoader.lanKeys!.checkingIn!.tr, state.lockFeature.value.attendance == 1,
rightTitle: '', child: CommonItem(
isHaveLine: true, leftTitel: TranslationLoader.lanKeys!.checkingIn!.tr,
isHaveRightWidget: true, rightTitle: '',
rightWidget: _openCheckInSwitch())), isHaveLine: true,
isHaveRightWidget: true,
rightWidget: _openCheckInSwitch())),
), ),
// //
Obx( Obx(
() => Visibility( () =>
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.unlockReminder == 1, Visibility(
child: CommonItem( visible: state.lockBasicInfo.value.isLockOwner == 1 &&
leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr, state.lockFeature.value.unlockReminder == 1,
rightTitle: '', child: CommonItem(
isHaveLine: true, leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr,
isHaveRightWidget: true, rightTitle: '',
rightWidget: _lockRemindSwitch())), isHaveLine: true,
isHaveRightWidget: true,
rightWidget: _lockRemindSwitch())),
), ),
// APP开锁时是否需联网 // APP开锁时是否需联网
Obx( Obx(
() => Visibility( () =>
visible: state.lockBasicInfo.value.isLockOwner == 1 && state.lockFeature.value.appUnlockOnline == 1, Visibility(
child: CommonItem( visible: state.lockBasicInfo.value.isLockOwner == 1 &&
leftTitel: TranslationLoader state.lockFeature.value.appUnlockOnline == 1,
.lanKeys!.whetherInternetRequiredWhenUnlocking!.tr, child: CommonItem(
rightTitle: '', leftTitel: TranslationLoader
isHaveLine: false, .lanKeys!.whetherInternetRequiredWhenUnlocking!.tr,
isHaveRightWidget: true, rightTitle: '',
rightWidget: _openLockNeedOnlineSwitch()), isHaveLine: false,
), isHaveRightWidget: true,
rightWidget: _openLockNeedOnlineSwitch()),
),
), ),
SizedBox(height: 10.h), SizedBox(height: 10.h),
// wifi配网 // wifi配网
Obx( Obx(
() => Visibility( () =>
visible: state.lockFeature.value.wifi == 1, Visibility(
child: CommonItem( visible: state.lockFeature.value.wifi == 1,
leftTitel: child: CommonItem(
leftTitel:
TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr, TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr,
rightTitle: '', rightTitle: '',
isHaveLine: true, isHaveLine: true,
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.wifiListPage, arguments: <String, LockSetInfoData>{ Get.toNamed(Routers.wifiListPage,
'lockSetInfoData': state.lockSetInfoData.value arguments: <String, LockSetInfoData>{
}); 'lockSetInfoData': state.lockSetInfoData.value
// Get.toNamed(Routers.configuringWifiPage, arguments: { });
// 'lockSetInfoData': state.lockSetInfoData.value // Get.toNamed(Routers.configuringWifiPage, arguments: {
// }); // 'lockSetInfoData': state.lockSetInfoData.value
})), // });
})),
), ),
// Obx(() => // Obx(() =>
// //
@ -535,7 +582,8 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
isHaveLine: true, isHaveLine: true,
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Get.toNamed(Routers.lockTimePage, arguments: <String, LockSetInfoData>{ Get.toNamed(
Routers.lockTimePage, arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value 'lockSetInfoData': state.lockSetInfoData.value
}); });
})), })),
@ -628,13 +676,17 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
thumbColor: CupertinoColors.white, thumbColor: CupertinoColors.white,
value: state.isAttendance.value == 1, value: state.isAttendance.value == 1,
onChanged: (bool value) { onChanged: (bool value) {
logic.openCheckingInData((CheckingInInfoDataEntity checkingInInfoDataEntity) { logic.openCheckingInData((
CheckingInInfoDataEntity checkingInInfoDataEntity) {
if (checkingInInfoDataEntity.data!.companyId == 0) { if (checkingInInfoDataEntity.data!.companyId == 0) {
// logic.showCupertinoAlertDialog(context); // logic.showCupertinoAlertDialog(context);
ShowTipView().showIosTipWithContentDialog('创建公司后,考勤功能才能使用'.tr, () { ShowTipView().showIosTipWithContentDialog(
'创建公司后,考勤功能才能使用'.tr, () {
// //
Get.toNamed(Routers.checkInCreatCompanyPage, Get.toNamed(Routers.checkInCreatCompanyPage,
arguments: <String, LockSetInfoData>{'lockSetInfoData': state.lockSetInfoData.value}); arguments: <String, LockSetInfoData>{
'lockSetInfoData': state.lockSetInfoData.value
});
}); });
} else { } else {
logic.setLockSetGeneralSetting(); logic.setLockSetGeneralSetting();

View File

@ -27,7 +27,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
// //
Future<void> getKeyboardPwdRequest() async { Future<void> getKeyboardPwdRequest() async {
int startDate = DateTool().dateToTimestamp(state.beginTime.value, 1); 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!; final int lockId = state.keyInfo.value.lockId!;
String getKeyType = '0'; String getKeyType = '0';
@ -55,6 +55,10 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
showToast('失效时间要大于当前时间'.tr); showToast('失效时间要大于当前时间'.tr);
return; 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 DateTime getStartDateTime;
// //
late StreamSubscription<Reply> _replySubscription; late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() { void _initReplySubscription() {
_replySubscription = _replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async { EventBusManager().eventBus!.on<Reply>().listen((Reply reply) async {
@ -436,7 +441,8 @@ class PasswordKeyPerpetualLogic extends BaseGetXController {
case 3: case 3:
// //
if (state.isPermanent.value == false) { if (state.isPermanent.value == false) {
useDateStr = '类型:自定义-限时\n有效期:${state.customBeginTime.value} -- ${state.customEndTime.value}'; useDateStr =
'类型:自定义-限时\n有效期:${state.customBeginTime.value} -- ${state.customEndTime.value}';
} else { } else {
useDateStr = '类型:自定义-永久'; useDateStr = '类型:自定义-永久';
} }

View File

@ -225,7 +225,7 @@ class _PasswordKeyPerpetualPageState extends State<PasswordKeyPerpetualPage>
return Column( return Column(
children: <Widget>[ children: <Widget>[
Visibility( Visibility(
visible: CommonDataManage().currentKeyInfo.vendor == 'XHJ', visible: CommonDataManage().currentKeyInfo.vendor != 'XHJ',
child: CommonItem( child: CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr, leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr,
rightTitle: state.beginTime.value, rightTitle: state.beginTime.value,

View File

@ -36,7 +36,7 @@ class LockMainLogic extends BaseGetXController {
isUnShowLoading: isUnShowLoading, isUnShowLoading: isUnShowLoading,
); );
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
await loadMainDataLogic(entity.data!); await loadMainDataLogic(entity.data!);
} }
return entity; return entity;
} }
@ -149,7 +149,8 @@ class LockMainLogic extends BaseGetXController {
final LockListInfoEntity entity = await ApiRepository.to.getStarLockInfo( final LockListInfoEntity entity = await ApiRepository.to.getStarLockInfo(
keyId: keyId, keyId: keyId,
); );
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful &&
(entity.data?.groupList ?? <GroupList>[]).isNotEmpty) {
state.lockListInfoGroupEntity.value.groupList ??= <GroupList>[]; state.lockListInfoGroupEntity.value.groupList ??= <GroupList>[];
final GroupList list = entity.data!.groupList!.first; final GroupList list = entity.data!.groupList!.first;
final LockListInfoItemEntity listItem = final LockListInfoItemEntity listItem =

View File

@ -257,4 +257,5 @@ abstract class Api {
final String keyNoticeTemplateURL = '/key/getNoticeTemplate'; // final String keyNoticeTemplateURL = '/key/getNoticeTemplate'; //
final String keyNoticeSubmitURL = '/key/noticeSubmit'; // final String keyNoticeSubmitURL = '/key/noticeSubmit'; //
final String lockUpdateLockInfo = '/lock/updateLockInfo'; // final String lockUpdateLockInfo = '/lock/updateLockInfo'; //
final String exportLockRecordsURL = '/lockRecords/export'; //
} }

View File

@ -397,8 +397,12 @@ class ApiProvider extends BaseProvider {
})); }));
// //
Future<Response> getStarLockListInfo(int pageNo, int pageSize, Future<Response> getStarLockListInfo(
{bool isUnShowLoading = true, int? keyId,}) => int pageNo,
int pageSize, {
bool isUnShowLoading = true,
int? keyId,
}) =>
post( post(
getStarLockInfoURL.toUrl, getStarLockInfoURL.toUrl,
jsonEncode(<String, dynamic>{ jsonEncode(<String, dynamic>{
@ -1460,9 +1464,7 @@ class ApiProvider extends BaseProvider {
// //
Future<Response> getTransferLockListData(String searchStr) => Future<Response> getTransferLockListData(String searchStr) =>
post(transferLockListURL.toUrl, jsonEncode({ post(transferLockListURL.toUrl, jsonEncode({"searchStr": searchStr}));
"searchStr":searchStr
}));
// //
Future<Response> transferLockConfirmInfoData( Future<Response> transferLockConfirmInfoData(
@ -2288,6 +2290,34 @@ class ApiProvider extends BaseProvider {
'fwVersion': fwVersion, '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 { extension ExtensionString on String {

View File

@ -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/login/selectCountryRegion/common/countryRegionEntity.dart';
import 'package:star_lock/main/lockDetail/authorizedAdmin/authorizedAdmin/notice_template_entity.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/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/ElectronicKeyEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_entity.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); final res = await apiProvider.getTransferLockListData(searchStr);
return TransferSmartLockEntity.fromJson(res.body); return TransferSmartLockEntity.fromJson(res.body);
} }
@ -2302,4 +2304,26 @@ class ApiRepository {
await apiProvider.getLockUpdateLockInfo(lockId, fwVersion); await apiProvider.getLockUpdateLockInfo(lockId, fwVersion);
return UpdateLockInfoEntity.fromJson(res.body); 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);
}
} }

View File

@ -21,8 +21,14 @@ class NativeInteractionTool {
/// ///
void loadNativeShare({required String shareText}) { void loadNativeShare({required String shareText}) {
final String urlToShare = '${F.apiPrefix}/apps'; final String urlToShare = '${F.apiPrefix}/apps';
sendChannel.invokeMethod( sendChannel.invokeMethod('loadNativeShare',
'loadNativeShare', <String, String>{'shareText': shareText,'urlToShare':urlToShare}); <String, String>{'shareText': shareText, 'urlToShare': urlToShare});
}
///
void loadNativeFileShare({required String shareText}) {
sendChannel.invokeMethod('loadNativeShare',
<String, String>{'shareText': shareText, 'urlToShare': 'fileShare'});
} }
/// ///

View File

@ -74,15 +74,13 @@ class MessageManagement {
case MessageConstant.lockSetChange: case MessageConstant.lockSetChange:
final int keyId = data['keyId']; final int keyId = data['keyId'];
final int lockId = data['lockId']; final int lockId = data['lockId'];
final Map<String, dynamic> extra = data['updateFieldList']; //
if (extra['appUnlockOnline'] != null) { // final Map<Object?, Object?> extra = data['updateFieldList'];
final String appUnlockOnline = extra['appUnlockOnline']; // if (extra['appUnlockOnline'] != null) {
eventBus.fire( // final String appUnlockOnline = extra['appUnlockOnline']!.toString();
LockSetChangeSetRefreshLockDetailWithType(1, appUnlockOnline)); // }
eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId)); eventBus.fire(RefreshLockInfoDataEvent(keyId: keyId, lockId: lockId));
}
break; break;
default: default:
throw Exception('无法识别eventNo 参数:$eventNo'); throw Exception('无法识别eventNo 参数:$eventNo');
} }

View File

@ -73,8 +73,9 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# 1.0.62+2024061301xhj 线上环境,对外发布,提交测试:处理华为拒审 # 1.0.62+2024061301xhj 线上环境,对外发布,提交测试:处理华为拒审
# 1.0.63+2024061302xhj 线上环境,提交测试:回归 bug # 1.0.63+2024061302xhj 线上环境,提交测试:回归 bug
# 1.0.65+2024061801xhj 线上环境,提交测试:回归 bug # 1.0.65+2024061801xhj 线上环境,提交测试:回归 bug
# 1.0.66+2024061802xhj 线上环境,提交测试:回归 bug
version: 1.0.65+2024061801 version: 1.0.66+2024061802
environment: environment:
sdk: '>=2.12.0 <3.0.0' sdk: '>=2.12.0 <3.0.0'
@ -216,6 +217,7 @@ dependencies:
file_picker: ^5.3.1 file_picker: ^5.3.1
# 错误日志监控 # 错误日志监控
flutter_bugly_plugin: ^0.0.9 flutter_bugly_plugin: ^0.0.9
open_file: ^3.3.2
dependency_overrides: dependency_overrides:
#强制设置google_maps_flutter_ios 为 2.5.2 #强制设置google_maps_flutter_ios 为 2.5.2