Files
caiwuzongzhang/web/admin.html
T
e5e326514d HEL-269: 完成月结锁账、撤演示数据与代码收尾
锁账后写保护与闭期补录留痕;重开须审批并按版本链再结;列表/导出改走真实 API。

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: multica-agent <github@multica.ai>
2026-08-30 21:42:22 +08:00

1214 lines
66 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=10" />
</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" id="auditNavBadge" style="display: none;">0</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="period-audit" href="#period-audit"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7"><path d="M12 8v5l3 1.5"/><circle cx="12" cy="12" r="8.5"/></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>
<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" data-view-link="audit" style="cursor: pointer;">
<div class="stat-label">待审核事项 · 审核中心</div>
<div class="stat-value" id="dashAuditTotal">0<span class="unit"></span></div>
<div class="stat-foot" id="dashAuditFoot">高 0 项 · 中 0 项 · 其余 0 项低风险</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="card dash-master" id="companyMasterDetail">
<div class="card-head dash-master-head">
<span class="card-title" style="min-width: 0;">
公司往来合计 · 往来明细
<span class="sub" id="dashListSub">单位:万元 · 左侧选择公司,右侧查看其往来明细</span>
</span>
<div class="dash-master-head-actions">
<span class="meta" id="dashMasterMeta"></span>
<input class="input" id="company-search" aria-label="搜索公司" placeholder="搜索公司…" />
</div>
</div>
<div class="grid grid-480-1 dash-master-split">
<div class="dash-master-pane dash-master-pane--list">
<div class="dash-company-list" id="dashCompanyRows" role="listbox" aria-label="公司往来合计">
<div class="dash-company-loading muted">加载中…</div>
</div>
</div>
<div class="dash-master-pane dash-master-pane--detail">
<div class="dash-detail-toolbar">
<div class="dash-detail-heading">
<span class="dash-detail-name" id="dashDetailTitle">请选择左侧公司</span>
<span class="meta" id="dashDetailSub">按对方公司分组 · 二级默认收起 · 已确认 / 待确认分列</span>
</div>
</div>
<div class="dash-detail-summary" id="dashDetailSummary" hidden>
<div class="dash-summary-item">
<span class="dash-summary-label">笔数</span>
<span class="dash-summary-value num" id="dashSumCount">0</span>
</div>
<div class="dash-summary-item">
<span class="dash-summary-label">期初</span>
<span class="dash-summary-value num" id="dashSumOpening"></span>
</div>
<div class="dash-summary-item">
<span class="dash-summary-label">本期借方</span>
<span class="dash-summary-value num" id="dashSumDebit">0.00</span>
</div>
<div class="dash-summary-item">
<span class="dash-summary-label">本期贷方</span>
<span class="dash-summary-value num" id="dashSumCredit">0.00</span>
</div>
<div class="dash-summary-item">
<span class="dash-summary-label">期末</span>
<span class="dash-summary-value num" id="dashSumEnding">0.00</span>
</div>
</div>
<div class="dash-detail-body" id="dashDetailBody">
<div class="table-wrap dash-master-scroll" id="dashDetailWrap">
<table class="ds-table ds-table--compact" id="dashDetailTable">
<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 class="num-col">期末</th>
</tr>
</thead>
<tbody id="dashDetailRows">
<tr><td colspan="6" class="muted">请选择左侧公司</td></tr>
</tbody>
</table>
</div>
<div class="dash-detail-empty" id="dashDetailEmpty" hidden>
<div class="e-title">该公司期间内暂无已归集往来</div>
<div class="e-desc" id="dashDetailEmptyDesc">期初 — · 导入流水并归集后在此展示</div>
</div>
</div>
</div>
</div>
</div>
<div class="grid grid-2" style="margin-top: 14px;">
<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 class="card">
<div class="card-head">
<span class="card-title">账期与结账<span class="sub" id="dashboardPeriodSub">每月 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>
</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>
<button data-audit-filter="reopen" data-label="重开审批" aria-pressed="false">重开审批<span class="tab-count" id="reopenTabCount">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;" id="auditTableWrap">
<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">
</tbody>
</table>
<div class="table-foot">
<span id="auditFoot">共 0 项 · 待审核 0 项</span>
<span>审核人:系统管理员 · 操作实时写入审核日志</span>
</div>
</div>
<div id="reopenQueue" hidden style="margin-top: 14px;">
<div class="card">
<div class="card-head">
<span class="card-title">重开审批<span class="sub">待审批申请需管理员确认后才解除锁定</span></span>
</div>
<div id="reopenQueueList"></div>
<div class="empty" id="reopenQueueEmpty">
<svg class="empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4"><circle cx="12" cy="12" r="8.5"/><path d="M12 8v5l3 1.5"/></svg>
<div class="e-title">暂无重开申请</div>
锁定账期的重开申请会显示在这里。
</div>
</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="empty" id="flowEmpty" hidden>
<svg class="empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="4" y="5" width="16" height="14" rx="2"/><path d="M4 10h16"/></svg>
<div class="e-title">暂无数据</div>
当前筛选条件下没有已确认工作表的银行流水。
</div>
<div class="table-foot">
<span id="flowCount">共 0 笔</span>
<span class="num" id="flowSum"></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" id="timelineSub">全局起算日 2026-01-01 起,每月 5 日结账</span></span>
</div>
<div class="timeline" id="periodTimeline">
<div class="tl-cell open"><div class="tl-month"></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" />
<span class="hint" id="cs-start-hint">期初余额以此日前一日的期末数为准</span>
<span class="pill pill-muted" id="cs-start-locked" style="display: none; margin-top: 8px;">已锁定</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">每月几号执行上月结账</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" id="openingSub">公司间往来期初数</span></span>
<button class="btn btn-sm" id="openOpeningDialog">新增</button>
</div>
<div class="notice info" id="openingSummary" style="margin: 0 0 14px; display: none;"></div>
<div class="table-wrap" style="border: 0;">
<table class="ds-table">
<thead>
<tr><th>本方公司</th><th>对方公司</th><th>方向</th><th class="num-col">金额</th><th>录入人</th><th>录入时间</th><th>状态</th><th></th></tr>
</thead>
<tbody id="openingRows"></tbody>
</table>
</div>
</div>
<div class="card">
<div class="card-head">
<span class="card-title">变更记录<span class="sub">起算日与期初余额改动留痕</span></span>
</div>
<div class="table-wrap" style="border: 0;">
<table class="ds-table">
<thead>
<tr><th>时间</th><th>操作人</th><th>对象</th><th>变更</th><th>原因</th></tr>
</thead>
<tbody id="calculationChangeRows"><tr><td colspan="5" class="empty">暂无变更记录</td></tr></tbody>
</table>
</div>
</div>
</div>
<div class="card" id="closingPanel">
<div class="card-head">
<span class="card-title">月度结账<span class="sub" id="closingDescription">加载账期状态…</span></span>
<span class="pill pill-muted" id="closingStatus"></span>
</div>
<div id="closingBody">
<div class="closing-check-list">
<div class="list-row" data-closing-key="submissions">
<span class="pill pill-muted" data-closing-check>流水提交</span>
<div class="lr-main"><div class="lr-title">流水提交</div><div class="lr-sub" data-closing-sub></div></div>
<div class="lr-side"><span class="pill pill-muted" data-closing-state></span></div>
</div>
<div class="list-row" data-closing-key="coverage">
<span class="pill pill-muted" data-closing-check>账户连续</span>
<div class="lr-main"><div class="lr-title">账户连续</div><div class="lr-sub" data-closing-sub></div></div>
<div class="lr-side"><span class="pill pill-muted" data-closing-state></span></div>
</div>
<div class="list-row" data-closing-key="reviews">
<span class="pill pill-muted" data-closing-check>审核完成</span>
<div class="lr-main"><div class="lr-title">审核完成</div><div class="lr-sub" data-closing-sub></div></div>
<div class="lr-side"><span class="pill pill-muted" data-closing-state></span></div>
</div>
<div class="list-row" data-closing-key="opening">
<span class="pill pill-muted" data-closing-check>期初锁定</span>
<div class="lr-main"><div class="lr-title">期初锁定</div><div class="lr-sub" data-closing-sub></div></div>
<div class="lr-side"><span class="pill pill-muted" data-closing-state></span></div>
</div>
</div>
<div class="grid grid-4" id="closingSummary" style="margin-top: 16px;">
<div><div class="meta">账期</div><div class="num" id="ckMonth"></div></div>
<div><div class="meta">期末归集</div><div class="num" id="ckNet"></div></div>
<div><div class="meta">结转去向</div><div class="num" id="ckCarry"></div></div>
<div><div class="meta">月报编号</div><div class="num" id="ckReport">尚未生成</div></div>
</div>
<div class="notice danger" id="block-notice" style="margin-top: 16px; display: none;">
<div>
<div class="n-title" id="block-notice-title">存在阻断项,暂不能执行月度结账</div>
<div class="n-body" id="block-notice-body">请先处理待审核事项与账户断档。</div>
</div>
</div>
<div class="notice danger" id="failed-notice" style="margin-top: 16px; display: none;">
<div>
<div class="n-title">结账失败</div>
<div class="n-body" id="failed-notice-body">未改动任何数据,可重新执行结账。</div>
</div>
</div>
<div class="notice info" id="closed-notice" style="margin-top: 16px; display: none;">
<div>
<div class="n-title" id="closed-notice-title">账期已锁定</div>
<div class="n-body" id="closed-notice-body">结账后各公司往来数据已锁定,期初数将结转至下一账期。</div>
</div>
</div>
<div class="notice warn" id="reopened-notice" style="margin-top: 16px; display: none;">
<div>
<div class="n-title">账期已重开</div>
<div class="n-body" id="reopened-notice-body">窗口内可更正并留痕,到期自动恢复锁定。</div>
</div>
</div>
</div>
<div class="row" style="margin-top: 16px; justify-content: flex-end; flex-wrap: wrap; gap: 8px;">
<span class="meta" id="closingHistory" style="margin-right: auto;"></span>
<span class="loading-inline" id="closingBusy" hidden>正在锁定账期并生成月报…请勿关闭页面</span>
<button class="btn" id="downloadMonthReport" hidden>下载月报</button>
<button class="btn" id="runClosingCheck">重新检查</button>
<button class="btn btn-primary" id="executeClosing" disabled title="请先处理全部阻断事项">执行月度结账</button>
</div>
</div>
</div>
</section>
<section class="app-view" data-page="period-audit">
<div class="page-head">
<div>
<h1>审计记录</h1>
<p class="page-sub">谁、什么时间、改了什么、为什么。记录只增不改,可倒查至银行原始流水。</p>
</div>
</div>
<div class="filters">
<div class="field">
<label for="paSince">起始日期</label>
<input class="input" id="paSince" type="date" />
</div>
<div class="field">
<label for="paUntil">结束日期</label>
<input class="input" id="paUntil" type="date" />
</div>
<div class="field">
<label for="paAction">动作类型</label>
<select class="select" id="paAction">
<option value="">全部动作</option>
<option value="close_execute">月结</option>
<option value="reopen_request">重开申请</option>
<option value="reopen_approve">重开审批通过</option>
<option value="reopen_reject">重开驳回</option>
<option value="reopen_expire">重开到期恢复</option>
<option value="close_fail">月结失败</option>
</select>
</div>
<div class="field">
<label for="paCompany">涉及公司</label>
<input class="input" id="paCompany" type="text" placeholder="公司名 / 月报号" />
</div>
<button class="btn" id="paApply" type="button">查询</button>
<button class="btn btn-ghost" id="paReset" type="button">清除筛选条件</button>
</div>
<div class="notice danger" id="paError" style="display: none; margin-bottom: 14px;">
<div>
<div class="n-title">审计记录加载失败</div>
<div class="n-body">已加载的数据未被改动 · 请稍后重试</div>
</div>
<button class="btn btn-primary btn-sm" type="button" id="paReload">重新加载</button>
</div>
<div class="table-wrap">
<table class="ds-table">
<thead>
<tr>
<th>时间</th>
<th>操作人</th>
<th>动作</th>
<th class="wrap">对象与原因</th>
<th>前后变化</th>
<th>凭证</th>
</tr>
</thead>
<tbody id="periodAuditRows"></tbody>
</table>
<div class="table-foot">
<span id="periodAuditFoot">共 0 条</span>
<span>审计记录只增不改 · 永久保留</span>
</div>
</div>
<div class="audit-event-cards" id="periodAuditCards"></div>
<div class="empty" id="periodAuditEmpty" hidden>
<svg class="empty-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4"><circle cx="12" cy="12" r="8.5"/><path d="M12 8v5l3 1.5"/></svg>
<div class="e-title">没有符合条件的审计记录</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="stack">
<div class="card" id="pending-reminders-card">
<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="card" id="reminder-history-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 history-table">
<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 class="card" id="send-reminder-card">
<div class="card-head">
<span class="card-title">发送处理提醒<span class="sub">将以人工提醒形式送达所选公司出纳与财务负责人</span></span>
</div>
<form id="reminderForm" novalidate>
<div class="send-flow">
<div class="sf-step">
<div class="sf-step-head">
<span class="sf-idx">01</span>
<span>选择接收公司</span>
<span class="meta" id="pick-count">已选 0 家</span>
</div>
<div class="pick-list" id="reminderCompanyList"></div>
<span class="hint error" id="company-error" style="display: none;">请至少选择一家接收公司</span>
<p class="hint">每家公司将分别生成一条提醒,可在上方「待提醒清单」勾选后自动带入。</p>
</div>
<div class="sf-step">
<div class="sf-step-head">
<span class="sf-idx">02</span>
<span>填写提醒内容</span>
</div>
<div class="field">
<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">
<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>
<div class="sf-step">
<div class="sf-step-head">
<span class="sf-idx">03</span>
<span>设定截止并发送</span>
</div>
<div class="field">
<label for="reminder-deadline">截止日期</label>
<input class="input" type="date" id="reminder-deadline" value="2026-08-29" min="2026-08-20" />
</div>
<div class="sf-send">
<button type="submit" class="btn btn-primary" id="send-btn">发送提醒</button>
<p class="hint" id="send-result-hint">发送后可在上方「提醒历史」中跟踪触达与处理状态。</p>
<p class="hint" id="send-hint" style="display: none;"></p>
</div>
</div>
</div>
</form>
</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-amount">金额</label>
<input class="input num-input" name="amount" id="ob-amount" type="number" step="0.01" required />
</div>
<div class="field">
<label for="ob-reason">录入原因</label>
<input class="input" name="reason" id="ob-reason" required placeholder="必填,将写入变更记录" />
</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="reasonDialog">
<div class="modal">
<div class="modal-head">
<span class="modal-title" id="reasonDialogTitle">填写原因</span>
<button type="button" class="modal-close" data-close-reason aria-label="关闭">×</button>
</div>
<p class="modal-sub" id="reasonDialogSub">该操作必须填写原因并留痕。</p>
<form id="reasonForm" novalidate>
<div class="field">
<label for="reasonInput">原因</label>
<textarea class="input" id="reasonInput" name="reason" rows="3" required placeholder="至少 2 个字"></textarea>
</div>
<div class="modal-actions">
<button type="button" class="btn" data-close-reason>取消</button>
<button type="submit" class="btn btn-primary" id="reasonSubmit">确认</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" id="closingDialogTitle">确认执行月度结账</span>
<button type="button" class="modal-close" data-close-closing aria-label="关闭">×</button>
</div>
<p class="modal-sub" id="closingDialogSub">结账后该月流水与往来确认将锁定,不可再直接修改。</p>
<form id="closingForm" novalidate>
<div class="notice warn" style="margin-bottom: 14px;">
<div>
<div class="n-title">请确认后果</div>
<div class="n-body" id="closingConsequences">① 该账期往来结果锁定,普通写入将被拒绝。<br />② 生成不可静默改写的月报并结转期末。<br />③ 确需更正须申请重开,经审批后留痕修改。</div>
</div>
</div>
<div class="detail-box">
<dl class="kv">
<dt>结账账期</dt><dd id="cdMonth"></dd>
<dt>检查通过</dt><dd id="cdChecks"></dd>
<dt>期末归集</dt><dd id="cdCarry">往来净额将结转至下一账期期初</dd>
</dl>
</div>
<label class="row" style="gap: 6px; font-size: 13px; margin-top: 14px; cursor: pointer;">
<input type="checkbox" name="confirm" id="closingConfirmBox" required style="width: auto;" />我已复核结账结果并知晓锁定后果
</label>
<div class="modal-actions">
<button type="button" class="btn" data-close-closing>再想想</button>
<button type="submit" class="btn btn-primary" id="closingConfirmBtn">确认结账并锁定</button>
</div>
</form>
</div>
</div>
<div class="modal-backdrop" id="reopenRequestDialog">
<div class="modal">
<div class="modal-head">
<span class="modal-title" id="reopenRequestTitle">申请重开账期</span>
<button type="button" class="modal-close" data-close-reopen-req aria-label="关闭">×</button>
</div>
<p class="modal-sub">重开解除锁定但保留原月报;更正后须重新结账。</p>
<form id="reopenRequestForm" novalidate>
<div class="notice warn" style="margin-bottom: 14px;">
<div>
<div class="n-title">请确认后果</div>
<div class="n-body">① 批准后该账期暂时解除锁定,所有更正留痕。<br />② 原月报作废,窗口结束后或提前结束须重新结账。<br />③ 申请人、原因、时间与前后变化可倒查。</div>
</div>
</div>
<div class="field">
<label for="reopenReason">重开原因 *</label>
<textarea class="textarea" id="reopenReason" minlength="10" required placeholder="不少于 10 个字,将写入审计记录"></textarea>
<span class="hint">原因会进入审计记录,不可事后删改。</span>
</div>
<div class="field" style="margin-top: 12px;">
<label for="reopenCompanies">涉及公司与事项</label>
<input class="input" id="reopenCompanies" placeholder="例如:金牛煤业 ↔ 金牛物流 运输费补录" />
</div>
<div class="field" style="margin-top: 12px;">
<label for="reopenDays">申请窗口(天)</label>
<input class="input num-input" id="reopenDays" type="number" min="1" max="30" value="3" />
<span class="hint">到期自动恢复锁定;默认 3 天。</span>
</div>
<div class="modal-actions">
<button type="button" class="btn" data-close-reopen-req>取消</button>
<button type="submit" class="btn btn-warn">提交重开申请</button>
</div>
</form>
</div>
</div>
<div class="modal-backdrop" id="reopenDecideDialog">
<div class="modal wide">
<div class="modal-head">
<span class="modal-title" id="reopenDecideTitle">重开审批</span>
<button type="button" class="modal-close" data-close-reopen-dec aria-label="关闭">×</button>
</div>
<p class="modal-sub" id="reopenDecideSub"></p>
<div class="detail-box">
<dl class="kv" id="reopenDecideKv"></dl>
</div>
<div class="diff-grid" id="reopenDiff" style="margin-top: 16px;"></div>
<div class="notice info" style="margin-top: 14px;">
<div>
<div class="n-title">凭证与入账方式</div>
<div class="n-body">批准后按审批窗口解除锁定;银行原始流水永不改写,更正通过新决定与留痕完成。</div>
</div>
</div>
<div class="field" style="margin-top: 14px;">
<label for="reopenComment">审批意见(驳回必填)</label>
<textarea class="textarea" id="reopenComment" placeholder="通过可写备注;驳回须说明原因"></textarea>
</div>
<div class="modal-actions">
<button type="button" class="btn btn-danger" id="reopenRejectBtn">驳回申请</button>
<button type="button" class="btn btn-warn" id="reopenApproveBtn">同意重开</button>
</div>
</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=15"></script>
</body>
</html>