1系统总体架构
本系统当前处于零预设状态:不预置任何业务数据和业务功能。数据库 14 张表全部已建、0 行;现有能力只有「页面骨架 + 反馈通道」。之后每一条反馈就是一个需求,处理上线后在第 7 节更新记录留痕,系统随之生长。
flowchart TB
subgraph SRC[前端入口]
HOME["/ 门户首页"]
PLAN["/plan 回货计划看板
Excel 本地解析 数据不上传"]
PMC["/pmc 欠料总表 空态"]
ERP["/erp ERP同步 空态"]
SUP["/supplier 供应商填报 空态"]
ADM["/feedback-admin 反馈汇总"]
DOC["/doc 系统呈现 本页"]
end
subgraph SVC[服务层 Flask 网页服务.py]
NG["nginx 反代
X-Real-IP 覆盖防伪造"]
WAIT["waitress 127.0.0.1:18091
16线程 仅本机监听 pm2:evo-api"]
AUTH["钥匙鉴权 ?k= / X-Access-Key
本机 127.0.0.1 免钥匙"]
CRON["定时线程 每日07:30
ERP同步 未部署金蝶模块显式报错"]
end
subgraph DB[存储 全部已建 当前0行]
MAIN[("SQLite 回货计划.db
14张表 零预设")]
FILES["/fbfiles 反馈附件"]
end
subgraph CH[反馈处理通道 本地]
POLL[本地轮询 新反馈/追评]
TRAE["Trae 助手自动接收
15秒内打进输入框"]
DO[评估->修改->部署]
REPLY["POST api/feedback/reply 回写"]
end
HOME & PLAN & PMC & ERP & SUP & ADM & DOC --> WAIT
NG --> WAIT
AUTH --> WAIT
WAIT --> MAIN
CRON -.写快照.-> MAIN
MAIN --> POLL
POLL --> TRAE --> DO --> REPLY --> MAIN
MAIN --> FILES
2数据链路(零预设 · 反馈驱动)
五条链路的当前真实状态:A 已上线B 空态C 待对接D 待启用E 已闭环。数据是否接入、功能是否启用,一律由反馈决定,不预先上线。
flowchart TB
subgraph A["A. /plan 回货计划看板 已上线·数据不上传"]
A1[用户拖拽 Excel 调货总表] --> A2[xlsx.full.min.js 浏览器本地解析]
A2 --> A3[("localStorage 持久化
数据仅存本机浏览器")]
A3 --> A4[表格渲染/编辑/导出]
end
subgraph B["B. /pmc 欠料总表 空态"]
B1["带钥匙访问 /pmc?k=..."] --> B2["/api/bootstrap 钥匙鉴权"]
B2 --> B3[("业务表返回 0 行")]
B3 --> B4[前端无数据守卫 空态提示]
end
subgraph C["C. /erp ERP同步 骨架就绪·待对接"]
C1[POST /api/erp/sync] --> C2[金蝶K3Cloud取数模块
独立部署 每日07:30]
C2 -.未部署显式报错不静默.-> C3["erp_*快照表 batch隔离"]
end
subgraph D["D. 供应商协同 骨架就绪·待启用"]
D1["/supplier-admin 生成token链接"] --> D2["/supplier 免登录填报 只看自己的行"]
D2 --> D3["/api/supplier/save 逐格+批量"] --> D4[("order_rows 回复交期")]
end
subgraph E["E. 反馈通道 已闭环·唯一需求来源"]
E1[任意页面反馈按钮
点选元素+附图] --> E2["POST /api/feedback + /upload"]
E2 --> E3[("feedback表")]
E3 --> E4["本地轮询->Trae
15秒内自动推送->reply回写"]
end
3数据模型(SQLite ER)
14 张表三组分栏:ERP 快照组 / 计划业务组 / 反馈审计组。全部已建、当前 0 行——零预设不预置任何数据;业务表之间用 batch+sup_code 逻辑外键(写入侧保证一致),erp_* 快照表靠 batch 对齐同一时刻口径,历史批次可回溯。
erDiagram
ERP_SYNC_META ||--|| ERP_SHORTAGE : "batch 快照"
ERP_SYNC_META ||--|| ERP_INSTOCK : "batch 快照"
ERP_SYNC_META ||--|| ERP_PO : "batch 快照"
ERP_SYNC_META ||--|| ERP_PR : "batch 快照"
ERP_SYNC_META ||--|| ERP_PPBOM : "batch 快照"
SUPPLIERS ||--o{ ORDER_ROWS : "batch+sup_code"
CUSTOM_COLS ||--o{ ORDER_ROWS_CUSTOM : "定制列定义"
PLAN_BUYER ||--o{ ORDER_ROWS : "订单->采购员映射"
INSTOCK_SEEN ||--o{ INSTOCK_LOG : "bill_no 防重+流水"
ORDER_ROWS ||--o{ FEEDBACK : "行引用 refs"
SUPPLIERS["供应商"] {
text sup_code PK "供应商编码"
text sup_name "供应商名称"
text buyer "采购员"
text token UK "免登录令牌"
text batch "导入批次"
}
ORDER_ROWS["回货订单行"] {
int id PK "行编号"
text batch "调货批次"
text sup_code FK "供应商编码"
text order_no "订单单号"
text mat_code "物料编码"
real qty_need "需求数量"
real qty_back "已回货数量"
text reply_date "供应商回复交期"
text reply_note "回复备注"
}
ORDER_ROWS_CUSTOM["订单行存档"] {
int id PK "行编号"
text batch "调货批次"
text sup_name "供应商名称 存档快照"
text buyer "采购员 存档快照"
}
CUSTOM_COLS["定制列定义"] {
text name PK "定制列名"
int seq "列显示顺序"
}
PLAN_BUYER["订单采购员映射"] {
text order_no PK "生产订单"
text buyer "采购员"
text synced_at "同步时间"
}
FEEDBACK["反馈"] {
int id PK "反馈编号"
text page "来源页面"
text refs "引用元素快照"
text content "反馈内容"
text reply "处理回复"
text replied_at "回复时间"
text files "附件清单"
text uid "匿名身份 只能看自己的"
text status "状态 待处理或待审核或开发中或已上线"
text done_at "上线时间 亮红点提醒"
text followups "追评记录"
}
INSTOCK_SEEN["已扣数入库单"] {
text bill_no PK "已扣数入库单号"
text run_at "执行时间"
}
INSTOCK_LOG["扣数流水"] {
int id PK "流水编号"
text bill_no "入库单"
text order_no "生产订单"
text mat_code "物料编码"
real qty "扣减数量"
int matched "是否匹配"
text deduct "扣减明细 可溯源"
}
ERP_SHORTAGE["ERP欠料快照"] {
int id PK "行编号"
text batch "同步批次"
text mo_no "生产订单"
text mo_status "订单状态"
text sub_code "子项物料"
real unpicked_qty "未领数量"
real stock_total "总仓库存"
real lack_qty "实际欠料"
real ws_stock "车间仓库存"
real to_buy "需补充数量"
}
ERP_INSTOCK["ERP库存快照"] {
int id PK "行编号"
text batch "同步批次"
text wh_type "总仓或车间仓"
text mat_code "物料编码"
real qty "库存数量"
}
ERP_PO["ERP采购订单快照"] {
int id PK "行编号"
text batch "同步批次"
text bill_no "采购订单"
text mat_code "物料编码"
real remain_qty "剩余入库"
text delivery_date "交货日期"
}
ERP_PR["ERP采购申请快照"] {
int id PK "行编号"
text batch "同步批次"
text bill_no "采购申请"
real remain_qty "剩余数量"
}
ERP_PPBOM["ERP用料清单快照"] {
int id PK "行编号"
text batch "同步批次"
text mo_no "生产订单"
text ppbom_no "用料清单编号"
text sub_code "子项物料"
real unpicked_qty "未领数量"
}
ERP_SYNC_META["ERP同步游标"] {
text key PK "游标键 批次与时间"
text value "游标值"
}
4反馈闭环与权限审计(泳道)
反馈是本系统唯一的「需求来源」。整条链路自动流转:页面提交 -> 15 秒内自动推送到 AI 助手 -> 评估处理 -> 部署上线 -> 结果回写;反馈人在「我的反馈」直接看到处理结果并可追评。涉及反馈的功能按权限分层:管理端操作需管理钥匙,反馈人凭浏览器匿名身份即可查看自己的反馈。(接口级技术细节见第 2 节数据链路)
flowchart TB
subgraph U["反馈人"]
A1["页面点选元素+填写反馈
可附图"]
A2["我的反馈面板:免钥匙
状态徽标/回复/追评/上线红点"]
end
subgraph F["前端反馈组件"]
B1["提交反馈+上传附件"]
B2["每隔半分钟自动刷新
「我的反馈」处理进度"]
B3["提交追评(补充说明)"]
end
subgraph S["服务端程序"]
C1[("反馈台账
待处理/待审核/开发中/已上线")]
C2["查全部反馈清单(需钥匙)"]
C3["写回复+回复时间(需钥匙)"]
C4["改处理状态(需钥匙)"]
C5["撤销回复(需钥匙)"]
end
subgraph T["本地处理通道 AI助手Trae"]
D1["自动发现新反馈/追评
(每15秒查一次线上清单)"]
D2{"评估
是否适合修改"}
D3["开发+部署上线
状态改已上线+记上线时间"]
end
subgraph G["总管理员 管理后台"]
E1["汇总/筛选/搜索/改状态"]
E2["回复/取消回复"]
end
A1 --> B1 --> C1
C1 --> D1 --> D2
D2 -->|适合| D3 --> C3
D2 -->|需审核| E1 --> D3
C3 & C4 & C5 --> C1
C1 --> B2 --> A2
A2 --> B3 --> C1
E2 --> C5
A1 --> S6["附件保存到服务器
专用附件目录"]
| 环节 | 审计机制 |
|---|---|
| 反馈受理 | 自动记录提交时间 + 来源页面 + 你引用的页面元素快照 + 附件清单 |
| 状态流转 | 待处理 -> 待审核/开发中 -> 已上线;撤销回复时状态同步回退,不留悬空状态 |
| 处理回复 | 回复内容与回复时间成对记录,仅管理钥匙可写,反馈人立即可见 |
| 上线提醒 | 「已上线」时记下上线时间,反馈人端据此亮"新上线"红点(历史已完成不误提醒) |
| 追评留痕 | 追评逐条记录内容与时间,管理员的回应显示在上方回复块 |
| 匿名身份 | 浏览器自动生成的匿名身份:免钥匙只能看自己的反馈,不能查全表 |
| 数据鉴权 | 业务数据接口需带钥匙访问;外层防伪造来源身份,本机直连免钥匙 |
5当前功能与运行状态
下表如实列出当前全部已上线能力。空态表示页面已就绪但无业务数据——按构建原则,不预置任何数据,等真实业务/反馈接入。
| 入口 | 能力 | 状态 |
|---|---|---|
| / | 门户首页:功能卡片导航、平台时钟、反馈按钮 | 已上线 |
| /pmc | PMC 欠料总表:列筛选/搜索/导出骨架 | 空态待数据源接入(由反馈决定) |
| /plan | 供应链回货计划看板:拖拽导入 Excel,全程本地解析、数据不上传 | 已上线(数据仅存浏览器本地) |
| /supplier-admin | 供应商调货单管理:生成/分发 token 链接、进度查看 | 空态待业务启用 |
| /erp | ERP 数据同步页 + 定时同步线程(每日 07:30) | 空态金蝶取数模块未部署,显式报错不静默 |
| /feedback-admin | 反馈汇总(需管理钥匙):筛选/搜索/状态流转/回复/追评/附件 | 已上线 |
| 全部页面 | 反馈浮层:点选元素引用、附图、我的反馈、追评 | 已上线(含自动推送处理) |
| /doc | 本页:系统呈现(活文档) | 已上线 |
6构建原则:零预设·反馈驱动
本系统与「先设计一堆功能再上线」的传统做法相反:
| 原则 | 含义 |
|---|---|
| 零预设 | 不预置任何业务数据、不上线任何未经反馈确认的功能;页面只有骨架与空态(数据库 14 张表全部 0 行) |
| 反馈即需求 | 每条反馈=一个待评估需求,15 秒内自动进入处理通道,不漏单 |
| 上线即留痕 | 每次反馈驱动变更上线后,在第 7 节更新记录补一行,本文档与 4 张 .excalidraw 同步修订 |
| 可追溯 | 更新记录每行标注来源反馈编号,反馈人可在「我的反馈」核对处理结果 |
7更新记录
本文档随功能更新同步维护;反馈处理上线后回写此处。
| 时间 | 反馈 | 变更 |
|---|---|---|
| 2026-09-20 上午 | #2 | 「我的反馈」与「处理结果」合并为两页签,回复内联显示;每条反馈新增「追评」按钮 |
| 2026-09-20 中午 | #3 | 反馈自动推送链路上线:线上新反馈/追评 15 秒内自动打进助手输入框并回车 |
| 2026-09-20 下午 | #6 | 链路闭环验证通过(自动接收+处理+回复) |
| 2026-09-20 下午 | #7 | 附件接收验证通过(图片/文件);确认系统零预设数据;门户页补上反馈按钮 |
| 2026-09-20 下午 | 用户指示 | 「系统呈现」上线:架构/功能状态/反馈链路/构建原则/更新记录,作为随反馈生长的活文档 |
| 2026-09-20 下午 | 用户指示(参考老项目交付包) | 按老项目「系统呈现」完整形态补齐:新增数据链路、数据模型 ER、反馈审计泳道三节;上线 4 张 .excalidraw 可编辑图 + 系统呈现.md 源 + 链接.md;文档迁移至 /doc/ 目录(静态文件,改图无需重启服务) |
| 2026-09-20 下午 | #10 | 网站根目录上线微信业务域名校验文件(b1b4f3ae...a8ea1.txt),微信内访问平台域名不再提示风险 |
| 2026-09-20 下午 | #11 | 本页移动端适配:左侧栏改为顶部粘性横滑导航(窄屏不挤占内容),导航栏内置「反馈」入口(部分手机内核浮动按钮 fixed 失效的兜底),宽表格可横向滚动 |
| 2026-09-20 下午 | #12 | /plan 看板读取改公开(/api/plan/rows、/api/plan/version 无需钥匙),移除「服务端有数据但无权限」拦截提示——展示范式站点先看再谈;导入/增删行/填值等写操作仍需钥匙 |
| 2026-09-20 下午 | #13 | 本页两处修复:移动端导航改为左上角汉堡按钮弹出左侧抽屉(遮罩/选中即收起);第 2 节数据链路 mermaid 图因 / 开头节点被误解析为图形语法导致整图报错,已加引号修复 |
| 2026-09-20 下午 | #15 | 反馈提醒防静默消费:切走页面再回来/快速划过「我的反馈」时,红点与 NEW 不再被立即记为已读——改为页面可见且面板停留 2.5 秒才记账,提醒必先亮出给用户看到 |
| 2026-09-20 下午 | #16 | 第 4 节「反馈闭环与权限审计」全面去术语化:泳道图与审计表改写为业务白话(提交/刷新/追评/台账/钥匙),不再出现接口路径与英文字段名;接口级技术细节仍保留在第 2 节数据链路 |
| 2026-09-20 下午 | #18 | 第 3 节 ER 图结构化:14 张表全部加中文别名(ERP同步游标/回货订单行/反馈等),所有字段补齐中文说明,注释统一为可读短句,表与表关系线同步中文标注 |
| 2026-09-20 下午 | #19 | 修复「我的反馈」看不到:从供应商 token 链接进入时不再独占查询——token 与浏览器匿名身份合并查询,供应商反馈与访客期反馈都能看到;token 失效时自动退化按浏览器身份查,不再显示空列表 |
| 2026-09-20 下午 | #20 | /plan 移除空数据警示条:演示站服务端无数据是常态,直接呈现干净的导入界面,不再出现「服务端暂无回货计划数据」防御式提示;仅网络不通或接口故障时才提示 |
| 2026-09-20 下午 | #21 | 修复第 3 节 ER 图渲染报错:上一版在表关系线上用了实体别名写法,页面所用 mermaid 10.9.1 不支持该语法导致整图无法显示;已改为关系线用表名(实体框仍显示中文别名),并经本地 10.9.1 解析器验证通过 |
| 2026-09-20 下午 | #22 | 全部 mermaid 图支持点击放大:点击任意图打开全屏查看器,滚轮/双指捏合自由缩放、拖拽平移、双击复位、Esc 或点遮罩关闭——内容多的图(如 14 张表的 ER 图)可放大看清 |
| 2026-09-20 下午 | #22 追评 | 追评支持粘贴/拖拽/添加图片与文件(全站反馈追评一致,附件与追评一同展示在对话流);管理员回复位置说明:回复显示在同一条反馈卡片内的绿色「已回复」块,位于追评块上方 |
| 2026-09-20 下午 | #23 | 手机端图查看器文字模糊修复:缩放从 CSS transform 改为 SVG viewBox 矢量缩放(手机内核对 transform 缩放的 SVG 先光栅化再放大导致文字糊),任意倍数下文字锐利;查看器同步改浅色底 + 白底图形,双指捏合顺滑、旋转屏幕自动适配 |
| 2026-09-20 下午 | #24 | 图文字模糊二次修复:flowchart 文字从 foreignObject 改为 SVG text 纯矢量渲染(部分手机内核对 foreignObject 缩放仍光栅化,viewBox 也救不回),任何缩放路径文字都锐利;图上加「点击图可放大」角标引导用查看器——页面上直接双指捏合是内核整页位图放大,无法矢量化,请点图放大 |
| 2026-09-20 下午 | #22 追评2 | 管理员回复改为聊天式对话流:回复与追评在同一条卡片内按时间序交错显示(绿色回复块/灰蓝追评块),首条回复与后续往来全部保留、可多轮往复延续;管理员每次回复追加一条消息,撤销只撤最后一条 |
| 2026-09-20 下午 | #25 | 反馈汇总页(/feedback-admin)补齐反馈能力:页面挂上悬浮「反馈」按钮可直接提交反馈与查看「我的反馈」对话流;汇总卡片内完整展示追评对话流——用户追评与管理员回复按时间序交错显示(含追评附件),不再只显示最新一条回复 |
8图源与再生成
四张图与本文档同源维护:改动本地生成脚本后一键重生成、覆盖上传(静态文件,无需重启服务)。
| 文件 | 内容 |
|---|---|
| 01-总体架构.excalidraw | 入口 -> 服务 -> 存储 -> 反馈处理通道,底部审计带 |
| 02-数据链路.excalidraw | A /plan 本地解析;B /pmc 空态;C /erp 待对接;D 供应商待启用;E 反馈闭环 |
| 03-数据模型ER.excalidraw | 14 张表三组分栏:ERP 快照组 / 计划业务组 / 反馈审计组 |
| 04-反馈审计泳道.excalidraw | 5 泳道(反馈人/前端/服务端/Trae/总管理员)+ 7 个审计点 |
| 系统呈现.md | Markdown 源(Mermaid 嵌 md,可贴 wiki) |
| 链接.md | 文档链接清单与维护方式 |
维护方式:改本地 系统呈现/_gen_excalidraw.py -> python _gen_excalidraw.py 重生成 -> python _deploy/deploy_doc.py 覆盖上传(无需重启;改动 网页服务.py 才需重启)。excalidraw 文件拖入 excalidraw.com 可二次编辑。