15 KiB
15 KiB
蝶雅采购智能体平台
采购部 AI 项目数据源 — 库存/出库/产品/采购一站式数据管理平台
目录
系统架构
整体结构
┌──────────────────────────────────────────────────────────┐
│ 钉钉云盘 (DingTalk Drive) │
│ ┌──────────────────┐ ┌──────────────────────────────┐ │
│ │ 日出库数据源文件 │ │ 库存数据源文件 │ │
│ │ 20260609-wdt-cksj │ │ 20260609-wdt-kcmx-01.csv │ │
│ │ 20260609-tmgj-cksj│ │ 20260609-wdt-kcmx-02.csv... │ │
│ └────────┬─────────┘ └─────────────┬────────────────┘ │
└───────────┼──────────────────────────┼────────────────────┘
│ dws drive download │ dws drive download
▼ ▼
┌──────────────────────────────────────────────────────────┐
│ 本地CSV缓存(tmp_csv/) │
│ reimport.py batch_import_inventory.py │
│ │ │ │
│ ▼ ▼ │
│ ├───────── MySQL ─────────┤ │
│ │ dy_data 数据库 │ │
│ │ daily_outbound │ │
│ │ inventory_detail │ │
│ │ products / bom │ │
│ │ suppliers / warehouses │ │
│ │ purchase_orders │ │
│ └──────────┬──────────────┘ │
│ │ │
│ ▼ │
│ Flask Web 应用 (app.py) │
│ Port 18888 │
└──────────────────────────────────────────────────────────┘
│
▼
浏览器访问 → http://服务器IP:18888
项目目录说明
dy-dashboard/
├── app.py # Flask 入口
├── run.py # 启动脚本(开发/生产模式)
├── config.py # 数据库 & 应用配置
├── deploy.sh # 一键部署脚本
│
├── routes/ # Web 路由 / API
│ ├── auth.py # 登录/权限
│ ├── dashboard.py # 仪表盘
│ ├── data.py # 日出库数据
│ ├── inventory.py # 库存数据
│ ├── products.py # 产品/BOM/供应商
│ ├── purchase.py # 采购单
│ ├── warehouse.py # 仓库管理
│ └── users.py # 用户管理
│
├── services/ # 业务逻辑层
│ ├── db.py # 数据库连接池
│ ├── cache.py # 缓存机制 (RefreshableCache)
│ ├── forecast.py # 销售预测
│ ├── inventory_calc.py # 库存计算
│ ├── product_type.py # 产品分类
│ ├── sales_calc.py # 销量统计
│ └── simple_cache.py # 简易缓存
│
├── templates/ # HTML 模板
├── static/ # CSS/JS/图片
│
├── auto_update.py # 定时自动更新入口
├── reimport.py # 日出库数据导入(全量重刷)
├── batch_import_inventory.py # 库存导入(批量下载钉盘)
├── import_new_inventory.py # 库存增量导入(动态检测新文件)
├── sync_dingtalk.py # 钉盘同步工具
├── update_data.py # 钉盘增量更新
│
├── import_inventory.py # 单个库存文件导入
├── import_suppliers.py # 供应商导入
├── import_warehouses.py # 仓库导入
├── import_purchase_order*.py # 采购单导入
├── init_db.py # 数据库初始化
│
├── tmp_csv/ # 钉盘缓存CSV(可重新下载)
├── logs/ # 运行日志
├── venv/ # Python 虚拟环境
│
├── .gitignore
├── README.md
└── deploy.sh
数据库说明
表一览
| 表名 | 记录数 | 大小 | 用途 |
|---|---|---|---|
inventory_detail |
~86万 | 175MB | 日库存明细 — 每个仓库每天商品库存快照 |
daily_outbound |
~7.5万 | 20MB | 日出库记录 — 各平台每日出库流水 |
products |
~8,600 | 3.4MB | 产品基础信息 — 编号/名称/品牌/分类/跟单 |
suppliers |
531 | 0.1MB | 供应商信息 |
warehouses |
21 | — | 仓库对照表 |
bom |
5,854 | 1.5MB | 物料清单(成品→包材) |
purchase_orders |
2 | — | 采购单 |
purchase_order_items |
2 | — | 采购单项 |
dashboard_users |
34 | — | 平台用户 |
dashboard_logs |
245 | — | 操作日志 |
role_permissions |
66 | — | 角色权限 |
global_config |
2 | — | 全局配置 |
sales_predict_config |
9 | — | 预测配置 |
trend_config |
9 | — | 趋势配置 |
user_column_schemes |
7 | — | 用户列方案 |
核心表详解
inventory_detail — 日库存明细
| 字段 | 类型 | 说明 |
|---|---|---|
data_date |
date | 库存日期 |
source |
varchar | 数据来源(wdt = 旺店通) |
warehouse_code |
varchar | 仓库编码 |
product_code |
varchar | 货品编号 |
product_name |
varchar | 货品名称 |
brand |
varchar | 品牌 |
cost_price |
decimal | 成本价 |
available_qty |
int | 可用库存(核心字段) |
production_in_transit |
int | 生产在途量 |
purchase_in_transit |
int | 采购在途 |
category1/2/3 |
varchar | 三级类目 |
created_time |
datetime | 单品创建时间 |
重要: 每天全量快照,按
data_date + warehouse_code区分。每天约 1.9 万条。
daily_outbound — 日出库记录
| 字段 | 类型 | 说明 |
|---|---|---|
日期 |
date | 出库日期 |
货品编号 |
varchar | 产品编码 |
货品名称 |
varchar | 产品名称 |
品牌 |
varchar | 品牌 |
仓库 |
varchar | 发货仓库 |
店铺 |
varchar | 店铺名称 |
货品数量 |
int | 出库数量 |
货品成本 |
decimal | 出库成本 |
数据来源 |
varchar | wdt/tmgj/jdbz/jdgj/jdjwt |
数据类型 |
varchar | cksj |
注意: 来源含多种平台(旺店通/天猫国际/京东泊紫/京东国际/京东洁维塔)
products — 产品基础信息
| 字段 | 类型 | 说明 |
|---|---|---|
product_code |
varchar(唯一) | 货品编号 |
product_name |
varchar | 货品名称 |
brand |
varchar | 品牌 |
product_type |
varchar | 产品类型: 成品/包材/清库存/现货/赠品/物料/小样/其他 |
cost_price |
decimal | 成本价 |
category1/2/3 |
varchar | 三级类目 |
supplier_name_match |
varchar | 供应商匹配名 |
procurement_follower |
varchar | 采购跟单人 |
procurement_planner |
varchar | 采购计划人 |
lead_time |
int | 生产周期(天) |
API 接口一览
仪表盘
| 接口 | 方法 | 说明 |
|---|---|---|
/api/dashboard/stats |
GET | 仪表盘统计数据 |
库存
| 接口 | 方法 | 说明 |
|---|---|---|
/api/inventory/list |
GET | 库存明细列表(支持分页/筛选) |
/api/inventory/filters |
GET | 库存筛选选项(品牌/类目/日期/仓库) |
/api/inventory/export |
POST | 导出库存数据(CSV/Excel) |
/inventory |
GET | 库存页面 |
/inventory/finished |
GET | 成品库存页 |
/inventory/packaging |
GET | 包材库存页 |
日出库
| 接口 | 方法 | 说明 |
|---|---|---|
/api/data/list |
GET | 出库明细列表 |
/api/data/dates |
GET | 可选日期列表 |
/api/data/summary |
GET | 出库汇总统计 |
/api/data/summary-stats |
GET | 汇总图表数据 |
/api/data/sku-detail |
GET | SKU 出库详情 |
产品
| 接口 | 方法 | 说明 |
|---|---|---|
/api/products/list |
GET | 产品列表 |
/api/products/filters |
GET | 筛选选项 |
/api/product/update_fields |
POST | 更新产品字段 |
/api/product/batch_update |
POST | 批量更新 |
/api/bom/list |
GET | BOM 物料清单 |
/api/suppliers/list |
GET | 供应商列表 |
采购
| 接口 | 方法 | 说明 |
|---|---|---|
/api/purchase/pending_list |
GET | 待采购列表 |
/api/purchase/create_order |
POST | 创建采购单 |
/api/purchase/orders/list |
GET | 采购单列表 |
认证 & 用户
| 接口 | 方法 | 说明 |
|---|---|---|
/api/login |
POST | 登录 |
/api/logout |
POST | 退出 |
/api/profile |
GET | 个人信息 |
/api/users/list |
GET | 用户列表 |
/api/permissions/list |
GET | 权限列表 |
数据更新流程
数据流向
钉钉云盘 → dws下载 → tmp_csv/ → Python导入脚本 → MySQL → Flask API → 浏览器
更新方式
方式一:全量自动更新(推荐)
python3 auto_update.py
- 下载钉盘最新出库+库存CSV
- 全量重导入数据库
- 刷新系统缓存
- 建议配置定时任务每天 7:00 / 12:00 / 18:00 执行
方式二:单独更新出库数据
python3 reimport.py
- 扫描
tmp_csv/下所有*cksj*.csv文件 - 清空
daily_outbound表,全量重写
方式三:单独更新库存数据
# 全量
python3 batch_import_inventory.py
# 增量(只导入新文件)
python3 import_new_inventory.py
钉盘文件夹 ID
| 名称 | 文件夹ID | 说明 |
|---|---|---|
| 日出库数据源文件 | 3NwLYZXWynyBjRB4tZjwNxDvVkyEqBQm |
每日出库CSV |
| 库存数据源文件 | NkDwLng8ZLGrXmrnFxYq3vRqVKMEvZBY |
每日库存CSV(按仓库分文件) |
| 所属空间 | 28814565790 |
采购部AI项目数据源 |
运维指南
启动/停止
# 启动(开发模式)
cd /home/gxd/.openclaw/workspace/dy-dashboard
python3 app.py
# 启动(生产模式,推荐)
python3 run.py --prod
# 或使用 deploy.sh
bash deploy.sh
# 停止
kill $(lsof -t -i:18888)
查看日志
# 应用日志
tail -f logs/app.log
# 自动更新日志
tail -f logs/auto_update.log
# 访问日志
tail -f logs/access.log
刷新缓存
系统使用 RefreshableCache 机制。重启服务会自动刷新:
kill $(lsof -t -i:18888); sleep 2; python3 run.py --prod
数据校验
# 检查库存数据
mysql -u dy_app -p'***' dy_data -e "
SELECT data_date, COUNT(*) AS cnt, SUM(available_qty) AS total_avail
FROM inventory_detail
GROUP BY data_date ORDER BY data_date DESC LIMIT 5;"
# 检查出库数据
mysql -u dy_app -p'***' dy_data -e "
SELECT 日期, COUNT(*) AS cnt, SUM(货品数量) AS total_qty
FROM daily_outbound
GROUP BY 日期 ORDER BY 日期 DESC LIMIT 5;"
常见问题
Q: 库存数据显示为0
- 原因:导入脚本解析CSV时编码或列映射出错
- 解决:删除错误数据,重新从CSV导入
Q: 出库数据缺少某天
- 原因:当天CSV文件未下载
- 解决:手动从钉盘下载该文件放到
tmp_csv/,运行python3 reimport.py
Q: 页面访问 502/连接拒绝
- 原因:服务未启动或崩溃
- 解决:
python3 run.py --prod重新启动
Q: 定时更新没跑
- 原因:crontab 未配置或服务器重启
- 解决:
crontab -e确认任务存在,或手动运行python3 auto_update.py
模块命名规则
新建 .py 文件前先检查:
ls services/*.py查看已有模块grep -rn "from services.\|import services."检查现有导入- 确认无冲突再新建
版本管理
Git 标签
# 查看版本
git tag
# 查看当前版本详情
git log --oneline --decorate
# 切换到某个版本
git checkout v1.0
发版流程
# 1. 提交代码
git add -A
git commit -m "v1.1 - 修复xxx / 新增xxx"
# 2. 打标签
git tag -a v1.1 -m "v1.1 - 说明"
# 3. 导出对应版本的数据库
mysqldump -u dy_app -p'***' dy_data > dy_data_v1.1.sql
回滚
# 代码回滚
git reset --hard v1.0
# 数据库回滚(需要手动导入旧版本备份)
mysql -u dy_app -p'***' dy_data < dy_data_v1.0.sql
部署
新服务器部署
# 前置条件(Ubuntu)
sudo apt update && sudo apt install -y python3 python3-pip python3-venv mysql-server
# 解压项目
tar xzf dy-dashboard-package.tar.gz
cd dy-dashboard
# 一键部署
bash deploy.sh
deploy.sh 会自动完成:
- ✅ 检测 Python/MySQL 环境
- ✅ 创建数据库和用户
- ✅ 导入数据(如果有
dy_data_backup.sql) - ✅ 创建 Python 虚拟环境并安装依赖
- ✅ 启动 Gunicorn 服务
- ✅ 配置定时更新任务
使用变量
| 配置项 | 默认值 | 位置 |
|---|---|---|
| 端口 | 18888 | config.py → APP_PORT |
| 数据库名 | dy_data | config.py → DB_CONFIG.database |
| 数据库用户 | dy_app | config.py → DB_CONFIG.user |
| 数据库密码 | dy_data_2026 | config.py → DB_CONFIG.password |
| 默认账号 | 甘旭东 | 数据库 dashboard_users 表 |
| 默认密码 | admin123 | 数据库 dashboard_users 表 |
相关链接
- 钉钉云盘空间ID:
28814565790(采购部AI项目数据源) - 日出库文件夹ID:
3NwLYZXWynyBjRB4tZjwNxDvVkyEqBQm - 库存文件夹ID:
NkDwLng8ZLGrXmrnFxYq3vRqVKMEvZBY - 项目路径:
/home/gxd/.openclaw/workspace/dy-dashboard/
最后更新: 2026-06-10 | v1.0