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 端莱雅)

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 其他仓库(战略相关性次要)

02 / 目标架构

一张图看懂 Nexora

分三层:外部入口 → 统一 API 网关 → Nexora ERP 核心(一份代码)+ 平台中心库 + 共享 shop 数据层 → 租户业务库(一租户一库)。核心改动:把「每客户一份独立部署」升级为「一份部署跑多租户」,复用已有的 aid + bid + pt_type 隔离机制。

L3 · 外部入口 CLIENTS 商城 Web ShopXo 系 小程序 × 4 莱雅系 3 + 妈祖 app_xiao_shou_kotlin UniApp 多客户版 (已开工) B 端管理后台 Vue 2 L2.5 · API 网关 GATEWAY 统一 API Gateway · 鉴权 · 租户路由 · WS 转发 L2 · NEXORA ERP 核心 · 一份代码 · PHP + Kotlin 双主干 PHP 主干 (ThinkPHP 6) 账号中心 aid+bid+pt_type 功能开关 大模块 · 菜单 商品/库存 54 通用 controller 订单/门店/财务 采购 · 销售 · Bill PHP 可选模块 (按租户启用) 贵金属 Ymetal* 50 ctrl 妈祖商城 Ep* 系列 分销 · 营销 莱雅系 图搜 · OSS · Config xipu / xylf 独有 Kotlin 后端 (SpringBoot · 52 controllers) rn.rw.erp · api / member / order / print / shop / user · WebSocket 长连接 平台中心库 PLATFORM · 全局 👤 用户 / 账号(跨租户统一) 🏢 租户(aid/bid/pt_type 映射) 🎛️ 模块启用清单 共享 SHOP 数据层 shop / store / shop_kucun / shop_xiangqian 商城 + ERP 双向读写 L1 · 租户业务库 TENANT DBS · 一租户一库 · 物理隔离 🗄️ 妈祖(pyerp) 🗄️ 囍铺(xipu) 🗄️ 摆件(baijian) 🗄️ 线游龙凤(xylferp) ... 未来新客户 每个库都存 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)

关键任务

  1. 在 GitLab nexora group(gid=75)下建 nexora-erp repo · 以 xylferp_php clone 为起点,保留完整 git 历史
  2. 租户中心库 schema:tenants(id / aid / bid / pt_type 映射 / DB 连接串) + tenant_modules(启用清单) + users(跨租户账号) + user_tenants(权限)
  3. 把 xylferp 的业务库现状迁移进 Nexora 环境 · 建立 nexora_xylferp DB · 跑起来 · 前台可正常访问
  4. 把「一租户一库运维套件」4 件套(见 §5.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+ 表)。摆件跑通后立即上妈祖,不间断。

关键任务 · 摆件部分

  1. 用 Phase 1 建的 bin/tenant-onboard baijian 脚本创建新租户
  2. 如需保留摆件历史数据 · 迁进 nexora_baijian DB
  3. diff baijian vs 主干(基于 xylferp) · baijian 独有 0 controller,理论上完美复用主干
  4. 如发现主干缺失能力,补进核心模块 · 15 分钟跑通验证"加租户"闭环

关键任务 · 妈祖部分

  1. 贵金属抽模块 ymetal:50 个 Ymetal* controller + 40+ 张表 + 18884 行代码
  2. 妈祖商城对接抽模块 myhw-shop:Epuser / Eprole / Epservice / Epxipu* 系列
  3. Xipu.php(pyerp 里跨接喜铺的代码)评估处置
  4. pt_type 三层租户合并进主干(所有租户都得到这个能力)
  5. pyerp 的 BaseController + common.php 差异合入主干,保留其他家不用的逻辑为可选
  6. 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 变薄

  1. 把 pyerp_app / kotlinapi_uniapp 老手机端归档 · 统一走 app_xiao_shou_kotlin 演化版
  2. Kotlin 后端 sprin-boot-kotlin219 变薄:52 个 controller 里的业务 CRUD 全迁到 PHP 主干 · 只保留 WS 长连接 / 打印下发 / 消息推送 / 定时任务
  3. 租户上下文:PHP 主干签发 token,Kotlin 只解析、不签发
  4. Kotlin 后端不能写业务表,只能读(WS 推送要查最新数据) · 需写数据时通过 HTTP 调 PHP 主干 API
  5. sprin-boot-kotlin219-xylf 分叉合回主 Kotlin 后端(2 commits,可以简单合并)

