Ver Fonte

[feat]亲密度分析,分析结果的报告字段,填充到组件中

hezihao há 7 meses atrás
pai
commit
af1bddb98d

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

@@ -337,6 +337,10 @@
     <string name="intimacy_respond">情绪回应</string>
     <string name="intimacy_intimacy_ratio">亲密词占比</string>
 
+    <string name="intimacy_intimacy_emotion_need">情感需求</string>
+    <string name="intimacy_intimacy_chat_strategy">聊天策略</string>
+    <string name="intimacy_intimacy_summary">总结</string>
+
     <string name="preview">预览</string>
 
     <string name="retry">再试试</string>

+ 17 - 11
lib/data/api/response/intimacy_analyze_response.dart

@@ -37,25 +37,31 @@ class IntimacyAnalyzeResponse {
   @JsonKey(name: "need")
   String? need;
 
-  /// 短期聊天策略
-  @JsonKey(name: "shortChat")
-  String? shortChat;
-
-  /// 长期聊天策略
-  @JsonKey(name: "longChat")
-  String? longChat;
+  /// 聊天策略
+  @JsonKey(name: "chatStrategy")
+  String? chatStrategy;
 
   /// 总结
   @JsonKey(name: "summary")
   String? summary;
 
-  /// 预测方向的名称
+  /// 预测方向的名称(服务端没返回,客户端手动取用户选择的来赋值)
   @JsonKey(name: "directionName")
   String? directionName;
 
-  IntimacyAnalyzeResponse(this.emotion, this.intimacyPhase, this.interaction,
-      this.topic, this.respond, this.intimacyRatio, this.direction, this.need,
-      this.shortChat, this.longChat, this.summary, this.directionName);
+  IntimacyAnalyzeResponse(
+    this.emotion,
+    this.intimacyPhase,
+    this.interaction,
+    this.topic,
+    this.respond,
+    this.intimacyRatio,
+    this.direction,
+    this.need,
+    this.chatStrategy,
+    this.summary,
+    this.directionName,
+  );
 
   factory IntimacyAnalyzeResponse.fromJson(Map<String, dynamic> json) =>
       _$IntimacyAnalyzeResponseFromJson(json);

+ 2 - 4
lib/data/api/response/intimacy_analyze_response.g.dart

@@ -17,8 +17,7 @@ IntimacyAnalyzeResponse _$IntimacyAnalyzeResponseFromJson(
   json['intimacyRatio'] as String?,
   json['direction'] as String?,
   json['need'] as String?,
-  json['shortChat'] as String?,
-  json['longChat'] as String?,
+  json['chatStrategy'] as String?,
   json['summary'] as String?,
   json['directionName'] as String?,
 );
@@ -34,8 +33,7 @@ Map<String, dynamic> _$IntimacyAnalyzeResponseToJson(
   'intimacyRatio': instance.intimacyRatio,
   'direction': instance.direction,
   'need': instance.need,
-  'shortChat': instance.shortChat,
-  'longChat': instance.longChat,
+  'chatStrategy': instance.chatStrategy,
   'summary': instance.summary,
   'directionName': instance.directionName,
 };

+ 8 - 28
lib/module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_controller.dart

@@ -73,33 +73,12 @@ class IntimacyAnalyseUploadController extends BaseController {
   /// 是否可以自定义方向
   RxBool isCanCustomDirection = false.obs;
 
-  /// 报告的markdown数据
-  RxString reportMarkdownData =
-      '''
-  **性格匹配度**
-
-  ● 互补型:一方外向活泼,另一方沉稳内敛,形成动态平衡。
-  ● 相似型:三观一致,兴趣重叠,减少摩擦但需警惕新鲜感流失。
-  ● 关键结论:差异是火花的来源,但核心价值观需一致(如家庭观、金钱观)。
-
-  **沟通模式分析**
-
-  ● 语言风格:幽默调侃型 vs 理性分析型 → 需找到共同表达方式。
-  ● 冲突解决:回避型 vs 直面型 → 建议建立“冷静-沟通”机制。
-  ● 情感需求:一方需要高频互动,另一方偏好独立空间 → 需协商平衡点。
-
-  **爱情语言测试**
-
-  ● 根据盖瑞·查普曼的“五种爱之语”理论,分析双方的情感表达偏好:
-  ● 你的主要爱语:肯定的言辞(如情话、鼓励)
-  '''.obs;
-
-  // TODO hezihao,测试报告生成中
-  // RxString reportMarkdownData = "".obs;
-
   /// 报告是否已解锁
   Rx<bool> isReportUnlock = true.obs;
 
+  /// 报告是否生成中
+  Rx<bool> isReportCreating = false.obs;
+
   /// 当前键盘信息
   Rxn<KeyboardInfo> currentKeyboardInfo = Rxn();
 
@@ -348,7 +327,9 @@ class IntimacyAnalyseUploadController extends BaseController {
       return;
     }
 
-    LoadingDialog.show(StringName.intimacyAnalyseIng);
+    // 报告生成中
+    isReportCreating.value = true;
+
     try {
       // 分析亲密度
       IntimacyAnalyzeResponse response = await intimacyAnalyzeRepository
@@ -360,12 +341,11 @@ class IntimacyAnalyseUploadController extends BaseController {
 
       AtmobLog.d(tag, "分析亲密度 => ${response.toJson()}");
 
-      LoadingDialog.hide();
-
+      isReportCreating.value = false;
       intimacyAnalyzeResult.value = response;
       isUploadPage.value = false;
     } catch (error) {
-      LoadingDialog.hide();
+      isReportCreating.value = false;
       AtmobLog.e(tag, error.toString());
       if (error is ServerErrorException) {
         // 需要Vip权限

+ 2 - 1
lib/module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_page.dart

@@ -278,9 +278,10 @@ class IntimacyAnalyseUploadPage
         children: [
           SizedBox(height: 12.h),
           IntimacyAnalyseReportWidget(
-            reportContent: controller.reportMarkdownData.value,
+            // 分析结果
             intimacyAnalyzeResult: controller.intimacyAnalyzeResult.value,
             unlock: controller.isReportUnlock.value,
+            isReportCreating: controller.isReportCreating.value,
           ),
         ],
       );

+ 61 - 5
lib/module/intimacy_analyse/widget/intimacy_analyse_report_widget.dart

@@ -4,11 +4,13 @@ import 'package:keyboard/resource/string.gen.dart';
 import 'package:lottie/lottie.dart';
 
 import '../../../data/api/response/intimacy_analyze_response.dart';
+import '../../../data/bean/intimacy_analyse_report.dart';
 import '../../../resource/assets.gen.dart';
 import '../../../resource/colors.gen.dart';
 import '../../../utils/string_format_util.dart';
 import '../../../widget/animated_progress_bar.dart';
 import '../../../widget/markdown/markdown_viewer.dart';
+import '../analyse_report/widget/report_item_widget.dart';
 
 /// 亲密度报告组件
 class IntimacyAnalyseReportWidget extends StatelessWidget {
@@ -24,12 +26,16 @@ class IntimacyAnalyseReportWidget extends StatelessWidget {
   /// 是否是预览
   final bool isPreview;
 
+  /// 是否报告生成中
+  final bool isReportCreating;
+
   const IntimacyAnalyseReportWidget({
     super.key,
-    required this.reportContent,
+    this.reportContent = '',
     this.intimacyAnalyzeResult,
     this.unlock = false,
     this.isPreview = false,
+    this.isReportCreating = false,
   });
 
   @override
@@ -42,7 +48,7 @@ class IntimacyAnalyseReportWidget extends StatelessWidget {
       return UnlockReportCardWidget();
     }
     // 报告生成中
-    if (intimacyAnalyzeResult == null || reportContent.isEmpty) {
+    if (isReportCreating) {
       return CreatingReportCardWidget();
     }
     // 已出报告
@@ -113,7 +119,9 @@ class ExistReportCardWidget extends StatelessWidget {
         children: [
           _buildReportOverview(),
           SizedBox(height: 10.h),
-          _buildReportDetail(),
+          reportContent.isNotEmpty
+              ? _buildReportDetailByMarkdown()
+              : _buildReportDetail(),
         ],
       ),
     );
@@ -397,8 +405,8 @@ class ExistReportCardWidget extends StatelessWidget {
     );
   }
 
-  /// 报告详情
-  Widget _buildReportDetail() {
+  /// 报告详情,使用Markdown
+  Widget _buildReportDetailByMarkdown() {
     return Container(
       decoration: ShapeDecoration(
         color: ColorName.white,
@@ -414,6 +422,54 @@ class ExistReportCardWidget extends StatelessWidget {
       ),
     );
   }
+
+  /// 报告详情,使用组件渲染
+  Widget _buildReportDetail() {
+    if (intimacyAnalyzeResult == null) {
+      return SizedBox();
+    }
+
+    // 组装数据
+    IntimacyAnalyseReport reportPreviewData = IntimacyAnalyseReport(
+      list: [
+        AnalyseItem(
+          title: StringName.intimacyintimacyEmotionNeed,
+          sections: [intimacyAnalyzeResult?.need ?? ""],
+        ),
+        AnalyseItem(
+          title: StringName.intimacyintimacyChatStrategy,
+          sections: [intimacyAnalyzeResult?.chatStrategy ?? ""],
+        ),
+        AnalyseItem(
+          title: StringName.intimacyintimacySummary,
+          sections: [intimacyAnalyzeResult?.summary ?? ""],
+        ),
+      ],
+    );
+
+    return _buildReportContent(reportPreviewData);
+  }
+
+  /// 构建报告内容
+  Widget _buildReportContent(IntimacyAnalyseReport report) {
+    return Container(
+      padding: EdgeInsets.all(14.w),
+      decoration: ShapeDecoration(
+        color: ColorName.white,
+        shape: RoundedRectangleBorder(
+          borderRadius: BorderRadius.circular(30.r),
+        ),
+      ),
+      child: Column(
+        children: [
+          // 报告列表
+          ...report.list.map((ele) {
+            return ReportItemWidget(item: ele);
+          }),
+        ],
+      ),
+    );
+  }
 }
 
 /// 报告生成中的卡片

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

@@ -241,6 +241,9 @@ class StringName {
   static final String intimacyTopic = 'intimacy_topic'.tr; // 话题好感度
   static final String intimacyRespond = 'intimacy_respond'.tr; // 情绪回应
   static final String intimacyintimacyRatio = 'intimacy_intimacy_ratio'.tr; // 亲密词占比
+  static final String intimacyintimacyEmotionNeed = 'intimacy_intimacy_emotion_need'.tr; // 情感需求
+  static final String intimacyintimacyChatStrategy = 'intimacy_intimacy_chat_strategy'.tr; // 聊天策略
+  static final String intimacyintimacySummary = 'intimacy_intimacy_summary'.tr; // 总结
   static final String preview = 'preview'.tr; // 预览
   static final String retry = 'retry'.tr; // 再试试
   static final String nextStep = 'next_step'.tr; // 下一步
@@ -524,6 +527,9 @@ class StringMultiSource {
       'intimacy_topic': '话题好感度',
       'intimacy_respond': '情绪回应',
       'intimacy_intimacy_ratio': '亲密词占比',
+      'intimacy_intimacy_emotion_need': '情感需求',
+      'intimacy_intimacy_chat_strategy': '聊天策略',
+      'intimacy_intimacy_summary': '总结',
       'preview': '预览',
       'retry': '再试试',
       'next_step': '下一步',