wjc
2026-03-06 b9408687a3c0490289206b7e3b623d1490b38afd
2026年03月06日09:52:20 增加AI接口
6个文件已添加
8个文件已修改
1166 ■■■■■ 已修改文件
app/src/main/java/com/hdl/photovoltaic/config/UserConfigManage.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/internet/ChatStreamClient.java 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/internet/api/HttpApi.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlAiLogic.java 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/other/HdlUniLogic.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/BPowerStationActivity.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/CPowerStationActivity.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatInfoBean.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatMessageBean.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatMessageListBean.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/bean/ChatMessagePageBean.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/me/AsRegardsActivity.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/ui/me/MeFragment.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/hdl/photovoltaic/uni/HDLUniMP.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 --------【原生】主动发送到【小程序】--------