import 'package:dio/dio.dart'; import 'dio_manager.dart'; import 'nw_method.dart'; import 'package:get/get.dart'; class Api { static String _normalizeTemplateLanguageTag(String value) { final normalized = value.trim().replaceAll('_', '-'); if (normalized.isEmpty) { return 'en-US'; } final parts = normalized.split('-').where((e) => e.isNotEmpty).toList(); if (parts.isEmpty) { return 'en-US'; } if (parts.length == 1) { return parts.first.toLowerCase(); } return '${parts[0].toLowerCase()}-${parts[1].toUpperCase()}'; } static String _currentTemplateLanguageParam() { final locale = Get.locale ?? Get.deviceLocale; final languageCode = locale?.languageCode.toLowerCase(); if (languageCode == null || languageCode.isEmpty) { return 'en-US'; } final countryCode = locale?.countryCode?.toUpperCase(); if (countryCode != null && countryCode.isNotEmpty) { return '$languageCode-$countryCode'; } switch (languageCode) { case 'zh': return 'zh-CN'; case 'en': return 'en-US'; case 'ja': return 'ja-JP'; case 'ko': return 'ko-KR'; case 'fr': return 'fr-FR'; case 'de': return 'de-DE'; case 'es': return 'es-ES'; case 'it': return 'it-IT'; case 'pt': return 'pt-BR'; case 'ru': return 'ru-RU'; case 'ar': return 'ar-SA'; case 'hi': return 'hi-IN'; default: return 'en-US'; } } // ===== 记忆中心(拾忆)===== // 路径规律:/api/home/<模块>_<方法小写>,由 gateway 的 /api/:param1/:param2 接住 // (param1 就是服务名 home),服务端 memory 模块靠反射注册,两边都不用改路由表。 /// 拉取记忆项:start_date / end_date / categories / states / tz / page / size static memoryList([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_list', params: params, ); } /// 当天事项 + 待确认报告标记:date / tz static memoryToday([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_today', params: params, ); } /// 新增:{item: {...}},item.client_key 非空时服务端做幂等 static memoryAdd([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_add', params: params, ); } /// 修改:{id, item, fields},服务端自动置 user_edited static memoryUpdate([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_update', params: params, ); } /// 删除:{ids: [...]} static memoryDel([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_del', params: params, ); } /// 标记完成/退回:{ids: [...], done: bool} static memoryComplete([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_complete', params: params, ); } /// 未来 N 天待提醒项(重复项已由服务端展开成绝对时刻):days / tz static memoryUpcoming([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_upcoming', params: params, ); } /// 统计:start_date / end_date / categories static memoryStats([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_stats', params: params, ); } /// 取周报/月报;period_type 与 period_key 都不传 = 最近一份未确认的 static memoryGetReport([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_getreport', params: params, ); } /// 确认报告:{report_id} static memoryConfirmReport([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_confirmreport', params: params, ); } /// 历史报告列表:period_type / page / size static memoryListReports([params]) { return DioManager().request( NWMethod.post, '/api/home/memory_listreports', params: params, ); } // 登录 static login([params]) { return DioManager().request( NWMethod.post, '/api/home/user_sgin', params: params, ); } // 获取验证码 static getCode([params]) { return DioManager().request( NWMethod.post, '/api/home/user_verification', params: params, ); } static tokenlogin([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getinfo', params: params, ); } // 获取阿里token static getAliToken([params]) { return DioManager().request( NWMethod.post, '/api/home/auth_alitoken', params: params, ); } //更新用户设置 static updateUserSetting([dynamic params]) { return DioManager().request( NWMethod.post, '/api/home/user_setting', params: params, ); } //注销账号 static deleteUser([params]) { return DioManager().request( NWMethod.post, '/api/home/user_del', params: params, ); } //用户反馈 static feedback([params]) { return DioManager().request( NWMethod.post, '/api/home/user_feedback', params: params, ); } //app配置 static getappconfig([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getappconfig', params: params, ); } //app获取设备信息 static getproduct([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getproduct', params: params, ); } //app获取设备信息 static getproducts([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getproducts', params: params, ); } //举报AI内容 static reportAiContent([params]) { return DioManager().request( NWMethod.post, '/api/home/user_reportaicontent', params: params, ); } //获取音乐连接 static getMusicUrl([params]) { return DioManager().request( NWMethod.post, '/api/home/music_getmusicurl', params: params, ); } // 上传会议助手操作记录 static putOperationRecord([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_putrecords', params: params, ); } // 获取会议助手数据 static getOperationAllRecord([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_getallrecords', params: params, ); } // 轮询多条会议助手转写结果 static getMultitermRecord([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_getrecords', params: params, ); } //获取渠道包信息 static getChannelApp([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getchannelapp', params: params, ); } //获取所有渠道包信息 //params 需带 version(本机版本号):游客登录入口是否显示由服务端按这个版本判定, //不传等于「认不出是哪一版」,后台若限定了生效版本会一律隐藏入口。 static getChannelApps([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getchannelapps', params: params, ); } //绑定设备 static binddevice([params]) { return DioManager().request( NWMethod.post, '/api/home/user_binddevice', params: params, ); } //解绑定设备 static unbinddevice([params]) { return DioManager().request( NWMethod.post, '/api/home/user_unbinddevice', params: params, ); } // 获取验证码 static getdevices([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getdevices', params: params, ); } //创建支付订单 static paycreateorder([params]) { return DioManager().request( NWMethod.post, '/api/home/pay_createorder', params: params, ); } //询问订单 static payverifyorder([params]) { return DioManager().request( NWMethod.post, '/api/home/pay_verifyorder', params: params, ); } //获取模版数据 static getEchomeetTemplates([dynamic params, String? language]) { final resolvedLanguage = _normalizeTemplateLanguageTag( language ?? _currentTemplateLanguageParam()); final Map data = {}; if (params is Map) { data.addAll(Map.from(params)); } data['language'] = resolvedLanguage; return DioManager().request( NWMethod.post, '/api/home/echomeet_gettemplates', params: data, ); } //申请 MCP 会话令牌(短时效,放进百炼会话的 biz_params 透传给 MCP 工具) static getMcpToken() { return DioManager().request( NWMethod.post, '/api/home/user_getmcptoken', params: {}, ); } //添加模版数据 static addEchomeetTemplates([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_addtemplate', params: params, ); } //修改模版数据 static updateEchomeetTemplates([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_updatetemplate', params: params, ); } //删除模版数据 static delEchomeetTemplates([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_deltemplate', params: params, ); } //获取商品列表 static getGoods([params]) { return DioManager().request( NWMethod.post, '/api/home/pay_getgoodss', params: params, ); } /// 资源使用/用量上报接口(`/api/home/user_usages`) /// /// 用途:上报翻译(Translation)和会议(Meet)的用量,服务端据此统计并回传最新余额/积分。 /// /// 当前在 Dart 侧的使用场景: /// - 会议助手 ASR:`UsageStatsService._reportMeetingUsageToServer` /// - 翻译/同传 ASR:`UsageStatsService._reportAsrUsageToServer` /// /// 参数(`params`)结构: /// - `usagetype`:`int` 类型,使用场景类型(对应 `UsageType.toInt`),目前仅使用: /// - `1`:翻译(Translation) /// - `2`:会议(Meet) /// - `usages`:`Map`,各项指标的键值对,例如: /// - `MEETING_ASR_AUDIO_SECONDS`:会议识别音频时长(秒) /// - `TRANSLATION_MODE_{mode}`:某翻译模式下累计有效识别秒数 /// - `TRANSLATION_ASR_LANGUAGE_{language}`:某语言/语言对下的调用次数 /// /// 返回: /// - 经过 `AuthInterceptor` 处理后,本方法返回值即为服务端响应体中的 `data` 字段。 /// - 若上报成功,`data['usages']` 为 `Map`,内部各键的含义与积分/余额更新规则由服务端约定。 /// /// 使用示例(Dart): /// ```dart /// final params = { /// 'usagetype': UsageType.Meet.toInt, /// 'usages': { /// 'MEETING_ASR_AUDIO_SECONDS': 120, /// } /// }; /// final data = await Api.usagesResPoints(params); /// final usages = (data['usages'] as Map?)?.cast(); /// ``` static usagesResPoints([params]) { return DioManager().request( NWMethod.post, '/api/home/user_usages', params: params, ); } /// 会员与算力状态(`/api/home/user_getcompute`)。 /// /// 一次拿齐:`vip{level, exptime, selfexptime, devices[]}`(自购与设备赋予合并后的有效值)、 /// `compute{deviceleft, userbalance, totalused, monthused}`、`rates{translate, meeting, aichat, gate}`。 /// 客户端**不做任何换算**,展示服务端给的数;`rates` 只用于本地预估文案。 static getCompute([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getcompute', params: params ?? {}, ); } static getwakeupvoices([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getwakeupvoices', params: params, ); } static addRecordEchomeet([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_addrecord', params: params, ); } static upRecordEchomeet([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_uprecord', params: params, ); } static startTaskEchomeet([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_starttask', params: params, ); } static refreshTaskEchomeet([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_summary', params: params, ); } static readRecordEchomeet([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_readrecord', params: params, ); } static delRecordEchomeet([params]) { return DioManager().request( NWMethod.post, '/api/home/echomeet_delrecords', params: params, ); } static modifyRecordEchomeet([params]) { Map data = { 'title': 'NULL', 'address': 'NULL', 'personnel': 'NULL', 'translate': 'NULL', 'summary': 'NULL', }; data.addAll(params); return DioManager().request( NWMethod.post, '/api/home/echomeet_modifyrecords', params: data, ); } // 实名认证:提交姓名 + 身份证号,由服务端调阿里云/腾讯云做二要素核验。 // 身份证号只用于这一次核验,服务端不落全文(只存掩码 + 加盐指纹)。 static userIdVerify([params]) { return DioManager().request( NWMethod.post, '/api/home/user_idverify', params: params, ); } // 查询本账号的实名状态 static userGetIdVerify([params]) { return DioManager().request( NWMethod.post, '/api/home/user_getidverify', params: params, ); } // 申请文件上传地址:服务端签发阿里云 OSS 预签名 PUT URL,客户端拿着它直传。 // // 对象存储的长期密钥因此不必下发到客户端(旧的腾讯云 COS 那套是把 // SecretId/SecretKey 明文发给每个用户的)。object key 由服务端按会话里的 // uid 拼死,客户端只能给 scene(用途白名单)和文件名里的扩展名。 static getUploadUrl(params) { return DioManager().request( NWMethod.post, '/api/home/user_getuploadurl', params: params, ); } // 实时机器翻译:服务端代调后台「第三方服务配置」里启用的 MT 服务。 // 云账号凭据因此不必下发到客户端。 // // [cancelToken] 供同传/面对面的**中间结果**翻译使用:说话过程中会连着发好几次, // 后一次发出时要把前一次撤掉,别让废弃的预览请求占着链路和服务商配额。 static userTranslate(params, {CancelToken? cancelToken}) { return DioManager().request( NWMethod.post, '/api/home/user_translate', params: params, cancelToken: cancelToken, ); } }