# 泰国批次回款记账系统：需求与维护记录

最后更新：2026-05-11  
用途：保存当前对话确认过的业务规则、页面要求、服务器位置和后续修改注意点。后续继续开发前，先阅读本文件。

## 服务器与部署

- 域名：`https://1.92.club`
- 服务器 IP：`8.218.220.75`
- 站点目录：`/www/wwwroot/1.92.club`
- 主程序文件：`server.py`
- 前端文件：`index.html`、`app.js`、`styles.css`
- SQLite 数据库：`/www/wwwroot/1.92.club/ledger.sqlite3`
- systemd 服务：`thai-ledger-1-92-club.service`
- 后台/SSH 密码不写入本文档，避免明文泄露。
- 已启用登录保护，账号目前为 `admin`。
- 已启用 HTTPS 证书。
- 页面缓存要求：不要长期缓存实时账本数据，服务端返回 `no-store`，前端文件更新时用版本号刷新。
- 登录空闲要求：页面超过 5 分钟无操作，强制退出并重新登录。

## 总体业务逻辑

这是一个用于记录中国人民币进货、泰国泰铢销售、泰铢兑换人民币回款的账本系统。

核心原则：

- 采购资金余额和库存成本不能混在一起算。
- 剩余人民币是可采购的钱。
- 库存成本余额是目前货物还没有通过人民币回款抵扣掉的成本。
- 初始数据是建账时已有的资金和库存，后续不应让第一次建账导致采购资金变成负数。
- 初始泰铢现金、初始泰铢银行都属于待换人民币余额，会和后续确认收款叠加。
- 泰铢收入先在泰国，只有兑换成人民币后才进入人民币回款、回本和利润计算。

## 建账设置

建账设置只用于第一次录入，后期基本不动。

需要保存：

- 期初人民币。
- 期初泰铢现金。
- 期初泰铢银行。
- 期初产品剩余数量。
- 期初产品当时进货价。
- 二次投入本金，投入本金需要单独保存按钮。

注意：

- 期初产品选择应使用产品下拉框。
- 期初不需要规格。
- 期初账本剩余金额不要额外展示。
- 初始泰铢现金/银行应作为待换余额进入泰铢现金池/银行池。

## 产品页

产品页用于维护产品基础资料和售价，不用于录入库存流水。

需要显示/支持：

- 产品编号按 `01`、`02`、`03` 顺序展示。
- 产品名称只维护一份，其他页面调用同一个产品名称。
- 可新增产品。
- 可删除产品。
- 售价为泰铢，后续销售单自动调取。
- 当前库存。
- 总销量。
- 库存排序按钮。
- 销量排序按钮。
- 高到低/低到高切换按钮。
- 最近采购成本：显示人民币进货价、采购日期，并按汇率折算成泰铢。
- 产品页旁边有成本汇率设置：`1 人民币 = ? 泰铢`。
- 如果售价低于最近采购成本折算泰铢，应醒目标红提醒。
- 底部显示当前库存大致利润：用户输入汇率后，用当前库存、售价和库存成本估算利润。

已从用户提供的 Excel 填充过售价：Excel 中“进货价泰铢”作为产品页售价。

## 进货页

进货页用于登记到货批次。

规则：

- 默认只保留 3 行，需要更多时手动添加。
- 每行必须有：选中产品名称、数量、本次采购单价，才可提交批次。
- 产品名称使用下拉框。
- 规格不作为产品基础字段，但进货行里保留“规格数量/数量”输入概念，按实际采购数量填写。
- 进货金额默认人民币，并由数量和单价自动计算。
- 运费为必填项，不能默认空；没有运费时用户手动填 `0`。
- 扣减/优惠默认 `0`，填写扣减/优惠时需要二次确认。
- 可以保存草稿。
- 草稿显示在进货界面里。
- 可以“另起一份”新草稿。
- “保存批次”应叫“提交批次”，提交前需要二次确认。
- 进货栏目填错时，要有删除行按钮。
- 采购资金为 0 或不足时，应提示需要补充资金。

采购资金余额公式：

`期初人民币 + 二次投入 + 已兑换人民币回款 - 进货支出 - 利润支出`

库存成本余额单独计算，不和采购资金余额相加。

## 销售页

销售页用于登记销售单和待收款。

规则：

