feat: LICA 部门独立实例 — 组织隔离与端口/标识改造

派生自 IRIS 实例的 feature/ai-audit-update @ 192c8ee,在同一台机器上独立运行。

隔离机制(开关集中在 app/core/config.py 的 ORG_DEPARTMENT / MATERIAL_CATEGORY_PREFIX):
- 登录:sys_user 查询增加 department 条件,非本部门账号一律 401
- 人员列表:服务端钉死部门、忽略客户端传参;删除「异常退回全表」的降级分支
- 物料:groups 与 items 都增加 category LIKE 'LICA/%' 前缀过滤
- 人员操作统计:把硬编码的 department='IRIS' 改为配置项

物料为什么用前缀而不是 LIKE '%LICA%':
MOM 里存在 171 条 IRIS/成品/LICA/...(无人机/野外便携/高塔监测等),
模糊匹配会把这些 IRIS 物料漏给 LICA。实测前缀匹配命中 795 条 / 5 个分组。

部署隔离:
- 端口 8030/8031/8032,容器名 lica_*,卷 lica_pgdata(与 IRIS 完全独立)
- 服务名改为 lica_backend,避免在 projects_default 网络上与 IRIS 的 backend
  重名 —— 否则将来任何一方写 http://backend:8000 会随机打到另一个部门
- SECRET_KEY 重新生成:实测两边 token 互不通用(双向 401)

客户端标识(不改会导致两个部门的客户端互相覆盖):
- Tauri identifier 改 com.lica.production(否则桌面端互相覆盖安装,且共用
  WebView 数据目录会让 track_admin_token 串号)
- uni-app appid 改 __UNI__D2F4A19(否则同机 APK 互相覆盖、wgt 热更新串号)
- uni-app 地址端口 8011 → 8031(收敛在 utils/config.js 单一来源)
- sync-watch.sh 的 DST 指向 LICA 专属 HBuilderX 目录(否则会把源码灌进 IRIS 工程)

排除项:未复制 deploy.sh / deploy_full.sh / docker-compose.prod.yml ——
它们写死了 IRIS 的生产服务器,误跑会覆盖线上系统。
This commit is contained in:
2026-09-21 16:10:52 +08:00
parent 3286a11bc7
commit 347b7b6a68
15 changed files with 237 additions and 110 deletions

View File

@ -1,58 +1,76 @@
# ============================================================
# 生产流转管理系统 — 全栈 Docker 热更新开发环境
# LICA 生产流转管理系统 — 独立实例(与 IRIS 版同机共存)
# 启动: docker compose up -d --build
# 停止: docker compose down
# 日志: docker compose logs -f
#
# ⚠️ 首次部署必须先跑数据库迁移,否则业务接口全部 500
# docker compose exec lica_backend python -m alembic upgrade head
# ============================================================
name: track-lica
services:
# ============================================================
# PostgreSQL 15 + pgvector
# PostgreSQL 15 + pgvector — LICA 独立库
# ============================================================
db:
image: pgvector/pgvector:pg15
container_name: track_db
container_name: lica_db
restart: unless-stopped
environment:
POSTGRES_USER: track
POSTGRES_PASSWORD: track_prod_2026
POSTGRES_DB: track_production
POSTGRES_USER: lica
POSTGRES_PASSWORD: bc7e44ba7aa424b5a1d95a53dec824fc
POSTGRES_DB: lica_production
ports:
- "8012:5432"
- "8032:5432"
volumes:
- track_pgdata:/var/lib/postgresql/data
# ⚠️ 绝不能与 IRIS 的 track_pgdata 共用,否则两个部门写同一个库
- lica_pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U track -d track_production"]
test: ["CMD-SHELL", "pg_isready -U lica -d lica_production"]
interval: 10s
timeout: 5s
retries: 5
# ============================================================
# FastAPI 后端 — --reload 热更新
# 服务名用 lica_backend 而非 backend服务名会作为网络别名注册到
# projects_default与 IRIS 实例的 backend 重名会导致将来任何一方
# 写 http://backend:8000 时随机打到另一个部门。
# ============================================================
backend:
lica_backend:
build:
context: ./backend
dockerfile: Dockerfile.dev
container_name: track_backend
container_name: lica_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
# ⚠️ 主机名必须是 lica_db绝不能写 db ——
# MOM 的 compose 服务名就叫 db在 projects_default 网络上
# 会把本后端解析到 MOM 生产库并写入。
DATABASE_URL: postgresql+asyncpg://lica:bc7e44ba7aa424b5a1d95a53dec824fc@lica_db:5432/lica_production
# ⚠️ 必须与 IRIS 不同get_current_user 只验签名不查库,
# 两边共用密钥则 IRIS 签发的 token 可直接访问 LICA 接口。
SECRET_KEY: aQy1zyEJY50OJlYrZ2OkNgQN3N46F4bvjYVdva0y4N3wpfaZotf9NKBTZ0CTDeLD
DEBUG: "true"
# 8010 = PC 管理端5173/8020 = track-uniapp 的 H5 调试服务
# ---- 组织隔离(本实例唯一的部门开关,供登录/人员/物料三处 SQL 引用)----
ORG_DEPARTMENT: LICA
MATERIAL_CATEGORY_PREFIX: "LICA/"
# 8030 = 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
CORS_ORIGINS: '["http://localhost:8030","https://localhost:8030","http://192.168.9.80:8030","https://192.168.9.80:8030","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 保持一致)
# MOM 回调验签 Key — 暂与 IRIS 相同MOM 侧目前只有单个 TRACK_WEBHOOK_KEY
# 且回调地址写死指向 IRIS 的 track_backend。待 MOM 支持按部门双推后,
# 再决定是否给 LICA 单独签发。(在此之前 LICA 收不到出入库联动)
TRACK_WEBHOOK_KEY: 2ce5fedb48fde3fd7e0abf67472a5027b03e9ae6f19cf768
ports:
- "8011:8000"
- "8031:8000"
volumes:
- ./backend:/app
depends_on:
@ -69,23 +87,23 @@ services:
build:
context: ./frontend
dockerfile: Dockerfile.dev
container_name: track_frontend
container_name: lica_frontend
restart: unless-stopped
environment:
VITE_API_BASE_URL: /api/v1
ports:
- "8010:1420"
- "8030:1420"
volumes:
- ./frontend:/app
- /app/node_modules # 匿名卷,不覆盖容器里的 node_modules
depends_on:
- backend
- lica_backend
networks:
mom_net:
external: true
name: projects_default
name: projects_default # MOM 系统所在网络IRIS 实例也在此网络上)
volumes:
track_pgdata:
name: track_pgdata
lica_pgdata:
name: lica_pgdata