料领到产线后在生产中报废,要在 MOM 里走报废流程并能统计金额。
- mom_scrap_client:Track **唯一**一处主动写 MOM 的通道。读仍走直连只读库
(MOM 查询接口有权限与行级隔离),写必须走接口(跨库直写会绕过 MOM 的
全部业务校验、权限与审批)。
- product_scrap_service:归属校验是关键 —— 可见范围是整台设备、不是「谁领的」,
不能靠隐藏来防,必须在写入前确认这条 mom_line_id 就挂在这台设备上。
申请人直接用当前登录人(Track 的 sub 就是 MOM sys_user.id),
MOM 里显示的就是本人,不需要服务账号也不会串人。
- 幂等:track_ref 由前端在打开弹层时生成一次、重试复用;网络超时后重试
不该在 MOM 里多报一张单。
- 状态与金额**实时回查 MOM**,不在本地存副本:报废没有回调,本地那份立刻
就过期;且金额取决于执行时的实际扫码量(MOM 允许少扫),受理量 ≠ 执行量。
⚠️ 未执行时 total_loss 是 null 不是 0 —— 0 会让人以为「这东西不值钱」。
- MOM_INTERNAL_API_KEY 走环境变量且不给默认值:未配置时报废提交 503,
而不是让一个写接口在生产上默默开着。
99 lines
4.0 KiB
YAML
99 lines
4.0 KiB
YAML
# ============================================================
|
||
# 生产流转管理系统 — 全栈 Docker 热更新开发环境
|
||
# 启动: docker compose up -d --build
|
||
# 停止: docker compose down
|
||
# 日志: docker compose logs -f
|
||
# ============================================================
|
||
|
||
services:
|
||
# ============================================================
|
||
# PostgreSQL 15 + pgvector
|
||
# ============================================================
|
||
db:
|
||
image: pgvector/pgvector:pg15
|
||
container_name: track_db
|
||
restart: unless-stopped
|
||
environment:
|
||
POSTGRES_USER: track
|
||
POSTGRES_PASSWORD: track_prod_2026
|
||
POSTGRES_DB: track_production
|
||
ports:
|
||
- "8012:5432"
|
||
volumes:
|
||
- track_pgdata:/var/lib/postgresql/data
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "pg_isready -U track -d track_production"]
|
||
interval: 10s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
# ============================================================
|
||
# FastAPI 后端 — --reload 热更新
|
||
# ============================================================
|
||
backend:
|
||
build:
|
||
context: ./backend
|
||
dockerfile: Dockerfile.dev
|
||
container_name: track_backend
|
||
restart: unless-stopped
|
||
environment:
|
||
# 🚀 track 主库用容器名 track_db,避免与 MOM 的 inventory_db(别名 db) 在同一网络下 DNS 解析冲突
|
||
DATABASE_URL: postgresql+asyncpg://track:track_prod_2026@track_db:5432/track_production
|
||
SECRET_KEY: change-me-in-production
|
||
DEBUG: "true"
|
||
# 8010 = PC 管理端;5173/8020 = track-uniapp 的 H5 调试服务
|
||
# (HBuilderX「运行到浏览器」起在 5173,直接跑 vite 按 track-uniapp/vite.config.ts 是 8020)。
|
||
# ⚠️ 漏了 uniapp 的来源时,浏览器会在 CORS 预检阶段就掐掉请求,
|
||
# 表现是「点登录没反应」,且控制台只报一句笼统的 404/400。
|
||
CORS_ORIGINS: '["http://localhost:8010","https://localhost:8010","http://192.168.9.80:8010","https://192.168.9.80:8010","http://localhost:5173","https://localhost:5173","http://192.168.9.80:5173","https://192.168.9.80:5173","http://localhost:8020","https://localhost:8020","tauri://localhost"]'
|
||
# 🚀 MOM 老系统数据库 — 通过容器名解析(projects_default 网络内 DNS),不再写死 IP
|
||
MOM_DB_HOST: inventory_db
|
||
MOM_DB_PORT: "5432"
|
||
# 🚀 MOM 仓储系统回调 Webhook 验签 Key(与 MOM 侧 TRACK_WEBHOOK_KEY 保持一致)
|
||
TRACK_WEBHOOK_KEY: 2ce5fedb48fde3fd7e0abf67472a5027b03e9ae6f19cf768
|
||
# 🚀 MOM 内部接口 —— Track **主动调 MOM** 发起生产报废(唯一一处主动写 MOM)
|
||
# ⚠️ 与上面的 TRACK_WEBHOOK_KEY 是**两把不同的钥匙**:
|
||
# 上面那把是「MOM 发给 Track 时的验签凭证」,这把是「Track 发给 MOM 的凭证」,
|
||
# 方向相反、权限不同(这把能发起报废审批),必须能独立轮换。
|
||
# ⚠️ 未配置 → 报废提交直接 503,**不静默降级**(写操作静默失败最伤人)
|
||
MOM_INTERNAL_API_URL: http://inventory_api:8000
|
||
MOM_INTERNAL_API_KEY: ${MOM_INTERNAL_API_KEY:-}
|
||
ports:
|
||
- "8011:8000"
|
||
volumes:
|
||
- ./backend:/app
|
||
depends_on:
|
||
db:
|
||
condition: service_healthy
|
||
networks:
|
||
- default
|
||
- mom_net
|
||
|
||
# ============================================================
|
||
# Vite + React 前端 — HMR 热更新
|
||
# ============================================================
|
||
frontend:
|
||
build:
|
||
context: ./frontend
|
||
dockerfile: Dockerfile.dev
|
||
container_name: track_frontend
|
||
restart: unless-stopped
|
||
environment:
|
||
VITE_API_BASE_URL: /api/v1
|
||
ports:
|
||
- "8010:1420"
|
||
volumes:
|
||
- ./frontend:/app
|
||
- /app/node_modules # 匿名卷,不覆盖容器里的 node_modules
|
||
depends_on:
|
||
- backend
|
||
|
||
networks:
|
||
mom_net:
|
||
external: true
|
||
name: projects_default
|
||
|
||
volumes:
|
||
track_pgdata:
|
||
name: track_pgdata
|