/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}
|
文档版本 |
V1.0(对应代码版本 v0.1.0 · S8.16) |
|
编制日期 |
2026 年 11 月 7 日 |
|
适用范围 |
系统开发 / 实施 / 运维 / 二次开发人员 |
|
安全声明 |
本文档不含任何明文凭据;所有口令、密钥均以 ****** 掩码呈现 |
摘要
- 本系统是一套面向贸易备件业务的轻量 ERP:覆盖报价 → 客户订单 → 背靠背采购 → 收货入库 → 库存与批次追溯 → 交货出库 → 退货 → 开票结算全链路,并配套经营看板、控制台待办、客户/供应商门户与外部接口集成。
- 技术栈为 FastAPI + SQLAlchemy + pymssql(后端)、Vue 3 + Element Plus + Vite(前端)、SQL Server 2025(数据库),单端口 8000 部署,前后端同源免跨域。
- 当前规模:数据库 96 张表 / 1556 列 / 167 个 CHECK 约束,菜单 233 项(页面 49 + 功能权限点 173 + 目录 11);后端 Python 源文件 111 个,前端 Vue/TS 源文件 116 个。
- 质量保障:30 个验收脚本共 1129 条断言全绿,另有结构闸门(schema_guard)、权限巡检(perm_audit –strict)、真实浏览器截图取证三道门禁。
- 合理性结论:系统的核心设计(口径唯一真相源、不存第二份账、三层权限边界、软控优先、脚本化验收)是自洽且可维护的;本轮体检发现并修复了 3 处问题(1 处页面级崩溃、1 处门户数据泄漏、1 处门户误报),另有 8 项已知局限与建议在第 6.3 节列明。
目录
1 系统概述
2 数据库设计
3 部署与环境
4 核心业务流程
5 安全与权限体系
6 系统设计合理性评估
7 质量保障体系
8 接口集成
9 运维保障
10 使用指引摘要
11 交付物清单
附录 A 验收脚本基线全表
1 系统概述
1.1 业务定位与范围
系统服务对象为从事工业备件贸易的中小企业(单法人)。业务主线:销售侧从客户报价出发,确认后生成客户订单;采购侧按「背靠背」方式从客户订单一键生成采购订单,向供应商采购;货物入库后按批次管理库存(含效期与安全库存预警);按订单交货出库并同步外发 ASN 报文;开票结算形成应收/应付台账并支持对账勾稽。内部用户通过浏览器操作,客户与供应商通过门户账号查看自己的单据与台账(严格的数据隔离与字段裁剪)。
系统同时提供:经营指挥看板(接单/发货/开票三口径)、控制台待办(9 组待办 + 8 项风险)、月别盘点、仓间调拨、借出归还、月结关账、单据打印、Excel 导入导出(含期初建账)、接口集成(Outbox 派发 / 重试 / 死信 / 日对账 / 报文归档)与全过程审计留痕。
系统主动脉

