feat: 新增风险图谱算法与系统仪表盘及操作反馈体系
后端新增风险图谱算法模块、风险观察与反馈服务、规则 DSL 校验器和可解释性引擎,完善系统仪表盘和财务仪表盘统计, 优化 agent 运行和编排执行链路,清理旧开发文档,前端新增 系统趋势、负载热力图等多种仪表盘图表组件,完善操作反馈 对话框和工作台日期选择器,优化报销创建和审批详情交互, 补充单元测试覆盖。
This commit is contained in:
@@ -9,6 +9,8 @@ from sqlalchemy.orm import Session, sessionmaker
|
||||
from sqlalchemy.pool import StaticPool
|
||||
|
||||
from app.db.base import Base
|
||||
from app.models.agent_asset import AgentAsset
|
||||
from app.models.agent_run import AgentRun
|
||||
from app.models.employee import Employee
|
||||
from app.models.financial_record import ExpenseClaim, ExpenseClaimItem
|
||||
from app.schemas.ontology import OntologyParseResult, OntologyPermission
|
||||
@@ -35,6 +37,85 @@ def skip_agent_foundation_bootstrap(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("task_type", "code", "method_path", "summary", "expected_text"),
|
||||
[
|
||||
(
|
||||
"global_risk_scan",
|
||||
"task.hermes.global_risk_scan",
|
||||
"app.services.hermes_risk_scanner.HermesRiskScannerService.scan_global_risks",
|
||||
{"scanned_claim_count": 2, "risk_observation_count": 1},
|
||||
"生成 1 条风险观察",
|
||||
),
|
||||
(
|
||||
"employee_behavior_profile_scan",
|
||||
"task.hermes.employee_behavior_profile_scan",
|
||||
"app.services.hermes_employee_profile_scanner.HermesEmployeeProfileScannerService.scan_employee_profiles",
|
||||
{
|
||||
"target_employee_count": 3,
|
||||
"snapshot_count": 9,
|
||||
"high_attention_employee_count": 1,
|
||||
},
|
||||
"生成 9 条快照",
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_schedule_digital_employee_task_runs_real_service(
|
||||
monkeypatch,
|
||||
task_type,
|
||||
code,
|
||||
method_path,
|
||||
summary,
|
||||
expected_text,
|
||||
) -> None:
|
||||
def parse_for_run(self, request, run_id): # noqa: ANN001
|
||||
return OntologyParseResult(
|
||||
scenario="expense",
|
||||
intent="risk_check",
|
||||
entities=[],
|
||||
permission=OntologyPermission(level="read", allowed=True, reason=""),
|
||||
confidence=0.95,
|
||||
missing_slots=[],
|
||||
ambiguity=[],
|
||||
clarification_required=False,
|
||||
clarification_question=None,
|
||||
run_id=run_id,
|
||||
)
|
||||
|
||||
monkeypatch.setattr("app.services.ontology.SemanticOntologyService.parse_for_run", parse_for_run)
|
||||
monkeypatch.setattr(method_path, lambda self, **kwargs: dict(summary))
|
||||
|
||||
session_factory = build_session_factory()
|
||||
with session_factory() as db:
|
||||
task = AgentAsset(
|
||||
asset_type="task",
|
||||
code=code,
|
||||
name="数字员工任务",
|
||||
description="",
|
||||
domain="system",
|
||||
scenario_json=["schedule"],
|
||||
owner="pytest",
|
||||
status="active",
|
||||
current_version="v1.0.0",
|
||||
working_version="v1.0.0",
|
||||
published_version="v1.0.0",
|
||||
config_json={"agent": "hermes", "task_type": task_type},
|
||||
)
|
||||
db.add(task)
|
||||
db.commit()
|
||||
|
||||
response = OrchestratorService(db).run(
|
||||
OrchestratorRequest(source="schedule", task_id=task.id, message=task.name)
|
||||
)
|
||||
|
||||
run = db.query(AgentRun).filter_by(run_id=response.run_id).one()
|
||||
assert response.status == "succeeded"
|
||||
assert response.result["report_type"] == task_type
|
||||
assert expected_text in response.result["message"]
|
||||
assert run.route_json["job_type"] == task_type
|
||||
assert run.route_json["task_code"] == code
|
||||
|
||||
|
||||
def test_review_next_step_run_submits_existing_claim_and_returns_draft_payload(
|
||||
monkeypatch,
|
||||
) -> None:
|
||||
@@ -707,8 +788,8 @@ def test_orchestrator_application_session_guides_transport_amount_and_submit(
|
||||
assert fourth.status == "succeeded"
|
||||
assert fourth.result["clarification_required"] is False
|
||||
assert fourth.result["missing_slots"] == []
|
||||
assert "当前操作已完成,单据已经推送给 陈硕 进行审核,请耐心等待" in fourth.result["answer"]
|
||||
assert "当前状态:陈硕审核中" in fourth.result["answer"]
|
||||
assert "申请单据已生成,并已进入审批流程" in fourth.result["answer"]
|
||||
assert "系统已推送给 陈硕 审核,当前节点:陈硕审核中" in fourth.result["answer"]
|
||||
assert fourth.result["suggested_actions"] == []
|
||||
application_claims = [
|
||||
claim
|
||||
@@ -808,5 +889,5 @@ def test_orchestrator_application_submit_bypasses_generic_operation_block(
|
||||
assert submitted.requires_confirmation is False
|
||||
assert "操作类请求需要人工审批确认" not in submitted.result["answer"]
|
||||
assert "当前仅返回确认摘要" not in submitted.result["answer"]
|
||||
assert "当前操作已完成,单据已经推送给 陈硕 进行审核,请耐心等待" in submitted.result["answer"]
|
||||
assert "申请单据已生成,并已进入审批流程" in submitted.result["answer"]
|
||||
assert submitted.result["draft_payload"]["status"] == "submitted"
|
||||
|
||||
Reference in New Issue
Block a user