Files
inventory/README.md
wangbeihong 10da4c2859 feat:集成 LCSC 产品 API 用于袋子管理
- 增加了 LCSC API 集成,可利用 app_id、access_key 和 secret_key 获取产品详情。
- 实现了用于安全 API 请求的一次性和签名生成。
- 通过新端点提升包容量管理,更新插槽容量。
- 更新界面,支持 LCSC 产品直接导入袋口。
- 改进了 API 响应和用户输入验证的错误处理。
- 重构箱子渲染逻辑,以适应新的包包功能和展示产品详情。
- 为与 LCSC 产品信息相关的新 UI 元素添加了 CSS 样式。
- 更新了 AI 设置页面,包含了 LCSC API 配置选项。
2026-03-12 13:46:28 +08:00

347 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 电子元件库存管理系统 v1.0
一个基于 `Flask + SQLite` 的轻量库存系统,适合先本地开发,后续部署到宝塔服务器。
当前支持三类容器:
- `28格小盒大盒`:常见 4 连排小盒(竖向 7 排)。
- `14格中盒大盒`:中等盒子,无固定摆放图。
- `袋装清单`:防静电袋列表模式(每行一个袋位,支持批量新增)。
- `袋装清单` 为固定容器(系统内置一个大盒),不需要新增/删除盒子。
v1.1 新增能力:
- 支持盒子改名和删除。
- 新增盒子时可设置 `前缀 + 起始序号`,内部编号自动递增。
- 盒子名称自动生成:`基础名称 + 编号范围`,重名自动加 `#2/#3`
- 首页可直接看到每个盒子的编号范围(如 `A1-A28`)。
- 首页新增概览按钮:快速查看已启用的编号与名称。
- 编辑页支持 `启用/停用`
## 1. 项目结构
```text
inventory/
├── app.py
├── requirements.txt
├── init_db.py
├── data/
│ └── inventory.db # 首次初始化后生成
├── templates/
│ ├── index.html
│ ├── box.html
│ ├── edit.html
│ └── stats.html
└── static/
├── css/
│ └── style.css
```
## 2. 本地运行
### 2.1 安装依赖
```bash
pip install -r requirements.txt
```
### 2.2 初始化数据库
```bash
python init_db.py
```
初始化后会生成:`data/inventory.db`
### 2.3 启动服务
```bash
python app.py
```
默认访问:`http://127.0.0.1:5000`
### 2.4 可选:启用 AI 补货建议(硅基流动)
在启动前设置环境变量:
```powershell
$env:SILICONFLOW_API_KEY="你的APIKey"
$env:SILICONFLOW_MODEL="Qwen/Qwen2.5-7B-Instruct"
```
可选变量:
- `SILICONFLOW_API_URL`(默认:`https://api.siliconflow.cn/v1/chat/completions`
- `SILICONFLOW_TIMEOUT`(默认:`30` 秒)
仓库概览页点击 `AI补货建议` 按钮即可调用接口。
也可在页面中直接配置参数:
- 入口:`仓库概览` -> `AI参数`
- 页面:`/ai/settings`
- 保存文件:`data/ai_settings.json`
## 3. 页面说明
### 3.1 首页 `/`
- 首页已改为入口跳转到 `仓库概览` 页面。
### 3.1.1 仓库概览 `/types`
- 展示三类独立界面入口:`28格小盒大盒``14格中盒大盒``袋装清单`
- 每类入口显示当前容器数量,点击进入单独分类页面。
### 3.1.2 分类独立页 `/type/<box_type>`
- 每个分类使用独立页面,避免容器变多后的长页翻找。
- 页面内支持新增、设置、删除,并在操作后停留在当前分类页。
### 3.2 盒子详情 `/box/<box_id>`
- `28格/14格`:格子视图,点格子进入编辑。
- `袋装清单`:表格视图,支持单条新增和批量新增。
- `袋装清单` 仅使用编号前缀(如 `BAG`),不设置编号范围。
- `28格/14格` 支持快速入库:多行粘贴后自动分配空位。
- `28格/14格/自定义容器` 支持立创编号入库:进入对应格位编辑页后输入编号,自动拉取商品基础信息并写入当前格位。
- 支持按当前盒子导出打标 CSV仅导出启用记录可用于热敏打标机导入。
- 打标 CSV 列名为中英双语格式(如 `料号(part_no)``备注(note)`),便于直接识别。
### 3.3 编辑页 `/edit/<box_id>/<slot>`
- 编辑料号、名称、规格、数量、备注。
- 通过按钮启用/停用。
- 可删除当前格子记录。
### 3.4 统计页 `/stats`
- 独立统计页,仅展示核心指标:`库存总量 / 分类占比 / 变动趋势`
- 支持 `7天``30天` 视图切换:`/stats?days=7``/stats?days=30`
- 支持分类筛选:`/stats?days=30&box_type=small_28`(可选值:`small_28``medium_14``custom``bag``all`)。
- 趋势图基于库存变动日志实时计算,来源包括:新增、快速入库、启用/停用、删除。
- 说明:升级前的历史操作不会自动回溯写入日志,趋势从启用该版本后开始逐步真实化。
- 新增最近操作时间线(最新 20 条),便于追踪库存变化来源。
- 筛选到单一分类后,指标会切换为更有意义的数据:`分类库存占比 / 周期操作次数 / 活跃天数 / 分类内元件Top`
- 支持趋势数据导出 CSV`/stats/export?days=7&box_type=all`(包含 `daily_delta` 日增减列)。
- 支持清除统计日志(当前筛选或全部),仅影响统计与趋势,不影响库存数据本体。
### 3.5 快速搜索与出库 `/search`
- 支持按 `料号``名称` 搜索已启用元件。
- 搜索结果可一键跳转到对应盒位编辑页。
- 支持快速出库:只填写数量即可扣减库存,并写入统计日志。
### 3.6 AI 补货建议 `/ai/restock-plan`
- 基于低库存清单和最近 30 天出库数据生成补货建议。
- 未配置 `SILICONFLOW_API_KEY` 时会返回明确错误提示。
### 3.7 AI 参数设置 `/ai/settings`
- 支持页面内编辑:`API URL / 模型名称 / API Key / 超时 / 低库存阈值 / 建议条目上限`
- 支持页面内编辑立创接口参数:`Base URL / Path / API Key / Header / Prefix / 请求编号字段 / 超时`
- 保存后立即生效,无需改代码。
### 3.8 立创编号入库 `/edit/<box_id>/<slot>/lcsc-import`
- 请求方式:`POST`
- 表单字段:
- `lcsc_product_id`:立创商品编号(默认按文档使用整数 `productId`
- `quantity`:写入数量
- 导入逻辑:
- `part_no` <- `productModel`(兜底 `productCode`
- `name` <- `productName`
- `specification` <- `brandName / encapStandard / catalogName`
- `note` <- `LCSC productCode + productId`
- 鉴权支持:
- `JOP签名`(推荐,示例中的 `app_id/access_key/secret_key`
- `简单Header API Key`(兼容模式)
## 4. 袋装批量新增格式
在袋装清单页面的批量输入框里,每行一条,可用英文逗号或 Tab 分隔:
```text
料号, 名称, 数量, 规格, 备注
```
示例:
```text
10K-0603, 贴片电阻10K, 500, 0603, A袋, 常用
100nF-0603, 电容100nF, 300, 0603, B袋, X7R
```
说明:
- `料号``名称` 必填。
- `数量` 需为大于等于 0 的整数(留空按 0
- 无效行会跳过并提示。
## 5. 快速入库28格/14格
在盒子页面使用“快速入库”,每行一条:
```text
料号, 名称, 数量, 规格, 位置备注, 备注
```
规则:
- 自动放入当前盒子的空位。
- 同料号已存在时自动累加数量(不重复占位)。
- 格子满了会跳过并提示具体行号。
## 6. 自动编号规则(新增)
新增盒子时只需填写:
- `前缀`:如 `A``B``C``BAG`
- `起始序号`:如 `1`
系统自动生成内部编号:
- 第 1 位:`前缀 + 起始序号`
- 第 N 位:`前缀 + (起始序号 + N - 1)`
示例:
- 前缀 `A`、起始 `1`、容量 28 -> `A1-A28`
- 前缀 `B`、起始 `100`、容量 14 -> `B100-B113`
盒子名生成示例:
- 基础名称 `电阻盒` + 范围 `A1-A28` -> `电阻盒 A1-A28`
- 若发生重名会自动变为:`电阻盒 A1-A28 #2`
## 7. 元器件命名建议(简洁版)
为避免命名过长又保证可检索,建议:
- `料号(part_no)`:优先写厂家/采购料号,保持唯一。
- `名称(name)``品类 + 关键值 + 封装`,如 `电阻10K 0603``电容100nF 0603`
- `规格(specification)`:补充精度/耐压/温漂等必要信息,如 `1%``50V X7R`
推荐格式:
```text
名称: 电阻10K 0603
规格: 1%
```
```text
名称: 电容100nF 0603
规格: 50V X7R
```
### 7.1 轻量入库规范(推荐)
目标:字段尽量少,但保证后续能搜索、能区分、能补货。
最少必填3项
- `料号(part_no)`:优先填厂家型号(如 `STM32F103C8T6`)。
- `名称(name)``品类 + 型号/关键值`(如 `MCU STM32F103C8T6`)。
- `数量(quantity)`:当前实际库存数量。
建议选填2-3项
- `规格(specification)`:只写 2-4 个关键参数(如 `Cortex-M3 / 64KB Flash / LQFP-48`)。
- `位置备注(location)`:盒位或袋位(如 `A12``BAG4`)。
- `备注(note)`:来源或追溯信息(如 `LCSC item 9243` 或商品链接)。
不建议录入(避免复杂且易过期):
- 实时单价、促销价、交期、商城库存等动态信息。
推荐录入模板:
```text
料号: <厂家型号>
名称: <品类 + 型号/关键值>
规格: <封装 + 关键参数>
数量: <整数>
位置备注: <盒位/袋位>
备注: <来源编号或链接>
```
示例:
```text
料号: STM32F103C8T6
名称: MCU STM32F103C8T6
规格: Cortex-M3 / 64KB Flash / LQFP-48
数量: 10
位置备注: BAG4
备注: LCSC item 9243
```
## 8. 数据库说明
- 使用 SQLite文件路径`data/inventory.db`
- 库存变动日志表:`inventory_events`(用于统计页趋势计算)
- `inventory_events` 主要字段:`box_type``part_no``event_type``delta``created_at`
- 首次发布执行一次 `python init_db.py`
- 后续通常不需要重复初始化
## 9. 服务器部署(宝塔)
建议流程:
1. 上传代码或 `git clone` 到服务器。
2. 创建并启用虚拟环境。
3. `pip install -r requirements.txt`
4. `python init_db.py`
5. 用 Gunicorn 启动:`app:app`
6. 宝塔/Nginx 反向代理到 Gunicorn 端口
7. 域名解析 + SSL
建议 Gunicorn 仅监听内网:`127.0.0.1:5000`
## 10. 日常发布流程
本地开发后:
```bash
git add .
git commit -m "feat: xxx"
git push origin main
```
服务器更新:
```bash
cd /www/wwwroot/inventory
git pull origin main
source venv/bin/activate
pip install -r requirements.txt
```
最后在宝塔里重启 Python 项目。
## 11. 备份建议
重点备份:`data/inventory.db`
可按天备份,例如:
```bash
cp /www/wwwroot/inventory/data/inventory.db /www/backup/inventory_$(date +%F).db
```
## 12. 常见问题
### Q1: VS Code 提示无法解析 `flask` 导入
通常是编辑器没选到正确虚拟环境,不代表代码不能运行。切换解释器到项目 venv 即可。
### Q2: 为什么线上不能用 `python app.py` 长期跑
`python app.py` 是开发模式。生产请使用 Gunicorn或其他 WSGI并由宝塔托管。
### Q3: 本地和服务器数据库要实时同步吗
不建议 SQLite 双向实时同步。建议以服务器库为主,本地用于测试。