1.2 总体架构
系统采用前后端同源的单端口部署:前端构建产物(frontend/dist)由后端静态托管,浏览器只访问 8000 端口;接口走 /api 前缀,门户与内部账号共用同一前端,由后端按账号类型隔离数据。
|
层次 |
职责 |
代码位置 |
|
表现层 |
Vue 3.5 + Element Plus + Vite 5,动态路由由菜单下发;门户身份同一前端按 isPortal 裁剪 |
frontend/src(116 个 .vue/.ts) |
|
应用层 |
FastAPI;14 个路由聚合 + 13 类主数据动态 CRUD;业务错误 200+code=1、状态冲突 409、越权 404 |
backend/app(111 个 .py) |
|
领域模块 |
sales / purchase / stock / delivery / settlement / report / integration / masterdata / system / io / auth / init / printing |
backend/app/modules |
|
数据访问 |
SQLAlchemy 2.0 + pymssql;跨库事务(出库与 ASN 同事务);显式 COLLATE 中文排序规则 |
backend/app/database.py |
|
数据层 |
SQL Server 2025,96 表 / 1556 列 / 167 CHECK;软删 + 审计 + 序列发号器 |
database/schema(17 个 DDL 文件) |
|
运维脚本域 |
init_db / migrate / schema_guard / perm_audit / ops_daily / backup_db / 验收与截图脚本 |
scripts |
1.3 技术栈
|
类别 |
选型 |
说明 |
|
后端框架 |
FastAPI + Uvicorn |
Python 3.13;Pydantic 校验;JWT 鉴权 |
|
ORM / 驱动 |
SQLAlchemy 2.0 + pymssql |
mssql 方言做了版本钳制(服务器为 2025/17.x,方言只认 8~16) |
|
数据库 |
SQL Server 2025 |
库 project_bj;建库显式 COLLATE Chinese_PRC_CI_AS |
|
前端 |
Vue 3.5 + Element Plus + Vite 5 |
Pinia 状态、动态路由、浅色主题、流式看板布局 |
|
鉴权 |
JWT(HS256) |
口令 bcrypt 存储;连续 5 次失败锁定 15 分钟 |
|
部署 |
单端口 8000 |
后端托管前端产物;install/start/stop 一键脚本 |
1.4 代码规模
|
指标 |
数量 |
备注 |
|
数据库表 / 列 / CHECK 约束 |
96 / 1556 / 167 |
schema_guard 基线冻结,只增不改 |
|
菜单(页面+权限点+目录) |
233(49+173+11) |
由 sys_menu 种子下发,前端动态路由 |
|
后端 Python 源文件 |
111 |
不含脚本域;脚本域另有 70+ 个 |
|
前端 Vue/TS 源文件 |
116 |
views 20 个业务域目录 |
|
验收脚本 / 断言 |
30 个 / 1129 条 |
每次交付全量回归(见第 7 章) |
2 数据库设计
2.1 分域 DDL(database/schema)
建表脚本按业务域拆分为 18 个文件,按文件名顺序执行;每个文件含幂等的建表语句与 CHECK 约束。结构基线(baseline_columns.json,96 表/1556 列/167 CHECK)由 schema_guard 冻结。
|
DDL 文件 |
覆盖内容 |
|
00_createdb |
建库(显式 COLLATE Chinese_PRC_CI_AS)与文件组 |
|
01_sys |
平台域:用户/角色/菜单/字典/状态机/审计/配置/序列/迁移台账等 |
|
02_mst |
主数据域:客户/供应商/物料/仓库/库位/组织/汇率/规则 |
|
03_quo / 04_cpo |
报价域与客户订单域(头/行/子行三层 + 拼单组) |
|
05_whs / 08_stk |
仓储域与库存余额域(批次/仓别余额、盘点调整) |
|
06_po |
采购域(头/行/箱级收货计划) |
|
07_shp / 09_do |
交货发运域与出库单域 |
|
10_rtn |
退货域(销售/采购退货) |
|
11_settle |
结算域(发票、应收/应付台账、对账单) |
|
12_io / 13_chk |
导入导出框架与盘点单 |
|
14_int / 15_int / 16_int_endpoint |
接口域:outbox/报文/队列/日志/死信 + 对端配置 |
|
17_mov_period_attach |
仓间调拨、月结关账(sys_period)、附件(sys_attach) |
|
18_mst_expiry_safety |
物料保质期与安全库存(预警扩展) |
2.2 结构闸门(schema_guard)
- 只增不改:删表、删列、改类型、收紧可空、新增必填无默认 → 非零退出,禁止执行。
- 比对 CHECK 约束:枚举集合变小或交叉 = FAIL(防止状态枚举被悄悄改小);变大 = ADD 放行;范围型降级为表达式比对。
- 交付前冻结基线:python scripts/schema_guard.py –freeze;用 –baseline 副本造破坏来验证闸门本身有效。
2.3 初始化与种子(scripts/init_db.py)
init_db.py 幂等可重复执行,流程:读 .env → 建库(若缺)→ 按序执行 18 个 DDL → 执行 20 个种子 SQL(字典、菜单、权限点、状态机边、演示主数据、对端配置等)→ 创建初始管理员 → 发号器对齐(seq_align 只增不减)。重跑 init_db 会把菜单授权恢复为种子口径(界面手工放宽的授权会被撤回),这是「种子即授权真相源」的设计。
3 部署与环境
3.1 交付包目录结构
|
目录/文件 |
说明 |
|
backend/ |
FastAPI 应用(app/ + config/)与 requirements.txt;.env 不入包,用 .env.example 复制填写 |
|
frontend/ |
Vue 源码(src/)与构建产物(dist/);node_modules 不入包,npm install 还原 |
|
database/schema |
18 个建表 DDL + 结构基线 JSON |
|
database/data |
20 个种子 SQL(字典/菜单/权限/状态机/演示数据) |
|
database/migrations |
增量迁移脚本(含回滚版本),migrate.py 按版本升序执行 |
|
scripts/ |
init_db、验收(verify_*)、截图(screenshot_*)、闸门与运维脚本 |
|
docs/ |
需求、拆解、分期规范、清单类文档与交付配图(docs/delivery/shots) |
|
使用说明.md |
面向操作用户的手册(模块地图、主流程、高频操作、排障) |
|
install.bat / start.bat / stop.bat |
一键安装 / 启动(含健康检查)/ 停止 |
3.2 环境变量(backend/.env)
复制 .env.example 为 .env 后填写;.env 含明文凭据,已在 .gitignore 中,绝不进入仓库与交付包。
|
键 |
说明 |
示例/占位 |
|
APP_NAME / APP_ENV / API_PREFIX |
应用名、运行环境、API 前缀 |
TradeERP / dev / /api |
|
DB_HOST / DB_PORT / DB_NAME |
SQL Server 地址、端口、库名 |
192.168.x.x / 1433 / project_bj |
|
DB_USER / DB_PASSWORD |
数据库账号与口令(明文只存本机 .env,不进仓库与交付包) |
****** / ****** |
|
DB_DIALECT / DB_DRIVER |
SQLAlchemy 方言与 ODBC 驱动 |
mssql / ODBC Driver 17 for SQL Server |
|
JWT_SECRET / JWT_ALG / JWT_EXPIRE_MINUTES |
签发密钥、算法、有效期 |
****** / HS256 / 720 |
|
CORS_ORIGINS |
跨域白名单(生产同源部署可留空) |
http://localhost:5173 |
|
SEED_ADMIN_PASSWORD |
初始管理员口令,仅 init_db.py 使用,首登后须修改 |
****** |
3.3 安装与启动
- install.bat:建 venv → 装后端依赖 → 生成 .env → npm ci → init_db.py 建库建表;幂等,可重复执行。
- start.bat:起后端 8000(自动构建缺失的 dist;端口占用则不重复启动;健康检查通过后才开浏览器)。
- stop.bat:只杀命令行含 uvicorn 的 PID,不误杀其它占用端口的程序。
- 手动方式:uvicorn app.main:app –host 127.0.0.1 –port 8000(在 backend 目录下执行)。
4 核心业务流程
4.1 主流程总览
主链路:报价单(审批通过)→ 客户订单(确认)→ 采购订单(背靠背生成,备注自动净化不含客户信息)→ 到货收货(箱级收货,生成批次追溯节点)→ 库存(批次/仓别余额,效期与安全库存预警)→ 交货出库(扣减库存,同事务生成 ASN 报文)→ 开票结算(应收台账,勾稽核销)→ 对账单与月结关账。每一环节均受状态机约束(非法流转返回 409)、写审计日志(谁在何时改了什么)。
4.2 登录与工作台
登录页连续 5 次口令错误锁定 15 分钟;登录后进入工作台:顶部为 4 张概览卡(待处理/涉及金额/风险提示/今日登录),左侧为 9 组待办(报价审批、订单确认、采购收货、收货入库、盘点提交、已发未开票、借货未还、到货跟催等,按当前账号权限点裁剪),右侧为 8 项风险提醒(应收逾期、超信用额度、负库存、效期、安全库存缺口等)。右上角铃铛实时显示待办总数,点击直达对应单据。

