# Conflicts:
#	star_lock/lib/main/lockDetail/authorizedAdmin/authorizedAdmin/authorizedAdmin_page.dart
#	star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart
#	star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_page.dart
#	star_lock/lib/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart
#	star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_logic.dart
This commit is contained in:
魏少阳 2024-02-29 17:53:48 +08:00
commit 4a377f380e
50 changed files with 1399 additions and 964 deletions

View File

@ -70,3 +70,21 @@ flutter build apk --split-per-abi --release --flavor sky -t lib/main_sky.dart
```bash
apksigner verify --print-certs -v build/app/outputs/flutter-apk/app-sky-release.apk
```
## 用于Google Play发布的指南
https://www.gstatic.com/play-apps-publisher-rapid/signing-tool/prod/pepk-src.jar
1. 下载 Play Encrypt Private Key (PEPK) 工具,请注意 [pepk-src.jar中没有主清单属性](https://stackoverflow.com/questions/44719351/googles-pepk-src-not-working)
2. 生成密钥
```bash
java -jar android/google/pepk.jar --keystore=android/app/sky.jks --alias=upload --output=android/google/google_pek.zip --include-cert --rsa-aes-encryption --encryption-key-path=android/google/encryption_public_key.pem
```
3. 上传密钥
上传android/google/google_pek.zip文件到谷歌Play管理中心
4. 编译和上传 app bundle
```bash
flutter build appbundle --release --flavor sky -t lib/main_sky.dart
```
然后文件在:`build/app/outputs/bundle/skyRelease/app-sky-release.aab`
- 注意这里的sky.jks和google_pek.zip和encryption_public_key.pem都是sky渠道的和谷歌账号对应。如果需要使用其他谷歌账号需要更换这两个文件。

View File

@ -0,0 +1,11 @@
-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAk4KvDplvoZN04n0son5V
wrG4vN92MkPuXLWCpU97OaUJUKtlROZkhwrMMeFlLLYBJOsymN3J4qISDVQJRxpl
D7vNZfb0NE8WleTRdhOjkWGvtODczOK+ZmYy3xCSnsAAH4+GYdAH+35rVshJ4EcC
6ibeuPTOuboqtS6jXN7Zh+FH/LZ0rMUgSQ7+W6ydlo/05d2j+dAaEEc3YSo63/0W
waBAV35IXWhgxqllgVw3ZEW3wdBGtbF7Xp3NkS0NrJIFNdE6oyBe8Vdtc17+M2mA
bEuWHAbe0bj5kOG+XQYbZXy9TuK+/vS2KKsIEWDx1OewgcHZFP9qXkTfWGV2am8k
MKdT8XunatKIrUabroxjQMk/70F4uQ9/xKxk7vN+ouiJUYUlBw59THCkgi/Iyfdu
Df6+OFJCuuTU4KlhnH3LqT4WF7wDxuP5tryzG1qHYDtBAwrD3P7R3zkhkl4RtqWC
/J5L88XY/XjdN7OdPdMzmMsgDGQQw6dIRQSAEQhUEu2HAgMBAAE=
-----END PUBLIC KEY-----

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,77 @@
{
"errorCode": 0,
"description": "success",
"errorMsg": "success",
"data": {
"list": [{
"recordId": 42672,
"lockId": 1744,
"lockAlias": "T9A_d7d74b2f66b8",
"recordType": 130,
"recordTypeName": "防拆报警",
"username": "",
"operateDate": 1705852800000,
"imagesUrl": null,
"videoUrl": null,
"headUrl": "",
"userid": ""
},
{
"recordId": 42660,
"lockId": 1744,
"lockAlias": "T9A_d7d74b2f66b8",
"recordType": 220,
"recordTypeName": "逗留检测",
"username": "",
"operateDate": 1706494730335,
"imagesUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706494718\/54c5044a-93bd-466d-a123-e1face292841.jpg",
"videoUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706494718\/08a2b732-536b-4f06-9d20-778fdf94f137.mp4",
"headUrl": "",
"userid": ""
},
{
"recordId": 42659,
"lockId": 1744,
"lockAlias": "T9A_d7d74b2f66b8",
"recordType": 220,
"recordTypeName": "逗留检测",
"username": "",
"operateDate": 1706494672036,
"imagesUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706494660\/d85dcea0-c402-4f68-8664-5641a0feabe3.jpg",
"videoUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706494660\/f3de0384-63f8-4177-9611-d8c43707afce.mp4",
"headUrl": "",
"userid": ""
},
{
"recordId": 42658,
"lockId": 1744,
"lockAlias": "T9A_d7d74b2f66b8",
"recordType": 130,
"recordTypeName": "防拆报警",
"username": "",
"operateDate": 1706493793884,
"imagesUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706493778\/f43ec840-ddaa-4d94-b759-7ae4384edd8f.jpg",
"videoUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706493778\/b4a90c5c-d86f-4995-8365-d7e21a67a48d.mp4",
"headUrl": "",
"userid": ""
},
{
"recordId": 42657,
"lockId": 1744,
"lockAlias": "T9A_d7d74b2f66b8",
"recordType": 130,
"recordTypeName": "防拆报警",
"username": "",
"operateDate": 1706493715812,
"imagesUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706493702\/928c2b1d-1cd4-4d7f-9e61-e9315f8c4547.jpg",
"videoUrl": "http:\/\/oss-pre-starlock.star-lock.cn\/starchart\/T9A_d7d74b2f66b8-1706493702\/29e8b8e4-cd79-436d-a384-3e50dacf5cc8.mp4",
"headUrl": "",
"userid": ""
}
],
"pageNo": 1,
"pageSize": 5,
"pages": 4,
"total": 18
}
}

View File

@ -18,8 +18,8 @@
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self initCloudPush];
[CloudPushSDK sendNotificationAck:launchOptions];
// [self initCloudPush];
// [CloudPushSDK sendNotificationAck:launchOptions];
XSFlutterManager *VC = [[XSFlutterManager alloc] init];
self.window.rootViewController = VC;
[self.window makeKeyAndVisible];

View File

