task_repository.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import 'package:electronic_assistant/base/app_base_request.dart';
  2. import 'package:electronic_assistant/data/api/atmob_api.dart';
  3. import 'package:electronic_assistant/data/api/response/talk_query_response.dart';
  4. import 'package:electronic_assistant/data/bean/talks.dart';
  5. import 'package:electronic_assistant/data/repositories/talk_repository.dart';
  6. import 'package:electronic_assistant/utils/async_util.dart';
  7. import 'package:electronic_assistant/utils/cancel_future.dart';
  8. import 'package:electronic_assistant/utils/toast_util.dart';
  9. import 'package:flutter/cupertino.dart';
  10. import '../../utils/http_handler.dart';
  11. import '../api/request/talk_query_request.dart';
  12. import '../api/response/tasks_running_response.dart';
  13. import '../consts/error_code.dart';
  14. class TaskRepository {
  15. final Set<String> electronicTasks = {};
  16. final Set<String> _recordSuccessTalkIds = {};
  17. CancelableFuture? _taskStatusCheckFuture;
  18. TaskRepository._();
  19. void stopTask() {
  20. _taskStatusCheckFuture?.cancel();
  21. }
  22. void addTask(String taskId) {
  23. electronicTasks.add(taskId);
  24. _startTaskStatusCheck();
  25. }
  26. void startUnfinishedTask() {
  27. debugPrint('开始获取未完成任务==');
  28. AsyncUtil.retryWithExponentialBackoff(() => _tasksRunning(), 10, (error) {
  29. if (error is ServerErrorException) {
  30. return error.code != ErrorCode.ERROR_CODE_NO_LOGIN;
  31. }
  32. return true;
  33. }).then((data) {
  34. List<String>? list = data.taskIds;
  35. debugPrint('获取未完成任务成功-${list?.length}');
  36. electronicTasks.clear();
  37. if (list != null) {
  38. electronicTasks.addAll(list);
  39. }
  40. _startTaskStatusCheck();
  41. }).catchError((error) {
  42. debugPrint('获取未完成任务失败');
  43. });
  44. }
  45. void _startTaskStatusCheck() {
  46. if (electronicTasks.isEmpty) {
  47. return;
  48. }
  49. debugPrint('开始检查任务状态');
  50. if (_taskStatusCheckFuture != null) {
  51. _taskStatusCheckFuture?.cancel();
  52. }
  53. _taskStatusCheckFuture = AsyncUtil.retryWhen(
  54. () => _checkAllTaskStatusFinished(), 0, const Duration(seconds: 3),
  55. (error) {
  56. if (error is ServerErrorException) {
  57. return error.code != ErrorCode.ERROR_CODE_NO_LOGIN;
  58. }
  59. return true;
  60. });
  61. }
  62. Future<void> _checkAllTaskStatusFinished() {
  63. String taskIds = electronicTasks.join(',');
  64. return atmobApi
  65. .talkQuery(TalkQueryRequest(taskIds))
  66. .then(HttpHandler.handle(true))
  67. .then((response) => _dealTaskStatus(response))
  68. .then((data) {
  69. if (electronicTasks.isEmpty) {
  70. return;
  71. } else {
  72. throw Exception('task not finished');
  73. }
  74. });
  75. }
  76. Future<void> _dealTaskStatus(TalkQueryResponse response) {
  77. response.talks?.forEach((element) {
  78. if (element.status == TalkStatus.analysing ||
  79. element.status == TalkStatus.waitAnalysis) {
  80. talkRepository.renovateTalkData(element);
  81. } else if (element.status == TalkStatus.analysisSuccess ||
  82. element.status == TalkStatus.analysisFail) {
  83. electronicTasks.remove(element.taskId);
  84. if (!_recordSuccessTalkIds.contains(element.id)) {
  85. _recordSuccessTalkIds.add(element.id);
  86. _notifyGenerationStatus(element);
  87. }
  88. }
  89. });
  90. return Future.value();
  91. }
  92. void _notifyGenerationStatus(TalkBean element) {
  93. talkRepository.renovateTalkData(element);
  94. if (element.status == TalkStatus.analysisSuccess) {
  95. debugPrint('生成成功-${element.id}');
  96. ToastUtil.showToast('生成成功');
  97. } else if (element.status == TalkStatus.analysisFail) {
  98. debugPrint('生成失败-${element.id}');
  99. ToastUtil.showToast('生成失败');
  100. }
  101. }
  102. Future<TasksRunningResponse> _tasksRunning() {
  103. return atmobApi
  104. .tasksRunning(AppBaseRequest())
  105. .then(HttpHandler.handle(true));
  106. }
  107. }
  108. final taskRepository = TaskRepository._();