v7 · Execution Playbook · 2026-07-05
Nexora ERP
统一架构战略方案
以龙凤 ERP(xylferp)为主干合并 · 妈祖(pyerp)深度并入 · 3 阶段完成 · 一份代码 + 一租户一库 + 统一 API。本文档 = 执行手册,§08 仓库处置总表是唯一 SoT · §09 明确不做的事画负范围 · §10 决策日志留历史脉络。
owner: mike · baseline: xylferp(龙凤)骨架 + 首个租户 · target repo: nexora/nexora-erp(空 group 已建 gid=75)
✓ v7 收敛为执行手册 · 34 个 repo 每个一个动作 tag · 明确不做的事显式画界
01 / 现状盘点(实测)
从哪里出发
GitLab xipugold group 下实际有 34 个仓库,战略相关的核心是 12 个:4 套 ERP + 2 套商城 + 3 套小程序体系 + 3 套手机端相关。下面是实测数据。
1.1 ERP 主干四仓库(合并的核心对象)
| 仓库 |
First commit |
Commits |
Ctrl 数 |
多租户 |
性质 |
| xylferp_php |
2025-11-22 "线游龙凤 erp" |
113 |
75 |
aid=1896 · bid=492 |
原始仓 · 唯一有真实开发历史 · 客户「线游龙凤」 |
| xipu_erp_php |
2026-02-09 "初始" |
17 |
75 |
aid=1896 · bid=492 |
2026-02-09 从 xylferp squash,后小改 · 客户「囍铺」 |
| baijian_php |
2026-02-09 "初始" |
4 |
73 |
aid=1896 · bid=492 |
2026-02-09 squash 后几乎没动 · 客户「摆件」 |
| pyerp_php |
2026-02-09 "初始" |
104 |
112 |
aid=2285 · bid=566 · pt_type=50 |
深度定制版 · 独有 58 controller · 加了第三层租户 pt_type · 独有贵金属 Ymetal + 妈祖商城 Ep* + Xipu 对接 · 客户「妈祖(点可云进销存)」 |
✓ 血缘与同源度实测
- xylferp / xipu / baijian 三家 md5 一致 controller: 55/75(73% 同源,合并极其容易)
- xipu/baijian 的
Sell.php / Stock.php / Customer.php / Bill.php md5 完全相同——只是各自独立部署
- pyerp 独有 controller 58 个:主要是 Ymetal* 贵金属系列 + Epuser/Eprole/Epservice 妈祖企业版 + Xipu.php(妈祖跨接过喜铺)
- 4 家共享 controller: 54 个 = 采购 / 销售 / 库存 / 门店 / 客户 / 财务 / 供应商 等通用能力
1.2 商城与共享 shop 数据层
| 仓库 |
Size |
Commits |
性质 |
| pyerp_shop_php |
442M |
39 |
妈祖商城(ShopXo 系)· pyerp 内部通过 Ep* 系列 controller 对接 |
| baijian_shop_php |
20G .git 巨大 |
9 |
摆件商城(ShopXo 系)· 共用 baijian_php DB |
| laiya_php |
864M |
6 |
莱雅商城(ShopXo + ThinkPHP)· 走 Db::connect('mysqls') 连共享 shop 库(shop / store / shop_kucun 等)· 不是直查 erp_ 表 |
✓ 商城耦合的真实形态
- 不是"商城直查 ERP 数据库",而是"商城 + ERP 共用一套 shop 数据层"
- 共享 shop 库承载的是零售交易层(店铺/库存/条码/规格) · ERP 主库承载采购/客户/财务
- xipu/pyerp 的 controller 里都能找到
shop_kucun / shop_xiangqian 表引用 · 也就是 ERP 也读 shop 库(双向读写)
1.3 小程序体系(3 端莱雅)
laiya_wx — 主商城小程序
laiya_jxs_wx — 经销商小程序
laiya_lss_wx — 零食师小程序(含金蛋/盲盒/秒杀活动)
pyerp_shop_wx — 妈祖商城小程序
lyshop_wx — 另一个未验证的小程序(仓库存在,未 clone)
1.4 手机端(3 套 UniApp + 1 套 Kotlin 后端)
| 仓库 |
类型 |
Commits |
性质 |
| pyerp_app |
UniApp 前端 |
79 |
妈祖手机端 · 直连 pyerp_php 后端(baseURL: myhw.meiyuhaowu.com) |
| kotlinapi_uniapp |
UniApp 前端 |
32 |
囍铺手机端原始版 · 接 sprin-boot-kotlin219 后端 |
| app_xiao_shou_kotlin |
UniApp 前端 |
669 |
多客户版本(2025-06-05 起) · SERVER_LIST 已支持切换「周锦记(Kotlin 后端,含 WS)」和「妈祖(PHP 后端,无 WS)」· 566M |
| sprin-boot-kotlin219 |
Kotlin 后端 |
78 |
SpringBoot + Kotlin · 52 个 controller · 6 个模块(api/member/order/print/shop/user)· 命名空间 rn.rw.erp |
| sprin-boot-kotlin219-xylf |
Kotlin 后端 |
2 |
xylferp 版分叉(3.5M) · 几乎没动 |
| fastify_spring_app_api |
Node |
5 |
废弃 |
| fastify_ts_app_api |
Node |
1 |
废弃 |
✓ 手机端归口的真实起点
- app_xiao_shou_kotlin 已经在做多客户版(669 commits · 2025-06 起) · 战略要顺着它继续推,不是从零设计
- 它的 SERVER_LIST 已定义两种后端类型:
backend: 'kotlin'(囍铺/周锦记系,含 WS)和 backend: 'php'(妈祖系,无 WS,直连 pyerp_php)
- 老的 kotlinapi_uniapp 和 pyerp_app 是历史遗留 · 未来要合到 app_xiao_shou_kotlin 里
- sprin-boot-kotlin219 是**真** Kotlin 后端(52 controllers) · 不能简单下线,而是要作为 Nexora 的一部分保留(负责 WebSocket / 实时通信)
1.5 其他仓库(战略相关性次要)
hjhs — 黄金回收(CRMEB 独立框架)· 200+ controllers · 完全不同基因,建议保持独立
wl_php / wl_web — 未验证(名称疑似「物流」)
waimao_php — 未 clone(疑似「外贸」)
hjt / supererp / xipu_new / pyerp_php_api — 未验证(未 clone 或 clone 后未深入)
electron_exe / python-auto-print-desktop / password — 桌面工具集,和 ERP 主干无关
02 / 目标架构
一张图看懂 Nexora
分三层:外部入口 → 统一 API 网关 → Nexora ERP 核心(一份代码)+ 平台中心库 + 共享 shop 数据层 → 租户业务库(一租户一库)。核心改动:把「每客户一份独立部署」升级为「一份部署跑多租户」,复用已有的 aid + bid + pt_type 隔离机制。
✓ 目标架构的两个关键洞察
- PHP + Kotlin 双主干共存:不是把 Kotlin 后端下线,而是明确划分职责。PHP 主干负责 ERP CRUD + 事务/审计;Kotlin 后端负责移动端 WebSocket + 实时能力(打印 / 通知 / 队列)
- 共享 shop 数据层:不合并到租户库,继续作为独立数据层。ERP 和商城都通过它读写店铺库存 · 就是现在的实际形态,不改
03 / 已定关键决策
10 条已经拍板的选型(v3 修订)
基线代码(v3 反转)
同源线合并 + pyerp 特性回并
以 xipu/baijian/xylferp 同源线为主干(55/75 md5 一致,合并容易)· 把 pyerp 的贵金属 Ymetal + 妈祖商城 Ep* + pt_type 三层租户 作为独立模块并回来
贵金属
抽为可选模块
Ymetal* 50+ controller(18884 行代码)从 pyerp 抽出为独立模块,其他租户不加载
多租户模型 (v4 收敛)
一租户一库 · aid 作防呆
业务数据物理隔离(每客户独立 DB) · 现有 aid=1896~2285 处代码不改,值恒等于该库的租户 id,退化为"防呆兜底"(万一错连到别家库,查不到数据) · bid/pt_type 保留原语义(门店 · 产品线)
差异化机制
租户配置驱动
同一份代码,通过租户 ID + 模块清单 + aid/bid 上下文决定谁能看到什么
开关粒度
优先大模块级
整块开/关为主 · 菜单/功能点级为辅 · 禁止细到字段级
合并策略
双跑 · 新老互不干扰
Nexora ERP 独开一套环境 · 老 pyerp/xipu/baijian/xylferp 继续跑各自实例 · 数据同步暂缓
Kotlin 后端
保留 · 作为双主干之一
sprin-boot-kotlin219 承担 WebSocket / 实时能力;不能下线 · 未来和 PHP 主干共享租户上下文
执行方式
AI 主力 · Mike 把方向
重活由 AI 干,Mike 审查关键决策与验收
Kotlin 后端
方案 A · 变薄,延后到 Phase 3
最终形态:Kotlin 只保留 WS 长连接 / 打印下发 / 消息推送,业务 CRUD 全归 PHP 主干 · Phase 1-2 不动,老手机端和现有连接原样跑
GitLab 组织
nexora 新 group · 空
已建 gitlab.nexora.restry.cn/nexora(gid=75, private) · 目标 repo nexora/nexora-erp · 老 xipugold/* repo 保留原样跑,合并完成前不动
首个验证客户
龙凤 xylferp · 骨架+首入合一
代码骨架用 xylferp_php(原始仓,113 commits 完整 git 历史)· 客户业务面最广(批发+零售全覆盖)但客户尚未正式启用,可反复迭代
囍铺处置
延后 / 自然退役
实测:囍铺 73 个 controller 全部在龙凤里,仅金价管理 3 方法 + 阿里云图搜 2 controller 独有 · 只做批发,缺零售——龙凤代码已覆盖 95%+ · Phase 3 后视客户情况决定合并或退役
商城基座
妈祖商城单基座
未来所有小程序基于 pyerp_shop_php + pyerp_shop_wx 开发 · 商城合并简化为「Nexora ERP ↔ 妈祖商城」单向对接
04 / 3 阶段合并路线图
从龙凤骨架到 Nexora 的三步走
v6 最终版:Phase 1 龙凤先入 → Phase 2 摆件+妈祖并入 → Phase 3 手机端+Kotlin变薄+商城。囍铺放到最后视情况处置,莱雅系全弃,商城简化为妈祖单基座。比 v5 少一个阶段,因为囍铺代码全在龙凤里,不需要单独 Phase。
PHASE 1
龙凤先入
骨架起点 + 首个租户 · 覆盖 95% ERP 通用能力
PHASE 2
摆件 + 妈祖
摆件验证加租户流程 · 妈祖深度并入(Ymetal / Ep* / pt_type)
PHASE 3
手机端 & 商城 & Kotlin
手机端归口 · Kotlin 变薄 · 妈祖商城合入 · 囍铺择机
PHASE 1
龙凤(xylferp)先入 · 骨架 + 首个租户
为什么第一个:xylferp 是原始仓(2025-11-22,113 commits,git 历史最完整)· 业务面最全(批发 + 零售双业态,报表 / 调拨 / 门店 / 权限齐)· 但客户尚未正式启用生产 · 完美的"敢试"验证客户。骨架起点和首个租户合一。
✓ 龙凤代码覆盖度实证
- 73 个 controller 龙凤和囍铺同名,其中 55 个 md5 完全一致
- 18 个 md5 不同的 controller 里,13 个龙凤更大(采购 Buy +89 行 / 商品流水 Goodslog +186 行 / 出库 Goodsoutbound +319 行 / 分类 Category +113 行)
- 龙凤独有 3 个方法(gugedel/gugelist/gugesave 骨骼分类 · 零售专属)
- 囍铺仅独有 3 个方法(金价管理 get/save_gold_price · 阿里云图搜 2 controller)
关键任务
- 在 GitLab
nexora group(gid=75)下建 nexora-erp repo · 以 xylferp_php clone 为起点,保留完整 git 历史
- 建租户中心库 schema:
tenants(id / aid / bid / pt_type 映射 / DB 连接串) + tenant_modules(启用清单) + users(跨租户账号) + user_tenants(权限)
- 把 xylferp 的业务库现状迁移进 Nexora 环境 · 建立
nexora_xylferp DB · 跑起来 · 前台可正常访问
- 把「一租户一库运维套件」4 件套(见 §5.5)先落地一份最小可用版
- 抽第一个可选模块
aliyun-image(未来给囍铺租户用) · 作为「模块隔离」样板
验收标准
- 龙凤客户接入 Nexora 环境 · 前台核心功能(采购 / 销售 / 库存 / 门店 / 报表 / 零售)符合原 xylferp
- 业务表
aid 字段不动,值恒等于该租户 id,当"防呆"
- 模块隔离度可验证:关闭
aliyun-image,前台完全看不到相关菜单/接口
- 新租户开通脚本能在 30 秒内建出一个全新空租户 DB
主要风险
- 龙凤独有 controller Config / ScoreConfig 用途不明 · 需先确认业务含义
- 租户中心库 schema 一次定不好,后面 Phase 2/3 再改成本高 · 需前置多想几种客户场景
PHASE 2
摆件(baijian)+ 妈祖(pyerp)迁入
为什么放一起:摆件用来验证"加租户"流程(几乎零业务差异,15 分钟跑通),妈祖是主战场(深度定制,58 个独有 controller,Ymetal 40+ 表)。摆件跑通后立即上妈祖,不间断。
关键任务 · 摆件部分
- 用 Phase 1 建的
bin/tenant-onboard baijian 脚本创建新租户
- 如需保留摆件历史数据 · 迁进
nexora_baijian DB
- diff baijian vs 主干(基于 xylferp) · baijian 独有 0 controller,理论上完美复用主干
- 如发现主干缺失能力,补进核心模块 · 15 分钟跑通验证"加租户"闭环
关键任务 · 妈祖部分
- 贵金属抽模块
ymetal:50 个 Ymetal* controller + 40+ 张表 + 18884 行代码
- 妈祖商城对接抽模块
myhw-shop:Epuser / Eprole / Epservice / Epxipu* 系列
- Xipu.php(pyerp 里跨接喜铺的代码)评估处置
- pt_type 三层租户合并进主干(所有租户都得到这个能力)
- pyerp 的
BaseController + common.php 差异合入主干,保留其他家不用的逻辑为可选
- 建
nexora_pyerp DB · 妈祖客户切换(选低峰,冻结→增量同步→切流→观察 48 小时)
验收标准
- 3 个租户(xylferp + baijian + pyerp)全部在同一份 Nexora 主干代码 + 一租户一库跑
ymetal 可切换:关闭时前台无任何贵金属菜单/接口/表
- 妈祖客户业务不中断(切换窗口 ≤ 2 小时) · 切换后 48 小时零投诉
- 老 pyerp_php 冻结成 read-only 归档
主要风险
- 妈祖 30 天有 48 个 commits(pyerp_php 27 + pyerp_web 21) · 迁移期间增量同步是最脆弱环节
- pyerp 深度定制的边界不清 · 抽 Ymetal 时可能误伤主干(如财务模块引用 Ymetal 表)
- 陈锐群是 pyerp 唯一深度熟悉的开发 · 迁移期间需要他配合验证
PHASE 3
手机端 + Kotlin 变薄 + 商城 + 囍铺择机
收尾阶段。前两个阶段搞定了 3 个客户 + ERP 主干,这一阶段处理手机端 / Kotlin 后端 / 商城 3 条附属线,同时对囍铺做择机处理。
手机端归口 + Kotlin 变薄
- 把 pyerp_app / kotlinapi_uniapp 老手机端归档 · 统一走 app_xiao_shou_kotlin 演化版
- Kotlin 后端 sprin-boot-kotlin219 变薄:52 个 controller 里的业务 CRUD 全迁到 PHP 主干 · 只保留 WS 长连接 / 打印下发 / 消息推送 / 定时任务
- 租户上下文:PHP 主干签发 token,Kotlin 只解析、不签发
- Kotlin 后端不能写业务表,只能读(WS 推送要查最新数据) · 需写数据时通过 HTTP 调 PHP 主干 API
- sprin-boot-kotlin219-xylf 分叉合回主 Kotlin 后端(2 commits,可以简单合并)
商城合入(简化版)
- 唯一商城基座 =
pyerp_shop_php(妈祖商城)
- 唯一小程序基座 =
pyerp_shop_wx(妈祖商城小程序)
- 在 Nexora 主干加轻量
mall-sync 模块 · 定义 ERP ↔ 妈祖商城的 3 条 API 契约(products.sync / orders.push / stock.query)
- 废弃 laiya_php / laiya_wx / laiya_jxs_wx / laiya_lss_wx 全线
- baijian_shop_php 归档 · 未来摆件如复用,基于妈祖商城重做
囍铺择机处置
决策点 · Phase 3 末,评估囍铺现状:
· 若客户仍活跃:合并 3 个金价管理方法 + aliyun-image 模块(已在 Phase 1 抽出),切换到 Nexora(nexora_xipu DB)
· 若客户业务萎缩:囍铺原样跑到自然退役(老 xipu_erp_php read-only 兜底)· 不投入合并成本
验收标准
- 手机端只有一份 App 打包(app_xiao_shou_kotlin),多租户切换靠 SERVER_LIST
- Kotlin 后端 controller 数从 52 降到 ≤ 15(只留实时/推送/打印/job)
- Nexora ↔ 妈祖商城通过 3 条 API 契约通信 · 妈祖商城代码里无直查 Nexora 库
- 老 xipugold group 所有 repo(除 xipu 择机保留外)归档 read-only
主要风险
- Kotlin 变薄期间,老手机端在客户手里已装 · 强升级 App 可行性
- PHP 主干和 Kotlin 后端的租户上下文一致性需要跨语言协议保证
- 妈祖商城 pyerp_shop_php 442M,合入前先审计 shop 库和 ERP 库的表边界
05 / 模块化机制
模块是差异化的最小单位
5.1 核心模块(所有租户必装)
- account — 账号 / 角色 / 权限 / 组织架构 · 复用 aid/bid/pt_type 上下文
- feature-flag — 功能开关引擎 · 大模块 / 菜单级
- product — 商品 / SKU / 分类 · 通用 54 controller 里的核心
- inventory — 库存 / 库位 / FIFO / 调拨 / 盘点
- order — 采购 / 销售 / 审核状态机 / Bill / 财务
- store — 门店 / 仓库 / 收银
- supplier-customer — 供应商 / 客户 / 联系人
5.2 可选模块(按租户启用)
- ymetal — 贵金属(妈祖专属)· 50 个 controller · 18884 行代码 · 40+ 张 Ymetal* 表
- myhw-shop — 妈祖商城对接(Ep* 系列)
- aliyun-image — 阿里云图搜 + OSS(xipu 独有)
- config-scoring — Config / ScoreConfig(xylferp 独有,评估中)
- mall-sync — 商城对接 API · products / orders / stock
- mobile-api — Kotlin WebSocket 接入 · SSO · 实时通信
- distribution — 分销 / 经销商 / 零食师(莱雅系)
- marketing — 金蛋 / 盲盒 / 秒杀 / 优惠券
5.3 模块生命周期规范
每个模块目录 modules/<name>/ 内自包含:路由声明 / 控制器 / 数据表 migrations / 菜单声明 / 权限声明 / 服务接口 Facade。模块间禁止直接调用,统一走 Facade。
5.4 功能开关粒度
| 级别 |
粒度 |
用途 |
| Level 1 | 大模块级 | 整块开关(如「贵金属」)· 存储:tenant_modules。优先用这一级 |
| Level 2 | 菜单/功能点级 | 大模块内子菜单/按钮个别租户不需要 · 存储:tenant_features |
| Level 3 | 字段/条件级 | 禁止使用 · 走业务配置表,不算"功能开关" |
5.5 一租户一库运维套件(v4 新增)
一租户一库的唯一真正代价:运维成本随客户数线性增长。必须把每个环节脚本化,否则 20 个客户后运维会累趴。以下 4 件套是 Nexora 主干必备的运维基础设施,写一次终身受用。
✓ 为什么坚持一租户一库
- 零切换成本 — 现状本来就是每客户一套 DB,Nexora 只是把"独立部署"正名为"独立租户"
- 备份/恢复独立 — 妈祖崩不影响囍铺 · 客户要数据导出 =
mysqldump 一句话
- 升级可灰度 — 新版本先跑小客户(baijian / xylferp),妈祖稳定后再切
- 可选模块表干净 — 摆件不启用贵金属 → 那个库根本没 Ymetal* 40+ 张表,而不是"表存在但为空"
- 大客户可独立扩展 — 未来妈祖数据爆炸,单独换机器 = 移一个 DB
- 客户心理 — 企业客户天然期待"我的数据在我自己库",单库多租户是心理障碍
套件 1 · 新租户开通脚本
bin/tenant-onboard <tenant-slug> --modules ymetal,mall-sync · 一次跑完 4 件事:
- 创建新 DB
nexora_<slug>(charset utf8mb4)
- 跑 核心模块 migrations(account / product / inventory / order / store / supplier-customer)
- 按
--modules 参数选择性跑 可选模块 migrations(ymetal / wedding / distribution ...)
- 初始化种子数据:默认角色 · 菜单树 · 管理员账号 ·
tenants 中心库注册
验收:执行完毕 30 秒内新租户能登录 · 前台菜单只显示启用的模块 · 中心库 tenants.enabled_modules 有正确记录。
套件 2 · migrations 分发机制
核心痛点:主干加了一张新表,要在 N 个租户库都跑一遍。
- 每次发布带 migration 版本号(
V20260701_120000__add_xxx.sql)
bin/migrate-all 遍历中心库 tenants,对每个租户 DB 检查 schema_migrations 表,执行未跑过的 migration
- 失败任一租户即停 + 输出报错;不能"跑了一半就走人"
- 模块启用/禁用时,只跑该模块专属的 migrations
套件 3 · 备份轮询
每个租户库独立备份 · 每晚自动:
- 遍历中心库
tenants 拉全部租户清单 + DB 连接串
- 对每个租户
mysqldump | gzip 到独立目录 /backup/tenant/<slug>/<date>.sql.gz
- 保留策略:daily 7 天 · weekly 4 周 · monthly 6 月
- 校验大小(比昨天缩水 >20% 报警) · 校验能否
gunzip -t 完整解压
- 周期性抽样恢复演练(每季度对一个租户做 restore 到临时库,验证备份可用)
套件 4 · 部署监控
- 中心库
tenants.status 有 active / paused / archived 三态
- 监控面板按租户视角展示:请求 QPS · 错误率 · DB 慢查询 · 磁盘用量 · 备份状态
- 租户级熔断:某个租户 DB 挂了不影响其他租户(连接池按租户隔离)
- 灰度发布支持:同一个二进制部署,按租户 slug 白名单启用新功能开关
时间成本 · 4 件套写一次约 1-2 天工作量(不包括监控面板 UI),但从此可以扛住"20 个客户 → 50 个客户"的运维压力。这是一租户一库策略成立的前提,Phase 1 必须先做。
07 / 下一步
立刻就能启动的事
- 在 GitLab
nexora group(gid=75,已建)下建 nexora-erp repo · 以 xylferp_php clone 起点 · 保留完整 git 历史
- 建租户中心库 schema · 从龙凤(xylferp)一个租户开始
- 抽第一个可选模块
aliyun-image(未来给囍铺租户用) · 作为「模块隔离」样板
- 把「一租户一库运维套件」4 件套(§5.5)先落地最小可用版
- Phase 1 完成:龙凤客户在 Nexora 环境跑通 · 关键 UI 无 regression · 批发+零售双业态可用
- Phase 2 顺移:摆件(15 分钟) + 妈祖(主战场) 并入
- Phase 3 收尾:手机端 + Kotlin 变薄 + 妈祖商城合入 + 囍铺择机
接下来给 Mike 拍板 · 三阶段顺序推 · 老 xipugold/* repo 全部保留原样跑,合并完成前不动。执行细节看 §08 仓库处置总表 + §09 明确不做的事。
08 / 仓库处置总表
34 个仓库 · 一表打尽 · 唯一 SoT
执行时任何"这个仓要不要动"的问题,以本表为准。Action 列 = 强制约束,和路线图冲突以本表为准。
Action 标签定义:
- MERGE — 合并到
nexora/nexora-erp,原 repo 完成后归档 read-only
- KEEP — 原样保留 · 手机端 Phase 3 才动 · Phase 1-2 不动
- LATER — Phase 3 择机处理 · 视客户情况决定合并或退役
- ARCHIVE — 归档 · 客户已停用 · 不做迁移不做合并 · GitLab 标 archived 后完成
- DROP — 弃用 · 客户不再用 · 不投入任何工作 · 归档时打 tag "dropped"
- OUT-OF-SCOPE — 战略无关 · 桌面工具 / 内部小工具 · 无需处置
ERP 主干仓库(4 个)
| Repo | Action | 阶段 | 说明 |
| xylferp_php | MERGE | Phase 1 | 骨架起点 · clone 为 nexora-erp |
| xylferp_web | MERGE | Phase 1 | 前端骨架起点 · clone 为 nexora-erp-web |
| baijian_php | MERGE | Phase 2 | 客户已停 · 只验证「加租户」流程 · 15 分钟跑通 |
| baijian_web | ARCHIVE | Phase 2 | 90 天 0 commits · 前端已上线不改 |
| pyerp_php | MERGE | Phase 2 | 主战场 · Ymetal / Ep* / pt_type 抽模块 |
| pyerp_web | MERGE | Phase 2 | 妈祖前端 · 合入 nexora-erp-web |
| xipu_erp_php | LATER | Phase 3 | 73/75 controller 在龙凤里 · Phase 3 末视客户情况决定 |
| xipu_erp_web | LATER | Phase 3 | 同 xipu_erp_php |
商城仓库(3 个)
| Repo | Action | 阶段 | 说明 |
| pyerp_shop_php | MERGE | Phase 3 | 唯一商城基座 · 合入 Nexora mall-sync 模块 |
| pyerp_shop_wx | MERGE | Phase 3 | 唯一小程序基座 · 未来所有小程序基于此重建 |
| baijian_shop_php | ARCHIVE | Phase 3 | 20G 大 · 客户已停 · 归档不动 |
手机端仓库(6 个)
| Repo | Action | 阶段 | 说明 |
| app_xiao_shou_kotlin | KEEP | Phase 3 | 669 commits 多客户 UniApp 壳 · SERVER_LIST 已支持切「周锦记(Kotlin)/ 妈祖(PHP)」· Phase 1-2 保留原样跑 · Phase 3 演化为 Nexora 统一手机端框架,把 pyerp_app / kotlinapi_uniapp 的业务功能重写进来 |
| pyerp_app | KEEP | Phase 3 | 妈祖手机端(独立 UniApp 项目,和 app_xiao_shou_kotlin 目前无代码合并,只共享 SERVER_LIST 里"妈祖"选项)· Phase 3 把功能重写进 app_xiao_shou_kotlin 后再归档 |
| kotlinapi_uniapp | KEEP | Phase 3 | 囍铺原版手机端 UniApp · 功能已被 app_xiao_shou_kotlin(其演化多客户版)覆盖 · Phase 3 直接归档 |
| sprin-boot-kotlin219 | KEEP → 变薄 | Phase 3 | Kotlin 后端 · 保留 · 方案 A 变薄:52 controller → ≤15 |
| sprin-boot-kotlin219-xylf | KEEP → 合入主 | Phase 3 | 2 commits 分叉 · 合入 sprin-boot-kotlin219 主线 |
| fastify_spring_app_api | ARCHIVE | Phase 3 | 5 commits · 废弃分支 |
| fastify_ts_app_api | ARCHIVE | Phase 3 | 1 commit · 废弃分支 |
弃用仓库(6 个 · 不投入工作)
| Repo | Action | 说明 |
| laiya_php | DROP | 莱雅商城主站 · 客户不再使用 |
| laiya_wx | DROP | 莱雅商城主小程序 |
| laiya_jxs_wx | DROP | 莱雅经销商小程序 |
| laiya_lss_wx | DROP | 莱雅零食师小程序 |
| lyshop_wx | DROP | 莱雅关联小程序 · 客户已停 |
| hjhs | DROP | 黄金回收(CRMEB)· 客户已停 · 不同基因不合并 |
其他仓库(战略无关或未评估)
| Repo | Action | 说明 |
| pyerp_php_api | ARCHIVE | 2 commits · 疑似 API 抽出实验,未成气候 |
| pyerp_shop_h5_dist | OUT-OF-SCOPE | 前端构建产物,不合并 |
| wl_php | OUT-OF-SCOPE | 未评估(疑似"物流")· 战略期不动 |
| wl_web | OUT-OF-SCOPE | 同 wl_php |
| waimao_php | OUT-OF-SCOPE | 未评估(疑似"外贸")· 战略期不动 |
| supererp | OUT-OF-SCOPE | 2026-06 老"超级 ERP 合并"产物 · 见 §10.4 |
| hjt | OUT-OF-SCOPE | 未评估 |
| xipu_new | OUT-OF-SCOPE | 未评估 |
| electron_exe | OUT-OF-SCOPE | 桌面工具 |
| python-auto-print-desktop | OUT-OF-SCOPE | 桌面打印工具 |
| password | OUT-OF-SCOPE | 密码工具 |
09 / 明确不做的事(负范围)
下面这些事情不做
执行时,任何"要不要顺便把 X 也做了"的问题,以本节为准 · 目的是防止 scope creep。看到不在 §04 路线图 + §08 总表里的东西,默认不做。
关于弃用的客户/仓库
- 莱雅商城(4 repo)· 客户已不使用 · 不写归档脚本 · 不写数据导出 · 不跟客户沟通 · GitLab 标 archived 即完成
- hjhs 黄金回收 · 独立 CRMEB 200+ controller · 不做合并 · 不做 SSO · 不做任何对接
- baijian 摆件商城(20G).git · 客户已停 · 不做迁移 · 不做数据备份
关于囍铺
- Phase 1-2 期间 不动囍铺任何代码 · 客户业务不中断
- Phase 3 末视客户情况决定 · 如果客户业务萎缩,不投入合并成本,让其自然退役
- 不做囍铺前端 diff · 不做囍铺数据库 schema diff · 直到决策明确前
关于数据迁移
- Phase 1-3 期间 · 不做真实数据迁移 · 新 Nexora 库和老库物理独立,不同步
- 迁移策略在合并完成 + 稳定运行 3 个月后才评估
- 不做增量同步中间件 · 不做双写
关于手机端
- Phase 1-2 期间 · 手机端不动 · 老 App / 老后端原样跑
- 不做客户 App 强制升级 · 不做旧版本兼容性回退
- 不做 iOS 上架 / 华为渠道打包相关(维持原状)
关于代码风格与技术债
- 不做代码风格重构 · 不做 ThinkPHP 6 → 7/8 升级 · 不做 Vue 2 → 3 升级
- 不做 UI 层重设计 · 保持原有前端交互
- 不做测试覆盖率补齐(除非验收标准明确需要)
- 不做性能优化(除非影响业务可用性)
关于外部集成
- 不做 SSO 打通(除 Nexora 内 PHP ↔ Kotlin 之间必须)
- 不做飞书 OAuth 集成 · 不做微信开放平台账号打通
- 不做第三方 ERP / SaaS 对接
10 / 决策日志
战略的血脉——为什么这么定的
主文档只写"要做什么"和"不做什么"。这里留每一次战略调整的为什么 · 未来接手的人或者 AI 需要理解历史脉络时看这里。
v7 · 2026-07-05 · 执行手册化
Mike 要求收紧 · 从"讨论稿"变成"作战地图"
- 删除 §00 v2→v3 修正 · §06 特殊情况处理 —— 迁入 §10 决策日志
- 新增 §08 仓库处置总表 —— 34 个 repo 每个一个明确的 Action tag,防止 scope 发散
- 新增 §09 明确不做的事 —— 负范围显式画界,防止 AI/人执行时"顺便把 X 也做了"
- 新增 §10 决策日志 —— 沉淀历史脉络,主文档保持精简
- 补充:黄金回收 hjhs 加入 DROP 列表(Mike 指令)
v6 · 2026-07-05 · Final Scope
4 阶段收敛为 3 阶段 · 莱雅系全弃
- Mike 指令:所有小程序基于妈祖商城,莱雅以后不用了,以后基于妈祖商城开发小程序
- Mike 指令:以龙凤 ERP 为主合并(它既有批发也有零售),囍铺只有批发,代码基本都在龙凤里,可以先不合
- 实证:囍铺 73 个 controller 全部在龙凤 · 龙凤 13 个更大 · 囍铺仅独有 3 方法(金价管理) + 阿里云 2 controller
- Phase 数 4→3:摆件+妈祖 合并到 Phase 2 · 手机端+Kotlin+商城+囍铺择机 合到 Phase 3
v5 · 2026-07-05 · Merge Order Locked
合并顺序敲定 · GitLab nexora group 建好
- Mike 指令:GitLab 里建新 organization 叫 nexora · 已建 gid=75
- Mike 指令:唐润辉马上离职 · 手机端归口后置到 Phase 4
- Mike 指令:验证客户用龙凤(客户未启用,业务面又广,敢试)
- 90 天 commits 活跃度实测:妈祖极活跃,囍铺中等,摆件/龙凤基本已死
v4 · 2026-07-05 · Architecture Locked
多租户模型收敛 · 一租户一库 + aid 防呆
- Mike 决策:一租户一库更好(客户天然预期"数据在我自己库" · 备份/升级/隔离都独立)
- 方案 B 采用:业务表 aid 字段不动,值恒等于该库租户 id,退化为"防呆兜底"
- 新增 §5.5 一租户一库运维套件(新租户开通 / migrations 分发 / 备份轮询 / 部署监控)
v3 · 2026-07-04 · GitLab 源码验证
推翻 v2 的 4 处关键假设
- xylferp 才是原始仓(2025-11-22, 113 commits) · pyerp/xipu/baijian 都是 2026-02-09 同天 squash 出来的
- 多租户"没实现"是错的 · 4 个 ERP 都已有运行时 aid 隔离(1896~2285 处代码)
- 莱雅 SQL 直查 erp_ 表也是错的 · 实际走
Db::connect('mysqls') 连共享 shop 库
- 喜铺手机端 = 独立 Kotlin 后端 描述不完整 · 实际是 3 仓组合,app_xiao_shou_kotlin 已在做多客户版
v2 · 2026-07-04 · 初版
莆阳网络 wiki 为源的初稿
- 基于莆阳网络飞书 wiki(内容已老化)的战略草案
- 提出「多 fork 并行 → 单核心 + 租户化差异」的整体方向
- 4 阶段路线图初稿:合并 ERP → 商城对接 → 小程序统一 → 手机端归口
附 · 2026-06-15 · 唐润辉「超级 ERP 合并」
前一次合并的经验教训(反面参考)
- 唐润辉完成的是妈祖客户内部三业务线并库(myhw+ylerp+xylferp → 单库),不是跨客户
- 手法是物理捏合:SQL id 偏移(用户 +100,菜单 +1000/+2000) +
cp -r 手工合并
- 结果:数据一库,代码一坨,前端仍 4 套 · 没解决 fork hell
- 可借鉴:
common.php 里已合并好的 sqlAuth / getBaseRoot / aid+bid 从 token 回填等运行时租户机制
- 教训:不能靠"物理捏合"解决 fork hell · 必须做模块化 + 配置驱动
附 · 特殊情况处理归档
v6 里的 §06 特殊情况(已迁入总表)
- hjhs:黄金回收(CRMEB 200+ controller)· v6 建议保持独立做 SSO · v7 改为 DROP(客户已停)
- 共享 shop 库:v6 定为"共享数据层"不做租户隔离 · v7 简化为妈祖商城单基座,不需要共享设计
- Kotlin 后端:v6 保留双主干并存 · v7 明确方案 A 变薄,Phase 3 执行
- 数据迁移:v6 暂缓 · v7 明确 Phase 1-3 期间不做,合并完 + 稳定 3 个月后才评估