商城合入(简化版)

  1. 唯一商城基座 = pyerp_shop_php(妈祖商城)
  2. 唯一小程序基座 = pyerp_shop_wx(妈祖商城小程序)
  3. 在 Nexora 主干加轻量 mall-sync 模块 · 定义 ERP ↔ 妈祖商城的 3 条 API 契约(products.sync / orders.push / stock.query)
  4. 废弃 laiya_php / laiya_wx / laiya_jxs_wx / laiya_lss_wx 全线
  5. 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 核心模块(所有租户必装)

5.2 可选模块(按租户启用)

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 件事:

  1. 创建新 DB nexora_<slug>(charset utf8mb4)
  2. 核心模块 migrations(account / product / inventory / order / store / supplier-customer)
  3. --modules 参数选择性跑 可选模块 migrations(ymetal / wedding / distribution ...)
  4. 初始化种子数据:默认角色 · 菜单树 · 管理员账号 · tenants 中心库注册

验收:执行完毕 30 秒内新租户能登录 · 前台菜单只显示启用的模块 · 中心库 tenants.enabled_modules 有正确记录。

套件 2 · migrations 分发机制

核心痛点:主干加了一张新表,要在 N 个租户库都跑一遍。

套件 3 · 备份轮询

每个租户库独立备份 · 每晚自动:

  1. 遍历中心库 tenants 拉全部租户清单 + DB 连接串
  2. 对每个租户 mysqldump | gzip 到独立目录 /backup/tenant/<slug>/<date>.sql.gz
  3. 保留策略:daily 7 天 · weekly 4 周 · monthly 6 月
  4. 校验大小(比昨天缩水 >20% 报警) · 校验能否 gunzip -t 完整解压
  5. 周期性抽样恢复演练(每季度对一个租户做 restore 到临时库,验证备份可用)

套件 4 · 部署监控

时间成本 · 4 件套写一次约 1-2 天工作量(不包括监控面板 UI),但从此可以扛住"20 个客户 → 50 个客户"的运维压力。这是一租户一库策略成立的前提,Phase 1 必须先做。
07 / 下一步

立刻就能启动的事

  1. 在 GitLab nexora group(gid=75,已建)下建 nexora-erp repo · 以 xylferp_php clone 起点 · 保留完整 git 历史
  2. 建租户中心库 schema · 从龙凤(xylferp)一个租户开始
  3. 抽第一个可选模块 aliyun-image(未来给囍铺租户用) · 作为「模块隔离」样板
  4. 把「一租户一库运维套件」4 件套(§5.5)先落地最小可用版
  5. Phase 1 完成:龙凤客户在 Nexora 环境跑通 · 关键 UI 无 regression · 批发+零售双业态可用
  6. Phase 2 顺移:摆件(15 分钟) + 妈祖(主战场) 并入
  7. Phase 3 收尾:手机端 + Kotlin 变薄 + 妈祖商城合入 + 囍铺择机