@ -1,4 +1,3 @@
import 'package:aliyun_push/aliyun_push.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
@ -8,8 +7,6 @@ import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/tools/app_manager.dart';
import 'package:star_lock/tools/bindings/app_binding.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/xs_aliyunPush.dart';
import 'package:star_lock/translations/app_dept.dart';
import 'package:star_lock/translations/trans_lib.dart';
@ -17,7 +14,6 @@ import 'appRouters.dart';
import 'baseWidget.dart';
import 'tools/appRouteObserver.dart';
import 'dart:io';
import 'package:flutter/services.dart';
class MyApp extends StatefulWidget {
const MyApp({GlobalKey? key}) : super(key: key);
@ -50,7 +46,7 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
localeResolutionCallback: (locale, supportedLocales) {
if (!supportedLocales.contains(locale)) {
int idx = appSupportedLocales.indexWhere(
(element) => element.languageCode == locale!.languageCode);
(element) => element.languageCode == locale!.languageCode);
if (idx != -1) {
locale = appSupportedLocales[idx];
} else {
@ -70,12 +66,12 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
backgroundColor: const Color(0xFFF6F6F6),
primaryColor: const Color(0xFFFFFFFF),
textTheme: TextTheme(
//Material组件上的文字显示,
//Material组件上的文字显示,
bodyText1:
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
//Material组件上的文字显示
bodyText2:
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
button: TextStyle(fontSize: 28.sp)),
iconTheme: IconThemeData(size: 28.sp, color: const Color(0xff2E2B2B)),
appBarTheme: AppBarTheme(
@ -103,29 +99,6 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
WidgetsBinding.instance.addObserver(this);
// openBlueScan();
initAliyunPush();
}
//
void initAliyunPush() {
final aliyunPush = AliyunPush();
XSAliyunPushProvider().init(aliyunPush);
XSAliyunPushProvider().initAliyunPush();
if (Platform.isAndroid) {
XSAliyunPushProvider().initAliyunThirdPush();
}
//使DeviceID推送
aliyunPush.getDeviceId().then((deviceId) async {
// print('得到的DeviceId$deviceId');
final data = await Storage.getString(saveUserLoginData);
if (data!.isNotEmpty && deviceId.isNotEmpty) {
XSAliyunPushProvider()
.pushBindDeviceID(deviceId, Platform.isAndroid ? 10 : 20);
}
});
}
@override
@ -135,7 +108,6 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
}
}
void openBlueScan() {
if (Platform.isIOS) {
print("有蓝牙权限开始扫描");

View File

@ -2,6 +2,7 @@ import 'package:get/get.dart';
import 'package:star_lock/common/safetyVerification/safetyVerification_binding.dart';
import 'package:star_lock/login/register/starLock_register_binding.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_page.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_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';
@ -59,7 +60,6 @@ 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/keyOperationRecord_page.dart';
import 'main/lockDetail/face/addFace/addFace_page.dart';
import 'main/lockDetail/face/addFaceType/addFaceTypeManage/addFaceTypeManage_page.dart';
import 'main/lockDetail/face/faceList/faceList_page.dart';

View File

@ -8,10 +8,8 @@ import 'package:star_lock/blue/io_type.dart';
import 'package:star_lock/translations/trans_lib.dart';
import '../../../../blue/blue_manage.dart';
import '../../../../blue/io_protocol/io_addUser.dart';
import '../../../../blue/io_reply.dart';
import '../../../../blue/io_protocol/io_transferPermissions.dart';
import '../../../../blue/io_tool/io_manager.dart';
import '../../../../blue/io_tool/io_tool.dart';
import '../../../../blue/io_tool/manager_event_bus.dart';
import '../../../../blue/sender_manage.dart';
@ -163,7 +161,8 @@ class AuthorizedAdminLogic extends BaseGetXController {
//
Future<void> transferPermissionsAction() async {
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState state) async {
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState state) async {
if (state == DeviceConnectionState.connected) {
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
@ -228,33 +227,47 @@ class AuthorizedAdminLogic extends BaseGetXController {
//
Future<void> sendElectronicKeyRequest() async {
if(state.emailOrPhoneController.text.isEmpty){
if (state.emailOrPhoneController.text.isEmpty) {
showToast("请输入接收者账号");
return;
}
if(state.keyNameController.text.isEmpty){
if (state.keyNameController.text.isEmpty) {
showToast("请输入接收者姓名");
return;
}
String getFailureDateTime = '0';
String getEffectiveDateTime = '0';
// String getFailureDateTime = '0';
// String getEffectiveDateTime = '0';
String lockID = state.keyInfo.value.lockId.toString();
Get.log("state.type.value:${state.type.value}");
String getKeyType = "1";
if (state.type.value == '0') {
getKeyType = "2";
getFailureDateTime = state.failureDateTime.value.millisecondsSinceEpoch.toString();
getEffectiveDateTime = state.effectiveDateTime.value.millisecondsSinceEpoch.toString();
// getFailureDateTime =
// state.failureDateTime.value.millisecondsSinceEpoch.toString();
// getEffectiveDateTime =
// state.effectiveDateTime.value.millisecondsSinceEpoch.toString();
DateTime startDateTime = DateTime(state.effectiveDateTime.value.year, state.effectiveDateTime.value.month, state.effectiveDateTime.value.day, state.effectiveDateTime.value.hour, state.effectiveDateTime.value.minute);
DateTime endDateTime = DateTime(state.failureDateTime.value.year, state.failureDateTime.value.month, state.failureDateTime.value.day, state.failureDateTime.value.hour, state.failureDateTime.value.minute);
if (!startDateTime.isBefore(endDateTime) || startDateTime.isAtSameMomentAs(endDateTime)) {
DateTime startDateTime = DateTime(
state.effectiveDateTime.value.year,
state.effectiveDateTime.value.month,
state.effectiveDateTime.value.day,
state.effectiveDateTime.value.hour,
state.effectiveDateTime.value.minute);
DateTime endDateTime = DateTime(
state.failureDateTime.value.year,
state.failureDateTime.value.month,
state.failureDateTime.value.day,
state.failureDateTime.value.hour,
state.failureDateTime.value.minute);
if (!startDateTime.isBefore(endDateTime) ||
startDateTime.isAtSameMomentAs(endDateTime)) {
showToast("失效时间需大于生效时间");
return;
}
if (!startDateTime.isBefore(DateTime.now()) || startDateTime.isAtSameMomentAs(DateTime.now())) {
if (!startDateTime.isBefore(DateTime.now()) ||
startDateTime.isAtSameMomentAs(DateTime.now())) {
showToast("生效时间需大于当前时间");
return;
}
@ -264,7 +277,7 @@ class AuthorizedAdminLogic extends BaseGetXController {
createUser: state.isCreateUser.value ? "1" : "0",
countryCode: state.countryCode.value,
usernameType: '1',
endDate: getFailureDateTime,
endDate: state.failureDateTime.value.millisecondsSinceEpoch,
faceAuthentication: state.isAuthentication.value == true ? '1' : '2',
isCameraEnable: '2',
isRemoteUnlock: '2',
@ -275,8 +288,10 @@ class AuthorizedAdminLogic extends BaseGetXController {
operatorUid: '',
receiverUsername: state.emailOrPhoneController.text,
remarks: '',
startDate: getEffectiveDateTime,
weekDays: state.weekdaysList);
startDate: state.effectiveDateTime.value.millisecondsSinceEpoch,
weekDays: state.weekdaysList,
startTime: state.startTime.value,
endTime: state.endTime.value);
if (entity.errorCode!.codeIsSuccessful) {
print('发送电子钥匙成功');
state.isSendSuccess.value = true;

View File

@ -6,6 +6,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateUtils.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/storage.dart';
@ -135,10 +136,11 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
setState(() {
state.selectEffectiveDate.value =
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}';
state.effectiveDateTime.value =
DateTime.parse(state.selectEffectiveDate.value);
state.effectiveDateTime.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectEffectiveDate.value = XSDateUtils.formatDateTime(
state.effectiveDateTime.value, 'yyyy-mm-dd HH:mm');
});
});
}),
@ -150,10 +152,11 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
setState(() {
state.selectFailureDate.value =
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}';
state.failureDateTime.value =
DateTime.parse(state.selectFailureDate.value);
state.failureDateTime.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectFailureDate.value = XSDateUtils.formatDateTime(
state.failureDateTime.value, 'yyyy-mm-dd HH:mm');
});
});
}),
@ -286,13 +289,15 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
height: 10.h,
),
OutLineBtn(
btnName: state.emailOrPhoneController.text.contains("@")?'邮件通知':"短信通知",
btnName:
state.emailOrPhoneController.text.contains("@") ? '邮件通知' : "短信通知",
onClick: () {
if(state.emailOrPhoneController.text.contains("@")){
if (state.emailOrPhoneController.text.contains("@")) {
Get.toNamed(Routers.sendEmailNotificationPage);
}else{
} else {
// _openModalBottomSheet();
NativeInteractionTool.loadNativeShare(shareText:state.pwdShareStr);
NativeInteractionTool.loadNativeShare(
shareText: state.pwdShareStr);
}
// Get.toNamed(state.emailOrPhoneController.text.contains("@")? Routers.sendEmailNotificationPage:Routers.sendEmailNotificationPage);
},
@ -304,7 +309,7 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
btnName: '微信通知',
onClick: () {
// _openModalBottomSheet();
NativeInteractionTool.loadNativeShare(shareText:state.pwdShareStr);
NativeInteractionTool.loadNativeShare(shareText: state.pwdShareStr);
},
),
SizedBox(
@ -345,10 +350,18 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
hintText: tfStr,
hintStyle: TextStyle(fontSize: 22.sp),
focusedBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
disabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
enabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
border: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
focusedBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
disabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
enabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
border: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
contentPadding: const EdgeInsets.symmetric(vertical: 0),
),
// decoration: InputDecoration(
@ -389,7 +402,8 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
}
if (currentContact.fullName!.isNotEmpty) {
state.keyNameController.text = currentContact.fullName!;
state.keyNameController.text =
currentContact.fullName!;
}
});
},
@ -416,10 +430,6 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
);
}
String intToStr(int v) {
return (v < 10) ? "0$v" : "$v";
}
Future _openModalBottomSheet() async {
showModalBottomSheet(
context: context,
@ -443,7 +453,7 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
TextButton(
style: ButtonStyle(
overlayColor:
MaterialStateProperty.all<Color>(Colors.white)),
MaterialStateProperty.all<Color>(Colors.white)),
child: Text(
'取消',
style: TextStyle(
@ -469,13 +479,14 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
return widgetList;
}
GestureDetector buildCenter3(String imageName, String titleStr, int itemIndex) {
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),
EdgeInsets.only(top: 20.w, bottom: 20.w, left: 10.w, right: 10.w),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -504,31 +515,30 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage> {
Get.back();
switch (itemIndex) {
case 0:
//
//
{
NativeInteractionTool.loadNativeShare(shareText:state.pwdShareStr);
NativeInteractionTool.loadNativeShare(shareText: state.pwdShareStr);
}
break;
case 1:
//
//
{
NativeInteractionTool.loadNativeShare(shareText:state.pwdShareStr);
NativeInteractionTool.loadNativeShare(shareText: state.pwdShareStr);
}
break;
case 2:
//
//
{
Navigator.pushNamed(context, Routers.sendEmailNotificationPage);
}
break;
case 3:
//
//
{
NativeInteractionTool.loadNativeShare(shareText:state.pwdShareStr);
NativeInteractionTool.loadNativeShare(shareText: state.pwdShareStr);
}
break;
default:
}
}
}

View File

@ -1,4 +1,3 @@
import 'package:flutter/material.dart';
import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart';
import 'package:get/get.dart';
@ -6,8 +5,10 @@ import 'package:get/get.dart';
import '../../../lockMian/entity/lockListInfo_entity.dart';
class AuthorizedAdminState {
final TextEditingController emailOrPhoneController = TextEditingController(); ///
final TextEditingController keyNameController = TextEditingController(); //
final TextEditingController emailOrPhoneController =
TextEditingController(); ///
final TextEditingController keyNameController =
TextEditingController(); //
final FlutterContactPicker contactPicker = FlutterContactPicker();
late Contact contact;
@ -20,8 +21,15 @@ class AuthorizedAdminState {
final effectiveDateTime = DateTime.now().obs;
final failureDateTime = DateTime.now().obs;
var selectEffectiveDate = '${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'.obs; //
var selectFailureDate = '${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'.obs; //
var selectEffectiveDate =
'${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'
.obs; //
var selectFailureDate =
'${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'
.obs; //
var startTime = 0.obs;
var endTime = 0.obs;
var isSendSuccess = false.obs;
var countryName = '中国'.obs;
@ -38,4 +46,4 @@ class AuthorizedAdminState {
// lockMainEntity.value = map["lockMainEntity"];
keyInfo.value = map["keyInfo"];
}
}
}

View File

@ -0,0 +1,119 @@
class DoorLockLogEntity {
int? errorCode;
String? description;
String? errorMsg;
Data? data;
DoorLockLogEntity(
{this.errorCode, this.description, this.errorMsg, this.data});
DoorLockLogEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
data = json['data'] != null ? Data.fromJson(json['data']) : null;
}
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 {
List<DoorLockLogDataItem>? itemList;
int? pageNo;
int? pageSize;
int? pages;
int? total;
Data({this.itemList, this.pageNo, this.pageSize, this.pages, this.total});
Data.fromJson(Map<String, dynamic> json) {
if (json['list'] != null) {
itemList = <DoorLockLogDataItem>[];
json['list'].forEach((v) {
itemList!.add(DoorLockLogDataItem.fromJson(v));
});
}
pageNo = json['pageNo'];
pageSize = json['pageSize'];
pages = json['pages'];
total = json['total'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
if (itemList != null) {
data['list'] = itemList!.map((v) => v.toJson()).toList();
}
data['pageNo'] = pageNo;
data['pageSize'] = pageSize;
data['pages'] = pages;
data['total'] = total;
return data;
}
}
class DoorLockLogDataItem {
int? recordId;
int? lockId;
String? lockAlias;
int? recordType;
String? recordTypeName;
String? username;
int? operateDate;
String? imagesUrl;
String? videoUrl;
String? headUrl;
String? userid;
DoorLockLogDataItem(
{this.recordId,
this.lockId,
this.lockAlias,
this.recordType,
this.recordTypeName,
this.username,
this.operateDate,
this.imagesUrl,
this.videoUrl,
this.headUrl,
this.userid});
DoorLockLogDataItem.fromJson(Map<String, dynamic> json) {
recordId = json['recordId'];
lockId = json['lockId'];
lockAlias = json['lockAlias'];
recordType = json['recordType'];
recordTypeName = json['recordTypeName'];
username = json['username'];
operateDate = json['operateDate'];
imagesUrl = json['imagesUrl'];
videoUrl = json['videoUrl'];
headUrl = json['headUrl'];
userid = json['userid'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['recordId'] = recordId;
data['lockId'] = lockId;
data['lockAlias'] = lockAlias;
data['recordType'] = recordType;
data['recordTypeName'] = recordTypeName;
data['username'] = username;
data['operateDate'] = operateDate;
data['imagesUrl'] = imagesUrl;
data['videoUrl'] = videoUrl;
data['headUrl'] = headUrl;
data['userid'] = userid;
return data;
}
}

View File

@ -1,8 +1,12 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_state.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/main/lockDetail/lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
@ -15,7 +19,6 @@ import '../../../blue/sender_manage.dart';
import '../../../network/api_repository.dart';
import '../../../tools/baseGetXController.dart';
import '../../../tools/storage.dart';
import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
class DoorLockLogLogic extends BaseGetXController {
DoorLockLogState state = DoorLockLogState();
@ -186,16 +189,17 @@ class DoorLockLogLogic extends BaseGetXController {
//
void mockNetworkDataRequest() async {
KeyOperationRecordEntity entity = await ApiRepository.to.lockEventList(
DoorLockLogEntity entity = await ApiRepository.to.lockEventList(
lockId: state.keyInfos.value.lockId!,
lockEventType: state.dropdownValue.value,
pageNo: 1,
pageSize: 20,
startDate: state.startDate.value,
endDate: state.endDate.value);
if (entity.errorCode!.codeIsSuccessful) {
print("操作记录列表成功:${entity.data?.itemList}");
state.lockOperatingRecordListData.value = entity.data!.itemList!;
if (state.lockLogEntity.value.errorCode!.codeIsSuccessful) {
print("操作记录列表成功:${state.lockLogEntity.value.data?.itemList}");
state.lockLogItemList.value = state.lockLogEntity.value.data!.itemList!;
} else {}
}
@ -259,35 +263,27 @@ class DoorLockLogLogic extends BaseGetXController {
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_initReplySubscription();
// _initReplySubscription();
mockNetworkDataRequest();
_getDoorLockLogListRefreshUIAction();
// mockNetworkDataRequest();
// _getDoorLockLogListRefreshUIAction();
}
}
@override
Future<void> onInit() async {
// TODO: implement onInit
super.onInit();
print("onInit()");
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
// getLockRecordLastUploadDataTime();
getLockRecordLastUploadDataTime();
// senderReferEventRecordTime();
// senderReferEventRecordNumber();
}
DateTime now = DateTime.now();
// startDate为当天的0点
state.startDate.value =
DateTime(now.year, now.month, now.day).millisecondsSinceEpoch;
// endDate为下一天的0点1
state.endDate.value = (DateTime(now.year, now.month, now.day + 1)
.subtract(const Duration(milliseconds: 1)))
.millisecondsSinceEpoch;
testReadJsonData();
mockNetworkDataRequest();
}
}
@override
@ -302,4 +298,15 @@ class DoorLockLogLogic extends BaseGetXController {
_getDoorLockLogListRefreshUIEvent?.cancel();
}
}
//
testReadJsonData() async {
// JSON文件
String jsonString =
await rootBundle.loadString('assets/DoorLockLogEntity.json');
// JSON数据并转换为实体对象
Map<String, dynamic> jsonData = json.decode(jsonString);
state.lockLogEntity.value = DoorLockLogEntity.fromJson(jsonData);
}
}

View File

@ -2,6 +2,7 @@ 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/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_logic.dart';
import 'package:star_lock/tools/advancedCalendar/src/widget.dart';
import 'package:star_lock/tools/menuItem/xsDropDownWidget.dart';
@ -66,15 +67,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> {
endIndent: 30.w,
),
eventDropDownWidget(),
// Expanded(child: timeLineView())
Expanded(
child: ListView.builder(
itemBuilder: (context, index) {
return timeLineView();
},
itemCount: state.lockOperatingRecordListData.value.length,
),
),
Expanded(child: Obx(() => timeLineView(state.lockLogItemList.value)))
],
),
);
@ -123,7 +116,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> {
//
Widget eventDropDownWidget() {
return Container(
margin: EdgeInsets.only(top: 20.h, left: 30.w, bottom: 20.h),
margin: EdgeInsets.only(top: 20.h, left: 30.w, bottom: 10.h, right: 20.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
@ -131,7 +124,6 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> {
items: state.getDropDownItemList,
value: state.dropdownTitle.value,
valueChanged: (value) {
print('dropdownValue选中了$value');
state.dropdownValue.value = int.parse(value);
logic.mockNetworkDataRequest();
})),
@ -141,64 +133,96 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> {
}
//
Widget timeLineView() {
Widget timeLineView(List<DoorLockLogDataItem> timelineDataList) {
return Container(
margin: EdgeInsets.only(left: 20.w, right: 20.w, bottom: 20.h, top: 20.h),
//contain设置一个10像素的圆角
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(16.w)),
color: Colors.white,
borderRadius: BorderRadius.circular(16.w),
),
child: Timeline.tileBuilder(
builder: TimelineTileBuilder.fromStyle(
contentsAlign: ContentsAlign.basic,
contentsBuilder: (context, index) => Padding(
padding: EdgeInsets.only(left: 20.w, top: 20.h),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('09:30 有人出现在门口',
itemCount: timelineDataList.length,
contentsBuilder: (context, index) {
DoorLockLogDataItem timelineData = timelineDataList[index];
DateTime dateTime =
DateTime.fromMillisecondsSinceEpoch(timelineData.operateDate!);
String formattedTime =
'${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}';
return Padding(
padding: EdgeInsets.only(left: 20.w, top: 20.h),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'$formattedTime ${timelineData.recordTypeName}',
textAlign: TextAlign.left,
style: TextStyle(
color: Colors.black,
fontSize: 24.sp,
fontWeight: FontWeight.w600)),
GestureDetector(
onTap: () {
Get.toNamed(Routers.videoLogDetailPage);
},
child: Stack(
children: [
Image(
image: const AssetImage(
'images/main/icon_lockDetail_monitoringvoiceFrist.png'),
width: 260.w,
height: 260.h,
),
//
Positioned(
top: 200.h,
left: 10.w,
child: Image(
image: const AssetImage(
'images/main/icon_lockLog_play.png'),
width: 24.w,
height: 20.w,
),
),
],
color: Colors.black,
fontSize: 24.sp,
fontWeight: FontWeight.w600,
),
),
),
],
),
),
itemCount: 10,
SizedBox(
height: 10.h,
),
GestureDetector(
onTap: () {
Get.toNamed(Routers.videoLogDetailPage);
},
child: Stack(
children: [
timelineData.imagesUrl != null
?
// Image.network(
// timelineData.imagesUrl!,
// width: 260.w,
// height: 260.h,
// )
Image(
image: const AssetImage(
'images/main/icon_lockDetail_monitoringvoiceFrist.png'),
width: 240.w,
height: 180.h,
fit: BoxFit.contain,
)
: Container(),
Positioned(
top: 150.h,
left: 10.w,
child: Image(
image: const AssetImage(
'images/main/icon_lockLog_play.png'),
width: 24.w,
height: 20.w,
),
),
],
),
),
SizedBox(
height: 20.h,
),
],
),
);
},
),
theme: TimelineThemeData(
nodePosition: 0.04, //
connectorTheme: const ConnectorThemeData(
thickness: 1.0, color: AppColors.greyLineColor, indent: 0.5),
thickness: 1.0,
color: AppColors.greyLineColor,
indent: 0.5,
),
indicatorTheme: const IndicatorThemeData(
size: 8.0, color: AppColors.greyLineColor, position: 0.07),
size: 8.0,
color: AppColors.greyLineColor,
position: 0.4,
),
),
),
);

View File

@ -1,14 +1,15 @@
import 'package:get/get.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
import 'package:star_lock/tools/advancedCalendar/src/controller.dart';
import 'package:star_lock/tools/menuItem/dropDownItem.dart';
import '../../lockMian/entity/lockListInfo_entity.dart';
import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
class DoorLockLogState {
final lockLogEntity = DoorLockLogEntity().obs;
final keyInfos = LockListInfoItemEntity().obs;
final lockOperatingRecordListData = <KeyRecordDataItem>[].obs;
final lockLogItemList = <DoorLockLogDataItem>[].obs;
final calendarControllerToday = AdvancedCalendarController.today();
final calendarControllerCustom = AdvancedCalendarController.today();
final events = <DateTime>[
@ -16,8 +17,15 @@ class DoorLockLogState {
DateTime(2024, 10, 10),
];
final startDate = 0.obs;
final endDate = 0.obs;
final 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)))
.millisecondsSinceEpoch
.obs;
var dropdownTitle = '全部事件'.obs;
var dropdownValue = XSConstantMacro.lockEventTypeAll.obs;