图 4-1 登录页

图 4-2 控制台工作台:待办直达 + 风险提醒 + 系统概览
4.3 报价管理
报价单支持双价(销售价/参考成本价)与毛利率即时测算,审批通过后可一键转客户订单(幂等,重复转换不重复建单)。报价列表即见毛利率与审批状态;报价统计页支持按月份/客户/业务员等多维汇总。

图 4-3 报价列表(毛利率、审批状态)
4.4 客户订单
客户订单采用「头—行—子行」三层结构:子行是交货与批次关联的最小单位,拆分规则为「一行多交期/多批次时拆子行,子行拆分后不可改、作废后不复用」。订单确认后进入可交货状态;已交数量按实际出库单统计(不读订单上的冗余字段),与订单统计口径同源。

图 4-4 客户订单列表(毛利率列仅内部账号可见)
4.5 背靠背采购
从客户订单一键生成采购订单(背靠背):逐行带出物料与数量;对供应商的备注自动净化(不含客户名称与客户订单号,防止客户信息外泄到供应链);支持交期回复与到货跟催;采购收货按箱级计划收货,入库生成批次追溯节点。

图 4-5 采购订单列表(源订单号、币种、已收数量)
4.6 仓储与库存
库存按「物料 + 仓库 + 批次」三维管理:批次余额页展示现存量、可用量、锁定量的同时,展示批次效期(最早入库节点 + 物料保质期实时推算,不落库、杜绝双份账)与安全库存缺口预警。批次追溯页可沿入库→出库→调拨→退回的节点链路完整回溯每一批货物。仓间调拨不改变批次身份,发货记在途、收货才入账。

