UserSceneSessionService.java 4.64 KB
package com.xly.service;

import cn.hutool.core.util.ObjectUtil;
import com.xly.agent.ChatiAgent;
import com.xly.agent.DynamicTableNl2SqlAiAgent;
import com.xly.agent.ErpAiAgent;
import com.xly.config.OperableChatMemoryProvider;
import com.xly.entity.SceneDto;
import com.xly.entity.ToolMeta;
import com.xly.entity.UserSceneSession;
import com.xly.mapper.UserSceneSessionMapper;
import com.xly.runner.AppStartupRunner;
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

@Service("userSceneSessionService")
public class UserSceneSessionService {

    // 新增核心缓存:用户场景会话状态(记录是否选场景、当前场景、权限内场景)
    public static final Map<String, UserSceneSession> USER_SCENE_SESSION_CACHE = new HashMap<>();

    // 原有缓存:Agent实例、会话记忆
    public static final Map<String, ErpAiAgent> ERP_AGENT_CACHE = new HashMap<>();
    public static final Map<String, ChatiAgent> CHAT_AGENT_CACHE = new HashMap<>();
    public static final Map<String, DynamicTableNl2SqlAiAgent> ERP_DynamicTableNl2SqlAiAgent_CACHE = new HashMap<>();







    @Autowired
    private UserSceneSessionMapper modelMapper;

    public List<Map<String, Object>> getModelAllByUserId(String sUserId){
        return modelMapper.findUserPermissions(sUserId);
    }

    public List<ToolMeta> getModle(String sUserId, String sUserType){
        List<Map<String, Object>> modleList = getModelAllByUserId(sUserId);
        Set<String> dataSet = new HashSet<>();
        if(ObjectUtil.isNotEmpty(modleList)){
            modleList.forEach(one->{
                String sKeys = one.get("sKey").toString();
                String[] sIds = sKeys.split("-");
                for(String sId:sIds){
                    if(ObjectUtil.isNotEmpty(sId)){
                        dataSet.add(sId);
                    }
                }
            });
        }
        List<String> data = new ArrayList<>(dataSet);
        if("sysadmin".equals(sUserType)){
            return AppStartupRunner.getAllTools();
        }else {
            return AppStartupRunner.getTools(data);
        }
    }
    /***
     * @Author 钱豹
     * @Date 14:03 2026/2/10
     * @Param []
     * @return void
     * @Description 清除所有记忆
     **/
    public void cleanAllSession(){
        USER_SCENE_SESSION_CACHE.clear();
        ERP_AGENT_CACHE.clear();
        CHAT_AGENT_CACHE.clear();
        ERP_DynamicTableNl2SqlAiAgent_CACHE.clear();
    }

    /***
     * @Author 钱豹
     * @Date 14:03 2026/2/10
     * @Param []
     * @return void
     * @Description 清除用户记忆
     **/
    public void cleanUserSession(String sUserId){
        USER_SCENE_SESSION_CACHE.remove(sUserId);
        ERP_AGENT_CACHE.remove(sUserId);
        CHAT_AGENT_CACHE.remove(sUserId);
        ERP_DynamicTableNl2SqlAiAgent_CACHE.remove(sUserId);
    }

    public UserSceneSession getUserSceneSession(String sUserId,
                                                String sUserName,
                                                String sBrandsId,
                                                String sSubsidiaryId,
                                                String sUserType,
                                                String authorization){

        if (USER_SCENE_SESSION_CACHE.containsKey(sUserId)) {
            return USER_SCENE_SESSION_CACHE.get(sUserId);
        }
        UserSceneSession userSceneSession = new UserSceneSession();
        List<ToolMeta> tools = getModle(sUserId,sUserType);
        List<SceneDto> sceneDtos = getAiAgent(tools);
        userSceneSession.setSceneSelected(false); // 初始状态:未选择场景
        userSceneSession.setAuthorization(authorization);//存入用户token
        userSceneSession.setUserId(sUserId);//存入用户ID
        userSceneSession.setAuthTool(tools);//方法
        userSceneSession.setAuthScenes(sceneDtos);//场景
        userSceneSession.setUserName(sUserName);
        userSceneSession.setSBrandsId(sBrandsId);
        userSceneSession.setSSubsidiaryId(sSubsidiaryId);
        // 3. 缓存会话
        USER_SCENE_SESSION_CACHE.put(sUserId, userSceneSession);
        return userSceneSession;
    }

    public List<SceneDto> getAiAgent(List<ToolMeta> tools){
       List<String> aiAgentIds = new ArrayList<>();
        tools.forEach(tool->{
            aiAgentIds.add(tool.getSSceneId());
        });
        List<SceneDto> agAll = AppStartupRunner.getAiAgentCache();
        return agAll.stream().filter(one-> aiAgentIds.contains(one.getSId())).collect(Collectors.toList());
    }

}