View File

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetail/electronicKeyDetail_state.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -23,7 +23,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController {
state.itemData.value.keyName = state.changeNameController.text;
state.keyName.value = state.itemData.value.keyName!;
Get.back();
showToast("修改成功", something: (){
showToast("修改成功", something: () {
eventBus.fire(ElectronicKeyListRefreshUI());
eventBus.fire(AuthorizedAdminPageRefreshUI());
});
@ -36,7 +36,7 @@ class ElectronicKeyDetailLogic extends BaseGetXController {
.deleteElectronicKey(state.itemData.value.keyId.toString());
if (entity.errorCode!.codeIsSuccessful) {
print("删除电子钥匙成功");
showToast("删除成功", something: (){
showToast("删除成功", something: () {
eventBus.fire(ElectronicKeyListRefreshUI());
eventBus.fire(AuthorizedAdminPageRefreshUI());
Get.back();

View File

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_state.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -18,14 +18,14 @@ class ElectronicKeyDetailChangeDateLogic extends BaseGetXController {
keyboardPwdId: state.pwdId.value.toString(),
keyboardPwdName: state.inputNameController.text,
newKeyboardPwd: state.inputPwdController.text,
startDate: state.beginTimeTimestamp.value,
endDate: state.endTimeTimestamp.value,
startDate: state.effectiveDateTime.millisecondsSinceEpoch,
endDate: state.failureDateTime.millisecondsSinceEpoch,
changeType: state.changeType.value,
hoursStart: state.hoursStart.value,
hoursEnd: state.hoursEnd.value,
isCoerced: state.isCoerced.value);
if (entity.errorCode!.codeIsSuccessful) {
showToast("修改成功", something: (){
showToast("修改成功", something: () {
eventBus.fire(ElectronicKeyListRefreshUI());
eventBus.fire(AuthorizedAdminPageRefreshUI());
Get.back();
@ -33,11 +33,13 @@ class ElectronicKeyDetailChangeDateLogic extends BaseGetXController {
}
}
//
//
Future<void> updateKeyDateRequest() async {
var beginTimeTimestamp = state.beginTimeTimestamp.value ~/ 1000;
var endTimeTimestamp = state.endTimeTimestamp.value ~/ 1000;
if (beginTimeTimestamp > endTimeTimestamp || beginTimeTimestamp == endTimeTimestamp) {
var beginTimeTimestamp =
state.effectiveDateTime.millisecondsSinceEpoch ~/ 1000;
var endTimeTimestamp = state.failureDateTime.millisecondsSinceEpoch ~/ 1000;
if (beginTimeTimestamp > endTimeTimestamp ||
beginTimeTimestamp == endTimeTimestamp) {
showToast("失效时间需大于生效时间");
return;
}
@ -49,19 +51,17 @@ class ElectronicKeyDetailChangeDateLogic extends BaseGetXController {
KeyOperationRecordEntity entity = await ApiRepository.to.updateKeyDate(
state.itemData.value.keyId.toString(),
state.itemData.value.lockId.toString(),
state.endTimeTimestamp.value.toString(),
state.endDay.value,
'',
state.beginTimeTimestamp.value.toString(),
state.startDay.value,
state.weekDays.value);
state.failureDateTime.millisecondsSinceEpoch.toString(),
state.effectiveDateTime.millisecondsSinceEpoch.toString(),
state.weekDays.value,
state.itemData.value.keyType! == 1 ? 2 : state.itemData.value.keyType!);
if (entity.errorCode!.codeIsSuccessful) {
showToast("修改成功", something: (){
showToast("修改成功", something: () {
eventBus.fire(ElectronicKeyListRefreshUI());
eventBus.fire(AuthorizedAdminPageRefreshUI());
Get.back(result: {
"beginTimeTimestamp":state.beginTimeTimestamp.value,
"endTimeTimestamp":state.endTimeTimestamp.value,
"beginTimeTimestamp": beginTimeTimestamp,
"endTimeTimestamp": endTimeTimestamp,
});
});
}

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/electronicKeyDetailChangeDate/electronicKeyDetailChangeDate_logic.dart';
import 'package:star_lock/tools/dateUtils.dart';
import 'package:star_lock/tools/pickers/pickers.dart';
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
@ -73,32 +74,34 @@ class _ElectronicKeyDetailChangeDateState
children: [
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr,
rightTitle: state.beginTime.value,
rightTitle: state.selectEffectiveDate.value,
isHaveLine: true,
isHaveDirection: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) {
state.beginTime.value = "${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}";
state.beginTimeTimestamp.value = DateTime.parse(state.beginTime.value).millisecondsSinceEpoch;
print("state.beginTimeTimestamp.value:${state.beginTimeTimestamp.value}");
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
state.effectiveDateTime = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectEffectiveDate.value = XSDateUtils.formatDateTime(
state.effectiveDateTime, 'yyyy-mm-dd HH:mm');
});
})),
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.failureTime!.tr,
rightTitle: state.endTime.value,
rightTitle: state.selectFailureDate.value,
isHaveDirection: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) {
state.endTime.value = "${p.year}-${p.month.toString().padLeft(2, '0')}-${p.day.toString().padLeft(2, '0')} ${p.hour.toString().padLeft(2, '0')}:${p.minute!.toString().padLeft(2, '0')}";
state.endTimeTimestamp.value = DateTime.parse(state.endTime.value).millisecondsSinceEpoch;
print("state.endTimeTimestamp.value:${state.endTimeTimestamp.value}");
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
state.failureDateTime = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectFailureDate.value = XSDateUtils.formatDateTime(
state.failureDateTime, 'yyyy-mm-dd HH:mm');
});
})),
],
);
}
String intToStr(int v) {
return (v < 10) ? "0$v" : "$v";
}
}

View File

@ -16,21 +16,10 @@ class ElectronicKeyDetailChangeDateState {
final pwdId = ''.obs;
final lockId = 0.obs;
final fromType = ''.obs;
// final startDate = 0.obs;
// final endDate = 0.obs;
// final selectEffectiveDate = ''.obs; //
// final selectFailureDate = ''.obs; //
// DateTime effectiveDateTime = DateTime.now();
// DateTime failureDateTime = DateTime.now();
var beginTime = "".obs;//
var endTime = "".obs;//
var beginTimeTimestamp = 0.obs;//
var endTimeTimestamp = 0.obs;//
final endDay = ''.obs;
final startDay = ''.obs;
final selectEffectiveDate = ''.obs; //
final selectFailureDate = ''.obs; //
DateTime effectiveDateTime = DateTime.now();
DateTime failureDateTime = DateTime.now();
final weekDays = [].obs;
ElectronicKeyDetailChangeDateState() {
@ -38,10 +27,10 @@ class ElectronicKeyDetailChangeDateState {
// itemData.value = map["itemData"];
if ((map["itemData"] != null)) {
itemData.value = map["itemData"];
beginTime.value = DateTool().dateToYMDHNString(itemData.value.startDate.toString());
endTime.value = DateTool().dateToYMDHNString(itemData.value.endDate.toString());
beginTimeTimestamp.value = itemData.value.startDate!;
endTimeTimestamp.value = itemData.value.endDate!;
// beginTime.value = DateTool().dateToYMDHNString(itemData.value.startDate.toString());
// endTime.value = DateTool().dateToYMDHNString(itemData.value.endDate.toString());
// beginTimeTimestamp.value = itemData.value.startDate!;
// endTimeTimestamp.value = itemData.value.endDate!;
}
if ((map["pwdId"] != null)) {
pwdId.value = map["pwdId"];

View File

@ -0,0 +1,31 @@
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_state.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
class KeyOperationRecordLogic extends BaseGetXController {
final KeyOperationRecordState state = KeyOperationRecordState();
//
Future<void> mockNetworkDataRequest() async {
KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordList(
'0',
state.keyId.value,
'0',
state.lockId.value,
'1',
'1',
'20',
'0',
'',
'',
'',
state.keyboardPwdId.value,
state.cardId.value,
state.fingerprintId.value);
if (entity.errorCode!.codeIsSuccessful) {
print("操作记录列表成功:${entity.data?.itemList}");
state.dataList.value = entity.data!.itemList!;
}
}
}

View File

@ -0,0 +1,88 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_logic.dart';
import 'package:star_lock/tools/noData.dart';
import 'package:star_lock/tools/titleAppBar.dart';
import 'package:star_lock/translations/trans_lib.dart';
class KeyOperationRecordPage extends StatefulWidget {
const KeyOperationRecordPage({Key? key}) : super(key: key);
@override
State<KeyOperationRecordPage> createState() => _KeyOperationRecordPageState();
}
class _KeyOperationRecordPageState extends State<KeyOperationRecordPage> {
final logic = Get.put(KeyOperationRecordLogic());
final state = Get.find<KeyOperationRecordLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: TranslationLoader.lanKeys!.operatingRecord!.tr,
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: Obx(() => state.dataList.value.isEmpty
? NoData()
: _buildMainUI(state.dataList.value)),
);
}
Widget _buildMainUI(List<KeyRecordDataItem> itemDataList) {
return ListView.separated(
itemCount: itemDataList.length,
itemBuilder: (c, index) {
KeyRecordDataItem dataItem = itemDataList[index];
int? operateDate = dataItem.operateDate;
DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(operateDate!);
String operateDateStr =
'${dateStr.toLocal().toString().substring(0, 16)} 开锁';
return _electronicKeyItem(operateDateStr, () {});
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
);
}
Widget _electronicKeyItem(String operateDate, Function() action) {
return GestureDetector(
onTap: action,
child: Container(
color: Colors.white,
height: 68.h,
child: Row(
children: [
SizedBox(
width: 30.w,
),
Image.asset(
'images/icon_recordDate.png',
width: 24.w,
height: 24.w,
color: AppColors.darkGrayTextColor,
),
SizedBox(
width: 20.w,
),
Text(
operateDate,
style: TextStyle(color: AppColors.blackColor, fontSize: 20.sp),
),
SizedBox(width: 20.h),
],
),
),
);
}
}

View File

@ -0,0 +1,31 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
class KeyOperationRecordState {
var dataList = <KeyRecordDataItem>[].obs;
final keyId = ''.obs;
final lockId = ''.obs;
final keyboardPwdId = ''.obs; //ID
final cardId = ''.obs; //ID
final fingerprintId = ''.obs; //ID
KeyOperationRecordState() {
Map map = Get.arguments;
if ((map["keyId"] != null)) {
keyId.value = map["keyId"];
}
if ((map["lockId"] != null)) {
lockId.value = map["lockId"];
}
if ((map["keyboardPwdId"] != null)) {
keyboardPwdId.value = map["keyboardPwdId"];
}
if ((map["cardId"] != null)) {
cardId.value = map["cardId"];
}
if ((map["fingerprintId"] != null)) {
fingerprintId.value = map["fingerprintId"];
}
}
}

View File

@ -1,159 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart';
class KeyOperationRecordPage extends StatefulWidget {
const KeyOperationRecordPage({Key? key}) : super(key: key);
@override
State<KeyOperationRecordPage> createState() => _KeyOperationRecordPageState();
}
class _KeyOperationRecordPageState extends State<KeyOperationRecordPage> {
String _keyId = '';
String _lockId = '';
String _keyboardPwdId = ''; //ID
String _cardId = ''; //ID
String _fingerprintId = ''; //ID
@override
Widget build(BuildContext context) {
dynamic obj = ModalRoute.of(context)?.settings.arguments;
if (obj != null && (obj["keyId"] != null)) {
_keyId = obj["keyId"];
}
if (obj != null && (obj["lockId"] != null)) {
_lockId = obj["lockId"];
}
if (obj != null && (obj["keyboardPwdId"] != null)) {
_keyboardPwdId = obj["keyboardPwdId"];
}
if (obj != null && (obj["cardId"] != null)) {
_cardId = obj["cardId"];
}
if (obj != null && (obj["fingerprintId"] != null)) {
_fingerprintId = obj["fingerprintId"];
}
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: TranslationLoader.lanKeys!.operatingRecord!.tr,
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: FutureBuilder<List<KeyRecordDataItem>>(
future: mockNetworkDataRequest(),
builder: (BuildContext context,
AsyncSnapshot<List<KeyRecordDataItem>> snapshot) {
//
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
//
return const Text('请求失败');
} else {
//
final List<KeyRecordDataItem> itemDataList = snapshot.data!;
return Column(
children: [
Expanded(child: _buildMainUI(itemDataList)),
],
);
}
} else {
// loading
return Container();
}
}),
);
}
//
Future<List<KeyRecordDataItem>> mockNetworkDataRequest() async {
KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordList(
'0',
_keyId,
'0',
_lockId,
'1',
'1',
'20',
'0',
'',
'',
'',
_keyboardPwdId,
_cardId,
_fingerprintId);
if (entity.errorCode!.codeIsSuccessful) {
print("操作记录列表成功:${entity.data?.itemList}");
}
final data = entity.data;
if (data != null) {
return data.itemList!;
} else {
List<KeyRecordDataItem> dataList = [];
return dataList;
}
}
Widget _buildMainUI(List<KeyRecordDataItem> itemDataList) {
return ListView.separated(
itemCount: itemDataList.length,
itemBuilder: (c, index) {
KeyRecordDataItem dataItem = itemDataList[index];
int? operateDate = dataItem.operateDate;
DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(operateDate!);
String operateDateStr =
'${dateStr.toLocal().toString().substring(0, 16)} 开锁';
return _electronicKeyItem(operateDateStr, () {});
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
);
}
Widget _electronicKeyItem(String operateDate, Function() action) {
return GestureDetector(
onTap: action,
child: Container(
color: Colors.white,
height: 68.h,
child: Row(
children: [
SizedBox(
width: 30.w,
),
Image.asset(
'images/icon_recordDate.png',
width: 24.w,
height: 24.w,
color: AppColors.darkGrayTextColor,
),
SizedBox(
width: 20.w,
),
Text(
operateDate,
style: TextStyle(color: AppColors.blackColor, fontSize: 20.sp),
),
SizedBox(width: 20.h),
],
),
),
);
}
}

View File

@ -40,7 +40,7 @@ class _ElectronicKeyListPageState extends State<ElectronicKeyListPage> {
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
logic.mockNetworkDataRequest().then((ElectronicKeyListEntity value){
logic.mockNetworkDataRequest().then((ElectronicKeyListEntity value) {
setState(() {});
});
}
@ -73,11 +73,11 @@ class _ElectronicKeyListPageState extends State<ElectronicKeyListPage> {
],
),
body: EasyRefreshTool(
onRefresh: (){
onRefresh: () {
logic.pageNo = 1;
mockRequest();
},
onLoad: (){
onLoad: () {
mockRequest();
},
child: Column(
@ -92,8 +92,7 @@ class _ElectronicKeyListPageState extends State<ElectronicKeyListPage> {
SizedBox(
height: 20.h,
),
Expanded(
child: _buildMainUI()),
Expanded(child: _buildMainUI()),
SizedBox(
height: 20.h,
),
@ -123,65 +122,78 @@ class _ElectronicKeyListPageState extends State<ElectronicKeyListPage> {
Widget _buildMainUI() {
return Obx(() => state.itemDataList.value.isEmpty
? NoData(noDataHeight: 1.sh - ScreenUtil().statusBarHeight - ScreenUtil().bottomBarHeight - 190.h - 64.h)
? NoData(
noDataHeight: 1.sh -
ScreenUtil().statusBarHeight -
ScreenUtil().bottomBarHeight -
190.h -
64.h)
: SlidableAutoCloseBehavior(
child: ListView.separated(
shrinkWrap: true,
itemCount: state.itemDataList.value.length,
itemBuilder: (c, index) {
ElectronicKeyListItem indexEntity = state.itemDataList.value[index];
String useDateStr = ''; //使
String keyStatus = ''; //
child: ListView.separated(
shrinkWrap: true,
itemCount: state.itemDataList.value.length,
itemBuilder: (c, index) {
ElectronicKeyListItem indexEntity =
state.itemDataList.value[index];
String useDateStr = ''; //使
String keyStatus = ''; //
//使
useDateStr = getUseDateStr(indexEntity);
//使
useDateStr = getUseDateStr(indexEntity);
//
keyStatus = getKeyStatus(indexEntity.keyStatus);
//
keyStatus = getKeyStatus(indexEntity.keyStatus);
//
bool isAdminKey = false;
if (indexEntity.keyRight == 1) {
isAdminKey = true;
} else {
isAdminKey = false;
}
//
bool isAdminKey = false;
if (indexEntity.keyRight == 1) {
isAdminKey = true;
} else {
isAdminKey = false;
}
return Slidable(
key:ValueKey(indexEntity.keyId),
endActionPane: ActionPane(
extentRatio: 0.2,
motion: const ScrollMotion(),
children: [
SlidableAction(
onPressed: (BuildContext context){
showIosTipViewDialog(context, indexEntity.keyId!.toString());
},
backgroundColor: Colors.red,
foregroundColor: Colors.white,
label: '删除',
),
],
return Slidable(
key: ValueKey(indexEntity.keyId),
endActionPane: ActionPane(
extentRatio: 0.2,
motion: const ScrollMotion(),
children: [
SlidableAction(
onPressed: (BuildContext context) {
showIosTipViewDialog(
context, indexEntity.keyId!.toString());
},
backgroundColor: Colors.red,
foregroundColor: Colors.white,
label: '删除',
),
],
),
child: _electronicKeyItem(
'images/controls_user.png',
indexEntity.keyName!,
useDateStr,
keyStatus,
isAdminKey, () {
Navigator.pushNamed(
context, Routers.electronicKeyDetailPage,
arguments: {"itemData": indexEntity}).then((val) {
if (val != null) {
logic.mockNetworkDataRequest();
setState(() {});
}
});
}),
);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
),
child: _electronicKeyItem('images/controls_user.png', indexEntity.keyName!, useDateStr, keyStatus, isAdminKey, () {
Navigator.pushNamed(context, Routers.electronicKeyDetailPage,
arguments: {"itemData": indexEntity}).then((val) {
if (val != null) {
logic.mockNetworkDataRequest();
setState(() {});
}
});
}),
);
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
),
));
));
}
Widget _buildDeleteBtn(String keyId) {
@ -291,7 +303,11 @@ class _ElectronicKeyListPageState extends State<ElectronicKeyListPage> {
child: Row(
children: [
SizedBox(width: 30.w),
Image.asset(avatarURL, width: 60.w, height: 60.w,),
Image.asset(
avatarURL,
width: 60.w,
height: 60.w,
),
SizedBox(width: 20.w),
Expanded(
child: Column(
@ -305,16 +321,20 @@ class _ElectronicKeyListPageState extends State<ElectronicKeyListPage> {
child: Row(
children: [
Flexible(
child: Text(
receiveUser,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor)
),
child: Text(receiveUser,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 24.sp,
color: AppColors.blackColor)),
),
SizedBox(width: 10.w),
isAdminKey
? Image.asset('images/icon_electronicKey_admin.png', width: 24.w, height: 20.w,)
? Image.asset(
'images/icon_electronicKey_admin.png',
width: 24.w,
height: 20.w,
)
: Container(),
],
),

View File

@ -1,9 +1,9 @@
import 'package:date_format/date_format.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyPeriodValidity/KeyPeriodValidityModel.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyPeriodValidity/electronicKeyPeriodValidity_logic.dart';
import 'package:star_lock/tools/dateUtils.dart';
import 'package:star_lock/tools/pickers/pickers.dart';
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
@ -52,15 +52,15 @@ class _ElectronicKeyPeriodValidityPageState
backgroundColor: AppColors.mainColor),
body: ListView(
children: [
topWidget(),
Container(
color: Colors.white,
effectiveDateWidget(),
SizedBox(
height: 10.h,
),
const Divider(
height: 1,
color: AppColors.greyLineColor,
topWidget(),
SizedBox(
height: 10.h,
),
effectiveTimeWidget(),
bottomWidget()
],
));
@ -68,7 +68,7 @@ class _ElectronicKeyPeriodValidityPageState
Widget topWidget() {
return Container(
height: 150.h,
height: 160.h,
width: 1.sw,
color: Colors.white,
child: Column(
@ -92,7 +92,11 @@ class _ElectronicKeyPeriodValidityPageState
KeyPeriodValidityModel model =
state.validityDataList.value[index];
return btnItem(model);
}))
})),
Container(
color: Colors.white,
height: 10.h,
),
],
),
);
@ -107,6 +111,7 @@ class _ElectronicKeyPeriodValidityPageState
} else {
state.selectIndexList.value.remove(model.validityValue);
}
setState(() {});
},
child: Container(
@ -135,7 +140,8 @@ class _ElectronicKeyPeriodValidityPageState
));
}
Widget bottomWidget() {
//
Widget effectiveDateWidget() {
return Column(
children: [
Obx(() => CommonItem(
@ -144,14 +150,13 @@ class _ElectronicKeyPeriodValidityPageState
isHaveDirection: true,
isHaveLine: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
Pickers.showDatePicker(context, mode: DateMode.YMD,
onConfirm: (p) {
state.isHaveEffectiveDate.value = true;
state.effectiveDateTime.value = DateTime.parse(
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}');
state.selectEffectiveDate.value = formatDate(
state.effectiveDateTime.value,
[yyyy, '-', mm, '-', dd, ' ', HH, ':', nn]);
state.effectiveDate.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day!}', 'yyyy-mm-dd');
state.selectEffectiveDate.value = XSDateUtils.formatDateTime(
state.effectiveDate.value, 'yyyy-mm-dd');
});
})),
Obx(() => CommonItem(
@ -159,16 +164,59 @@ class _ElectronicKeyPeriodValidityPageState
rightTitle: state.selectFailureDate.value,
isHaveDirection: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
Pickers.showDatePicker(context, mode: DateMode.YMD,
onConfirm: (p) {
state.isHaveFailureDate.value = true;
state.failureDateTime.value = DateTime.parse(
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}');
state.selectFailureDate.value = formatDate(
state.failureDateTime.value,
[yyyy, '-', mm, '-', dd, ' ', HH, ':', nn]);
state.failureDate.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day!}', 'yyyy-mm-dd');
state.selectFailureDate.value = XSDateUtils.formatDateTime(
state.failureDate.value, 'yyyy-mm-dd');
});
})),
],
);
}
//
Widget effectiveTimeWidget() {
return Column(
children: [
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr,
rightTitle: state.selectEffectiveTime.value,
isHaveDirection: true,
isHaveLine: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.HM,
onConfirm: (p) {
state.isHaveEffectiveTime.value = true;
state.effectiveTime.value = XSDateUtils.parseDateTime(
'${p.hour!}:${p.minute!}', 'HH:mm');
state.selectEffectiveTime.value = XSDateUtils.formatDateTime(
state.effectiveTime.value, 'HH:mm');
});
})),
Obx(() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.failureTime!.tr,
rightTitle: state.selectFailureTime.value,
isHaveDirection: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.HM,
onConfirm: (p) {
state.isHaveFailureTime.value = true;
state.failureTime.value = XSDateUtils.parseDateTime(
'${p.hour!}:${p.minute!}', 'HH:mm');
state.selectFailureTime.value = XSDateUtils.formatDateTime(
state.failureTime.value, 'HH:mm');
});
})),
],
);
}
Widget bottomWidget() {
return Column(
children: [
Container(height: 40.h),
Obx(() => SubmitBtn(
btnName: TranslationLoader.lanKeys!.sure!.tr,
@ -177,7 +225,9 @@ class _ElectronicKeyPeriodValidityPageState
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
isDisabled: (state.selectIndexList.value.isNotEmpty &&
state.isHaveEffectiveDate.value == true &&
state.isHaveFailureDate.value == true)
state.isHaveFailureDate.value == true &&
state.isHaveEffectiveTime.value == true &&
state.isHaveFailureTime.value == true)
? true
: false,
onClick: () {
@ -185,17 +235,17 @@ class _ElectronicKeyPeriodValidityPageState
state.isHaveEffectiveDate.value == true &&
state.isHaveFailureDate.value == true)) {
DateTime startDateTime = DateTime(
state.effectiveDateTime.value.year,
state.effectiveDateTime.value.month,
state.effectiveDateTime.value.day,
state.effectiveDateTime.value.hour,
state.effectiveDateTime.value.minute);
state.effectiveDate.value.year,
state.effectiveDate.value.month,
state.effectiveDate.value.day,
state.effectiveDate.value.hour,
state.effectiveDate.value.minute);
DateTime endDateTime = DateTime(
state.failureDateTime.value.year,
state.failureDateTime.value.month,
state.failureDateTime.value.day,
state.failureDateTime.value.hour,
state.failureDateTime.value.minute);
state.failureDate.value.year,
state.failureDate.value.month,
state.failureDate.value.day,
state.failureDate.value.hour,
state.failureDate.value.minute);
//
if (!startDateTime.isBefore(endDateTime) ||
startDateTime.isAtSameMomentAs(endDateTime)) {
@ -203,8 +253,10 @@ class _ElectronicKeyPeriodValidityPageState
} else {
Map<String, dynamic> resultMap = {};
resultMap['validityValue'] = state.selectIndexList.value;
resultMap['starDate'] = state.effectiveDateTime.value;
resultMap['endDate'] = state.failureDateTime.value;
resultMap['starDate'] = state.effectiveDate.value;
resultMap['endDate'] = state.failureDate.value;
resultMap['starTime'] = state.effectiveTime.value;
resultMap['endTime'] = state.failureTime.value;
Navigator.pop(context, resultMap);
}
}
@ -212,8 +264,4 @@ class _ElectronicKeyPeriodValidityPageState
],
);
}
String intToStr(int v) {
return (v < 10) ? "0$v" : "$v";
}
}