图 4-6 库存批次余额(效期与效期状态列)
4.7 月别盘点
按月建立盘点单,盘点期间软锁相关库存动作(排除本单自身与未来时间戳节点);盘点行生成时以账面数量为占位,录入实盘后以 is_counted 标记账实可信度;提交后按差额自动生成盘盈入/盘亏出节点,成本差异进入库存成本明细。

图 4-7 月别盘点报表(期初/实盘/差异金额)
4.8 交货出库与结算
交货单审核后执行出库:扣减批次余额、生成出库追溯节点,并在同一事务内生成 ASN 发货报文(外部接口失败不影响业务主流程,报文进入重试/死信队列人工处理)。支持直发(不经库存);退货分销售退货与采购退货双机制。开票按发票分摊金额到订单行形成应收台账,发票与台账金额可勾稽核销(差异实时计算并留痕,不做「已处理」假状态)。
4.9 统计报表与经营看板
订单统计提供接单/发货/开票三个口径(分别按下单日/发货日/开票日归属),口径写死在代码不做配置——保证所有人看到同一套数。金额一律不含税、税额单列;多币种按汇率折算;作废单不计入、已关闭计入;已交数量与发货口径一致。经营看板汇总 KPI、客户发货占比、物料发货 TOP、库存分布、交期达成率与风险提醒。

图 4-8 订单统计(三口径切换 + 交期达成率 + 明细)

图 4-9 经营指挥看板(KPI + 三口径趋势 + 风险区)
4.10 单据打印
报价/订单/采购/交货/对账单均提供 A4 打印模板:作废单据带水印标识、读取即写打印审计;对外单据按字段白名单输出(报价与订单不含成本毛利,采购单不含客户信息),浏览器打印或另存 PDF 均可直接使用。

图 4-10 销售订单打印模板(A4、含大写金额与签章位)
4.11 客户/供应商门户
门户账号与内部账号共用同一前端:门户只能访问白名单内的页面,查询范围被服务端强制限定在自己绑定的往来单位(越权访问返回 404,不泄露单据是否存在);响应中的成本、毛利、采购价、供应商、信用额度等内部字段由中间件统一裁剪——「界面上没有」与「响应里没有」同时成立。

图 4-11 客户门户:仅见自己绑定的订单,无毛利率/拼单组列

