uploadLogs method

Future<bool> uploadLogs()

Implementation

Future<bool> uploadLogs() async {
  try {
    getEventBus().fire(MainEvent(type: EventTypeEnum.startUploadLogs));
    final logFilePath = TCICConst.logFilePath;
    if (logFilePath == null || logFilePath.isEmpty) {
      TCICLog.error("logFilePath is empty", actionModule: ActionModule.tcicController.name, actionName: ActionName.uploadLogs.name);
      return false;
    }

    final dir = Directory(logFilePath);
    if (!await dir.exists()) {
      TCICLog.error("dir not found", actionModule: ActionModule.tcicController.name, actionName: ActionName.uploadLogs.name);
      return false;
    }

    // 获取系统临时目录
    final tempDir = Directory.systemTemp;
    // 构造zip文件路径
    final schoolId = getSchoolInfoObs().getSchoolInfo().schoolId;
    final userId = getConfig().userId;
    final time = DateTime.now().millisecondsSinceEpoch;
    final zipDir = Directory('${tempDir.path}/tcic_logs/$schoolId/$userId');
    if (!await zipDir.exists()) {
      await zipDir.create(recursive: true);
    }

    final zipFilePath = '${zipDir.path}/$time.zip';
    TCICLog.info("zip log file path: $zipFilePath logFilePath: $logFilePath", actionModule: ActionModule.tcicController.name, actionName: ActionName.uploadLogs.name);
    final startTime = DateTime.now();
    // 在 isolate 中执行:筛选 + 压缩 + 写盘
    // 避免回传超大 Uint8List 到 UI isolate 引发卡顿
    final zipResult = await TCICIsolate.runCompute(
      tcicZipLogsToFileInIsolate,
      <String, Object?>{
        'logDirPath': logFilePath,
        'zipFilePath': zipFilePath,
        'keepDays': 1,
      },
      debugLabel: 'tcic_zip_logs_to_file',
    );
    final endTime = DateTime.now();
    final duration = endTime.difference(startTime).inSeconds;
    final ok = (zipResult['ok'] as bool?) ?? false;
    final String filePath = (zipResult['zipFilePath'] ?? "") as String;
    TCICLog.info(
      "zip log file duration: ${duration}s ok=$ok result=$zipResult",
      actionModule: ActionModule.tcicController.name,
      actionName: ActionName.uploadLogs.name,
    );
    if (!ok) {
      TCICLog.error(
        "zip log dir failed: $zipResult",
        actionModule: ActionModule.tcicController.name,
        actionName: ActionName.uploadLogs.name,
      );
      return false;
    }

    final zipFile = File(filePath);
    TCICLog.info("log zip success: $filePath", actionModule: ActionModule.tcicController.name, actionName: ActionName.uploadLogs.name);

    // 上传文件
    final uploadSuccess = await uploadLogsToCos(zipFile);
    return uploadSuccess;
  } catch (e) {
    TCICLog.error("upload logs failed: $e", actionModule: ActionModule.tcicController.name, actionName: ActionName.uploadLogs.name);
    return false;
  } finally {
    // 无论成功/失败,都结束 loading,避免 UI 卡住
    getEventBus().fire(MainEvent(type: EventTypeEnum.endUploadLogs));
  }
}