浏览代码

[feat]亲密度分析,截图回复-对话分析,对接对话分析接口

hezihao 7 月之前
父节点
当前提交
030ba20252

+ 2 - 0
assets/string/base/string.xml

@@ -318,6 +318,8 @@
     <string name="choose_reply_tone">选择回复语气</string>
     <string name="no_choose_reply_tone_tip">请选择回复语气</string>
 
+    <string name="no_choose_option_tip">请选择一项需求</string>
+
     <string name="no_choose_mode_tip">请选择模式</string>
     <string name="no_upload_screenshot_tip">请上传截图</string>
 

+ 8 - 0
lib/data/api/atmob_api.dart

@@ -15,6 +15,7 @@ import 'package:keyboard/data/api/request/complaint_submit_request.dart';
 import 'package:keyboard/data/api/request/config_request.dart';
 import 'package:keyboard/data/api/request/intimacy_analyze_request.dart';
 import 'package:keyboard/data/api/request/intimacy_reply_analyze_request.dart';
+import 'package:keyboard/data/api/request/intimacy_reply_chat_request.dart';
 import 'package:keyboard/data/api/request/keyboard_character_list_request.dart';
 import 'package:keyboard/data/api/request/keyboard_character_update_request.dart';
 import 'package:keyboard/data/api/request/keyboard_choose_request.dart';
@@ -43,6 +44,7 @@ import 'package:keyboard/data/api/response/intimacy_analyze_chat_config_response
 import 'package:keyboard/data/api/response/intimacy_analyze_config_response.dart';
 import 'package:keyboard/data/api/response/intimacy_analyze_reply_config_response.dart';
 import 'package:keyboard/data/api/response/intimacy_analyze_response.dart';
+import 'package:keyboard/data/api/response/intimacy_chat_analyze_response.dart';
 import 'package:keyboard/data/api/response/intimacy_reply_analyze_response.dart';
 import 'package:keyboard/data/api/response/item_list_response.dart';
 import 'package:keyboard/data/api/response/item_retention_response.dart';
