MES 每日经营报表自动化
面向工厂/供应链的每日经营报表自动化技能:用 Playwright + Edge 登录 MES 系统抓取生产/账单/库存数据,生成截图、Markdown 总结与自包含 HTML 报告,部署到 Web 服务器,再推送企业微信群机器人。数据源、凭据、服务器地址均通过环境变量注入(见「环境变量与前置配置」)。
触发场景
- 用户要求「跑日报 / 每日报表 / 生产日报播报 / 经营日报 / 账单播报 / 库存货值 / 更新报表 / 部署日报 / 补发企微 / 刷新 MES 会话 / 重发账单」
- 每日定时任务示例:23:30 生产日报、12:00 与 20:40 经营日报(时间可按需配置)
- 报表生成失败后的排查、补发、会话续期
环境变量与前置配置
所有运行期可变项一律通过环境变量注入,凭据不写入技能文档与聊天明文:
| 环境变量 | 含义 |
|---|---|
| MES_PROJECT_DIR | 项目根目录(脚本、产物所在) |
| MES_BASE_URL | MES 系统地址 |
| MES_USER / MES_PASS | MES 登录账号 / 密码 |
| MES_SESSION_FILE | 登录会话持久化文件 |
| DEPLOY_HOST / DEPLOY_USER / DEPLOY_PASS | 部署服务器地址 / 账号 / 密码 |
| DEPLOY_PATH | 服务器部署目录 |
| REPORT_BASE_URL | 报告对外访问地址 |
| WECOM_WEBHOOK_URL | 企业微信群机器人 webhook(含 key) |
| OTP_FILE | 短信验证码写入文件 |
| NODE_BIN / NODE_PATH / PYTHON_BIN | Node / Python 运行时路径 |
脚本内使用示例(Windows Git Bash / macOS / Linux 通用):
PROJ="${MES_PROJECT_DIR:?请设置 MES_PROJECT_DIR}"
NODE="${NODE_BIN:-node}"
NODE_PATH_ENV="${NODE_PATH:-}"
PY="${PYTHON_BIN:-python3}"
链路一:每日生产日报(示例 23:30)
方式 A:一键执行(与计划任务一致)
cd "$PROJ" && node run_daily_update.js
编排器自动完成:抓数(--defer-send 延迟发群)→ 库存货值 → 合并库存历史 → 存档 → 生成 HTML → 部署 → 生成历史独立页 → 部署成功后才发企微(确保群里链接是最新 HTML)。
方式 B:分步可控执行
cd "$PROJ"
# 1. 抓数据:MES 生产/订单/商品看板 → 截图 + daily_summary.md(不发企微)
NODE_PATH="$NODE_PATH_ENV" "$NODE" daily_report.js --defer-send
# 2. 库存货值:价格映射 + 库存系统 → inventory_data_<date>.json + 汇总图
NODE_PATH="$NODE_PATH_ENV" "$NODE" inventory_report.js
# 3. 合并当日库存到历史(趋势图数据)
"$PY" merge_inventory_history.py
# 4. 存档当天完整报告(截图+总结 → outputs/history/YYYY-MM-DD/)
"$PY" archive_daily.py
# 5. 生成 HTML 报告
"$PY" gen_daily_report_html.py
# 6. 部署到服务器(nginx 托管 /report/)
NODE_PATH="$NODE_PATH_ENV" "$NODE" deploy_report.js
# 7. 部署成功后发送企微播报(读 daily_summary.md,含 HTML 链接)
NODE_PATH="$NODE_PATH_ENV" "$NODE" send_deferred.js
若单跑 daily_report.js 并直接发送(不经过 HTML 部署),用 --preview 只出文件不发群,或默认模式即发群。
链路二:经营日报(示例 12:00 / 20:40)
cd "$PROJ"
# 1. 账单:账单列表页 → 截图 + 文字 + 发企微
NODE_PATH="$NODE_PATH_ENV" "$NODE" bill_report.js --send
# 2. 库存货值(同上)
NODE_PATH="$NODE_PATH_ENV" "$NODE" inventory_report.js
# 3. 组装经营播报 HTML(账单截图 + 文字总结 + 库存货值汇总图 + 各层级趋势图)
"$PY" build_broadcast_html.py
# 4. 部署 broadcast 页(base64 直写磁盘,绕过 sftp 不落盘问题)
"$PY" deploy_broadcast.py
# 5. 生成广播索引页
"$PY" gen_broadcast_index.py
也可直接运行 bash scripts/run_broadcast.sh 一步完成链路二。
企微共 3 条消息:① 账单截图 ② 账单文字(含网页版链接,时间字段统一括号包裹)③ 库存货值图。bill_report.js 默认不发送,必须带 --send;--probe 仅探索页面结构。
支撑操作
- 刷新 MES 会话(登录态过期时):
node refresh_session.js——只登录并保存会话,不跑报表不发群。需要短信验证码时输出OTP_NEEDED并等待$OTP_FILE,将验证码写入后脚本自动继续。可配合「会话守护」常驻真实浏览器,实现免验证码续期。 - 补发消息(提取成功但发送中断/降级时):
"$NODE" resend_bill.js [YYYY-MM-DD] # 补发已保存的账单截图+文字(缺省当天) "$NODE" resend_bill_link.js [YYYY-MM-DD] # 补发含网页版链接的账单文字(加 ⚠️ 前缀标识以本条为准) "$NODE" resend_inventory.js # 复用已抓取的 inventory_data_*.json 重生成货值报告并发送 - 常驻 HTTP 服务(可选):
node update_server.js——GET /update 触发日报更新,GET /status 查状态,端口可用环境变量配置(默认 8787)。
业务约定(通用最佳实践)
- 时间/日期字段一律用括号包裹:如(2026-08-24)、(23:30)
- 企微发送测试节奏:单群验证 → 返回 errcode=0 → 恢复多群推送
- 报告版本号管理 v1.x.y;交付采用「改动汇总表格 + ✅验证 + ⚠️注意 + 用户操作清单」三段式
- 账号密码等敏感信息:存环境变量或本地配置文件,不写入聊天明文
故障排查
常见故障与处理速查见 references/troubleshooting.md。
参考文档
references/flow.md— 双链路详细流程、关键产物、验证点references/scripts.md— 全部脚本清单(用途/参数/产物/运行环境)references/troubleshooting.md— 故障排查与补发手册
微信扫一扫