fix: 调整操作记录中id和昵称的兼容显示

This commit is contained in:
liyi 2025-09-06 14:50:08 +08:00
parent 6b65661384
commit 694df0282f

View File

@ -82,8 +82,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
backgroundColor: AppColors.mainColor, backgroundColor: AppColors.mainColor,
actionsList: <Widget>[ actionsList: <Widget>[
Visibility( Visibility(
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 || visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 || CommonDataManage().currentKeyInfo.keyRight == 1,
CommonDataManage().currentKeyInfo.keyRight == 1,
child: GestureDetector( child: GestureDetector(
child: Image.asset( child: Image.asset(
'images/icon_tips_Q.png', 'images/icon_tips_Q.png',
@ -92,27 +91,20 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
color: Colors.white, color: Colors.white,
), ),
onTap: () { onTap: () {
ShowTipView().showSureAlertDialog( ShowTipView().showSureAlertDialog('1.锁没有联网密码、IC卡、指纹等开门记录无法实时上传可以点击右上角按钮然后读取记录。'.tr + '\n' + '2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录'.tr,
'1.锁没有联网密码、IC卡、指纹等开门记录无法实时上传可以点击右上角按钮然后读取记录。'.tr + tipTitle: '看不到操作记录,可能原因有'.tr, sureStr: '我知道了'.tr);
'\n' +
'2.如果您需要保留历史记录,可以点击右上角按钮,然后导出记录'.tr,
tipTitle: '看不到操作记录,可能原因有'.tr,
sureStr: '我知道了'.tr);
}, },
)), )),
Visibility( Visibility(
visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 || visible: CommonDataManage().currentKeyInfo.isLockOwner == 1 || CommonDataManage().currentKeyInfo.keyRight == 1,
CommonDataManage().currentKeyInfo.keyRight == 1,
child: PopupMenuButton<String>( child: PopupMenuButton<String>(
onSelected: _onMenuItemSelected, onSelected: _onMenuItemSelected,
color: Colors.black, color: Colors.black,
itemBuilder: (BuildContext context) { itemBuilder: (BuildContext context) {
return <PopupMenuEntry<String>>[ return <PopupMenuEntry<String>>[
_buildCustomPopupMenuItem('读取记录'.tr), _buildCustomPopupMenuItem('读取记录'.tr),
if (CommonDataManage().currentKeyInfo.isLockOwner == 1) if (CommonDataManage().currentKeyInfo.isLockOwner == 1) const PopupMenuDivider(),
const PopupMenuDivider(), if (CommonDataManage().currentKeyInfo.isLockOwner == 1) _buildCustomPopupMenuItem('清空记录'.tr),
if (CommonDataManage().currentKeyInfo.isLockOwner == 1)
_buildCustomPopupMenuItem('清空记录'.tr),
const PopupMenuDivider(), const PopupMenuDivider(),
_buildCustomPopupMenuItem('导出记录'.tr), _buildCustomPopupMenuItem('导出记录'.tr),
]; ];
@ -130,11 +122,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
body: Column( body: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[topAdvancedCalendarWidget(), eventDropDownWidget(), Expanded(child: timeLineView())],
topAdvancedCalendarWidget(),
eventDropDownWidget(),
Expanded(child: timeLineView())
],
), ),
floatingActionButton: Visibility( floatingActionButton: Visibility(
visible: _isAtBottom, visible: _isAtBottom,
@ -193,8 +181,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
builder: (BuildContext context) { builder: (BuildContext context) {
return ExportRecordDialog( return ExportRecordDialog(
onExport: (String filePath) { onExport: (String filePath) {
Get.toNamed(Routers.exportSuccessPage, Get.toNamed(Routers.exportSuccessPage, arguments: <String, String>{'filePath': filePath});
arguments: <String, String>{'filePath': filePath});
}, },
); );
}, },
@ -271,8 +258,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
String formatTimestampToDateTimeYYYYMMDD(int timestampMs) { String formatTimestampToDateTimeYYYYMMDD(int timestampMs) {
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestampMs); DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestampMs);
DateFormat formatter = DateFormat formatter = DateFormat('MM${''.tr}dd${''.tr}'); // 2025-08-18 14:30
DateFormat('MM${''.tr}dd${''.tr}'); // 2025-08-18 14:30
return formatter.format(dateTime); return formatter.format(dateTime);
} }
@ -300,103 +286,71 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
final recordType = item.recordType; final recordType = item.recordType;
switch (recordType) { switch (recordType) {
case 10: case 10:
if (item.username != null && item.username != '') { return '${formatTimestampToHHmm(item.operateDate!)} ' + '指纹'.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
return '${formatTimestampToHHmm(item.operateDate!)} ' +
'指纹'.tr +
'开锁'.tr +
'ID${item.username}';
} else {
return item.recordStr ?? '';
}
case 20: case 20:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' +
'密码'.tr + '密码'.tr +
'开锁'.tr + '开锁'.tr +
'${'昵称'.tr}${item.username}' + '${_formatUserNameOrId(item)}' +
'${'密码'.tr}${item.keyboardPwd}'; '${'密码'.tr}${item.keyboardPwd}';
case 30: case 30:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + ''.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
''.tr +
'开锁'.tr +
'${'昵称'.tr}${item.username}';
case 40: case 40:
if (item.username != null && item.username != '') { if (item.username != null && item.username != '') {
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '蓝牙'.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
'蓝牙'.tr +
'开锁'.tr +
'' +
'${'昵称'.tr}'.tr +
'${item.username}';
} else { } else {
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '蓝牙'.tr + '开锁'.tr + '' + 'ID'.tr + '${item.userid}';
'蓝牙'.tr +
'开锁'.tr +
'' +
'ID'.tr +
'${item.userid}';
} }
case 50: case 50:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '组合模式'.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
'组合模式'.tr +
'开锁'.tr +
'${'昵称'.tr}${item.username}';
case 60: case 60:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '添加'.tr + '指纹'.tr + '${_formatUserNameOrId(item)}';
'添加'.tr +
'指纹'.tr +
'${'昵称'.tr}${item.username}';
case 70: case 70:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '添加'.tr + '密码'.tr + '${_formatUserNameOrId(item)}';
'添加'.tr +
'密码'.tr +
'${'昵称'.tr}${item.username}';
case 80: case 80:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '添加'.tr + ''.tr + '${_formatUserNameOrId(item)}';
'添加'.tr +
''.tr +
'${'昵称'.tr}${item.username}';
case 90: case 90:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '删除'.tr + '指纹'.tr + '${_formatUserNameOrId(item)}';
'删除'.tr +
'指纹'.tr +
'${'昵称'.tr}${item.username}';
case 100: case 100:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '删除'.tr + '密码'.tr + '${_formatUserNameOrId(item)}';
'删除'.tr +
'密码'.tr +
'${'昵称'.tr}${item.username}';
case 110: case 110:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '删除'.tr + ''.tr + '${_formatUserNameOrId(item)}';
'删除'.tr +
''.tr +
'${'昵称'.tr}${item.username}';
case 160: case 160:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '人脸'.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
'人脸'.tr +
'开锁'.tr +
'${'昵称'.tr}${item.username}';
case 190: case 190:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '胁迫指纹'.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
'胁迫指纹'.tr +
'开锁'.tr +
'${'昵称'.tr}${item.username}';
case 200: case 200:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '胁迫密码'.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
'胁迫密码'.tr +
'开锁'.tr +
'${'昵称'.tr}${item.username}';
case 210: case 210:
return '${formatTimestampToHHmm(item.operateDate!)} ' + return '${formatTimestampToHHmm(item.operateDate!)} ' + '胁迫卡片'.tr + '开锁'.tr + '${_formatUserNameOrId(item)}';
'胁迫卡片'.tr +
'开锁'.tr +
'${'昵称'.tr}${item.username}';
default: default:
return item.recordStr ?? ''; return item.recordStr ?? '';
} }
} }
//
String _formatUserNameOrId(DoorLockLogDataItem item) {
final recordStr = item.recordStr;
final idMatch = RegExp(r'ID[:](\w+)').firstMatch(recordStr ?? '');
final idValue = idMatch?.group(1) ?? '';
final name = item.username ?? '';
// ID: ID ID:xxx
if (name.isNotEmpty) {
final idInNameMatch = RegExp(r'^ID[:].+').hasMatch(name);
if (idInNameMatch) {
return name; // "ID:123"
} else {
return '${'昵称'.tr}$name'; //
}
}
// 使 recordStr ID
return 'ID$idValue';
}
Color _buildTextColorByType(DoorLockLogDataItem item) { Color _buildTextColorByType(DoorLockLogDataItem item) {
final recordType = item.recordType; final recordType = item.recordType;
switch (recordType) { switch (recordType) {
@ -420,12 +374,9 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
contentsBuilder: (BuildContext context, int index) { contentsBuilder: (BuildContext context, int index) {
final DoorLockLogDataItem timelineData = state.lockLogItemList[index]; final DoorLockLogDataItem timelineData = state.lockLogItemList[index];
// 👇 videoUrl build // 👇 videoUrl build
int? firstVideoIndex = state.lockLogItemList int? firstVideoIndex = state.lockLogItemList.indexWhere((item) => _checkIsVideoOrImagesType(item));
.indexWhere((item) => _checkIsVideoOrImagesType(item));
bool isInvalid = _checkIsVideoOrImagesType(timelineData) && bool isInvalid = _checkIsVideoOrImagesType(timelineData) &&
((timelineData.imagesUrl == null && ((timelineData.imagesUrl == null && timelineData.videoUrl == null) || (timelineData.videoUrl == '' && timelineData.imagesUrl == ''));
timelineData.videoUrl == null) ||
(timelineData.videoUrl == '' && timelineData.imagesUrl == ''));
String typeText = ''; String typeText = '';
if (timelineData.recordType == 130) { if (timelineData.recordType == 130) {
@ -446,8 +397,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[ children: <Widget>[
Text( Text('${formatTimestampToDateTimeYYYYMMDD(timelineData.operateDate!)}',
'${formatTimestampToDateTimeYYYYMMDD(timelineData.operateDate!)}',
style: TextStyle( style: TextStyle(
fontSize: 20.sp, fontSize: 20.sp,
)), )),
@ -464,12 +414,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
), ),
children: [ children: [
TextSpan( TextSpan(
text: _buildIDByType(timelineData) + text: _buildIDByType(timelineData) + (isInvalid ? '${typeText}' + '已失效'.tr + '' : ''),
(isInvalid
? '${typeText}' +
'已失效'.tr +
''
: ''),
), ),
WidgetSpan( WidgetSpan(
alignment: PlaceholderAlignment.middle, alignment: PlaceholderAlignment.middle,
@ -504,8 +449,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
height: 12.h, height: 12.h,
), ),
Visibility( Visibility(
visible: _checkIsVideoOrImagesType(timelineData) && visible: _checkIsVideoOrImagesType(timelineData) && index == firstVideoIndex,
index == firstVideoIndex,
child: GestureDetector( child: GestureDetector(
onTap: () async { onTap: () async {
await logic.getWebPlayUrl(); await logic.getWebPlayUrl();
@ -580,9 +524,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
if (recordData.videoUrl != null && recordData.videoUrl!.isNotEmpty) { if (recordData.videoUrl != null && recordData.videoUrl!.isNotEmpty) {
final lockLogItemList = state.lockLogItemList.value; final lockLogItemList = state.lockLogItemList.value;
final list = lockLogItemList final list = lockLogItemList
.where((e) => .where((e) => (e.videoUrl != null && e.videoUrl!.isNotEmpty) || (e.imagesUrl != null && e.imagesUrl!.isNotEmpty))
(e.videoUrl != null && e.videoUrl!.isNotEmpty) ||
(e.imagesUrl != null && e.imagesUrl!.isNotEmpty))
.map( .map(
(e) => RecordListData( (e) => RecordListData(
videoUrl: e.videoUrl, videoUrl: e.videoUrl,
@ -593,16 +535,13 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
), ),
) )
.toList(); .toList();
final selectDateString = final selectDateString = DateTool().dateToYMDString(state.startDate.value.toString());
DateTool().dateToYMDString(state.startDate.value.toString()); final cloudStorageData = CloudStorageData(date: selectDateString, recordList: list);
final cloudStorageData =
CloudStorageData(date: selectDateString, recordList: list);
Get.toNamed(Routers.videoLogDetailPage, arguments: <String, Object>{ Get.toNamed(Routers.videoLogDetailPage, arguments: <String, Object>{
'recordData': recordData, 'recordData': recordData,
'videoDataList': [cloudStorageData] 'videoDataList': [cloudStorageData]
}); });
} else if (recordData.imagesUrl != null && } else if (recordData.imagesUrl != null && recordData.imagesUrl!.isNotEmpty) {
recordData.imagesUrl!.isNotEmpty) {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(
@ -613,8 +552,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
); );
} }
}, },
child: ((recordData.imagesUrl != null && recordData.imagesUrl != '') || child: ((recordData.imagesUrl != null && recordData.imagesUrl != '') || (recordData.videoUrl != null && recordData.videoUrl != ''))
(recordData.videoUrl != null && recordData.videoUrl != ''))
? Container( ? Container(
width: 260.w, width: 260.w,
height: 260.h, height: 260.h,
@ -632,8 +570,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
_buildImageOrVideoItem(RecordListData recordData) { _buildImageOrVideoItem(RecordListData recordData) {
if (recordData.videoUrl != null && recordData.videoUrl!.isNotEmpty) { if (recordData.videoUrl != null && recordData.videoUrl!.isNotEmpty) {
return _buildVideoItem(recordData); return _buildVideoItem(recordData);
} else if (recordData.imagesUrl != null && } else if (recordData.imagesUrl != null && recordData.imagesUrl!.isNotEmpty) {
recordData.imagesUrl!.isNotEmpty) {
return _buildImageItem(recordData); return _buildImageItem(recordData);
} else { } else {
return SizedBox.shrink(); return SizedBox.shrink();
@ -650,8 +587,7 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
child: Image.network( child: Image.network(
recordData.imagesUrl!, recordData.imagesUrl!,
fit: BoxFit.cover, fit: BoxFit.cover,
errorBuilder: errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) {
(BuildContext context, Object error, StackTrace? stackTrace) {
// //
return Image.asset( return Image.asset(
'images/icon_unHaveData.png', // 'images/icon_unHaveData.png', //
@ -749,11 +685,8 @@ class _DoorLockLogPageState extends State<DoorLockLogPage> with RouteAware {
print('外部收到选中: $date'); print('外部收到选中: $date');
state.operateDate = date.millisecondsSinceEpoch; state.operateDate = date.millisecondsSinceEpoch;
state.startDate.value = state.startDate.value = DateTime(date.year, date.month, date.day).millisecondsSinceEpoch;
DateTime(date.year, date.month, date.day).millisecondsSinceEpoch; state.endDate.value = DateTime(date.year, date.month, date.day, 23, 59, 59, 999).millisecondsSinceEpoch;
state.endDate.value =
DateTime(date.year, date.month, date.day, 23, 59, 59, 999)
.millisecondsSinceEpoch;
await logic.mockNetworkDataRequest(isRefresh: true); await logic.mockNetworkDataRequest(isRefresh: true);
}, },
onWeekChanged: (DateTime start, DateTime end) { onWeekChanged: (DateTime start, DateTime end) {