diff --git a/star_lock/lib/appRouters.dart b/star_lock/lib/appRouters.dart index 2892f065..7df05e49 100644 --- a/star_lock/lib/appRouters.dart +++ b/star_lock/lib/appRouters.dart @@ -8,8 +8,10 @@ import 'package:star_lock/main/lockDetail/electronicKey/massSendElectronicKey/ma import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_main_page.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEmail/minePersonInfoEmail_page.dart'; import 'package:star_lock/mine/mineSet/authorizedAdministrator/addAuthorizedAdministrator_page.dart'; +import 'package:star_lock/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart'; import 'package:star_lock/mine/mineSet/lockGroup/lockGroupList_page.dart'; -import 'package:star_lock/mine/mineSet/lockUserManage/lockUserManageList_page.dart'; +import 'package:star_lock/mine/mineSet/lockUserManage/expireLockList/expireLockList_page.dart'; +import 'package:star_lock/mine/mineSet/lockUserManage/lockUserManageList_Page.dart'; import 'package:star_lock/mine/mineSet/mineSet_page.dart'; import 'package:star_lock/mine/mineSet/transferGateway/selectGetewayList_page.dart'; import 'package:star_lock/mine/mineSet/transferSmartLock/recipientInformation_page.dart'; @@ -296,6 +298,8 @@ abstract class Routers { static const massSendLockGroupPage = '/massSendLockGroupPage'; //群发锁分组列表 static const massSendReceiverPage = '/massSendReceiverPage'; //群发接收人 static const lockUserListPage = '/lockUserListPage'; //锁用户列表 + static const administratorDetailsPage = '/administratorDetailsPage'; //管理员详情 + static const expireLockListPage = '/expireLockListPage'; //即将到期 } abstract class AppRouters { @@ -697,7 +701,7 @@ abstract class AppRouters { page: () => const AuthorizedAdministratorListPage()), GetPage( name: Routers.lockUserManageLisPage, - page: () => const LockUserManageListListPage()), + page: () => const LockUserManageListPage()), GetPage( name: Routers.lockGroupListPage, page: () => const LockGroupListPage()), GetPage( @@ -754,6 +758,12 @@ abstract class AppRouters { name: Routers.lockUserListPage, page: () => const LockUserListPage()), GetPage( name: Routers.checkInCreatCompanyPage, - page: () => const CheckInCreatCompanyPage()) + page: () => const CheckInCreatCompanyPage()), + GetPage( + name: Routers.administratorDetailsPage, + page: () => const AdministratorDetailsPage()), + GetPage( + name: Routers.expireLockListPage, + page: () => const ExpireLockListPage()) ]; } diff --git a/star_lock/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart b/star_lock/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart index 75b827f6..e47470b1 100644 --- a/star_lock/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart +++ b/star_lock/lib/main/lockDetail/authorizedAdmin/volumeAuthorizationLock/volumeAuthorizationLock_page.dart @@ -5,6 +5,7 @@ import 'package:flutter_pickers/pickers.dart'; import 'package:flutter_pickers/time_picker/model/date_mode.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/network/api_repository.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/toast.dart'; @@ -41,6 +42,8 @@ class _VolumeAuthorizationLockPageState var _selectFailureDate = ''; //失效时间 late DateTime _effectiveDateTime; late DateTime _failureDateTime; + String countryName = '中国'; + String countryCode = '86'; @override Widget build(BuildContext context) { @@ -116,6 +119,27 @@ class _VolumeAuthorizationLockPageState true, TranslationLoader.lanKeys!.pleaseEnterNumberOrEmail!.tr, _emailOrPhoneController)), + CommonItem( + leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, + rightTitle: "", + isHaveLine: true, + isHaveRightWidget: true, + isHaveDirection: true, + rightWidget: Text( + '$countryName +$countryCode', + textAlign: TextAlign.end, + style: + TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), + ), + action: () async { + var result = await Navigator.pushNamed( + context, Routers.seletCountryRegionPage); + result as Map; + countryCode = result['code']; + countryName = result['countryName']; + setState(() {}); + }, + ), CommonItem( leftTitel: TranslationLoader.lanKeys!.name!.tr, rightTitle: "", @@ -290,7 +314,7 @@ class _VolumeAuthorizationLockPageState _keyNameController.text, getEffectiveDateTime, _emailOrPhoneController.text, - '86', + countryCode, '1', ); if (entity.errorCode!.codeIsSuccessful) { diff --git a/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart b/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart index 6a105a21..f82551e1 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiverCell.dart @@ -100,7 +100,7 @@ class MassSendReceiverCell extends StatelessWidget { bool isHaveBtn, String tfStr, int lineIndex, LockUserData userData) { return SizedBox( height: 50.h, - width: 320.w, + width: 380.w, child: Row( children: [ Expanded( @@ -114,7 +114,7 @@ class MassSendReceiverCell extends StatelessWidget { textAlign: TextAlign.end, decoration: InputDecoration( //输入里面输入文字内边距设置 - contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0), + contentPadding: const EdgeInsets.only(top: -12.0, bottom: 0.0), hintText: tfStr, hintStyle: TextStyle(fontSize: 22.sp), //不需要输入框下划线 diff --git a/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart b/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart index b211cf54..d581d3da 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart @@ -39,7 +39,7 @@ class _MassSendReceiverPageState extends State { appBar: AppBar( backgroundColor: AppColors.mainColor, title: Text( - '接收者', + TranslationLoader.lanKeys!.receiver!.tr, style: TextStyle( color: Colors.white, fontSize: 28.sp, diff --git a/star_lock/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart b/star_lock/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart index fec53621..d43f16af 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/sendEmailNotification/sendEmailNotification_page.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get_utils/get_utils.dart'; +import 'package:star_lock/translations/trans_lib.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/commonItem.dart'; @@ -30,7 +32,7 @@ class _SendEmailNotificationPageState extends State { body: Column( children: [ CommonItem( - leftTitel: "接收者", + leftTitel: TranslationLoader.lanKeys!.receiver!.tr, rightTitle: "786612630@qq.com", isHaveLine: true, ), diff --git a/star_lock/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart b/star_lock/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart new file mode 100644 index 00000000..cc6c77a4 --- /dev/null +++ b/star_lock/lib/mine/mineSet/authorizedAdministrator/administratorDetails/administratorDetails_page.dart @@ -0,0 +1,272 @@ +import 'package:flutter/cupertino.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/electronicKeyList/entity/ElectronicKeyListEntity.dart'; +import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/jh_pop_menus.dart'; +import 'package:star_lock/tools/toast.dart'; +import 'package:star_lock/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart'; + +import '../../../../../appRouters.dart'; +import '../../../../../app_settings/app_colors.dart'; +import '../../../../../tools/commonItem.dart'; +import '../../../../../tools/showTFView.dart'; +import '../../../../../tools/submitBtn.dart'; +import '../../../../../tools/titleAppBar.dart'; +import '../../../../../translations/trans_lib.dart'; + +class AdministratorDetailsPage extends StatefulWidget { + const AdministratorDetailsPage({Key? key}) : super(key: key); + + @override + State createState() => + _AdministratorDetailsPageState(); +} + +class _AdministratorDetailsPageState extends State { + final TextEditingController _changeNameController = TextEditingController(); + AuthorizedAdminListItem itemData = AuthorizedAdminListItem(); + + @override + Widget build(BuildContext context) { + dynamic obj = ModalRoute.of(context)?.settings.arguments; + if (obj != null && (obj["itemData"] != null)) { + itemData = obj["itemData"]; + } + + return Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: '管理员详情', + haveBack: true, + actionsList: [ + IconButton( + icon: Image.asset( + 'images/icon_bar_more.png', + height: 30.h, + width: 10.w, + ), + onPressed: () { + JhPopMenus.showLinePop(context, + clickCallback: (index, selText) { + print('选中index: $index'); + print('选中text: $selText'); + }, listData: [ + {'text': '冻结'}, + {'text': '取消授权'} + ]); + }, + ), + ], + backgroundColor: AppColors.mainColor), + body: Column( + children: [ + CommonItem( + leftTitel: TranslationLoader.lanKeys!.name!.tr, + rightTitle: _changeNameController.text.isNotEmpty + ? _changeNameController.text + : itemData.name, + isHaveDirection: true, + isHaveLine: true, + action: () { + showCupertinoAlertDialog(context); + }), + CommonItem( + leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr, + allHeight: 90.h, + rightTitle: getUseDateStr(itemData), + isHaveDirection: true, + action: () { + Navigator.pushNamed( + context, Routers.electronicKeyDetailChangeDate, + arguments: {"itemData": itemData}); + }), + Container(height: 10.h), + CommonItem( + leftTitel: TranslationLoader.lanKeys!.lock!.tr, + rightTitle: itemData.lockNum.toString(), + isHaveDirection: true, + action: () { + //锁列表 + }), + Container(height: 10.h), + CommonItem( + leftTitel: TranslationLoader.lanKeys!.remoteUnlocking!.tr, + rightTitle: "", + isHaveRightWidget: true, + rightWidget: SizedBox( + width: 60.w, + child: _switch(itemData.isRemoteUnlock == 1 ? true : false)), + action: () {}), + Container(height: 40.h), + SubmitBtn( + btnName: TranslationLoader.lanKeys!.delete!.tr, + borderRadius: 20.w, + isDelete: true, + margin: EdgeInsets.only( + left: 30.w, right: 30.w, top: 30.w, bottom: 30.w), + padding: EdgeInsets.only(top: 25.w, bottom: 25.w), + onClick: () { + deleteAdministratorRequest(); + }), + ], + ), + ); + } + + //使用期限 + String getUseDateStr(AuthorizedAdminListItem indexEntity) { + String useDateStr = ''; + if (indexEntity.keyType == 1) { + //限期 + DateTime startDateStr = + DateTime.fromMillisecondsSinceEpoch(indexEntity.startDate!); + DateTime endDateStr = + DateTime.fromMillisecondsSinceEpoch(indexEntity.endDate!); + useDateStr = + '${startDateStr.toLocal().toString().substring(0, 16)}\n${endDateStr.toLocal().toString().substring(0, 16)}'; + } else if (indexEntity.keyType == 2) { + //永久 + DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(indexEntity.date!); + useDateStr = '${dateStr.toLocal().toString().substring(0, 16)} 永久'; + } else if (indexEntity.keyType == 3) { + //单次 + DateTime dateStr = DateTime.fromMillisecondsSinceEpoch(indexEntity.date!); + useDateStr = '${dateStr.toLocal().toString().substring(0, 16)} 单次'; + } else if (indexEntity.keyType == 4) { + //循环 + useDateStr = '循环'; + } + + return useDateStr; + } + + Widget commonItem(String leftTitle, String rightTitle, + {bool isHaveDirection = false, + bool isHaveLine = false, + bool isHaveRightWidget = false, + Widget? rightWidget, + Function()? action}) { + return GestureDetector( + onTap: action, + child: Column( + // mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + // height: 80.h, + color: Colors.white, + padding: EdgeInsets.only( + left: 20.w, right: 10.w, top: 20.w, bottom: 20.w), + child: Row( + children: [ + SizedBox(width: 20.w), + Text( + leftTitle, + style: + TextStyle(fontSize: 28.sp, fontWeight: FontWeight.w500), + ), + SizedBox(width: 20.w), + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + isHaveRightWidget + ? rightWidget! + : Text( + rightTitle, + textAlign: TextAlign.end, + style: TextStyle( + fontSize: 28.sp, fontWeight: FontWeight.w500), + ) + ], + ), + ), + SizedBox(width: 5.w), + isHaveDirection + ? Image.asset( + 'images/icon_right.png', + width: 50.w, + height: 50.w, + ) + : SizedBox(width: 10.w), + // SizedBox(width:10.w), + ], + ), + ), + isHaveLine + ? Container( + height: 0.5.h, + color: Colors.grey, + ) + : Container() + ], + ), + ); + } + + CupertinoSwitch _switch(isOn) { + return CupertinoSwitch( + activeColor: CupertinoColors.activeBlue, + trackColor: CupertinoColors.systemGrey5, + thumbColor: CupertinoColors.white, + value: isOn, + onChanged: (value) { + setState(() { + isOn = value; + }); + }, + ); + } + + //更新管理员信息请求 + Future updateAdministratorRequest() async { + ElectronicKeyListEntity entity = await ApiRepository.to.updateAdministrator( + itemData.uid.toString(), _changeNameController.text, '', '', ''); + if (entity.errorCode!.codeIsSuccessful) { + print("修改管理员信息成功啦啦啦啦啦"); + Toast.show(msg: "修改成功"); + setState(() { + Navigator.pop(context); + }); + } + } + + //删除授权管理员请求 + Future deleteAdministratorRequest() async { + ElectronicKeyListEntity entity = + await ApiRepository.to.deleteAdministrator(itemData.uid.toString(), ''); + if (entity.errorCode!.codeIsSuccessful) { + print("删除电子钥匙成功"); + Toast.show(msg: "删除成功"); + setState(() { + Navigator.pop(context); + }); + } + } + + void showCupertinoAlertDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return ShowTFView( + title: + "${TranslationLoader.lanKeys!.amend!.tr} ${TranslationLoader.lanKeys!.name!.tr}", + tipTitle: "请输入", + controller: _changeNameController, + sureClick: () { + //发送编辑钥匙名称请求 + if (_changeNameController.text.isNotEmpty) { + updateAdministratorRequest(); + } + }, + cancelClick: () { + Navigator.pop(context); + }, + ); + }, + ); + } +} diff --git a/star_lock/lib/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart b/star_lock/lib/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart new file mode 100644 index 00000000..47a035e5 --- /dev/null +++ b/star_lock/lib/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart @@ -0,0 +1,122 @@ +class AuthorizedAdminListEntity { + int? errorCode; + String? description; + String? errorMsg; + AuthorizedAdminListData? data; + + AuthorizedAdminListEntity( + {this.errorCode, this.description, this.errorMsg, this.data}); + + AuthorizedAdminListEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + data = json['data'] != null + ? AuthorizedAdminListData.fromJson(json['data']) + : null; + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + return data; + } +} + +class AuthorizedAdminListData { + List? itemList; + int? pageNo; + int? pageSize; + int? pages; + int? total; + + AuthorizedAdminListData( + {this.itemList, this.pageNo, this.pageSize, this.pages, this.total}); + + AuthorizedAdminListData.fromJson(Map json) { + if (json['list'] != null) { + itemList = []; + json['list'].forEach((v) { + itemList!.add(AuthorizedAdminListItem.fromJson(v)); + }); + } + pageNo = json['pageNo']; + pageSize = json['pageSize']; + pages = json['pages']; + total = json['total']; + } + + Map toJson() { + final Map data = {}; + 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 AuthorizedAdminListItem { + int? uid; + int? keyStatus; + int? lockNum; + int? endDate; + int? startDate; + String? name; + String? headUrl; + String? userid; + int? keyType; + int? date; + int? isRemoteUnlock; + + AuthorizedAdminListItem( + {this.uid, + this.keyStatus, + this.lockNum, + this.endDate, + this.startDate, + this.name, + this.headUrl, + this.userid, + this.keyType, + this.date, + this.isRemoteUnlock}); + + AuthorizedAdminListItem.fromJson(Map json) { + uid = json['uid']; + keyStatus = json['keyStatus']; + lockNum = json['lockNum']; + endDate = json['endDate']; + startDate = json['startDate']; + name = json['name']; + headUrl = json['headUrl']; + userid = json['userid']; + keyType = json['keyType']; + date = json['date']; + isRemoteUnlock = json['isRemoteUnlock']; + } + + Map toJson() { + final Map data = {}; + data['uid'] = uid; + data['keyStatus'] = keyStatus; + data['lockNum'] = lockNum; + data['endDate'] = endDate; + data['startDate'] = startDate; + data['name'] = name; + data['headUrl'] = headUrl; + data['userid'] = userid; + data['keyType'] = keyType; + data['date'] = date; + data['isRemoteUnlock'] = isRemoteUnlock; + return data; + } +} diff --git a/star_lock/lib/mine/mineSet/authorizedAdministrator/authorizedAdministratorList_page.dart b/star_lock/lib/mine/mineSet/authorizedAdministrator/authorizedAdministratorList_page.dart index 20be0f8a..ea44142d 100644 --- a/star_lock/lib/mine/mineSet/authorizedAdministrator/authorizedAdministratorList_page.dart +++ b/star_lock/lib/mine/mineSet/authorizedAdministrator/authorizedAdministratorList_page.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:star_lock/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart'; +import 'package:star_lock/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; import '../../../../appRouters.dart'; import '../../../../app_settings/app_colors.dart'; @@ -17,6 +20,13 @@ class AuthorizedAdministratorListPage extends StatefulWidget { class _AuthorizedAdministratorListPageState extends State { + @override + void initState() { + super.initState(); + + mockNetworkDataRequest(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -40,15 +50,49 @@ class _AuthorizedAdministratorListPageState ), ], ), - body: Column( - children: [ - _searchWidget(), - Expanded(child: _buildMainUI()), - ], - ), + body: FutureBuilder>( + future: mockNetworkDataRequest(), + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + //请求结束 + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasError) { + //请求失败 + return const Text('请求失败'); + } else { + //请求成功 + final List itemList = snapshot.data!; + + return Column( + children: [ + _searchWidget(), + Expanded(child: _buildMainUI(itemList)), + ], + ); + } + } else { + //请求未结束 显示loading + return Container(); + } + }), ); } + //请求授权管理员列表 + Future> mockNetworkDataRequest() async { + AuthorizedAdminListEntity entity = + await ApiRepository.to.authorizedAdminList('1', '20'); + if (entity.errorCode!.codeIsSuccessful) { + print("授权管理员列表成功:${entity.data?.itemList}"); + } + if (entity.data != null) { + return entity.data!.itemList!; + } else { + List dataList = []; + return dataList; + } + } + Widget _searchWidget() { return Container( height: 60.h, @@ -84,22 +128,21 @@ class _AuthorizedAdministratorListPageState ); } - Widget _buildMainUI() { + Widget _buildMainUI(List itemList) { return ListView.builder( - itemCount: 5, + itemCount: itemList.length, itemBuilder: (c, index) { - return _electronicKeyItem('images/controls_user.png', "张三", - "2023.6.21 11.15", "2023.6.21 11.15", () { - // Navigator.pushNamed(context, Routers.authorizedAdminDetailPage); - Navigator.pushNamed(context, Routers.electronicKeyDetailPage); - }); + AuthorizedAdminListItem itemData = itemList[index]; + return _electronicKeyItem(itemData); }); } - Widget _electronicKeyItem(String lockTypeIcon, String lockTypeTitle, - String beginTime, String endTime, Function() action) { + Widget _electronicKeyItem(AuthorizedAdminListItem itemData) { return GestureDetector( - onTap: action, + onTap: () { + Navigator.pushNamed(context, Routers.administratorDetailsPage, + arguments: {'itemData': itemData}); + }, child: Container( height: 100.h, margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w), @@ -113,7 +156,7 @@ class _AuthorizedAdministratorListPageState width: 30.w, ), Image.asset( - lockTypeIcon, + 'images/controls_user.png', width: 60.w, height: 60.w, ), @@ -128,7 +171,7 @@ class _AuthorizedAdministratorListPageState mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - lockTypeTitle, + itemData.name ?? '', style: TextStyle( fontSize: 24.sp, color: AppColors.blackColor), ), @@ -156,4 +199,33 @@ class _AuthorizedAdministratorListPageState ), ); } + + //使用期限 + String getUseDateStr(AuthorizedAdminListItem indexEntity) { + String useDateStr = ''; + if (indexEntity.keyType == 1) { + //限期 + if (indexEntity.startDate != null && indexEntity.endDate != null) { + DateTime startDateStr = + DateTime.fromMillisecondsSinceEpoch(indexEntity.startDate!); + DateTime endDateStr = + DateTime.fromMillisecondsSinceEpoch(indexEntity.endDate!); + useDateStr = + '${startDateStr.toLocal().toString().substring(0, 16)}-${endDateStr.toLocal().toString().substring(0, 16)}'; + } else { + useDateStr = '限期'; + } + } else if (indexEntity.keyType == 2) { + //永久 + useDateStr = '永久'; + } else if (indexEntity.keyType == 3) { + //单次 + useDateStr = '单次'; + } else if (indexEntity.keyType == 4) { + //循环 + useDateStr = '循环'; + } + + return useDateStr; + } } diff --git a/star_lock/lib/mine/mineSet/lockUserManage/expireLockList/expireLockList_page.dart b/star_lock/lib/mine/mineSet/lockUserManage/expireLockList/expireLockList_page.dart new file mode 100644 index 00000000..42c5db0e --- /dev/null +++ b/star_lock/lib/mine/mineSet/lockUserManage/expireLockList/expireLockList_page.dart @@ -0,0 +1,144 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.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/network/api_repository.dart'; +import 'package:star_lock/tools/baseGetXController.dart'; + +import '../../../../appRouters.dart'; +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; +import '../../../../translations/trans_lib.dart'; + +class ExpireLockListPage extends StatefulWidget { + const ExpireLockListPage({Key? key}) : super(key: key); + + @override + State createState() => _ExpireLockListPageState(); +} + +class _ExpireLockListPageState extends State { + List dataList = []; + + @override + void initState() { + super.initState(); + + expireLockListRequest(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: '即将到期', + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + TextButton( + child: Text( + TranslationLoader.lanKeys!.aboutToExpire!.tr, + style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + onPressed: () {}, + ), + ], + ), + body: _buildMainUI(), + ); + } + + Widget _buildMainUI() { + return ListView.separated( + itemCount: dataList.length, + itemBuilder: (c, index) { + LockUserData indexEntity = dataList[index]; + return _electronicKeyItem(indexEntity); + }, + separatorBuilder: (BuildContext context, int index) { + return const Divider( + height: 1, + color: AppColors.greyLineColor, + ); + }, + ); + } + + //请求锁用户列表 + Future> expireLockListRequest() async { + ElectronicKeyListEntity entity = + await ApiRepository.to.expireLockList('0', '1', '20'); + // if (entity.errorCode!.codeIsSuccessful) { + // setState(() { + // dataList = entity.data! as List; + // // dataList = entity.data!; + // }); + // } + return dataList; + } + + Widget _electronicKeyItem(LockUserData itemData) { + return GestureDetector( + onTap: () { + Navigator.pushNamed(context, Routers.ownedKeyListPage, + arguments: {'uid': itemData.uid}); + }, + child: Container( + height: 90.h, + color: Colors.white, + // decoration: BoxDecoration( + // color: Colors.white, + // borderRadius: BorderRadius.circular(10.w), + // ), + child: Row( + children: [ + SizedBox( + width: 30.w, + ), + Image.asset( + 'images/controls_user.png', + width: 60.w, + height: 60.w, + ), + SizedBox( + width: 20.w, + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + itemData.nickname ?? '', + style: TextStyle( + fontSize: 24.sp, color: AppColors.blackColor), + ), + ], + ), + SizedBox(height: 5.h), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + itemData.userid ?? '', + style: TextStyle( + fontSize: 18.sp, + color: AppColors.placeholderTextColor), + ), + ], + ), + SizedBox(width: 20.h), + ], + ), + ), + SizedBox(width: 20.w), + ], + ), + ), + ); + } +} diff --git a/star_lock/lib/mine/mineSet/lockUserManage/lockUserManageList_page.dart b/star_lock/lib/mine/mineSet/lockUserManage/lockUserManageList_page.dart index ee754ba6..6236370c 100644 --- a/star_lock/lib/mine/mineSet/lockUserManage/lockUserManageList_page.dart +++ b/star_lock/lib/mine/mineSet/lockUserManage/lockUserManageList_page.dart @@ -10,16 +10,14 @@ import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; import '../../../../translations/trans_lib.dart'; -class LockUserManageListListPage extends StatefulWidget { - const LockUserManageListListPage({Key? key}) : super(key: key); +class LockUserManageListPage extends StatefulWidget { + const LockUserManageListPage({Key? key}) : super(key: key); @override - State createState() => - _LockUserManageListListPageState(); + State createState() => _LockUserManageListPageState(); } -class _LockUserManageListListPageState - extends State { +class _LockUserManageListPageState extends State { List dataList = []; @override @@ -43,7 +41,9 @@ class _LockUserManageListListPageState TranslationLoader.lanKeys!.aboutToExpire!.tr, style: TextStyle(color: Colors.white, fontSize: 24.sp), ), - onPressed: () {}, + onPressed: () { + Navigator.pushNamed(context, Routers.expireLockListPage); + }, ), ], ), @@ -66,7 +66,7 @@ class _LockUserManageListListPageState context, Routers.massSendElectronicKeyManagePage); }, child: Text( - '群发钥匙', + TranslationLoader.lanKeys!.sendGroupKey!.tr, style: TextStyle( color: AppColors.mainColor, fontSize: 24.sp, diff --git a/star_lock/lib/mine/mineSet/lockUserManage/ownedKeyList_page.dart b/star_lock/lib/mine/mineSet/lockUserManage/ownedKeyList_page.dart index 3cf2004b..539c7b24 100644 --- a/star_lock/lib/mine/mineSet/lockUserManage/ownedKeyList_page.dart +++ b/star_lock/lib/mine/mineSet/lockUserManage/ownedKeyList_page.dart @@ -32,22 +32,38 @@ class _OwnedKeyListPageState extends State { getUidStr = obj["uid"].toString(); } - keyListByUserRequest(); - return Scaffold( - backgroundColor: AppColors.mainBackgroundColor, - appBar: TitleAppBar( - barTitle: TranslationLoader.lanKeys!.ownedKey!.tr, - haveBack: true, - backgroundColor: AppColors.mainColor, - ), - body: Column( - children: [ - _topOwnedKeyText(), - Expanded(child: _buildMainUI()), - ], - ), - ); + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: TranslationLoader.lanKeys!.ownedKey!.tr, + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + body: FutureBuilder>( + future: mockNetworkDataRequest(), + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + //请求结束 + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasError) { + //请求失败 + return const Text('请求失败'); + } else { + //请求成功 + final List itemList = snapshot.data!; + + return Column( + children: [ + _topOwnedKeyText(), + Expanded(child: _buildMainUI(itemList)), + ], + ); + } + } else { + //请求未结束 显示loading + return Container(); + } + })); } Widget _topOwnedKeyText() { @@ -67,15 +83,18 @@ class _OwnedKeyListPageState extends State { } //请求用户拥有的锁 - Future> keyListByUserRequest() async { + Future> mockNetworkDataRequest() async { KeyListByUserEntity entity = await ApiRepository.to.keyListByUser('1', '20', getUidStr); if (entity.errorCode!.codeIsSuccessful) { - setState(() { - dataList = entity.data!.keyList!; - }); + print("请求用户拥有的锁:${entity.data!.keyList}"); + } + if (entity.data != null) { + return entity.data!.keyList!; + } else { + List dataList = []; + return dataList; } - return []; } //使用期限 @@ -107,11 +126,11 @@ class _OwnedKeyListPageState extends State { return useDateStr; } - Widget _buildMainUI() { + Widget _buildMainUI(List itemList) { return ListView.builder( - itemCount: dataList.length, + itemCount: itemList.length, itemBuilder: (c, index) { - KeyListItem itemData = dataList[index]; + KeyListItem itemData = itemList[index]; return _electronicKeyItem(itemData); }); } @@ -147,7 +166,7 @@ class _OwnedKeyListPageState extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - itemData.keyName ?? '', + itemData.lockAlias ?? '', style: TextStyle( fontSize: 24.sp, color: AppColors.blackColor), ), diff --git a/star_lock/lib/network/api.dart b/star_lock/lib/network/api.dart index b1183ee1..d9f934fa 100644 --- a/star_lock/lib/network/api.dart +++ b/star_lock/lib/network/api.dart @@ -54,9 +54,12 @@ abstract class Api { final String lockDiagnoseUrl = '/room/uploadLockInfo'; // 锁诊断 final String getServerDatetimeUrl = '/check/getServerDatetime'; // 获取服务器当前时间 final String getLockVersionInfoUrl = '/room/update'; // 获取锁当前版本信息 - final String openCheckingInURL = '/attendanceCompany/isExistenceCompany'; // 开启考勤获取是否有公司 - final String setCheckInCreateCompanyURL = '/attendanceCompany/add'; // 设置考勤时创建公司 - final String setLockPickingReminderDataURL = '/key/updateMonitorFlag'; // 设置开锁提醒 + final String openCheckingInURL = + '/attendanceCompany/isExistenceCompany'; // 开启考勤获取是否有公司 + final String setCheckInCreateCompanyURL = + '/attendanceCompany/add'; // 设置考勤时创建公司 + final String setLockPickingReminderDataURL = + '/key/updateMonitorFlag'; // 设置开锁提醒 final String getStaffListURL = '/staff/list'; // 获取员工列表 final String addStaffURL = '/staff/add'; // 添加员工 @@ -67,4 +70,9 @@ abstract class Api { final String batchSendKeyURL = '/key/batchSend'; //批处理群发钥匙 final String addAuthorizedAdminURL = '/authorizedAdmin/add'; //增加授权管理员 final String keyListByUserURL = '/keyUser/listByUse'; //用户拥有的锁 + final String authorizedAdminListURL = '/authorizedAdmin/list'; //授权管理员列表 + final String deleteAdministratorURL = '/authorizedAdmin/delete'; //删除授权管理员 + final String updateAdministratorURL = + '/authorizedAdmin/update'; //管理员姓名/有效期/远程开锁修改 + final String expireLockListURL = '/keyUser/listExpireUser'; //即将到期的锁列表 } diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 57383fd9..35025db7 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -403,11 +403,38 @@ class ApiProvider extends BaseProvider { jsonEncode({'lockId': lockId, 'groupId': groupId})); Future lockGroupList(String type) => - post(lockGroupListURL.toUrl, jsonEncode({'type': type})); + post(lockGroupListURL.toUrl, jsonEncode({'type': type}), + isShowLoading: true); Future deleteElectronicKey(String keyId) => post(deleteElectronicKeyURL.toUrl, jsonEncode({'keyId': keyId})); + Future deleteAdministrator(String uid, String includeUnderlings) => + post(deleteElectronicKeyURL.toUrl, + jsonEncode({'uid': uid, 'includeUnderlings': includeUnderlings})); + + Future updateAdministrator(String uid, String name, String endDate, + String startDate, String isRemoteUnlock) => + post( + deleteElectronicKeyURL.toUrl, + jsonEncode({ + 'uid': uid, + 'name': name, + 'endDate': endDate, + 'startDate': startDate, + 'isRemoteUnlock': isRemoteUnlock + })); + + Future expireLockList( + String operatorUid, String pageNo, String pageSize) => + post( + expireLockListURL.toUrl, + jsonEncode({ + 'operatorUid': operatorUid, + 'pageNo': pageNo, + 'pageSize': pageSize, + })); + Future deleteKeyboardPwd( String lockId, String keyboardPwdId, String deleteType) => post( @@ -616,15 +643,19 @@ class ApiProvider extends BaseProvider { String pageNo, String pageSize, String searchStr) => post( lockUserListURL.toUrl, - jsonEncode({ - 'pageNo': pageNo, - 'pageSize': pageSize, - 'searchStr': searchStr - })); + jsonEncode( + {'pageNo': pageNo, 'pageSize': pageSize, 'searchStr': searchStr}), + isShowLoading: true); Future keyListByUser(String pageNo, String pageSize, String uid) => post(keyListByUserURL.toUrl, - jsonEncode({'pageNo': pageNo, 'pageSize': pageSize, 'uid': uid})); + jsonEncode({'pageNo': pageNo, 'pageSize': pageSize, 'uid': uid}), + isShowLoading: true); + + Future authorizedAdminList(String pageNo, String pageSize) => post( + authorizedAdminListURL.toUrl, + jsonEncode({'pageNo': pageNo, 'pageSize': pageSize}), + isShowLoading: true); Future canSendKey( String endDate, List keyGroupIdList, List lockIdList) => diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index 88584a94..2f6fbb09 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -8,6 +8,7 @@ import 'package:star_lock/main/lockDetail/lcokSet/basicInformation/basicInformat import 'package:star_lock/main/lockDetail/lcokSet/basicInformation/lockSeletGrouping/LockGroupListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart'; +import 'package:star_lock/mine/mineSet/authorizedAdministrator/authorizedAdminListEntity.dart'; import 'package:star_lock/mine/mineSet/lockUserManage/keyListByUserEntity.dart'; import '../common/safetyVerification/entity/CheckSafetyVerificationEntity.dart'; import '../common/safetyVerification/entity/SafetyVerificationEntity.dart'; @@ -382,6 +383,28 @@ class ApiRepository { return ElectronicKeyListEntity.fromJson(res.body); } + //删除授权管理员 + Future deleteAdministrator( + String uid, String includeUnderlings) async { + final res = await apiProvider.deleteAdministrator(uid, includeUnderlings); + return ElectronicKeyListEntity.fromJson(res.body); + } + + //更新授权管理员 + Future updateAdministrator(String uid, String name, + String endDate, String startDate, String isRemoteUnlock) async { + final res = await apiProvider.updateAdministrator( + uid, name, endDate, startDate, isRemoteUnlock); + return ElectronicKeyListEntity.fromJson(res.body); + } + + //即将到期的锁列表 + Future expireLockList( + String operatorUid, String pageNo, String pageSize) async { + final res = await apiProvider.expireLockList(operatorUid, pageNo, pageSize); + return ElectronicKeyListEntity.fromJson(res.body); + } + //删除密码 Future deleteKeyboardPwd( String lockId, String keyboardPwdId, String deleteType) async { @@ -541,7 +564,7 @@ class ApiRepository { return LockUserListEntity.fromJson(res.body); } - //用户拥有的锁 + //用户拥有的钥匙 Future keyListByUser( String pageNo, String pageSize, String uid) async { final res = await apiProvider.keyListByUser(pageNo, pageSize, uid); @@ -610,6 +633,13 @@ class ApiRepository { return KeyDetailEntity.fromJson(res.body); } + //授权管理员列表 + Future authorizedAdminList( + String pageNo, String pageSize) async { + final res = await apiProvider.authorizedAdminList(pageNo, pageSize); + return AuthorizedAdminListEntity.fromJson(res.body); + } + // 开启考勤 获取考勤信息 Future openCheckingInData( {required String lockId}) async {