651 lines
54 KiB
HTML
651 lines
54 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>sgRobot 目标态业务架构</title>
|
||
<script src="https://cdn.tailwindcss.com"></script>
|
||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||
<style>
|
||
/* 自定义一些特定颜色以更贴近原图 */
|
||
.theme-dark-blue { background-color: #0d2758; }
|
||
.theme-text-dark-blue { color: #0d2758; }
|
||
.theme-light-blue-bg { background-color: #f0f6fc; }
|
||
.theme-border-blue { border-color: #aec3db; }
|
||
.theme-text-gray { color: #5f7082; }
|
||
.theme-red { color: #d92d20; }
|
||
|
||
/* 连接线箭头样式辅助 */
|
||
.arrow-right-solid {
|
||
width: 0;
|
||
height: 0;
|
||
border-top: 5px solid transparent;
|
||
border-bottom: 5px solid transparent;
|
||
border-left: 8px solid #0d2758;
|
||
}
|
||
.arrow-down-solid {
|
||
width: 0;
|
||
height: 0;
|
||
border-left: 5px solid transparent;
|
||
border-right: 5px solid transparent;
|
||
border-top: 8px solid #0d2758;
|
||
}
|
||
|
||
/* 用于核心闭环的虚线箭头 */
|
||
.dashed-arrow-line {
|
||
background-image: linear-gradient(to right, #d92d20 50%, transparent 50%);
|
||
background-size: 10px 2px;
|
||
background-repeat: repeat-x;
|
||
}
|
||
.arrow-right-red {
|
||
width: 0;
|
||
height: 0;
|
||
border-top: 4px solid transparent;
|
||
border-bottom: 4px solid transparent;
|
||
border-left: 6px solid #d92d20;
|
||
}
|
||
.arrow-left-red {
|
||
width: 0;
|
||
height: 0;
|
||
border-top: 4px solid transparent;
|
||
border-bottom: 4px solid transparent;
|
||
border-right: 6px solid #d92d20;
|
||
}
|
||
|
||
body {
|
||
font-family: "PingFang SC", "Microsoft YaHei", "Noto Sans SC", "Source Han Sans SC", Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||
font-size: 18px;
|
||
}
|
||
|
||
/* 汇报场景下整体字号再上调一档,兼顾投屏可读性 */
|
||
.text-xs { font-size: 0.92rem !important; }
|
||
.text-sm { font-size: 1.08rem !important; }
|
||
.text-base { font-size: 1.24rem !important; }
|
||
.text-lg { font-size: 1.4rem !important; }
|
||
.text-xl { font-size: 1.62rem !important; }
|
||
.text-3xl { font-size: 2.75rem !important; }
|
||
.text-\[9px\] { font-size: 0.82rem !important; }
|
||
.text-\[10px\] { font-size: 0.92rem !important; }
|
||
.text-\[11px\] { font-size: 1.02rem !important; }
|
||
.text-\[13px\] { font-size: 1.14rem !important; }
|
||
|
||
/* 放大后给各层卡片更多高度,避免文字贴边 */
|
||
.min-h-\[60px\] { min-height: 86px !important; }
|
||
.min-h-\[65px\] { min-height: 92px !important; }
|
||
.min-h-\[70px\] { min-height: 104px !important; }
|
||
|
||
[data-tip] {
|
||
cursor: help;
|
||
}
|
||
|
||
.term-list {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 5px 6px;
|
||
margin-top: 5px;
|
||
}
|
||
|
||
.term {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
border: 1px solid #c8d7e8;
|
||
border-radius: 999px;
|
||
background: #f8fbff;
|
||
padding: 2px 8px;
|
||
color: #5f7082;
|
||
font-size: 0.86rem;
|
||
line-height: 1.35;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
#sg-tooltip {
|
||
position: fixed;
|
||
z-index: 9999;
|
||
max-width: 520px;
|
||
padding: 10px 12px;
|
||
border-radius: 6px;
|
||
background: #0d2758;
|
||
color: white;
|
||
font-size: 0.95rem;
|
||
line-height: 1.45;
|
||
white-space: pre-line;
|
||
box-shadow: 0 12px 32px rgba(13, 39, 88, 0.22);
|
||
pointer-events: none;
|
||
opacity: 0;
|
||
transform: translateY(4px);
|
||
transition: opacity 0.12s ease, transform 0.12s ease;
|
||
}
|
||
|
||
#sg-tooltip.is-visible {
|
||
opacity: 1;
|
||
transform: translateY(0);
|
||
}
|
||
</style>
|
||
</head>
|
||
<body class="bg-white p-4 md:p-8 min-h-screen text-sm select-none">
|
||
|
||
<nav class="max-w-[1780px] mx-auto mb-5 flex flex-wrap items-center justify-between gap-3 border border-blue-200 rounded-lg px-4 py-3 shadow-sm bg-white">
|
||
<div class="flex items-center gap-2 theme-text-dark-blue font-bold text-base" data-tip="汇报专用静态网站,可直接双击 index.html 打开,不需要启动本地服务。">
|
||
<i class="fa-solid fa-display"></i>
|
||
<span>sgRobot 汇报静态网站</span>
|
||
</div>
|
||
<div class="flex items-center gap-2">
|
||
<a href="index.html" class="theme-dark-blue text-white rounded px-4 py-2 font-bold shadow-sm" data-tip="查看 sgRobot 的目标态业务架构总览。">业务架构总览</a>
|
||
<a href="flows.html" class="border theme-border-blue theme-text-dark-blue rounded px-4 py-2 font-bold bg-white hover:bg-blue-50" data-tip="查看几类典型业务如何进入、执行、沉淀和被人工治理。">业务流程图</a>
|
||
<a href="roadmap.html" class="border theme-border-blue theme-text-dark-blue rounded px-4 py-2 font-bold bg-white hover:bg-blue-50" data-tip="查看五月底上线倒排的里程碑、分工边界和验收口径。">里程碑与分工</a>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="max-w-[1780px] mx-auto mb-6">
|
||
<div class="flex items-center mb-2">
|
||
<div class="w-10 h-10 theme-dark-blue text-white flex items-center justify-center rounded shadow-sm mr-3">
|
||
<i class="fa-solid fa-cube text-xl"></i>
|
||
</div>
|
||
<div>
|
||
<h1 class="text-3xl font-bold theme-text-dark-blue tracking-wide">sgRobot <span class="font-bold">目标态业务架构</span></h1>
|
||
</div>
|
||
</div>
|
||
<div class="ml-14 text-[13px] font-medium text-gray-700 leading-relaxed">
|
||
围绕<span class="font-bold">业务入口</span>、<span class="font-bold">任务治理</span>、<span class="font-bold">自动执行</span>、<span class="theme-red font-bold">运营看板</span>四条主线,把目标接收、计划拆解、执行过程、人工决策、经验沉淀和后台服务统一纳入可管理的业务闭环。
|
||
</div>
|
||
</div>
|
||
|
||
<div class="max-w-[1780px] mx-auto relative">
|
||
|
||
<!-- 顶层用户 -->
|
||
<div class="flex justify-center mb-[-12px] relative z-10">
|
||
<div class="bg-white border-2 theme-border-blue rounded-full px-10 py-2 flex items-center gap-3 shadow-sm" data-tip="系统的外部参与者。用户提交目标,运维关注健康与风险,审批人处理治理节点,外部业务系统可通过系统接口或业务事件触发任务。">
|
||
<i class="fa-solid fa-user-group text-blue-600 text-lg"></i>
|
||
<span class="font-bold theme-text-dark-blue text-base">
|
||
<span data-tip="用户是目标和需求的主要提出者,可以发起任务、补充输入和接受结果。">用户</span> /
|
||
<span data-tip="运维关注系统健康、服务状态、告警、失败恢复和上线风险。">运维</span> /
|
||
<span data-tip="审批人负责处理高风险动作、外部副作用、权限边界和人工治理节点。">审批人</span> /
|
||
<span data-tip="外部业务系统通过系统接口、消息或业务事件触发 sgRobot 工作流。">外部业务系统</span>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
<div class="flex justify-center mb-2 text-blue-600 text-lg">
|
||
<i class="fa-solid fa-arrow-down"></i>
|
||
</div>
|
||
|
||
<!-- 主结构外框 -->
|
||
<div class="border-2 theme-border-blue rounded-lg p-3 pt-6 flex flex-col gap-2 relative bg-white">
|
||
<div class="absolute right-[-10px] top-[15%] bottom-[15%] w-[20px] border-r-2 border-t-2 border-b-2 theme-border-blue rounded-r-lg z-0 opacity-50 hidden lg:block"></div>
|
||
|
||
<!-- Plane 1: 业务入口与协同 -->
|
||
<div class="flex items-stretch border theme-border-blue rounded bg-white relative z-10">
|
||
<div class="w-12 md:w-40 theme-dark-blue text-white flex flex-col items-center justify-center p-2 rounded-l flex-shrink-0" data-tip="业务入口与协同负责把人的需求、系统事件和业务审批统一接入,并把任务进展反馈给相关人员。">
|
||
<div class="bg-white/20 px-2 py-1 rounded text-xs mb-1 font-mono">1</div>
|
||
<span class="font-bold hidden md:block text-center leading-tight">业务入口与协同</span>
|
||
<span class="font-bold md:hidden text-center writing-vertical-lr text-xs">入口协同</span>
|
||
</div>
|
||
<div class="flex-1 theme-light-blue-bg p-3 grid grid-cols-1 md:grid-cols-2 gap-4 rounded-r">
|
||
<div class="bg-white border theme-border-blue rounded p-2 flex items-center gap-3 shadow-sm min-h-[60px] w-full" data-tip="业务需求入口把人工提交、接口调用、计划任务和事件触发统一登记为可跟踪的业务目标或处理请求。">
|
||
<i class="fa-solid fa-arrow-right-to-bracket text-2xl theme-text-dark-blue ml-2"></i>
|
||
<div>
|
||
<div class="font-bold theme-text-dark-blue text-sm">业务需求入口</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="人工提交是用户在控制台或对话入口主动发起的目标。">人工提交</span>
|
||
<span class="term" data-tip="系统接口让外部业务系统以结构化请求提交目标、状态或审批动作。">系统接口</span>
|
||
<span class="term" data-tip="计划任务是按时间、周期或排程触发的目标入口。">计划任务</span>
|
||
<span class="term" data-tip="事件触发来自邮件、系统通知、消息、文件变化或内部业务事件。">事件触发</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 flex items-center gap-3 shadow-sm min-h-[60px] w-full" data-tip="协同工作台让用户、运维和审批人查看进度、处理审批、回放过程和验收成果。">
|
||
<i class="fa-solid fa-desktop text-2xl theme-text-dark-blue ml-2"></i>
|
||
<div>
|
||
<div class="font-bold theme-text-dark-blue text-sm">协同工作台</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="查看用于读取目标、计划、任务、执行记录、服务状态和经验记忆。">查看</span>
|
||
<span class="term" data-tip="操作是用户对任务、服务、参数和视图发起的显式动作。">操作</span>
|
||
<span class="term" data-tip="审批用于确认高风险动作、外部副作用或权限敏感步骤。">审批</span>
|
||
<span class="term" data-tip="回放按事件时间线复原过程,用于诊断、复盘和追责。">回放</span>
|
||
<span class="term" data-tip="成果浏览用于查看报告、截图、文件、日志快照和结构化结果。">成果浏览</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Plane 2: 任务治理与风控 -->
|
||
<div class="flex items-stretch border theme-border-blue rounded bg-white relative z-10">
|
||
<div class="w-12 md:w-40 theme-dark-blue text-white flex flex-col items-center justify-center p-2 rounded-l flex-shrink-0" data-tip="任务治理与风控负责把业务目标拆成计划和任务,并统一管理审批、风险、暂停、恢复、重试和服务占用规则。">
|
||
<i class="fa-solid fa-sliders text-xl mb-1"></i>
|
||
<span class="font-bold hidden md:block text-center leading-tight">任务治理与风控</span>
|
||
<span class="font-bold md:hidden text-center writing-vertical-lr text-xs mt-2">任务风控</span>
|
||
</div>
|
||
<div class="flex-1 theme-light-blue-bg p-3 grid grid-cols-1 md:grid-cols-4 gap-3 rounded-r">
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[70px]" data-tip="目标与计划管理把原始目标转成可审查、可冻结、可重规划的计划结构。">
|
||
<div class="flex items-center gap-2 mb-1">
|
||
<i class="fa-solid fa-bullseye theme-text-dark-blue text-lg"></i>
|
||
<span class="font-bold theme-text-dark-blue text-[13px]">目标计划管理</span>
|
||
</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="业务目标是用户或外部系统想达成的结果,也是后续计划拆解的源头。">业务目标</span>
|
||
<span class="term" data-tip="执行计划描述成功标准、风险、依赖和执行步骤。">执行计划</span>
|
||
<span class="term" data-tip="计划步骤是计划中的单个动作,用于生成可调度的工作任务。">计划步骤</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[70px]" data-tip="任务执行管理负责从步骤生成任务,并管理执行尝试、失败恢复、服务占用和最终状态。">
|
||
<div class="flex items-center gap-2 mb-1">
|
||
<i class="fa-solid fa-list-ul theme-text-dark-blue text-lg"></i>
|
||
<span class="font-bold theme-text-dark-blue text-[13px]">任务执行管理</span>
|
||
</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="工作任务是可调度的工作单元,绑定能力、输入、依赖和优先级。">工作任务</span>
|
||
<span class="term" data-tip="执行记录代表一次任务执行尝试,重试会产生新的执行记录。">执行记录</span>
|
||
<span class="term" data-tip="自动重试是失败或中断后的再执行策略,受预算和风险约束。">自动重试</span>
|
||
<span class="term" data-tip="恢复点是长任务的过程锚点,用于失败后恢复和问题诊断。">恢复点</span>
|
||
<span class="term" data-tip="超时管控防止任务无限运行,超时后进入恢复或人工介入路径。">超时管控</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[70px]" data-tip="人工治理把人的介入变成可记录、可回放、可追责的业务操作,而不是后台直接改结果。">
|
||
<div class="flex items-center gap-2 mb-1">
|
||
<i class="fa-solid fa-user-check theme-text-dark-blue text-lg"></i>
|
||
<span class="font-bold theme-text-dark-blue text-[13px]">人工治理</span>
|
||
</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="审批通过允许高风险步骤、外部副作用或权限敏感动作继续执行。">审批通过</span>
|
||
<span class="term" data-tip="暂停让人检查任务状态、参数、风险或依赖。">暂停</span>
|
||
<span class="term" data-tip="恢复从暂停点继续执行,通常需要保留上下文和服务占用状态。">恢复</span>
|
||
<span class="term" data-tip="取消终止任务或计划,并释放相关服务占用。">取消</span>
|
||
<span class="term" data-tip="人工接管把自动执行转交给人工或指定操作者处理。">人工接管</span>
|
||
<span class="term" data-tip="重新规划在现有目标下重新生成或修改执行路径。">重新规划</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[70px]" data-tip="风险与规则规定经验记忆怎么用、后台服务怎么占用、哪些动作必须审批、哪些状态必须进入看板。">
|
||
<div class="flex items-center gap-2 mb-1">
|
||
<i class="fa-solid fa-shield-halved theme-text-dark-blue text-lg"></i>
|
||
<span class="font-bold theme-text-dark-blue text-[13px]">风险与规则</span>
|
||
</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="记忆规则规定经验何时召回、写入、遗忘、替代或标记冲突。">记忆规则</span>
|
||
<span class="term" data-tip="服务占用记录任务对后台服务的使用关系,防止误停和资源泄漏。">服务占用</span>
|
||
<span class="term" data-tip="风险等级表示动作、任务、服务或记忆使用的风险级别和审批要求。">风险等级</span>
|
||
<span class="term" data-tip="健康状态汇总任务、服务、通道和看板等关键组件是否正常。">健康状态</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Plane 3: 自动执行与能力 -->
|
||
<div class="flex items-stretch border theme-border-blue rounded bg-white relative z-10">
|
||
<div class="w-12 md:w-40 theme-dark-blue text-white flex flex-col items-center justify-center p-2 rounded-l flex-shrink-0" data-tip="自动执行与能力负责真正完成业务动作,包括脚本、流程、智能辅助、外部系统适配和按需后台服务。">
|
||
<i class="fa-solid fa-gears text-xl mb-1"></i>
|
||
<span class="font-bold hidden md:block text-center leading-tight">自动执行与能力</span>
|
||
<span class="font-bold md:hidden text-center writing-vertical-lr text-xs mt-2">自动执行</span>
|
||
</div>
|
||
<div class="flex-1 theme-light-blue-bg p-3 grid grid-cols-1 md:grid-cols-7 gap-3 rounded-r">
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[60px]" data-tip="能力目录管理可治理自动化能力的登记、版本、使用约定、策略和健康。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-box mr-1"></i>能力目录</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="能力登记把脚本、流程、智能辅助或外部适配纳入统一目录。">能力登记</span>
|
||
<span class="term" data-tip="版本管理用于区分能力说明、实现和兼容边界。">版本管理</span>
|
||
<span class="term" data-tip="使用约定说明输入、输出、成果和过程记录要求。">使用约定</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[60px]" data-tip="调度中枢负责检查前置条件、匹配自动化能力、安排执行顺序并处理失败恢复。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-sitemap mr-1"></i>调度中枢</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="前置检查判断任务、服务、记忆、成果和审批之间的依赖是否满足。">前置检查</span>
|
||
<span class="term" data-tip="能力匹配根据使用约定、风险、可用性和上下文选择合适能力。">能力匹配</span>
|
||
<span class="term" data-tip="失败恢复处理回滚、替代路径、重试和人工兜底。">失败恢复</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[60px]" data-tip="自动脚本适合规则清楚、结果稳定、可重试、可审计的任务。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-code mr-1"></i>自动脚本</div>
|
||
<div class="term-list"><span class="term" data-tip="确定性任务适合明确输入输出,结果更容易测试和审计。">确定性任务</span></div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[60px]" data-tip="流程编排承载组合能力和子流程,把多步骤操作纳入统一治理。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-diagram-project mr-1"></i>流程编排</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="组合能力把多个原子能力组合为一个可治理流程。">组合能力</span>
|
||
<span class="term" data-tip="子流程是在一个任务内部继续拆分的执行片段。">子流程</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[60px]" data-tip="智能辅助用于规划、选择、解释和修复建议,但任务状态仍由治理流程统一管理。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-brain mr-1"></i>智能辅助</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="规划用于把目标拆成可审查的计划和步骤。">规划</span>
|
||
<span class="term" data-tip="修复建议用于失败诊断、替代能力和补偿路径建议。">修复建议</span>
|
||
<span class="term" data-tip="解释用于说明计划、风险、失败原因和人工介入建议。">解释</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[60px]" data-tip="外部系统适配把网页、设备和机器人能力接入统一业务流程,避免各自独立运行、难以管理。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-robot mr-1"></i>外部系统适配</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="网页操作用于网页、控制台和浏览器自动化能力。">网页操作</span>
|
||
<span class="term" data-tip="设备接入用于连接硬件、串口、设备接口或外设能力。">设备接入</span>
|
||
<span class="term" data-tip="机器人控制用于机器人本体能力,如感知、运动和语音。">机器人控制</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[60px]" data-tip="按需后台服务负责邮件读取、监听器、浏览器环境、配套后台程序和外部服务进程的启动、占用、健康、日志和空闲回收。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-server mr-1"></i>按需后台服务</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="服务定义描述后台服务如何启动、停止、授权、检查健康和对外提供能力。">服务定义</span>
|
||
<span class="term" data-tip="运行实例是服务的一次实际运行,记录访问地址、进程和状态。">运行实例</span>
|
||
<span class="term" data-tip="占用关系表示某个任务正在依赖服务实例,决定服务是否能回收。">占用关系</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Plane 4: 运营记录与看板 -->
|
||
<div class="flex items-stretch border theme-border-blue rounded bg-white relative z-10">
|
||
<div class="w-12 md:w-40 theme-dark-blue text-white flex flex-col items-center justify-center p-2 rounded-l flex-shrink-0" data-tip="运营记录与看板沉淀业务过程、成果、经验和服务状态,让管理者能看进度、看风险、看结果、看责任。">
|
||
<i class="fa-solid fa-database text-xl mb-1"></i>
|
||
<span class="font-bold hidden md:block text-center leading-tight">运营记录与看板</span>
|
||
<span class="font-bold md:hidden text-center writing-vertical-lr text-xs mt-2">运营看板</span>
|
||
</div>
|
||
<div class="flex-1 theme-light-blue-bg p-3 grid grid-cols-1 md:grid-cols-7 gap-3 rounded-r">
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[65px]" data-tip="业务状态台账保存计划、任务、执行记录和审批记录的当前状态,是进度和责任判断的依据。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-lock mr-1"></i>业务状态台账</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="执行计划状态表示计划处于草稿、审核、激活、阻塞、完成或取消等阶段。">执行计划</span>
|
||
<span class="term" data-tip="工作任务状态表示任务是否待处理、排队、执行中、暂停、失败或完成。">工作任务</span>
|
||
<span class="term" data-tip="执行记录状态表示一次执行尝试的生命周期和健康信息。">执行记录</span>
|
||
<span class="term" data-tip="审批记录状态表示审批请求是否待处理、已通过、已拒绝、已过期或已取消。">审批记录</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[65px]" data-tip="过程日志记录所有关键变化,是审计、回放、看板生成和问题追踪的基础。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-regular fa-file-lines mr-1"></i>过程日志</div>
|
||
<div class="term-list"><span class="term" data-tip="关键过程记录是已经发生的业务变化,如任务开始、执行失败、服务启动或经验更新。">关键过程记录</span></div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[65px]" data-tip="成果资料库存放执行生成的文件、报告、截图和结构化数据结果。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-folder-open mr-1"></i>成果资料库</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="文件是执行生成或引用的本地或远端文件产物。">文件</span>
|
||
<span class="term" data-tip="报告是面向人或验收的总结性产物。">报告</span>
|
||
<span class="term" data-tip="截图用于证明界面、网页、浏览器或视觉状态。">截图</span>
|
||
<span class="term" data-tip="数据结果是可被系统继续读取的结构化数据、表格、记录或索引。">数据结果</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[65px]" data-tip="经验与记忆库存放可复用知识,不代表当前任务状态,必须受来源、置信度、保留和遗忘规则约束。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-brain mr-1"></i>经验与记忆库</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="项目事实是相对稳定、可引用的信息,但仍应有来源和置信度。">项目事实</span>
|
||
<span class="term" data-tip="使用偏好记录用户、项目或团队的长期选择倾向。">使用偏好</span>
|
||
<span class="term" data-tip="关键决策记录已经确定的架构、流程、策略或边界选择。">关键决策</span>
|
||
<span class="term" data-tip="处理经验记录过去执行中的成功路径、失败模式和修复方法。">处理经验</span>
|
||
<span class="term" data-tip="观察摘要从邮件、消息、工单、服务日志或运行结果中提炼可复用结论。">观察摘要</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[65px]" data-tip="运营看板面向管理、查询和协同,由状态、过程日志、成果、经验记忆和服务健康汇总生成。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-chart-column mr-1"></i>运营看板</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="任务看板展示任务状态、阻塞、风险和下一步动作。">任务看板</span>
|
||
<span class="term" data-tip="审批队列集中展示等待人工处理的治理节点。">审批队列</span>
|
||
<span class="term" data-tip="记忆索引让用户查看、修正、替代或遗忘长期记忆。">记忆索引</span>
|
||
<span class="term" data-tip="服务健康展示服务实例、占用关系、重启和最近错误。">服务健康</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[65px]" data-tip="全程追踪按时间顺序展示计划、任务、执行、审批、服务和经验记忆变化。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-clock-rotate-left mr-1"></i>全程追踪</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="过程回放按时间顺序复原业务过程和人工操作。">过程回放</span>
|
||
<span class="term" data-tip="诊断用于定位失败原因、依赖问题、服务退化或策略阻塞。">诊断</span>
|
||
<span class="term" data-tip="追责用于确认谁在什么时候通过什么操作改变了什么状态。">追责</span>
|
||
</div>
|
||
</div>
|
||
<div class="bg-white border theme-border-blue rounded p-2 shadow-sm min-h-[65px]" data-tip="运营指标用于验收、运营和持续改进,衡量服务时效、成功率、响应耗时和人工介入率。">
|
||
<div class="font-bold theme-text-dark-blue text-[13px]"><i class="fa-solid fa-chart-simple mr-1"></i>运营指标</div>
|
||
<div class="term-list">
|
||
<span class="term" data-tip="服务时效衡量任务、服务或工作流的服务水平和完成时限。">服务时效</span>
|
||
<span class="term" data-tip="成功率衡量任务、能力、服务或计划执行成功的比例。">成功率</span>
|
||
<span class="term" data-tip="响应耗时衡量目标接入、任务排队、执行、看板生成和审批等待时间。">响应耗时</span>
|
||
<span class="term" data-tip="人工介入率衡量有多少任务需要审批、暂停、接管或人工修复。">人工介入率</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div> <!-- End of Main Architecture Container -->
|
||
|
||
<!-- 核心闭环 -->
|
||
<div class="mt-4 border border-blue-200 rounded flex overflow-hidden shadow-sm">
|
||
<div class="w-16 md:w-24 theme-dark-blue text-white flex flex-col items-center justify-center p-2 flex-shrink-0" data-tip="核心闭环展示一次业务目标从接入、计划、执行、沉淀、看板到人工决策的完整路径。">
|
||
<i class="fa-solid fa-rotate text-xl mb-1"></i>
|
||
<span class="font-bold text-center text-xs md:text-sm">核心闭环</span>
|
||
</div>
|
||
<div class="flex-1 bg-white p-4 relative overflow-x-auto">
|
||
<div class="flex items-center justify-between min-w-[1260px] mb-4 mt-2 px-4">
|
||
<div class="flex items-center gap-1 font-bold theme-text-dark-blue" data-tip="业务目标是用户或外部系统想达成的结果,进入系统后会先转成可治理的执行计划。"><i class="fa-solid fa-bullseye mr-1"></i>业务目标</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 border border-blue-200 px-2 py-1 rounded theme-text-dark-blue" data-tip="执行计划描述为什么做、做成什么、如何拆,并支持人工审查、冻结和重新规划。"><i class="fa-regular fa-file-lines mr-1"></i>执行计划</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 border border-blue-200 px-2 py-1 rounded theme-text-dark-blue" data-tip="工作任务是由计划步骤拆出来的可调度工作单元,负责绑定能力、输入、优先级和依赖。"><i class="fa-solid fa-list-ul mr-1"></i>工作任务</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 border border-blue-200 px-2 py-1 rounded theme-text-dark-blue" data-tip="能力匹配为当前任务选择正式自动化能力或业务流程,必须满足版本、策略、权限和输入输出约定。"><i class="fa-solid fa-link mr-1"></i>能力匹配</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 border border-blue-200 px-2 py-1 rounded theme-text-dark-blue" data-tip="执行前准备需要召回的经验记忆、需要启动或占用的后台服务,例如邮件读取、浏览器环境或外部服务进程。"><i class="fa-solid fa-server mr-1"></i>经验与服务准备</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 border border-blue-200 px-2 py-1 rounded theme-text-dark-blue" data-tip="执行记录代表任务的一次执行尝试,记录执行人、服务占用、运行状态、恢复点和最终状态。"><i class="fa-regular fa-circle-play mr-1"></i>执行记录</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 font-bold theme-text-dark-blue" data-tip="自动执行阶段由脚本、流程、智能辅助或外部系统适配真正调用资源,并持续回写过程记录和状态。"><i class="fa-solid fa-gear mr-1"></i>自动执行</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 border border-blue-200 px-2 py-1 rounded theme-text-dark-blue bg-gray-50" data-tip="执行结果沉淀为业务状态、过程日志、成果资料和可复用经验,后续看板和审计都从这里生成。"><i class="fa-solid fa-database mr-1"></i>过程记录与成果沉淀</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 font-bold theme-text-dark-blue" data-tip="运营看板面向管理和查询,包括任务看板、全程追踪、审批队列、记忆索引和服务健康。"><i class="fa-solid fa-chart-column mr-1"></i>运营看板</div>
|
||
<i class="fa-solid fa-arrow-right text-blue-300 text-sm"></i>
|
||
<div class="flex items-center gap-1 font-bold theme-red border border-red-200 px-2 py-1 rounded" data-tip="人工决策允许审批、暂停、恢复、取消、接管和重新规划,并把每次干预记录下来。"><i class="fa-regular fa-user mr-1"></i>人工决策</div>
|
||
</div>
|
||
<!-- 底部虚线回环 -->
|
||
<div class="relative mt-6 min-w-[1260px] h-4">
|
||
<div class="absolute w-[80%] left-[10%] border-t border-dashed border-red-500 top-1/2"></div>
|
||
<div class="absolute left-[10%] top-1/2 -mt-1"><div class="arrow-left-red"></div></div>
|
||
<div class="absolute w-full flex justify-center -top-3">
|
||
<span class="bg-white px-2 text-xs font-bold theme-red" data-tip="人工决策会回到计划或任务层,改变后续执行路径,而不是直接绕过业务流程。">审批 / 暂停 / 恢复 / 取消 / 人工接管 / 重新规划</span>
|
||
</div>
|
||
<!-- 垂直连接线 -->
|
||
<div class="absolute left-[10%] bottom-1/2 h-4 border-l border-dashed border-red-500"></div>
|
||
<div class="absolute right-[10%] bottom-1/2 h-6 border-r border-dashed border-red-500"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
<script>
|
||
const tooltip = document.createElement("div");
|
||
tooltip.id = "sg-tooltip";
|
||
document.body.appendChild(tooltip);
|
||
|
||
let activeTipTarget = null;
|
||
|
||
const exampleRules = [
|
||
{ keys: ["汇报专用静态网站"], example: "双击 report-site/index.html 打开后,可在业务架构总览和业务流程图之间切换。" },
|
||
{ keys: ["业务架构总览"], example: "汇报开场先用这一页讲清楚 sgRobot 的四个业务分区。" },
|
||
{ keys: ["业务流程图"], example: "讲邮件触发流程时,可以切到流程页看它经过哪些架构模块。" },
|
||
{ keys: ["外部参与者"], example: "业务人员提交目标,运维看服务状态,审批人处理高风险动作。" },
|
||
{ keys: ["用户是目标"], example: "用户提出“把今天收到的客户邮件整理成日报”。" },
|
||
{ keys: ["运维关注"], example: "运维发现邮件读取服务连续失败后,查看健康状态并重启服务。" },
|
||
{ keys: ["审批人负责"], example: "系统要自动发送外部邮件前,审批人确认内容和收件人。" },
|
||
{ keys: ["外部业务系统"], example: "工单系统产生新工单后,通过系统接口触发 sgRobot 处理。" },
|
||
|
||
{ keys: ["业务入口与协同"], example: "用户提交巡检需求,外部系统推送消息,审批人在工作台确认风险动作。" },
|
||
{ keys: ["业务需求入口"], example: "每天 9 点的巡检计划、人工提交的日报需求、邮件到达事件都先进入这里。" },
|
||
{ keys: ["人工提交"], example: "负责人在工作台提交“生成本周设备巡检报告”。" },
|
||
{ keys: ["系统接口"], example: "CRM 系统把新客户资料同步过来,请求自动补全客户画像。" },
|
||
{ keys: ["计划任务"], example: "每个工作日 18 点自动汇总当天处理结果。" },
|
||
{ keys: ["事件触发"], example: "指定邮箱收到带附件的邮件后,自动触发读取和归档流程。" },
|
||
{ keys: ["协同工作台"], example: "审批人打开工作台查看待审批队列,运维查看失败任务。" },
|
||
{ keys: ["查看"], example: "查看某个任务当前是排队中、执行中还是等待审批。" },
|
||
{ keys: ["操作"], example: "用户手动暂停一个执行中的网页采集任务。" },
|
||
{ keys: ["审批"], example: "自动发送客户邮件前,需要审批人确认内容。" },
|
||
{ keys: ["回放"], example: "复盘昨天失败的巡检任务,查看它在哪一步超时。" },
|
||
{ keys: ["成果浏览"], example: "打开自动生成的报告、截图和数据表进行验收。" },
|
||
|
||
{ keys: ["任务治理与风控"], example: "把“处理客户邮件”拆成读取、分类、回复、归档,并在发信前要求审批。" },
|
||
{ keys: ["目标计划管理"], example: "把“生成月度巡检报告”拆成采集数据、生成报告、提交验收。" },
|
||
{ keys: ["业务目标"], example: "目标可以是“完成今日邮件分类并输出异常清单”。" },
|
||
{ keys: ["执行计划"], example: "计划中写明先读取邮件,再分类,再生成日报,最后等待验收。" },
|
||
{ keys: ["计划步骤"], example: "“登录系统下载报表”就是计划里的一个步骤。" },
|
||
{ keys: ["任务执行管理"], example: "同一计划下的多个采集任务可以排队、重试、暂停或取消。" },
|
||
{ keys: ["工作任务"], example: "“读取 inbox 中未处理邮件”是一项可调度工作任务。" },
|
||
{ keys: ["执行记录"], example: "第一次读取邮件失败后,第二次重试会形成新的执行记录。" },
|
||
{ keys: ["自动重试"], example: "网页临时超时后,系统在 3 分钟后自动再试一次。" },
|
||
{ keys: ["恢复点"], example: "长流程已经完成数据下载,失败后从报告生成环节继续。" },
|
||
{ keys: ["超时管控"], example: "浏览器操作超过 10 分钟未完成,就转入失败恢复或人工介入。" },
|
||
{ keys: ["人工治理"], example: "任务可以被审批、暂停、恢复、取消、接管或重新规划。" },
|
||
{ keys: ["审批通过"], example: "审批人确认发信内容无误后,允许流程继续发送。" },
|
||
{ keys: ["暂停"], example: "发现输入资料不完整时,先暂停任务等待补充。" },
|
||
{ keys: ["恢复"], example: "资料补齐后,从暂停点继续执行,不必从头开始。" },
|
||
{ keys: ["取消"], example: "业务目标已经撤销,取消计划并释放后台服务。" },
|
||
{ keys: ["人工接管"], example: "网页验证码无法自动处理时,转给人工完成后再继续。" },
|
||
{ keys: ["重新规划"], example: "原接口不可用,改走网页下载报表的替代路径。" },
|
||
{ keys: ["风险与规则"], example: "涉及外部发信、删除文件、控制设备的动作必须进入审批。" },
|
||
{ keys: ["记忆规则"], example: "用户偏好可以长期保留,但临时验证码不允许写入记忆。" },
|
||
{ keys: ["服务占用"], example: "某个任务正在使用邮件读取服务时,系统不会把该服务提前回收。" },
|
||
{ keys: ["风险等级"], example: "读取邮件是低风险,批量发信是高风险,需要审批。" },
|
||
{ keys: ["健康状态"], example: "邮件服务正常、浏览器环境异常、任务队列积压都能被展示出来。" },
|
||
|
||
{ keys: ["自动执行与能力"], example: "系统调用脚本、流程、智能辅助和外部系统适配来完成真实业务动作。" },
|
||
{ keys: ["能力目录"], example: "“读取邮件”“生成报告”“网页下载报表”都登记成可复用能力。" },
|
||
{ keys: ["能力登记"], example: "新增一个“登录后台下载销售报表”的自动化能力。" },
|
||
{ keys: ["版本管理"], example: "报表下载流程改版后,保留 v1 和 v2,避免影响旧任务。" },
|
||
{ keys: ["使用约定"], example: "规定输入必须包含日期范围,输出必须包含报告文件和数据结果。" },
|
||
{ keys: ["调度中枢"], example: "先检查账号和服务是否可用,再安排读取邮件、分类和生成报告。" },
|
||
{ keys: ["前置检查"], example: "执行前确认邮箱权限、浏览器环境、审批状态都满足条件。" },
|
||
{ keys: ["能力匹配"], example: "同样是取报表,优先走接口,接口失败再走网页自动化。" },
|
||
{ keys: ["失败恢复"], example: "下载失败后先重试,仍失败则换备用路径或转人工处理。" },
|
||
{ keys: ["自动脚本"], example: "每天固定导出报表、清洗数据、生成 CSV 文件。" },
|
||
{ keys: ["确定性任务"], example: "把固定格式表格转换成统一字段就是确定性任务。" },
|
||
{ keys: ["流程编排"], example: "把邮件读取、附件解析、报告生成、审批发送组合成一条流程。" },
|
||
{ keys: ["组合能力"], example: "“客户邮件处理”由读取、分类、回复草稿、归档四个能力组合。" },
|
||
{ keys: ["子流程"], example: "报告生成任务内部再拆成取数、制图、写摘要三个子流程。" },
|
||
{ keys: ["智能辅助"], example: "根据失败日志判断可能原因,并给出下一步处理建议。" },
|
||
{ keys: ["规划用于"], example: "把“做一份巡检报告”拆成采集、分析、生成、验收。" },
|
||
{ keys: ["修复建议"], example: "系统提示“登录页结构变化,建议改用备用选择器或人工接管”。" },
|
||
{ keys: ["解释用于"], example: "向审批人说明为什么这一步被判定为高风险。" },
|
||
{ keys: ["外部系统适配"], example: "同一业务流程可以同时操作网页后台、设备接口和机器人。" },
|
||
{ keys: ["网页操作"], example: "自动登录后台,下载当天订单报表。" },
|
||
{ keys: ["设备接入"], example: "读取设备状态或通过设备接口下发巡检命令。" },
|
||
{ keys: ["机器人控制"], example: "让机器人执行移动、拍照、语音播报等动作。" },
|
||
{ keys: ["按需后台服务"], example: "只有处理邮件任务时才启动邮件读取服务,空闲后自动回收。" },
|
||
{ keys: ["服务定义"], example: "定义邮件读取服务如何启动、检查健康、停止和授权。" },
|
||
{ keys: ["运行实例"], example: "当前启动了一个邮件读取实例,状态为运行中。" },
|
||
{ keys: ["占用关系"], example: "任务 A 正在使用浏览器环境,因此该环境不能被其他任务关闭。" },
|
||
|
||
{ keys: ["运营记录与看板"], example: "领导可以看到任务进度、风险节点、成果报告和人工介入情况。" },
|
||
{ keys: ["业务状态台账"], example: "某计划已激活,三个任务成功,一个任务等待审批。" },
|
||
{ keys: ["执行计划状态"], example: "计划当前处于“等待审批”或“执行中”。" },
|
||
{ keys: ["工作任务状态"], example: "任务当前是排队中、执行中、暂停、失败或完成。" },
|
||
{ keys: ["执行记录状态"], example: "第 2 次执行成功,第 1 次执行因网页超时失败。" },
|
||
{ keys: ["审批记录状态"], example: "发信审批已通过,删除文件审批被拒绝。" },
|
||
{ keys: ["过程日志"], example: "记录任务开始、服务启动、审批通过、执行失败等关键变化。" },
|
||
{ keys: ["关键过程记录"], example: "“09:03 邮件读取服务启动”“09:05 附件解析失败”。" },
|
||
{ keys: ["成果资料库"], example: "保存巡检报告、页面截图、附件解析结果和导出的表格。" },
|
||
{ keys: ["文件是"], example: "保存下载的 Excel、PDF 报告或邮件附件。" },
|
||
{ keys: ["报告是"], example: "自动生成日报、巡检报告或异常汇总。" },
|
||
{ keys: ["截图用于"], example: "保留网页提交成功页面,作为验收证据。" },
|
||
{ keys: ["数据结果"], example: "把邮件分类结果保存成结构化表格,供后续统计。" },
|
||
{ keys: ["经验与记忆库"], example: "记录某项目常用账号、报告格式偏好、失败处理经验。" },
|
||
{ keys: ["项目事实"], example: "某系统的报表入口固定在“运营中心 / 日报”菜单下。" },
|
||
{ keys: ["使用偏好"], example: "用户偏好报告用中文摘要,并保留原始数据表。" },
|
||
{ keys: ["关键决策"], example: "决定所有外部发信必须先进入人工审批。" },
|
||
{ keys: ["处理经验"], example: "某网页下载失败时,先刷新登录态再重试。" },
|
||
{ keys: ["观察摘要"], example: "最近三次失败都集中在同一个外部系统登录环节。" },
|
||
{ keys: ["运营看板"], example: "展示今日任务成功率、待审批数量、失败任务和服务健康。" },
|
||
{ keys: ["任务看板"], example: "看到哪些任务已完成、哪些阻塞、哪些需要人工介入。" },
|
||
{ keys: ["审批队列"], example: "所有等待确认的发信、删除、设备控制动作集中展示。" },
|
||
{ keys: ["记忆索引"], example: "查看并修正“用户偏好报告格式”的长期记忆。" },
|
||
{ keys: ["服务健康"], example: "邮件读取服务正常,浏览器环境重启 1 次,设备连接异常。" },
|
||
{ keys: ["全程追踪"], example: "按时间线查看一次任务从提交到验收的完整过程。" },
|
||
{ keys: ["过程回放"], example: "复盘某次失败,看到它在附件解析步骤出错。" },
|
||
{ keys: ["诊断"], example: "定位失败原因是账号过期、网页变化还是服务不可用。" },
|
||
{ keys: ["追责"], example: "确认是谁在什么时间批准了批量发信动作。" },
|
||
{ keys: ["运营指标"], example: "每周统计成功率、平均耗时和人工介入率。" },
|
||
{ keys: ["服务时效"], example: "巡检报告要求 30 分钟内完成并提交。" },
|
||
{ keys: ["成功率"], example: "本周邮件处理任务 100 次,成功 96 次。" },
|
||
{ keys: ["响应耗时"], example: "从邮件到达到生成处理结果平均耗时 2 分钟。" },
|
||
{ keys: ["人工介入率"], example: "本月 12% 的任务因审批或异常需要人工介入。" },
|
||
|
||
{ keys: ["核心闭环"], example: "一封客户邮件进入系统后,生成任务、自动处理、沉淀成果,再进入看板和复盘。" },
|
||
{ keys: ["经验与服务准备"], example: "执行前先读取用户偏好,并启动邮件读取或浏览器服务。" },
|
||
{ keys: ["过程记录与成果沉淀"], example: "任务完成后保存报告、截图、日志和可复用处理经验。" },
|
||
{ keys: ["人工决策"], example: "审批人确认批量发信、暂停异常任务或要求重新规划。" },
|
||
{ keys: ["审批 / 暂停"], example: "审批不通过时,流程回到计划层重新规划。" },
|
||
];
|
||
|
||
function normalizeText(value) {
|
||
return (value || "").replace(/\s+/g, " ").trim();
|
||
}
|
||
|
||
function tooltipExample(target) {
|
||
const label = normalizeText(target.textContent);
|
||
const base = normalizeText(target.dataset.tip);
|
||
const haystack = `${label} ${base}`;
|
||
const rule = exampleRules.find((item) => item.keys.every((key) => haystack.includes(key)));
|
||
if (rule) return rule.example;
|
||
return "领导查看该节点时,可以把它对应到一次人工交办、邮件触发、定时巡检或高风险审批中的具体动作。";
|
||
}
|
||
|
||
function tooltipText(target) {
|
||
const text = normalizeText(target.dataset.tip);
|
||
if (!text) return "";
|
||
if (text.includes("例:")) return text;
|
||
return `${text}\n例:${tooltipExample(target)}`;
|
||
}
|
||
|
||
function positionTooltip(event) {
|
||
const margin = 14;
|
||
const offset = 16;
|
||
const rect = tooltip.getBoundingClientRect();
|
||
let left = event.clientX + offset;
|
||
let top = event.clientY + offset;
|
||
|
||
if (left + rect.width + margin > window.innerWidth) {
|
||
left = Math.max(margin, event.clientX - rect.width - offset);
|
||
}
|
||
if (top + rect.height + margin > window.innerHeight) {
|
||
top = Math.max(margin, event.clientY - rect.height - offset);
|
||
}
|
||
|
||
tooltip.style.left = `${left}px`;
|
||
tooltip.style.top = `${top}px`;
|
||
}
|
||
|
||
function showTooltip(target, event) {
|
||
const text = tooltipText(target);
|
||
if (!text) return;
|
||
activeTipTarget = target;
|
||
tooltip.textContent = text;
|
||
tooltip.classList.add("is-visible");
|
||
positionTooltip(event);
|
||
}
|
||
|
||
function hideTooltip() {
|
||
activeTipTarget = null;
|
||
tooltip.classList.remove("is-visible");
|
||
}
|
||
|
||
document.addEventListener("pointerover", (event) => {
|
||
const target = event.target.closest("[data-tip]");
|
||
if (target) showTooltip(target, event);
|
||
});
|
||
|
||
document.addEventListener("pointermove", (event) => {
|
||
if (activeTipTarget) positionTooltip(event);
|
||
});
|
||
|
||
document.addEventListener("pointerout", (event) => {
|
||
if (!activeTipTarget) return;
|
||
const next = event.relatedTarget;
|
||
if (!next || !activeTipTarget.contains(next)) hideTooltip();
|
||
});
|
||
|
||
document.querySelectorAll("[data-tip]").forEach((element) => {
|
||
element.setAttribute("tabindex", "0");
|
||
element.setAttribute("aria-label", tooltipText(element));
|
||
element.addEventListener("focus", (event) => {
|
||
const rect = event.currentTarget.getBoundingClientRect();
|
||
showTooltip(event.currentTarget, {
|
||
clientX: rect.left + rect.width / 2,
|
||
clientY: rect.top + rect.height / 2,
|
||
});
|
||
});
|
||
element.addEventListener("blur", hideTooltip);
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|