接下来给 Mike 拍板 · 三阶段顺序推 · 老 xipugold/* repo 全部保留原样跑,合并完成前不动。执行细节看 §08 仓库处置总表 + §09 明确不做的事。
08 / 仓库处置总表

34 个仓库 · 一表打尽 · 唯一 SoT

执行时任何"这个仓要不要动"的问题,以本表为准。Action 列 = 强制约束,和路线图冲突以本表为准。

Action 标签定义:

ERP 主干仓库(4 个)

RepoAction阶段说明
xylferp_phpMERGEPhase 1骨架起点 · clone 为 nexora-erp
xylferp_webMERGEPhase 1前端骨架起点 · clone 为 nexora-erp-web
baijian_phpMERGEPhase 2客户已停 · 只验证「加租户」流程 · 15 分钟跑通
baijian_webARCHIVEPhase 290 天 0 commits · 前端已上线不改
pyerp_phpMERGEPhase 2主战场 · Ymetal / Ep* / pt_type 抽模块
pyerp_webMERGEPhase 2妈祖前端 · 合入 nexora-erp-web
xipu_erp_phpLATERPhase 373/75 controller 在龙凤里 · Phase 3 末视客户情况决定
xipu_erp_webLATERPhase 3同 xipu_erp_php

商城仓库(3 个)

RepoAction阶段说明
pyerp_shop_phpMERGEPhase 3唯一商城基座 · 合入 Nexora mall-sync 模块
pyerp_shop_wxMERGEPhase 3唯一小程序基座 · 未来所有小程序基于此重建
baijian_shop_phpARCHIVEPhase 320G 大 · 客户已停 · 归档不动

手机端仓库(6 个)

RepoAction阶段说明
app_xiao_shou_kotlinKEEPPhase 3669 commits 多客户 UniApp 壳 · SERVER_LIST 已支持切「周锦记(Kotlin)/ 妈祖(PHP)」· Phase 1-2 保留原样跑 · Phase 3 演化为 Nexora 统一手机端框架,把 pyerp_app / kotlinapi_uniapp 的业务功能重写进来
pyerp_appKEEPPhase 3妈祖手机端(独立 UniApp 项目,和 app_xiao_shou_kotlin 目前无代码合并,只共享 SERVER_LIST 里"妈祖"选项)· Phase 3 把功能重写进 app_xiao_shou_kotlin 后再归档
kotlinapi_uniappKEEPPhase 3囍铺原版手机端 UniApp · 功能已被 app_xiao_shou_kotlin(其演化多客户版)覆盖 · Phase 3 直接归档
sprin-boot-kotlin219KEEP → 变薄Phase 3Kotlin 后端 · 保留 · 方案 A 变薄:52 controller → ≤15
sprin-boot-kotlin219-xylfKEEP → 合入主Phase 32 commits 分叉 · 合入 sprin-boot-kotlin219 主线
fastify_spring_app_apiARCHIVEPhase 35 commits · 废弃分支
fastify_ts_app_apiARCHIVEPhase 31 commit · 废弃分支

弃用仓库(6 个 · 不投入工作)

RepoAction说明
laiya_phpDROP莱雅商城主站 · 客户不再使用
laiya_wxDROP莱雅商城主小程序
laiya_jxs_wxDROP莱雅经销商小程序
laiya_lss_wxDROP莱雅零食师小程序
lyshop_wxDROP莱雅关联小程序 · 客户已停
hjhsDROP黄金回收(CRMEB)· 客户已停 · 不同基因不合并

其他仓库(战略无关或未评估)

RepoAction说明
pyerp_php_apiARCHIVE2 commits · 疑似 API 抽出实验,未成气候
pyerp_shop_h5_distOUT-OF-SCOPE前端构建产物,不合并
wl_phpOUT-OF-SCOPE未评估(疑似"物流")· 战略期不动
wl_webOUT-OF-SCOPE同 wl_php
waimao_phpOUT-OF-SCOPE未评估(疑似"外贸")· 战略期不动
supererpOUT-OF-SCOPE2026-06 老"超级 ERP 合并"产物 · 见 §10.4
hjtOUT-OF-SCOPE未评估
xipu_newOUT-OF-SCOPE未评估
electron_exeOUT-OF-SCOPE桌面工具
python-auto-print-desktopOUT-OF-SCOPE桌面打印工具
passwordOUT-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 个月后才评估