feat(ops): 增加运维面板及诊断导出功能

- 添加运维面板OpsActivity及对应布局,展示设备状态、网络、MQTT、人脸数据等信息
- 实现诊断包导出工具DiagnosticExporter,支持将设备信息和日志导出到U盘
- 新增设备健康信息获取工具DeviceInfoProvider,提供运行时长、内存和存储信息
- 实现运行时日志写入文件FileLoggingTree,支持按天滚动、切分与过期清理
- 增加日志文件管理LogFileManager,支持列出、读取尾部和清理日志文件
- 丰富MQTT管理器MqttManager,记录连接状态、错误、连接次数等详情并支持手动重连
- 为环境切换引入EnvironmentSwitcher,实现基础地址切换和清空本地人脸库后自动重启
- 扩展ArcFace人脸库接口,支持查询最近更新人脸及按userId精确搜索
- MainActivity增加运维面板入口,管理员列表页右上角双击时间触发打开
- 应用启动时种植FileLoggingTree,确保运行日志同时输出至文件和控制台
This commit is contained in:
mazengfei
2026-09-02 17:47:24 +08:00
parent 994bcf5bc2
commit 8bcc5a0289
18 changed files with 1633 additions and 1 deletions
@@ -131,6 +131,37 @@ public class FaceApi {
return getFaceDao().queryAllByUserName(userName);
}
/**
* 按服务端更新时间倒序取最近更新的 N 条人脸记录(运维面板展示)
*/
public List<FaceEntity> queryRecentUpdatedFaces(int limit) {
return getFaceDao().getRecentUpdatedFaces(limit);
}
/**
* 库内最大的服务端更新时间戳(无记录返回 null)
*/
public Long queryMaxFaceUpdateTimestamp() {
return getFaceDao().getMaxFaceUpdateTimestamp();
}
/**
* 按 userId 精确过滤(运维面板搜索用)
*/
public List<FaceEntity> queryByUserId(String userId, int limit) {
if (TextUtils.isEmpty(userId)) {
return new java.util.ArrayList<>();
}
return getFaceDao().queryByUserId(userId, limit);
}
/**
* 按 member 布尔统计人脸数(true-会员,false-非会员)
*/
public int queryFaceCountByMember(boolean member) {
return getFaceDao().getFaceCountByMember(member);
}
public FaceDao getFaceDao() {
return FaceDatabase.getInstance(App.getContext()).faceDao();
}
@@ -125,4 +125,28 @@ public interface FaceDao {
*/
@Query("SELECT COUNT(1) FROM face WHERE user_type = :userType")
int getFaceCountByUserType(int userType);
/**
* 按服务端更新时间倒序取最近更新的 N 条人脸记录(运维面板展示)
*/
@Query("SELECT * FROM face ORDER BY face_update_timestamp DESC LIMIT :limit")
List<FaceEntity> getRecentUpdatedFaces(int limit);
/**
* 库内最大的服务端更新时间戳(无记录时返回 null)
*/
@Query("SELECT MAX(face_update_timestamp) FROM face")
Long getMaxFaceUpdateTimestamp();
/**
* 按 userId 精确过滤(运维面板搜索用)
*/
@Query("SELECT * FROM face WHERE user_id = :userId ORDER BY faceId DESC LIMIT :limit")
List<FaceEntity> queryByUserId(String userId, int limit);
/**
* 按 member 布尔统计人脸数(true-会员,false-非会员;比 user_type 更可靠,user_type 存的是服务端 personType 字符串)
*/
@Query("SELECT COUNT(1) FROM face WHERE member = :member")
int getFaceCountByMember(boolean member);
}
@@ -44,4 +44,25 @@ public class SerialApi {
serialPortManager.close();
}
}
/**
* 串口是否已打开(运维面板展示用)
*/
public static boolean isOpened() {
return serialPort != null;
}
/**
* 串口设备路径(运维面板展示用)
*/
public static String getPath() {
return path;
}
/**
* 串口波特率(运维面板展示用)
*/
public static int getBaudRate() {
return speed;
}
}