proposal.md 5.0 KB

状态(2026-06-10 立项):提案阶段,规则文档 + O3/O4/O6 待 apply,O2 待 ACK 优先级:中。固化 7 条分层规则,配套 4 个轻量优化(O2/O3/O4/O6);O1(钉钉 impl 改名)拆到独立 change rename-dingtalk-impl-suffix

Why

mjava 基座现有 11 个产品接入板块(dingtalk / aliwork / beisen / aliyun / ekuaibao / fxiaoke / h3yun / integration / teambition / vika / xbongbong),整体已按产品分目录,但有 4 个不一致:

  1. 子 client 拆分粒度不均:钉钉拆 12 子 client(按板块),宜搭/北森仅 2 子;EKB/FXK/CY/VK/XBB 单 Client 文件未拆 — 缺规则约定
  2. Impl 命名风格分裂:钉钉用中缀 DDImplClient_X,宜搭/北森用后缀 XxxImpl — 新人困惑
  3. util/utils/ 并行:2026-04-18 的 crypto 抽取留下中间态,util/crypto/RSACrypt.java 单独平行于 utils/ 复数目录
  4. server/aliyun/ALYConfALYInvoiceImpl 内 4 个 URL 硬编码 — 与其他产品 server/ 结构不对齐
  5. Service 层覆盖准入无规则:5 个产品没 Service 层只暴露 Client,是否要补、什么时候补,没标准 → 容易写空壳

更核心的痛点:已有 Client/Service 接口签名改动时,跨仓库(mjava-ai / akds / 光明独立仓 / 其他客户仓)引用关系不可见,改了下游一片报错。需要把"改前先扫引用 + 等用户 ACK"沉淀为强制规则。

What Changes

新增 1 个 capability spec client-service-layering,固化 7 条规则:

  • R1 原子接口分层server/{product}/ 放产品方数据契约(POJO/Conf/枚举),service/{product}/{Prod}Client*.java 1:1 对应产品官方接口,{Prod}Service.java 做通用业务编排
  • R2 板块拆 client:单 Client > ~15 方法 或 跨 2+ 产品板块时,按板块拆 {Prod}Client_{Module}.java
  • R3 调用优先级:子项目调产品方接口必须先查 mjava service/{product}/;没有 → 按 R1/R2 新增;禁子项目自建 HTTP 直调
  • R4 变更确认(核心):改 / 删 / 重命名任何 *Client*.java*Service*.java接口签名前,必须 grep 全仓引用清单 → 报告 → 等用户 ACK;仅扩展(新方法/新子 client)不需要确认
  • R5 命名一致:所有实现类用 XxxImpl 后缀风格(统一全仓,钉钉现有 12 个 DDImplClient_X 中缀产物拆到独立 change rename-dingtalk-impl-suffix 推进)
  • R6 server/ 层定位:只放数据契约(POJO/Conf/枚举/常量),禁 @Service / @Component,禁注入,禁调 HTTP
  • R7 Service 层准入:仅当 ≥2 个客户子项目复用同一段二次编排时才建 XxxService;单客户编排留在客户子项目

同步做 4 个轻量优化:

  • O3mjava/server/aliyun/ALYConf.java,抽 ALYInvoiceImpl 内 4 个硬编码 URL 为常量(纯新增 + 一次性 import 替换,仅本仓引用,影响小)
  • O4 INTP(集成平台)范式约定仅写入文档:未来扩多域时按 R1/R2 补 INTPClient 主入口与 INTPService(不做空壳预建 — 服从 R7)
  • O6 7 条规则进权威共享文档 /Users/malk/Desktop/Tech/claude/后端/mjava-baseline.md;仓库内 openspec/specs/project-baseline.md 加锚点
  • O2 util/crypto/RSACrypt.java 迁到 utils/crypto/RSACrypt.java,删 util/ 目录 — 按 R4 流程:本 change 仅做 grep 报告,等用户 ACK 后再独立动

Capabilities

New Capabilities

  • client-service-layering:mjava 仓 server/ + service/ 两层组织规则与变更流程

Modified Capabilities

Impact

  • 新增 specopenspec/specs/client-service-layering/(archive 后)
  • 新增代码mjava/src/main/java/com/malk/server/aliyun/ALYConf.java(一个常量类,~20 行)
  • 修改代码mjava/src/main/java/com/malk/service/aliyun/impl/ALYInvoiceImpl.java 4 处 URL 字面量改为 ALYConf.URL_* 引用 — 触发 R4 但作者即审核(本仓 + 本 change 范围内),grep 确认无下游 import URL 字面量后落地
  • 新增文档/Users/malk/Desktop/Tech/claude/后端/mjava-baseline.md 新章节"client/Service 分层规则"
  • 修改文档openspec/specs/project-baseline.md 加锚点;README.md 子项目速览表更新(如需)
  • 现有 Client/Service 代码:零修改(除 ALYInvoiceImpl 4 行 URL 替换)
  • 客户子项目(mcli/pro/com 及独立仓 akds/光明):零影响

Non-Goals

  • ❌ 不改名钉钉 12 个 DDImplClient_X(拆到独立 change rename-dingtalk-impl-suffix,R5 仅约束新增代码)
  • ❌ 不立即迁 util/crypto/RSACrypt.java(O2 本 change 只 grep 报告,等 ACK 单独执行)
  • ❌ 不补 5 个产品(EKB/FXK/CY/VK/XBB)的 Service 层(R7 准入未达成)
  • ❌ 不强制现有 Client 单文件超过 15 方法立即拆分(R2 只约束新增;现有大文件作为技术债等下次触碰时顺手拆)