图 4-12 客户门户订单详情:无成本/毛利/供应商,无内部动作按钮
5 安全与权限体系
5.1 三层边界
|
层次 |
机制 |
定位 |
|
前端 |
菜单按角色下发、按钮按权限点 v-if 隐藏 |
只是交互体验,不构成安全边界 |
|
服务端 |
接口 require_perm 权限点 + 状态机流转 + 软删 + CHECK 约束 + 审计中间件 + 门户 scope 强制覆盖 |
真正的安全边界;越权一律 404 |
|
脚本域 |
CLI 直连数据库完全绕过登录与权限 |
ops_guard 闸门:默认只连演示库,越过需显式环境变量并留痕 |
权限核对由只读巡检 perm_audit –strict 完成(角色授权 / 端点门控 / 门户白名单 / 脚本裸删 / CLI 闸门五类检查),作为交付门禁使用(有 ERROR 即失败)。
5.2 审计留痕
所有写操作(含登录取证与敏感查询)写审计日志:操作日志(账号/模块/动作/方法/IP/结果/耗时)、登录日志、状态迁移日志三类;单据修改记录字段级 diff(改前/改后值),查询接口直接回放。审计日志自身被导出时同样留痕(谁导走了日志)。

图 5-1 审计日志(操作/登录/状态迁移三类)
6 系统设计合理性评估
本章从架构角度回答「这套系统设计得是否合理」:先列支撑该结论的核心设计,再列体检发现并已修复的问题,最后列已知的不合理点/局限与改进建议。
6.1 合理且经过验证的核心设计
(1)口径唯一真相源
订单统计、经营看板、控制台待办、应收账龄、勾稽、信用与效期预警,全部调用同一批统计模块(如 sales/order_report.py、report/stock_aging.py),不允许各处自算一份。收益:任何口径修正只改一处,报表之间天然一致。这是报表类系统最容易腐烂的地方,本系统从结构上杜绝了。
(2)不存第二份账
批次效期实时推算不落库;月结关账只做写入闸门不做余额快照;单据变更留痕用字段 diff 写审计而不建版本表。凡是可以从既有数据推导的,一律不存副本——避免副本与真值漂移这一 ERP 系统最常见的腐化路径。
(3)只预警不拦截(软控优先)
信用超限、批次过期、安全库存缺口统一只提示不阻断,成功路径一行不改。业务规则变更(改为硬拦截)是显式决策,而不是 bug 修复——避免了「为了修数据顺手改业务」的失控。
(4)三层权限边界 + 错误分层
前端隐藏只是体验;服务端权限点/状态机/软删/CHECK/审计才是边界;脚本域有独立闸门。错误语义分层清晰:业务错 200+code=1、状态冲突 409、越权 404(不泄露单据存在)、系统错 500。
(5)对外纪律落在响应层
门户数据隔离不靠前端隐藏:服务端 scope 强制覆盖查询参数,响应中间件按黑名单递归删键。新加字段默认被兜住,不会因为某个新接口忘了裁剪而泄漏(本轮体检正因此发现并修复了打印页之外的接口泄漏)。
(6)软删 + 闸门 + 审计的组合
业务数据一律软删可追溯;数据库结构只增不改(schema_guard 把 CHECK 枚举纳入比对);种子即授权真相源(重跑 init_db 收敛授权,杜绝权限漂移)。
(7)脚本化验收 + 真实浏览器取证
30 个 verify 脚本 1129 条断言随每次交付全量回归;关键交互必须 Playwright 真实浏览器取证并逐张人工复核截图。本轮体检证明其价值:API 全绿的页面上仍抓到一个真实的页面级崩溃。
6.2 本轮体检发现并已修复的问题
系统体检(S8.16)对 49 个页面做了真实浏览器巡检,逐页断言无 JS 运行时异常且关键内容渲染。结果如下:
|
问题 |
根因 |
修复 |
|
对端配置整页白屏(真崩溃) |
前端 watch 取值函数在 formData 声明前建立,访问未初始化变量(TDZ),整页 JS 崩溃;而 API 级验收 verify_s6f 43/43 全绿——只测接口发现不了页面级崩溃。 |
已修复:watch 移至 formData 声明之后;并将「watch 建立即执行」的静态扫描写入 verify_s8p A 组防回退,同时确立「新页面交付前必须至少一次真实浏览器渲染断言」纪律。 |
|
客户门户首日即泄漏内部数据 |
打印页做了字段白名单,但订单接口 JSON 未净化:门户请求把单位成本、毛利率、供应商、信用额度、变更记录全部发给客户。 |
已修复:core/portal.py 增加递归删键裁剪器(黑名单覆盖成本/毛利/采购价/供应商/信用/内部留痕),main.py 响应中间件统一裁剪;内部账号零影响(verify_s8o E6 反向断言)。 |
|
门户列表页弹「无权访问」红条 |
列表页无条件拉取内部拼单组下拉,门户账号被 403,用户误以为整页无权限。 |
已修复:页面级下拉一律 Promise.allSettled,门户身份直接不请求内部下拉(「不请求」优于「请求失败静默」)。 |
6.3 已知不合理点与遗留风险
以下问题在体检中如实记录、未经处理(改配置或动数据均需业务确认后另行执行):
|
事项 |
等级 |
现状 |
建议 |
|
状态机死链 |
中 |
采购单的 SUBMITTED→CONFIRMED→RECEIVING→RECEIVED 链从未被使用(库内 0 张单据、代码无字面量);交货单 PICKED 状态同时存在「发运」「出库」两条正向边,草稿会同时出现两个动作按钮。 |
建议:删除约 5 条 sys_state_cfg 死边(改配置数据,需业务确认后执行)。 |
|
软删数据残留 |
低 |
验收脚本的历史清理只做软删,演示库残留采购单 9/11、交货单 50/51 等软删行;不影响功能与统计口径,但主数据列表按「含已删」过滤前会显得脏。 |
建议:扩展现有 demo_cleanup.py 增加定向回收(脚本默认 dry-run,需授权后执行)。 |
|
单法人设计 |
低(已裁定维持) |
系统按单法人单库设计,约 40 张单据/台账表无 company 字段,无法按法人隔离数据;供应商/客户不是「公司」,部门级数据范围隔离(本人/本部门/全部)亦未实现。 |
建议:确需多法人应单独立项(加列+回填+按公司拆库存/台账/发号器),不在现版本内混合改造。 |
|
salcpo_sub.delivered_qty 死字段 |
低 |
出库从不回写该字段(只有期初导入写过),订单列表「可下推交货」筛选仍读它,表现失真。 |
建议:筛选改查实际出库(与订单统计同源),属小改动,列入待办。 |
|
CLI 完全绕过权限 |
中 |
scripts/ 下运维脚本直连 .env 凭据,绕过登录与权限点;已有 ops_guard 闸门(默认只连演示库、越过需显式环境变量+留痕),但连接账号仍是 sa。 |
建议:为脚本建立专用低权限数据库账号,去掉 sa 依赖(已有清单待办)。 |
|
备份磁盘不自动回收 |
低 |
backup_db.py –retention 只归档旧清单文件,服务器上的 .bak 不自动删除,长期运行需人工关注磁盘。 |
建议:接入磁盘水位告警或由 DBA 侧定期清理。 |
|
预警为软控 |
按业务裁定 |
信用超限、批次过期、安全库存缺口均只预警不拦截(统一「只预警不拦截」纪律);如需硬控属业务规则变更。 |
建议:与业务确认哪些场景需要硬拦截后逐项开启(K3 过期批次出库拦截已在待办)。 |
|
接口协议覆盖 |
低 |
对端适配目前实现 MOCK 与 REST/ODATA,AS2 协议返回明确的未实现错误(fatal E30);真实 EDI/AS2 联调未开展。 |
建议:与对端确认协议后补充适配器(接口签名已预留)。 |
7 质量保障体系
7.1 验收脚本基线
共 30 个验收脚本、合计 1129 条断言,覆盖每个功能切片;任何一次交付(含文档与配置变更)都跑全量回归,全绿才允许交付。断言一律写「包含/不少于」而非「等于」,保证新增切片不会让历史脚本误报。全表见附录 A。
7.2 三道门禁
- 结构闸门 schema_guard:表/列/PK/索引/CHECK 五类比对,只增不改。
- 权限巡检 perm_audit –strict:授权、端点门控、门户白名单、脚本裸删、CLI 闸门五类只读检查,ERROR 即失败。
- 截图取证:关键页面与交互必须真实浏览器截图并逐张人工复核;列表类断言配合几何断言(防止长表格/长抽屉被视口裁剪)。
7.3 回归纪律
回归脚本红了先查残留数据(时间窗断言容易被历史造数污染),确认是代码缺陷才改代码;每修复一处缺陷必须同步撤掉对应的「兜底断言」,防止兜底逻辑把回归吞掉。
8 接口集成
8.1 对端配置与协议分发
外部系统(EDI 报文、3PL 物流、SAP 财务等)在「对端配置」页维护:协议、发送地址、认证方式、超时与退避策略。协议由适配器层分发(MOCK 模拟对端 / REST·ODATA 真实 HTTP / AS2 预留返回明确未实现错误)。密钥只在配置里存环境变量名(secret_ref),真实值走环境变量读取——库里、接口响应里、日志里都不出现明文。

