06号文档 技术实施

排产中枢
技术架构实施方案

用什么技术、怎么组织代码、怎么部署运行、怎么从零建起来

3-5人
初创团队规模
2个月
Phase 0 出 Demo
14项
核心技术选型
10天
首个端到端闭环

04号回答了"系统由什么构成",05号回答了"每个模块做什么"
本文档回答第三个问题:怎么把它建出来

技术选型总览

每一个选型都附带理由——不为炫技,只为最快交付核心价值

⚛️
前端 · PMC工作台
甘特图需要复杂交互,React生态最成熟
React 18 TypeScript Vite
🐍
后端 · API服务
AI生态全在Python;asyncio处理IO密集
Python 3.12 FastAPI
🧮
排产引擎
Google开源CP-SAT,底层C++性能优秀
OR-Tools CP-SAT
🤖
LLM
中文理解强;国产模型做降级备选
Claude API 国产模型备选
🐘
数据库
JSONB灵活schema + schema级租户隔离
PostgreSQL 16
⚡
缓存 + 消息
排产状态缓存 + WebSocket pub/sub
Redis 7
⏰
任务调度
凌晨排产 + 数据同步 + 报表生成
Celery Redis Broker
🐳
部署
初期单机;后续迁移K8s
Docker Compose

为什么选Python?

最关键的选型决策 — 不是最快的语言,但是这个场景的最优选择

✅ 不可替代的优势

  • OR-Tools的Python绑定是一等公民,Go/Node绑定不成熟
  • LLM生态(LangChain、token计算、prompt管理)全部围绕Python
  • numpy/pandas在工时预测、统计分析中必要
  • 数据适配器(解析伙伴云API、处理脏数据)Python最灵活

⚠️ 已知劣势及应对

  • 并发不如Go → FastAPI asyncio处理IO密集;Celery隔离CPU密集
  • 类型不够严格 → 全面使用Pydantic做数据校验
  • 部署不如Go简单 → Docker容器化消除环境差异
真正的瓶颈在LLM API延迟(1-3秒),不在服务端代码执行速度

系统架构全景

模块化单体 — 代码内部严格分层,未来需要拆时只改调用方式

