import 'package:electronic_assistant/base/app_base_request.dart'; import 'package:electronic_assistant/data/api/atmob_api.dart'; import 'package:electronic_assistant/data/api/response/talk_query_response.dart'; import 'package:electronic_assistant/data/bean/talks.dart'; import 'package:electronic_assistant/utils/async_util.dart'; import 'package:electronic_assistant/utils/cancel_future.dart'; import 'package:flutter/cupertino.dart'; import '../../utils/http_handler.dart'; import '../api/request/talk_query_request.dart'; import '../api/response/tasks_running_response.dart'; import '../consts/error_code.dart'; class TaskRepository { final Set electronicTasks = {}; final Set _recordSuccessTalkIds = {}; CancelableFuture? _taskStatusCheckFuture; TaskRepository._(); void stopTask() { _taskStatusCheckFuture?.cancel(); } void addTask(String taskId) { electronicTasks.add(taskId); _startTaskStatusCheck(); } void startUnfinishedTask() { debugPrint('开始获取未完成任务=='); AsyncUtil.retryWithExponentialBackoff(() => _tasksRunning(), 10, (error) { if (error is ServerErrorException) { return error.code != ErrorCode.ERROR_CODE_NO_LOGIN; } return true; }).then((data) { List? list = data.taskIds; debugPrint('获取未完成任务成功-${list?.length}'); electronicTasks.clear(); if (list != null) { electronicTasks.addAll(list); } _startTaskStatusCheck(); }).catchError((error) { debugPrint('获取未完成任务失败'); }); } void _startTaskStatusCheck() { if (electronicTasks.isEmpty) { return; } debugPrint('开始检查任务状态'); if (_taskStatusCheckFuture != null) { _taskStatusCheckFuture?.cancel(); } _taskStatusCheckFuture = AsyncUtil.retryWhen( () => _checkAllTaskStatusFinished(), 0, const Duration(seconds: 3), (error) { if (error is ServerErrorException) { return error.code != ErrorCode.ERROR_CODE_NO_LOGIN; } return true; }); } Future _checkAllTaskStatusFinished() { String taskIds = electronicTasks.join(','); return atmobApi .talkQuery(TalkQueryRequest(taskIds)) .then(HttpHandler.handle(false)) .then((response) => _dealTaskStatus(response)); } Future _dealTaskStatus(TalkQueryResponse response) { response.talks?.forEach((element) { if (element.status == TalkStatus.analysing || element.status == TalkStatus.waitAnalysis) { //TODO 刷新生成中的bean类数据 } else if (element.status == TalkStatus.analysisSuccess || element.status == TalkStatus.analysisFail) { electronicTasks.remove(element.taskId); if (!_recordSuccessTalkIds.contains(element.id)) { _recordSuccessTalkIds.add(element.id); _notifyGenerationStatus(element); } } }); return Future.value(); } void _notifyGenerationStatus(TalkBean element) { if (element.status == TalkStatus.analysisSuccess) { debugPrint('生成成功-${element.id}'); } else if (element.status == TalkStatus.analysisFail) { debugPrint('生成失败-${element.id}'); } } Future _tasksRunning() { return atmobApi .tasksRunning(AppBaseRequest()) .then(HttpHandler.handle(true)); } } final taskRepository = TaskRepository._();