Files
caiwuzongzhang/web/admin.html
T
f17636183d Implement automatic reminder engine with admin and company UI.
Add schema v6, read-only scan rules for unsubmitted flows, gaps and pending reviews, deduplicated delivery with append-only event history, daily scan thread, and full API/frontend integration with 18 new tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: multica-agent <github@multica.ai>
2026-08-28 13:33:06 +00:00

1106 lines
63 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.0" />
<meta name="description" content="金牛集团总账管理端" />
<title>总账管理端 · 金牛集团</title>
<link rel="stylesheet" href="design-system.css?v=4" />
</head>
<body data-portal="admin">
<a class="skip-link" href="#main-content">跳到主要内容</a>
<div class="shell">
<aside class="sidebar" id="sidebar" aria-label="总账管理导航">
<div class="side-brand">
<div class="brand-name">金牛实业 · 资金往来</div>
<div class="brand-sub">HENAN JINNIU INDUSTRIAL GROUP</div>
<span class="side-role">总账管理端</span>
</div>
<nav class="side-nav">
<div class="nav-group">日常</div>
<a class="active" data-view="dashboard" href="#dashboard"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><rect x="3" y="3" width="8" height="8" rx="1.5"/><rect x="13" y="3" width="8" height="5" rx="1.5"/><rect x="13" y="10" width="8" height="11" rx="1.5"/><rect x="3" y="13" width="8" height="8" rx="1.5"/></svg><span class="nav-label">管理总览</span></a>
<a data-view="pair" href="#pair"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M7 8h13l-3.5-3.5M17 16H4l3.5 3.5"/></svg><span class="nav-label">往来查询</span></a>
<a data-view="audit" href="#audit"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M9 11.5l2 2 4-4.5"/><rect x="4" y="3" width="16" height="18" rx="2"/></svg><span class="nav-label">审核中心</span><span class="nav-badge">6</span></a>
<a data-view="flows" href="#flows"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M4 6h16M4 12h16M4 18h10"/></svg><span class="nav-label">流水管理</span></a>
<div class="nav-group">基础与结账</div>
<a data-view="companies" href="#companies"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M4 21V8l8-5 8 5v13"/><path d="M9 21v-6h6v6"/></svg><span class="nav-label">公司与账号</span></a>
<a data-view="settings" href="#settings"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><circle cx="12" cy="12" r="8.5"/><path d="M12 7v5l3.5 2"/></svg><span class="nav-label">结账与期初</span></a>
<a data-view="reminders" href="#reminders"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M6 9a6 6 0 1 1 12 0c0 5 2 6 2 6H4s2-1 2-6"/><path d="M10 19a2 2 0 0 0 4 0"/></svg><span class="nav-label">提醒管理</span></a>
</nav>
<div class="side-foot">
<div class="user-row">
<span class="avatar"></span>
<div>
<div class="user-name">系统管理员</div>
<div class="user-meta">集团总账会计</div>
</div>
<button class="logout" type="button">退出</button>
</div>
</div>
</aside>
<div class="main">
<div class="topbar">
<span class="crumb">总账管理端 / <b id="currentViewName">管理总览</b></span>
<div class="topbar-right">
<span class="tag">账期 2026-07</span>
<span class="tag">统计截止 2026-08-20</span>
<button class="btn btn-sm" data-view-link="settings">结账检查</button>
</div>
</div>
<main class="content" id="main-content">
<section class="app-view is-active" data-page="dashboard">
<div class="page-head">
<div>
<h1>管理总览</h1>
<p class="page-sub">2026-01-01 至 2026-08-20,集团 6 家成员公司相互往来累计发生 8.11 亿元、392 笔明细。页面上任意数字与公司均可逐级穿透,直至银行原始流水。</p>
</div>
<div class="page-actions">
<button class="btn" data-view-link="pair">往来查询</button>
</div>
</div>
<div class="grid grid-4">
<div class="card stat-card">
<div class="stat-label">往来借方总额 · 年初至今</div>
<div class="stat-value">42,040.30<span class="unit">万元</span></div>
<div class="stat-foot">6 家公司合计 · 明细 392 笔</div>
</div>
<div class="card stat-card">
<div class="stat-label">往来贷方总额 · 年初至今</div>
<div class="stat-value">39,040.30<span class="unit">万元</span></div>
<div class="stat-foot">6 家公司合计 · 与借方同源互证</div>
</div>
<div class="card stat-card warn">
<div class="stat-label">借贷轧差 · 未匹配</div>
<div class="stat-value">3,000.00<span class="unit">万元</span></div>
<div class="stat-foot">由单边流水与待确认往来形成,可在往来查询核对</div>
</div>
<div class="card stat-card">
<div class="stat-label">7 月账期确认进度</div>
<div class="stat-value">50<span class="unit">%</span></div>
<div class="progress" style="margin-top: 10px;"><span style="width: 50%;"></span></div>
<div class="stat-foot" style="margin-top: 8px;">3 家已完成 · 2 家在途 · 1 家未提交</div>
</div>
</div>
<div class="grid grid-3-2" style="margin-top: 14px;">
<div class="stack">
<div class="card" id="companyTotals">
<div class="card-head">
<span class="card-title">各公司往来合计<span class="sub">2026-01-01 至 2026-08-20 · 单位:万元 · 点击任意行查看该公司往来明细</span></span>
<input class="input" id="company-search" aria-label="搜索公司" placeholder="搜索公司…" style="width: 170px;" />
</div>
<div class="table-wrap" style="border: 0;">
<table class="ds-table">
<thead>
<tr><th>公司</th><th class="num-col">借方合计</th><th class="num-col">贷方合计</th><th class="num-col">明细笔数</th><th class="num-col">期末净往来</th><th>7 月状态</th></tr>
</thead>
<tbody>
<tr class="clickable" data-view-link="pair">
<td class="cell-main">金牛煤业<span class="cell-sub">河南金牛煤业有限公司</span></td>
<td class="num-col">18,420.50</td>
<td class="num-col">12,386.00</td>
<td class="num-col">128</td>
<td class="num-col amt-in">+6,034.50</td>
<td><span class="pill pill-success">已完成</span></td>
</tr>
<tr class="clickable" data-view-link="pair">
<td class="cell-main">金牛物流<span class="cell-sub">河南金牛物流有限公司</span></td>
<td class="num-col">6,208.75</td>
<td class="num-col">7,914.30</td>
<td class="num-col">74</td>
<td class="num-col amt-out">-1,705.55</td>
<td><span class="pill pill-success">已完成</span></td>
</tr>
<tr class="clickable" data-view-link="pair">
<td class="cell-main">金牛贸易<span class="cell-sub">河南金牛贸易有限公司</span></td>
<td class="num-col">9,850.00</td>
<td class="num-col">9,102.40</td>
<td class="num-col">86</td>
<td class="num-col amt-in">+747.60</td>
<td><span class="pill pill-success">已完成</span></td>
</tr>
<tr class="clickable" data-view-link="pair">
<td class="cell-main">金牛置业<span class="cell-sub">河南金牛置业有限公司</span></td>
<td class="num-col">3,960.20</td>
<td class="num-col">5,730.00</td>
<td class="num-col">52</td>
<td class="num-col amt-out">-1,769.80</td>
<td><span class="pill pill-warn">流水待补</span></td>
</tr>
<tr class="clickable" data-view-link="pair">
<td class="cell-main">金牛新能源<span class="cell-sub">河南金牛新能源有限公司</span></td>
<td class="num-col">2,130.00</td>
<td class="num-col">2,886.00</td>
<td class="num-col">31</td>
<td class="num-col amt-out">-756.00</td>
<td><span class="pill pill-warn">确认中</span></td>
</tr>
<tr class="clickable" data-view-link="pair">
<td class="cell-main">金牛农业<span class="cell-sub">河南金牛农业科技发展有限公司</span></td>
<td class="num-col">1,470.85</td>
<td class="num-col">1,021.60</td>
<td class="num-col">21</td>
<td class="num-col amt-in">+449.25</td>
<td><span class="pill pill-danger">未提交</span></td>
</tr>
</tbody>
<tfoot>
<tr>
<td>合计 · 6 家</td>
<td class="num-col">42,040.30</td>
<td class="num-col">39,040.30</td>
<td class="num-col">392</td>
<td class="num-col">+3,000.00</td>
<td></td>
</tr>
</tfoot>
</table>
</div>
</div>
<div class="card">
<div class="card-head">
<span class="card-title">公司对查<span class="sub">选择两家公司,直达它们之间的往来明细</span></span>
</div>
<div class="row" style="align-items: flex-end; flex-wrap: wrap;">
<div class="field" style="flex: 1 1 190px; margin-bottom: 0;">
<label for="ql-self">本方公司</label>
<select class="select" id="ql-self">
<option>河南金牛煤业有限公司</option>
<option>河南金牛物流有限公司</option>
<option>河南金牛贸易有限公司</option>
<option>河南金牛置业有限公司</option>
<option>河南金牛新能源有限公司</option>
<option selected>河南金牛农业科技发展有限公司</option>
</select>
</div>
<span class="meta" style="padding: 0 4px 9px; flex: none;"></span>
<div class="field" style="flex: 1 1 190px; margin-bottom: 0;">
<label for="ql-peer">对方公司</label>
<select class="select" id="ql-peer">
<option selected>河南金牛煤业有限公司</option>
<option>河南金牛物流有限公司</option>
<option>河南金牛贸易有限公司</option>
<option>河南金牛置业有限公司</option>
<option>河南金牛新能源有限公司</option>
</select>
</div>
</div>
<div class="detail-box row-between" style="margin-top: 12px;">
<div>
<div style="font-weight: 650;">金牛农业 → 应收 386.24 万元</div>
<div class="meta" style="margin-top: 2px;">14 笔(借 9 / 贷 5)· 最早未结 2026-03-12</div>
</div>
<button class="btn btn-sm" data-view-link="pair">查看逐笔往来</button>
</div>
</div>
</div>
<div class="stack">
<div class="card">
<div class="card-head">
<span class="card-title">待办队列<span class="sub">12 项待处理 · 下方为影响结账的前 4 项,从第 1 项开始</span></span>
<button class="btn btn-sm btn-ghost" data-view-link="audit">审核中心 →</button>
</div>
<div class="list-row" data-detail="admin-gap">
<span class="pill pill-danger"></span>
<div class="lr-main">
<div class="lr-title">金牛置业 · 中行尾号 8821 账户 7 月流水断档 11 天</div>
<div class="lr-sub">07-06 至 07-16 无流水,影响与金牛煤业 320 万元往来的归集</div>
</div>
<button class="btn btn-sm" data-view-link="audit">去审核</button>
</div>
<div class="list-row" data-detail="admin-unsubmitted">
<span class="pill pill-danger"></span>
<div class="lr-main">
<div class="lr-title">金牛农业 7 月全部账户未提交流水</div>
<div class="lr-sub">已发 2 次系统提醒,最近一次 08-18,仍未响应</div>
</div>
<button class="btn btn-sm" data-view-link="reminders">再提醒</button>
</div>
<div class="list-row" data-detail="admin-unilateral">
<span class="pill pill-warn"></span>
<div class="lr-main">
<div class="lr-title">金牛新能源 ↔ 金牛贸易 3 笔单边流水待对方证据</div>
<div class="lr-sub">合计 486 万元,需新能源侧选择对方银行流水佐证</div>
</div>
<button class="btn btn-sm" data-view-link="audit">去审核</button>
</div>
<div class="list-row" data-detail="admin-subject">
<span class="pill pill-warn"></span>
<div class="lr-main">
<div class="lr-title">5 笔手工记录待确认往来科目</div>
<div class="lr-sub">应收 / 其他应收待判定,涉及煤业、物流、贸易</div>
</div>
<button class="btn btn-sm" data-view-link="audit">去审核</button>
</div>
<div class="table-foot">
<span>其余 8 项为低风险与已挂起事项</span>
<button class="btn btn-sm btn-ghost" data-view-link="audit" style="color: var(--fg); font-weight: 550;">进入审核中心 →</button>
</div>
</div>
<div class="card">
<div class="card-head">
<span class="card-title">账期与结账<span class="sub">每月 5 日结账 · 全局起算日 2026-01-01</span></span>
</div>
<dl class="kv">
<dt>当前账期</dt><dd>2026-07 · 进行中</dd>
<dt>结账日</dt><dd style="color: color-mix(in oklch, var(--warn) 78%, black); font-weight: 650;">2026-08-29(顺延)· 距今 9 天</dd>
<dt>上一账期</dt><dd>2026-06 · 已于 07-03 结账</dd>
</dl>
<button class="btn" data-view-link="settings" style="width: 100%; margin-top: 14px;">进入结账检查</button>
</div>
</div>
</div>
</section>
<section class="app-view" data-page="pair">
<div class="page-head">
<div>
<h1>往来查询</h1>
<p class="page-sub">按公司组合查询起算日 2026-01-01 起至统计截止日的逐笔往来余额,支持穿透至银行原始流水链路。</p>
</div>
</div>
<form class="filters" data-pair-form novalidate>
<div class="field">
<label for="pairFrom">本方公司</label>
<select class="select" name="from" id="pairFrom"></select>
</div>
<button class="btn" type="button" data-swap aria-label="交换公司" title="交换公司" style="align-self: flex-end;">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" style="width: 15px; height: 15px;"><path d="M7 8h13l-3.5-3.5M17 16H4l3.5 3.5"/></svg>
</button>
<div class="field">
<label for="pairTo">对方公司</label>
<select class="select" name="to" id="pairTo"></select>
<span class="hint error" id="pairError" style="display: none;">本方公司与对方公司不能为同一家</span>
</div>
<div class="field">
<label for="pairEnd">统计截止日</label>
<input class="input" name="end" id="pairEnd" type="date" value="2026-07-31" />
</div>
<button type="submit" class="btn btn-primary">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" style="width: 15px; height: 15px;"><circle cx="11" cy="11" r="7"/><path d="M20 20l-3.8-3.8"/></svg>
查询
</button>
</form>
<div class="notice warn" id="pairNotice" style="display: none; margin-bottom: 14px;">
<div>
<div class="n-title">该公司组合暂无归集数据</div>
<div class="n-body">所选组合在正式环境中将按相同口径实时归集,当前仅内置演示数据组合。</div>
</div>
</div>
<div id="pairReport">
<div class="row-between" style="margin-bottom: 12px;">
<span class="card-title"><span data-pair-from></span><span data-pair-to></span> · 往来余额</span>
<span class="meta" id="pairPeriod">统计口径 2026.01.01—2026.07.31</span>
</div>
<div class="grid grid-4">
<div class="card stat-card">
<div class="stat-label"><span class="stat-dot info"></span>期初余额(2026-01-01</div>
<div class="stat-value" id="pairOpening">0.00</div>
<div class="stat-foot">起算日前结转</div>
</div>
<div class="card stat-card">
<div class="stat-label"><span class="stat-dot success"></span>本期借方发生</div>
<div class="stat-value" id="pairDebit">0.00</div>
<div class="stat-foot">应收增加 + 应付偿付</div>
</div>
<div class="card stat-card">
<div class="stat-label"><span class="stat-dot warn"></span>本期贷方发生</div>
<div class="stat-value" id="pairCredit">0.00</div>
<div class="stat-foot">收回款项 + 应付计提</div>
</div>
<div class="card stat-card">
<div class="stat-label"><span class="stat-dot success"></span>期末结果</div>
<div class="stat-value" id="pairFinal"></div>
<div class="stat-foot"><span id="pairReviewStatus">含 1 笔待审核</span></div>
</div>
</div>
<div class="card" style="margin-top: 14px;">
<div class="tabs" id="subjectTabs">
<button type="button" class="active" data-subject-filter="all" aria-pressed="true">全部往来<span class="tab-count" data-subject-total="all">0</span></button>
<button type="button" data-subject-filter="应收" aria-pressed="false">应收<span class="tab-count" data-subject-total="应收">0</span></button>
<button type="button" data-subject-filter="其他应收" aria-pressed="false">其他应收<span class="tab-count" data-subject-total="其他应收">0</span></button>
<button type="button" data-subject-filter="应付" aria-pressed="false">应付<span class="tab-count" data-subject-total="应付">0</span></button>
<button type="button" data-subject-filter="其他应付" aria-pressed="false">其他应付<span class="tab-count" data-subject-total="其他应付">0</span></button>
</div>
<div class="table-wrap" style="border: 0;">
<table class="ds-table">
<thead>
<tr>
<th>交易日期</th>
<th>方向</th>
<th>科目</th>
<th>本方账户</th>
<th>对方账户</th>
<th class="wrap">摘要</th>
<th>匹配</th>
<th class="num-col">金额(万元)</th>
<th>操作</th>
</tr>
</thead>
<tbody id="pairTransactions"></tbody>
</table>
</div>
<div class="table-foot" style="margin: 0 -20px -18px; border-radius: 0 0 12px 12px;">
<span id="pairFoot">点击「穿透」查看银行原始流水链路</span>
</div>
</div>
</div>
</section>
<section class="app-view" data-page="audit">
<div class="page-head">
<div>
<h1>审核中心</h1>
<p class="page-sub">集中处理流水断档、单边匹配、科目确认等待审事项。审核结论将同步至结账检查与各公司往来台账。</p>
</div>
<div class="page-actions">
<a class="btn" data-view-link="reminders">提醒管理</a>
<a class="btn btn-primary" data-view-link="settings">查看结账影响</a>
</div>
</div>
<div class="notice warn">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" style="width: 18px; height: 18px; flex: none; margin-top: 1px;"><path d="M12 4 3 19h18L12 4z"/><path d="M12 10v4"/><circle cx="12" cy="16.6" r="0.4"/></svg>
<div>
<div class="n-title">当前 <span id="pending-count">0</span> 项待审核</div>
<div class="n-body">全部待审事项须在顺延后的结账日前处理完毕,逾期将阻断 7 月结账。</div>
</div>
</div>
<div style="display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end; margin-top: 18px;">
<div class="tabs" id="auditTabs" style="margin-bottom: 0; flex: 1 1 260px; min-width: 0;">
<button class="active" data-audit-filter="all" data-label="全部" aria-pressed="true">全部<span class="tab-count">0</span></button>
<button data-audit-filter="断档" data-label="流水断档" aria-pressed="false">流水断档<span class="tab-count">0</span></button>
<button data-audit-filter="单边" data-label="单边匹配" aria-pressed="false">单边匹配<span class="tab-count">0</span></button>
<button data-audit-filter="科目" data-label="科目确认" aria-pressed="false">科目确认<span class="tab-count">0</span></button>
<button data-audit-filter="起算" data-label="起算区间校准" aria-pressed="false">起算区间校准<span class="tab-count">0</span></button>
<button data-audit-filter="账户" data-label="银行账户登记" aria-pressed="false">银行账户登记<span class="tab-count">0</span></button>
<button data-audit-filter="手工" data-label="公司手工记录" aria-pressed="false">公司手工记录<span class="tab-count">0</span></button>
</div>
<div class="field" style="min-width: 180px;">
<label for="auditCompany">公司</label>
<select class="select" id="auditCompany"><option>全部公司</option></select>
</div>
</div>
<div class="table-wrap" style="margin-top: 14px;">
<table class="ds-table audit-table">
<thead>
<tr>
<th>风险等级</th>
<th>公司 / 事项</th>
<th>类型</th>
<th>期间</th>
<th class="wrap">影响</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="auditRows">
<tr data-audit-type="断档" data-company="金牛置业">
<td><span class="pill pill-danger"></span></td>
<td><span class="cell-main">金牛置业 · 中行尾号 8821</span><span class="cell-sub">07-06 至 07-16 无流水</span></td>
<td>流水断档</td>
<td>2026-07</td>
<td class="wrap">11 天无流水,与金牛煤业 320 万煤炭采购款往来无法归集,阻断 7 月结账</td>
<td><span class="pill pill-info">待审核</span></td>
<td><div class="row" style="gap:6px;"><button type="button" class="btn btn-sm btn-primary" data-audit-action="approve">通过</button><button type="button" class="btn btn-sm btn-danger" data-audit-action="reject">驳回</button></div></td>
</tr>
<tr data-audit-type="单边" data-company="金牛新能源">
<td><span class="pill pill-warn"></span></td>
<td><span class="cell-main">金牛新能源 ↔ 金牛贸易</span><span class="cell-sub">3 笔单边合计 486 万</span></td>
<td>单边匹配</td>
<td>2026-07</td>
<td class="wrap">单边支付无对方对应流水,往来差异挂账,待对方选择流水佐证</td>
<td><span class="pill pill-info">待审核</span></td>
<td><div class="row" style="gap:6px;"><button type="button" class="btn btn-sm btn-primary" data-audit-action="approve">通过</button><button type="button" class="btn btn-sm btn-danger" data-audit-action="reject">驳回</button></div></td>
</tr>
<tr data-audit-type="科目" data-company="金牛煤业">
<td><span class="pill pill-warn"></span></td>
<td><span class="cell-main">金牛煤业 · 手工记录</span><span class="cell-sub">场地押金 42 万</span></td>
<td>科目确认</td>
<td>2026-07</td>
<td class="wrap">「应收 / 其他应收」科目待判定,影响科目汇总口径</td>
<td><span class="pill pill-info">待审核</span></td>
<td><div class="row" style="gap:6px;"><button type="button" class="btn btn-sm btn-primary" data-audit-action="approve">通过</button><button type="button" class="btn btn-sm btn-danger" data-audit-action="reject">驳回</button></div></td>
</tr>
<tr data-audit-type="起算" data-company="金牛物流">
<td><span class="pill pill-danger"></span></td>
<td><span class="cell-main">金牛物流 · 工行基本户</span><span class="cell-sub">期初与上年结转差 28.6 万</span></td>
<td>起算区间校准</td>
<td>2026-01 起算</td>
<td class="wrap">期初余额与上年结转不衔接,全年累计数失真,需校准起算区间</td>
<td><span class="pill pill-info">待审核</span></td>
<td><div class="row" style="gap:6px;"><button type="button" class="btn btn-sm btn-primary" data-audit-action="approve">通过</button><button type="button" class="btn btn-sm btn-danger" data-audit-action="reject">驳回</button></div></td>
</tr>
<tr data-audit-type="手工" data-company="金牛贸易">
<td><span class="pill pill-warn"></span></td>
<td><span class="cell-main">金牛贸易 · 手工补录</span><span class="cell-sub">现金缴存 64 万</span></td>
<td>公司手工记录</td>
<td>2026-07</td>
<td class="wrap">无银行回单附件,需人工核实后方可入账</td>
<td><span class="pill pill-info">待审核</span></td>
<td><div class="row" style="gap:6px;"><button type="button" class="btn btn-sm btn-primary" data-audit-action="approve">通过</button><button type="button" class="btn btn-sm btn-danger" data-audit-action="reject">驳回</button></div></td>
</tr>
</tbody>
</table>
<div class="table-foot">
<span id="auditFoot">共 0 项 · 待审核 0 项</span>
<span>审核人:系统管理员 · 操作实时写入审核日志</span>
</div>
</div>
</section>
<section class="app-view" data-page="flows">
<div class="page-head">
<div>
<h1>流水管理</h1>
<p class="page-sub">六家成员公司上报的银行原始流水总表,含归集状态。点击任意一行可穿透查看原始流水要素与归集链路。</p>
</div>
<div class="page-actions">
<button class="btn btn-primary" id="exportFlows">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" style="width: 15px; height: 15px;"><path d="M12 4v11m0 0l-4-4m4 4l4-4"/><path d="M4 17v2.5A1.5 1.5 0 0 0 5.5 21h13a1.5 1.5 0 0 0 1.5-1.5V17"/></svg>
导出 CSV
</button>
</div>
</div>
<div class="filters">
<div class="field">
<label for="flowCompany">公司</label>
<select class="select" id="flowCompany"><option>全部公司</option></select>
</div>
<div class="field">
<label for="flowBank">银行</label>
<select class="select" id="flowBank"><option>全部银行</option><option>中行</option><option>工行</option><option>建行</option><option>农行</option><option>交行</option></select>
</div>
<div class="field">
<label for="flowAccount">账户</label>
<select class="select" id="flowAccount"><option>全部账户</option><option>3305</option><option>9916</option><option>7710</option><option>5562</option><option>2208</option><option>8821</option><option>6649</option></select>
</div>
<div class="field">
<label for="flowStart">日期起</label>
<input class="input" id="flowStart" type="date" value="2026-07-01" />
</div>
<div class="field">
<label for="flowEnd">日期止</label>
<input class="input" id="flowEnd" type="date" value="2026-07-31" />
</div>
<div class="field" style="min-width: 200px;">
<label for="flowKeyword">关键词</label>
<input class="input" id="flowKeyword" type="text" placeholder="摘要 / 对方 / 流水号" />
</div>
<button class="btn" id="applyFlowFilters">查询</button>
<button class="btn btn-ghost" id="resetFlowFilters">重置</button>
</div>
<div class="table-wrap">
<table class="ds-table" id="flowTable">
<thead>
<tr>
<th>日期</th>
<th>公司</th>
<th>银行账户</th>
<th>方向</th>
<th class="wrap">对方</th>
<th class="wrap">摘要</th>
<th>银行流水号</th>
<th>归集状态</th>
<th class="num-col">金额</th>
</tr>
</thead>
<tbody></tbody>
</table>
<div class="table-foot">
<span id="flowCount">共 0 笔</span>
<span class="meta">数据范围:2026-01-01 起算 · 每月 5 日结账(7 月顺延至 08-29)</span>
</div>
</div>
</section>
<section class="app-view" data-page="companies">
<div class="page-head">
<div>
<h1>公司与账号</h1>
<p class="page-sub">集团成员公司的档案、银行账户与登录账号管理。公司新登记的银行账户须经审核中心确认后方可参与流水归集。</p>
</div>
<div class="page-actions">
<button class="btn btn-primary" id="openCompanyDialog">新增公司</button>
</div>
</div>
<div class="notice info" id="notice-pending-account" style="margin-bottom: 14px; display: none;">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" style="width: 16px; height: 16px; flex: none; margin-top: 2px; color: var(--info);"><circle cx="12" cy="12" r="8.5"/><path d="M12 8v5M12 16h.01"/></svg>
<div style="flex: 1; min-width: 0;">
<div class="n-title"><span id="pending-account-count">0</span> 个新账户登记待审核</div>
<div class="n-body" id="pending-account-body">成员公司提交的新银行账户登记,等待审核通过后纳入账期流水归集范围。</div>
</div>
<a class="btn btn-sm" data-view-link="audit" style="flex: none;">去审核</a>
</div>
<div class="card">
<div class="card-head">
<span class="card-title">成员公司<span class="sub">数据截至 2026-08-20</span></span>
</div>
<div class="table-wrap" style="border: 0;">
<table class="ds-table" id="companyTable">
<thead>
<tr>
<th>公司名称</th>
<th class="num-col">银行账户数</th>
<th>登录账号</th>
<th>出纳</th>
<th>启用状态</th>
<th>操作</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<div class="table-foot" style="border: 1px solid var(--border); border-radius: 0 0 var(--radius-lg) var(--radius-lg);">
<span id="companyFoot">共 0 家公司</span>
<span class="meta">登录账号初始密码由集团总账统一发放</span>
</div>
</div>
</section>
<section class="app-view" data-page="settings">
<div class="page-head">
<div>
<h1>结账与期初</h1>
<p class="page-sub">维护全局结账参数与各公司期初往来余额,并在月度检查全部通过后执行结账。</p>
</div>
</div>
<div class="card">
<div class="card-head">
<span class="card-title">账期时间轴<span class="sub">全局起算日 2026-01-01 起,每月 5 日结账</span></span>
</div>
<div class="timeline">
<div class="tl-cell closed"><div class="tl-month">2026-01</div><div class="tl-state">已结账</div></div>
<div class="tl-cell closed"><div class="tl-month">2026-02</div><div class="tl-state">已结账</div></div>
<div class="tl-cell closed"><div class="tl-month">2026-03</div><div class="tl-state">已结账</div></div>
<div class="tl-cell closed"><div class="tl-month">2026-04</div><div class="tl-state">已结账</div></div>
<div class="tl-cell closed"><div class="tl-month">2026-05</div><div class="tl-state">已结账</div></div>
<div class="tl-cell closed"><div class="tl-month">2026-06</div><div class="tl-state">已结账</div></div>
<div class="tl-cell current" id="tl-current"><div class="tl-month">2026-07</div><div class="tl-state" id="tl-current-state">进行中</div></div>
<div class="tl-cell open"><div class="tl-month">2026-08</div><div class="tl-state">归集中</div></div>
</div>
</div>
<div class="grid grid-1-2" style="margin-top: 14px;">
<div class="stack">
<div class="card">
<div class="card-head">
<span class="card-title">结账设置<span class="sub">对全部成员公司生效</span></span>
</div>
<form id="systemSettings" novalidate>
<div class="field" style="margin-bottom: 14px;">
<label for="cs-start">全局起算日</label>
<input class="input num-input" type="date" name="startDate" id="cs-start" value="2026-01-01" />
<span class="hint">期初余额以此日前一日的期末数为准</span>
</div>
<div class="field" style="margin-bottom: 14px;">
<label for="cs-day">每月结账日</label>
<input class="input num-input" type="number" name="closingDay" id="cs-day" min="1" max="28" value="5" />
<span class="hint">每月几号执行上月结账 · 2026-07 因故顺延至 08-29</span>
</div>
<div class="field" style="margin-bottom: 16px;">
<label>自动提醒</label>
<div class="row" style="flex-wrap: wrap;">
<label style="display: inline-flex; align-items: center; gap: 8px; cursor: pointer;">
<input type="checkbox" id="cs-remind" checked style="position: absolute; opacity: 0; width: 0; height: 0;" />
<span id="cs-switch-track" style="width: 36px; height: 20px; border-radius: 999px; background: var(--accent); position: relative; flex: none; transition: background .15s ease;">
<span id="cs-switch-thumb" style="position: absolute; top: 2px; left: 18px; width: 16px; height: 16px; border-radius: 50%; background: var(--surface); transition: left .15s ease;"></span>
</span>
<span style="font-size: 13px;">结账日前自动提醒各公司出纳</span>
</label>
<select class="select" id="cs-remind-days" style="width: 110px;">
<option value="1">提前 1 天</option>
<option value="3" selected>提前 3 天</option>
<option value="5">提前 5 天</option>
</select>
</div>
<span class="hint">提醒对象为当月尚未提交流水的公司联系人</span>
</div>
<div class="row">
<button class="btn btn-primary" type="submit">保存设置</button>
<span class="meta" id="cs-save-tip" style="display: none; color: var(--success);">已保存 · 立即生效</span>
</div>
</form>
</div>
<div class="card">
<div class="card-head">
<span class="card-title">期初余额管理<span class="sub">2026-01-01 起算的公司间往来期初数</span></span>
<button class="btn btn-sm" id="openOpeningDialog">新增</button>
</div>
<div class="table-wrap" style="border: 0;">
<table class="ds-table">
<thead>
<tr><th>本方公司</th><th>对方公司</th><th>科目</th><th>方向</th><th class="num-col">金额(万元)</th><th>生效日</th><th>状态</th></tr>
</thead>
<tbody id="openingRows"></tbody>
</table>
</div>
</div>
</div>
<div class="card" id="closingPanel">
<div class="card-head">
<span class="card-title">月度结账<span class="sub" id="closingDescription">2026 年 7 月 · 当前未达到结账条件</span></span>
<span class="pill pill-danger" id="closingStatus">已阻断</span>
</div>
<div class="closing-check-list">
<div class="list-row">
<span class="pill pill-success" data-closing-check>公司流水提交</span>
<div class="lr-main"><div class="lr-title">流水提交</div><div class="lr-sub" data-closing-sub>5 / 6 家已完成</div></div>
<div class="lr-side"><span class="pill pill-warn" data-closing-state>待处理</span></div>
</div>
<div class="list-row">
<span class="pill pill-success" data-closing-check>账户连续性</span>
<div class="lr-main"><div class="lr-title">账户连续</div><div class="lr-sub" data-closing-sub>2 个账户存在断档</div></div>
<div class="lr-side"><span class="pill pill-danger" data-closing-state>阻断</span></div>
</div>
<div class="list-row">
<span class="pill pill-success" data-closing-check>审核事项</span>
<div class="lr-main"><div class="lr-title">审核完成</div><div class="lr-sub" data-closing-sub>0 项尚未处理</div></div>
<div class="lr-side"><span class="pill pill-danger" data-closing-state>阻断</span></div>
</div>
<div class="list-row">
<span class="pill pill-success" data-closing-check>期初余额</span>
<div class="lr-main"><div class="lr-title">期初锁定</div><div class="lr-sub" data-closing-sub>已锁定 2026.01.01</div></div>
<div class="lr-side"><span class="pill pill-success" data-closing-state>已通过</span></div>
</div>
</div>
<div class="notice danger" id="block-notice" style="margin-top: 16px; display: none;">
<div>
<div class="n-title">存在阻断项,暂不能执行 2026-07 月度结账</div>
<div class="n-body" id="block-notice-body">请先处理待审核事项与账户断档。</div>
</div>
</div>
<div class="notice info" id="closed-notice" style="margin-top: 16px; display: none;">
<div>
<div class="n-title">2026-07 已结账</div>
<div class="n-body" id="closed-notice-body">结账后各公司 7 月往来数据已锁定,期初数将结转至 2026-08 账期。</div>
</div>
</div>
<div class="row" style="margin-top: 16px; justify-content: flex-end; flex-wrap: wrap;">
<span class="meta" id="closingHistory" style="margin-right: auto;">最近结账:2026 年 6 月 · 系统管理员 · 2026.07.05 18:10</span>
<button class="btn" id="runClosingCheck">重新检查</button>
<button class="btn btn-primary" id="executeClosing" disabled title="请先处理全部阻断事项">执行 2026-07 月度结账</button>
</div>
</div>
</div>
</section>
<section class="app-view" data-page="reminders">
<div class="page-head">
<div>
<h1>提醒管理</h1>
<p class="page-sub">向成员公司发送处理提醒,并跟踪系统提醒与人工提醒的触达与处理状态。</p>
</div>
<div class="page-actions">
<button type="button" class="btn btn-sm" id="reminder-scan-btn">立即扫描</button>
</div>
</div>
<div class="card" id="pending-reminders-card" style="margin-bottom: 16px;">
<div class="card-head">
<span class="card-title">待提醒清单<span class="sub">系统按流水提交、断档、待确认自动发现,点发送即送达对应公司</span></span>
<div class="row" style="gap: 10px; align-items: center;">
<span class="meta" id="pending-summary"></span>
<button type="button" class="btn btn-primary btn-sm" id="pending-send-all" disabled>全部一键发送</button>
</div>
</div>
<div id="pending-list">
<div class="empty" id="pending-empty">暂无需要提醒的事项 · 各公司流水与确认进度正常</div>
</div>
</div>
<div class="grid grid-1-2">
<div class="card">
<div class="card-head">
<span class="card-title">发送处理提醒<span class="sub">将以人工提醒形式送达所选公司出纳与财务负责人</span></span>
</div>
<form id="reminderForm" novalidate>
<div class="field" style="margin-bottom: 14px;">
<label>接收公司(可多选)</label>
<div class="row" id="reminderCompanyList" style="flex-wrap: wrap; gap: 8px 16px;"></div>
<span class="hint error" id="company-error" style="display: none;">请至少选择一家接收公司</span>
</div>
<div class="field" style="margin-bottom: 14px;">
<label for="reminder-type">提醒类型</label>
<select class="select" id="reminder-type">
<option selected>流水未提交</option>
<option>单边待确认</option>
<option>科目待确认</option>
<option>账户登记</option>
<option>其他</option>
</select>
</div>
<div class="field" style="margin-bottom: 14px;">
<label for="reminder-content">提醒内容</label>
<textarea class="textarea" id="reminder-content">请于截止日期前完成 2026 年 7 月银行流水上传与待确认事项处理。</textarea>
<span class="hint error" id="content-error" style="display: none;">提醒内容不能为空</span>
</div>
<div class="field" style="margin-bottom: 18px;">
<label for="reminder-deadline">截止日期</label>
<input class="input" type="date" id="reminder-deadline" value="2026-08-29" min="2026-08-20" />
</div>
<button type="submit" class="btn btn-primary" id="send-btn" style="width: 100%;">发送提醒</button>
<p class="hint" id="send-hint" style="margin-top: 10px; display: none;"></p>
</form>
</div>
<div class="card">
<div class="card-head">
<span class="card-title">提醒历史<span class="sub">含系统自动触发与人工发送的全部提醒记录</span></span>
</div>
<div class="tabs" id="reminder-tabs">
<button type="button" class="active" data-filter="all">全部<span class="tab-count" id="count-all">0</span></button>
<button type="button" data-filter="system">系统提醒<span class="tab-count" id="count-system">0</span></button>
<button type="button" data-filter="manual">人工提醒<span class="tab-count" id="count-manual">0</span></button>
</div>
<div class="table-wrap" style="border: 0;">
<table class="ds-table">
<thead>
<tr>
<th>公司</th>
<th>来源</th>
<th>类型</th>
<th class="wrap">内容摘要</th>
<th>发送时间</th>
<th>截止日期</th>
<th>处理状态</th>
<th>操作</th>
</tr>
</thead>
<tbody id="reminder-tbody"></tbody>
</table>
</div>
<div class="table-foot">
<span id="table-foot-count">共 0 条提醒记录</span>
<span id="table-foot-state">未读 0 · 处理中 0 · 已完成 0</span>
</div>
</div>
</div>
</section>
</main>
</div>
</div>
<!-- 新增公司弹窗 -->
<div class="modal-backdrop" id="companyDialog">
<div class="modal">
<div class="modal-head">
<span class="modal-title">新增成员公司</span>
<button type="button" class="modal-close" data-close="companyDialog" aria-label="关闭">×</button>
</div>
<p class="modal-sub">登记后系统将生成公司端登录账号,初始密码由集团总账统一发放。</p>
<form id="companyForm" novalidate>
<div class="field" style="margin-bottom: 12px;">
<label for="f-name">公司全称</label>
<input class="input" id="f-name" name="companyName" type="text" placeholder="如:河南金牛XX有限公司" required />
</div>
<div class="field" style="margin-bottom: 12px;">
<label for="f-code">统一社会信用代码</label>
<input class="input num-input" id="f-code" name="creditCode" type="text" maxlength="18" placeholder="18 位,如 91410100MA9K2X417A" />
</div>
<label class="row" style="gap: 6px; font-size: 13px; margin-bottom: 12px; cursor: pointer;">
<input type="checkbox" name="createUser" checked style="width: auto;" />同时创建公司账号
</label>
<div class="grid grid-2">
<div class="field">
<label for="f-login">登录账号</label>
<input class="input" id="f-login" name="loginName" type="text" required />
</div>
<div class="field">
<label for="f-cashier">出纳人员</label>
<input class="input" id="f-cashier" name="cashier" type="text" required />
</div>
</div>
<p class="hint" style="margin-top: 10px;">创建后生成随机初始密码,仅显示一次,首次登录必须修改。</p>
<div class="modal-actions">
<button type="button" class="btn" data-close="companyDialog">取消</button>
<button type="submit" class="btn btn-primary">创建公司与账号</button>
</div>
</form>
</div>
</div>
<!-- 公司详情弹窗 -->
<div class="modal-backdrop" id="modal-detail">
<div class="modal wide">
<div class="modal-head">
<span class="modal-title" id="d-title">公司详情</span>
<button type="button" class="modal-close" data-close="modal-detail" aria-label="关闭">×</button>
</div>
<p class="modal-sub" id="d-sub"></p>
<div class="detail-box" style="margin-bottom: 14px;">
<dl class="kv" id="d-kv"></dl>
</div>
<div class="card-head" style="margin-bottom: 10px;">
<span class="card-title">登录账号</span>
</div>
<div class="detail-box">
<div class="row-between">
<div>
<div class="num" id="d-login-account" style="font-weight: 650;"></div>
<div class="meta" id="d-login-meta" style="margin-top: 3px;"></div>
</div>
<button class="btn btn-sm" id="btn-reset-pwd">重置密码</button>
</div>
</div>
</div>
</div>
<!-- 新增期初余额弹窗 -->
<div class="modal-backdrop" id="openingDialog">
<div class="modal">
<div class="modal-head">
<span class="modal-title">新增期初余额</span>
<button type="button" class="modal-close" data-close-opening aria-label="关闭">×</button>
</div>
<p class="modal-sub">按本方视角记录公司间期初方向,提交后进入复核。</p>
<form id="openingForm" novalidate>
<div class="grid grid-2">
<div class="field">
<label for="ob-from">本方公司</label>
<select class="select" name="from" id="ob-from" required></select>
</div>
<div class="field">
<label for="ob-to">对方公司</label>
<select class="select" name="to" id="ob-to" required></select>
</div>
<div class="field">
<label for="ob-subject">科目</label>
<select class="select" name="subject" id="ob-subject" required>
<option>应收</option>
<option>应付</option>
<option>其他应收</option>
<option>其他应付</option>
</select>
</div>
<div class="field">
<label for="ob-direction">方向</label>
<select class="select" name="direction" id="ob-direction" required>
<option>借方</option>
<option>贷方</option>
</select>
</div>
<div class="field">
<label for="ob-amount">金额(万元)</label>
<input class="input num-input" name="amount" id="ob-amount" type="number" min="0" step="0.01" required />
</div>
<div class="field">
<label for="ob-effective">生效日</label>
<input class="input" name="effectiveDate" id="ob-effective" type="date" value="2026-01-01" required />
</div>
</div>
<p class="hint" style="margin-top: 10px;">提交后进入复核,不能直接修改已确认期初。</p>
<div class="modal-actions">
<button type="button" class="btn" data-close-opening>取消</button>
<button type="submit" class="btn btn-primary">提交复核</button>
</div>
</form>
</div>
</div>
<!-- 审核通过弹窗 -->
<div class="modal-backdrop" id="modal-approve">
<div class="modal">
<div class="modal-head">
<span class="modal-title">确认通过</span>
<button type="button" class="modal-close" data-close="modal-approve">×</button>
</div>
<p class="modal-sub">通过后该事项将标记为「已通过」并写入审核日志,不可撤销。</p>
<div class="detail-box">
<dl class="kv">
<dt>公司 / 事项</dt><dd id="approve-company"></dd>
<dt>期间</dt><dd id="approve-period"></dd>
<dt>类型</dt><dd id="approve-type"></dd>
<dt>审核依据</dt><dd id="approve-basis" style="font-family: var(--font-body);"></dd>
</dl>
</div>
<div class="modal-actions">
<button type="button" class="btn" data-close="modal-approve">取消</button>
<button type="button" class="btn btn-primary" id="approve-confirm">确认通过</button>
</div>
</div>
</div>
<!-- 审核驳回弹窗 -->
<div class="modal-backdrop" id="modal-reject">
<div class="modal">
<div class="modal-head">
<span class="modal-title">驳回事项</span>
<button type="button" class="modal-close" data-close="modal-reject">×</button>
</div>
<p class="modal-sub">驳回后系统将自动向该公司发送整改通知,请填写明确的驳回原因。</p>
<div class="field">
<label for="reject-reason">驳回原因</label>
<textarea class="textarea" id="reject-reason" placeholder="例如:补传的银行回单金额与流水不一致,请重新核对后再提交。"></textarea>
<span class="hint error" id="reject-hint" style="display: none;">请填写驳回原因(不少于 5 个字)</span>
</div>
<div class="modal-actions">
<button type="button" class="btn" data-close="modal-reject">取消</button>
<button type="button" class="btn btn-danger" id="reject-confirm">确认驳回</button>
</div>
</div>
</div>
<!-- 结账确认弹窗 -->
<div class="modal-backdrop" id="closingDialog">
<div class="modal">
<div class="modal-head">
<span class="modal-title">确认执行 2026-07 月度结账</span>
<button type="button" class="modal-close" data-close-closing aria-label="关闭">×</button>
</div>
<p class="modal-sub">结账后成员公司的 7 月流水与往来确认将锁定,不可再修改。</p>
<form id="closingForm" novalidate>
<div class="detail-box">
<dl class="kv">
<dt>结账账期</dt><dd>2026-07</dd>
<dt>检查通过</dt><dd>全部前置检查已通过</dd>
<dt>期末归集</dt><dd>往来净额将结转至 2026-08 期初</dd>
</dl>
</div>
<label class="row" style="gap: 6px; font-size: 13px; margin-top: 14px; cursor: pointer;">
<input type="checkbox" name="confirm" required style="width: auto;" />我已复核 2026 年 7 月结账结果
</label>
<div class="modal-actions">
<button type="button" class="btn" data-close-closing>再想想</button>
<button type="submit" class="btn btn-primary">确认结账</button>
</div>
</form>
</div>
</div>
<!-- 往来穿透弹窗 -->
<div class="modal-backdrop" id="traceModal">
<div class="modal wide">
<div class="modal-head">
<span class="modal-title">往来穿透 · 银行原始流水链路</span>
<button type="button" class="modal-close" id="traceClose" aria-label="关闭">×</button>
</div>
<p class="modal-sub" id="traceSub"></p>
<div class="detail-box">
<dl class="kv">
<dt>本方银行流水号</dt><dd id="kvOwnTx"></dd>
<dt>本方账户</dt><dd id="kvOwnAcct"></dd>
<dt>对方公司</dt><dd id="kvPeerCo"></dd>
<dt>对方账户</dt><dd id="kvPeerAcct"></dd>
<dt>交易时间</dt><dd id="kvTime"></dd>
<dt>金额</dt><dd id="kvAmt"></dd>
<dt>归集批次号</dt><dd id="kvBatch"></dd>
<dt>对方证据流水号</dt><dd id="kvEvidence"></dd>
</dl>
</div>
<div class="modal-actions">
<button type="button" class="btn" id="traceOk">关闭</button>
</div>
</div>
</div>
<!-- 流水穿透详情弹窗 -->
<div class="modal-backdrop" id="tx-modal">
<div class="modal wide">
<div class="modal-head">
<span class="modal-title">流水穿透详情</span>
<button type="button" class="modal-close" id="tx-modal-close" aria-label="关闭">×</button>
</div>
<p class="modal-sub" id="tx-modal-sub"></p>
<div class="detail-box">
<div class="card-title" style="margin-bottom: 10px;">原始流水</div>
<dl class="kv">
<dt>银行流水号</dt><dd id="d-serial"></dd>
<dt>银行</dt><dd id="d-bank"></dd>
<dt>账户</dt><dd id="d-account"></dd>
<dt>交易时间</dt><dd id="d-time"></dd>
<dt>对方户名</dt><dd id="d-peer"></dd>
<dt>对方账号</dt><dd id="d-peer-acct"></dd>
<dt>金额</dt><dd id="d-amount"></dd>
</dl>
</div>
<div class="detail-box" style="margin-top: 12px;">
<div class="card-title" style="margin-bottom: 10px;">归集链路</div>
<dl class="kv">
<dt>归集状态</dt><dd id="d-status"></dd>
<dt>归集往来</dt><dd id="d-pair"></dd>
<dt>本方科目</dt><dd id="d-subject"></dd>
<dt>归集批次</dt><dd id="d-batch"></dd>
<dt>说明</dt><dd id="d-note" style="font-family: var(--font-body);"></dd>
</dl>
</div>
<div class="modal-actions">
<button type="button" class="btn" id="tx-modal-ok">关闭</button>
</div>
</div>
</div>
<!-- 提醒详情抽屉 -->
<aside class="drawer" id="reminder-detail-drawer" aria-label="提醒详情">
<div class="drawer-head">
<div>
<span class="pill pill-info" id="rd-source-pill">系统</span>
<h2 class="d-title" id="rd-title">提醒详情</h2>
<p class="d-desc" id="rd-sub"></p>
</div>
<button type="button" class="icon-button" data-close-rd aria-label="关闭详情" title="关闭详情">×</button>
</div>
<div class="drawer-body">
<dl class="kv" id="rd-fields"></dl>
<h3 style="font-size: 13px; margin: 16px 0 8px; color: var(--muted);">事件留痕</h3>
<div id="rd-events"></div>
</div>
<div class="drawer-foot">
<button type="button" class="btn" data-close-rd>关闭</button>
</div>
</aside>
<!-- 提醒历史弹窗 -->
<div class="modal-backdrop" id="history-modal">
<div class="modal">
<div class="modal-head">
<span class="modal-title" id="history-title">提醒历史</span>
<button type="button" class="modal-close" id="history-close" aria-label="关闭">×</button>
</div>
<p class="modal-sub" id="history-sub"></p>
<div id="history-list"></div>
<div class="modal-actions">
<button type="button" class="btn" id="history-ok">关闭</button>
</div>
</div>
</div>
<div class="toast-region" id="toastRegion" aria-live="polite"></div>
<script src="app.js?v=4"></script>
<script>
(function () {
var input = document.getElementById("company-search");
if (!input) return;
input.addEventListener("input", function () {
var q = this.value.trim();
var rows = document.querySelectorAll("#companyTotals tbody tr");
rows.forEach(function (tr) {
tr.style.display = (!q || tr.textContent.indexOf(q) > -1) ? "" : "none";
});
});
})();
</script>
</body>
</html>