客户端
PMC工作台 (React SPA)
H5端 (React Mobile)
企微/微信
↓ HTTPS / WSS ↓
网关层
Nginx 反向代理
/app/* → 静态资源
/api/* → 后端
↓
API 路由层
/delivery/*
/schedule/*
/chat/*
/workstations/*
/events/*
/reports/*
↓
服务层
AI Service
Schedule Service
Knowledge Service
Push Service
↓
引擎层
CP-SAT 求解器
贪心求解器
级联评估引擎
冲突检测器
↓
数据层
PostgreSQL 16
Redis 7
COS / OSS
伙伴云 API

关键决策:模块化单体

不做微服务 — 3-5人团队的运维开销不值得;但代码内部严格分层

单进程 FastAPI 内部分层

排产中枢 (单进程 FastAPI) ├── api/ ← 路由层,薄,只做校验 ├── services/ ← 业务逻辑,各模块互调 ├── engine/ ← 排产引擎,纯计算无IO ├── ai/ ← AI翻译层,LLM封装 ├── adapters/ ← 外部系统适配器 ├── knowledge/ ← 知识库管理 ├── models/ ← SQLAlchemy ORM ├── schemas/ ← Pydantic请求/响应 ├── core/ ← 配置、安全、中间件 └── workers/ ← Celery异步任务

拆分触发条件(不急,等真的需要时)

排产引擎CPU占用影响API响应
→ 拆为独立 worker 进程
LLM调用量大到需要独立限流
→ AI翻译层独立部署
大客户要求物理隔离
→ 按租户独立部署

多租户数据隔离

PostgreSQL Schema 级隔离 — 最强的逻辑隔离,即使SQL注入也只能访问当前 schema

请求 → Schema 路由

JWT Token
→
中间件提取
tenant_id
→
ContextVar
注入
→
SET
search_path
async def get_db() -> AsyncSession: async with session_factory() as session: tenant_id = current_tenant_id.get() await session.execute( f"SET search_path TO tenant_{tenant_id}, shared, public" ) yield session

Schema 结构

shared
行业模板、系统配置、LLM模型配置
tenant_factory_001
workstation, capacity_slot, scheduled_task, task_dependency, execution_log, customer_rule, conversation_log
tenant_factory_002
完全隔离,互不可见

排产引擎 · 三策略体系

根据场景特征自动选择求解策略 — CP-SAT超时则自动降级到贪心

CP-SAT 精确求解器
🎯
适用: < 50 个任务
超时: 10 秒
质量: 全局最优
原理: 约束编程
决策变量 → 工站分配约束
无重叠约束 → 前序依赖约束
目标: 最小化加权延迟
贪心求解器
⚡
适用: > 50 个任务
响应: < 1 秒
质量: 可用解
原理: 优先级排序
按优先级×紧急度排序
逐任务找最早可用工站
也做CP-SAT超时的降级方案
TOC-DBR
🔗
适用: 瓶颈利用率 > 90%
响应: < 3 秒
质量: 瓶颈最优
原理: 瓶颈优先
先排瓶颈工站
其他工站围绕瓶颈节奏
降低问题规模
请求进入
→
SolverSelector
评估任务数/瓶颈/时限
→
执行求解
→
超时?
降级贪心
→
返回结果

AI翻译层 · 两阶段意图路由

关键词匹配覆盖80%(<1ms),LLM只处理剩余20%(200-500ms)

第一阶段: 关键词快速匹配

意图关键词示例
交期试算能不能交、什么时候能出、排得下吗
插单评估加一单、插个单、急单
异常响应坏了、故障、停机、料没到
假设推演如果、假设、要是、万一
状态查询到哪了、进度、做完了吗

第二阶段: LLM 兜底分类

触发条件
关键词匹配置信度 < 0.8 或无匹配
使用模型
Claude Haiku — 快且便宜
返回格式
{intent, confidence, entities}
设计哲学:LLM只做人理解,不做排产计算。所有数字结果由引擎产出。

LLM Client + Prompt Builder

多 Provider 降级 + 工厂上下文动态注入

LLM Client — 多 Provider 支持

请求
→
Claude API
✗
国产模型
降级
# 模型映射 "claude-sonnet" → claude-sonnet-4-6 "claude-haiku" → claude-haiku-4-5 "claude-opus" → claude-opus-4-6 # 两种调用模式 complete() → 同步,用于意图分类 stream() → 流式,用于对话回复

Prompt Builder — 动态上下文

你是{factory_name}的排产助手。 当前工厂概况: - 工站共{workstation_count}台 - 今日在制工单:{active_orders}个 - 瓶颈工站:{bottleneck} (利用率{bottleneck_util}%) - 今日产能利用率:{today_util}% 回答规则: 1. 用PMC能理解的语言 2. 排产调整必须展示影响范围 3. 不确定的数据标注置信度 4. 给可操作建议 5. 多方案标注优劣

适配器层 · 伙伴云对接

统一接口抽象 + 数据质量补偿 — 不中断同步,记录异常

统一适配器接口

class BaseAdapter(ABC): async def fetch_demands() → 接口A:需求信号 async def fetch_materials() → 接口B:物料约束 async def fetch_routings() → 接口C:产品工艺 async def push_instructions() → 输出A':生产指令 async def push_alerts() → 输出B':物料预警
已实现: 伙伴云 预留: 飞书 Excel

数据质量补偿策略

库存 15% 安全缓冲
available = raw_stock × 0.85
库存数据可能不实时 → 置信度 0.7
异常不中断
单条订单数据异常 → 记录 warning → 继续同步
在途数量交叉补充
从采购明细表汇总在途量 → 丰富物料数据

前端架构 · 甘特图核心

Canvas 渲染性能 + HTML Overlay 交互 — 几百个任务不卡

Canvas 层 (渲染)

时间网格 任务块 依赖箭头线 "现在"标记线
为什么用 Canvas?
DOM方案需要创建几百个 div → 卡
Canvas 一次绑定,性能恒定

HTML Overlay 层 (交互)

拖拽影子 Tooltip 右键菜单 时间吸附

拖拽排产流程

① onDragStart
创建半透明影子 + 高亮可放置工站
② onDragMove
实时显示新时间/工站 + 15分钟粒度吸附
③ onDragEnd
→ 调用后端冲突检测API (< 200ms)
④ 冲突处理
有冲突 → 弹出面板 | 无冲突 → 直接应用
WebSocket 实时联动 AI 对话窗 ↔ 甘特图高亮

数据同步 + 缓存策略

全量同步 (凌晨) + 增量同步 (事件驱动 / 轮询兜底) + 健康检测

同步策略

🌙 全量同步 · 每日凌晨 3:00
拉取伙伴云全量数据 → diff → 更新缓存 → 触发重算
⚡ 增量同步 · 事件驱动
伙伴云 Webhook → Redis 事件队列 → 处理
Webhook不可用时: 每1小时轮询兜底
🔍 健康检测
失败 3 次 → 告警
数据 > 4 小时 → 界面标注 "数据可能不是最新的"

Redis 缓存设计

缓存键TTL失效触发
schedule:{tenant}:{date} 5分钟 排产更新/任务完成
capacity:{tenant}:{ws}:{date} 10分钟 产能/排产更新
material:{tenant}:{id} 1小时 物料同步
chat_session:{id} 30分钟 会话关闭
策略: 写时失效 + TTL兜底。甘特图加载走缓存,排产操作走实时。

部署架构 · 渐进演进

从单机 Docker Compose 到 K8s — 每个阶段只用刚好够用的基础设施

Phase 0 · 单机
1 台 4核8G 云服务器
Docker Compose 一键部署
PG + Redis 同机
前端 CDN 加速
支撑 1-3 租户 · ¥300/月
Phase 1 · 小集群
API 2台 (2核4G × 2)
DB 独立 1台 (4核16G)
Redis 1台 (2核4G)
Celery Worker 1台 (4核8G)
支撑 10-30 租户
Phase 2+ · K8s
腾讯云 TKE / 阿里云 ACK
服务按需水平扩展
云 RDS (自动备份/读写分离)
云 Redis
按需弹性扩展

CI/CD 流水线

git push main
→
pytest + mypy
→
Build Docker
→
Push Registry
→
SSH Deploy

监控 · 安全 · 可观测性

Prometheus + Grafana 双看板 · JWT + RBAC 四角色 · Schema 级租户隔离

监控指标

业务指标
日活租户数
每日对话数
试算响应时间
建议采纳率
置信度趋势
技术指标
API P50/P95/P99
LLM成功率/延迟
引擎计算时间
Redis命中率
Celery队列长度
告警规则
API P99 > 5s · LLM 连续失败 3 次 · 同步失败 3 次 · 连接池用完 · 磁盘 > 80%

权限矩阵 (RBAC)

角色核心权限
admin 全部权限 (*)
pmc 排产读写 · 交期试算 · 完整对话 · 规则管理 · 报表
sales 交期试算 · 本客户排产只读 · 交期相关对话
workshop 本工站排产只读 · 报工
安全三层: HTTPS全程加密 · JWT + schema隔离 · 密钥存云KMS

Phase 0 · 10天实施计划

两周内完成端到端闭环 — PMC用自然语言做交期试算

第一周: 基础骨架

Day 1-2 · 项目初始化
GitHub仓库 · Docker Compose环境
数据库模型 · Alembic迁移
基础API骨架 · JWT认证
Day 3-4 · 排产引擎核心
CP-SAT求解器(最简版)
贪心求解器 · 策略选择器
交期试算API · 单元测试
Day 5 · 前端原型
React + Vite + TypeScript
甘特图最简原型(Canvas + 静态数据)
API联调

第二周: AI + 伙伴云接入

Day 6-7 · AI翻译层
LLM Client · 意图路由器
Prompt Builder · 完整链路
NL → 意图 → 引擎 → NL
Day 8-9 · 伙伴云适配器
伙伴云API对接
字段映射配置 · 数据同步Task
真实数据跑通交期试算
Day 10 · 集成验证 🎯
端到端: 自然语言 → 交期试算 → 甘特图
响应时间 < 5 秒
Demo给内部团队

关键技术风险与应对

每个已知风险都有降级方案 — 没有单点故障可以让系统完全不可用

风险概率应对策略
OR-Tools 复杂场景求解超时 中 10秒超时 → 自动降级贪心;瓶颈优先降低问题规模
Claude API 中国访问不稳定 中 国产模型降级(通义千问/智谱);缓存常见意图分类结果
伙伴云 API 变更或限流 中 适配器层解耦;本地全量缓存降级;监控API调用成功率
甘特图自研工期超预期 中 Phase 0 先做只读(简单得多);拖拽交互 Phase 1 再加
多租户数据隔离出bug 低 中间件强制注入tenant_id;单元测试覆盖跨租户访问
LLM 幻觉导致排产建议出错 中 LLM 只做翻译不做计算;所有方案由引擎产出;PMC必须确认
核心原则
用最少的技术复杂度,最快地把核心价值 — 交期试算 + AI对话 — 交付到PMC手上