package com.xly.entity; import cn.hutool.core.util.ObjectUtil; import lombok.Data; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** * 用户会话状态:记录每个用户的场景选择状态,实现场景会话持久化 * 存储:用户ID、权限内场景、是否已选场景、当前选定场景 */ @Data public class UserSceneSession { /** * 唯一标识:用户ID */ private String userId; private String userName; private String authorization; private String sUserName; private String sBrandsId; private String sSubsidiaryId; /** * 该用户权限内可访问的所有场景(从权限映射中获取) */ private List authScenes; /*** * 用户问题集合 **/ private List sUserQuestionList; private List authTool; /** * 是否已选择场景(true=已选,进入专属场景交互;false=未选,先展示选择界面) */ private boolean sceneSelected = false; /** * 当前选定的业务场景(sceneSelected=true时才有值) */ private SceneDto currentScene; private ToolMeta currentTool; /*** * 当前未清返回的数据集 **/ private Map> currentRowData; /*** * @Author 钱豹 * @Date 10:07 2026/1/31 * @Param * @return * @Description 当前已有参数 **/ private Map currentArgs; private String sFunPrompts; //方法返回的参数补全提示 private Boolean bCleanMemory = false; private Map args; /** * 数据库类型 X: 向量库 S:数据库 */ private String dbType; /** * 数据库类型 H: 缓存 D: 动态 */ private String dbCach; /** * 构建场景选择提示语:展示权限内场景,引导用户选择 * @return 自然语言提示语 */ public String buildSceneSelectHint() { if (authScenes == null || authScenes.isEmpty()) { return "

抱歉,你暂无任何业务场景的访问权限,请联系管理员开通!

"; } // 按名称分组 StringBuilder sb = new StringBuilder("
"); sb.append("请输入序号或点链接进入"); sb.append("
    "); for(int i=0;i").append(i+1).append("、").append("") .append(sceneDto.getSNickName()).append("(").append(sceneDto.getSSceneContext()).append(")").append(""); } sb.append("
"); sb.append("提示:可直接输入问题,系统会自动匹配智能体! "); sb.append("
"); return sb.toString(); } // 新增:将权限内场景转换为「大模型可识别的描述字符串」 public String buildAuthScenesForLlm(List metasAll) { if (authScenes == null || authScenes.isEmpty()) { return "无可用场景"; } // 格式:场景编码-场景名称-支持功能,如ORDER_OPERATE-订单操作-下单、查订单、取消订单 return authScenes.stream() .map(scene -> "sceneCode:" + scene.getSSceneNo() + ",场景名称:" + scene.getSSceneName() + ",场景内容:\n" + getSceneContext(scene,metasAll)) .collect(Collectors.joining("\n")); } /*** * @Author 钱豹 * @Date 14:12 2026/2/6 * @Param [sceneDto, metasAll] * @return java.lang.String * @Description 方法名称拼接 **/ private String getSceneContext(SceneDto sceneDto,List metasAll){ List metas = metasAll.stream().filter(m->m.getSSceneId().equals(sceneDto.getSId())).collect(Collectors.toUnmodifiableList()); StringBuilder sb = new StringBuilder(); AtomicInteger index = new AtomicInteger(1); metas.forEach(m -> { sb.append(index.getAndIncrement()) .append(". 【") // .append(m.getSMethodNo()) // .append("-") .append(m.getSMethodName()) .append("】") .append(m.getStoolDesc()) .append("\n"); }); if(ObjectUtil.isEmpty(sb)){ sb.append(sceneDto.getSSceneContext()); } return sb.toString(); } /** * 根据用户输入的序号,匹配选定场景 * @param input 用户输入的序号(如1/2/3) * @return true=匹配成功,false=匹配失败 */ public boolean selectSceneByInput(String input) { try { int index = Integer.parseInt(input) - 1; if (index >= 0 && index < authScenes.size()) { this.currentScene = authScenes.get(index); this.sceneSelected = true; return true; } } catch (NumberFormatException e) { // 非数字输入,直接返回false } return false; } }