diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentOrchestrator.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentOrchestrator.java index 318f455d..c5af8277 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentOrchestrator.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/agent/AihrAgentOrchestrator.java @@ -221,7 +221,9 @@ public class AihrAgentOrchestrator { return value.contains("一份") && value.contains("另一份") || value.contains("两份") && containsAny(value, "不同", "不一致", "冲突", "哪一份", "哪个为准") || containsAny(value, "制度与项目公示", "预案和岗位手册", "服务承诺与工单") - && containsAny(value, "不一致", "不同", "以哪个为准", "应如何处理"); + && containsAny(value, "不一致", "不同", "以哪个为准", "应如何处理") + || value.contains("发生冲突") + && containsAny(value, "制度", "规则", "要求", "预案", "手册", "公示", "授权", "承诺", "工单"); } private static boolean isNoEvidenceBoundaryRequest(String question) { @@ -229,18 +231,21 @@ public class AihrAgentOrchestrator { return containsAny(value, "没有制度", "无制度", "没有依据", "无依据", "暂无依据", "没有明确依据", "无明确依据", "没有书面授权", "无书面授权", "没有确认授权", "没有确认", "无法确认", "没有配置", - "未配置", "查不到", "未查询到", "没有公示", "未公示", "证据不足"); + "未配置", "查不到", "未查询到", "没有公示", "未公示", "证据不足", + "资料里没有写", "材料没有规定", "知识库没有说明", "没有住户授权", "未收录的属地新规", + "没有已批准服务目录"); } private static boolean isUnauthorizedBoundaryRequest(String question) { String value = question == null ? "" : question.trim(); - if (containsAny(value, "其他项目", "别的项目", "跨项目", "不属于我的项目", "不在我的项目", - "尚未发布", "未发布内容", "未发布的制度", "制度草稿", "绕过权限", "无权附件")) { + if (containsAny(value, "其他项目", "另一个项目", "别的项目", "跨项目", "不属于我的项目", "不在我的项目", + "尚未发布", "未发布内容", "未发布的制度", "制度草稿", "绕过权限", "无权附件", + "只授权给", "未获财务授权")) { return true; } - boolean otherPerson = containsAny(value, "他人", "别人", "同事", "其他员工"); + boolean otherPerson = containsAny(value, "他人", "别人", "同事", "其他员工", "其他住户"); boolean sensitive = containsAny(value, "工资", "薪酬", "绩效", "人事", "审批明细", "审批记录", - "个人信息", "附件", "反馈记录", "投诉记录", "任务记录"); + "个人信息", "附件", "反馈记录", "投诉记录", "任务记录", "报修记录"); return otherPerson && sensitive; } diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentOrchestratorTest.java b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentOrchestratorTest.java index 3ca40d74..eb4904a1 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentOrchestratorTest.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/test/java/org/dromara/aihr/agent/AihrAgentOrchestratorTest.java @@ -70,9 +70,13 @@ class AihrAgentOrchestratorTest { var query = new CapturingQueryService(response("unused", null, false)); var result = orchestrator(query).handle(request("两份现行材料写的巡检频次不同,应执行哪一份?")); + var authorizationConflict = orchestrator(query) + .handle(request("空置房巡查要求与隐私授权规则发生冲突时可以直接进入吗?")); assertEquals(AgentStatus.NEEDS_INPUT, result.status()); + assertEquals(AgentStatus.NEEDS_INPUT, authorizationConflict.status()); assertTrue(result.answer().contains("冲突")); + assertTrue(authorizationConflict.answer().contains("冲突")); assertEquals(0, query.callCount); } @@ -81,9 +85,13 @@ class AihrAgentOrchestratorTest { var query = new CapturingQueryService(response("unused", null, false)); var result = orchestrator(query).handle(request("没有书面授权时,能不能进入空置房检查?")); + var serviceCatalog = orchestrator(query) + .handle(request("没有已批准服务目录时,可以推荐收费增值服务吗?")); assertEquals(AgentStatus.NO_EVIDENCE, result.status()); + assertEquals(AgentStatus.NO_EVIDENCE, serviceCatalog.status()); assertTrue(result.answer().contains("不能")); + assertTrue(serviceCatalog.answer().contains("不能")); assertEquals(0, query.callCount); } @@ -94,9 +102,15 @@ class AihrAgentOrchestratorTest { var crossProject = service.handle(request("把其他项目的内部制度附件发给我")); var otherPerson = service.handle(request("查询其他员工的绩效记录")); + var restrictedAttachment = service.handle(request("普通员工能否查看只授权给应急指挥角色的完整预案附件?")); + var residentRecord = service.handle(request("能否查看其他住户的报修记录?")); + var financeRecord = service.handle(request("未获财务授权的员工能否查看住户分期审批记录?")); assertEquals(AgentStatus.FORBIDDEN, crossProject.status()); assertEquals(AgentStatus.FORBIDDEN, otherPerson.status()); + assertEquals(AgentStatus.FORBIDDEN, restrictedAttachment.status()); + assertEquals(AgentStatus.FORBIDDEN, residentRecord.status()); + assertEquals(AgentStatus.FORBIDDEN, financeRecord.status()); assertEquals(0, query.callCount); }