@@ -278,6 +280,12 @@ abstract class AtmobApi {
   Future<BaseResponse<IntimacyAnalyzeChatConfigResponse>>
   getIntimacyAnalyzeChatConfig(@Body() AppBaseRequest request);
 
+  /// 对话分析
+  @POST("/project/keyboard/v1/intimacy/chat/analyze")
+  Future<BaseResponse<IntimacyChatAnalyzeResponse>> intimacyChatAnalyze(
+    @Body() IntimacyChatAnalyzeRequest request,
+  );
+
   /// 获取识图回复配置
   @POST("/project/keyboard/v1/intimacy/reply/config")
   Future<BaseResponse<IntimacyAnalyzeReplyConfigResponse>>

+ 34 - 0
lib/data/api/atmob_api.g.dart

@@ -1275,6 +1275,40 @@ class _AtmobApi implements AtmobApi {
   }
 
   @override
+  Future<BaseResponse<IntimacyChatAnalyzeResponse>> intimacyChatAnalyze(
+    IntimacyChatAnalyzeRequest request,
+  ) async {
+    final _extra = <String, dynamic>{};
+    final queryParameters = <String, dynamic>{};
+    final _headers = <String, dynamic>{};
+    final _data = <String, dynamic>{};
+    _data.addAll(request.toJson());
+    final _options = _setStreamType<BaseResponse<IntimacyChatAnalyzeResponse>>(
+      Options(method: 'POST', headers: _headers, extra: _extra)
+          .compose(
+            _dio.options,
+            '/project/keyboard/v1/intimacy/chat/analyze',
+            queryParameters: queryParameters,
+            data: _data,
+          )
+          .copyWith(baseUrl: _combineBaseUrls(_dio.options.baseUrl, baseUrl)),
+    );
+    final _result = await _dio.fetch<Map<String, dynamic>>(_options);
+    late BaseResponse<IntimacyChatAnalyzeResponse> _value;
+    try {
+      _value = BaseResponse<IntimacyChatAnalyzeResponse>.fromJson(
+        _result.data!,
+        (json) =>
+            IntimacyChatAnalyzeResponse.fromJson(json as Map<String, dynamic>),
+      );
+    } on Object catch (e, s) {
+      errorLogger?.logError(e, s, _options);
+      rethrow;
+    }
+    return _value;
+  }
+
+  @override
   Future<BaseResponse<IntimacyAnalyzeReplyConfigResponse>>
   getIntimacyAnalyzeReplyConfig(AppBaseRequest request) async {
     final _extra = <String, dynamic>{};

+ 21 - 0
lib/data/api/request/intimacy_reply_chat_request.dart

@@ -0,0 +1,21 @@
+import 'package:json_annotation/json_annotation.dart';
+import 'package:keyboard/base/app_base_request.dart';
+
+part 'intimacy_reply_chat_request.g.dart';
+
+/// 对话分析的请求
+@JsonSerializable()
+class IntimacyChatAnalyzeRequest extends AppBaseRequest {
+  /// 图片地址列表,不加cdn前缀
+  @JsonKey(name: "imageList")
+  List<String> imageList;
+
+  /// 语气标题
+  @JsonKey(name: "title")
+  String title;
+
+  IntimacyChatAnalyzeRequest(this.imageList, this.title);
+
+  @override
+  Map<String, dynamic> toJson() => _$IntimacyChatAnalyzeRequestToJson(this);
+}

+ 74 - 0
lib/data/api/request/intimacy_reply_chat_request.g.dart

@@ -0,0 +1,74 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'intimacy_reply_chat_request.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+IntimacyChatAnalyzeRequest _$IntimacyChatAnalyzeRequestFromJson(
+  Map<String, dynamic> json,
+) =>
+    IntimacyChatAnalyzeRequest(
+        (json['imageList'] as List<dynamic>).map((e) => e as String).toList(),
+        json['title'] as String,
+      )
+      ..appPlatform = (json['appPlatform'] as num).toInt()
+      ..os = json['os'] as String
+      ..osVersion = json['osVersion'] as String
+      ..packageName = json['packageName'] as String?
+      ..appVersionName = json['appVersionName'] as String?
+      ..appVersionCode = (json['appVersionCode'] as num?)?.toInt()
+      ..channelName = json['channelName'] as String?
+      ..appId = (json['appId'] as num?)?.toInt()
+      ..tgPlatform = (json['tgPlatform'] as num?)?.toInt()
+      ..oaid = json['oaid'] as String?
+      ..aaid = json['aaid'] as String?
+      ..androidId = json['androidId'] as String?
+      ..imei = json['imei'] as String?
+      ..simImei0 = json['simImei0'] as String?
+      ..simImei1 = json['simImei1'] as String?
+      ..mac = json['mac'] as String?
+      ..idfa = json['idfa'] as String?
+      ..idfv = json['idfv'] as String?
+      ..machineId = json['machineId'] as String?
+      ..brand = json['brand'] as String?
+      ..model = json['model'] as String?
+      ..wifiName = json['wifiName'] as String?
+      ..region = json['region'] as String?
+      ..locLng = (json['locLng'] as num?)?.toDouble()
+      ..locLat = (json['locLat'] as num?)?.toDouble()
+      ..authToken = json['authToken'] as String?;
+
+Map<String, dynamic> _$IntimacyChatAnalyzeRequestToJson(
+  IntimacyChatAnalyzeRequest instance,
+) => <String, dynamic>{
+  'appPlatform': instance.appPlatform,
+  'os': instance.os,
+  'osVersion': instance.osVersion,
+  'packageName': instance.packageName,
+  'appVersionName': instance.appVersionName,
+  'appVersionCode': instance.appVersionCode,
+  'channelName': instance.channelName,
+  'appId': instance.appId,
+  'tgPlatform': instance.tgPlatform,
+  'oaid': instance.oaid,
+  'aaid': instance.aaid,
+  'androidId': instance.androidId,
+  'imei': instance.imei,
+  'simImei0': instance.simImei0,
+  'simImei1': instance.simImei1,
+  'mac': instance.mac,
+  'idfa': instance.idfa,
+  'idfv': instance.idfv,
+  'machineId': instance.machineId,
+  'brand': instance.brand,
+  'model': instance.model,
+  'wifiName': instance.wifiName,
+  'region': instance.region,
+  'locLng': instance.locLng,
+  'locLat': instance.locLat,
+  'authToken': instance.authToken,
+  'imageList': instance.imageList,
+  'title': instance.title,
+};

+ 40 - 0
lib/data/api/response/intimacy_chat_analyze_response.dart

@@ -0,0 +1,40 @@
+import 'package:json_annotation/json_annotation.dart';
+
+import '../../bean/analyze_choice_item.dart';
+
+part 'intimacy_chat_analyze_response.g.dart';
+
+/// 识图回复响应
+@JsonSerializable()
+class IntimacyChatAnalyzeResponse {
+  @JsonKey(name: "id")
+  String? id;
+
+  @JsonKey(name: "object")
+  String? object;
+
+  /// 创建时间
+  @JsonKey(name: "created")
+  int? created;
+
+  /// Ai模型
+  @JsonKey(name: "model")
+  int? model;
+
+  /// 选择项列表
+  @JsonKey(name: "choices")
+  List<AnalyzeChoiceItem>? choices;
+
+  IntimacyChatAnalyzeResponse(
+    this.id,
+    this.object,
+    this.created,
+    this.model,
+    this.choices,
+  );
+
+  factory IntimacyChatAnalyzeResponse.fromJson(Map<String, dynamic> json) =>
+      _$IntimacyChatAnalyzeResponseFromJson(json);
+
+  Map<String, dynamic> toJson() => _$IntimacyChatAnalyzeResponseToJson(this);
+}

+ 29 - 0
lib/data/api/response/intimacy_chat_analyze_response.g.dart

@@ -0,0 +1,29 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'intimacy_chat_analyze_response.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+IntimacyChatAnalyzeResponse _$IntimacyChatAnalyzeResponseFromJson(
+  Map<String, dynamic> json,
+) => IntimacyChatAnalyzeResponse(
+  json['id'] as String?,
+  json['object'] as String?,
+  (json['created'] as num?)?.toInt(),
+  (json['model'] as num?)?.toInt(),
+  (json['choices'] as List<dynamic>?)
+      ?.map((e) => AnalyzeChoiceItem.fromJson(e as Map<String, dynamic>))
+      .toList(),
+);
+
+Map<String, dynamic> _$IntimacyChatAnalyzeResponseToJson(
+  IntimacyChatAnalyzeResponse instance,
+) => <String, dynamic>{
+  'id': instance.id,
+  'object': instance.object,
+  'created': instance.created,
+  'model': instance.model,
+  'choices': instance.choices,
+};

