mjava 基座对每个产品方接入按两层组织:
com.malk.server.{product}/:产品方原始数据契约。允许放 POJO(如 *R 响应、*Param 入参、*Dto 字段映射)、{Prod}Conf 配置类、枚举、常量、签名/加密工具类。禁业务逻辑。com.malk.service.{product}/{Prod}Client*.java:1:1 对应产品官方接口文档,一接口一方法,不做组合,不做错误码翻译,仅做参数填充 + HTTP 调用 + 反序列化。com.malk.service.{product}/{Prod}Service.java:可选。仅当存在跨客户共用的二次封装(自动续 token、分页拼装、错误码翻译、跨接口编排)时建立。准入条件见 R7。实现类一律落在 com.malk.service.{product}.impl/ 子包。
server/txmeeting/ 与 service/txmeeting/ 两个目录server/txmeeting/ 下至少有 TXMConf 或 TXMR 至少一个数据契约类service/txmeeting/TXMClient.java 接口 + impl/TXMClientImpl.java 实现各一个文件TXMService.java 空壳{Prod}Client*.java 接口的方法UtilHttp → 反序列化 → 返回;不调其他 Client 方法、不写 if-else 业务分支service/integration/ 仅 INTPClient_User(单一域)INTPClient 主入口或 INTPService(服从 R7 防空壳准入)INTPClient_Org / INTPClient_Permission 等)按 R2 触发:
INTPClient 主入口聚合INTPService当单一 {Prod}Client.java 接口方法数 > 15,或跨 2+ 产品板块(例:钉钉的「通讯录」+「考勤」),必须按板块拆分为 {Prod}Client_{Module}.java。
参照范式:
DDClient_Attendance / DDClient_Contacts / DDClient_Group 等YDClient_Form / YDClient_ProcessBSClient_Attendance / BSClient_Employee主 {Prod}Client.java 保留作为总入口或聚合(含 token 获取、通用工具方法),不消失。
{Prod}Client_{Module}.java 子文件,按业务板块归类{Prod}Client_{Module}.java 而不是塞进现有 Client所有 mjava-ai 仓内子项目(mcli / pro / com / 未来新建客户模块)和外部独立客户仓(akds / 光明独立仓 / 其他客户仓)调产品方接口时遵循优先级:
mjava.service.{product}.{Prod}Client* / {Prod}Service子项目禁止自建 HTTP 直调(绕过 UtilHttp)、禁止自建产品方鉴权/Token 逻辑(绕过 UtilToken)、禁止引入产品方三方 SDK。
UtilHttp.doXxx 直接调产品方域名对 com.malk.service.{product}.{Prod}Client*.java 或 {Prod}Service.java 的接口签名做以下任一变更前,必须执行变更确认流程:
server/ 层 POJO 类、字段、方法变更确认流程:
BREAKING: {Class}.{method} 签名变更,受影响调用方列表写入 commit body仅扩展变更(新方法 / 新重载 / 新子 client 文件 / 新 server 层 POJO)不需要确认,但 commit message 注明 feat(service): 新增 {Class}.{method}。
DDClient_Contacts.getUserDetail(String userid) 改为 getUserDetail(String userid, Boolean includeExt)\.getUserDetail\( 跨仓扫描BREAKINGDDClient_Contacts 新增 listDepartmentTree() 方法feat(service/dingtalk): DDClient_Contacts 新增 listDepartmentTree所有实现类命名风格统一为 XxxImpl 后缀:
DDClientImpl / DDClient_AttendanceImpl / DDServiceImpl / YDClient_FormImpl / BSServiceImplDDImplClient / DDImplClient_Attendance / DDImplService(中缀风格,禁止新增)R5 对新增代码强制生效。钉钉现有 14 个中缀文件(DDImplClient + DDImplClient_X×12 + DDImplService)作为存量技术债,拆到独立 change rename-dingtalk-impl-suffix 推进,本 change 不动。
XxxImpl 后缀,禁用 XxxImplXxx 中缀service/dingtalk/impl/ 新增子 client 实现DDImplClient_X 中缀风格,新文件必须用 DDClient_XImpl 后缀com.malk.server.{product}/ 包内的类必须满足:
*R *Param *Dto *Conf)、枚举(enum)、常量类(public static final)、产品方签名/加密工具类(如 DingCallbackCrypto、DigestUtil)@Service / @Component / @Repository / @RestController 等 Bean 注解@Autowired / @Resource / 构造器注入其他 BeanUtilHttp / UtilToken 发起网络请求{Prod}Conf 是 @ConfigurationProperties 的允许例外(标了 @Component 注解但仅为配置绑定,不参与业务)。
server/dingtalk/ 下出现 @Service 注解的类service/dingtalk/impl/ 或客户子项目对应位置server/{product}/ 下的 POJO 类com.malk.server.common.* / 同包内类com.malk.service.* / com.malk.utils.*(除常量工具如 UtilMap 静态方法){Prod}Service.java 仅当满足以下任一条件时才建:
McException 翻译)不满足上述条件时,二次编排留在客户子项目内 com.malk.{customer}.service.{product}.{Prod}LocalService.java,命名带 Local 前缀以示区分。
未满足条件强行预建 Service 文件(空 interface / 仅一个 default 方法 / 仅一个未被任何客户调用的方法)视为违反 R7,code review 必须打回。
XxxService.java 接口仅有 1~2 个未被任何子项目调用的方法