业务原话(2026-10-27):「发货时效也需要钉钉通知:13 点核验 7 点前的超时单, 核验完成后通知;18:00 核验的订单,核验完成后也通知。」 ## 做了什么 - 新增 `warehouseShipTimelinessNotifySettings`:配置与状态存取,两个轮次各一个推送时刻 (NOON 默认 13:05 / AFTERNOON 默认 18:05),加签密钥走 resilientSecretStore。 - 新增 `warehouseShipTimelinessNotifyJob`:正文组装 + 每分钟 tick + 启动后 30 分钟补推窗口。 - 路由:`GET/PUT /api/warehouse-ship-timeliness/notify/settings`、 `GET .../notify/state`、`POST .../notify/run`(dryRun / probe / force)。 - `index.js` 注册 `startShipTimelinessNotifyScheduler()`。 - 前端:页面右上「钉钉通知」→ 弹窗(开关、两个时刻、webhook、加签密钥、明细条数、 @所有人、页面链接、受控预览块、上次推送)。顺带把 held 明细弹窗的 `destroyOnClose` 改成 `destroyOnHidden`(antd 5.25 已弃用)。 ## 口径要点 - **一天两推,各绑一个轮次**:13:00 轮核验「今天 07:00 前审核」、18:00 轮核验 「截止 16:00 前审核」(都含历史未发)。两轮互不影响,两个时刻配成同一个 HH:mm 时两轮都推。 - **默认核验点 + 5 分钟**,不是整点:状态镜像 `query_time` 要略晚于核验时刻, 整点推容易 `coversDeadline=false`(数据没覆盖核验点、超时数偏大)。 这种时候消息里会带一行提示,仍照发(业务要的是「核验完就通知」)。 - **去重键 `<北京日期>|<轮次键>`**,一天两轮各自独立;推送成功才写状态,失败不写。 - **0 单超时也推**(群里看到「本轮 0 单」= 任务没挂)。 - **明细一行 = 仓|内部单号|线上单号|审核 时间|已等 X 小时**; 历史单的审核时间带 MM-DD —— 13:00 轮含历史未发单,只写「审核 16:13」会被读成今天。 - 明细按仓聚集 + 每仓保底 1 条,钉钉 text 超长时从末尾砍。 ## 验证 - `backend/test/warehouseShipTimelinessNotify.test.js` 新增 17 条,全过。 - 后端 `check-syntax` 通过;`node --test test/*.test.js` 491 条 / 489 过 / 2 失败, 失败两条是既有环境问题(`cloudDatabaseConfigCache` 负缓存用例依赖数据库不可达、 `resilientSecretStore` 的 0600 权限断言在 Windows 恒为 0o666),与本改动无关。 - 前端 `eslint src/pages/WarehouseShipTimeliness src/api/warehouseShipTimeliness.js` 0 错; `vite build` 通过(含 `verify-router-lazy`)。 - 本地真渲染:页面右上出现「钉钉通知」,弹窗完整渲染、点「预览正文」出正文块,无 pageerror (验收时把 `/notify/**` 全部 mock —— 本地系统库与生产是同一个,避免写坏生产配置)。 - 本地实数据预览(13:00 轮,冷查 46s):超时 15 单 / 4 个仓 / 不计考核 672 / 剔除 1; 同一时刻请求 18:00 轮返回 `before_deadline`(未到 18:00 不推半成品)。 ## 风险与回退 - 默认关闭(`enabled=false`)且未配 webhook 时一切接口只返回 `not_configured`,不会发消息。 - 想彻底停掉:`DISABLE_WST_NOTIFY=true` 或把推送开关关掉;两者都不影响页面本身。 - 回退:删掉 `startShipTimelinessNotifyScheduler()` 一行即可停调度,新增文件无副作用。
拼多多自动化运营平台
公开的拼多多业务精简版。欢迎所有人克隆、修改、分发代码并提交 Pull Request,代码按 MIT 许可证开放。
保留商品监控、仪表盘、激励看板、营销活动、推广、商品分析、工单以及在线客户端与执行任务等现有模块。部分菜单仍沿用原项目的占位页面。
已删除市场数据、店铺管理和运营工具整组页面、Claw 对话、skills 管理、平台切换与其他平台演示页,以及对应路由、页面资源、专属配置接口和权限项。首页为仪表盘。保留业务仍使用的模型配置、商品数据查询、桌面会话和自动上架公共服务继续可用;Claw 补全与图搜备用通道已经移除,缺失资料需使用业务接口或手工补充。
本地启动
需要 Node.js 22。团队开发机器无需安装或初始化 MySQL、Redis 及第三方数据库;使用管理员发放的部署 Key,一次注册后自动连接中央系统数据库、公网 TLS Redis 和第三方数据库。完整步骤及安全边界见 远程系统数据库部署。
npm --prefix backend ci
npm --prefix frontend ci
npm run remote:dev
首次启动时填写配置请求地址和部署 Key,系统自动写入被 Git 忽略的本机配置并重启后端。保存一次性显示的管理员账号和密码后直接登录,不需要在本地创建数据库或继续执行设置向导。前端默认访问 http://localhost:5173,API 默认代理到本地后端。
拉取主仓库更新后必须停止旧的 npm run remote:dev 进程并重新启动,保证前后端使用同一版本。MKH 页的强制刷新带有版本协议校验;如果新前端仍代理到未重启的旧后端,页面会停止展示可能过期的库存并明确提示重启,不再将旧值冒充为“最新数据”。
验证与构建
npm --prefix backend run check
npm --prefix frontend run check
前端构建输出位于 frontend/dist。部署时需为单页应用配置路由回退,并代理 /api 与 /cubejs-api 到后端。
启动时会迁移旧侧栏配置,并删除已退役页面的权限、专属设置和专用数据表。上架测算旧偏好表中的商品分析阈值会先迁移到商品分析专用表;其他保留模块的数据不受影响。迁移仅作用于实际配置给此实例的系统数据库。
参与修改
开始开发前请阅读 仓库提交与合并规范(多用户与 AI 开发必读)。准备更新生产服务器时必须继续阅读 服务器部署规范(开发者与 AI 必读)。AI 工具的规则入口为 AGENTS.md。每个任务使用独立目录和分支,通过 PR、同步验证和独立审核合并,禁止强推或覆盖其他开发者的工作。
所有用户均可 Fork 仓库、创建分支并提交 Pull Request。直接推送本仓库需要仓库所有者授予协作者写权限。提交时请说明修改和验证结果,勿提交 .env、密码、令牌、数据库备份或真实业务数据。