View File

@ -1,3 +1,4 @@
import 'package:date_format/date_format.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
@ -24,11 +25,24 @@ class ElectronicKeyPeriodValidityState {
].obs;
final validityDataList = [].obs; //
final selectIndexList = [].obs; //
final selectEffectiveDate = ''.obs; //
final selectFailureDate = ''.obs; //
DateTime dateTime = DateTime.now();
final effectiveDateTime = DateTime.now().obs;
final failureDateTime = DateTime.now().obs;
final effectiveDate = DateTime.now().obs;
final failureDate = DateTime.now().obs;
final selectEffectiveDate = ''.obs; //
final selectFailureDate = ''.obs; //
final selectEffectiveTime = ''.obs; //
final selectFailureTime = ''.obs; //
final effectiveTime = DateTime.now().obs;
final failureTime = DateTime.now().obs;
var isHaveEffectiveDate = false.obs;
var isHaveFailureDate = false.obs;
var isHaveEffectiveTime = false.obs;
var isHaveFailureTime = false.obs;
String intToStr(int v) {
return (v < 10) ? "0$v" : "$v";
}
}

View File

@ -14,26 +14,41 @@ class SendElectronicKeyLogic extends BaseGetXController {
//
Future<void> sendElectronicKeyRequest() async {
if(state.emailOrPhoneController.text.isEmpty){
if (state.emailOrPhoneController.text.isEmpty) {
showToast("请输入接收者账号");
return;
}
if(state.keyNameController.text.isEmpty){
showToast("请输入接收者姓名");
return;
}
//
// if(state.keyNameController.text.isEmpty){
// showToast("请输入接收者姓名");
// return;
// }
DateTime startDateTime = DateTime(
state.effectiveDateTime.value.year,
state.effectiveDateTime.value.month,
state.effectiveDateTime.value.day,
state.effectiveDateTime.value.hour,
state.effectiveDateTime.value.minute);
DateTime endDateTime = DateTime(
state.failureDateTime.value.year,
state.failureDateTime.value.month,
state.failureDateTime.value.day,
state.failureDateTime.value.hour,
state.failureDateTime.value.minute);
DateTime startDateTime = DateTime(state.effectiveDateTime.value.year, state.effectiveDateTime.value.month, state.effectiveDateTime.value.day, state.effectiveDateTime.value.hour, state.effectiveDateTime.value.minute);
DateTime endDateTime = DateTime(state.failureDateTime.value.year, state.failureDateTime.value.month, state.failureDateTime.value.day, state.failureDateTime.value.hour, state.failureDateTime.value.minute);
//
if (state.type.value == "0" || state.type.value == "3") {
print("startDateTime:$startDateTime endDateTime:$endDateTime DateTime.now():${DateTime.now()} startDateTime.isBefore(endDateTime):${startDateTime.isBefore(endDateTime)}");
if (!startDateTime.isBefore(endDateTime) || startDateTime.isAtSameMomentAs(endDateTime)) {
print(
"startDateTime:$startDateTime endDateTime:$endDateTime DateTime.now():${DateTime.now()} startDateTime.isBefore(endDateTime):${startDateTime.isBefore(endDateTime)}");
if (!startDateTime.isBefore(endDateTime) ||
startDateTime.isAtSameMomentAs(endDateTime)) {
showToast("失效时间需大于生效时间");
return;
}
if (!startDateTime.isBefore(DateTime.now()) || startDateTime.isAtSameMomentAs(DateTime.now())) {
if (!startDateTime.isBefore(DateTime.now()) ||
startDateTime.isAtSameMomentAs(DateTime.now())) {
showToast("生效时间需大于当前时间");
return;
}
@ -45,8 +60,10 @@ class SendElectronicKeyLogic extends BaseGetXController {
case 0:
{
typeValue = XSConstantMacro.keyTypeTime;
state.failureTimestamp.value = state.failureDateTime.value.millisecondsSinceEpoch;
state.effectiveTimestamp.value = state.effectiveDateTime.value.millisecondsSinceEpoch;
state.failureTimestamp.value =
state.failureDateTime.value.millisecondsSinceEpoch;
state.effectiveTimestamp.value =
state.effectiveDateTime.value.millisecondsSinceEpoch;
}
break;
case 1:
@ -70,7 +87,7 @@ class SendElectronicKeyLogic extends BaseGetXController {
usernameType: isPhoneNumber(state.emailOrPhoneController.text) == true
? '1'
: '2',
endDate: state.failureTimestamp.value.toString(),
endDate: state.failureTimestamp.value,
faceAuthentication: state.isAuthentication.value == true ? '1' : '2',
isCameraEnable: '2',
isRemoteUnlock: state.isRemoteUnlock.value == true ? '1' : '2',
@ -81,8 +98,10 @@ class SendElectronicKeyLogic extends BaseGetXController {
operatorUid: '',
receiverUsername: state.emailOrPhoneController.text,
remarks: '',
startDate: state.effectiveTimestamp.value.toString(),
weekDays: state.weekdaysList.value);
startDate: state.effectiveTimestamp.value,
weekDays: state.weekdaysList.value,
startTime: state.startTime.value,
endTime: state.endTime.value);
if (entity.errorCode!.codeIsSuccessful) {
print('发送电子钥匙成功');
state.isSendSuccess.value = true;
@ -190,10 +209,14 @@ class SendElectronicKeyLogic extends BaseGetXController {
);
}
void resetData(){
void resetData() {
state.emailOrPhoneController.text = "";
state.keyNameController.text = "";
state.selectEffectiveDate = '${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'.obs; //
state.selectFailureDate = '${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'.obs; //
state.selectEffectiveDate =
'${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'
.obs; //
state.selectFailureDate =
'${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'
.obs; //
}
}

View File

@ -8,6 +8,7 @@ import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart
import 'package:star_lock/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_logic.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/dateUtils.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/storage.dart';
@ -53,7 +54,8 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
}
Widget indexChangeWidget() {
if (state.isSendSuccess.value == true && state.sendSucceedType.value.toString() == widget.type) {
if (state.isSendSuccess.value == true &&
state.sendSucceedType.value.toString() == widget.type) {
return sendElectronicKeySucceed();
} else {
switch (int.parse(widget.type)) {
@ -66,7 +68,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
keyTimeWidget(),
remoteUnlockingWidget(),
keyRealNameWidget(),
keyBottomWidget()
keyBottomWidget(state.timeLimitTips)
],
);
}
@ -78,7 +80,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
keyInfoWidget(),
remoteUnlockingWidget(),
keyRealNameWidget(),
keyBottomWidget()
keyBottomWidget(state.permanentTips)
],
);
}
@ -90,7 +92,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
keyInfoWidget(),
remoteUnlockingWidget(),
keyRealNameWidget(),
keyBottomWidget()
keyBottomWidget(state.onceLimitTips)
],
);
}
@ -103,7 +105,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
keyPeriodValidityWidget(),
remoteUnlockingWidget(),
keyRealNameWidget(),
keyBottomWidget()
keyBottomWidget(state.cycleLimitTips)
],
);
}
@ -144,7 +146,6 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
result as Map<String, dynamic>;
state.countryCode.value = result['code'];
state.countryName.value = result['countryName'];
setState(() {});
}
},
),
@ -171,12 +172,11 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
setState(() {
state.selectEffectiveDate.value =
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}';
state.effectiveDateTime.value =
DateTime.parse(state.selectEffectiveDate.value);
});
state.effectiveDateTime.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectEffectiveDate.value = XSDateUtils.formatDateTime(
state.effectiveDateTime.value, 'yyyy-mm-dd HH:mm');
});
}),
CommonItem(
@ -186,12 +186,11 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
setState(() {
state.selectFailureDate.value =
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}';
state.failureDateTime.value =
DateTime.parse(state.selectFailureDate.value);
});
state.failureDateTime.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectFailureDate.value = XSDateUtils.formatDateTime(
state.failureDateTime.value, 'yyyy-mm-dd HH:mm');
});
}),
Container(height: 10.h),
@ -221,7 +220,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
Widget keyPeriodValidityWidget() {
return Column(
children: [
Obx(() => CommonItem(
CommonItem(
leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr,
rightTitle: state.weekdaysList.value.isEmpty
? ''
@ -237,8 +236,11 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
result['starDate'].millisecondsSinceEpoch;
state.failureTimestamp.value =
result['endDate'].millisecondsSinceEpoch;
state.startTime.value =
result['starTime'].millisecondsSinceEpoch;
state.endTime.value = result['endTime'].millisecondsSinceEpoch;
}
})),
}),
SizedBox(
height: 10.h,
)
@ -246,7 +248,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
);
}
Widget keyBottomWidget() {
Widget keyBottomWidget(String sendElectronicKeyTips) {
return Column(
children: [
Container(
@ -256,7 +258,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
children: [
Expanded(
child: Text(
TranslationLoader.lanKeys!.sendKeyBottomTip!.tr,
sendElectronicKeyTips,
textAlign: TextAlign.start,
style: TextStyle(
fontSize: 18.sp, color: AppColors.darkGrayTextColor),
@ -411,7 +413,6 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
// if (entity.errorCode!.codeIsSuccessful) {
// print("标记为已入住成功啦啦啦啦啦");
// Toast.show(msg: "标记成功");
// setState(() {});
// } else {
// Toast.show(msg: '操作失败');
// }
@ -423,7 +424,6 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
if (entity.errorCode!.codeIsSuccessful) {
print("标记为已入住成功啦啦啦啦啦");
logic.showToast("标记成功");
setState(() {});
}
}
@ -461,10 +461,18 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
// contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
hintText: tfStr,
hintStyle: TextStyle(fontSize: 22.sp),
focusedBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
disabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
enabledBorder: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
border: const OutlineInputBorder(borderSide: BorderSide(width: 0, color: Colors.transparent)),
focusedBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
disabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
enabledBorder: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
border: const OutlineInputBorder(
borderSide:
BorderSide(width: 0, color: Colors.transparent)),
contentPadding: const EdgeInsets.symmetric(vertical: 0),
),
style: TextStyle(
@ -489,17 +497,15 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
onTap: () async {
Contact? currentContact =
await state.contactPicker.selectContact();
setState(() {
state.contact = currentContact!;
if (currentContact.phoneNumbers!.isNotEmpty) {
state.emailOrPhoneController.text = currentContact
.phoneNumbers![0]
.replaceAll(RegExp(r"\s+\b|\b\s"), "");
}
if (currentContact.fullName!.isNotEmpty) {
state.keyNameController.text = currentContact.fullName!;
}
});
state.contact = currentContact!;
if (currentContact.phoneNumbers!.isNotEmpty) {
state.emailOrPhoneController.text = currentContact
.phoneNumbers![0]
.replaceAll(RegExp(r"\s+\b|\b\s"), "");
}
if (currentContact.fullName!.isNotEmpty) {
state.keyNameController.text = currentContact.fullName!;
}
},
),
)
@ -512,15 +518,16 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
//
Widget remoteUnlockingWidget() {
return Visibility(
visible: state.keyInfo.value.lockSetting!.remoteUnlock == 1 ? true : false,
visible:
state.keyInfo.value.lockSetting!.remoteUnlock == 1 ? true : false,
child: Column(
children: [
CommonItem(
leftTitel: TranslationLoader.lanKeys!.remoteUnlockingAllowed!.tr,
rightTitle: "",
isHaveRightWidget: true,
rightWidget:
SizedBox(width: 60.w, height: 50.h, child: _remoteSwitch(true)),
rightWidget: SizedBox(
width: 60.w, height: 50.h, child: _remoteSwitch(true)),
action: () {}),
Container(height: 10.h),
],
@ -537,21 +544,15 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
value:
isRemote ? state.isRemoteUnlock.value : state.isAuthentication.value,
onChanged: (value) {
setState(() {
if (isRemote) {
state.isRemoteUnlock.value = !state.isRemoteUnlock.value;
} else {
state.isAuthentication.value = !state.isAuthentication.value;
}
});
if (isRemote) {
state.isRemoteUnlock.value = !state.isRemoteUnlock.value;
} else {
state.isAuthentication.value = !state.isAuthentication.value;
}
},
);
}
String intToStr(int v) {
return (v < 10) ? "0$v" : "$v";
}
Future _openModalBottomSheet() async {
showModalBottomSheet(
context: context,
@ -639,14 +640,14 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
//
{
String pwdShareStr = '您好,您的电子钥匙生成成功';
NativeInteractionTool.loadNativeShare(shareText:pwdShareStr);
NativeInteractionTool.loadNativeShare(shareText: pwdShareStr);
}
break;
case 1:
//
{
String pwdShareStr = '您好,您的电子钥匙生成成功';
NativeInteractionTool.loadNativeShare(shareText:pwdShareStr);
NativeInteractionTool.loadNativeShare(shareText: pwdShareStr);
}
break;
case 2:
@ -659,7 +660,7 @@ class _SendElectronicKeyPageState extends State<SendElectronicKeyPage> {
//
{
String pwdShareStr = '您好,您的电子钥匙生成成功';
NativeInteractionTool.loadNativeShare(shareText:pwdShareStr);
NativeInteractionTool.loadNativeShare(shareText: pwdShareStr);
}
break;
default:

View File

@ -19,6 +19,8 @@ class SendElectronicKeyState {
final failureDateTime = DateTime.now().obs;
final effectiveTimestamp = 0.obs;
final failureTimestamp = 0.obs;
final startTime = 0.obs;
final endTime = 0.obs;
var selectEffectiveDate =
'${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'
@ -36,6 +38,11 @@ class SendElectronicKeyState {
final sendSucceedType = 0.obs;
final timeLimitTips = '接收者在有效期内可以不限次数使用'; //
final permanentTips = '接收者可以使用此App开关锁'; //
final onceLimitTips = '单次钥匙有效期为1小时只能使用一次'; //
final cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'; //
SendElectronicKeyState() {
Map map = Get.arguments;
keyInfo.value = map["keyInfo"];

View File

@ -5,8 +5,8 @@ import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import '../../../appRouters.dart';
import '../../../app_settings/app_colors.dart';
import '../../../blue/blue_manage.dart';
import '../../../blue/io_protocol/io_addUser.dart';
@ -21,7 +21,6 @@ import '../../../network/api_repository.dart';
import '../../../tools/baseGetXController.dart';
import '../../../tools/eventBusEventManage.dart';
import '../../../tools/storage.dart';
import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import '../lockOperatingRecord/lockOperatingRecordGetLastRecordTime_entity.dart';
import 'lockDetail_state.dart';
import 'lockNetToken_entity.dart';
@ -73,7 +72,7 @@ class LockDetailLogic extends BaseGetXController {
// _showFullScreenOverlay(Get.context!);
state.iSClosedUnlockSuccessfulPopup.value = true;
if(state.closedUnlockSuccessfulTimer != null){
if (state.closedUnlockSuccessfulTimer != null) {
state.closedUnlockSuccessfulTimer!.cancel();
state.closedUnlockSuccessfulTimer = null;
}
@ -135,10 +134,10 @@ class LockDetailLogic extends BaseGetXController {
break;
case 0x16:
// ...
// ...
print("${reply.commandType}正在开锁中...");
state.openLockBtnState.value = 0;
showToast("正在开锁中...", something: (){
showToast("正在开锁中...", something: () {
cancelBlueConnetctToastTimer();
});
break;
@ -370,13 +369,15 @@ class LockDetailLogic extends BaseGetXController {
// ()
Future<void> addUserConnectBlue() async {
showBlueConnetctToastTimer(action:() {
showBlueConnetctToastTimer(action: () {
state.openLockBtnState.value = 0;
// state.animationController.reset();
// state.animationController.forward();
});
BlueManage().bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!, (DeviceConnectionState deviceConnectionState) async {
BlueManage()
.bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!,
(DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected) {
//
var privateKey = await Storage.getStringList(saveBluePrivateKey);
@ -390,7 +391,8 @@ class LockDetailLogic extends BaseGetXController {
if (token != null) {
getTokenList = changeStringListToIntList(token);
}
print("BlueManage().connectDeviceName:${BlueManage().connectDeviceName} authUserID:${state.senderUserId.toString()} keyID:${state.keyInfos.value.keyId.toString()} userID:${await Storage.getUid()}");
print(
"BlueManage().connectDeviceName:${BlueManage().connectDeviceName} authUserID:${state.senderUserId.toString()} keyID:${state.keyInfos.value.keyId.toString()} userID:${await Storage.getUid()}");
IoSenderManage.senderAddUser(
lockID: BlueManage().connectDeviceName,
authUserID: state.senderUserId.toString(),
@ -406,9 +408,9 @@ class LockDetailLogic extends BaseGetXController {
publicKey: publicKeyDataList,
privateKey: getPrivateKeyList,
token: getTokenList);
}else if (deviceConnectionState == DeviceConnectionState.disconnected){
} else if (deviceConnectionState == DeviceConnectionState.disconnected) {
cancelBlueConnetctToastTimer();
if(state.ifCurrentScreen.value == true){
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
@ -421,7 +423,7 @@ class LockDetailLogic extends BaseGetXController {
//
Future<void> openDoorAction(int openMode) async {
showBlueConnetctToastTimer(action:() {
showBlueConnetctToastTimer(action: () {
state.openLockBtnState.value = 0;
BlueManage().stopScan();
@ -437,7 +439,8 @@ class LockDetailLogic extends BaseGetXController {
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
print("openDoorTokenPubToken:$getTokenList getPrivateKeyList:$getPrivateKeyList");
print(
"openDoorTokenPubToken:$getTokenList getPrivateKeyList:$getPrivateKeyList");
// List<int>listData = await IoSenderManage.senderOpenLock(
// keyID: BlueManage().connectDeviceName,
// userID: await Storage.getUid(),
@ -449,8 +452,10 @@ class LockDetailLogic extends BaseGetXController {
// signKey: signKeyDataList,
// privateKey: getPrivateKeyList,
// );
BlueManage().bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!, (DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected){
BlueManage()
.bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!,
(DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected) {
IoSenderManage.senderOpenLock(
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
@ -462,9 +467,9 @@ class LockDetailLogic extends BaseGetXController {
signKey: signKeyDataList,
privateKey: getPrivateKeyList,
);
}else if (deviceConnectionState == DeviceConnectionState.disconnected){
} else if (deviceConnectionState == DeviceConnectionState.disconnected) {
cancelBlueConnetctToastTimer();
if(state.ifCurrentScreen.value == true){
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
@ -537,10 +542,11 @@ class LockDetailLogic extends BaseGetXController {
//
Future<void> getStarLockStatus() async {
showEasyLoading();
showBlueConnetctToastTimer(action: (){
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState deviceConnectionState) async {
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected) {
dismissEasyLoading();
var privateKey = await Storage.getStringList(saveBluePrivateKey);
@ -553,7 +559,7 @@ class LockDetailLogic extends BaseGetXController {
} else if (deviceConnectionState == DeviceConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
if(state.ifCurrentScreen.value == true){
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
}
@ -591,7 +597,7 @@ class LockDetailLogic extends BaseGetXController {
//
startOpenLock() {
if(state.openLockBtnState.value == 1){
if (state.openLockBtnState.value == 1) {
return;
}
state.iSOpenLock.value = true;
@ -614,7 +620,7 @@ class LockDetailLogic extends BaseGetXController {
}
startUnLock() {
if(state.openLockBtnState.value == 1){
if (state.openLockBtnState.value == 1) {
return;
}
state.iSOpenLock.value = false;
@ -672,7 +678,8 @@ class LockDetailLogic extends BaseGetXController {
// token
void getLockNetToken() async {
LockNetTokenEntity entity = await ApiRepository.to.getLockNetToken(lockId: state.keyInfos.value.lockId.toString());
LockNetTokenEntity entity = await ApiRepository.to
.getLockNetToken(lockId: state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
state.lockNetToken = entity.data!.token!;
print("state.lockNetToken:${state.lockNetToken}");
@ -698,7 +705,9 @@ class LockDetailLogic extends BaseGetXController {
//
void getLockRecordLastUploadDataTime() async {
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to.getLockRecordLastUploadDataTime(lockId: state.keyInfos.value.lockId.toString());
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to
.getLockRecordLastUploadDataTime(
lockId: state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
senderReferEventRecordTime(entity.data!.operateDate! ~/ 1000);
}
@ -716,27 +725,34 @@ class LockDetailLogic extends BaseGetXController {
//
Future<void> uploadElectricQuantityRequest(String electricQuantity) async {
KeyOperationRecordEntity entity = await ApiRepository.to.uploadElectricQuantity(electricQuantity, state.keyInfos.value.lockId.toString());
KeyOperationRecordEntity entity = await ApiRepository.to
.uploadElectricQuantity(
electricQuantity, state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
showToast("电量更新成功", something: (){
showToast("电量更新成功", something: () {
eventBus.fire(RefreshLockListInfoDataEvent());
});
}
}
///
StreamSubscription?
_lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent;
void _initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() {
// eventBus
_lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent = eventBus.on<LockSetChangeSetRefreshLockDetailWithType>().listen((event) {
_lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent = eventBus
.on<LockSetChangeSetRefreshLockDetailWithType>()
.listen((event) {
if (event.type == 0) {
// 0
state.isAttendance.value = int.parse(event.setResult);
state.keyInfos.value.lockSetting!.attendance = int.parse(event.setResult);
state.keyInfos.value.lockSetting!.attendance =
int.parse(event.setResult);
} else if (event.type == 1) {
// 1
state.isOpenLockNeedOnline.value = int.parse(event.setResult);
state.keyInfos.value.lockSetting!.appUnlockOnline = int.parse(event.setResult);
state.keyInfos.value.lockSetting!.appUnlockOnline =
int.parse(event.setResult);
} else if (event.type == 2) {
// 2
state.isOpenPassageMode.value = int.parse(event.setResult);
@ -753,13 +769,22 @@ class LockDetailLogic extends BaseGetXController {
});
}
late StreamSubscription<List<DiscoveredDevice>>_scanListDiscoveredDeviceSubscription;
late StreamSubscription<List<DiscoveredDevice>>
_scanListDiscoveredDeviceSubscription;
void _scanListDiscoveredDeviceSubscriptionAction() {
_scanListDiscoveredDeviceSubscription = EventBusManager().eventBus!.on<List<DiscoveredDevice>>().listen((List<DiscoveredDevice> list) {
final knownDeviceIndex = list.indexWhere((d) => d.name == state.keyInfos.value.bluetooth!.bluetoothDeviceName!);
_scanListDiscoveredDeviceSubscription = EventBusManager()
.eventBus!
.on<List<DiscoveredDevice>>()
.listen((List<DiscoveredDevice> list) {
final knownDeviceIndex = list.indexWhere((d) =>
d.name == state.keyInfos.value.bluetooth!.bluetoothDeviceName!);
if (knownDeviceIndex >= 0) {
//
state.currentDeviceUUid.value = (list[knownDeviceIndex].serviceUuids.isNotEmpty ? list[knownDeviceIndex].serviceUuids[0] : "").toString();
state.currentDeviceUUid.value =
(list[knownDeviceIndex].serviceUuids.isNotEmpty
? list[knownDeviceIndex].serviceUuids[0]
: "")
.toString();
}
});
}
@ -767,7 +792,7 @@ class LockDetailLogic extends BaseGetXController {
//
void _showFullScreenOverlay(BuildContext context) {
Future.delayed(const Duration(seconds: 3), () {
if(state.iSClosedUnlockSuccessfulPopup.value != true){
if (state.iSClosedUnlockSuccessfulPopup.value != true) {
state.iSClosedUnlockSuccessfulPopup.value = true;
Get.back();
}
@ -779,7 +804,7 @@ class LockDetailLogic extends BaseGetXController {
builder: (BuildContext context) {
return GestureDetector(
onTap: () {
if(state.iSClosedUnlockSuccessfulPopup.value != true){
if (state.iSClosedUnlockSuccessfulPopup.value != true) {
state.iSClosedUnlockSuccessfulPopup.value = true;
Get.back();
}

View File

@ -160,10 +160,10 @@ class _LockDetailPageState extends State<LockDetailPage>
)))),
Positioned(
child: Obx(() => GestureDetector(
onTap: (){
logic.getStarLockStatus();
},
child: Row(
onTap: () {
logic.getStarLockStatus();
},
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Image.asset(
@ -184,7 +184,7 @@ class _LockDetailPageState extends State<LockDetailPage>
SizedBox(width: 20.w),
],
),
)))
)))
],
),
SizedBox(height: 30.h),
@ -391,6 +391,10 @@ class _LockDetailPageState extends State<LockDetailPage>
'照明', state.bottomBtnisUneable.value, () {}));
//
showWidgetArr.add(bottomItem('images/main/icon_lockDetail_illuminator.png',
'门磁', state.bottomBtnisUneable.value, () {}));
//
showWidgetArr.add(bottomItem('images/main/icon_lockDetail_illuminator.png',
'开门器', state.bottomBtnisUneable.value, () {}));

View File

@ -1,8 +1,8 @@
import 'dart:async';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import '../../../blue/blue_manage.dart';
import '../../../blue/io_protocol/io_referEventRecordTime.dart';
@ -13,22 +13,22 @@ import '../../../blue/sender_manage.dart';
import '../../../network/api_repository.dart';
import '../../../tools/baseGetXController.dart';
import '../../../tools/storage.dart';
import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'lockOperatingRecordGetLastRecordTime_entity.dart';
import 'lockOperatingRecord_state.dart';
class LockOperatingRecordLogic extends BaseGetXController{
class LockOperatingRecordLogic extends BaseGetXController {
LockOperatingRecordState state = LockOperatingRecordState();
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
// if(reply is SenderReferEventRecordNumberReply) {
// _replyReferEventRecordNumber(reply);
// }
if(reply is SenderReferEventRecordTimeReply) {
if (reply is SenderReferEventRecordTimeReply) {
_replyReferEventRecordTime(reply);
}
});
@ -69,17 +69,17 @@ class LockOperatingRecordLogic extends BaseGetXController{
//
Future<void> _replyReferEventRecordTime(Reply reply) async {
int status = reply.data[2];
switch(status){
switch (status) {
case 0x00:
//
print("${reply.commandType}数据解析成功");
if(reply.data[5] > 0){
if (reply.data[5] > 0) {
reply.data.removeRange(0, 6);
// 8
var getList = splitList(reply.data, 8);
print("getList:$getList");
var uploadList = [];
for(int i = 0; i<getList.length; i++){
for (int i = 0; i < getList.length; i++) {
var indexList = getList[i];
print("indexList:$indexList");
var indexMap = {};
@ -90,13 +90,13 @@ class LockOperatingRecordLogic extends BaseGetXController{
indexMap["type"] = indexList[1].toString();
int value = ((0xff & indexList[(4)]) << 24 |
(0xff & indexList[5]) << 16 |
(0xff & indexList[6]) << 8 |
(0xFF & indexList[7]));
(0xff & indexList[5]) << 16 |
(0xff & indexList[6]) << 8 |
(0xFF & indexList[7]));
// indexMap["date"] = DateTool().dateToYMDHNSString("$value");
// print("value${DateTool().dateToYMDHNSString("$value")}");
indexMap["date"] = "${value*1000}";
indexMap["date"] = "${value * 1000}";
uploadList.add(indexMap);
}
lockRecordUploadData(uploadList);
@ -155,7 +155,8 @@ class LockOperatingRecordLogic extends BaseGetXController{
// ()
Future<void> senderReferEventRecordTime(int time) async {
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState state) async {
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState state) async {
if (state == DeviceConnectionState.connected) {
var privateKey = await Storage.getStringList(saveBluePrivateKey);
List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
@ -168,15 +169,15 @@ class LockOperatingRecordLogic extends BaseGetXController{
EasyLoading.show();
IoSenderManage.senderReferEventRecordTimeCommand(
keyID:BlueManage().connectDeviceName,
userID:await Storage.getUid(),
logsCount:20,
keyID: BlueManage().connectDeviceName,
userID: await Storage.getUid(),
logsCount: 20,
// time:DateTime.now().millisecondsSinceEpoch~/1000,
time: time,
token:getTokenList,
needAuthor:1,
publicKey:getPublicKeyList,
privateKey:getPrivateKeyList,
token: getTokenList,
needAuthor: 1,
publicKey: getPublicKeyList,
privateKey: getPrivateKeyList,
);
}
});
@ -202,25 +203,24 @@ class LockOperatingRecordLogic extends BaseGetXController{
if (entity.errorCode!.codeIsSuccessful) {
print("操作记录列表成功:${entity.data?.itemList}");
state.lockOperatingRecordListData.value = entity.data!.itemList!;
}else{
}
} else {}
}
//
void getLockRecordLastUploadDataTime() async {
LockOperatingRecordGetLastRecordTimeEntity entity =
await ApiRepository.to.getLockRecordLastUploadDataTime(lockId: state.keyInfos.value.lockId.toString());
LockOperatingRecordGetLastRecordTimeEntity entity = await ApiRepository.to
.getLockRecordLastUploadDataTime(
lockId: state.keyInfos.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
senderReferEventRecordTime(entity.data!.operateDate!~/1000);
senderReferEventRecordTime(entity.data!.operateDate! ~/ 1000);
}
}
//
void lockRecordUploadData(List list) async {
KeyOperationRecordEntity entity = await ApiRepository.to.lockRecordUploadData(
lockId: state.keyInfos.value.lockId.toString(),
records: list);
KeyOperationRecordEntity entity = await ApiRepository.to
.lockRecordUploadData(
lockId: state.keyInfos.value.lockId.toString(), records: list);
if (entity.errorCode!.codeIsSuccessful) {
mockNetworkDataRequest();
}
@ -229,7 +229,7 @@ class LockOperatingRecordLogic extends BaseGetXController{
//
void clearOperationRecordRequest() async {
KeyOperationRecordEntity entity =
await ApiRepository.to.clearOperationRecord('28');
await ApiRepository.to.clearOperationRecord('28');
if (entity.errorCode!.codeIsSuccessful) {
showToast("清除数据成功");
}
@ -242,8 +242,8 @@ class LockOperatingRecordLogic extends BaseGetXController{
print("onReady()");
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false){
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_initReplySubscription();
mockNetworkDataRequest();
@ -257,8 +257,8 @@ class LockOperatingRecordLogic extends BaseGetXController{
print("onInit()");
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false){
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
getLockRecordLastUploadDataTime();
// senderReferEventRecordTime();
// senderReferEventRecordNumber();
@ -271,10 +271,9 @@ class LockOperatingRecordLogic extends BaseGetXController{
super.onClose();
//
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false){
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
_replySubscription.cancel();
}
}
}
}

View File

@ -1,8 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import '../../../app_settings/app_colors.dart';
import '../../../tools/custom_bottom_sheet.dart';
@ -26,7 +25,6 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
@ -34,38 +32,39 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> {
haveBack: true,
backgroundColor: AppColors.mainColor,
actionsList: [
(state.keyInfos.value.isLockOwner == 1 || state.keyInfos.value.keyRight == 1)
? IconButton(
icon: Image.asset(
'images/icon_bar_more.png',
height: 30.h,
width: 10.w,
),
onPressed: () async {
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if(isDemoMode == false){
// JhPopMenus.showLinePop(context, clickCallback: (index, selText) {
// print('选中index: $index');
// print('选中text: $selText');
// if (index == 0) {
// logic.mockNetworkDataRequest();
// } else if (index == 1) {
// logic.clearOperationRecordRequest();
// }
// }, listData: [
// {'text': '读取记录'},
// {'text': '清空记录'},
// {'text': '导出记录'},
// ]);
(state.keyInfos.value.isLockOwner == 1 ||
state.keyInfos.value.keyRight == 1)
? IconButton(
icon: Image.asset(
'images/icon_bar_more.png',
height: 30.h,
width: 10.w,
),
onPressed: () async {
var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot);
if (isDemoMode == false) {
// JhPopMenus.showLinePop(context, clickCallback: (index, selText) {
// print('选中index: $index');
// print('选中text: $selText');
// if (index == 0) {
// logic.mockNetworkDataRequest();
// } else if (index == 1) {
// logic.clearOperationRecordRequest();
// }
// }, listData: [
// {'text': '读取记录'},
// {'text': '清空记录'},
// {'text': '导出记录'},
// ]);
_openModalBottomSheet();
}else{
// Get.toNamed(Routers.selectLockTypePage);
logic.showToast("演示模式");
}
},
)
: Container(),
_openModalBottomSheet();
} else {
// Get.toNamed(Routers.selectLockTypePage);
logic.showToast("演示模式");
}
},
)
: Container(),
],
),
body: Column(
@ -79,9 +78,7 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> {
),
),
_searchWidget(),
SizedBox(
height: 10.h
),
SizedBox(height: 10.h),
Expanded(child: _buildMainUI()),
],
),
@ -124,24 +121,28 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> {
}
Widget _buildMainUI() {
return Obx(() => state.lockOperatingRecordListData.value.isNotEmpty ? ListView.separated(
itemCount: state.lockOperatingRecordListData.length,
itemBuilder: (c, index) {
KeyRecordDataItem dataItem = state.lockOperatingRecordListData[index];
int? operateDate = dataItem.operateDate;
DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(operateDate!);
String operateDateStr = '${dateStr.toLocal().toString().substring(0, 16)} ';
return _operatingRecordItem(getTypeIcon(dataItem.recordType!), dataItem.recordTypeName!, operateDateStr, () {
});
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
) : NoData());
return Obx(() => state.lockOperatingRecordListData.value.isNotEmpty
? ListView.separated(
itemCount: state.lockOperatingRecordListData.length,
itemBuilder: (c, index) {
KeyRecordDataItem dataItem =
state.lockOperatingRecordListData[index];
int? operateDate = dataItem.operateDate;
DateTime dateStr =
DateTime.fromMillisecondsSinceEpoch(operateDate!);
String operateDateStr =
'${dateStr.toLocal().toString().substring(0, 16)} ';
return _operatingRecordItem(getTypeIcon(dataItem.recordType!),
dataItem.recordTypeName!, operateDateStr, () {});
},
separatorBuilder: (BuildContext context, int index) {
return const Divider(
height: 1,
color: AppColors.greyLineColor,
);
},
)
: NoData());
}
Widget _dateItem(String lockDate) {
@ -185,7 +186,8 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> {
return title;
}
Widget _operatingRecordItem(String userAvatarStr, String userNameStr, String unlockDescStr, Function() action) {
Widget _operatingRecordItem(String userAvatarStr, String userNameStr,
String unlockDescStr, Function() action) {
return GestureDetector(
onTap: action,
child: Container(
@ -261,5 +263,4 @@ class _LockOperatingRecordPageState extends State<LockOperatingRecordPage> {
);
});
}
}

View File

@ -1,14 +1,12 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import '../../lockMian/entity/lockListInfo_entity.dart';
import '../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
class LockOperatingRecordState{
class LockOperatingRecordState {
final keyInfos = LockListInfoItemEntity().obs;
final lockOperatingRecordListData = <KeyRecordDataItem>[].obs;
LockOperatingRecordState() {
keyInfos.value = Get.arguments["keyInfo"];
}
}
}

View File

@ -1,31 +1,28 @@
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import '../../../../../network/api_repository.dart';
import '../../../../../tools/baseGetXController.dart';
import '../../../../../tools/eventBusEventManage.dart';
import '../../../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'editLockName_state.dart';
class EditLockNameLogic extends BaseGetXController{
class EditLockNameLogic extends BaseGetXController {
final EditLockNameState state = EditLockNameState();
//
Future<void> modifyKeyNameRequest() async {
KeyOperationRecordEntity entity = await ApiRepository.to.updateLockName(
lockId: state.lockSetInfoData.value.lockId.toString(),
lockName:state.changeLockNameController.text);
lockName: state.changeLockNameController.text);
if (entity.errorCode!.codeIsSuccessful) {
state.lockBasicInfo.value.lockAlias = state.changeLockNameController.text;
showToast("修改成功", something: (){
eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(3, state.lockBasicInfo.value.lockAlias!));
showToast("修改成功", something: () {
eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(
3, state.lockBasicInfo.value.lockAlias!));
eventBus.fire(RefreshLockListInfoDataEvent());
});
Get.back(result: {
"lockBasicInfo":state.lockBasicInfo.value
});
Get.back(result: {"lockBasicInfo": state.lockBasicInfo.value});
}
}
}

View File

@ -1,7 +1,7 @@
import 'dart:async';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import '../../../../../blue/blue_manage.dart';
import '../../../../../blue/io_protocol/io_getStarLockStatusInfo.dart';
@ -13,7 +13,6 @@ import '../../../../../network/api_repository.dart';
import '../../../../../tools/baseGetXController.dart';
import '../../../../../tools/eventBusEventManage.dart';
import '../../../../../tools/storage.dart';
import '../../../electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'uploadElectricQuantity_state.dart';
class UploadElectricQuantityLogic extends BaseGetXController {
@ -21,12 +20,15 @@ class UploadElectricQuantityLogic extends BaseGetXController {
//
Future<void> uploadElectricQuantityRequest(String electricQuantity) async {
KeyOperationRecordEntity entity = await ApiRepository.to.uploadElectricQuantity(electricQuantity, state.lockSetInfoData.value.lockId.toString());
KeyOperationRecordEntity entity = await ApiRepository.to
.uploadElectricQuantity(
electricQuantity, state.lockSetInfoData.value.lockId.toString());
if (entity.errorCode!.codeIsSuccessful) {
showToast("锁电量更新成功", something: (){
eventBus.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
eventBus.fire(LockSetChangeSetRefreshLockDetailWithType(0, electricQuantity));
showToast("锁电量更新成功", something: () {
eventBus
.fire(PassCurrentLockInformationEvent(state.lockSetInfoData.value));
eventBus.fire(
LockSetChangeSetRefreshLockDetailWithType(0, electricQuantity));
eventBus.fire(RefreshLockListInfoDataEvent());
});
}
@ -34,17 +36,18 @@ class UploadElectricQuantityLogic extends BaseGetXController {
//
Future<void> getStarLockStatus() async {
if(state.sureBtnState.value == 1){
if (state.sureBtnState.value == 1) {
return;
}
state.sureBtnState.value = 1;
showEasyLoading();
showBlueConnetctToastTimer(action: (){
showBlueConnetctToastTimer(action: () {
dismissEasyLoading();
state.sureBtnState.value = 0;
});
BlueManage().bludSendData(BlueManage().connectDeviceName, (DeviceConnectionState deviceConnectionState) async {
BlueManage().bludSendData(BlueManage().connectDeviceName,
(DeviceConnectionState deviceConnectionState) async {
if (deviceConnectionState == DeviceConnectionState.connected) {
dismissEasyLoading();
var privateKey = await Storage.getStringList(saveBluePrivateKey);
@ -58,7 +61,7 @@ class UploadElectricQuantityLogic extends BaseGetXController {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
state.sureBtnState.value = 0;
if(state.ifCurrentScreen.value == true){
if (state.ifCurrentScreen.value == true) {
showBlueConnetctToast();
}
}
@ -68,7 +71,8 @@ class UploadElectricQuantityLogic extends BaseGetXController {
//
late StreamSubscription<Reply> _replySubscription;
void _initReplySubscription() {
_replySubscription = EventBusManager().eventBus!.on<Reply>().listen((reply) {
_replySubscription =
EventBusManager().eventBus!.on<Reply>().listen((reply) {
//
if (reply is GetStarLockStatuInfoReply) {
_replyGetStarLockStatusInfo(reply);
@ -81,7 +85,7 @@ class UploadElectricQuantityLogic extends BaseGetXController {
int status = reply.data[2];
switch (status) {
case 0x00:
//
//
print("${reply.commandType}数据解析成功");
state.sureBtnState.value = 0;
dismissEasyLoading();
@ -89,28 +93,31 @@ class UploadElectricQuantityLogic extends BaseGetXController {
//
var battRemCap = reply.data[132];
state.lockSetInfoData.value.lockBasicInfo!.electricQuantity = battRemCap;
state.uploadElectricQuantityDate.value = DateTime.now().millisecondsSinceEpoch;
state.lockSetInfoData.value.lockBasicInfo!.electricQuantityDate = DateTime.now().millisecondsSinceEpoch;
state.lockSetInfoData.value.lockBasicInfo!.electricQuantity =
battRemCap;
state.uploadElectricQuantityDate.value =
DateTime.now().millisecondsSinceEpoch;
state.lockSetInfoData.value.lockBasicInfo!.electricQuantityDate =
DateTime.now().millisecondsSinceEpoch;
uploadElectricQuantityRequest(battRemCap.toString());
break;
case 0x06:
//
//
print("${reply.commandType}需要鉴权");
break;
case 0x07:
//
//
print("${reply.commandType}用户无权限");
break;
case 0x09:
//
//
print("${reply.commandType}权限校验错误");
break;
default:
//
//
print("${reply.commandType}失败");
break;
@ -139,5 +146,4 @@ class UploadElectricQuantityLogic extends BaseGetXController {
super.onClose();
_replySubscription.cancel();
}
}
}

View File

@ -177,19 +177,19 @@ class _LockSetPageState extends State<LockSetPage> with RouteAware {
arguments: {'lockSetInfoData': state.lockSetInfoData.value});
}),
SizedBox(height: 10.h),
//
Obx(() => Visibility(
visible: state.lockFeature.value.doorStatus == 1 ? true : false,
child: CommonItem(
leftTitel: TranslationLoader.lanKeys!.doorMagnetic!.tr,
rightTitle: "",
isHaveLine: true,
isHaveDirection: true,
action: () {
Get.toNamed(Routers.doorMagneticPage);
// Toast.show(msg: "功能暂未开放");
}))),
//by DaisyWu
//
// Obx(() => Visibility(
// visible: state.lockFeature.value.doorStatus == 1 ? true : false,
// child: CommonItem(
// leftTitel: TranslationLoader.lanKeys!.doorMagnetic!.tr,
// rightTitle: "",
// isHaveLine: true,
// isHaveDirection: true,
// action: () {
// Get.toNamed(Routers.doorMagneticPage);
// // Toast.show(msg: "功能暂未开放");
// }))),
// // 线
// Obx(() => Visibility(
// visible: state.lockFeature.value.wirelessKeyboard == 1 ? true : false,

View File

@ -1,9 +1,13 @@
import 'dart:io';
import 'package:aliyun_push/aliyun_push.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/tools/noData.dart';
import 'package:star_lock/tools/submitBtn.dart';
import 'package:star_lock/tools/xs_aliyunPush.dart';
import '../../../appRouters.dart';
import '../../../baseWidget.dart';
@ -29,8 +33,8 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
final logic = Get.put(LockMainLogic());
final state = Get.find<LockMainLogic>().state;
void getHttpData(){
logic.getStarLockInfo().then((LockListInfoEntity value){
void getHttpData() {
logic.getStarLockInfo().then((LockListInfoEntity value) {
setState(() {});
});
}
@ -40,6 +44,7 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
super.initState();
getHttpData();
initAliyunPush();
}
@override
@ -92,12 +97,11 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
// },
// ),
body: EasyRefreshTool(
onRefresh: (){
onRefresh: () {
logic.pageNo = 1;
getHttpData();
},
child: Obx(() => getDataReturnUI(state.dataLength.value))
),
child: Obx(() => getDataReturnUI(state.dataLength.value))),
// body:smartRefresher(
// logic.refreshController,
// onRefresh:logic.onRefresh,
@ -118,12 +122,16 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
case 1:
//
Storage.setBool(ifIsDemoModeOrNot, false);
returnWidget = LockDetailPage(isOnlyOneData: true, lockListInfoItemEntity: state.lockListInfoEntity.value.data!.groupList![0].lockList![0]);
returnWidget = LockDetailPage(
isOnlyOneData: true,
lockListInfoItemEntity: state
.lockListInfoEntity.value.data!.groupList![0].lockList![0]);
break;
case 2:
//
Storage.setBool(ifIsDemoModeOrNot, false);
returnWidget = LockListPage(lockListInfoGroupEntity: state.lockListInfoEntity.value.data!);
returnWidget = LockListPage(
lockListInfoGroupEntity: state.lockListInfoEntity.value.data!);
break;
default:
returnWidget = NoData();
@ -179,13 +187,13 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
Container(
// padding: EdgeInsets.all(30.w),
child: Text(
TranslationLoader
.lanKeys!.whenAddingLockThePhoneMustBeNextToTheLock!.tr,
style: TextStyle(
fontSize: 26.sp,
// fontWeight: FontWeight.w800,
color: Colors.black),
)),
TranslationLoader
.lanKeys!.whenAddingLockThePhoneMustBeNextToTheLock!.tr,
style: TextStyle(
fontSize: 26.sp,
// fontWeight: FontWeight.w800,
color: Colors.black),
)),
SizedBox(
height: 160.h,
),
@ -204,4 +212,25 @@ class _StarLockMainPageState extends State<StarLockMainPage> with BaseWidget {
void onShow() {}
void onHide() {}
//
void initAliyunPush() {
final aliyunPush = AliyunPush();
XSAliyunPushProvider().init(aliyunPush);
XSAliyunPushProvider().initAliyunPush();
if (Platform.isAndroid) {
XSAliyunPushProvider().initAliyunThirdPush();
}
//使DeviceID推送
aliyunPush.getDeviceId().then((deviceId) async {
// print('得到的DeviceId$deviceId');
final data = await Storage.getString(saveUserLoginData);
if (data!.isNotEmpty && deviceId.isNotEmpty) {
XSAliyunPushProvider()
.pushBindDeviceID(deviceId, Platform.isAndroid ? 10 : 20);
}
});
}
}

View File

@ -1,6 +1,7 @@
import 'package:star_lock/mine/mall/lockMall_entity.dart';
import 'package:star_lock/mine/mall/lockMall_state.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:webview_flutter/webview_flutter.dart';
import '../../tools/baseGetXController.dart';
@ -12,6 +13,27 @@ class LockMallLogic extends BaseGetXController {
LockMallDataEntity entity = await ApiRepository.to.getMallURLData();
if (entity.errorCode!.codeIsSuccessful) {
state.lockMallUrl.value = entity.data!.url!;
state.mallWebView.setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
// Update loading bar.
state.webProgress.value = progress / 100;
},
onPageStarted: (String url) {
state.webProgress.value = 0.0;
},
onPageFinished: (String url) {
state.webProgress.value = 1.0;
},
onWebResourceError: (WebResourceError error) {},
onNavigationRequest: (NavigationRequest request) {
// if (request.url.startsWith('https://www.youtube.com/')) {
// return NavigationDecision.prevent;
// }
return NavigationDecision.navigate;
},
),
);
state.mallWebView.loadRequest(Uri.parse(state.lockMallUrl.value));
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/mine/mall/lockMall_logic.dart';
@ -36,7 +37,22 @@ class _LockMallPageState extends State<LockMallPage> {
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: WebViewWidget(controller: state.mallWebView));
body: Obx(() => Column(
children: <Widget>[
Container(
padding: EdgeInsets.only(bottom: 10.w),
child: LinearProgressIndicator(
value: state.webProgress.value,
backgroundColor: Colors.grey,
valueColor:
AlwaysStoppedAnimation<Color>(AppColors.mainColor),
),
),
Expanded(
child: WebViewWidget(controller: state.mallWebView),
),
],
)));
}
String getWebTitle() {

View File

@ -1,8 +1,11 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:webview_flutter/webview_flutter.dart';
class LockMallState {
var lockMallUrl = "".obs;
var webProgress = 0.0.obs;
late WebViewController mallWebView = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted);
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(Colors.white);
}

View File

@ -16,9 +16,9 @@ class AddAuthorizedAdministratorLogic extends BaseGetXController {
String getEffectiveDateTime = '0';
if (state.tabController!.index == 1) {
getFailureDateTime =
state.failureDateTime.value.millisecondsSinceEpoch.toString();
state.failureDate.value.millisecondsSinceEpoch.toString();
getEffectiveDateTime =
state.effectiveDateTime.value.millisecondsSinceEpoch.toString();
state.effectiveDate.value.millisecondsSinceEpoch.toString();
}
var entity = await ApiRepository.to.addAuthorizedAdmin(
state.isCreateUser.value ? "1" : "0",
@ -45,46 +45,46 @@ class AddAuthorizedAdministratorLogic extends BaseGetXController {
}
}
//
Future<void> sendElectronicKeyRequest(BuildContext widgetContext) async {
String getFailureDateTime = '0';
String getEffectiveDateTime = '0';
String lockID = state.keyInfo.value.lockId.toString();
String getKeyType = (int.parse(state.type.value) + 1).toString();
if (state.type.value == '0') {
getFailureDateTime =
state.failureDateTime.value.millisecondsSinceEpoch.toString();
getEffectiveDateTime =
state.effectiveDateTime.value.millisecondsSinceEpoch.toString();
}
// //
// Future<void> sendElectronicKeyRequest(BuildContext widgetContext) async {
// String lockID = state.keyInfo.value.lockId.toString();
// String getKeyType = (int.parse(state.type.value) + 1).toString();
// if (state.type.value == '0') {
// // getFailureDateTime =
// // state.failureDateTime.value.millisecondsSinceEpoch.toString();
// // getEffectiveDateTime =
// // state.effectiveDateTime.value.millisecondsSinceEpoch.toString();
// }
var entity = await ApiRepository.to.sendElectronicKey(
createUser: state.isCreateUser.value ? "1" : "0",
countryCode: state.countryCode.value,
usernameType: '1',
endDate: getFailureDateTime,
faceAuthentication: state.isAuthentication.value == true ? '1' : '2',
isCameraEnable: '2',
isRemoteUnlock: state.isRemoteUnlock.value == true ? '1' : '2',
keyNameForAdmin: state.keyNameController.text,
keyRight: '0',
keyType: getKeyType,
lockId: lockID,
operatorUid: '',
receiverUsername: state.emailOrPhoneController.text,
remarks: '',
startDate: getEffectiveDateTime,
weekDays: state.weekdaysList);
if (entity.errorCode!.codeIsSuccessful) {
print('发送电子钥匙成功');
state.isSendSuccess.value = true;
} else {
if (entity.errorCode == 425) {
//
_showDialog(widgetContext, '${entity.errorMsg}');
}
}
}
// var entity = await ApiRepository.to.sendElectronicKey(
// createUser: state.isCreateUser.value ? "1" : "0",
// countryCode: state.countryCode.value,
// usernameType: '1',
// endDate: state.failureDateTime.value.millisecondsSinceEpoch,
// faceAuthentication: state.isAuthentication.value == true ? '1' : '2',
// isCameraEnable: '2',
// isRemoteUnlock: state.isRemoteUnlock.value == true ? '1' : '2',
// keyNameForAdmin: state.keyNameController.text,
// keyRight: '0',
// keyType: getKeyType,
// lockId: lockID,
// operatorUid: '',
// receiverUsername: state.emailOrPhoneController.text,
// remarks: '',
// startDate: state.effectiveDateTime.value.millisecondsSinceEpoch,
// weekDays: state.weekdaysList,
// startTime: state.st.value,
// endTime: state.endTime.value);
// if (entity.errorCode!.codeIsSuccessful) {
// print('发送电子钥匙成功');
// state.isSendSuccess.value = true;
// } else {
// if (entity.errorCode == 425) {
// //
// _showDialog(widgetContext, '${entity.errorMsg}');
// }
// }
// }
//
void _showDialog(widgetContext, String errMsg) {

View File

@ -3,12 +3,10 @@ import 'package:flutter/material.dart';
import 'package:flutter_native_contact_picker/flutter_native_contact_picker.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:get/get_utils/get_utils.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/commonItem.dart';
import 'package:star_lock/tools/dateUtils.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/submitBtn.dart';
@ -25,28 +23,13 @@ class AddAuthorizedAdministratorPage extends StatefulWidget {
}
}
class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministratorPage> with SingleTickerProviderStateMixin {
class _AddAuthorizedAdministratorPageState
extends State<AddAuthorizedAdministratorPage>
with SingleTickerProviderStateMixin {
final logic = Get.put(AddAuthorizedAdministratorLogic());
final state = Get.find<AddAuthorizedAdministratorLogic>().state;
TabController? _tabController;
final FlutterContactPicker _contactPicker = FlutterContactPicker();
late Contact _contact;
final _templateNameTf = TextEditingController();
late List _lockIdList;
late bool _isRemoteUnlock;
late bool _isCreateUser;
var _selectEffectiveDate = ''; //
var _selectFailureDate = ''; //
late DateTime _effectiveDateTime;
late DateTime _failureDateTime;
final TextEditingController _emailOrPhoneController =
TextEditingController(); ///
final TextEditingController _keyNameController =
TextEditingController(); //
String countryName = '中国';
String countryCode = '86';
late bool _isSendSuccess;
List tabs = [
TranslationLoader.lanKeys!.permanent!.tr,
@ -57,10 +40,6 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
void initState() {
super.initState();
_isCreateUser = false;
_lockIdList = [];
_isRemoteUnlock = false;
_isSendSuccess = false;
_tabController = TabController(length: 2, vsync: this);
}
@ -119,7 +98,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
//
Widget _permanentAdministrator() {
if (_isSendSuccess) {
if (state.isSendSuccess.value == true) {
return sendElectronicKeySucceed();
} else {
return Column(
@ -133,9 +112,9 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.lock!.tr,
rightTitle: _lockIdList.isEmpty
rightTitle: state.lockIdList.value.isEmpty
? TranslationLoader.lanKeys!.pleaseSelect!.tr
: _lockIdList.length.toString(),
: state.lockIdList.value.length.toString(),
isHaveDirection: true,
action: () {
Navigator.pushNamed(context, Routers.massSendLockGroupPage)
@ -143,7 +122,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
//ID列表
if (value != null) {
value as Map<String, dynamic>;
_lockIdList = value['selectLockIdList'];
state.lockIdList.value = value['selectLockIdList'];
setState(() {});
}
@ -164,7 +143,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
//
Widget _timeLimitAdministrator() {
if (_isSendSuccess) {
if (state.isSendSuccess.value == true) {
return sendElectronicKeySucceed();
} else {
return Column(
@ -182,9 +161,9 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.lock!.tr,
rightTitle: _lockIdList.isEmpty
rightTitle: state.lockIdList.value.isEmpty
? TranslationLoader.lanKeys!.pleaseSelect!.tr
: _lockIdList.length.toString(),
: state.lockIdList.value.length.toString(),
isHaveDirection: true,
action: () {
Navigator.pushNamed(context, Routers.massSendLockGroupPage)
@ -192,7 +171,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
//ID列表
if (value != null) {
value as Map<String, dynamic>;
_lockIdList = value['selectLockIdList'];
state.lockIdList.value = value['selectLockIdList'];
setState(() {});
}
@ -211,41 +190,6 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
}
}
//
Future<void> addAuthorizedAdminRequest() async {
String getFailureDateTime = '0';
String getEffectiveDateTime = '0';
if (_tabController!.index == 1) {
getFailureDateTime = _failureDateTime.millisecondsSinceEpoch.toString();
getEffectiveDateTime =
_effectiveDateTime.millisecondsSinceEpoch.toString();
}
var entity = await ApiRepository.to.addAuthorizedAdmin(
_isCreateUser ? "1" : "0",
getFailureDateTime,
_isRemoteUnlock == true ? '1' : '2',
[],
_lockIdList,
_keyNameController.text,
getEffectiveDateTime,
_emailOrPhoneController.text,
countryCode,
'1',
);
if (entity.errorCode!.codeIsSuccessful) {
print('发送电子钥匙成功');
_isSendSuccess = true;
setState(() {});
} else {
logic.showToast("${entity.errorMsg}");
if (entity.errorCode == 425) {
//
_isCreateUser = true;
addAuthorizedAdminRequest();
}
}
}
// widget
Widget keyInfoWidget() {
return Column(
@ -259,7 +203,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
rightWidget: getTFWidget(
true,
TranslationLoader.lanKeys!.pleaseEnterNumberOrEmail!.tr,
_emailOrPhoneController)),
state.emailOrPhoneController)),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr,
rightTitle: "",
@ -267,7 +211,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
isHaveRightWidget: true,
isHaveDirection: true,
rightWidget: Text(
'$countryName +$countryCode',
'${state.countryName.value} +${state.countryCode.value}',
textAlign: TextAlign.end,
style:
TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor),
@ -277,8 +221,8 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
context, Routers.selectCountryRegionPage);
if (result != null) {
result as Map<String, dynamic>;
countryCode = result['code'];
countryName = result['countryName'];
state.countryCode.value = result['code'];
state.countryName.value = result['countryName'];
setState(() {});
}
},
@ -290,7 +234,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
rightWidget: getTFWidget(
false,
TranslationLoader.lanKeys!.pleaseEnter!.tr,
_keyNameController)),
state.keyNameController)),
Container(height: 10.h),
],
);
@ -339,10 +283,10 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
child: InkWell(
onTap: () async {
Contact? currentContact =
await _contactPicker.selectContact();
await state.contactPicker.selectContact();
setState(() {
if (currentContact!.phoneNumbers!.isNotEmpty) {
_emailOrPhoneController.text = currentContact
state.emailOrPhoneController.text = currentContact
.phoneNumbers![0]
.replaceAll(RegExp(r"\s+\b|\b\s"), "");
}
@ -364,7 +308,8 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
leftTitel: TranslationLoader.lanKeys!.remoteUnlockingAllowed!.tr,
rightTitle: "",
isHaveRightWidget: true,
rightWidget: SizedBox(width: 60.w, height: 50.h, child: _switch()),
rightWidget: SizedBox(
width: 60.w, height: 50.h, child: Obx(() => _switch())),
action: () {}),
Container(height: 40.h),
],
@ -377,30 +322,34 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
children: [
CommonItem(
leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr,
rightTitle: _selectEffectiveDate,
rightTitle: state.selectEffectiveDate.value,
isHaveLine: true,
isHaveDirection: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
setState(() {
_selectEffectiveDate =
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}';
_effectiveDateTime = DateTime.parse(_selectEffectiveDate);
state.effectiveDate.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectEffectiveDate.value = XSDateUtils.formatDateTime(
state.effectiveDate.value, 'yyyy-mm-dd HH:mm');
});
});
}),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.failureTime!.tr,
rightTitle: _selectFailureDate,
rightTitle: state.selectFailureDate.value,
isHaveDirection: true,
action: () {
Pickers.showDatePicker(context, mode: DateMode.YMDHM,
onConfirm: (p) {
setState(() {
_selectFailureDate =
'${p.year}-${intToStr(p.month!)}-${intToStr(p.day!)} ${intToStr(p.hour!)}:${intToStr(p.minute!)}';
_failureDateTime = DateTime.parse(_selectFailureDate);
state.failureDate.value = XSDateUtils.parseDateTime(
'${p.year}-${p.month!}-${p.day} ${p.hour!}:${p.minute!}',
'yyyy-mm-dd HH:mm');
state.selectFailureDate.value = XSDateUtils.formatDateTime(
state.failureDate.value, 'yyyy-mm-dd HH:mm');
});
});
}),
@ -430,7 +379,9 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
borderRadius: 20.w,
margin: EdgeInsets.only(left: 30.w, right: 30.w, top: 30.w),
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
onClick: () {}),
onClick: () {
logic.addAuthorizedAdminRequest();
}),
Container(
padding: EdgeInsets.only(right: 30.w),
// color: Colors.red,
@ -497,7 +448,7 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
SubmitBtn(
btnName: '完成',
onClick: () {
_isSendSuccess = false;
state.isSendSuccess.value = false;
Navigator.pop(context, true);
}),
SizedBox(
@ -532,11 +483,9 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
activeColor: CupertinoColors.activeBlue,
trackColor: CupertinoColors.systemGrey5,
thumbColor: CupertinoColors.white,
value: _isRemoteUnlock,
value: state.isRemoteUnlock.value,
onChanged: (value) {
setState(() {
_isRemoteUnlock = !_isRemoteUnlock;
});
state.isRemoteUnlock.value = !state.isRemoteUnlock.value;
},
);
}
@ -545,12 +494,8 @@ class _AddAuthorizedAdministratorPageState extends State<AddAuthorizedAdministra
return SubmitBtn(
btnName: TranslationLoader.lanKeys!.sure!.tr,
onClick: () {
addAuthorizedAdminRequest();
logic.addAuthorizedAdminRequest();
},
);
}
String intToStr(int v) {
return (v < 10) ? "0$v" : "$v";
}
}

View File

@ -22,8 +22,10 @@ class AddAuthorizedAdministratorState {
var selectFailureDate =
'${DateTime.now().year}-${DateTime.now().month}-${DateTime.now().day} ${DateTime.now().hour}:${DateTime.now().minute}'
.obs; //
final effectiveDateTime = DateTime.now().obs;
final failureDateTime = DateTime.now().obs;
final effectiveDate = DateTime.now().obs;
final failureDate = DateTime.now().obs;
var startTime = 0.obs;
var endTime = 0.obs;
var countryName = '中国'.obs;
var countryCode = '86'.obs;
var isSendSuccess = false.obs;

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/mine/mineSet/lockUserManage/expireLockList/expireLockListEntity.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
@ -102,13 +102,12 @@ class _ExpireLockChangeDatePageState extends State<ExpireLockChangeDatePage> {
itemData.keyId.toString(),
itemData.lockId.toString(),
_failureDateTime.millisecondsSinceEpoch.toString(),
'',
'',
_effectiveDateTime.millisecondsSinceEpoch.toString(),
'', []);
[],
itemData.keyType!);
if (entity.errorCode!.codeIsSuccessful) {
print("修改要是名称成功啦啦啦啦啦");
EasyLoading.showToast('修改成功',duration: 2000.milliseconds);
EasyLoading.showToast('修改成功', duration: 2000.milliseconds);
setState(() {
Navigator.pop(context);
});

View File

@ -17,20 +17,22 @@ class ApiProvider extends BaseProvider {
}));
Future<Response> register(
int receiverType,
int countryCode,
String account,
String password,
String verificationCode,
) =>
post(registerUrl.toUrl, jsonEncode({
'receiverType': receiverType,
'countryCode': countryCode,
"account": account,
'password': password,
'verificationCode': verificationCode,
'platId': "2",
}));
int receiverType,
int countryCode,
String account,
String password,
String verificationCode,
) =>
post(
registerUrl.toUrl,
jsonEncode({
'receiverType': receiverType,
'countryCode': countryCode,
"account": account,
'password': password,
'verificationCode': verificationCode,
'platId': "2",
}));
// post(
// registerUrl.toUrl,
@ -97,16 +99,16 @@ class ApiProvider extends BaseProvider {
post(getCountryRegionURL.toUrl, jsonEncode({'type': type}));
Future<Response> electronicKeyList(
String endDate,
String keyId,
String keyStatus,
String keyRight,
String lockId,
String pageNo,
String pageSize,
String startDate,
String searchStr,
) =>
String endDate,
String keyId,
String keyStatus,
String keyRight,
String lockId,
String pageNo,
String pageSize,
String startDate,
String searchStr,
) =>
post(
electronicKeyListURL.toUrl,
jsonEncode({
@ -125,7 +127,7 @@ class ApiProvider extends BaseProvider {
String createUser,
String countryCode,
String usernameType,
String endDate,
int endDate,
String faceAuthentication,
String isCameraEnable,
String isRemoteUnlock,
@ -136,8 +138,10 @@ class ApiProvider extends BaseProvider {
String operatorUid,
String receiverUsername,
String remarks,
String startDate,
List weekDays) =>
int startDate,
List weekDays,
int startTime,
int endTime) =>
post(
sendElectronicKeyURL.toUrl,
jsonEncode({
@ -156,7 +160,9 @@ class ApiProvider extends BaseProvider {
'receiverUsername': receiverUsername,
'remarks': remarks,
'startDate': startDate,
'weekDays': weekDays
'weekDays': weekDays,
'startTime': startTime,
'endTime': endTime
}));
Future<Response> uploadElectricQuantity(
@ -196,26 +202,17 @@ class ApiProvider extends BaseProvider {
'operatorUid': operatorUid,
}));
Future<Response> updateKeyDate(
String keyId,
String lockId,
String endDate,
String endDay,
String operatorUid,
String startDate,
String startDay,
List weekDays) =>
Future<Response> updateKeyDate(String keyId, String lockId, String endDate,
String startDate, List weekDays, int keyType) =>
post(
updateKeyDateURL.toUrl,
jsonEncode({
'keyId': keyId,
'lockId': lockId,
'endDate': endDate,
'endDay': endDay,
'operatorUid': operatorUid,
'startDate': startDate,
'startDay': startDay,
'weekDays': weekDays,
'keyType': keyType
}));
Future<Response> resetElectronicKey(String lockId, String operatorUid) =>

View File

@ -1,6 +1,7 @@
import 'package:get/get.dart';
import 'package:star_lock/login/selectCountryRegion/common/countryRegionEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecordEntity.dart';
import 'package:star_lock/main/lockDetail/doorLockLog/doorLockLog_entity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyDetail/keyOperationRecord/keyOperationRecord_entity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserListEntity.dart';
import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendLockGroupListEntity.dart';
@ -143,7 +144,7 @@ class ApiRepository {
{required String createUser,
required String countryCode,
required String usernameType,
required String endDate,
required int endDate,
required String faceAuthentication,
required String isCameraEnable,
required String isRemoteUnlock,
@ -154,8 +155,10 @@ class ApiRepository {
required String operatorUid,
required String receiverUsername,
required String remarks,
required String startDate,
required List weekDays}) async {
required int startDate,
required List weekDays,
required int startTime,
required int endTime}) async {
final res = await apiProvider.sendElectronicKey(
createUser,
countryCode,
@ -172,7 +175,9 @@ class ApiRepository {
receiverUsername,
remarks,
startDate,
weekDays);
weekDays,
startTime,
endTime);
return AuthorizedAdminSendEntity.fromJson(res.body);
}
@ -218,7 +223,7 @@ class ApiRepository {
}
//
Future<KeyOperationRecordEntity> lockEventList({
Future<DoorLockLogEntity> lockEventList({
required int lockId,
required int lockEventType,
required int pageNo,
@ -234,7 +239,7 @@ class ApiRepository {
startDate,
endDate,
);
return KeyOperationRecordEntity.fromJson(res.body);
return DoorLockLogEntity.fromJson(res.body);
}
//
@ -324,17 +329,10 @@ class ApiRepository {
}
//
Future<KeyOperationRecordEntity> updateKeyDate(
String keyId,
String lockId,
String endDate,
String endDay,
String operatorUid,
String startDate,
String startDay,
List weekDays) async {
final res = await apiProvider.updateKeyDate(keyId, lockId, endDate, endDay,
operatorUid, startDate, startDay, weekDays);
Future<KeyOperationRecordEntity> updateKeyDate(String keyId, String lockId,
String endDate, String startDate, List weekDays, int keyType) async {
final res = await apiProvider.updateKeyDate(
keyId, lockId, endDate, startDate, weekDays, keyType);
return KeyOperationRecordEntity.fromJson(res.body);
}

View File

@ -0,0 +1,28 @@
import 'package:intl/intl.dart';
class XSDateUtils {
// DateTime对象格式化为指定格式的字符串
static String formatDateTime(DateTime dateTime, String format) {
DateFormat dateFormat = DateFormat(format);
return dateFormat.format(dateTime);
}
// DateTime对象
static DateTime parseDateTime(String dateString, String format) {
DateFormat dateFormat = DateFormat(format);
return dateFormat.parse(dateString);
}
}
// 使
// void main() {
// //
// DateTime now = DateTime.now();
// String formattedDateTime = DateUtils.formatDateTime(now, 'HH:mm');
// print('Formatted DateTime: $formattedDateTime');
// //
// String dateString = '08:30';
// DateTime parsedDateTime = DateUtils.parseDateTime(dateString, 'HH:mm');
// print('Parsed DateTime: $parsedDateTime');
// }

View File

@ -127,6 +127,7 @@ class _XSDropDownWidgetState extends State<XSDropDownWidget> {
child: Text(
item.itemTitle,
style: TextStyle(
fontSize: 24.sp,
color: item.itemValue == currentValue
? Colors.white
: Colors.black, //