图 8-1 对端配置(协议、认证、超时退避、连通性测试)
8.2 Outbox 派发与死信
- 出库与 ASN 报文生成在同一数据库事务内完成(Outbox 模式),不会出现「业务成功但报文丢失」。
- 派发由显式触发(POST /int/dispatch),不起后台线程;业务拒绝(对端返回 accepted=false)一次判死信不耗退避,网络类错误按退避重试。
- 对端停用时派发记 skipped,报文保持待发——「没发」与「发失败」语义分离。
- 重放重置同一条报文而非新建;报文按月归档导出,删除需显式确认且不删仍被队列引用的报文。
8.3 日对账
按日生成收发对账(发货/收货/调整三类流水与本方单据逐一核对),差异清单进入日对账页人工处理;对账口径唯一来源于 reconcile.py,与报表统计同源。
9 运维保障
9.1 日常运维日报
ops_daily.py 一条命令完成:报文派发 → 接口归档 → 数据库备份 → 风险扫描,整批加数据库级应用锁(计划任务重叠时跳过且退 0)、fail-soft(单步失败不阻断后续步,退出码非 0),每步耗时与退出码写运维日志。风险扫描直接复用看板的 build_risks,不另设阈值。
9.2 备份与恢复
backup_db.py 全量备份 + VERIFYONLY 校验 + 26 张核心表行数清单;升级/加列前必跑。清单按保留期归档;服务器上的 .bak 文件不自动删除(磁盘回收由人工或 DBA 侧处理)。接口报文归档默认只导出不删,物理删除需双重确认参数。
10 使用指引摘要
面向操作用户的完整手册见交付包根目录《使用说明.md》,此处仅摘要:
- 入口:浏览器访问 http://<服务器IP>:8000;账号由管理员在「系统管理→用户管理」分配;门户账号自动落到自己的首个菜单。
- 全局搜索:任意页面按 Ctrl+K 呼出全局搜索(单号/客户/物料直达)。
- 主流程操作次序:报价 → 报价审批 → 转客户订单 → 订单确认 → 背靠背生成采购单 → 采购收货 → 库存入库 → 交货出库 → 开票 → 对账单。
- 待办直达:工作台与右上角铃铛的每一行都可直接跳到对应单据处理;列表页支持 URL 预置筛选(从待办跳转自动带条件)。
- 导入导出:主数据与期初建账在「导入导出中心」两段式操作(先预检看行级错误,再提交);任意列表页「导出 Excel」与所见即所得。
- 打印:详情页「打印」进入 A4 打印视图,浏览器打印或另存 PDF。
- 常见问题:页面样式错乱先 Ctrl+F5 硬刷新(前端发版后旧缓存引用的样式文件已不存在);「无权访问」先核对角色授权;接口报文堆积在对端配置页做连通性测试后排障。
11 交付物清单
|
交付物 |
位置 |
说明 |
|
后端源码 |
backend/ |
app/ + config/ + requirements.txt |
|
前端源码与构建产物 |
frontend/ |
src/ + dist/(可直接由后端托管) |
|
数据库 DDL |
database/schema |
18 个建表脚本 + 结构基线 |
|
初始化与种子脚本 |
database/data + scripts/init_db.py |
幂等初始化:建库→建表→种子→管理员→发号器对齐 |
|
增量迁移 |
database/migrations |
含回滚脚本,migrate.py 执行 |
|
验收与运维脚本 |
scripts/ |
30 个 verify + 截图取证 + 闸门 + 运维日报/备份 |
|
文档 |
docs/ + 使用说明.md |
需求、拆解、分期规范、清单、本说明文档 |
|
交付配图 |
docs/delivery/shots/ |
本说明文档全部截图(2026-11-07 最新界面) |
|
《系统开发说明文档》 |
交付包根目录 |
本文档(Word) |
不含项:.env(含明文凭据)、node_modules、.venv、__pycache__、开发过程截图归档、以及与通用开发模板相关的内部协作文档(CLAUDE.md、通用开发模板*.md、开发规范包-使用说明.md)。这些内容属于开发环境或内部协作资产,不随交付包分发。
附录 A 验收脚本基线全表
|
脚本 |
断言数 |
覆盖域 |
|
verify_s1 |
22 |
登录、主框架、菜单、工作台、审计骨架 |
|
verify_s2 |
49 |
用户/角色/菜单/字典/状态机/审计/配置 + 13 类主数据 |
|
verify_s3 |
64 |
报价→订单:双价、汇率、状态机、转单幂等、三层订单、拼单组 |
|
verify_s4 |
61 |
采购→收货→库存:背靠背、MRP、箱级收货、批次追溯 |
|
verify_s5 |
83 |
交货→退货→结算:出库节点、直发、借还、开票分摊、AR/AP |
|
verify_s6a |
23 |
导入框架:模板注册、预检/提交两段式、四层校验 |
|
verify_s6b |
40 |
期初建账与盘点调整:建账锁、盘点差额节点 |
|
verify_s6c |
49 |
门户与变更历史:scope 隔离、台账方向、404 语义 |
|
verify_s6d |
40 |
接口内核:outbox、报文、队列、重试 |
|
verify_s6e |
44 |
出库与 ASN 同事务、派发、死信、重放 |
|
verify_s6f |
43 |
对端配置:协议分发、探针、密钥引用 |
|
verify_s7a |
19 |
月别盘点:软锁、is_counted、报表口径 |
|
verify_s7b |
57 |
订单统计三口径:已交按实际出库、维度白名单 |
|
verify_s7c |
62 |
经营看板:KPI、风险复用、流式布局 |
|
verify_s7d |
21 |
控制台待办:9 组待办、权限裁剪 |
|
verify_s8a |
48 |
待办直达与预置筛选、盘点借货造数 |
|
verify_s8b |
28 |
已交口径修正(按实际出库) |
|
verify_s8c |
19 |
状态机补边:字典状态≠状态机边 |
|
verify_s8d |
11 |
字典与配置收口 |
|
verify_s8e |
22 |
作废状态机:对账单作废补边 |
|
verify_s8f |
20 |
源码域回归 |
|
verify_s8g |
19 |
列表导出与审计 |
|
verify_s8h |
46 |
批量选单与导出纪律 |
|
verify_s8i |
38 |
账号到期、登录锁定等安全项 |
|
verify_s8j |
34 |
权限加固:种子即授权真相源 |
|
verify_s8k |
47 |
库存库龄与呆滞双口径 |
|
verify_s8m |
46 |
调拨/关账/附件 |
|
verify_s8n |
31 |
预警与留痕:信用/效期/安全库存软控 |
|
verify_s8o |
26 |
铃铛/门户对外纪律/权限分层 |
|
verify_s8p |
17 |
页面可用性、TDZ 防回退、文档一致性 |
合计:30 个脚本 / 1129 条断言。另:权限巡检 perm_audit –strict ERROR 0 / WARN 0;结构基线 96 表 / 1556 列 / 167 CHECK。
网硕互联帮助中心





评论前必须登录!
注册