完善采购审批流程、企业微信通知和采购专用章
This commit is contained in:
@@ -1,133 +1,81 @@
|
||||
# 博特维采购订单管理系统
|
||||
|
||||
> 苏州博特维智能科技有限公司 · 本地采购订单管理系统(采购单 / 委外生产订单)
|
||||
>
|
||||
> 制单 → 主管审核 → 经理批准 → 导出 PDF 的全流程本地化工具,按贵司现有 Excel 单据模板套打。
|
||||
苏州博特维智能科技有限公司内部使用的采购单 / 委外生产订单系统。当前源码版本 v3,支持制单、单次审批、正式 PDF 归档、撤回、作废及变更重审。
|
||||
|
||||
---
|
||||
## 启动
|
||||
|
||||
## 功能特性
|
||||
|
||||
- **两种单据**:采购单、委外生产订单共用同一套数据,按原模板版式分别套打。
|
||||
- **两级审核**:制单员提交 → 主管审核 → 经理批准,每个动作写入审核记录,可追溯、可驳回。
|
||||
- **Excel 导入明细**:编辑页上传 `.xls` / `.xlsx`,自动识别表头(代码/规格/单位/数量/单价/交期/备注),行数不限,PDF 自动分页。
|
||||
- **供应商库 / 物料库**:制单时下拉带入名称、联系人、税号、单价等信息;支持行内编辑、停用/启用、删除,以及 Excel 批量导入(带模板下载)。
|
||||
- **金额大写**:合计自动转人民币大写(壹万贰仟叁佰肆拾伍元整)。
|
||||
- **审核盖章**:主管审核前须先「加盖审核章」,服务端二次校验,防止绕过;PDF 渲染红色审核专用章。
|
||||
- **历史查询与统计**:按单号 / 供应商 / 状态 / 单据类型 / 日期区间筛选;按状态、供应商、月份汇总金额。
|
||||
- **台账导出**:一键导出全部订单为 Excel。
|
||||
- **PDF 套打**:完全复刻原 Excel 模板版式,草稿/待审核状态带水印防止误用,已批准状态导出无水印正式版。
|
||||
|
||||
## 技术栈
|
||||
|
||||
| 层 | 技术 |
|
||||
|---|---|
|
||||
| 后端 | Python 3 + Flask 3 |
|
||||
| ORM | SQLAlchemy 2 |
|
||||
| 数据库 | SQLite(单文件 `po.db`,免部署) |
|
||||
| PDF | reportlab 4(中文套打 + 印章绘制) |
|
||||
| Excel | openpyxl 3 / xlrd 2 |
|
||||
| 打包 | PyInstaller(单文件版 / 文件夹版,免 Python 环境) |
|
||||
|
||||
## 目录结构
|
||||
需要 Python 3.11+。在项目根目录执行:
|
||||
|
||||
```text
|
||||
python -m pip install -r po_app/requirements.txt
|
||||
python po_app/app.py 8080
|
||||
```
|
||||
|
||||
打开控制台打印的访问地址,默认 `http://127.0.0.1:8080`。也可双击 `po_app/启动.bat`。
|
||||
|
||||
首次运行不创建演示账号。管理员须读取服务电脑上的 `po_app/instance/setup.token`,在首次设置页面创建管理员,再通过“用户”页分配制单员、审批员账号。初始/重置密码在首次登录时须更改。
|
||||
|
||||
局域网协作应由一台固定电脑运行服务,其他电脑用浏览器访问主机 IP。每台电脑单独启动 EXE 会形成不同数据库。已有 EXE 须从本版源码重新打包,不能通过替换源码自动升级 EXE。
|
||||
|
||||
**已有数据升级前,请阅读 [运行与升级说明](运行与升级说明.md)。** 程序会先备份旧数据库再执行增量迁移;重复单号会阻止升级,不能自动给历史单据改号。
|
||||
|
||||
## 主要能力
|
||||
|
||||
- 采购单和委外单,供应商/物料库、中文 XLS/XLSX 导入。
|
||||
- 草稿可暂存,“保存并提交”保证当前修改一起进入审批。
|
||||
- 数量、单价四位精度;逐行四舍五入到分再合计,页面、数据库和 PDF 使用同一口径。
|
||||
- 制单与审批由不同账号完成,管理员也遵守分工;审批员一次确认即可通过或驳回。
|
||||
- 制单员仅访问自己的订单,详情、复制、PDF、台账和统计使用统一权限。
|
||||
- 撤回、作废、批准后变更重审;每次提交保留内容快照,日志记录操作账号、姓名、环节及版本。
|
||||
- 审批通过时归档带一枚“采购专用章”的正式 PDF,后续下载保持该文件;草稿、驳回和作废单带对应水印。
|
||||
- 企业微信审批群通知、持久化发送队列、失败重试及过期待办跳过;管理员在“通知配置”页设置。
|
||||
- 公司 Wi-Fi 内手机审批,通知链接登录后回到对应订单;保留盖章确认、角色分工和版本校验。
|
||||
- 用户编辑、重置密码、启用和停用,以及旧会话失效。
|
||||
- 随机部署密钥、表单 CSRF 校验、请求独立事务、单号唯一约束、重复建单和旧页面操作保护。
|
||||
- 按状态、供应商、月份统计以及 Excel 台账导出。
|
||||
|
||||
图形审批章表示系统内部审批确认,不是第三方证书数字签名。金额分级、部门审批、企业微信个人定向通知、预算、到货和付款跟踪不在当前版本中。
|
||||
|
||||
## 项目结构
|
||||
|
||||
```text
|
||||
po_app/
|
||||
├── app.py # 主程序(路由 / 业务逻辑 / 审核流程)
|
||||
├── models.py # 数据库模型(用户 / 订单 / 明细 / 供应商 / 物料)
|
||||
├── pdf_export.py # PDF 套打 + 审核章绘制
|
||||
├── amount_cn.py # 金额转人民币大写
|
||||
├── requirements.txt # 源码运行依赖
|
||||
├── 启动.bat # 双击即启(源码方式)
|
||||
├── templates/ # Jinja2 模板
|
||||
├── static/ # CSS / JS / 资源
|
||||
├── 博特维采购订单系统.spec # 文件夹版打包配置
|
||||
├── 博特维采购订单系统_单文件版.spec # 单文件版打包配置
|
||||
├── 使用说明.md # 详细使用手册
|
||||
├── instance/ # 运行时数据库(.gitignore 排除,不入库)
|
||||
├── exports/ # 导出的 PDF(忽略)
|
||||
└── uploads/ # 上传的明细文件(忽略)
|
||||
tools/ # 开发期脚本:测试 / 打包验证 / git 推送
|
||||
app.py 服务入口、工作台、基础资料、用户、统计
|
||||
security.py 会话、认证、请求事务、首次设置
|
||||
order_routes.py 制单及审批操作、PDF 和版本查看
|
||||
order_logic.py 权限、校验、金额、提交快照
|
||||
notifications.py 企业微信群通知、事务队列与后台发送
|
||||
notification_routes.py 管理员通知配置、测试通知和重试
|
||||
models.py 数据模型及固定精度字段
|
||||
migrations.py 旧 SQLite 数据升级和自动备份
|
||||
money.py Decimal 计算与舍入规则
|
||||
excel_io.py XLS/XLSX 读取和上传文件名处理
|
||||
pdf_export.py PDF 排版、内部审批图形章
|
||||
amount_cn.py 人民币大写
|
||||
templates/ 页面模板
|
||||
static/ 样式、精确金额预览
|
||||
instance/ 数据库、部署密钥、备份(不入库)
|
||||
tests/ 隔离回归测试
|
||||
tools/ 备份、测试和浏览器验收脚本
|
||||
```
|
||||
|
||||
> 仓库仅含**源码与配置**;数据库、构建产物、运行时数据均经 `.gitignore` 排除,不入库。
|
||||
可用 `PO_DATA_DIR` 更改数据目录,`PO_HOST` 更改绑定地址。服务使用 Waitress。历史上传和导出目录同样不入库;新批准的正式 PDF 存在数据库的版本归档中。
|
||||
|
||||
## 快速开始
|
||||
企业微信接入及内网手机访问步骤见 [运行与升级说明](运行与升级说明.md#企业微信通知与公司-wi-fi-手机审批)。通知默认关闭,须配置真实 Webhook 和手机可达的内网地址后启用。源码测试使用模拟发送器,不会向真实群发消息。
|
||||
|
||||
三种运行方式任选其一:
|
||||
## 检查和备份
|
||||
|
||||
1. **单文件 EXE(推荐分发)**
|
||||
`po_app/dist/博特维采购订单系统_单文件版.exe`,拷贝到任意文件夹双击即用,免 Python 环境。
|
||||
|
||||
2. **文件夹版 EXE(启动最快)**
|
||||
复制 `po_app/dist/博特维采购订单系统/` 整个文件夹,双击其中的 exe 秒开。
|
||||
|
||||
3. **源码运行**
|
||||
安装依赖后双击 `po_app/启动.bat`,或命令行:
|
||||
|
||||
```bash
|
||||
cd po_app
|
||||
pip install -r requirements.txt
|
||||
python app.py 8080
|
||||
```
|
||||
|
||||
访问地址 <http://127.0.0.1:8080>;局域网其他电脑把 `127.0.0.1` 换成宿主机的局域网 IP(需放行 8080 端口)。
|
||||
EXE 版数据落在 exe 同级的 `instance/po.db`,备份即复制该文件夹。
|
||||
|
||||
## 初始账号
|
||||
|
||||
| 账号 | 密码 | 角色 | 权限 |
|
||||
|---|---|---|---|
|
||||
| admin | admin123 | 系统管理员 | 全部功能,含用户 / 供应商 / 物料维护 |
|
||||
| maker | 123456 | 制单员 | 新建、编辑、提交订单 |
|
||||
| reviewer | 123456 | 主管审核 | 审核通过或驳回 |
|
||||
| approver | 123456 | 经理批准 | 批准后订单生效,可出正式 PDF |
|
||||
|
||||
> ⚠️ 正式使用前请在「用户」页改掉默认密码。
|
||||
|
||||
## 业务流程
|
||||
|
||||
```
|
||||
制单员新建订单 → 填写抬头与明细 → 提交
|
||||
↓
|
||||
主管审核(通过 / 驳回并填原因)
|
||||
↓
|
||||
经理批准(通过 / 驳回并填原因)
|
||||
↓
|
||||
状态 = 已批准 → 导出 PDF(无水印,带审核人姓名与时间)
|
||||
```text
|
||||
python -m pip install -r requirements-dev.txt
|
||||
python -m pytest tests -q
|
||||
node tests/test_money_js.cjs
|
||||
python tools/browser_smoke.py
|
||||
python tools/backup_db.py
|
||||
```
|
||||
|
||||
- 草稿 / 待审核 / 待批准状态导出的 PDF 带斜向水印,避免误用。
|
||||
- 被驳回的订单回到制单员名下,可修改后再次提交。
|
||||
浏览器验证依赖本机 Microsoft Edge;仅操作临时服务和临时数据库。测试输出在 `tools/out/`,不提交真实业务数据。
|
||||
|
||||
## PDF 套打版式
|
||||
|
||||
完全复刻原 Excel 模板:
|
||||
|
||||
1. 公司名 + 单据名称(采购单 / 委外生产订单)
|
||||
2. 抬头区:左供方、右需方(含采购单号、采购日期、税点、税号等)
|
||||
3. 明细表 9 列:序号 / 物料代码 / 物料规格 / 单位 / 数量 / 含税单价 / 金额 / 交期 / 备注(列宽取自原模板)
|
||||
4. 合计:小写 + 人民币大写 + 元整
|
||||
5. 备注条款 + 交货地点(苏州工业园区星汉街 5 号腾飞新苏工业坊 B 幢 5 楼 05-06 单元)
|
||||
6. 签署区:制单 / 主管审核 / 经理批准(含姓名与时间)+ 双方盖章栏
|
||||
7. 页脚:单据类型、单号、页码、打印时间
|
||||
|
||||
明细超过一页时自动分页并重复表头,合计与条款跟随在最后一页。
|
||||
|
||||
## 数据文件与备份
|
||||
|
||||
| 文件 | 说明 |
|
||||
|---|---|
|
||||
| `instance/po.db` | SQLite 主数据库,整个文件夹复制即备份 |
|
||||
| `exports/` | 导出的 PDF |
|
||||
| `uploads/` | 上传的明细文件 |
|
||||
|
||||
## 重新打包说明(开发)
|
||||
|
||||
```bash
|
||||
# 打包前务必先备份 instance/ 与 exports/,PyInstaller 重建文件夹版会清空 dist
|
||||
python -m PyInstaller "博特维采购订单系统[_单文件版].spec" --noconfirm --clean
|
||||
```
|
||||
备份、恢复、升级限制、完整操作规则及验收步骤见 [运行与升级说明](运行与升级说明.md)。首次检查的历史问题见 [项目检查记录](项目检查-20260916.md),该记录描述修复前版本。
|
||||
|
||||
## 许可
|
||||
|
||||
|
||||
Reference in New Issue
Block a user