- 销售页面格式尽量与进货页面一致。
- 销售单保存后先进入“待确认收款”。
- 普通销售单保存后，库存立即扣减，因为货已经给出去了。
- 确认收到款项时，再选择收款方式：泰铢现金或泰铢银行。
- 确认收款后，该金额累计进入对应的泰铢余额池。
- 泰铢现金池/银行池中的钱后续兑换人民币时可以整笔扣，不和某一张销售单强绑定。
- 销售价格基本固定，从产品页售价自动调取。
- 销售栏需要添加行和删除行。
- 销售日期和普通销售单是主要区域。
- 无库存待收款用于记录没有销售单、也不扣库存的欠款，例如 `79800` 这类已核实库存、但还没收回的钱。
- 无库存待收款要醒目，并放在普通销售单下面一排。
- 无库存待收款确认收款后，也进入泰铢现金池或银行池。

删除规则：

- 删除待收款销售单时，如果有库存行，库存应恢复。
- 无库存待收款删除时，不影响库存。
- 如果该销售款所在的泰铢余额池已经有兑换人民币记录，删除或撤回收款前应先删除对应兑换记录，避免余额池扣减后变成错误。

## 待换人民币

这里不再按每张销售单逐笔兑换，而是按余额池兑换：

- 泰铢现金池。
- 泰铢银行池。

来源包括：

- 期初泰铢现金/银行。
- 普通销售单确认收款后的泰铢。
- 无库存待收款确认收款后的泰铢。

兑换规则：

- 用户选择从现金池或银行池换出泰铢。
- 填写本次换泰铢金额、汇率、手续费。
- 回款人民币可自动互算，也可手动调整。
- 兑换需要二次确认。
- 确认后从对应泰铢余额池扣减，并生成人民币回款记录。
- 人民币回款进入回本和利润计算。

## 收款记录

收款记录后期会很多，因此采用折叠方式。

默认只显示：

- 日期。
- 来源。
- 泰铢金额。
- 回款人民币。
- 备注。
- 操作。

点击展开后显示：

- 汇率。
- 手续费。
- 抵扣成本。
- 本次利润。

这样避免记录过多时表格横向拥挤、看错行。

## 利润与支出

其他方面支出需要从利润中扣除。

规则：

- 利润足够时，从利润里扣。
- 利润不够时，显示为负债。
- 支出记录可以删除。
- 支出会影响可采购人民币余额。

## 库存与校准

库存规则：

- 到货会增加库存。
- 普通销售单保存后立即扣库存。
- 删除有库存行的销售单后，库存恢复。
- 库存为 0 时，不能继续销售，应提示无法销售。
- 库存为负数时，总览里要标红。
- 首页总览需要库存筛选：全部、负库存、要补货、有库存、零库存。
- 库存需要可核对校准。
- 校准记录只保留最近 30 条。

## 首页总览

首页需要支持日期范围选择，用于查看：

- 销售额。
- 出货数量。
- 进货数据。
- 人民币回款。
- 利润。
- 库存成本余额。
- 可采购人民币余额。
- 进货建议。

智能进货建议：

- 根据当前日期范围内哪个产品出货量高，推荐下次进货数量。
- 库存低或负库存时，应更醒目。

## 页面排版要求

整体要求：

- 自适应手机尺寸。
- 产品名称列要给足宽度，能完整显示较长名称。
- 数字列可以更窄。
- 行间距不要太大。
- 默认靠左，上下居中；数字类可居中。
- 不要让一个页面内容过密，可拆成多个页面展示。
- 销售页面和进货页面格式保持一致。
- 弹窗要正规，不要浏览器原生简陋确认框。

## 数据库和代码注意点

当前系统已经是 SQLite 数据库长期保存，不是纯本地缓存。

重要文件：

- `/www/wwwroot/1.92.club/server.py`
- `/www/wwwroot/1.92.club/index.html`
- `/www/wwwroot/1.92.club/app.js`
- `/www/wwwroot/1.92.club/styles.css`
- `/www/wwwroot/1.92.club/ledger.sqlite3`

修改注意：

- 用户已要求：部署后应直接修改服务器版本，不要只改本地。
- 本地 `/Users/danaofu/Documents/New project 4` 可能不是最新线上版本，改动前以服务器为准。
- 修改前先备份相关文件或数据库。
- 修改 `index.html`、`app.js`、`styles.css` 后，更新文件引用版本号，避免浏览器缓存。
- 只改静态文件时通常不需要重启服务。
- 修改 `server.py` 或数据库结构后，重启 `thai-ledger-1-92-club.service`。
- 数据库操作前建议备份 `ledger.sqlite3`。

## 后续开发时优先检查

1. 先确认线上数据库数据是否正常，不要误判“页面没显示”为“数据丢失”。
2. 如果用户说数据没了，先检查是否被 5 分钟无操作退出到了登录页。
3. 检查 API：`/api/state` 是否能返回产品、期初库存、销售、收款等数据。
4. 改动前备份。
5. 改动后检查 `app.js` 语法。
6. 刷新浏览器后确认页面新版本加载。