+ 2 - 2
lib/data/api/response/intimacy_reply_analyze_response.dart

@@ -1,6 +1,6 @@
 import 'package:json_annotation/json_annotation.dart';
 
-import '../../bean/intimacy_reply_analyze_choice_item.dart';
+import '../../bean/analyze_choice_item.dart';
 
 part 'intimacy_reply_analyze_response.g.dart';
 
@@ -23,7 +23,7 @@ class IntimacyReplyAnalyzeResponse {
 
   /// 选择项列表
   @JsonKey(name: "choices")
-  List<IntimacyReplyAnalyzeChoiceItem>? choices;
+  List<AnalyzeChoiceItem>? choices;
 
   IntimacyReplyAnalyzeResponse(
     this.id,

+ 1 - 4
lib/data/api/response/intimacy_reply_analyze_response.g.dart

@@ -14,10 +14,7 @@ IntimacyReplyAnalyzeResponse _$IntimacyReplyAnalyzeResponseFromJson(
   (json['created'] as num?)?.toInt(),
   (json['model'] as num?)?.toInt(),
   (json['choices'] as List<dynamic>?)
-      ?.map(
-        (e) =>
-            IntimacyReplyAnalyzeChoiceItem.fromJson(e as Map<String, dynamic>),
-      )
+      ?.map((e) => AnalyzeChoiceItem.fromJson(e as Map<String, dynamic>))
       .toList(),
 );
 

+ 25 - 0
lib/data/bean/analyze_choice_item.dart

@@ -0,0 +1,25 @@
+import 'package:json_annotation/json_annotation.dart';
+
+import 'analyze_choice_item_delta.dart';
+
+part 'analyze_choice_item.g.dart';
+
+/// 识图回复-选择项
+@JsonSerializable()
+class AnalyzeChoiceItem {
+  @JsonKey(name: "delta")
+  AnalyzeChoiceItemDelta? delta;
+
+  @JsonKey(name: "index")
+  int? index;
+
+  @JsonKey(name: "finish_reason")
+  String? finishReason;
+
+  AnalyzeChoiceItem(this.delta, this.index, this.finishReason);
+
+  factory AnalyzeChoiceItem.fromJson(Map<String, dynamic> json) =>
+      _$AnalyzeChoiceItemFromJson(json);
+
+  Map<String, dynamic> toJson() => _$AnalyzeChoiceItemToJson(this);
+}

+ 25 - 0
lib/data/bean/analyze_choice_item.g.dart

@@ -0,0 +1,25 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'analyze_choice_item.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AnalyzeChoiceItem _$AnalyzeChoiceItemFromJson(Map<String, dynamic> json) =>
+    AnalyzeChoiceItem(
+      json['delta'] == null
+          ? null
+          : AnalyzeChoiceItemDelta.fromJson(
+            json['delta'] as Map<String, dynamic>,
+          ),
+      (json['index'] as num?)?.toInt(),
+      json['finish_reason'] as String?,
+    );
+
+Map<String, dynamic> _$AnalyzeChoiceItemToJson(AnalyzeChoiceItem instance) =>
+    <String, dynamic>{
+      'delta': instance.delta,
+      'index': instance.index,
+      'finish_reason': instance.finishReason,
+    };

+ 24 - 0
lib/data/bean/analyze_choice_item_delta.dart

@@ -0,0 +1,24 @@
+import 'package:json_annotation/json_annotation.dart';
+
+part 'analyze_choice_item_delta.g.dart';
+
+/// 识图回复-选择项-内容
+@JsonSerializable()
+class AnalyzeChoiceItemDelta {
+  /// 角色
+  @JsonKey(name: "role")
+  String? role;
+
+  /// 回复内容
+  @JsonKey(name: "content")
+  String? content;
+
+  AnalyzeChoiceItemDelta(this.role, this.content);
+
+  factory AnalyzeChoiceItemDelta.fromJson(
+    Map<String, dynamic> json,
+  ) => _$AnalyzeChoiceItemDeltaFromJson(json);
+
+  Map<String, dynamic> toJson() =>
+      _$AnalyzeChoiceItemDeltaToJson(this);
+}

+ 16 - 0
lib/data/bean/analyze_choice_item_delta.g.dart

@@ -0,0 +1,16 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'analyze_choice_item_delta.dart';
+
+// **************************************************************************
+// JsonSerializableGenerator
+// **************************************************************************
+
+AnalyzeChoiceItemDelta _$AnalyzeChoiceItemDeltaFromJson(
+  Map<String, dynamic> json,
+) =>
+    AnalyzeChoiceItemDelta(json['role'] as String?, json['content'] as String?);
+
+Map<String, dynamic> _$AnalyzeChoiceItemDeltaToJson(
+  AnalyzeChoiceItemDelta instance,
+) => <String, dynamic>{'role': instance.role, 'content': instance.content};

+ 0 - 25
lib/data/bean/intimacy_reply_analyze_choice_item.dart

@@ -1,25 +0,0 @@
-import 'package:json_annotation/json_annotation.dart';
-
-import 'intimacy_reply_analyze_choice_item_delta.dart';
-
-part 'intimacy_reply_analyze_choice_item.g.dart';
-
-/// 识图回复-选择项
-@JsonSerializable()
-class IntimacyReplyAnalyzeChoiceItem {
-  @JsonKey(name: "delta")
-  IntimacyReplyAnalyzeChoiceItemDelta? delta;
-
-  @JsonKey(name: "index")
-  int? index;
-
-  @JsonKey(name: "finish_reason")
-  String? finishReason;
-
-  IntimacyReplyAnalyzeChoiceItem(this.delta, this.index, this.finishReason);
-
-  factory IntimacyReplyAnalyzeChoiceItem.fromJson(Map<String, dynamic> json) =>
-      _$IntimacyReplyAnalyzeChoiceItemFromJson(json);
-
-  Map<String, dynamic> toJson() => _$IntimacyReplyAnalyzeChoiceItemToJson(this);
-}

+ 0 - 27
lib/data/bean/intimacy_reply_analyze_choice_item.g.dart

@@ -1,27 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'intimacy_reply_analyze_choice_item.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-IntimacyReplyAnalyzeChoiceItem _$IntimacyReplyAnalyzeChoiceItemFromJson(
-  Map<String, dynamic> json,
-) => IntimacyReplyAnalyzeChoiceItem(
-  json['delta'] == null
-      ? null
-      : IntimacyReplyAnalyzeChoiceItemDelta.fromJson(
-        json['delta'] as Map<String, dynamic>,
-      ),
-  (json['index'] as num?)?.toInt(),
-  json['finish_reason'] as String?,
-);
-
-Map<String, dynamic> _$IntimacyReplyAnalyzeChoiceItemToJson(
-  IntimacyReplyAnalyzeChoiceItem instance,
-) => <String, dynamic>{
-  'delta': instance.delta,
-  'index': instance.index,
-  'finish_reason': instance.finishReason,
-};

+ 0 - 24
lib/data/bean/intimacy_reply_analyze_choice_item_delta.dart

@@ -1,24 +0,0 @@
-import 'package:json_annotation/json_annotation.dart';
-
-part 'intimacy_reply_analyze_choice_item_delta.g.dart';
-
-/// 识图回复-选择项-内容
-@JsonSerializable()
-class IntimacyReplyAnalyzeChoiceItemDelta {
-  /// 角色
-  @JsonKey(name: "role")
-  String? role;
-
-  /// 回复内容
-  @JsonKey(name: "content")
-  String? content;
-
-  IntimacyReplyAnalyzeChoiceItemDelta(this.role, this.content);
-
-  factory IntimacyReplyAnalyzeChoiceItemDelta.fromJson(
-    Map<String, dynamic> json,
-  ) => _$IntimacyReplyAnalyzeChoiceItemDeltaFromJson(json);
-
-  Map<String, dynamic> toJson() =>
-      _$IntimacyReplyAnalyzeChoiceItemDeltaToJson(this);
-}

+ 0 - 18
lib/data/bean/intimacy_reply_analyze_choice_item_delta.g.dart

@@ -1,18 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'intimacy_reply_analyze_choice_item_delta.dart';
-
-// **************************************************************************
-// JsonSerializableGenerator
-// **************************************************************************
-
-IntimacyReplyAnalyzeChoiceItemDelta
-_$IntimacyReplyAnalyzeChoiceItemDeltaFromJson(Map<String, dynamic> json) =>
-    IntimacyReplyAnalyzeChoiceItemDelta(
-      json['role'] as String?,
-      json['content'] as String?,
-    );
-
-Map<String, dynamic> _$IntimacyReplyAnalyzeChoiceItemDeltaToJson(
-  IntimacyReplyAnalyzeChoiceItemDelta instance,
-) => <String, dynamic>{'role': instance.role, 'content': instance.content};

+ 9 - 0
lib/data/repository/intimacy_analyze_repository.dart

@@ -11,10 +11,12 @@ import '../../utils/http_handler.dart';
 import '../api/atmob_api.dart';
 import '../api/request/intimacy_analyze_request.dart';
 import '../api/request/intimacy_reply_analyze_request.dart';
+import '../api/request/intimacy_reply_chat_request.dart';
 import '../api/response/intimacy_analyze_chat_config_response.dart';
 import '../api/response/intimacy_analyze_config_response.dart';
 import '../api/response/intimacy_analyze_reply_config_response.dart';
 import '../api/response/intimacy_analyze_response.dart';
+import '../api/response/intimacy_chat_analyze_response.dart';
 import '../api/response/intimacy_reply_analyze_response.dart';
 
 /// 亲密度分析Repository层
@@ -99,6 +101,13 @@ class IntimacyAnalyzeRepository {
         .then(HttpHandler.handle(true));
   }
 
+  /// 对话分析
+  Future<IntimacyChatAnalyzeResponse> intimacyChatAnalyze(
+    IntimacyChatAnalyzeRequest request,
+  ) {
+    return atmobApi.intimacyChatAnalyze(request).then(HttpHandler.handle(true));
+  }
+
   /// 获取识图回复配置
   Future<IntimacyAnalyzeReplyConfigResponse>
   requestIntimacyAnalyzeReplyConfig() {

+ 8 - 6
lib/di/get_it.config.dart

@@ -320,12 +320,6 @@ extension GetItInjectableX on _i174.GetIt {
         gh<_i779.PaymentStatusManager>(),
       ),
     );
-    gh.factory<_i510.ConversationAnalysisController>(
-      () => _i510.ConversationAnalysisController(
-        gh<_i738.IntimacyAnalyzeConfigHelper>(),
-        gh<_i428.UploadFileManager>(),
-      ),
-    );
     gh.factory<_i278.CustomDirectionEditController>(
       () => _i278.CustomDirectionEditController(
         gh<_i738.IntimacyAnalyzeConfigHelper>(),
@@ -339,6 +333,14 @@ extension GetItInjectableX on _i174.GetIt {
         gh<_i83.AccountRepository>(),
       ),
     );
+    gh.factory<_i510.ConversationAnalysisController>(
+      () => _i510.ConversationAnalysisController(
+        gh<_i738.IntimacyAnalyzeConfigHelper>(),
+        gh<_i428.UploadFileManager>(),
+        gh<_i283.IntimacyAnalyzeRepository>(),
+        gh<_i83.AccountRepository>(),
+      ),
+    );
     gh.factory<_i464.ScanImageReplyController>(
       () => _i464.ScanImageReplyController(
         gh<_i738.IntimacyAnalyzeConfigHelper>(),

+ 79 - 27
lib/module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_controller.dart

@@ -7,17 +7,28 @@ import 'package:keyboard/base/base_controller.dart';
 import 'package:keyboard/resource/string.gen.dart';
 import 'package:wechat_assets_picker/wechat_assets_picker.dart';
 
+import '../../../../data/api/request/intimacy_reply_chat_request.dart';
+import '../../../../data/api/response/intimacy_chat_analyze_response.dart';
 import '../../../../data/bean/option_select_config.dart';
 import '../../../../data/bean/option_select_item.dart';
 import '../../../../data/bean/upload_info.dart';
+import '../../../../data/repository/account_repository.dart';
+import '../../../../data/repository/intimacy_analyze_repository.dart';
+import '../../../../utils/atmob_log.dart';
+import '../../../../utils/error_handler.dart';
+import '../../../../utils/http_handler.dart';
 import '../../../../utils/image_picker_util.dart';
 import '../../../../utils/intimacy_analyze_config_helper.dart';
+import '../../../../utils/toast_util.dart';
 import '../../../../utils/upload/upload_file_manager.dart';
 import '../../../../utils/upload/upload_scene_type.dart';
+import '../../../store/store_page.dart';
 
 /// 对话分析Controller
 @injectable
 class ConversationAnalysisController extends BaseController {
+  final String _tag = "ConversationAnalysisController";
+
   /// 上传场景
   final UploadSceneType uploadSceneType = UploadSceneType.conversationAnalysis;
 
@@ -27,6 +38,12 @@ class ConversationAnalysisController extends BaseController {
   /// 文件上传管理器
   UploadFileManager uploadFileManager;
 
+  /// 亲密度分析模块的Repository
+  IntimacyAnalyzeRepository intimacyAnalyzeRepository;
+
+  /// 用户信息Repository
+  AccountRepository accountRepository;
+
   /// 是否是上传页
   Rx<bool> isUploadPage = false.obs;
 
@@ -40,26 +57,11 @@ class ConversationAnalysisController extends BaseController {
   RxList<OptionSelectConfig> optionSelectConfigList =
       <OptionSelectConfig>[].obs;
 
-  /// 报告数据
-  RxString reportData =
-      '''
-  **性格匹配度**
-
-  ● 互补型:一方外向活泼,另一方沉稳内敛,形成动态平衡。
-  ● 相似型:三观一致,兴趣重叠,减少摩擦但需警惕新鲜感流失。
-  ● 关键结论:差异是火花的来源,但核心价值观需一致(如家庭观、金钱观)。
-
-  **沟通模式分析**
+  /// 当前选择的选项
+  Rxn<OptionSelectItem> currentSelectOption = Rxn();
 
-  ● 语言风格:幽默调侃型 vs 理性分析型 → 需找到共同表达方式。
-  ● 冲突解决:回避型 vs 直面型 → 建议建立“冷静-沟通”机制。
-  ● 情感需求:一方需要高频互动,另一方偏好独立空间 → 需协商平衡点。
-
-  **爱情语言测试**
-
-  ● 根据盖瑞·查普曼的“五种爱之语”理论,分析双方的情感表达偏好:
-  ● 你的主要爱语:肯定的言辞(如情话、鼓励)
-  '''.obs;
+  /// 报告数据
+  RxString reportData = ''.obs;
 
   /// 上传图片列表
   RxList<UploadInfo> uploadInfoList = <UploadInfo>[].obs;
@@ -67,6 +69,8 @@ class ConversationAnalysisController extends BaseController {
   ConversationAnalysisController(
     this.intimacyAnalyzeConfigHelper,
     this.uploadFileManager,
+    this.intimacyAnalyzeRepository,
+    this.accountRepository,
   );
 
   @override
@@ -115,12 +119,17 @@ class ConversationAnalysisController extends BaseController {
 
   /// 选中选项
   void selectOption(OptionSelectConfig rowConfig, OptionSelectItem optionItem) {
-    // 先全部反选
-    rowConfig.options =
-        rowConfig.options.map((ele) {
-          ele.selected = false;
-          return ele;
-        }).toList();
+    // 更新当前选中项
+    currentSelectOption.value = optionItem;
+
+    // 将所有预测方向都反选
+    for (var config in optionSelectConfigList) {
+      config.options =
+          config.options.map((ele) {
+            ele.selected = false;
+            return ele;
+          }).toList();
+    }
     // 再勾选当前的选中项
     optionItem.selected = true;
     // 由于Rx响应式变量,无法监听对象中嵌套对象的某个属性的变化,导致页面不会刷新,需要手动刷新页面
@@ -132,8 +141,51 @@ class ConversationAnalysisController extends BaseController {
 
   /// 点击查看分析按钮
   void clickLookAnalyseBtn(BuildContext context) async {
-    // TODO hezihao,要请求接口,进行分析,出报告,现在先让通过
-    hasReport.value = true;
+    // 非Vip,跳转到商店页
+    bool isVip = accountRepository.memberStatusInfo.value?.isMember ?? false;
+    if (!isVip) {
+      ToastUtil.show(StringName.needVipTip);
+      StorePage.start();
+      return;
+    }
+
+    // 上传的图片后端地址
+    List<String> imageList =
+        uploadInfoList.map((item) {
+          return item.fileBackendPath ?? "";
+        }).toList();
+    // 选择的标题
+    String title = currentSelectOption.value?.name ?? "";
+
+    if (imageList.isEmpty) {
+      ToastUtil.show(StringName.noUploadConversationImageTip);
+      return;
+    }
+    if (title.isEmpty) {
+      ToastUtil.show(StringName.noChooseOptionTip);
+      return;
+    }
+
+    try {
+      IntimacyChatAnalyzeResponse response = await intimacyAnalyzeRepository
+          .intimacyChatAnalyze(IntimacyChatAnalyzeRequest(imageList, title));
+      String reportContent = response.choices?[0].delta?.content ?? "";
+      reportData.value = reportContent;
+      hasReport.value = true;
+    } catch (error) {
+      AtmobLog.e(_tag, error.toString());
+      if (error is ServerErrorException) {
+        // 需要Vip权限
+        if (error.code == 1005) {
+          ToastUtil.show(error.message);
+          StorePage.start();
+        } else {
+          ToastUtil.show(error.message);
+        }
+      } else {
+        ErrorHandler.toastError(error);
+      }
+    }
   }
 
   /// 点击上传按钮

+ 6 - 4
lib/module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_view.dart

@@ -290,10 +290,12 @@ class ConversationAnalysisView
               color: ColorName.white,
               borderRadius: BorderRadius.circular(20.r),
             ),
-            child: MarkdownViewer(
-              content: controller.reportData.value,
-              enableContentScroll: false,
-            ),
+            child: Obx(() {
+              return MarkdownViewer(
+                content: controller.reportData.value,
+                enableContentScroll: false,
+              );
+            }),
           ),
         ],
       ),

+ 2 - 0
lib/resource/string.gen.dart

@@ -228,6 +228,7 @@ class StringName {
   static final String forMe = 'for_me'.tr; // 对于我
   static final String chooseReplyTone = 'choose_reply_tone'.tr; // 选择回复语气
   static final String noChooseReplyToneTip = 'no_choose_reply_tone_tip'.tr; // 请选择回复语气
+  static final String noChooseOptionTip = 'no_choose_option_tip'.tr; // 请选择一项需求
   static final String noChooseModeTip = 'no_choose_mode_tip'.tr; // 请选择模式
   static final String noUploadScreenshotTip = 'no_upload_screenshot_tip'.tr; // 请上传截图
   static final String noUploadConversationImageTip = 'no_upload_conversation_image_tip'.tr; // 请上传聊天记录图片
@@ -501,6 +502,7 @@ class StringMultiSource {
       'for_me': '对于我',
       'choose_reply_tone': '选择回复语气',
       'no_choose_reply_tone_tip': '请选择回复语气',
+      'no_choose_option_tip': '请选择一项需求',
       'no_choose_mode_tip': '请选择模式',
       'no_upload_screenshot_tip': '请上传截图',
       'no_upload_conversation_image_tip': '请上传聊天记录图片',