Files
LWLT-AIBOT/LianSyn-platform/index.html
2026-08-30 00:13:22 +08:00

211 lines
11 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#edf2f4">
<title>AI操作台 · LianSyn-platform</title>
<link rel="stylesheet" href="styles.css?v=20260827-roster-attachment-1">
</head>
<body>
<main class="app-shell">
<header class="topbar">
<div class="brand-block">
<img class="brand-logo" src="assets/ltjt-platform-logo.png" alt="LianSyn-platform">
</div>
<nav class="top-nav" aria-label="主菜单">
<a id="workbenchNav" class="top-nav-item is-active" aria-current="page" href="/">AI操作台</a>
<a id="historyNav" class="top-nav-item" href="/history">历史任务</a>
<a id="channelsNav" class="top-nav-item" href="/channels">AgentBus 渠道</a>
<a id="parserRoutingNav" class="top-nav-item" href="/parser-routing">解析策略</a>
</nav>
<div class="top-actions">
<span id="authState" class="auth-state" hidden></span>
<button id="automationToggleButton" type="button" class="automation-toggle" hidden aria-pressed="false" title="开启后,所有来源的新任务解析通过后将跳过人工确认并自动进入 ERP"></button>
<button id="logoutButton" type="button" class="logout-button" hidden>退出登录</button>
<button id="aiState" type="button" class="status-icon state-bad" title="点击查看 AI 状态详情" aria-expanded="false" aria-controls="statusDetailsPopover">
<span class="status-icon-glyph" aria-hidden="true">✦</span>
<span class="status-icon-label">AI状态</span>
<span class="status-icon-value">未连接</span>
</button>
<button id="bridgeState" type="button" class="status-icon state-bad" title="点击查看插件状态详情" aria-expanded="false" aria-controls="statusDetailsPopover">
<span class="status-icon-glyph" aria-hidden="true">⌁</span>
<span class="status-icon-label">插件状态</span>
<span class="status-icon-value">未连接</span>
</button>
<section id="statusDetailsPopover" class="status-popover" role="dialog" aria-modal="false" aria-labelledby="statusDetailsTitle" hidden>
<header class="status-popover-head">
<div>
<p class="status-popover-eyebrow">CONNECTION DETAILS</p>
<h2 id="statusDetailsTitle">状态详情</h2>
</div>
<button id="statusDetailsClose" type="button" class="status-popover-close" aria-label="关闭状态详情">×</button>
</header>
<div id="statusDetailsBody" class="status-popover-body" aria-live="polite"></div>
<footer class="status-popover-actions">
<button id="statusDetailsRefresh" type="button" class="secondary-button">重新检测</button>
</footer>
</section>
</div>
</header>
<section id="loginPanel" class="login-panel" hidden>
<div class="login-card">
<p class="eyebrow">PRIVATE CONTROL PLANE</p>
<h1>管理员登录</h1>
<p class="muted">请使用平台管理员账号进入业务操作台。</p>
<form id="loginForm" novalidate>
<label>账号<input id="loginUsername" name="username" autocomplete="username" required></label>
<label>密码<input id="loginPassword" name="password" type="password" autocomplete="current-password" required></label>
<button type="submit">登录</button>
<p id="loginError" class="login-error" role="alert"></p>
</form>
</div>
</section>
<section id="channelsPage" class="channels-page" hidden>
<section id="channelPanel" class="panel channel-panel">
<div class="panel-head">
<div>
<p class="eyebrow">CHANNEL DIRECTORY</p>
<h2>AgentBus 用户渠道</h2>
<p class="muted">每个外部用户渠道使用独立 AgentBus key;key 只写入服务端,不会回显,不再使用的渠道可以删除。</p>
</div>
</div>
<form id="channelForm" class="channel-form" novalidate>
<label>渠道名称<input id="channelDisplayName" maxlength="120" required placeholder="例如:小王"></label>
<label>外部用户标识<input id="channelExternalUserRef" maxlength="200" placeholder="例如:wx_user_001"></label>
<label>AgentBus key<input id="channelAgentbusKey" type="password" maxlength="4000" autocomplete="new-password" required></label>
<label>Bot 地址(可选)<input id="channelBotAddress" maxlength="200" placeholder="默认使用全局 bot 地址"></label>
<button type="submit">添加渠道</button>
</form>
<div id="channelList" class="channel-list"></div>
<p id="channelMessage" class="channel-message" role="status"></p>
</section>
</section>
<section id="parserRoutingPage" class="parser-routing-page" hidden>
<section class="panel parser-routing-panel">
<div class="panel-head parser-routing-head">
<div>
<p class="eyebrow">PARSER ROUTING CONTROL</p>
<h2>18 项业务解析策略</h2>
<p class="muted">程序与夹具即时验证后逐业务手动切换;两项名单导入固定为 Program-only,不参与 AI 回退。</p>
</div>
<button id="emergencyAiButton" type="button" class="danger-button parser-emergency-button">可配置业务全部切回 AI</button>
</div>
<div id="parserAutomationNotice" class="parser-automation-notice" role="note"></div>
<div class="parser-routing-table-wrap">
<table class="parser-routing-table">
<thead>
<tr>
<th>业务</th>
<th>程序版本</th>
<th>当前模式</th>
<th>近 7 日观察</th>
<th>近 30 日观察</th>
<th>即时切换检查</th>
<th>最近修改</th>
</tr>
</thead>
<tbody id="parserRoutingRows"></tbody>
</table>
</div>
<p id="parserRoutingMessage" class="channel-message" role="status"></p>
</section>
</section>
<section id="workbench" class="workbench-grid" hidden>
<section class="panel instruction-panel">
<div class="panel-head">
<h2>输入区域</h2>
</div>
<textarea id="rawInstruction" spellcheck="false"></textarea>
<div class="task-input-request">
<div class="task-input-request-head">
<label class="task-output-label" for="rosterAttachment">名单 Excel 附件(可选)</label>
<span class="task-input-request-state">仅导入名单业务使用</span>
</div>
<input id="rosterAttachment" type="file" accept=".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
<p class="task-input-request-prompts">支持单个 .xls 或 .xlsx;文件只在本次提交时读取,不保存到浏览器。</p>
<p id="rosterAttachmentStatus" class="task-input-request-status" role="status" aria-live="polite"></p>
</div>
<div class="actions">
<button id="createTaskButton" type="button">创建任务</button>
</div>
</section>
<section class="panel task-list-panel">
<div class="panel-head">
<div class="panel-title-group">
<h2 id="taskListTitle">任务卡片</h2>
<span id="taskListHint" class="muted">最近任务</span>
</div>
<div class="task-list-head-actions">
<span id="taskCount" class="muted">0 个任务</span>
<a id="historyLink" class="secondary-button task-history-link" href="/history">查看更多</a>
</div>
</div>
<form id="historyFilters" class="history-filters" hidden>
<label>
搜索
<input id="historySearchInput" type="search" maxlength="200" placeholder="任务编号、状态消息或业务摘要">
</label>
<label>
状态
<select id="historyStatusInput">
<option value="">全部任务</option>
<option value="awaiting_attachment">等待名单附件</option>
<option value="awaiting_user_input">等待补充</option>
<option value="awaiting_confirmation">待确认</option>
<option value="confirmed">已确认</option>
<option value="running">执行中</option>
<option value="completed">已完成</option>
<option value="blocked">已阻断</option>
<option value="failed">失败</option>
<option value="reconciliation_pending">待回查</option>
</select>
</label>
<div class="history-filter-actions">
<button type="submit">筛选</button>
<button id="historyResetButton" type="button" class="secondary-button">重置</button>
</div>
</form>
<div id="historyBatchActions" class="history-batch-actions" hidden>
<label class="history-select-all">
<input id="historySelectAll" type="checkbox">
<span>选择本页</span>
</label>
<span id="historySelectionSummary" class="muted">已选 0 个</span>
<span id="historyBatchMessage" class="history-batch-message" role="status" aria-live="polite"></span>
<button id="historyDeleteSelectedButton" type="button" class="danger-button" disabled>删除所选</button>
</div>
<div id="taskCards" class="task-cards"></div>
<div id="historyPagination" class="history-pagination" hidden>
<span id="historyPageSummary" class="muted"></span>
<div class="history-pagination-actions">
<button id="historyPreviousButton" type="button" class="secondary-button">上一页</button>
<button id="historyNextButton" type="button" class="secondary-button">下一页</button>
</div>
</div>
</section>
<section class="panel detail-panel">
<div class="panel-head">
<h2>任务状态</h2>
<div class="detail-panel-actions">
<span id="taskState" class="muted">未创建</span>
<button id="confirmTaskButton" type="button" hidden disabled>确认并提交到 ERP 插件</button>
<button id="deleteTaskButton" type="button" class="danger-button" disabled>删除任务</button>
</div>
</div>
<div id="taskStages" class="task-stages" aria-label="项目处理阶段"></div>
<div id="taskDetail" class="task-detail"></div>
</section>
</section>
</main>
<script src="app.js?v=20260830-team-order-validation-scope-1"></script>
</body>
</html>