211 lines
11 KiB
HTML
211 lines
11 KiB
HTML
<!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>
|