app/src/main/java/com/hdl/photovoltaic/config/UserConfigManage.java
@@ -65,6 +65,42 @@ //是否正式服务器(true:正式,false:测试) private boolean isOnlineServer = false; //智能体接口密钥 private String agentSecret; //智能体接口地址 private String agentUrl; //当前会话ID private String conversationId; public String getAgentUrl() { return agentUrl == null ? "" : agentUrl; } public void setAgentUrl(String agentUrl) { this.agentUrl = agentUrl; } /** * 智能体AppKey * * @return 智能体AppKey */ public String getAgentSecret() { return agentSecret == null ? "" : agentSecret; } public void setAgentSecret(String agentApiKey) { this.agentSecret = agentApiKey; } public String getConversationId() { return conversationId == null ? "" : conversationId; } public void setConversationId(String conversationId) { this.conversationId = conversationId; } public boolean isOnlineServer() { return isOnlineServer; } @@ -450,6 +486,7 @@ /** * 是不是阿拉伯语言 * * @return true表示是阿拉伯语言,否则不是 */ public boolean isArabicLanguage() { app/src/main/java/com/hdl/photovoltaic/internet/ChatStreamClient.java
New file @@ -0,0 +1,338 @@ package com.hdl.photovoltaic.internet; import android.text.TextUtils; import android.util.Log; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.hdl.photovoltaic.config.UserConfigManage; import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; import java.io.IOException; import java.util.Objects; import java.util.concurrent.TimeUnit; import okhttp3.Cache; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; import okio.Buffer; /** * AI 聊天流式请求工具类 * 支持 SSE (Server-Sent Events) 流式响应 * 类似 ChatGPT 的流式输出效果 */ public class ChatStreamClient { // 单例实例 private static volatile ChatStreamClient instance; /** * 获取单例实例 */ public static ChatStreamClient getInstance() { if (instance == null) { synchronized (ChatStreamClient.class) { if (instance == null) { instance = new ChatStreamClient(); } } } return instance; } // ==================== 常量定义 ==================== private static final MediaType JSON = MediaType.get("application/json"); private static final String SSE_MEDIA_TYPE = "text/event-stream"; private static final String JSON_MEDIA_TYPE = "application/json"; private static final String DONE_FLAG = "[DONE]"; private final OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(0, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) // .connectionPool(new ConnectionPool( // builder.maxIdleConnections, // builder.keepAliveDuration, // builder.timeUnit // )) // .retryOnConnectionFailure(builder.retryOnFailure) // .addInterceptor(new HttpLoggingInterceptor()) // 可选:添加日志 .build(); ; // HTTP 客户端 private final Gson gson = new Gson(); // JSON 解析器 private final String apiKey = "Bearer " + UserConfigManage.getInstance().getAgentSecret(); // API 密钥 private final String baseUrl = UserConfigManage.getInstance().getAgentUrl();// "https://agent.hdlcontrol.com/v1";; // 基础 URL // ==================== 回调接口 ==================== public interface ChatCallback { /** * 收到消息片段时回调(流式输出) * * @param content 消息内容片段 */ void onMessage(String content); /** * 消息完成时回调 */ default void onComplete() { } /** * 发生错误时回调 * * @param error 错误信息 */ default void onError(String error) { } /** * 收到完整消息时回调(非流式模式使用) * * @param fullMessage 完整消息 */ default void onFullMessage(String fullMessage) { } } // ==================== 请求参数类 ==================== public static class ChatMode { public boolean stream = true; public boolean isGet = false; public String url = ""; public Object data = null; } /** * 发送流式聊天请求(完整参数) * * @param chatMode 请求参数 * @param callback 回调接口 * @return Cancelable 可取消的对象 */ public Cancelable streamChat(ChatMode chatMode, ChatCallback callback) { // // 确保是流式请求 // chatMode.stream = true; // 构建 HTTP 请求 Request httpRequest = buildHttpRequest(chatMode); // try { // // 获取请求体 // if (httpRequest.body() != null) { // Buffer buffer = new Buffer(); // httpRequest.body().writeTo(buffer); // String body = buffer.readUtf8(); // // 注意:读取后记得关闭 buffer // buffer.close(); // System.out.println("Request Body: " + body); // // } // } catch (Exception e) { // // } // 创建可取消的 Call Call call = okHttpClient.newCall(httpRequest); // 执行异步请求 call.enqueue(new StreamCallbackHandler(call, chatMode, callback)); // 返回可取消对象 return () -> { if (!call.isCanceled()) { call.cancel(); } }; } /** * 发送非流式聊天请求(一次性返回) * * @param request 请求参数 * @return 完整响应 */ public String chatSync(ChatMode request) { // request.stream = false; Request httpRequest = buildHttpRequest(request); try (Response response = okHttpClient.newCall(httpRequest).execute()) { if (!response.isSuccessful()) { return response.message() + "(" + response.code() + ")"; } return Objects.requireNonNull(response.body()).string(); } catch (Exception e) { return e.getMessage(); } } /** * 构建 HTTP 请求 */ private Request buildHttpRequest(ChatMode ChatMode) { String jsonBody = ""; if (ChatMode.data != null) { jsonBody = gson.toJson(ChatMode.data); } String newUrl = baseUrl + ChatMode.url; if (ChatMode.isGet) { return new Request.Builder() .url(newUrl) .get() .addHeader("Authorization", apiKey) .addHeader("Cache-Control", "no-cache") .addHeader("Connection", "keep-alive") .build(); } else { return new Request.Builder() .url(newUrl) .post(RequestBody.create(jsonBody, JSON)) .addHeader("Authorization", apiKey) .addHeader("Accept", ChatMode.stream ? SSE_MEDIA_TYPE : JSON_MEDIA_TYPE) .addHeader("Cache-Control", "no-cache") .addHeader("Connection", "keep-alive") .build(); } } /** * 解析流式数据块 */ private String parseStreamChunk(String data) { if (data == null || data.isEmpty() || data.equals(DONE_FLAG)) { return ""; } try { JsonObject json = JsonParser.parseString(data).getAsJsonObject(); String event = json.has("event") ? json.get("event").getAsString() : ""; if (event.equals("message")) { return json.getAsString(); } else if (event.equals("message_end")) { return DONE_FLAG; } else if (event.equals("error")) { return "error"; } else { return ""; } } catch (Exception e) { // 解析失败,返回原始数据 return data; } } // ==================== 流式响应处理器 ==================== private class StreamCallbackHandler implements Callback { private final Call call; private final ChatMode request; private final ChatCallback callback; private final StringBuilder fullContent = new StringBuilder(); public StreamCallbackHandler(Call call, ChatMode request, ChatCallback callback) { this.call = call; this.request = request; this.callback = callback; } @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { callback.onError("Network error: " + e.getMessage()); } @Override public void onResponse(@NotNull Call call, @NotNull Response response) { if (!response.isSuccessful()) { callback.onError("HTTP error: " + response.code()); response.close(); return; } // 检查内容类型 MediaType contentType = response.body().contentType(); if (contentType == null || !contentType.toString().startsWith(SSE_MEDIA_TYPE)) { // 如果不是流式,可能是普通 JSON try { String body = response.body().string(); callback.onFullMessage(body); } catch (IOException e) { callback.onError("Parse error: " + e.getMessage()); } response.close(); return; } // 流式处理 try (ResponseBody responseBody = response.body()) { BufferedReader reader = new BufferedReader(responseBody.charStream()); String line; while ((line = reader.readLine()) != null) { if (call.isCanceled()) { break; } if (line.startsWith("data:")) { String data = line.substring(5).trim(); Log.d("流式处理==", line); if (data.equals(DONE_FLAG)) { callback.onComplete(); break; } String content = parseStreamChunk(data); if (!TextUtils.isEmpty(content)) { if (content.equals(DONE_FLAG)) { callback.onComplete(); break; } else if (content.equals("error")) { callback.onError(data); break; } fullContent.append(content); callback.onMessage(content); } } } // // 如果没收到 DONE 但流结束了,也回调 complete // if (isActive.get()) { // callback.onComplete(); // } } catch (IOException e) { callback.onError("Stream error: " + e.getMessage()); } } } // ==================== 可取消接口 ==================== public interface Cancelable { void cancel(); } /** * 释放资源(应用退出时调用) */ public void shutdown() { okHttpClient.dispatcher().executorService().shutdown(); okHttpClient.connectionPool().evictAll(); try { Cache cache = okHttpClient.cache(); if (cache != null) { cache.close(); } } catch (IOException e) { e.printStackTrace(); } } } app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java
@@ -229,6 +229,8 @@ public static final String C_POST_HOME_GETHEADPÏORTRAIT = "/home-wisdom/app/child/account/getHeadPÏortrait"; //注销账号 public static final String C_POST_MEMBER_UNREGISTER = "/basis-footstone/member/unregister"; //查看智能体详情 public static final String GET_AGENT_INFO = "/basis-footstone/agent/info"; //endregion //endregion app/src/main/java/com/hdl/photovoltaic/other/HdlAiLogic.java
New file @@ -0,0 +1,345 @@ package com.hdl.photovoltaic.other; import android.text.TextUtils; import android.util.Log; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import com.hdl.linkpm.sdk.HDLLinkPMSdk; import com.hdl.linkpm.sdk.core.exception.HDLException; import com.hdl.linkpm.sdk.user.HDLLinkPMUser; import com.hdl.photovoltaic.bean.PageNumberObject; import com.hdl.photovoltaic.config.UserConfigManage; import com.hdl.photovoltaic.internet.ChatStreamClient; import com.hdl.photovoltaic.internet.HttpClient; import com.hdl.photovoltaic.internet.api.HttpApi; import com.hdl.photovoltaic.listener.CloudCallBeak; import com.hdl.photovoltaic.ui.bean.ChatInfoBean; import com.hdl.photovoltaic.ui.bean.ChatMessageBean; import com.hdl.photovoltaic.ui.bean.ChatMessageListBean; import com.hdl.photovoltaic.ui.bean.ChatMessagePageBean; import com.hdl.photovoltaic.ui.bean.StaffBean; import com.hdl.photovoltaic.uni.HDLUniMPSDKManager; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; /** * Ai逻辑 */ public class HdlAiLogic { private static volatile HdlAiLogic sHdlAiLogic; private final Gson gson = new Gson(); /** * 获取当前对象 * * @return HdlAccountLogic */ public static synchronized HdlAiLogic getInstance() { if (sHdlAiLogic == null) { synchronized (HdlAiLogic.class) { if (sHdlAiLogic == null) { sHdlAiLogic = new HdlAiLogic(); } } } return sHdlAiLogic; } /** * 获取智能体详情 * * @param cloudCallBeak - */ public void getChatInfo(CloudCallBeak<ChatInfoBean> cloudCallBeak) { String requestUrl = HttpApi.GET_AGENT_INFO; JsonObject json = new JsonObject(); json.addProperty("agentCode", "xenterra_app_rag"); HttpClient.getInstance().requestHttp(requestUrl, json.toString(), new CloudCallBeak<String>() { @Override public void onSuccess(String jsonStr) { if (TextUtils.isEmpty(jsonStr)) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(new ChatInfoBean()); } } Type type = new TypeToken<ChatInfoBean>() { }.getType(); ChatInfoBean chatInfoBean = gson.fromJson(jsonStr, type); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(chatInfoBean); } } @Override public void onFailure(HDLException e) { if (cloudCallBeak != null) { cloudCallBeak.onFailure(e); } } }); } /** * 获取对话列表 * */ public void chatMessagesList(CloudCallBeak<ChatMessagePageBean> cloudCallBeak) { ChatStreamClient.ChatMode chatMode = new ChatStreamClient.ChatMode(); chatMode.stream = false; chatMode.isGet = true; chatMode.url = "/conversations?" + "user=" + UserConfigManage.getInstance().getUserId();//+"&"+; ChatStreamClient.getInstance().streamChat(chatMode, new ChatStreamClient.ChatCallback() { @Override public void onMessage(String content) { } @Override public void onFullMessage(String fullMessage) { ChatStreamClient.ChatCallback.super.onFullMessage(fullMessage); try { if (TextUtils.isEmpty(fullMessage)) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(new ChatMessagePageBean()); } return; } Type type = new TypeToken<ChatMessagePageBean>() { }.getType(); ChatMessagePageBean chatMessagePageBean = gson.fromJson(fullMessage, type); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(chatMessagePageBean); } } catch (Exception e) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } } } @Override public void onError(String error) { ChatStreamClient.ChatCallback.super.onError(error); if (cloudCallBeak != null) { cloudCallBeak.onFailure(new HDLException(-10201, error)); } } }); } /** * 创建会话消息,AI聊天 * * @param message 用户输入/提问内容。 */ public void chatMessages(String message, CloudCallBeak<ChatMessageBean> cloudCallBeak) { if (TextUtils.isEmpty(UserConfigManage.getInstance().getConversationId())) { this.chatMessagesList(new CloudCallBeak<ChatMessagePageBean>() { @Override public void onSuccess(ChatMessagePageBean obj) { if (obj != null && !obj.getData().isEmpty()) { UserConfigManage.getInstance().setConversationId(obj.getData().get(0).getId()); UserConfigManage.getInstance().Save(); } ChatStreamClient.ChatMode chatMode = new ChatStreamClient.ChatMode(); chatMode.data = getJsonObject(message); chatMode.stream = true; chatMode.url = "/chat-messages"; ChatStreamClient.getInstance().streamChat(chatMode, new ChatStreamClient.ChatCallback() { @Override public void onMessage(String content) { try { Type type = new TypeToken<ChatMessageBean>() { }.getType(); ChatMessageBean ChatMessageBean = gson.fromJson(content, type); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(ChatMessageBean); } Log.d("AI聊天回复===", gson.toJson(ChatMessageBean)); } catch (Exception e) { // if (cloudCallBeak != null) { // cloudCallBeak.onSuccess(null); // } if (cloudCallBeak != null) { cloudCallBeak.onFailure(new HDLException(-10202, e.getMessage())); } } } @Override public void onComplete() { ChatStreamClient.ChatCallback.super.onComplete(); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } Log.d("AI聊天回复===", "done"); } @Override public void onError(String error) { ChatStreamClient.ChatCallback.super.onError(error); if (cloudCallBeak != null) { cloudCallBeak.onFailure(new HDLException(-10201, error)); } } }); } @Override public void onFailure(HDLException e) { ChatStreamClient.ChatMode chatMode = new ChatStreamClient.ChatMode(); chatMode.data = getJsonObject(message); chatMode.stream = true; chatMode.url = "/chat-messages"; ChatStreamClient.getInstance().streamChat(chatMode, new ChatStreamClient.ChatCallback() { @Override public void onMessage(String content) { try { Type type = new TypeToken<ChatMessageBean>() { }.getType(); ChatMessageBean ChatMessageBean = gson.fromJson(content, type); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(ChatMessageBean); } Log.d("AI聊天回复===", gson.toJson(ChatMessageBean)); } catch (Exception e) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } } } @Override public void onComplete() { ChatStreamClient.ChatCallback.super.onComplete(); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } Log.d("AI聊天回复===", "done"); } @Override public void onError(String error) { ChatStreamClient.ChatCallback.super.onError(error); if (cloudCallBeak != null) { cloudCallBeak.onFailure(new HDLException(-10201, error)); } } }); } }); } else { ChatStreamClient.ChatMode chatMode = new ChatStreamClient.ChatMode(); chatMode.data = getJsonObject(message); chatMode.stream = true; chatMode.url = "/chat-messages"; ChatStreamClient.getInstance().streamChat(chatMode, new ChatStreamClient.ChatCallback() { @Override public void onMessage(String content) { try { Type type = new TypeToken<ChatMessageBean>() { }.getType(); ChatMessageBean ChatMessageBean = gson.fromJson(content, type); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(ChatMessageBean); } Log.d("AI聊天回复===", gson.toJson(ChatMessageBean)); } catch (Exception e) { if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } } } @Override public void onComplete() { ChatStreamClient.ChatCallback.super.onComplete(); if (cloudCallBeak != null) { cloudCallBeak.onSuccess(null); } Log.d("AI聊天回复===", "done"); } @Override public void onError(String error) { ChatStreamClient.ChatCallback.super.onError(error); if (cloudCallBeak != null) { cloudCallBeak.onFailure(new HDLException(-10201, error)); } } }); } } /** * 停止响应 * * @param task_id 任务ID */ public void chatMessageStop(String task_id, CloudCallBeak<Boolean> cloudCallBeak) { JsonObject json = new JsonObject(); if (!TextUtils.isEmpty(task_id)) { json.addProperty("task_id", task_id); } json.addProperty("user", UserConfigManage.getInstance().getUserId()); ChatStreamClient.ChatMode chatMode = new ChatStreamClient.ChatMode(); chatMode.data = json; chatMode.stream = false; chatMode.isGet = false; chatMode.url = "/chat-messages/:task_id/stop"; ChatStreamClient.getInstance().streamChat(chatMode, new ChatStreamClient.ChatCallback() { @Override public void onMessage(String content) { } @Override public void onFullMessage(String fullMessage) { //一次性回复 if (cloudCallBeak != null) { // boolean isSuccess = fullMessage.contains("\"success\":true"); boolean isSuccess = fullMessage.contains("true"); cloudCallBeak.onSuccess(isSuccess); } } @Override public void onError(String error) { ChatStreamClient.ChatCallback.super.onError(error); if (cloudCallBeak != null) { cloudCallBeak.onFailure(new HDLException(-10201, error)); } } }); } /** * 获取json对象 * * @param message 对话内容 * @return json对象 */ private JsonObject getJsonObject(String message) { JsonObject json = new JsonObject(); JsonObject inputs = new JsonObject(); inputs.addProperty("source", "APP"); inputs.addProperty("platform", "APP"); json.add("inputs", inputs); json.addProperty("query", message); json.addProperty("response_mode", "streaming"); json.addProperty("conversation_id", UserConfigManage.getInstance().getConversationId()); json.addProperty("user", UserConfigManage.getInstance().getUserId()); return json; } } app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java
@@ -47,6 +47,7 @@ import com.hdl.photovoltaic.listener.LinkCallBack; import com.hdl.photovoltaic.ui.LoginActivity; import com.hdl.photovoltaic.ui.bean.CUserInfo; import com.hdl.photovoltaic.ui.bean.ChatMessageBean; import com.hdl.photovoltaic.ui.bean.CloudInverterDeviceBean; import com.hdl.photovoltaic.ui.bean.DeviceInfoBean; import com.hdl.photovoltaic.ui.bean.DeviceTimeBean; @@ -939,6 +940,19 @@ } }); } else if (HDLUniMP.UNI_EVENT_REPLY_AI_MODEL.equals(topic)) { switch (type) { //发送ai对话聊天 case HDLUniMP.UNI_EVENT_REPLY_AI_MODEL_SENDAIREQUEST: { this.uniSendAIChat(mode_type, data, callback); } break; //发送ai对话聊天 case HDLUniMP.UNI_EVENT_REPLY_AI_MODEL_PAUSEAIREQUEST: { this.uniSendStopAIChat(mode_type, data, callback); } break; } } } catch (Exception e) { @@ -947,6 +961,59 @@ } /** * Uni(取消/暂停)AI聊天对话 * * @param callback - */ private void uniSendStopAIChat(String type, Object data, DCUniMPJSCallback callback) { String task_id = getKeyValue("task_id", getKeyValue("data", data)); HdlAiLogic.getInstance().chatMessageStop(task_id, new CloudCallBeak<Boolean>() { @Override public void onSuccess(Boolean obj) { if (callback != null) { uniSuccessCallback(type, obj, callback); } } @Override public void onFailure(HDLException e) { uniCallbackData(type, null, e.getCode(), e.getMsg(), callback); } }); } /** * Uni发起AI聊天对话 * * @param callback - */ private void uniSendAIChat(String type, Object data, DCUniMPJSCallback callback) { String query = getKeyValue("query", getKeyValue("data", data)); HdlAiLogic.getInstance().chatMessages(query, new CloudCallBeak<ChatMessageBean>() { @Override public void onSuccess(ChatMessageBean obj) { HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean(); if (obj == null) { //表示结束 uniCallBackBaseBean.setType(HDLUniMP.UNI_EVENT_REPLY_AI_MODEL_AISTREAMINGEND); } else { uniCallBackBaseBean.setType(HDLUniMP.UNI_EVENT_REPLY_AI_MODEL_AISTREAMING); uniCallBackBaseBean.setData(obj); } HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL, uniCallBackBaseBean); } @Override public void onFailure(HDLException e) { uniCallbackData(type, null, e.getCode(), e.getMsg(), callback); // HDLUniMP.UniCallBackBaseBean uniCallBackBaseBean = new HDLUniMP.UniCallBackBaseBean(); // uniCallBackBaseBean.setType(HDLUniMP.UNI_EVENT_REPLY_AI_MODEL_AISTREAMINGEND); // uniCallBackBaseBean.setData(e.getMessage()); // HdlUniLogic.getInstance().sendUni(HDLUniMP.UNI_EVENT_NOTIFICATION_DEVICE_MODEL, uniCallBackBaseBean); } }); } /** * 原生【打开】uni指定页面 app/src/main/java/com/hdl/photovoltaic/ui/BPowerStationActivity.java
@@ -37,6 +37,7 @@ import com.hdl.photovoltaic.enums.LowerTagType; import com.hdl.photovoltaic.enums.NetworkType; import com.hdl.photovoltaic.listener.CloudCallBeak; import com.hdl.photovoltaic.other.HdlAiLogic; import com.hdl.photovoltaic.other.HdlCommonLogic; import com.hdl.photovoltaic.other.HdlDeviceLogic; import com.hdl.photovoltaic.other.HdlESLocalJsonLogic; @@ -49,6 +50,9 @@ import com.hdl.photovoltaic.other.HdlThreadLogic; import com.hdl.photovoltaic.other.HdlUniLogic; import com.hdl.photovoltaic.push.PushMessageInfoBean; import com.hdl.photovoltaic.ui.bean.ChatInfoBean; import com.hdl.photovoltaic.ui.bean.ChatMessageListBean; import com.hdl.photovoltaic.ui.bean.ChatMessagePageBean; import com.hdl.photovoltaic.ui.bean.DeviceRemoteInfo; import com.hdl.photovoltaic.ui.bean.MessageBean; import com.hdl.photovoltaic.ui.bean.OidBean; @@ -141,7 +145,7 @@ this.getUnreadCount(); //获取云端脚本 HdlESLocalJsonLogic.getInstance().getAllHdlESLocalJson(); this.getChatInfo(); } @@ -376,6 +380,40 @@ } /** * 查看智能体详情 * */ private void getChatInfo() { HdlAiLogic.getInstance().getChatInfo(new CloudCallBeak<ChatInfoBean>() { @Override public void onSuccess(ChatInfoBean chatInfoBean) { UserConfigManage.getInstance().setAgentSecret(chatInfoBean.getAgentSecret()); UserConfigManage.getInstance().setAgentUrl(chatInfoBean.getAgentUrl()); UserConfigManage.getInstance().Save(); HdlAiLogic.getInstance().chatMessagesList(new CloudCallBeak<ChatMessagePageBean>() { @Override public void onSuccess(ChatMessagePageBean obj) { if (obj != null && !obj.getData().isEmpty()) { UserConfigManage.getInstance().setConversationId(obj.getData().get(0).getId()); UserConfigManage.getInstance().Save(); } } @Override public void onFailure(HDLException e) { } }); } @Override public void onFailure(HDLException e) { HdlLogLogic.print("获取智能体AppKey失败 Pu" + e.getMessage(), true); } }); } /** * 开启通知权限 */ private void notificationSet() { app/src/main/java/com/hdl/photovoltaic/ui/CPowerStationActivity.java
@@ -29,6 +29,7 @@ import com.hdl.photovoltaic.databinding.ActivityCpowerStationBinding; import com.hdl.photovoltaic.enums.NetworkType; import com.hdl.photovoltaic.listener.CloudCallBeak; import com.hdl.photovoltaic.other.HdlAiLogic; import com.hdl.photovoltaic.other.HdlCommonLogic; import com.hdl.photovoltaic.other.HdlDeviceLogic; import com.hdl.photovoltaic.other.HdlESLocalJsonLogic; @@ -41,6 +42,9 @@ import com.hdl.photovoltaic.other.HdlUniLogic; import com.hdl.photovoltaic.push.PushMessageInfoBean; import com.hdl.photovoltaic.services.ForeService; import com.hdl.photovoltaic.ui.bean.ChatInfoBean; import com.hdl.photovoltaic.ui.bean.ChatMessageListBean; import com.hdl.photovoltaic.ui.bean.ChatMessagePageBean; import com.hdl.photovoltaic.ui.bean.DeviceRemoteInfo; import com.hdl.photovoltaic.ui.bean.HouseIdBean; import com.hdl.photovoltaic.ui.bean.MessageBean; @@ -105,6 +109,7 @@ this.initMqttClient(); // //上传极光注册ID到云端 // this.pushTokens(); this.getChatInfo(); //上传推动令牌到云端(谷歌FCM推送) this.sendPushTokenToServer(UserConfigManage.getInstance().getPushToken()); //点击通知栏消息进来 @@ -115,6 +120,41 @@ // startService(); } /** * 查看智能体详情 * */ private void getChatInfo() { HdlAiLogic.getInstance().getChatInfo(new CloudCallBeak<ChatInfoBean>() { @Override public void onSuccess(ChatInfoBean chatInfoBean) { UserConfigManage.getInstance().setAgentSecret(chatInfoBean.getAgentSecret()); UserConfigManage.getInstance().setAgentUrl(chatInfoBean.getAgentUrl()); UserConfigManage.getInstance().Save(); HdlAiLogic.getInstance().chatMessagesList(new CloudCallBeak<ChatMessagePageBean>() { @Override public void onSuccess(ChatMessagePageBean obj) { if (obj != null && !obj.getData().isEmpty()) { UserConfigManage.getInstance().setConversationId(obj.getData().get(0).getId()); UserConfigManage.getInstance().Save(); } } @Override public void onFailure(HDLException e) { } }); } @Override public void onFailure(HDLException e) { HdlLogLogic.print("获取智能体详情失败:" + e.getMessage(), true); } }); } Intent mForegroundService; private void startService() { app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatInfoBean.java
New file @@ -0,0 +1,78 @@ package com.hdl.photovoltaic.ui.bean; import java.io.Serializable; public class ChatInfoBean implements Serializable { /** * 智能体平台 */ private String agentPlatform; private String agentCode; /** * 名称 */ private String agentName; /** * 描述 */ private String agentDesc; /** * 接口密钥 */ private String agentSecret; /** * 接口地址 */ private String agentUrl; public String getAgentPlatform() { return agentPlatform == null ? "" : agentPlatform; } public void setAgentPlatform(String agentPlatform) { this.agentPlatform = agentPlatform; } public String getAgentCode() { return agentCode == null ? "" : agentCode; } public void setAgentCode(String agentCode) { this.agentCode = agentCode; } public String getAgentName() { return agentName == null ? "" : agentName; } public void setAgentName(String agentName) { this.agentName = agentName; } public String getAgentDesc() { return agentDesc == null ? "" : agentDesc; } public void setAgentDesc(String agentDesc) { this.agentDesc = agentDesc; } public String getAgentSecret() { return agentSecret == null ? "" : agentSecret; } public void setAgentSecret(String agentSecret) { this.agentSecret = agentSecret; } public String getAgentUrl() { return agentUrl == null ? "" : agentUrl; } public void setAgentUrl(String agentUrl) { this.agentUrl = agentUrl; } } app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatMessageBean.java
New file @@ -0,0 +1,77 @@ package com.hdl.photovoltaic.ui.bean; import java.io.Serializable; /** * 聊天信息服务器返回事件(event)对象 * * @author HDL */ public class ChatMessageBean implements Serializable { private String event; private String conversation_id; private String message_id; private long created_at; private String task_id; private String id; private String answer; public String getEvent() { return event == null ? "" : event; } public void setEvent(String event) { this.event = event; } public String getConversation_id() { return conversation_id == null ? "" : conversation_id; } public void setConversation_id(String conversation_id) { this.conversation_id = conversation_id; } public String getMessage_id() { return message_id == null ? "" : message_id; } public void setMessage_id(String message_id) { this.message_id = message_id; } public long getCreated_at() { return created_at; } public void setCreated_at(long created_at) { this.created_at = created_at; } public String getTask_id() { return task_id == null ? "" : task_id; } public void setTask_id(String task_id) { this.task_id = task_id; } public String getId() { return id == null ? "" : id; } public void setId(String id) { this.id = id; } public String getAnswer() { return answer == null ? "" : answer; } public void setAnswer(String answer) { this.answer = answer; } } app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatMessageListBean.java
New file @@ -0,0 +1,93 @@ package com.hdl.photovoltaic.ui.bean; import java.io.Serializable; /** * 聊天对话列表实体类 */ public class ChatMessageListBean implements Serializable { private String id; private String name; private Inputs inputs; private String status; private String introduction; private long createdAt; private long updatedAt; public String getId() { return id == null ? "" : id; } public void setId(String id) { this.id = id; } public String getName() { return name == null ? "" : name; } public void setName(String name) { this.name = name; } public Inputs getInputs() { return inputs; } public void setInputs(Inputs inputs) { this.inputs = inputs; } public String getStatus() { return status == null ? "" : status; } public void setStatus(String status) { this.status = status; } public String getIntroduction() { return introduction == null ? "" : introduction; } public void setIntroduction(String introduction) { this.introduction = introduction; } public long getCreatedAt() { return createdAt; } public void setCreatedAt(long createdAt) { this.createdAt = createdAt; } public long getUpdatedAt() { return updatedAt; } public void setUpdatedAt(long updatedAt) { this.updatedAt = updatedAt; } public static class Inputs implements Serializable { private String source; private String platform; public String getSource() { return source == null ? "" : source; } public void setSource(String source) { this.source = source; } public String getPlatform() { return platform == null ? "" : platform; } public void setPlatform(String platform) { this.platform = platform; } } } app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatMessagePageBean.java
New file @@ -0,0 +1,38 @@ package com.hdl.photovoltaic.ui.bean; import java.io.Serializable; import java.util.ArrayList; import java.util.List; public class ChatMessagePageBean implements Serializable { private int limit; private boolean has_more; private List<ChatMessageListBean> data = new ArrayList<ChatMessageListBean>(); public boolean isHas_more() { return has_more; } public void setHas_more(boolean has_more) { this.has_more = has_more; } public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } public List<ChatMessageListBean> getData() { return data; } public void setData(List<ChatMessageListBean> data) { this.data = data; } } app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java
@@ -17,6 +17,7 @@ import com.hdl.photovoltaic.databinding.ActivityAsRegardsBinding; import com.hdl.photovoltaic.enums.ShowErrorMode; import com.hdl.photovoltaic.listener.CloudCallBeak; import com.hdl.photovoltaic.other.HdlAiLogic; import com.hdl.photovoltaic.other.HdlAppUpdateLogic; import com.hdl.photovoltaic.other.HdlCommonLogic; import com.hdl.photovoltaic.other.HdlThreadLogic; app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java
@@ -20,6 +20,7 @@ import com.hdl.photovoltaic.enums.LogoutType; import com.hdl.photovoltaic.listener.CloudCallBeak; import com.hdl.photovoltaic.other.HdlAccountLogic; import com.hdl.photovoltaic.other.HdlAiLogic; import com.hdl.photovoltaic.other.HdlLogLogic; import com.hdl.photovoltaic.other.HdlMemberLogic; import com.hdl.photovoltaic.other.HdlResidenceLogic; @@ -173,6 +174,7 @@ viewBinding.exitTv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { HdlAccountLogic.getInstance().logout(LogoutType.NormalLogout); } }); app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java
@@ -128,7 +128,6 @@ public final static String UNI_EVENT_REPLY_help_Detail = "help";//打开C端帮助页面 /*********Wifi模块*********/ public final static String UNI_EVENT_REPLY_WIFI_MODEL = "uni_wifi_model";//wifi模块(大类) public final static String UNI_EVENT_REPLY_PHONE_WIFI_LIST = "phone_wifi_list";//手机获取wifi列表 @@ -152,7 +151,12 @@ /*********网络请求模块*********/ public final static String UNI_EVENT_REPLY_UNI_SEND_TO_CLOUD = "uni_send_to_cloud";//uni网络请求 /*********AI模块*********/ public final static String UNI_EVENT_REPLY_AI_MODEL = "uni_ai_model";//AI模块(大类) public final static String UNI_EVENT_REPLY_AI_MODEL_SENDAIREQUEST = "uni_SendAIRequest";//发送ai请求 public final static String UNI_EVENT_REPLY_AI_MODEL_AISTREAMING = "uni_AIStreaming";// 流式请求片段 public final static String UNI_EVENT_REPLY_AI_MODEL_AISTREAMINGEND = "uni_AIStreamingEnd";// 流式请求结束 public final static String UNI_EVENT_REPLY_AI_MODEL_PAUSEAIREQUEST = "uni_PauseAIRequest";//取消ai请求 //endregion //region --------【原生】主动发送到【小程序】-------- @@ -171,7 +175,7 @@ public final static String UNI_EVENT_NOTIFICATION_DEVICE_home_debug_refresh = "home_debug_refresh";//电站二次调试 public final static String UNI_EVENT_NOTIFICATION_DEVICE_home_delivery_refresh = "home_delivery_refresh";//电站交付 public final static String UNI_EVENT_NOTIFICATION_DEVICE_home_delivery_rollback = "home_delivery_rollback";//电站交付回滚 public final static String UNI_EVENT_NOTIFICATION_DEVICE_open_ai_push_message = "open_ai_push_message";//打开AiTab public final static String UNI_EVENT_NOTIFICATION_DEVICE_open_ai_push_message = "open_ai_push_message";//打开AiTab //endregion