You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

600 lines
16 KiB

import 'api_crypto.dart';
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配置
//
// 2026-09-14 起首选加密的 v3:多下发 thirdsvcs(结构化第三方服务,凭据明文、按区域合并),
// 各业务服务经 AppConfig.cred() 优先从它取凭据。整个响应体 AES-CBC 加密(见 api_crypto.dart),
// 密钥 .env 的 GATEWAY_ENCRYPT_KEY;没配则回退明文 v1——功能不断,只是凭据仍走 env 兼容层。
// ⚠️ v3 必须在网关白名单里(splash 未登录就要取配置),见 deploy/app/confs/gateway.yaml.example。
static getappconfig([params]) {
final path = ApiCrypto.enabled
? '/api/home/user_getappconfig_v3'
: '/api/home/user_getappconfig';
return DioManager().request(
NWMethod.post,
path,
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 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<String, dynamic> data = {};
if (params is Map) {
data.addAll(Map<String, dynamic>.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<String, int>`,各项指标的键值对,例如:
/// - `MEETING_ASR_AUDIO_SECONDS`:会议识别音频时长(秒)
/// - `TRANSLATION_MODE_{mode}`:某翻译模式下累计有效识别秒数
/// - `TRANSLATION_ASR_LANGUAGE_{language}`:某语言/语言对下的调用次数
///
/// 返回:
/// - 经过 `AuthInterceptor` 处理后,本方法返回值即为服务端响应体中的 `data` 字段。
/// - 若上报成功,`data['usages']` 为 `Map<String, int>`,内部各键的含义与积分/余额更新规则由服务端约定。
///
/// 使用示例(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<String, dynamic>();
/// ```
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 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,
);
}
//拉一条会议记录的整条数据(含 original/translate/summary)。列表接口只回骨架,详情页进页面时调这个
static getRecordEchomeet([params]) {
return DioManager().request(
NWMethod.post,
'/api/home/echomeet_getrecord',
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, Duration? timeout}) {
return DioManager().request(
NWMethod.post,
'/api/home/user_translate',
params: params,
cancelToken: cancelToken,
timeout: timeout,
);
}
}