用大白话说:这是生产经理的“第二大脑”。你在对话里说「帮我建个生产计划,4G 小卡 100 台,交期 30 天」,它会在确认后把数据落库并生成分角色驾驶舱;把采购合同交给它,还能自动匹配标准 BOM、核对库存,经人工审核后生成可发供应商的正式采购订单。
业务台账不需要 SeaTable 账号,下载后即可用本地 CSV;采购库存可选一键部署的 PartDB,也可接客户已有 ERP 的 API、MCP 或 Excel/CSV 导出。
↑ 生产经理视角首屏实拍。数据为虚构演示数据。首屏只放 3-4 块:「今天要处理」置顶 → 4 张核心指标 → 行动建议,其余分析收在「更多分析」里,点开才展开。
想直接点开玩玩? → 交互式使用指南(在线,无需安装)
这个项目完全可以在裸 Windows 上跑,但配合 WorkBuddy 用,有四个别人替代不了的点:
| # | 理由 | 具体表现 |
|---|---|---|
| 1 | 技能两级共享 | 用户级(~/.workbuddy/skills/,个人私有)和项目级(<项目>/.workbuddy/skills/,团队同版本)天然分开,一人维护、全员即时升级,版本不会漂移 |
| 2 | 团队资料库分发 | 驾驶舱 HTML 发到团队空间就是一个固定链接,服务端权限(owner/editor/reader),每日覆盖更新自动留版本历史——同事永远打开的是最新版,不用重新发文件 |
| 3 | 定时自动化 | 「每日 9 点自动重建部署」「每周一物料行情检查」挂在平台侧,机器开着就能跑:拉云端数据 → 重新生成驾驶舱 → 重新发布到固定链接 → 推送摘要,全自动无人值守 |
| 4 | Agent Mail 推送 | 哨兵抓到的异常、站会摘要走发件箱,由 AI 会话经 Agent Mail 真正推送出去;企微群也可以直接推(wecom_push.py --body-file)——消息主动找你,不用你盯着看 |
在 WorkBuddy 里 「我的项目 → 新建项目」,项目来源粘贴这个链接:
https://github.com/Darling5/seatable-production
创建后会自动带上 seatable-production 技能和「生产驾驶舱」专家。然后直接说话:
| 你说 | 它做 |
|---|---|
| 生成演示版驾驶舱 | 用内置示例数据出一张完整网页,立刻看到效果 |
| 帮我建个生产计划:4G 小卡,100 台,交期 30 天 | 整理成待写入数据 → 等你确认 → 落库 |
| 这批货缺什么料 | 拉 BOM 比库存,列出缺料清单 |
| 出一张发货清单 | 生成清单并可导出 Excel |
⚠️ 写入前一定先问你:任何增删改都会把待写入数据完整摊开给你看,你点头才落库。 网页上的「一键发起」也只是拉起 WorkBuddy 并预填任务,不会自动写库。这是刻意设计,不是 bug。
其他安装方式(clone / ZIP)
# clone 到技能目录,可随 git 更新
git clone https://github.com/Darling5/seatable-production.git \
~/.workbuddy/skills/seatable-production # Windows Git Bash 用 "$HOME/..."或在 GitHub 点 Code → Download ZIP,解压后把 seatable-production/ 放进 ~/.workbuddy/skills/。
装好后重启 WorkBuddy。想跑引导式配置向导:
cd ~/.workbuddy/skills/seatable-production
python setup.py # 交互式:选 本地 / SeaTable
python setup.py --local # 或直接零配置setup.py 只负责写配置;deploy.py 把剩下的活全部干完:装依赖 → 生成/更新配置 → 连通验证 → 拉云端数据 → 物料清单 → 驾驶舱 → 体检 → 部署报告。幂等可重跑,已有配置做「外科手术式」更新(口令、微信、行情段原样保留)。
你需要做的只有一件事:把资料给到下面任意一层。
| 资料给到哪层 | 命令 |
|---|---|
| 命令行参数 | python deploy.py --seatable-token XXX --seatable-uuid YYY --partdb-url http://... --partdb-token K |
| 环境变量 | export SEATABLE_TOKEN=... SEATABLE_UUID=... 后跑 python deploy.py --yes |
| 资料文件(推荐) | 复制 deploy.yaml.example 为 deploy.yaml 填好 → python deploy.py --profile deploy.yaml |
| 什么都不给 | 终端可交互则逐项问答;加 --yes 走本地模式 |
| 零资料演示 | python deploy.py --demo(60 秒全链路跑通,不需要任何账号) |
部署结果长这样:
步骤 名称 结果
----------------------------------------------
S1 环境检测 [OK] 完成 Python 3.13.14
S2 依赖自装 [OK] 完成 已安装 requests, pyyaml
S3 生成 config.yaml [OK] 完成 全新生成配置,backend=seatable
S4 连通验证 [OK] 完成 SeaTable ✓;PartDB ✓(HTTP 200)
S5 数据初始化 [OK] 完成 云端业务表已同步到本地 data/;物料监控清单已生成
S6 驾驶舱生成 [OK] 完成 项目管理驾驶舱.html(145.5 KB)
S7 开局体检 [OK] 完成 体检完成(BLOCK 项才需要立即处理)
S8 部署报告 [OK] 完成 已写入 data/deploy-report.md
常用参数:--dry-run 只预览不落盘 · --skip-deps / --skip-sync / --skip-doctor / --no-cockpit 跳步 · --yes 免交互(CI 友好)。
🔒
deploy.yaml含凭证,已被.gitignore排除;config.yaml同理,两者都不会进仓库。
本地生成的驾驶舱是给构建用的,分发走 WorkBuddy 团队资料库:固定链接、服务端权限(owner/editor/reader)、每日覆盖更新自动留版本历史。
python publish.py --setup --space-id <空间ID> --token-stdin # 首次发布,node_id 回写 config.yaml
python publish.py --token-stdin # 之后每天覆盖更新,链接不变
python publish.py --status # 查看当前发布目标- 首次发布前先建团队空间(如「生产交付」),把同事按角色拉为协作者。
- token 在 WorkBuddy 会话中由 AI 调
connect_open_platform(skill_id=library)取得,经 stdin 传入,不落盘。 - 发布目标存
config.yaml的publish段(space_id / node_id / url),已 gitignore。 - 发布失败保留本地 HTML 兜底,退出码 2 可被自动化流程识别为"仅发布失败"。
混合架构建议:生成在本地(凭证与数据源都在本机,快、可离线重跑),分发在库内(一个 URL 永远最新)。不要砍掉本地生成环节。
小批量电子制造的活儿,数据散在一堆地方:项目在 SeaTable、物料在 PartDB、发货记录在某个 Excel 里。 每个人都要问别人「那个单子到哪一步了」。
这个技能做七件事:
- 统一读写——
op.py一个入口管业务表,不管后端是本地 CSV 还是 SeaTable 云。 - 按角色出网页——
cockpit.py把数据算成 KPI、甘特图、缺料预警,生成单文件 HTML,5 个角色各一套视图,可设口令分享给同事。 - 采购合同变采购订单——合同解析 → 标准 BOM 扩量 → PartDB/ERP API/MCP/文件库存源 → 人工审核 → 供应商分组 → 正式采购订单 PDF。
- 微信消息变业务情报——双引擎只读本地微信数据库(4.x 直读加密库 / 3.x 走 merge_all.db),按监控群拉取新消息,提取交期、价格、停产、催货、进度和库存事件,确认后才写回业务表。
- 消息↔业务表逐条核对——
wxmatch.py把群消息里的收款、新下单、合同 PDF 与 SeaTable 业务表对账,专抓「群里说了但表里没有」的缺口;只读核对,高置信项生成预填意图等人确认。 - 行情可追踪——从采购记录生成物料监控清单,记录渠道价快照、采购价偏差、环比涨跌和 NRND/EOL 生命周期;上游原料(金/银/铜/锡/塑料)另有独立行情线看成本走向。
- 风险可预知——
foresee.py用历史真实工期给新合同倒排各环节最晚开始日(哪些必须立刻执行),用承诺 vs 实际交期给供应商画像(组装料平均晚 29 天,排程自动加 buffer),BOM 缺口 × 在途 ETA 判断哪些计划必须立刻下单补料。 - 事项与证据可治理——微信群里的业务事实进入
production候选,负责人/截止日期/追问进入tasks候选;图片证据允许确认后上传,普通文件优先文本化;季度只列 90 天以上已闭环证据的清理候选,显式--yes才删除。
flowchart LR
A[业务数据<br/>SeaTable · PartDB · 本地CSV] --> B[op.py 统一读写]
B --> C[cockpit.py<br/>单文件 HTML 驾驶舱]
C --> D[老板 / 生产经理 / 采购 / 仓库 / 销售<br/>各自视角 + 口令分享]
C --> E[一键发起 → 写回<br/>先确认再落库]
F[微信群消息<br/>收款 / 下单 / 合同PDF] --> G[wxmatch.py 只读核对]
G --> H{匹配上了?}
H -- 高置信 --> I[生成预填意图<br/>人确认后写库]
H -- 对不上 --> J[待核对清单<br/>提示漏立项 / 漏登记]
I --> B
J --> C
K[历史工期 · 供应商交期<br/>BOM缺口 × 在途] --> L[foresee.py 风险预测]
L --> M[合同倒排 · 必须立刻执行<br/>缺料必须立刻下单]
M --> C
新增能力采用“本地专用数据 + 业务表确认写入”的方式,避免每日同步时覆盖监控信息:
微信 4.x:wxengine/wa_db.py 直读本地加密库(主密钥从进程内存提取)
微信 3.x:win-wechat-summary 生成 merge_all.db(回退路径)
↓ 只读,不连接微信服务器
wechat_intake.py pull(引擎A优先,自动回退引擎B)
↓
微信事件.csv(待确认)
↓ AI 分流,同一消息可拆两条
production:业务事实候选 / tasks:负责人·截止日期·追问候选
↓ 分别展示目标 Base/表/字段,用户确认后才写入
SeaTable 业务表 + 事项表 + 工作日志
图片:先登记摘要/来源/哈希,允许确认后上传
普通文件:优先文本化,失败或需核验版式/签章时才上传原件
↓ 同一批消息换个用法:对账而非提取
wxmatch.py scan(只读核对,绝不自动写库)
↓ 收款/下单/合同PDF ↔ 业务表逐条匹配
核对结果.csv → 高置信生成预填意图 → 用户确认 → 写回业务表
采购记录 → market.py watchlist
↓
物料监控清单.csv + 物料行情记录.csv
↓
价格涨跌 / NRND / EOL → 驾驶舱告警
market.py raw(commodities.py 驱动)
↓
原料行情记录.csv(金/银/铜/锡/塑料)→ 成本走向告警
个人微信没有开放读取 API。本项目不会连接微信服务器;微信 4.x 用户保持 PC 版登录即可(引擎A 自动从进程内存提取密钥),微信 3.x 用户需在 Windows 本机用 win-wechat-summary 生成
merge_all.db。涉及交期、价格、数量、金额或采购下单的微信事件,默认只进入“待确认”,不会自动改业务表;wxmatch.py更进一步——它只做核对不写库,连预填意图都要你点头才生效。
微信 4.x(推荐,零工具依赖):保持微信 PC 版登录,安装 pip install cryptography 即可。微信 3.x:安装运行 win-wechat-summary 生成 merge_all.db。配置 config.yaml:
⚠️ 依赖装在哪个 venv 就用哪个 venv 跑(python wechat_intake.py doctor自检)。本仓库自带的.venv-pipeline可能缺cryptography,症状是:[warn] 引擎A(wechatauto)加载失败:No module named 'cryptography' [!] 引擎A不可用(微信4.x未登录 / 版本不支持 / 缺 cryptography)这条报错里"微信4.x未登录 / 版本不支持"是误导项——真正原因几乎总是当前解释器缺包。修复:
.venv-pipeline/Scripts/python.exe -m pip install cryptography pyyaml自检通过的标准输出是
数据库:19 个,已解密 19 个+ 群聊数量,而不是任何[!]。
⚠️ 微信 4.x 用户不要用 win-wechat-summary / WeChat-Summary 类工具:这类工具(含网络上的 GUI 版)通过psutil.process_iter精确匹配进程名WeChat.exe来检测微信,而微信 4.x 的主程序已改名为Weixin.exe,必然报"未检测到微信进程"。其内置 PyWxDump 偏移表也只支持到 3.9.12.55,对 4.x 无解。本项目引擎A 直读 4.xdb_storage加密库,是 4.x 唯一可行路径。
wechat:
enabled: true
db_dir: "" # 引擎A:微信4.x数据根目录,留空=自动探测
db_path: "C:/.../merge_all.db" # 引擎B:3.x回退路径,留空=自动搜索
watch_groups: [供应商群, 项目群] # 留空=所有群(群多时首拉很慢)
max_hours: 48怎么选监控群(重要):先列出你的全部群聊,再按业务挑——不要拍脑袋写:
python wechat_intake.py groups # 列出全部群(名称+群ID,缓存到 groups.json)一个微信群列表动辄几百个,推荐按四类勾选(以本仓库实际 380 群筛选 31 群为例):
| 类别 | 挑什么 | 价值 |
|---|---|---|
| 生产/组装/贴片 | 贴片厂、组装厂、灌胶/加工群 | 工序进度、送料返料情报 |
| IC/物料/供应商 | 芯片代理、外壳模具、电机马达群 | 价格变动、停产通知、交期变更 |
| 客户/项目 | 甲方项目群、商务群 | 催货、付款、需求变更——与超期预警交叉印证 |
| 内部 | 公司内部生产群 | 决策、跨部门协调 |
群名直接原样写进 watch_groups 列表即可(含空格、&、全角括号都没问题),匹配支持群名精确匹配 / 群 ID / 子串包含三种。改完配置跑一次 python wxwatch.py once --minutes 60 验证扫描的群数对不对。
检查数据库并列出群:
python wechat_intake.py doctor
python wechat_intake.py groups
python wechat_intake.py pullpull 使用 data/wechat_intake/bookmark.json 按群记录读取位置,重复执行不会反复拉取同一批消息。AI 提取事件后登记为待确认:
python wechat_intake.py add-event \
--group 供应商群 --sender 供应商A \
--category 价格变动 \
--text "FR8018HD 下周报价可能上涨 12%" \
--intent '{"op":"log","table":"工作日志","data":{"原话":"FR8018HD 下周报价可能上涨 12%"}}'
python wechat_intake.py list --status 待确认
python wechat_intake.py approve WX20260821-001
python wechat_intake.py ignore WX20260821-002可识别分类:交期变更、价格变动、停产通知、催货、进度、库存、其他。驾驶舱的「微信情报台」展示原文、来源群、分类、待确认状态和最终写入结果。
启用命名 Base 后,微信候选不要全部写进默认 Base:
| Base | 内容 | 示例 |
|---|---|---|
production |
已发生或待登记的业务事实 | 回款、订单、交期变更、采购/库存/生产/发货/质量记录 |
tasks |
需要执行和追踪的事项 | 负责人、截止日期、提醒、催办、追问、未闭环问题 |
「已到账 3 万,请小王今天核对发票」应拆为 production 回款候选和 tasks 核票事项候选。
自动化只生成待确认清单;人工确认前不执行 approve,也不得把“高置信”说成“已写入”。
需要手工核验 Base 时使用 python op.py --base production ... 或 python op.py --base tasks ...。
附件采用“可检索优先”策略:
- 图片允许在确认后上传到目标记录的图片/附件列,但先登记 OCR/视觉摘要、来源群、发送人、时间和哈希;
- PDF、Word、Excel、PPT、TXT 等普通文件优先提取正文/表格,文本化失败或必须查看版式/签章时再上传原件;
- 每季度运行
python evidence.py scan --root data/wechat_intake --days 90 --json,只列出超过 90 天、已闭环且非长期保留的候选; - 真正删除必须由人工明确批准后运行
python evidence.py prune --root data/wechat_intake --days 90 --yes。不带--yes永远只预览。
每日和季度自动化模板见 automations/README.md,AI 总结分流规范见 references/wx-ai-summary-prompt.md。
事件提取解决的是「群里说了什么」。如果你还想知道「群里说的和表里记的对不对得上」,继续看 消息↔SeaTable 核对——同一批消息,换个用法从提取变成对账。
数据不再等你看,而是主动找你:
# 🌉 耳朵:实时监听(1 秒轮询,监控群命中关键词自动登记事件+写通知发件箱)
python wxwatch.py watch # 常驻监听(微信保持登录)
python wxwatch.py once --minutes 60 # 低频模式:扫描过去 N 分钟(配合定时任务)
python wxwatch.py status # 哨兵状态/最近命中
# 🧠 神经:异常检测(超期项目/逾期应收/采购在途/计划停滞/行情异动/数据体检)
python alerts.py run # 跑全部规则 → data/alerts.json
python alerts.py show # 查看上次结果
# 📋 嘴巴:站会摘要(合成异常+微信情报+业务面,一段话说完今天要管什么)
python daily_brief.py --push # 生成 data/daily_brief.md / _short.md 并写发件箱
# 📬 发件箱(进程解耦:生产者只管写,AI 会话经 agent-mail 发送)
python notify.py dump # 取未发送通知(JSON 行)
python notify.py mark-sent --ids 1,2 # 发送后标记关键词分两级:高危(交期/延期/涨价/停产/缺料/催货,命中即通知)和一般(价格/库存/到货/进度等,仅登记事件)。通知走发件箱,由每日 9 点自动化或对话中的 AI 经 Agent Mail 发送。
异常规则一览:A1 交期逼近(≤7 天未完货)· A2 项目已超期 · A3 逾期应收(交期过 + 待收>0)· A4 采购在途逐条 · A5 计划停滞(超 2 周无推进)· A6 行情异动(±10%)与 NRND/EOL 停产 · A7 数据体检(空状态/#VALUE! 脏值)。
从 IC、组装料、成品、外壳和 PCBA 采购记录提取型号与历史采购价,生成监控清单:
python market.py watchlist
python market.py watchlist --refresh
python market.py add FR8018HD --price 3.10 --category IC每周检查后写入行情快照;没有可靠价格或生命周期来源时填“未知”,不要猜测。NRND/EOL 需要保留来源链接:
python market.py snapshot \
--model FR8018HD --price 3.50 \
--channel 立创商城 --lifecycle 在产 \
--source "https://example.com/source"
python market.py report
python market.py alerts默认 market.alert_threshold: 10:
- 最新价相对上次采购价达到 ±10% 时预警;
- 最新快照环比达到 ±10% 时预警;
NRND(不推荐继续使用)和EOL停产立即预警;- 驾驶舱「物料行情」展示采购价、最新行情、偏差、生命周期和内联 SVG 趋势。
人工录入太慢,行情可以自动拉:suppliers.py 抹平得捷与贸泽两个官方 API 的差异,统一折算人民币。
python suppliers.py doctor # 凭证自检(值脱敏,不打印明文)
python suppliers.py doctor --live # 真实联网探测一次(消耗 1 次配额)
python market.py lookup FR8018HD # 单型号查价,**只查不写**
python market.py compare FR8018HD # 多源比价,原价与 ¥ 并列,标出最低/最高/差价
python market.py sync --dry-run # 预览这轮将查哪些(不联网、不写库)
python market.py sync # 按节奏批量拉价并写快照
python market.py sync --limit 5 # 只查前 5 个(省配额调试)
python market.py sync --force # 忽略节奏强制全查凭证怎么配(config.yaml 的 market.api_keys,已被 .gitignore 排除,不会进仓库):
market:
currency: CNY # 默认人民币 ¥
cadence: auto # 自适应复查节奏,省钱
api_keys:
digikey: # 得捷:developer.digikey.com 注册应用
client_id: ""
client_secret: ""
api_version: v4 # 默认 v4(Product Information API,App 需订阅它)
site: CN # 站点/币种/语种,决定了报价币种
currency: CNY
mouser: # 贸泽:My Account → APIs → Search API Key
api_key: ""从 GitHub clone 的人自己去官网申请,仓库里只有 config.yaml.example 的空占位符。
得捷订阅坑(2026-09-02 实测):App 状态 Approved ≠ 能调通。一个 App 可订阅多个 API 产品(Barcode / OrderStatus / ProductInformation V4 / Quote / Reference APIs), 代码调的端点必须在你 App 的订阅列表里,否则 401 "You are not subscribed to this API"。 本项目默认调 V4 keyword 端点(
/products/v4/search/keyword,价 + 库存 + 中文生命周期 一应俱全);如果你的 App 订阅的是旧 Search API,把api_version改成v3。
自适应节奏(省 API 配额的核心):按「库存电子料数量」自动选复查间隔,逐型号比对上次快照日期,未到期直接跳过——
| 库存电子料数量 | 复查间隔 | 依据 |
|---|---|---|
| ≤ 100 种 | 每 7 天(每周) | 料少,盯紧点 |
| 101 ~ 300 种 | 每 15 天(半月) | 折中 |
| > 300 种 | 每 30 天(每月) | 料多,配额优先 |
数量取自 data/partdb_snapshot.json 的 part_count(当前 369 种 → 每月一次)。想写死就把 market.cadence 设成数字(如 7),或改 market.cadence_tiers 自定义阈值。
三道省配额闸门(sync 依次过滤,越往后越省):
| 闸门 | 拦什么 | 实测效果(25 个启用型号) |
|---|---|---|
| ① 本地预筛 | P1、Z3.5、458*3、26MHz/0.5ppm 这类内部料号与规格描述——不是制造商型号,永远查不到 |
拦下 7 个(28%) |
| ② 未知缓存 | 近 30 天已确认「查无此型号 / 无报价」的型号 | 拦下 17 个 |
| ③ 节奏到期 | 上次快照距今未超复查间隔的型号 | 视历史而定 |
三道走完,25 个型号第二轮只剩 1 个真正发请求。缓存最多挡 30 天,--force 可随时绕过。
⚠️ 先看清适用性,别指望它管全部料:得捷/贸泽是欧美代理商,对国产料和定制料号基本零覆盖。实测本仓库 25 个启用型号(FR8018HD 奉加微、ML307N 中移物联、OM6626B 等国产芯片为主),贸泽有效命中 0 条。 这两个 API 的正确用法是选型阶段查新料号(lookup/compare打价、查库存、查生命周期),而不是给国产 BOM 做行情巡检 —— 后者仍以人工录入和立创商城为主。
四条铁律(改代码前先读 suppliers.py 文件头):
- 只读——只调查询接口,绝不碰下单/报价/购物车。下单必须人工在官网完成。
- 凭证不落库——只从本地
config.yaml读,日志与报错一律脱敏(只显示前 4 位)。 - 失败降级——网络超时/鉴权失败/查无此料都返回
ok=False,不抛异常,批处理继续跑下一个。 - 统一人民币——返回原始币种 + 折算后的
price_cny;汇率走免费接口,拿不到退回market.fx.static静态值并在备注标注来源。
其他要点:贸泽一次可查 10 个型号(代码自动分批,省配额),得捷只能逐个查;得捷令牌自动缓存到 data/.supplier_tokens.json,过期自动刷新;多渠道各写一条快照时,涨跌幅只跟同渠道的上一条比,避免把渠道差价误报成涨跌。
数据保存在 data/物料监控清单.csv 与 data/物料行情记录.csv,均为本地专用文件,不会被 seatable_sync.py 覆盖。
元器件之外,还有一层更上游的成本:原料。锡价直接决定 SMT 焊料成本,铜价决定 PCB 与线材,金银决定镀层与键合线,而 ABS/PC/PS 决定外壳与结构件。
python market.py raw list # 看有哪些品种、各自的数据源
python market.py raw fetch # 拉一次实时价并写库(每天跑一次即可积累走势)
python market.py raw show --days 30 # 走势表(sparkline + 区间涨跌)
python market.py raw trend --days 30 # 波动超阈值告警(默认 ±3%)
python market.py raw add ABS --price 11800 # 人工录入现货价
python market.py raw backfill AU --contract au2612 --days 60 # 一次性补历史| 品种 | 类别 | 数据源 | 单位 |
|---|---|---|---|
| 黄金 / 白银 / 铜 / 锡 / 铝 / 镍 | 金属 | 新浪期货连续合约(实时) | 元/克、元/千克、元/吨 |
| 聚丙烯 PP / 聚乙烯 LLDPE / PVC | 塑料代理指标 | 新浪期货连续合约(实时) | 元/吨 |
| ABS / PC / PS 树脂 | 塑料现货 | 人工录入 | 元/吨 |
关于塑料的诚实说明:ABS、PC、PS 是石化下游现货品种,没有公开的免费 API——报价被生意社、卓创、中塑在线等资讯商垄断(付费)。所以本模块的做法是:
- 金属走免费实时接口,全自动;
- PP / LLDPE / PVC 期货作为 ABS/PC/PS 的上游石化链代理指标(趋势相关,能提前感知塑料成本拐点);
- ABS/PC/PS 现货走人工录入(你的采购报价填进去即可积累走势)。
若日后接入含产业数据的付费源(如同花顺 iFinD 有化工品现货库),只需在 commodities.py 里加一个 source 适配器,CSV 结构与展示层都不用动。
数据源细节(commodities.py 文件头有完整记录):
- 实时价走
hq.sinajs.cn/list=nf_XXX0(上期所/大商所连续合约),免费、无需申请、无 API key,人民币计价,一次请求取回全部 9 个品种; - 新浪的日 K 线服务已下线(返回
Service not found),所以历史补录改走东方财富 K 线,secid 形如113.au2612(113 上期所 / 114 大商所); - 口径隔离:补录的具体合约(如
au2612)与日常的「连续」是两个口径,写进 CSV 的「口径」列,环比只跟同口径比——拼接不同口径会出现假涨跌(与元器件的「串渠道假涨跌」是同一类坑)。
数据保存在 data/原料行情记录.csv(本地专用)。原料波动阈值默认 ±3%,比元器件的 ±10% 敏感,可在 config.yaml 的 commodities.alert_threshold 调整。
驾驶舱展示(v1.6.0):cockpit.py 已内置「原料行情(上游成本 · 金属 / 塑料)」模块——最新价、近 30 天区间涨跌、SVG 走势线、口径徽章(连续/合约)一目了然;波动 ≥ 阈值的品种进「原料波动告警」卡片,动静最大的 2 条还会进「下一步行动建议」(标注影响的是报价基调,不是停线事件)。老板页与采购页均可见。阈值与回看天数与 CLI 同源(commodities 段),不会出现命令行显示 ±3% 而网页按别的数算的情况。
微信情报解决了「群里说了什么」,核对引擎解决「群里说的和 SeaTable 记的对不对得上」—— 收款、新下单、合同 PDF 逐条对账,专抓「群里说了但表里没有」的缺口。
python wxmatch.py scan # 扫描监控群消息 + 微信收到的合同 PDF,写核对台账
python wxmatch.py list # 查看待核对项
python wxmatch.py done WX-M-...001 # 处置留痕
python wxmatch.py intent # 导出高置信项的预填意图(确认后走 approve 写库)| 核对类型 | 群里看到的 | 对 SeaTable 哪张表 | 匹配规则 |
|---|---|---|---|
| 收款 | 「已打款 xx 万」「到账了」 | 项目表「待收」 | 金额 ±2% 容差 → 高置信 |
| 下单 | 「下单」「返单」 | 项目表客户名 | 匹配不到 → 提示可能漏立项 |
| 客户合同 | 合同 PDF(微信文件) | 项目表「合同」列 | 客户名+产品词双维度匹配 |
| 供应商合同 | 采购合同 PDF | 5 张采购记录表 | 供应商名归一(含一字之差别名),金额差 >5% 警示 |
为什么可信:核对引擎只读,绝不自动写 SeaTable——高置信收款项只生成「预填意图」, 人在驾驶舱或对话里确认后才落库(复用微信情报的 approve 链路)。
驾驶舱展示:老板/生产/销售页新增「消息↔SeaTable 核对台」——36 条待核对项按置信度排序 (高置信收款红字置顶进行动建议),类型/置信度徽章 + 匹配项目 + 建议动作一目了然。
① 零配置(默认) — 数据存 data/ 下的 CSV,Excel 直接打开:
python3 op.py append 生产计划 '{"生产产品":"4G小卡","数量":100,"关联项目":"演示项目A"}'
python3 op.py list 生产计划
python3 op.py export-excel 生产数据.xlsx
python3 cockpit.py # 生成驾驶舱网页② 接你自己的 SeaTable — cp config.yaml.example config.yaml,填上:
backend: seatable
seatable:
api_token: "你的Token"
base_uuid: "你的BaseUUID"命令一行都不用改。想退回本地,backend 改回 local。
③ 采购库存源:按客户现状选一种:
inventory:
source: partdb # 也可选 api / mcp / file
partdb:
enabled: true
url: "http://你的PartDB:端口/api"
token: "你的PartDBToken"- 没有 ERP:可部署 PartDB,使用
partdb。 - 已有金蝶、简道云、禅道或自建 ERP:优先使用
api或mcp,通过配置完成鉴权、分页与字段映射。 - 暂时无法在线连接:使用
file读取 Excel/CSV 导出。
完整配置见 config.yaml.example。所有通用库存默认属于“未确认库存”,必须经过人工库存审核才可抵扣生产需求。
- 📖 使用手册 —— 14 张表怎么用、阶段 → 该写哪张表的对照、甘特图怎么读、格式铁律
- 🖥️ 交互式使用指南(HTML) —— 能点的角色视图 / 深链发起 / 夜间模式演示
- 📁 导入为项目 —— 团队共享同一套版本的做法
公共仓库只包含通用代码、规则模板和示例配置,不保存客户数据或凭证。config.yaml、data/、pipeline/customer/、pipeline/rules.local.yaml 与 pipeline/out/ 都在 .gitignore 内。
首次使用采购流水线:运行 python pipeline/run.py init,把客户 BOM 和流程文件放入 pipeline/customer/,再填写本地 rules.local.yaml。库存可来自一键部署的 PartDB;客户已有金蝶、简道云、禅道或自建 ERP 时,优先通过通用 HTTP API 或 MCP 连接器在线接入,Excel/CSV 导出作为离线兜底。
驾驶舱网页里嵌的是你的真实业务数据。公开演示前必须用演示数据重新生成。
目录结构
seatable-production/
├── SKILL.md # 领域知识(流程/表规则/格式/分析),不含任何凭证
├── config.yaml.example # 配置模板(复制为 config.yaml 后填写)
├── op.py # 统一数据操作 CLI(模型与用户都只调它)
├── cockpit.py # 驾驶舱网页生成器(单文件 HTML)
├── wechat_intake.py # 微信本地库 → 待确认事件 → production/tasks 分流候选(双引擎)
├── evidence.py # 图片证据元数据 + 90 天清理候选(显式 --yes 才删除)
├── wxengine/wa_db.py # 微信 4.x 解密引擎(SQLCipher4 直读,主密钥从进程内存提取)
├── wxmatch.py # 消息↔SeaTable 核对引擎(只读对账,高置信生成预填意图)
├── foresee.py # 风险预测引擎(合同倒排·供应商画像·缺料预警 → data/foresee.json)
├── wxwatch.py # 实时哨兵:监听监控群,关键词命中自动登记事件+通知
├── alerts.py # 异常检测引擎:超期/应收/在途/停滞/行情 → data/alerts.json
├── daily_brief.py # 站会摘要:异常+微信情报+业务面 合成一段话
├── notify.py # 通知发件箱:进程解耦,AI 会话经 agent-mail 发送
├── market.py # 物料监控清单 / 价格涨跌 / NRND-EOL(含 raw 子命令入口)
├── suppliers.py # 得捷·贸泽官方 API 只读查价(凭证本地化 / 失败降级 / 统一 ¥)
├── commodities.py # 上游原料行情(金/银/铜/锡/塑料,零凭证数据源)
├── seatable_sync.py # 拉 SeaTable 云表快照供驾驶舱离线渲染
├── partdb_sync.py # 拉 PartDB 库存与缺料快照
├── backfill_seatable.py # 历史数据补录(确定性字段预填,需拍板的留空)
├── wecom_push.py # 企业微信推送(发件箱 flush / 单条 push)
├── pipeline/ # 合同 → BOM → 库存审核 → 正式采购订单
│ ├── inventory_sources.py # PartDB / API / MCP / Excel·CSV 适配器
│ └── rules.yaml # 无客户信息的公共采购规则模板
├── adapters/ # 业务台账后端适配器(可插拔)
│ ├── local.py # 本地 CSV(默认,零依赖)
│ ├── seatable.py # SeaTable(配置驱动)
│ ├── partdb.py # PartDB(可选)
│ └── schema.py # 14 表结构 + 15 条语义关联 + 默认值
├── references/ # 长文档(业务流程 / 分析公式)
├── tests/ # 离线回归测试(含双 Base、证据清理与自动化文档契约,不碰线上数据)
├── automations/ # 每日/季度自动化模板 + bridge/ 桥接脚本(挂到项目分组用)
├── scripts/ # 便捷 shell(SeaTable token / PartDB 查询)
├── partdb-price-import/ # 子技能:采购合同 PDF → PartDB 价格录入
├── partdb-part-create/ # 子技能:PartDB 新建物料 + 供应商件
├── expert/ # 专家包(内嵌技能副本,python sync_expert.py 同步,CI 校验漂移)
├── data/ # 本地数据(自动生成,已 gitignore)
└── docs/ # 手册、配图、在线指南
本文档由 混元3(腾讯混元大模型)辅助撰写。
