HEL-144 返工A:四件事(改名/登录端标识/结账设置真保存/提醒回改)+ 迁移升为 7 + 移除废弃 B-44 前端样式测试
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
+25
-37
@@ -3,18 +3,18 @@
|
||||
<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" />
|
||||
<meta name="description" content="金牛集团管理端" />
|
||||
<title>管理端 · 金牛集团</title>
|
||||
<link rel="stylesheet" href="design-system.css?v=5" />
|
||||
</head>
|
||||
<body data-portal="admin">
|
||||
<a class="skip-link" href="#main-content">跳到主要内容</a>
|
||||
<div class="shell">
|
||||
<aside class="sidebar" id="sidebar" aria-label="总账管理导航">
|
||||
<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>
|
||||
<span class="side-role">管理端</span>
|
||||
</div>
|
||||
<nav class="side-nav">
|
||||
<div class="nav-group">日常</div>
|
||||
@@ -32,7 +32,7 @@
|
||||
<span class="avatar">管</span>
|
||||
<div>
|
||||
<div class="user-name">系统管理员</div>
|
||||
<div class="user-meta">集团总账会计</div>
|
||||
<div class="user-meta">管理员</div>
|
||||
</div>
|
||||
<button class="logout" type="button">退出</button>
|
||||
</div>
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<div class="main">
|
||||
<div class="topbar">
|
||||
<span class="crumb">总账管理端 / <b id="currentViewName">管理总览</b></span>
|
||||
<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>
|
||||
@@ -245,7 +245,7 @@
|
||||
|
||||
<div class="card">
|
||||
<div class="card-head">
|
||||
<span class="card-title">账期与结账<span class="sub">每月 5 日结账 · 全局起算日 2026-01-01</span></span>
|
||||
<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>
|
||||
@@ -524,7 +524,7 @@
|
||||
</table>
|
||||
<div class="table-foot">
|
||||
<span id="flowCount">共 0 笔</span>
|
||||
<span class="meta">数据范围:2026-01-01 起算 · 每月 5 日结账(7 月顺延至 08-29)</span>
|
||||
<span class="meta" id="flowsRangeMeta">数据范围:2026-01-01 起算 · 每月 5 日结账(7 月顺延至 08-29)</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -570,7 +570,7 @@
|
||||
</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>
|
||||
<span class="meta">登录账号初始密码由管理员统一发放</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -585,7 +585,7 @@
|
||||
|
||||
<div class="card">
|
||||
<div class="card-head">
|
||||
<span class="card-title">账期时间轴<span class="sub">全局起算日 2026-01-01 起,每月 5 日结账</span></span>
|
||||
<span class="card-title">账期时间轴<span class="sub" id="timelineSub">全局起算日 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>
|
||||
@@ -643,7 +643,7 @@
|
||||
|
||||
<div class="card">
|
||||
<div class="card-head">
|
||||
<span class="card-title">期初余额管理<span class="sub">2026-01-01 起算的公司间往来期初数</span></span>
|
||||
<span class="card-title">期初余额管理<span class="sub" id="openingSub">2026-01-01 起算的公司间往来期初数</span></span>
|
||||
<button class="btn btn-sm" id="openOpeningDialog">新增</button>
|
||||
</div>
|
||||
<div class="table-wrap" style="border: 0;">
|
||||
@@ -718,34 +718,22 @@
|
||||
<div class="grid grid-1-2">
|
||||
<div class="card">
|
||||
<div class="card-head">
|
||||
<span class="card-title">发送处理提醒<span class="sub">将以人工提醒形式送达所选公司出纳与财务负责人</span></span>
|
||||
<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>
|
||||
<label for="reminder-company">接收公司</label>
|
||||
<select class="select" id="reminder-company"><option value="">请选择公司</option></select>
|
||||
<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 class="field" style="margin-bottom: 16px;">
|
||||
<label>待提醒事项(系统自动列出)</label>
|
||||
<div id="reminder-items">
|
||||
<div class="empty">请先选择公司,系统将自动列出该公司待提醒事项。</div>
|
||||
</div>
|
||||
<span class="hint error" id="reminder-error" style="display: none;">该公司当前没有待提醒事项</span>
|
||||
</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>
|
||||
<button type="submit" class="btn btn-primary" id="send-btn" style="width: 100%;" disabled>发送提醒</button>
|
||||
<p class="hint" id="send-hint" style="margin-top: 10px; display: none;"></p>
|
||||
</form>
|
||||
</div>
|
||||
@@ -793,7 +781,7 @@
|
||||
<span class="modal-title">新增成员公司</span>
|
||||
<button type="button" class="modal-close" data-close="companyDialog" aria-label="关闭">×</button>
|
||||
</div>
|
||||
<p class="modal-sub">登记后系统将生成公司端登录账号,初始密码由集团总账统一发放。</p>
|
||||
<p class="modal-sub">登记后系统将生成公司端登录账号,初始密码由管理员统一发放。</p>
|
||||
<form id="companyForm" novalidate>
|
||||
<div class="field" style="margin-bottom: 12px;">
|
||||
<label for="f-name">公司全称</label>
|
||||
@@ -1050,7 +1038,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="toast-region" id="toastRegion" aria-live="polite"></div>
|
||||
<script src="app.js?v=4"></script>
|
||||
<script src="app.js?v=5"></script>
|
||||
<script>
|
||||
(function () {
|
||||
var input = document.getElementById("company-search");
|
||||
|
||||
+211
-108
@@ -316,7 +316,7 @@ function initEntry() {
|
||||
|
||||
function updateRole() {
|
||||
const role = $('input[name="role"]:checked', form).value;
|
||||
action.textContent = role === "admin" ? "进入总账管理端" : "进入公司业务端";
|
||||
action.textContent = role === "admin" ? "进入管理端" : "进入公司业务端";
|
||||
}
|
||||
|
||||
roleInputs.forEach((input) => input.addEventListener("change", updateRole));
|
||||
@@ -408,7 +408,7 @@ function applyCompanyIdentity(me) {
|
||||
const nameEl = $(".user-name", row);
|
||||
if (nameEl) nameEl.textContent = name;
|
||||
const metaEl = $(".user-meta", row);
|
||||
if (metaEl) metaEl.textContent = portal === "company" ? (me.company_name || "公司业务端") : "集团总账会计";
|
||||
if (metaEl) metaEl.textContent = portal === "company" ? (me.company_name || "公司业务端") : "管理员";
|
||||
}
|
||||
// The company portal always shows the session-bound company in page copy.
|
||||
if (portal === "company" && me.company_name) {
|
||||
@@ -692,7 +692,7 @@ function renderCompanyManualRecords() {
|
||||
statusCell.innerHTML = `<span class="pill ${statusMeta.cls}">${statusMeta.label}</span>`;
|
||||
|
||||
const action = document.createElement("td");
|
||||
if (record.status === "待总账复核") {
|
||||
if (record.status === "待管理复核") {
|
||||
action.innerHTML = '<button type="button" class="btn btn-sm btn-danger" data-action="withdraw">撤回</button>';
|
||||
} else {
|
||||
action.innerHTML = '<span class="muted">—</span>';
|
||||
@@ -706,7 +706,7 @@ function renderCompanyManualRecords() {
|
||||
|
||||
function updateManualCounts() {
|
||||
const records = readStoredRecords(storageKeys.manual).filter((record) => record.company === "A公司");
|
||||
const pending = records.filter((record) => record.status === "待总账复核").length;
|
||||
const pending = records.filter((record) => record.status === "待管理复核").length;
|
||||
const pendingEl = $("#manualPendingStatus");
|
||||
if (pendingEl) pendingEl.textContent = pending;
|
||||
const foot = $("#manualFoot");
|
||||
@@ -808,7 +808,7 @@ function appendAdminReviewRow(record, kind) {
|
||||
row.dataset.evidence = isAccount
|
||||
? "公司提交资料、开户行、账号、账户类型与启用日期"
|
||||
: "公司手工记录、关联银行流水号、证明附件与提交说明";
|
||||
if (statusLabel !== "待复核" && statusLabel !== "待总账复核") row.dataset.resolved = "true";
|
||||
if (statusLabel !== "待复核" && statusLabel !== "待管理复核") row.dataset.resolved = "true";
|
||||
if (isAccount) row.dataset.accountStatus = record.status;
|
||||
|
||||
const riskCell = document.createElement("td");
|
||||
@@ -975,20 +975,11 @@ function fillCompanySelects(names) {
|
||||
});
|
||||
setSelectOptions($("#auditCompany"), names, { keepFirst: true });
|
||||
setSelectOptions($("#flowCompany"), names, { keepFirst: true });
|
||||
const reminderList = $("#reminderCompanyList");
|
||||
if (reminderList) {
|
||||
reminderList.replaceChildren(...names.map((name) => {
|
||||
const label = document.createElement("label");
|
||||
label.className = "row";
|
||||
label.style.cssText = "gap:6px;font-size:13px;";
|
||||
const input = document.createElement("input");
|
||||
input.type = "checkbox";
|
||||
input.name = "company";
|
||||
input.value = name;
|
||||
input.style.width = "auto";
|
||||
label.append(input, document.createTextNode(name));
|
||||
return label;
|
||||
}));
|
||||
const reminderSelect = $("#reminder-company");
|
||||
if (reminderSelect) {
|
||||
const kept = reminderSelect.querySelector('option[value=""]') ? [reminderSelect.options[0].cloneNode(true)] : [];
|
||||
const companies = state.companies || [];
|
||||
reminderSelect.replaceChildren(...kept, ...companies.map((company) => new Option(company.name, company.id)));
|
||||
}
|
||||
setSelectOptions($('#openingDialog [name="from"]'), names);
|
||||
setSelectOptions($('#openingDialog [name="to"]'), names);
|
||||
@@ -1227,16 +1218,74 @@ function initAdmin() {
|
||||
remind?.addEventListener("change", renderSwitch);
|
||||
renderSwitch();
|
||||
|
||||
$("#systemSettings")?.addEventListener("submit", (event) => {
|
||||
function applySystemSettings(values) {
|
||||
if (!values) return;
|
||||
const start = $("#cs-start");
|
||||
if (start && values.start_date) start.value = values.start_date;
|
||||
const dayInput = $("#cs-day");
|
||||
if (dayInput && values.closing_day) dayInput.value = values.closing_day;
|
||||
const remindInput = $("#cs-remind");
|
||||
if (remindInput && "auto_remind" in values) {
|
||||
remindInput.checked = values.auto_remind === "1";
|
||||
renderSwitch();
|
||||
}
|
||||
const daysSelect = $("#cs-remind-days");
|
||||
if (daysSelect && values.remind_days) daysSelect.value = values.remind_days;
|
||||
const closingDay = values.closing_day || "5";
|
||||
const startDate = values.start_date || "2026-01-01";
|
||||
const dash = $("#dashboardPeriodSub");
|
||||
if (dash) dash.textContent = `每月 ${closingDay} 日结账 · 全局起算日 ${startDate}`;
|
||||
const timeline = $("#timelineSub");
|
||||
if (timeline) timeline.textContent = `全局起算日 ${startDate} 起,每月 ${closingDay} 日结账`;
|
||||
const flows = $("#flowsRangeMeta");
|
||||
if (flows) flows.textContent = `数据范围:${startDate} 起算 · 每月 ${closingDay} 日结账(7 月顺延至 08-29)`;
|
||||
const opening = $("#openingSub");
|
||||
if (opening) opening.textContent = `${startDate} 起算的公司间往来期初数`;
|
||||
}
|
||||
|
||||
async function loadSystemSettings() {
|
||||
const response = await fetch("/api/admin/settings").catch(() => null);
|
||||
if (response?.status === 401) {
|
||||
window.location.href = "index.html";
|
||||
return;
|
||||
}
|
||||
const result = await response?.json().catch(() => ({}));
|
||||
if (response?.ok && result.settings) applySystemSettings(result.settings);
|
||||
}
|
||||
|
||||
$("#systemSettings")?.addEventListener("submit", async (event) => {
|
||||
event.preventDefault();
|
||||
const day = parseInt($("#cs-day")?.value, 10);
|
||||
const tip = $("#cs-save-tip");
|
||||
if (day && (day < 1 || day > 28)) {
|
||||
const day = parseInt($("#cs-day")?.value, 10);
|
||||
if (!day || day < 1 || day > 28) {
|
||||
if (tip) { tip.style.display = ""; tip.style.color = "var(--danger)"; tip.textContent = "结账日须为 1-28 之间的整数"; }
|
||||
return;
|
||||
}
|
||||
const payload = {
|
||||
closing_day: String(day),
|
||||
start_date: $("#cs-start")?.value || "",
|
||||
auto_remind: $("#cs-remind")?.checked ? "1" : "0",
|
||||
remind_days: $("#cs-remind-days")?.value || "3",
|
||||
};
|
||||
const response = await fetch("/api/admin/settings", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(payload),
|
||||
}).catch(() => null);
|
||||
if (response?.status === 401) {
|
||||
window.location.href = "index.html";
|
||||
return;
|
||||
}
|
||||
const result = await response?.json().catch(() => ({}));
|
||||
if (!response || !response.ok) {
|
||||
const message = result?.message || "保存失败,请稍后重试";
|
||||
if (tip) { tip.style.display = ""; tip.style.color = "var(--danger)"; tip.textContent = message; }
|
||||
showToast("设置保存失败", message, "danger");
|
||||
return;
|
||||
}
|
||||
if (tip) { tip.style.display = ""; tip.style.color = "var(--success)"; tip.textContent = "已保存 · 立即生效"; }
|
||||
showToast("系统计算口径已保存", "正式系统将记录修改前后值与操作人", "success");
|
||||
applySystemSettings(result.settings || {});
|
||||
showToast("系统计算口径已保存", "修改前后值与操作人已留痕", "success");
|
||||
});
|
||||
|
||||
$("#runClosingCheck")?.addEventListener("click", () => {
|
||||
@@ -1309,111 +1358,164 @@ function initAdmin() {
|
||||
showToast("期初余额已提交复核", "正式系统将保留录入依据与操作人", "success");
|
||||
});
|
||||
|
||||
$("#reminderForm")?.addEventListener("submit", (event) => {
|
||||
event.preventDefault();
|
||||
const form = event.currentTarget;
|
||||
const checked = Array.prototype.slice.call(form.querySelectorAll('input[name="company"]:checked'));
|
||||
const type = $("#reminder-type").value;
|
||||
const content = $("#reminder-content").value.trim();
|
||||
const deadline = $("#reminder-deadline").value;
|
||||
$("#company-error").style.display = checked.length ? "none" : "";
|
||||
$("#content-error").style.display = content ? "none" : "";
|
||||
if (!checked.length || !content) return;
|
||||
const companies = checked.map((c) => c.value).join("、");
|
||||
const summary = content.length > 46 ? content.slice(0, 46) + "…" : content;
|
||||
const row = document.createElement("tr");
|
||||
row.dataset.source = "manual";
|
||||
row.innerHTML =
|
||||
'<td class="cell-main">' + companies + '</td>' +
|
||||
'<td><span class="tag">' + type + '</span></td>' +
|
||||
'<td class="wrap">' + summary.replace(/</g, "<") + '</td>' +
|
||||
'<td class="meta">刚刚<span class="cell-sub">人工 · 系统管理员</span></td>' +
|
||||
'<td class="meta">' + (deadline || "—") + '</td>' +
|
||||
'<td><span class="pill pill-danger">未读</span></td>' +
|
||||
'<td><div class="row" style="gap:6px;"><button type="button" class="btn btn-sm act-remind">再提醒</button><button type="button" class="btn btn-sm btn-ghost act-history" data-company="' + checked[0].value + '">查看历史</button></div></td>';
|
||||
$("#reminder-tbody").insertBefore(row, $("#reminder-tbody").firstChild);
|
||||
refreshReminderCounts();
|
||||
form.querySelectorAll('input[name="company"]').forEach((c) => { c.checked = false; });
|
||||
$("#reminder-content").value = "请于截止日期前完成 2026 年 7 月银行流水上传与待确认事项处理。";
|
||||
$("#reminder-deadline").value = "2026-08-29";
|
||||
const sendHint = $("#send-hint");
|
||||
sendHint.style.display = "";
|
||||
sendHint.textContent = "已发送给 " + companies + ",共 " + checked.length + " 家公司。";
|
||||
clearTimeout(sendHint._t);
|
||||
sendHint._t = setTimeout(() => { sendHint.style.display = "none"; }, 4000);
|
||||
// ── 提醒管理:选公司 → 自动列出待提醒事项 → 一键发送 ──
|
||||
const reminderSelect = $("#reminder-company");
|
||||
const reminderItems = $("#reminder-items");
|
||||
const reminderError = $("#reminder-error");
|
||||
const companyError = $("#company-error");
|
||||
const sendBtn = $("#send-btn");
|
||||
const esc = (text) => String(text ?? "").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
||||
const fmtReminderTime = (iso) => String(iso || "").replace("T", " ").slice(5, 16);
|
||||
let pendingReminderItems = [];
|
||||
|
||||
function renderPendingItems(items) {
|
||||
pendingReminderItems = items || [];
|
||||
if (!reminderItems) return;
|
||||
if (!pendingReminderItems.length) {
|
||||
reminderItems.innerHTML = '<div class="empty">该公司当前没有待提醒事项。</div>';
|
||||
if (sendBtn) sendBtn.disabled = true;
|
||||
return;
|
||||
}
|
||||
reminderItems.replaceChildren(...pendingReminderItems.map((item) => {
|
||||
const row = document.createElement("div");
|
||||
row.className = "list-row";
|
||||
row.innerHTML =
|
||||
'<span class="pill pill-warn" style="flex:none;">待处理</span>' +
|
||||
'<div class="lr-main"><div class="lr-title">' + esc(item.kind) + '</div>' +
|
||||
'<div class="lr-sub">' + esc(item.content) + '</div></div>';
|
||||
return row;
|
||||
}));
|
||||
if (sendBtn) sendBtn.disabled = false;
|
||||
}
|
||||
|
||||
async function loadPendingReminders(companyId) {
|
||||
if (!companyId) { renderPendingItems([]); return; }
|
||||
if (reminderItems) reminderItems.innerHTML = '<div class="loading-row">正在列出待提醒事项…</div>';
|
||||
if (sendBtn) sendBtn.disabled = true;
|
||||
const response = await fetch("/api/admin/reminders/pending?company_id=" + encodeURIComponent(companyId)).catch(() => null);
|
||||
if (response?.status === 401) { window.location.href = "index.html"; return; }
|
||||
const result = await response?.json().catch(() => ({}));
|
||||
if (!response || !response.ok) { renderPendingItems([]); return; }
|
||||
renderPendingItems(result.items || []);
|
||||
}
|
||||
|
||||
reminderSelect?.addEventListener("change", () => {
|
||||
if (reminderError) reminderError.style.display = "none";
|
||||
loadPendingReminders(reminderSelect.value);
|
||||
});
|
||||
|
||||
// 提醒历史 tabs / 计数
|
||||
$("#reminderForm")?.addEventListener("submit", async (event) => {
|
||||
event.preventDefault();
|
||||
const companyId = reminderSelect?.value;
|
||||
if (companyError) companyError.style.display = companyId ? "none" : "";
|
||||
if (!companyId) return;
|
||||
if (!pendingReminderItems.length) {
|
||||
if (reminderError) reminderError.style.display = "";
|
||||
return;
|
||||
}
|
||||
if (reminderError) reminderError.style.display = "none";
|
||||
if (sendBtn) sendBtn.disabled = true;
|
||||
const response = await fetch("/api/admin/reminders/send", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ company_id: Number(companyId) }),
|
||||
}).catch(() => null);
|
||||
if (response?.status === 401) { window.location.href = "index.html"; return; }
|
||||
const result = await response?.json().catch(() => ({}));
|
||||
if (!response || !response.ok) {
|
||||
if (sendBtn) sendBtn.disabled = false;
|
||||
showToast("发送失败", result?.message || "请稍后重试", "danger");
|
||||
return;
|
||||
}
|
||||
const sendHint = $("#send-hint");
|
||||
if (sendHint) {
|
||||
sendHint.style.display = "";
|
||||
sendHint.textContent = `已向 ${result.company_name} 发送 ${(result.reminders || []).length} 项提醒,截止 ${result.deadline || "—"}。`;
|
||||
clearTimeout(sendHint._t);
|
||||
sendHint._t = setTimeout(() => { sendHint.style.display = "none"; }, 4000);
|
||||
}
|
||||
await loadReminderHistory();
|
||||
await loadPendingReminders(companyId);
|
||||
showToast("提醒已发送", `已生成 ${(result.reminders || []).length} 条提醒记录`, "success");
|
||||
});
|
||||
|
||||
// ── 提醒历史(实时从后端读取) ──
|
||||
let reminderFilter = "all";
|
||||
function refreshReminderCounts() {
|
||||
const rows = $$("#reminder-tbody tr");
|
||||
let all = rows.length, sys = 0, man = 0;
|
||||
rows.forEach((r) => { if (r.dataset.source === "system") sys++; else man++; });
|
||||
$("#count-all").textContent = all;
|
||||
$("#count-system").textContent = sys;
|
||||
$("#count-manual").textContent = man;
|
||||
$("#table-foot-count").textContent = "共 " + all + " 条提醒记录";
|
||||
const countAll = $("#count-all"), countSys = $("#count-system"), countMan = $("#count-manual");
|
||||
if (countAll) countAll.textContent = all;
|
||||
if (countSys) countSys.textContent = sys;
|
||||
if (countMan) countMan.textContent = man;
|
||||
const foot = $("#table-foot-count");
|
||||
if (foot) foot.textContent = "共 " + all + " 条提醒记录";
|
||||
const state = $("#table-foot-state");
|
||||
if (state) state.textContent = "未读 " + all + " · 处理中 0 · 已完成 0";
|
||||
}
|
||||
|
||||
function applyReminderFilter() {
|
||||
$$("#reminder-tbody tr").forEach((r) => {
|
||||
r.style.display = (reminderFilter === "all" || r.dataset.source === reminderFilter) ? "" : "none";
|
||||
});
|
||||
}
|
||||
|
||||
async function loadReminderHistory() {
|
||||
const tbody = $("#reminder-tbody");
|
||||
if (!tbody) return;
|
||||
const response = await fetch("/api/admin/reminders").catch(() => null);
|
||||
if (response?.status === 401) { window.location.href = "index.html"; return; }
|
||||
const result = await response?.json().catch(() => ({}));
|
||||
const reminders = result?.reminders || [];
|
||||
tbody.replaceChildren(...reminders.map((reminder) => {
|
||||
const row = document.createElement("tr");
|
||||
row.dataset.source = reminder.source;
|
||||
row.innerHTML =
|
||||
'<td class="cell-main">' + esc(reminder.company_name) + '</td>' +
|
||||
'<td><span class="tag">' + esc(reminder.kind) + '</span></td>' +
|
||||
'<td class="wrap">' + esc(reminder.content) + '</td>' +
|
||||
'<td class="meta">' + fmtReminderTime(reminder.created_at) + '<span class="cell-sub">' + (reminder.source === "manual" ? "人工" : "系统") + (reminder.actor_username ? " · " + esc(reminder.actor_username) : "") + '</span></td>' +
|
||||
'<td class="meta">' + (reminder.deadline || "—") + '</td>' +
|
||||
'<td><span class="pill pill-danger">未读</span></td>' +
|
||||
'<td><button type="button" class="btn btn-sm btn-ghost act-history" data-company-id="' + reminder.company_id + '" data-company="' + esc(reminder.company_name) + '">查看历史</button></td>';
|
||||
return row;
|
||||
}));
|
||||
applyReminderFilter();
|
||||
refreshReminderCounts();
|
||||
}
|
||||
|
||||
$("#reminder-tabs")?.addEventListener("click", (event) => {
|
||||
const btn = event.target.closest("button[data-filter]");
|
||||
if (!btn) return;
|
||||
$("#reminder-tabs").querySelectorAll("button").forEach((b) => b.classList.remove("active"));
|
||||
btn.classList.add("active");
|
||||
const filter = btn.dataset.filter;
|
||||
$$("#reminder-tbody tr").forEach((r) => { r.style.display = (filter === "all" || r.dataset.source === filter) ? "" : "none"; });
|
||||
reminderFilter = btn.dataset.filter;
|
||||
applyReminderFilter();
|
||||
});
|
||||
|
||||
$("#reminder-tbody")?.addEventListener("click", (event) => {
|
||||
const remindBtn = event.target.closest(".act-remind");
|
||||
if (remindBtn) {
|
||||
const tr = remindBtn.closest("tr");
|
||||
const timeCell = tr.children[3];
|
||||
const sub = timeCell.querySelector(".cell-sub");
|
||||
timeCell.firstChild.textContent = "刚刚";
|
||||
if (sub) sub.textContent = sub.textContent.replace(/\s*·?\s*第 \d+ 次/, "") + " · 再提醒";
|
||||
else timeCell.insertAdjacentHTML("beforeend", '<span class="cell-sub">再提醒</span>');
|
||||
remindBtn.textContent = "已再提醒";
|
||||
remindBtn.disabled = true;
|
||||
return;
|
||||
}
|
||||
const historyBtn = event.target.closest(".act-history");
|
||||
if (historyBtn) openReminderHistory(historyBtn.dataset.company);
|
||||
if (historyBtn) openReminderHistory(historyBtn.dataset.companyId, historyBtn.dataset.company);
|
||||
});
|
||||
|
||||
const reminderHISTORIES = {
|
||||
"金牛农业": [
|
||||
{ time: "2026-08-18 09:02", src: "系统 · 第 2 次", type: "流水未提交", status: "danger", statusText: "未读", body: "贵公司 7 月全部银行账户流水尚未提交,距 7 月结账顺延截止日仅剩 11 天,请尽快上传。" },
|
||||
{ time: "2026-08-11 09:00", src: "系统 · 第 1 次", type: "流水未提交", status: "danger", statusText: "未读", body: "2026 年 7 月银行流水上传提醒:请于截止日前完成全部账户流水提交。" },
|
||||
],
|
||||
"金牛新能源": [
|
||||
{ time: "2026-08-15 09:00", src: "系统", type: "单边待确认", status: "warn", statusText: "处理中", body: "与金牛贸易 3 笔单边流水合计 ¥4,860,000.00 待确认,请选择对方银行流水佐证。" },
|
||||
],
|
||||
"金牛置业": [
|
||||
{ time: "2026-08-14 16:40", src: "人工 · 张维", type: "流水未提交", status: "warn", statusText: "处理中", body: "中行尾号 8821 账户 7 月 6—16 日流水断档,请补传该期间银行回单或对账单。" },
|
||||
],
|
||||
"金牛贸易": [
|
||||
{ time: "2026-08-15 09:00", src: "系统", type: "单边待确认", status: "success", statusText: "已完成", body: "与金牛新能源往来 3 笔单边流水待确认,请核对 7 月销售回款记录。" },
|
||||
],
|
||||
"金牛煤业": [
|
||||
{ time: "2026-08-12 09:00", src: "系统", type: "科目待确认", status: "warn", statusText: "处理中", body: "2 笔手工记录往来科目待确认(应收 / 其他应收),涉及煤炭运费结算。" },
|
||||
],
|
||||
"金牛物流": [
|
||||
{ time: "2026-08-10 11:25", src: "人工 · 张维", type: "科目待确认", status: "success", statusText: "已完成", body: "1 笔运费结算手工记录科目待确认(其他应付待判定),请于结账前完成。" },
|
||||
],
|
||||
};
|
||||
|
||||
function openReminderHistory(company) {
|
||||
$("#history-title").textContent = company + " · 提醒历史";
|
||||
$("#history-sub").textContent = "2026 年 7 月账期以来的全部触达记录,按时间倒序。";
|
||||
async function openReminderHistory(companyId, companyName) {
|
||||
$("#history-title").textContent = (companyName || "") + " · 提醒历史";
|
||||
$("#history-sub").textContent = "该公司的全部提醒触达记录,按时间倒序。";
|
||||
const list = $("#history-list");
|
||||
const items = reminderHISTORIES[company] || [];
|
||||
list.innerHTML = '<div class="loading-row">加载中…</div>';
|
||||
const response = await fetch("/api/admin/reminders?company_id=" + encodeURIComponent(companyId || "")).catch(() => null);
|
||||
if (response?.status === 401) { window.location.href = "index.html"; return; }
|
||||
const result = await response?.json().catch(() => ({}));
|
||||
const items = result?.reminders || [];
|
||||
if (!items.length) {
|
||||
list.innerHTML = '<div class="empty"><div class="e-title">暂无历史记录</div>该公司在 7 月账期内尚未收到过提醒。</div>';
|
||||
list.innerHTML = '<div class="empty"><div class="e-title">暂无历史记录</div>该公司尚未收到过提醒。</div>';
|
||||
} else {
|
||||
list.innerHTML = items.map((it) => {
|
||||
return '<div class="list-row">' +
|
||||
'<span class="tag">' + it.type + '</span>' +
|
||||
'<div class="lr-main"><div class="lr-title">' + it.body + '</div><div class="lr-sub"><span class="meta">' + it.time + ' · ' + it.src + '</span></div></div>' +
|
||||
'<div class="lr-side"><span class="pill pill-' + it.status + '">' + it.statusText + '</span></div></div>';
|
||||
'<span class="tag">' + esc(it.kind) + '</span>' +
|
||||
'<div class="lr-main"><div class="lr-title">' + esc(it.content) + '</div><div class="lr-sub"><span class="meta">' + fmtReminderTime(it.created_at) + ' · ' + (it.source === "manual" ? "人工" : "系统") + (it.actor_username ? " · " + esc(it.actor_username) : "") + '</span></div></div>' +
|
||||
'<div class="lr-side"><span class="pill pill-danger">未读</span></div></div>';
|
||||
}).join("");
|
||||
}
|
||||
openModal("history-modal");
|
||||
@@ -1421,7 +1523,8 @@ function initAdmin() {
|
||||
$("#history-close")?.addEventListener("click", () => closeModal("history-modal"));
|
||||
$("#history-ok")?.addEventListener("click", () => closeModal("history-modal"));
|
||||
|
||||
refreshReminderCounts();
|
||||
loadSystemSettings();
|
||||
loadReminderHistory();
|
||||
}
|
||||
|
||||
const FLOW_DEMO = [
|
||||
@@ -2268,14 +2371,14 @@ function initCompany() {
|
||||
remark: String(data.get("remark")).trim(),
|
||||
bankReference: String(data.get("bankReference") || "").trim(),
|
||||
evidenceName: evidence instanceof File ? evidence.name : "",
|
||||
status: "待总账复核",
|
||||
status: "待管理复核",
|
||||
createdAt: new Date().toLocaleString("zh-CN", { hour12: false }),
|
||||
};
|
||||
records.push(record);
|
||||
if (!writeStoredRecords(storageKeys.manual, records)) return;
|
||||
renderCompanyManualRecords();
|
||||
form.reset();
|
||||
showToast("手工记录已提交", "总账复核前不会纳入公司间往来计算", "success");
|
||||
showToast("手工记录已提交", "管理员复核前不会纳入公司间往来计算", "success");
|
||||
});
|
||||
|
||||
let manualWithdrawRow = null;
|
||||
|
||||
+21
-21
@@ -5,7 +5,7 @@
|
||||
<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" />
|
||||
<link rel="stylesheet" href="design-system.css?v=5" />
|
||||
</head>
|
||||
<body data-portal="company">
|
||||
<a class="skip-link" href="#main-content">跳到主要内容</a>
|
||||
@@ -83,7 +83,7 @@
|
||||
<div class="fs-meta" id="workspaceConfirmMeta">单边流水 3 笔 · 科目确认 2 笔</div>
|
||||
</a>
|
||||
<div class="flow-step wait">
|
||||
<div class="fs-top"><span class="fs-idx">04</span><span class="fs-dot"></span><span class="fs-name">总账复核</span></div>
|
||||
<div class="fs-top"><span class="fs-idx">04</span><span class="fs-dot"></span><span class="fs-name">管理复核</span></div>
|
||||
<div class="fs-state">等待集团</div>
|
||||
<div class="fs-meta">2 笔复核在途 · 无需本公司操作</div>
|
||||
</div>
|
||||
@@ -174,7 +174,7 @@
|
||||
<div class="stack">
|
||||
<div class="card">
|
||||
<div class="card-head">
|
||||
<span class="card-title">本公司往来合计<span class="sub">2026-01-01 至 2026-08-20 · 与集团总账口径一致 · 单位:万元</span></span>
|
||||
<span class="card-title">本公司往来合计<span class="sub">2026-01-01 至 2026-08-20 · 与管理端口径一致 · 单位:万元</span></span>
|
||||
</div>
|
||||
<div class="mini-stats">
|
||||
<div class="mini-stat">
|
||||
@@ -199,7 +199,7 @@
|
||||
|
||||
<div class="card">
|
||||
<div class="card-head">
|
||||
<span class="card-title">最新通知<span class="sub">来自集团总账</span></span>
|
||||
<span class="card-title">最新通知<span class="sub">来自管理端</span></span>
|
||||
<button class="btn btn-sm btn-ghost" data-view-link="notifications">全部通知 (3) →</button>
|
||||
</div>
|
||||
<div class="list-row">
|
||||
@@ -325,7 +325,7 @@
|
||||
<div class="page-head">
|
||||
<div>
|
||||
<h1>手工记录</h1>
|
||||
<p class="page-sub">登记未通过银行流水体现的往来业务,如个人过账、现金收付与未入账回单。提交后由集团总账会计审核,通过后计入本公司往来台账。</p>
|
||||
<p class="page-sub">登记未通过银行流水体现的往来业务,如个人过账、现金收付与未入账回单。提交后由管理员审核,通过后计入本公司往来台账。</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -353,15 +353,15 @@
|
||||
</div>
|
||||
<div class="notice info" style="margin-top: 14px;">
|
||||
<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 16.5v.01"/></svg>
|
||||
<div><div class="n-title">手工记录与银行原始流水分开留痕</div><div class="n-body">总账复核通过后才纳入往来计算,撤回后需重新登记提交。</div></div>
|
||||
<div><div class="n-title">手工记录与银行原始流水分开留痕</div><div class="n-body">管理员复核通过后才纳入往来计算,撤回后需重新登记提交。</div></div>
|
||||
</div>
|
||||
<button class="btn btn-primary" type="submit" style="width: 100%; margin-top: 16px;">提交总账复核</button>
|
||||
<button class="btn btn-primary" type="submit" style="width: 100%; margin-top: 16px;">提交管理复核</button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-head">
|
||||
<span class="card-title">已提交记录<span class="sub">账期 2026-07 内本公司提交的手工往来,<span class="num" id="manualPendingStatus">0</span> 笔待总账复核</span></span>
|
||||
<span class="card-title">已提交记录<span class="sub">账期 2026-07 内本公司提交的手工往来,<span class="num" id="manualPendingStatus">0</span> 笔待管理复核</span></span>
|
||||
</div>
|
||||
<div class="table-wrap" style="border: 0;">
|
||||
<table class="ds-table">
|
||||
@@ -380,7 +380,7 @@
|
||||
</div>
|
||||
<div class="table-foot">
|
||||
<span id="manualFoot">共 0 条</span>
|
||||
<span class="meta">审核由集团总账会计在 1 个工作日内完成</span>
|
||||
<span class="meta">审核由管理员在 1 个工作日内完成</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -659,8 +659,8 @@
|
||||
<div class="notice info" style="margin-bottom: 14px;">
|
||||
<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 16.5v.01"/></svg>
|
||||
<div>
|
||||
<div class="n-title">新账户需总账管理员审核通过后方可上传流水</div>
|
||||
<div class="n-body">提交登记后由集团总账管理员核对开户信息,审核周期一般 1 个工作日;审核结果将通过站内通知告知。</div>
|
||||
<div class="n-title">新账户需管理员审核通过后方可上传流水</div>
|
||||
<div class="n-body">提交登记后由管理员核对开户信息,审核周期一般 1 个工作日;审核结果将通过站内通知告知。</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -698,7 +698,7 @@
|
||||
<div class="page-head">
|
||||
<div>
|
||||
<h1>通知</h1>
|
||||
<p class="page-sub">系统与总账管理员发送给本公司的全部消息。7 月账期结账因故顺延至 2026-08-29,请优先处理未读与处理中事项。</p>
|
||||
<p class="page-sub">系统与管理员发送给本公司的全部消息。7 月账期结账因故顺延至 2026-08-29,请优先处理未读与处理中事项。</p>
|
||||
</div>
|
||||
<div class="page-actions">
|
||||
<button class="btn btn-ghost" id="mark-all-read">全部标为已读</button>
|
||||
@@ -734,9 +734,9 @@
|
||||
</div>
|
||||
<div class="list-row" data-status="unread">
|
||||
<span class="pill pill-danger" style="flex: none;">未读</span>
|
||||
<span class="tag">总账管理员</span>
|
||||
<span class="tag">管理员</span>
|
||||
<div class="lr-main">
|
||||
<div class="lr-title">总账管理员提醒:请于 08-29 前完成待确认事项</div>
|
||||
<div class="lr-title">管理员提醒:请于 08-29 前完成待确认事项</div>
|
||||
<div class="lr-sub"><span class="meta">2026-08-18 16:40</span> · 7 月账期结账顺延至 08-29,贵公司当前仍有 5 项往来确认未完成,请合理安排时间。</div>
|
||||
</div>
|
||||
<div class="lr-side"><button class="btn btn-sm btn-mark-read">标记已读</button></div>
|
||||
@@ -746,13 +746,13 @@
|
||||
<span class="tag">系统</span>
|
||||
<div class="lr-main">
|
||||
<div class="lr-title">手工记录科目待确认:其他应收 ¥86,500.00</div>
|
||||
<div class="lr-sub"><span class="meta">2026-08-15 10:02</span> · 07-28 录入的矿区备用金垫付记录,往来科目「其他应收」待总账管理员复核。</div>
|
||||
<div class="lr-sub"><span class="meta">2026-08-15 10:02</span> · 07-28 录入的矿区备用金垫付记录,往来科目「其他应收」待管理员复核。</div>
|
||||
</div>
|
||||
<div class="lr-side"><button class="btn btn-sm btn-primary" data-view-link="manual">去处理</button></div>
|
||||
</div>
|
||||
<div class="list-row" data-status="doing">
|
||||
<span class="pill pill-warn" style="flex: none;">处理中</span>
|
||||
<span class="tag">总账管理员</span>
|
||||
<span class="tag">管理员</span>
|
||||
<div class="lr-main">
|
||||
<div class="lr-title">往来确认回复:置业已确认 320 万煤炭采购款</div>
|
||||
<div class="lr-sub"><span class="meta">2026-08-12 11:26</span> · 金牛置业已确认 07-14 煤炭采购款 ¥3,200,000.00,请补充本方工行 3305 账户流水证据完成闭环。</div>
|
||||
@@ -777,10 +777,10 @@
|
||||
</div>
|
||||
<div class="list-row" data-status="done">
|
||||
<span class="pill pill-success" style="flex: none;">已完成</span>
|
||||
<span class="tag">总账管理员</span>
|
||||
<span class="tag">管理员</span>
|
||||
<div class="lr-main">
|
||||
<div class="lr-title">交行 尾号 7710 账户开户资料已受理</div>
|
||||
<div class="lr-sub"><span class="meta">2026-07-22 13:10</span> · 新账户开户资料已提交总账管理员,审核通过后方可启用并上传流水。</div>
|
||||
<div class="lr-sub"><span class="meta">2026-07-22 13:10</span> · 新账户开户资料已提交管理员,审核通过后方可启用并上传流水。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="list-row" data-status="done">
|
||||
@@ -928,7 +928,7 @@
|
||||
<span class="modal-title">登记银行账户</span>
|
||||
<button type="button" class="modal-close" data-close="accountDialog" aria-label="关闭">×</button>
|
||||
</div>
|
||||
<p class="modal-sub">账户提交后由总账管理员复核,复核通过前不能上传流水,也不参与账户识别与覆盖计算。</p>
|
||||
<p class="modal-sub">账户提交后由管理员复核,复核通过前不能上传流水,也不参与账户识别与覆盖计算。</p>
|
||||
<form id="accountForm" novalidate>
|
||||
<div class="grid grid-2">
|
||||
<div class="field">
|
||||
@@ -943,7 +943,7 @@
|
||||
<div class="field" style="margin-top: 12px;">
|
||||
<label>银行账号</label>
|
||||
<input class="input num-input" name="accountNumber" inputmode="numeric" required />
|
||||
<span class="hint">仅尾号对外显示,完整账号仅总账管理员可见</span>
|
||||
<span class="hint">仅尾号对外显示,完整账号仅管理员可见</span>
|
||||
</div>
|
||||
<div class="field" style="margin-top: 12px;">
|
||||
<label>启用日期</label>
|
||||
@@ -957,6 +957,6 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="toast-region" id="toastRegion" aria-live="polite"></div>
|
||||
<script src="app.js?v=4"></script>
|
||||
<script src="app.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -459,6 +459,33 @@ p { margin: 0; }
|
||||
.login-foot { margin-top: 16px; font-size: 12px; color: var(--muted); text-align: center; }
|
||||
.login-foot a { color: var(--accent); font-weight: 550; }
|
||||
.login-foot a:hover { text-decoration: underline; }
|
||||
|
||||
/* 端标识:登录页顶部大字区分管理端 / 公司端 */
|
||||
.login-role-title {
|
||||
font-size: 34px;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.02em;
|
||||
line-height: 1.15;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.login-role-title.admin { color: var(--accent); }
|
||||
.login-role-title.company { color: var(--info); }
|
||||
.login-role-caption { color: var(--muted); font-size: 13px; margin-bottom: 22px; }
|
||||
/* 管理端青绿 / 公司端品蓝侧栏色块 */
|
||||
.login-aside.company { background: var(--info); }
|
||||
.login-aside.company .aside-item .tick { color: var(--surface); opacity: 0.85; }
|
||||
.login-back {
|
||||
display: inline-flex; align-items: center; gap: 6px;
|
||||
margin-bottom: 20px;
|
||||
padding: 6px 12px;
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 999px;
|
||||
background: var(--surface);
|
||||
color: var(--fg);
|
||||
font-size: 12.5px; font-weight: 600;
|
||||
}
|
||||
.login-back:hover { border-color: var(--accent); color: var(--accent); }
|
||||
.login-back.company:hover { border-color: var(--info); color: var(--info); }
|
||||
@media (max-width: 900px) {
|
||||
.login-wrap { grid-template-columns: 1fr; }
|
||||
.login-aside { display: none; }
|
||||
|
||||
+4
-4
@@ -4,20 +4,20 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>金牛实业资金往来管理系统 · 入口</title>
|
||||
<link rel="stylesheet" href="design-system.css?v=4" />
|
||||
<link rel="stylesheet" href="design-system.css?v=5" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="portal-wrap">
|
||||
<div class="portal-inner">
|
||||
<p class="meta" style="letter-spacing: 0.1em;">JINNIU GROUP · INTERCOMPANY TREASURY</p>
|
||||
<h1 style="font-size: 26px; font-weight: 700; letter-spacing: -0.015em; margin-top: 10px;">河南金牛实业集团有限公司 · 资金往来管理系统</h1>
|
||||
<p class="muted" style="margin-top: 10px; max-width: 64ch;">集团内部公司间资金往来记账平台。银行流水导入后自动轧算往来余额,支持从集团汇总逐级穿透至银行原始流水。本系统包含总账管理端与公司业务端两套界面。</p>
|
||||
<p class="muted" style="margin-top: 10px; max-width: 64ch;">集团内部公司间资金往来记账平台。银行流水导入后自动轧算往来余额,支持从集团汇总逐级穿透至银行原始流水。本系统包含管理端与公司业务端两套界面。</p>
|
||||
|
||||
<div class="portal-grid">
|
||||
<a class="portal-card" href="login-admin.html">
|
||||
<span class="pc-role">总账管理端 · 7 个页面</span>
|
||||
<span class="pc-role">管理端 · 7 个页面</span>
|
||||
<h3>管理总览 / 往来查询 / 审核中心 / 流水管理 / 公司与账号 / 结账与期初 / 提醒管理</h3>
|
||||
<p>面向集团总账会计:全局监控各公司流水提交与往来余额,集中处理审核事项,执行月度结账。</p>
|
||||
<p>面向管理员:全局监控各公司流水提交与往来余额,集中处理审核事项,执行月度结账。</p>
|
||||
<span class="pc-go">去管理端登录 →</span>
|
||||
</a>
|
||||
<a class="portal-card" href="login-company.html">
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>登录 · 金牛实业资金往来管理系统</title>
|
||||
<link rel="stylesheet" href="design-system.css?v=4" />
|
||||
<link rel="stylesheet" href="design-system.css?v=5" />
|
||||
</head>
|
||||
<body data-role="admin">
|
||||
<div class="login-wrap">
|
||||
@@ -22,8 +22,11 @@
|
||||
|
||||
<main class="login-panel">
|
||||
<div class="login-card">
|
||||
<a class="login-back" href="index.html">← 返回入口页</a>
|
||||
<div class="login-role-title admin">管理端</div>
|
||||
<p class="login-role-caption">管理员统一监控集团各公司资金往来,执行月度结账。</p>
|
||||
<h2>登录系统</h2>
|
||||
<p class="login-sub">请输入账号密码登录总账管理端。首次登录需修改初始密码。</p>
|
||||
<p class="login-sub">请输入账号密码登录管理端。首次登录需修改初始密码。</p>
|
||||
|
||||
<form id="login-form" novalidate>
|
||||
<div class="field">
|
||||
@@ -42,7 +45,7 @@
|
||||
<button class="btn btn-primary" type="submit" style="width: 100%; margin-top: 6px;">登 录</button>
|
||||
</form>
|
||||
|
||||
<p class="login-foot">忘记密码请联系集团总账管理员重置 · <a href="index.html">返回入口页</a></p>
|
||||
<p class="login-foot">忘记密码请联系管理员重置 · <a href="index.html">返回入口页</a></p>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
@@ -72,6 +75,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="login.js?v=4"></script>
|
||||
<script src="login.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>登录 · 金牛实业资金往来管理系统</title>
|
||||
<link rel="stylesheet" href="design-system.css?v=4" />
|
||||
<link rel="stylesheet" href="design-system.css?v=5" />
|
||||
</head>
|
||||
<body data-role="company">
|
||||
<div class="login-wrap">
|
||||
<aside class="login-aside">
|
||||
<aside class="login-aside company">
|
||||
<span class="brand-mark">JINNIU GROUP · TREASURY</span>
|
||||
<h1>河南金牛实业集团有限公司<br />资金往来管理系统</h1>
|
||||
<p class="aside-sub">集团内部各公司之间资金往来的统一记账平台。导入银行流水后自动轧算公司间往来余额,从集团汇总可层层下钻至银行原始流水。</p>
|
||||
@@ -22,6 +22,9 @@
|
||||
|
||||
<main class="login-panel">
|
||||
<div class="login-card">
|
||||
<a class="login-back company" href="index.html">← 返回入口页</a>
|
||||
<div class="login-role-title company">公司端</div>
|
||||
<p class="login-role-caption">成员公司出纳上传流水、登记手工往来、确认单边匹配。</p>
|
||||
<h2>登录系统</h2>
|
||||
<p class="login-sub">请输入账号密码登录公司业务端。首次登录需修改初始密码。</p>
|
||||
|
||||
@@ -42,7 +45,7 @@
|
||||
<button class="btn btn-primary" type="submit" style="width: 100%; margin-top: 6px;">登 录</button>
|
||||
</form>
|
||||
|
||||
<p class="login-foot">忘记密码请联系集团总账管理员重置 · <a href="index.html">返回入口页</a></p>
|
||||
<p class="login-foot">忘记密码请联系管理员重置 · <a href="index.html">返回入口页</a></p>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
@@ -72,6 +75,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="login.js?v=4"></script>
|
||||
<script src="login.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user