项目:ERP-CRM | 版本:v1.3 | 生成日期:2026-10-06 | 依据:源码分析(v1.3:2026-10-06 一致性回刷——租户库表数 38→40、Server.java 反向索引路径修正)
本篇是文档集(00-20)的收口篇,解决三个检索问题:一是术语对齐——业务与技术术语在 17 篇文档中反复出现,本篇给每个术语一个"本文档集内的标准定义 + 权威出处";二是反向索引——知道文件名(或表名、类名)却不知道在哪篇讲过时,按"源码文件 → 篇目"反查;三是任务路径——带着一个具体任务(修 bug/加模块/加租户/上线)来的人,按最短路径读对应的篇目组合。术语的深入解释一律指向对应篇目,本篇只给"一句话定义 + 锚点"。
业务术语的边界先说清楚:本表的"标准定义"是本项目语境下的操作定义(哪个表、哪个字段、哪个枚举值),不是教科书式的行业定义。这样做的理由有两个:其一,同一术语在通用 CRM 语境里可有多种实现(比如"公海"有的产品是独立表、有的是状态位),本文档集统一到本项目唯一的实现口径上,读者拿着定义就能直接定位代码;其二,术语与字段的绑定关系是排查业务 bug 的最快入口——"这个客户为什么在公海列表里"这个问题,按术语表查到 status='2',再查 customerToPoolByIds 的 SQL 谓词即可收敛到答案。每个术语的"出处/锚点"列给出最权威的一到两篇文档,深入机制一律跳转,本表不重复。
| 术语 | 本项目定义 | 出处/锚点 |
|---|---|---|
| 租户(tenant) | 订阅本系统的企业,标识为注册时填写的 tenantName,同时是请求头 tenant 的值与主库 master_tenant.tenant 行 | 《00-项目总览》1;《01-系统架构》5 |
| 主库(master 库) | MySQL 库 erp-crm-master,存租户登记/套餐/全局登录日志/审批留痕结构与 Flowable 引擎表(default_db 数据源键) | 《04-数据模型》2 |
| 租户库 | 每租户独立 MySQL 库(新租户 ec_ 前缀,历史租户 ryt_* 如 ryt_nelub7xr),40 张表,注册时由模板创建 | 《04-数据模型》1/3;《05-核心流程》流程一 |
| 套餐(tenant_package) | 主库 tenant_package 表的三档订阅(基础/专业/旗舰),定有效期 duration_days 与用户上限 max_users | 《04-数据模型》2.2 |
| 配额(quota) | 套餐 maxUsers 对租户内用户数的硬上限;新增/导入用户前经 TenantQuotaService.checkUserQuota 校验,未绑定套餐视为不限 | 《01-系统架构》5 第 6 点 |
| 临期/到期 | 到期前 ec.tenant.expiration-remind-days(默认 7 天)内为临期(打日志+刷 gauge);到期 TenantExpirationJob 自动置 status=2 停用 | 《13-技术债务与演进建议》路线图;《05-核心流程》 |
| 线索(clues) | crm_customer 表 status='0' 的行,销售漏斗最上游;"我的线索"即 owner=当前用户的线索行 | 《05-核心流程》流程五 |
| 客户(customer)/私海 | status='1' 且 owner 非空的行,归属某销售名下维护 | 同上 |
| 客户公海(pool) | status='2'、owner 置空的公共池;任何销售可领取(receive),领取后回到私海;入池用 pool_type 区分类型 | 《07-模块详解》2.1 |
| 转客户 | 线索转化为客户的状态翻转(PUT /crm/clues/to-customer,status 0→1,写 to_customer_time) | 《05-核心流程》流程五 |
| 跟进记录(comment) | crm_comment 表的客户跟进日志,写入时同步回写客户三字段(last_update_record/last_followup_time/next_followup_time) | 《07-模块详解》2.3;《05-核心流程》流程五 |
| 商机(opportunity) | 生成器产出的 CRM 模块,客户名下的潜在成交(amount/stage/expected_date) | 《07-模块详解》2 表 |
| 合同(contract) | 生成器产出 + 手工扩展 review_status 审批状态位(NULL 未提交/0 待审/1 通过/2 驳回),是审批流的业务载体 | 《04-数据模型》3.2;《05-核心流程》流程三 |
| 回款(receivable) | 合同名下的收款记录(二跳 join:回款→合同→客户) | 《07-模块详解》6.1 |
| CRM 订单 | crm_order 表(order_no 唯一键,status 审核 0/1/2),与 ERP 销售订单是两套独立数据 | 《04-数据模型》3.2 |
| 审批流(approval) | Flowable 流程 contractApproval:提交→审批人处理→按 approved 网关分流;crm_approval 是业务侧留痕表(主/租户库双份结构) | 《05-核心流程》流程三;《18-代码走读实录》走读一 |
| 审批留痕 | crm_approval 行:提交时插(status=0),审批时定向更新(syncApprovalStatus),引擎失败时回滚(revert*) | 《18-代码走读实录》1.4/1.5 |
| 采购单(stock order) | erp_stock_order + 明细 erp_purchase_item(整删整插),status 0 待入库/1 已入库/2 作废,status 是 CAS 认领位 | 《07-模块详解》3.1 |
| 入库认领(stock-in) | PUT /erp/stock/stock-in/{id}:条件 UPDATE 把 status 0→1 抢占入库权,失败即拒绝,防重复写流水 | 《05-核心流程》流程四 |
| 库存流水(storage flow) | erp_storage_flow,一切库存变动的唯一事实源(order_type 0 出库/1 入库/2 期初);现存量 = Σ(1,2) − Σ(0) 按仓聚合 | 《04-数据模型》3.3;《07-模块详解》3.1 |
| 调拨(transfer) | erp_transfer_order 跨仓移库:预检→CAS 认领→出/入两条流水→负库存复检失败整事务回滚 | 《05-核心流程》流程四 |
| 盘点调整(stock adjustment) | erp_stock_adjustment 留痕单据(adjust_type 2 盘盈/3 盘亏,记 before/after_qty),仅增查删三端点不可改 | 《07-模块详解》3 表 |
| 序列号(SN) | erp_product_sn,UUID 字符串主键 sn_uuid,status 0 在库/1 出库;零售按 SN 出库 | 《04-数据模型》3.3 |
| 安全库存(safety_stock) | erp_product.safety_stock,库存汇总页低库存告警口径(增量脚本 upgrade_supply_finance.sql 引入) | 《04-数据模型》3.3 |
| 财务总览(finance) | ErpFinanceServiceImpl 两个聚合读接口:应收(销售单应付-实付)与库存资产(流水聚合×单价) | 《07-模块详解》3.2 |
技术术语与业务术语的分层逻辑不同:业务术语对应"产品功能如何落到数据",技术术语对应"架构决策如何落到代码"。两者叠加才是完整的认知——比如读懂"客户公海"要同时知道单表三态(技术)与公海业务规则(业务)。技术术语表特别收录了那些在本项目里有专属含义的词:像"CAS 认领""补偿式一致性""sweepOnce 模式"这类词在通用语境里各有解释,但在本项目里它们指向特定的实现文件与既定纪律,读者在代码评审或提交信息里遇到时应按本表口径理解。两条使用纪律:术语首次出现于 commit message 或注释时,优先引用本表的锚点篇目而非重新解释;新增术语(尤其是新 SOP 引入的模式名)应同步登记进本表,保持"一个概念一个名字"。
| 术语 | 本项目定义 | 出处/锚点 |
|---|---|---|
| 动态数据源路由 | DynamicRoutingDataSource extends AbstractRoutingDataSource,按 DynamicDataSourceContextHolder(ThreadLocal)的键把 SQL 路由到主库或某租户库 | 《01-系统架构》4 第 2 点 |
| 租户键(ThreadLocal 键) | 当前线程的数据源标识;TenantInterceptor.preHandle 绑定、afterCompletion 清理;脱离 HTTP 线程(如测试、定时任务)需手工预置 | 《09-测试与质量保障》2 |
| default_db | 主库的数据源键常量;@DataSource(MASTER) + DataSourceAspect 声明式切到它并在 finally 恢复原键 | 《01-系统架构》4 第 4 点 |
| 事务陷阱 | @Transactional 方法内切 @DataSource(MASTER) 不会更换已绑定连接(连接已绑定事务);跨库必须独立非事务方法 + try/finally 重锚 | AGENTS.md 多租户第 6 条;《01-系统架构》 |
| businessKey 编码 | Flowable 流程实例业务键 tenant:contractId;查询用前缀 like 过滤租户,解析兼容历史无前缀数据 | 《18-代码走读实录》1.2-1.5 |
| 补偿式一致性 | 跨库写无法共用事务时的策略:租户库先行、引擎殿后、失败补偿回退(revert* 幂等 SQL);崩溃窗口靠"回写幂等+重试自愈"兜底 | 《05-核心流程》流程三;《16-决策记录ADR》ADR-003 |
| CAS 认领 | 乐观并发控制:UPDATE ... SET status='1' WHERE id=? AND status='0' 抢单据处理权,影响 0 行即拒绝 | 《05-核心流程》流程四 |
| 负库存复检 | 调拨出库流水写入后再查一次调出仓存量,为负则抛异常令整个事务回滚(防并发超调) | 《07-模块详解》3.1 |
| restrictOwner | 防越权 SQL 谓词:非管理员操作追加 and owner = 操作人,越权操作静默影响 0 行(删除则走逐条校验显式拒绝) | 《18-代码走读实录》走读三;《08-安全与权限设计》5.2 |
| 单表三态(CustomerFolder) | crm_customer.status(0 线索/1 客户/2 公海)+ 枚举 crm/domain/enums/CustomerFolder,三视图共用一张表 | 《04-数据模型》3.1 |
| 代码生成器 | erp-crm/gen_business_modules.py:声明式 MODULES + 六个模板函数产六件套;"生成后即固化",产物入库、勿重跑 | 《07-模块详解》6;《18-代码走读实录》走读二 |
| 六件套 | 一个业务模块的后端六文件:domain 实体 / Mapper 接口 / Mapper XML / Service 接口 / Service 实现 / Controller | 《11-扩展开发指南》SOP-1 |
| 增量迁移(upgrade_*.sql) | db-backup 下五批幂等脚本(CREATE IF NOT EXISTS / WHERE NOT EXISTS 探重 / 菜单先 DELETE 再插);裸 ALTER 不幂等;无版本账本 | 《04-数据模型》5.2;《13-技术债务与演进建议》2 |
| 三处同步 | 改表必须同步:租户模板 SQL、新 upgrade 脚本、(涉及主库时)主库 SQL;实体侧还有"四处同步"(domain/XML 的 resultMap/selectVo/insert/update) | 《11-扩展开发指南》SOP-5 |
| 租户模板 | erp-crm/src/main/resources/init-sql-script/erp-crm-tenant-sample.sql,40 张表 + 菜单/字典/角色种子;新租户直接拿最新结构,不用跑 upgrade | 《04-数据模型》1 |
| 滑动续期 | 会话剩余 ≤20 分钟时任一请求把 Redis TTL 重置为 120 分钟(TokenService.verifyToken),活跃用户不掉线 | 《08-安全与权限设计》3.2 |
| 双层会话 | JWT 只当钥匙(login_user_key=uuid),完整 LoginUser 存 Redis login_tokens:{uuid};删键即强制下线 | 《08-安全与权限设计》3.1 |
| AES-GCM 静态加密 | master_tenant.password 的密文格式 enc:v1:<iv>:<密文>,密钥派生自 EC_TENANT_PASSWORD_KEY;直连 mapper 会绕过加解密(禁手) | 《08-安全与权限设计》7.1;《16-决策记录ADR》ADR-007 |
| fail-fast 校验 | EcProdConfigVerifier 在 prod 启动期逐项校验必需密钥,缺失即拒绝启动 | 《14-配置与环境详解》5 |
| 闲置淘汰 | IdleDataSourceEvictor 每 60s 扫描,关闭闲置 >30 分钟的租户连接池整池(连接池回收≠数据删除) | 《01-系统架构》4 第 3 点 |
| sweepOnce 模式 | 定时任务写法约定:执行体拆成可直调的 sweepOnce()(幂等可重跑)+ cron 薄壳入口,测试直调不等待 | 《09-测试与质量保障》3.1;《11-扩展开发指南》SOP-6 |
| 指标标签归一 | Micrometer 标签值过正则 [a-zA-Z0-9_-]{1,32},防随机值制造无上限时间序列 | 《01-系统架构》4 第 10 点 |
| TS 基座 + JS 业务 | 前端分层契约:layout/router/store 等 TS,views/api/components 等保持 JS;tsconfig exclude **/*.js | 《01-系统架构》2;《16-决策记录ADR》ADR-005 |
| useTable | src/composables/useTable.js:86 个列表页的状态中枢(loading/rows/total/ids + getList/resetQuery 动作) | 《07-模块详解》5.2 |
术语检索之外,有五组概念在实际沟通中最容易混用,单独立段辨析。
**"CRM 订单"与"ERP 销售订单"**是两套完全独立的数据:crm_order(order_no 唯一键、带审核状态 0/1/2、归属 CRM 域 com.ec.crm)与 erp_order(关联 erp_client/erp_tax_info、无审核端点、归属 com.ec.erp)没有任何外键或代码级关联,首页"订单趋势"统计的是 CRM 订单(CrmStatisticServiceImpl.dashboardStats 查 ICrmOrderService)。汇报口径与报表需求提小时必须先问清是哪一个。
"主库表"与"租户库表":同名表可能两库都有而语义不同——crm_approval 主库那份是预留的"审批中心整体迁主库"结构(当前不被写入),租户库那份才是实际留痕;sys_oper_log 恰好相反(@Log 写当前租户库);sys_logininfor 只有主库一份(全局链路)。判断一张表落在哪,先查《04-数据模型》第 2/3 节,再看 service 层有没有 @DataSource(MASTER)。
"租户名"与"租户库名":请求头 tenant 传的是租户名(如 tenant1),不是库名;库名(如 ryt_nelub7xr)只存在于 master_tenant.database_name 列与 MySQL 侧。手工建测试租户时最常见的错误就是把库名填进请求头——拦截器按租户名查登记表,查不到即拒绝。
"审批任务 ID"与"审批留痕 ID":GET /crm/approval/{id} 收 Flowable 任务 ID(UUID),crm_approval.id 是自增主键——两者都在审批页出现过,误传得到空对象而非报错(坑的完整分析见《07-模块详解》2.2)。
"连接池淘汰"与"数据删除":IdleDataSourceEvictor 关闭的是缓存里的 JDBC 连接池,租户库本身原封不动,下次访问自动重建;把日志里"淘汰租户数据源"理解成"清了租户数据"是纯粹的误读(《01-系统架构》第 5 节)。
按"你在源码里打开了这个文件,想找它的文档"组织。路径省略公共前缀:后端 erp-crm/src/main/java/com/ec/(J),资源 erp-crm/src/main/resources/(R),前端 erpcrm-ui/src/(U),仓库根 erp/(E)。使用约定有三条:其一,索引指向"讲得最深"的篇目而非全部提及处,一个文件通常在三四篇里出现,先读锚点篇目再顺其引用链扩展;其二,文件级索引覆盖的是"值得写文档"的核心对象,RuoYi 标准形态的系统管理类(岗位/通知/参数等 20 个 Controller)不逐个列出,统一看《15-接口全量参考》第 2 节与《03-接口设计》2.2;其三,SQL 脚本与配置文件(模板 SQL、主库 SQL、upgrade 系、.env 系)是本项目最易改动也最易漏文档的对象,改这些文件时请把本表当作"改完必须同步哪些篇目"的核对清单使用。
| 文件/对象 | 主要篇目 |
|---|---|
| E AGENTS.md | 00(对照与滞后说明)、13 D13 |
| E erp-crm/pom.xml | 17(逐依赖解析)、00 技术栈 |
| E erp-crm/gen_business_modules.py | 18 走读二(逐函数)、07 第 6 节(清单)、11 SOP-2、16 ADR-004 |
| J ErpCrmApplication.java | 00 目录导览 |
| J auth/config/SecurityConfig.java | 08 第 3/6/8 节、01 第 6 节 |
| J auth/interceptor/TenantInterceptor.java | 01 第 5 节、08 第 2 节 |
| J auth/datasource/DynamicRoutingDataSource.java + IdleDataSourceEvictor.java | 01 第 4 节、10 第 1 节、16 ADR-001 |
| J auth/aspectj/DataSourceAspect.java、DataScopeAspect.java、LogAspect.java、RateLimiterAspect.java | 01 第 4 节、08 第 5 节 |
| J auth/web/service/SysLoginService.java、TokenService.java、UserDetailsServiceImpl.java | 05 流程二、08 第 3 节、03 第 3 节 |
| J auth/web/service/TenantRegisterService.java | 05 流程一、16 ADR-001 |
| J auth/web/exception/GlobalExceptionHandler.java | 03 第 4 节、19 第 11 节 |
| J auth/web/domain/Server.java(oshi,含 domain/server/* 子包) | 17 第 3.1 节(可移除评估)、15 第 3 节 |
| J common/annotation/(@Excel/@Log/@RateLimiter/@RepeatSubmit/@DataScope/@DataSource) | 08 第 6 节、17 第 1.5 节、01 第 4 节 |
| J common/core/(AjaxResult/TableDataInfo/BaseController/PageUtils) | 03 第 1 节、19 通用约定 |
| J common/utils/poi/ExcelUtil.java | 17 第 1.5 节、15 第 7 节 |
| J common/metrics/ErpMetrics.java | 01 第 4 节第 10 点、16 ADR-010、11 SOP-6 |
| J common/config/EcProdConfigVerifier.java | 14 第 5 节、16 ADR-011 |
| J common/utils/VerifyCodeUtils.java(孤儿类) | 08 第 3.4 节、13 D01、16 ADR-006 |
| J saas/domain/MasterTenant.java、TenantPackage.java;mapper/MasterTenantMapper.xml | 04 第 2 节、08 第 7 节 |
| J saas/security/TenantDbPasswordCipher.java、MasterTenantPasswordMigrator.java | 08 第 7 节、16 ADR-007 |
| J saas/job/TenantExpirationJob.java | 01 第 5 节、09 第 3.1 节 |
| J saas/form/TenantRegisterBody.java | 19(注册校验)、05 流程一 |
| J web/controller/system/SysLoginController.java、SysRegisterController.java、SysTenantController.java | 03 第 2.1 节、15 第 1 节、05 流程一/二、19 第 1-2 节 |
| J web/controller/common/CommonController.java | 19 第 9 节、03 第 1 节第 8 条 |
| J web/service/TenantQuotaService.java | 01 第 5 节第 6 点、16 ADR(配额)、09 TenantQuota 测试 |
| J sys/(SysUserServiceImpl、SysMenuServiceImpl、SysDeptServiceImpl 等) | 07 第 4 节、03 第 2.2 节、15 第 2 节 |
| J crm/controller/CrmCustomerController.java | 18 走读三、15 第 4.1 节、19 第 3-5 节 |
| J crm/service/impl/CrmCustomerServiceImpl.java | 07 第 2.1 节、18 走读三、05 流程五 |
| J crm/service/impl/CrmApprovalServiceImpl.java | 18 走读一(逐段)、05 流程三、07 第 2.2 节、16 ADR-003 |
| J crm/service/impl/CrmStatisticServiceImpl.java | 07 第 2.3 节、10 第 3.3 节、19 第 8 节 |
| J crm/domain/CrmCustomer.java、enums/CustomerFolder.java | 04 第 3.1 节、19 第 3-4 节、20 术语 |
| J crm/domain/CrmContract.java(reviewStatus) | 04 第 3.2 节、16 ADR-004(生成器脱节例证) |
| J crm/controller/CrmApprovalController.java | 15 第 4.4 节、19 第 6-7 节 |
| J crm/controller/IndexDataController.java | 15 第 4.5 节、19 第 8 节 |
| J erp/service/impl/ErpStockOrderServiceImpl.java(stockIn/claimForStockIn) | 05 流程四、07 第 3.1 节、03 第 5.2 节 |
| J erp/service/impl/ErpTransferOrderServiceImpl.java(doExecuteTransfer) | 05 流程四、09 第 3.3 节 |
| J erp/service/impl/ErpFinanceServiceImpl.java | 07 第 3.2 节 |
| R application.yml、application-druid.yml | 14 第 2-3 节(逐段)、06 第 3 节(变量清单) |
| R mapper/crm/CrmCustomerMapper.xml(restrictOwner 段) | 18 走读三 3.3、07 第 2.1 节、11 SOP-1 |
| R mapper/crm/CrmApprovalMapper.xml(revert* 幂等 SQL) | 05 流程三、18 走读一 |
| R mapper/erp/ErpTransferOrderMapper.xml(selectStockQtyInWarehouse) | 04 第 4 节读图要点、07 第 3.1 节 |
| R processes/contract-approval.bpmn20.xml | 05 流程三、18 走读一 1.1 |
| R init-sql-script/erp-crm-tenant-sample.sql | 04 第 3 节、11 SOP-1/3、14 第 6.1 节 |
| R logback.xml | 12 第 1 节、14 第 2 节 |
| erp-crm/sql/erp-crm-master.sql | 04 第 2 节、14 第 6.1 节 |
| erp-crm/ops/backup.sh | 14 第 6.2 节(逐段)、08 第 7 节、06 第 5 节 |
| erp-crm/ops/deploy/docker-compose.yml | 06 第 4.2 节、14 第 4.3 节 |
| erp-crm/erpcrm.sh / erpcrm.bat / Dockerfile | 14 第 4 节、06 第 2.3 节 |
| erp-crm/config/(application-prod.yml.example、README.md) | 14 第 5 节、08 第 7.3 节 |
| erp-crm/src/test/java/com/ec/**(13 个测试类) | 09 全篇、05 各流程"测试保障"段 |
| U utils/request.js | 07 第 5.1 节、03 第 1 节、19 通用约定 |
| U api/user.ts、api/routes.ts | 07 第 5.4 节、02 第 6.1 节 |
| U composables/useTable.js、useDict.js、useModal.js | 07 第 5.2/5.3 节、11 SOP-4 |
| U directive/permission/hasPermi.js | 08 第 4.1 节、07 第 5.5 节 |
| U views/crm/approval/index.vue | 02 第 3.4 节、05 流程三 |
| U views/crm/customer/list.vue | 02 第 3.3 节(列表页范式)、11 SOP-4 |
| U plugins/echarts.ts | 17 第 2.2 节、AGENTS.md 前端约定 |
| U vite.config.ts、package.json | 14 第 7 节、17 第 2 节 |
| E db-backup/upgrade_*.sql(五批) | 04 第 5.2 节、13 第 2 节、11 SOP-5、16 ADR-008 |
| E db-backup/README.md、auto/、legacy-sql/、*.enc | 08 第 7.2 节、13 第 1.4 节、06 第 5 节 |
| E 笔记/未命名.md | 16 ADR-001(隔离方案调研) |
四条路径的编排逻辑说明一下:每条路径都遵循"先建立心智模型 → 再进源码定位 → 最后按纪律收尾"的三段式,避免新人直接扎进代码丢失全局。路径里引用的篇目均已在前文出现,遇到"篇目与源码不一致"时按第 6 节的权威性排序处置。若你的任务不在四条之列(例如"给看板加一张图""接一个新的导出格式"),最接近的做法是取 5.1(改既有行为)或 5.2(新增能力)的骨架,再把《10-性能设计与优化》《17-依赖全景》对应章节补进前置阅读。
最短路径:先读《18-代码走读实录》走读一(逐段行为模型:库切换纪律、两阶段顺序、补偿回退点、崩溃窗口语义)→ 带着模型进 CrmApprovalServiceImpl.java 对照现象定位 → 复现与验证读《09-测试与质量保障》3.4 与 CrmApprovalFlowIntegrationTest(fixture 直接插合同行、deleteHistoryQuietly 清理手法)→ 若涉及"taskId 传错/列表查不到/重复提交"类现象,查《12-FAQ》已知坑与《07-模块详解》2.2 的使用提醒({id} 是任务 ID)。改码红线:两库操作不得包进同一事务、useMaster()/useTenant() 必须成对、补偿 SQL(CrmApprovalMapper.xml 的 revert*)不可改动语义。
按《11-扩展开发指南》SOP-1/SOP-2 全程操作(九步链或生成器路径),前置阅读两篇:《01-系统架构》第 4 节(十条设计决策,尤其事务陷阱与业务域不横向 import)、《18-代码走读实录》走读二(生成器模板逻辑——用 SOP-2 前必须懂它会生成什么、不生成什么)。数据层三处同步规则查《04-数据模型》5.3 与 SOP-5;权限串与菜单 SQL 范本查《08-安全与权限设计》4.2 与 db-backup/upgrade_business_modules.sql;归属校验照抄走读三的 restrictOwner 范式(勿复刻生成器产物的无守卫形态,D03)。收尾验收:mvn test + 两端门禁 + 菜单/权限/导出五端点冒烟(SOP 通用收尾清单)。
优先走产品化路径(注册页自助建库,零手工),操作规程见《11-扩展开发指南》SOP-3,流程细节见《05-核心流程》流程一(建库→模板→登记的完整时序与失败回滚)。手工路径(测试租户)的口令列写法是唯一坑点:配了 EC_TENANT_PASSWORD_KEY 时必须写密文或留明文等启动迁移器改写(密文格式错误表现为 JDBC Access denied,《08-安全与权限设计》7.1)。新增后验收三件事:SHOW TABLES 对照模板 40 表、登录验证菜单/字典/角色种子就位、/system/tenant/quota 返回配额。若新租户缺表,回查 SOP-1 第 1 步是否漏改租户模板(最高频翻车点)。批量租户的备份/迁移视角查《14-配置与环境详解》6.2(backup.sh 逐库枚举可改造为迁移游标)。
按顺序过五关。第一关配置:config/application-prod.yml.example 落地、EcProdConfigVerifier 必配密钥清单逐项核对(EC_TOKEN_SECRET ≥64 字节、EC_TENANT_PASSWORD_KEY 必配、Druid 控制台与 springdoc 已关)、《14-配置与环境详解》5 与 8 的排障三经验。第二关数据:主库+模板 SQL 初始化正确(sql/erp-crm-master.sql 口令列为 ROTATED 占位、真实凭据只走 .env)、存量租户库 upgrade 补齐且幂等性人工确认(裸 ALTER 不重跑)、《04-数据模型》5.3 执行规程。第三关安全:CORS/nginx TLS 由部署层确认 ⚠️ 待确认、/profile/** 匿名直出与验证码缺失两项已知风险按《13-技术债务与演进建议》D01/D02 决策是否带病上线、备份 crontab 接入并演练一次恢复(ops/backup.sh 恢复命令在脚本头部注释)。第四关可观测性:9091 指标端口可达、ops/prometheus 抓取配置接入、Grafana 面板导入。第五关冒烟:登录→客户 CRUD→提交审批→审批→采购入库→调拨六步全通(各步请求契约照抄《19-数据契约与示例集》);Docker 栈部署则先读《06-部署运行》4.2 并注意 compose 未实测的告警(D14)。上线后首周每日巡检 erp.login.total、erp.datasource.pools.active、erp.approval.total{result=rolled_back} 三个指标( rolled_back 频发即审批链路异常信号)。
全 21 篇分工一览:00 总览 / 01 架构 / 02 页面 / 03 接口设计 / 04 数据模型 / 05 核心流程 / 06 部署运行 / 07 模块详解 / 08 安全权限 / 09 测试质量 / 10 性能 / 11 扩展指南 / 12 FAQ 排障 / 13 技术债务 / 14 配置环境 / 15 接口全量参考 / 16 决策记录 ADR / 17 依赖全景 / 18 代码走读实录 / 19 数据契约与示例集 / 20 术语表与文档索引(本篇)。维护约定沿袭《13-技术债务与演进建议》末节的口径:每篇开头元信息的版本号随实质修订递增;篇间重复内容一律用「见《0X-xxx》」引用而不复制;无法确认的事实标 ⚠️ 待确认并在季度复核时消号;新 ADR 从 ADR-013 起追加进 16 篇;反向索引(第 4 节)在新增源码文件对应新篇目内容时同步登记;术语表(第 1/2 节)与混淆点(第 3 节)在新概念进入代码或文档时同步增补。本套文档的权威性排序永远是:源码 > git 提交 > 本文档集 > AGENTS.md——冲突时以左为准,并把差异回写到右。