Skip to content

Business Requirements Specification (BRS)

Pharmagin Speaker Platform - 业务需求规格说明书

Version: 1.0 Date: 2026-02-19 Status: Draft Purpose: 为平台重写提供完整的业务需求定义


Table of Contents


1. Executive Summary

1.1 平台定位

Pharmagin Speaker Platform 是一个面向制药行业的演讲者项目管理平台。平台支持制药公司组织教育活动(如晚宴、研讨会、圆桌讨论),由医疗保健专业人员(HCPs)担任演讲者,面向 HCP 受众进行学术宣讲。平台管理参会者注册、预算追踪、法规合规及报告生成等完整业务流程。

1.2 目标用户

用户角色应用核心职责
Agency PlannerPlannerview创建和管理 Program,配置注册站点,管理预算、合规文档,生成报告
Sales RepresentativeSalesview提交 Program 请求,管理参会者,查看预算分配和报告
Speaker (HCP)Speakerview管理个人档案,签署合同,完成培训,提交费用报销

1.3 核心业务能力

  1. Program 全生命周期管理 - 从创建、审批、执行到关闭的完整流程
  2. Speaker 全生命周期管理 - 提名、入职、合同签署、培训认证、项目分配
  3. 参会者注册管理 - 多渠道注册、NPI/Target 调和、频率检查、签到签名
  4. 层级化预算管理 - 公司到项目级别的预算分配、上限控制与追踪
  5. 法规合规 - Aggregate Spend 报告、Transfer of Value 追踪、合规文档审计(满足 Sunshine Act 要求)
  6. 多渠道通信 - 邮件邀请、定时邮件、提醒通知、告警系统
  7. Zoom 虚拟会议 - 虚拟 Meeting/Webinar 创建、参会者注册、Webhook 事件处理
  8. 多维度报告 - Program 活动、参会者分析、Speaker 利用率、预算花费、Ad-hoc 报告构建器
  9. 多租户配置 - 按 Agency/Company/Product 三层动态配置,165+ Feature Flags
  10. 外部系统集成 - Salesforce/Veeva CRM、Zoom、SendGrid、SFTP、NPI Registry、Google Geocoding、SSO/SAML

1.4 系统规模

维度目标
业务实体~140 个核心实体
Feature Flags~165 个(活跃)
外部集成12 个
前端应用3 个(Plannerview、Salesview、Speakerview)

2. User Roles & Access Control

2.1 角色层级模型

系统采用多维度 RBAC 权限模型,用户在 Instance / Company / Product 三个维度分别拥有不同角色和权限:

Instance (部署实例)
  └── Company (制药公司)
       └── Product (药品/品牌)
            └── Role (角色)
                 └── Permission (权限)

权限格式: {SCOPE}-{ID}-{PERMISSION} (如 PRODUCT-25-PROGRAMS)

2.2 预定义角色

Plannerview 角色 (Instance 级别):

  • ADMIN - 完整管理权限:用户管理、配置管理、所有 Program 操作
  • PLANNER - Program 管理、注册站点管理、预算管理、合规文档管理
  • MULTI_MODULE_USER_ADMIN - 跨模块用户管理员

Salesview 角色 (Product 级别):

角色数据可见范围核心权限
SALES_ADMIN全产品线用户管理、预算分配、地理管理、所有报告、Program 管理
UPPER_MANAGER全产品线所有 Program、全部报告、审批查看
REGIONAL_MANAGER所属 RegionRegion 级 Program、预算分配(如启用)、报告
DISTRICT_MANAGER所属 DistrictDistrict 级 Program、预算分配(如启用)、报告
SALES_PERSON仅本人数据创建 Program、查看已安排/已完成的 Program、日历
PLANNER全产品线所有 Program、文档模板下载

Speakerview 角色 (Company 级别):

  • Admin - Speaker 管理员:管理内容库、合同、培训
  • Speaker - 普通 Speaker:管理个人档案、查看合同/培训、提交费用
  • Sales - 销售代表视角(有限访问)

2.3 认证要求

认证方式描述应用场景
密码认证BCrypt 加密,支持密码历史检查全部三个应用
SSO/SAML 2.0对接 Azure AD / Okta,签发 JWT企业用户登录
API TokenJWT(RS256 签名),包含 userId、authorities、exp 等 claimsAPI 调用

BR-001: 系统应使用标准 JWT 替代内存 UUID Token,支持无状态认证和水平扩展。

BR-002: SSO 认证成功后直接签发 JWT,Cookie 必须设置 HttpOnly=true, Secure=true, SameSite=Strict

BR-003: 密码重置 Token 应持久化存储(数据库或 Redis),包含过期时间,支持多实例部署。

BR-004: Speaker 认证应统一纳入 UnifiedUser 体系,移除 Speaker 实体中的密码相关字段。

2.4 授权模型

BR-005: 所有 API 端点应使用 @PreAuthorize 注解进行权限控制。

BR-006: 权限变更应通过短有效期 Access Token(15 分钟)+ 长有效期 Refresh Token 机制实时生效。

BR-007: 用户数量限制应按视图(SalesView/SpeakerView/PlannerView)控制活跃用户上限,白名单域名用户不受数量限制。


3. Core Business Domains

3.1 Program Lifecycle

3.1.1 领域描述

Program 是平台的核心业务实体,表示一个制药公司 Speaker 演讲项目(如晚宴、研讨会、圆桌讨论)。新系统中统一使用 Program 命名替代旧系统中的 MeetingRequest/Meeting 双实体。

3.1.2 Program 状态工作流

创建
  |
  +--> 预算充足 --> ASSIGNED(0)
  |                    |
  |                需要审批?
  |                 |      |
  |                是     否
  |                 |      |
  |                 v      |
  |         PENDING_APPROVAL(12)
  |              |      |
  |           通过    拒绝
  |              |      |
  |              v      v
  |         ASSIGNED  DENIED(13)
  |              |
  +--> 预算不足 --> WAITLISTED(11) (可配置: 预算达限时直接拒绝)
  |
  v
PLANNING(6) --> REGISTERED(9) --> BILLING(1) --> CLOSED(4)
  |                                                |
  v                                                v
CANCELLED(2) --> CANCELLED_CLOSED(3)          REOPENED(14) --> CLOSED
  |
POSTPONED(7) --> POSTPONED_CLOSED(8)

其他: ESTIMATE(5), VOID(10)

BR-008: Program 状态流转应使用状态机引擎(如 Spring Statemachine),替代硬编码 if/else 逻辑。

BR-009: 所有状态变更应使用命令模式 API:PUT /programs/{id}/status { action, reason }

3.1.3 审批流程

审批配置来源于 ProgramType 的 approvals 配置(JSON),支持两种审批路径:

  • 常规路径: DM (District Manager) -> RM (Region Manager) -> UM (Upper Management)
  • Field Exhibit 路径: RBD -> Marketing -> Legal

每级审批支持基于成本阈值的自动审批规则:

  • 如果 meetingCost < exceedsCost,该级自动通过
  • 如果 meetingCost >= exceedsCost,需要该级手动审批

BR-010: 审批配置应使用强类型数据模型(ApprovalConfig),替代松散的 JSON Map 结构。

BR-011: 部分审批(Partial Approval)应支持逐级通知下一审批人。

BR-012: 审批超过 2 天的 Program 应自动发送提醒给 District Manager(可配置产品范围和时间阈值)。

3.1.4 Program 创建流程

Sales Rep 提交 Program 请求时,系统执行以下步骤:

  1. 检查 disallowProgramSubmission 配置
  2. 检查 Zoom 时间冲突(如为虚拟项目)
  3. 获取 ProductUser 权限信息
  4. 计算 meetingCost
  5. 检查预算充足性(hasEnoughBudget
  6. 执行审批流程(如需要)
  7. 分配 Planner
  8. 生成 Program 名称(meetingIdPrefix + sequence)
  9. 保存并发布 ProgramCreatedEvent
  10. 自动生成:Registration Site、Budget Items、Project Tasks

BR-013: Program 创建应验证 Topic 有效期,过期 Topic 禁止使用。

BR-014: Program 关闭需满足以下前置条件:ACT 预算版本已创建、参会者列表已关闭、ToV 计算已完成。

3.1.5 Project Task 管理

每个 Program 可关联基于模板的任务清单,用于追踪 Program 执行过程中的待办事项。

BR-015: 系统应支持 Project Task 模板管理,创建 Program 时自动根据 ProgramType 生成任务清单。

3.1.6 数据模型(目标状态)

Program (核心)
├── id, name, productId, programTypeId, serviceTypeId
├── status, approvalStatus
├── meetingStartTime, meetingEndTime, timezoneId
├── plannerId, userId, teamId
└── createdAt, updatedAt

ProgramLocation (地理信息 - 1:1)
ProgramRequestor (请求者信息 - 1:1)
ProgramSpeaker (演讲者关联 - 1:N)
ProgramApproval (审批记录 - 1:N)
ProgramFinancial (财务信息 - 1:1)
ProgramCustomField (动态字段 - 1:N)
RegistrationSite (注册站点 - 1:1)

3.2 Speaker Management

3.2.1 领域描述

Speaker Management 管理制药行业演讲者(HCP)的完整生命周期,包括 Profile 管理、合同管理、培训认证、内容/演示文稿管理、费用报销、Speaker Group 管理、提名管理等。

3.2.2 Speaker Onboarding 流程

Sales Rep 提名 Speaker
  --> Admin/Planner 审核
    --> Speaker 账户创建(门户注册)
      --> 合同创建(Contract Creation Pending, status=3)
        --> Speaker 签署合同(Contract Signature Pending, status=4)
          --> W9 提交(W9 Pending, status=2)
            --> Active(status=1)
              --> Topic 培训 + Content 培训
                --> Speaker 已认证(可被分配到项目)

BR-016: Speaker 创建时应检查邮箱唯一性(忽略大小写,按 companyId 范围)。

BR-017: Speaker 删除应使用软删除(设置 deleted 标记),保留数据审计能力。

3.2.3 合同管理 (Contract)

  • 支持多种合同类型,每个合同关联一个或多个 ProgramType
  • 合同包含报酬条款(honoraria),新系统应使用 contract_honoraria_items 表替代 15+ 个硬编码字段
  • 合同签署流程:Not Signed(0) -> Speaker 签署 -> Signed(1)
  • 支持下载合同文档(DOCX/PDF 格式,XDocReport 模板引擎生成)

BR-018: 合同报酬模型应使用结构化的 {contractId, honorariaType, amount} 表,替代硬编码字段和 JSONB 混用。

BR-019: Speaker 签署合同时应验证身份所有权(checkOwnerPermission)。

BR-020: 如启用 programQuantityLimit,系统应在 Speaker 搜索时检查该 Speaker 的已用配额并在超限时禁用选择。

3.2.4 演示文稿管理 (Presentation)

  • Admin 上传 Core 演示文稿(PPT 文件),设置 Slide Detail 和插入点
  • Admin 上传 Module/Case Study 内容
  • Speaker 按 SpeakerGroup 可见性查看可用内容
  • Speaker 创建个人演示文稿,选择 Module 填充插入点
  • 系统使用 Aspose Slides 合并生成最终 PPTX

BR-021: 演示文稿生成应异步处理(消息队列或异步任务),避免阻塞请求线程。

BR-022: Content 可见性应通过 SpeakerGroup 关联控制。

3.2.5 报酬计算

BR-023: 系统应提供独立的 HonorariaCalculationService,统一管理 Speaker 的报酬余额计算,涵盖 honorariaCap、meetingHonoraria、speakerExpense、includeTeInHonorariaCalculation 等维度。

3.2.6 数据模型(目标状态)

Speaker (核心身份)
├── id, firstName, lastName, suffix, npiNumber, type, level, status

SpeakerAddress (地址 - 1:N, 类型: Office/Home/W9/NPI)
SpeakerContact (联系方式 - 1:N)
SpeakerCredential (医疗执照/认证 - 1:N)
SpeakerPreference (偏好设置 - 1:1)
SpeakerNomination (提名信息 - 独立表)
SpeakerContract (合同 - 1:N)
ContractHonorariaItem (合同报酬项 - 1:N per contract)
SpeakerTraining (培训记录 - 1:N, 合并 topic 和 module 培训)

3.3 Attendee & Registration

3.3.1 领域描述

管理参会人员从添加、邀请、注册、签到到合规审查的完整生命周期。核心子功能包括:参会人员管理、注册工作流、HCP 合规调和(NPI/Target/Salesforce)、出席频率检查、签到签名、住宿管理、注册站点配置、Transfer of Value 追踪。

3.3.2 注册状态工作流

Pending(0) --邀请--> Invited(10) 或 RepInvited(70)
  |
  v
Accepted(20) 或 Declined(60) 或 Canceled(50)
  |
  v
Registered(40)
  |
  v
Check-In (signInStatus: 0->1 或 3)

注册来源(RegistrationSource): 1=Open Reg, 2=Email Invitation, 3=Sales Rep(Quick Reg), 4=Planner(Contact Import), 6=Walk-In, 7=Copy Attendees, 8=Auto Reg, 9=Sales Rep(Batch Reg), 10=Set Registration Status

BR-024: 注册状态流转应使用状态机框架管理,每个 Product 可配置允许的状态转换矩阵(RegistrationWorkflow)。

BR-025: 注册时应检查最大参会人数限制(meeting.expectedAttendees),已注册人数 + guest 数不能超过上限。

3.3.3 HCP 调和 (Reconciliation)

系统支持 3 种调和类型(由 Product.npiTarget 配置决定):

类型数据源匹配方式
NPI (type=1)NPPES NPI 数据库NPI 号码、姓名、城市、州
TARGET (type=2)客户上传的 Target HCP 列表companyId + productId 过滤
SALESFORCE (type=3)Salesforce Force APICRM 联系人匹配

BR-026: 系统应提供统一的 ReconciliationService 作为所有调和操作的入口,替代当前分散的 3 个独立方法。

BR-027: 批量自动调和应通过 NPI + Name + City + State 搜索,仅当精确匹配到 1 条时自动合并。

3.3.4 频率检查 (Frequency Check)

BR-028: 系统应在参会者注册时自动执行频率检查,控制 HCP 在特定时间范围内参加 Speaker Program 的次数。

BR-029: 频率检查支持以下配置:

  • frequencyPeriodType=0: 按月数范围检查
  • frequencyPeriodType=1: 按 FiscalYear 范围检查
  • 支持按 Topic 过滤(topicEnabled
  • 特定 attendeeCategory 可白名单跳过检查(bypassedFrequencyCheckCategories

BR-030: 触发频率限制时应自动发送通知邮件给 Planner。

3.3.5 签到与签名

BR-031: 系统应支持参会者现场签到(signInStatus 更新)、电子签名采集和地理位置记录。

3.3.6 住宿管理 (Sleeping Room)

BR-032: 系统应支持酒店房间管理(SleepingRoom CRUD)、房型库存按日期管理(SleepingRoomInventory)、参会者住宿关联和库存自动更新。

BR-033: 系统应支持住宿报表下载:Rooming List、Pickup Report、未预订参会者列表。

3.3.7 数据模型改进

BR-034: Attendee 主键应使用 Long 自增,保留 UUID 作为公开标识符(externalId)。

BR-035: registrationStatus / hcpStatus / signInStatus 应使用 PostgreSQL ENUM 类型,增加数据库层约束。


3.4 Budget & Financial

3.4.1 领域描述

管理从 Admin -> Region -> District 的预算逐级分配,按品牌维度的预算管理,单个 Program 的预算行项目(含 SOW/EST/BILL/ACT/CXL 五个版本),预算上限控制和财务年度管理。

3.4.2 预算层级

Company -> Product -> Brand -> Region -> District -> Territory -> Program
  每个层级可设置分配金额和上限

3.4.3 预算分配流程

  1. Admin 录入 Region 预算 - 创建 BudgetAllocationHistory (ADMIN_TO_REGION)
  2. RM 分配到 District - 支持平均分配(EVERY)或指定分配(SINGLE),创建 BudgetAllocationHistory (REGION_TO_DISTRICT)
  3. District 间转移 - 验证源 District 余额充足,创建双向 BudgetCapItem 记录
  4. 取消分配 - District 预算退回 Region

BR-036: 分配预算时,allocatedBudget 不能超过 Region 的 unallocatedBudget

BR-037: 取消分配时,releaseBudget 不能超过 District 当前预算。

BR-038: 转移预算时,allocatedBudget 不能超过源 District 的余额。

3.4.4 预算上限方法 (Cap Method)

Cap 方法检查逻辑
SharedAmountPool (0)所有 ProgramType 共用一个 $ 池,检查 locale.balance >= meetingCost
ProgramTypeCap (4)每个 ProgramType 有独立 $ 上限,检查 programType.balance >= meetingCost
ProgramTypeQty (2)只限制数量,检查 totalQuantity - programQuantity > 0

BR-039: hasEnoughBudget 检查应基于 Program 实际 BudgetItem 成本,而非模板估算值。

3.4.5 Program 预算版本管理

每个 Program 有 5 个预算版本:

版本用途
SOW (1)Scope of Work - 工作范围估算
EST (2)Estimate - 预算估计
BILL (3)Billing - 账单
ACT (4)Actual - 实际花费
CXL (5)Cancellation - 取消费用

BR-040: 版本复制操作应将源版本的 items 复制到目标版本,已有对应 item 时更新,没有时插入。

3.4.6 成本计算公式

Total = BaseCost + TaxCost + GratuityCost

BaseCost = quantity * unitCost

TaxCost:
  固定金额 (taxMethod=1): tax
  百分比 (taxMethod=0):   quantity * unitCost * tax / 100

GratuityCost:
  含税 (gratuityIsTaxed=1): 根据 taxMethod 和 gratuityMethod 组合计算
  不含税: 根据 gratuityMethod 计算 (固定金额或百分比)

BR-041: 成本计算应统一为独立的 BudgetCalculator 服务,Java 和 SQL 使用同一计算逻辑。

3.4.7 财务年度

BR-042: 系统应支持按 Product 配置 Fiscal Year 的起止日期,同一 productId 不允许重叠的 fiscal year。

BR-043: Fiscal Period 年份列表应动态生成(当前年份 -5 到 +2),不得硬编码。


3.5 Compliance & Regulatory

3.5.1 领域描述

追踪和报告制药公司向 HCPs 的价值转移(Transfer of Value, TOV),满足美国 Sunshine Act 的透明度报告要求。包含三个核心子领域:Aggregate Spend 报告、TOV 追踪、Compliance Document Audit。

3.5.2 Aggregate Spend Report

  • 按 Product 配置导出哪些字段
  • 支持多种报告格式:标准格式、Porzio 格式、自定义格式
  • 包含两部分数据:F&B TOV per attendee + Speaker expenses from budget items
  • 仅包含已关闭会议(CLOSED / CANCELLED_CLOSED)的数据
  • 仅计算已签到参会者(signInStatus IN (1,3))

BR-044: Aggregate Spend 报告配置应按 Product 管理字段选择,支持运行时动态配置。

BR-045: 报告格式应配置化管理,消除 Porzio、Verona 等客户特定格式的硬编码。

3.5.3 Transfer of Value (TOV) 计算

TOV 计算触发条件(全部满足时触发通知):

  • Budget Version = BILL(4)
  • Meeting Status = CLOSED 或 CANCELLED_CLOSED
  • Attendee List Status = CLOSE
  • enableTOVCalculationNotification = true

TOV 计算逻辑:

headcount = allocationHeadcount ?? actual consumed food headcount
budget = usedTov ?? foodBeverageBudget
attendeeTov = budget / headcount (HALF_UP, 4 位小数)

BR-046: TOV 计算前置条件:Budget Version 必须为 ACT,Attendee List 必须关闭。

BR-047: 系统应支持 TOV 手动调整(批量和单个),并记录调整原因(tovChangeReason, headcountChangeReason)。

BR-048: PLID 匹配应抽取为独立的 PLIDMatchingService,使用枚举而非魔术字符串表示匹配结果。

3.5.4 Compliance Document Audit

  • 按 Program 的 ServiceType 匹配适用的合规文件模板清单
  • 每个文件支持上传、下载、标记"Ready for Audit"
  • Planner 可启用/关闭 Program 的审计状态
  • Sales Rep 只读查看审计数据

BR-049: Admin/Planner 管理文件模板和审计状态,Sales Rep 只读查看。

BR-050: 合规文件清单应按 Product 和 ServiceOption 筛选。


3.6 Communication & Notification

3.6.1 领域描述

管理平台全部通信和通知功能:邮件通信、邮件邀请、定时邮件、调查问卷邮件、提醒系统、告警系统、退订管理、SendGrid 集成、iCalendar 生成。

3.6.2 邮件发送

  • 支持 40+ 模板变量替换(如 %%FIRST_NAME%%%%MEETING_NAME%%%%SPEAKER_FIRST_NAME%%
  • 支持 Email Sandbox 模式(测试环境重定向到指定邮箱)
  • 支持附件、内联图片、iCalendar 日历附件
  • 发送前自动过滤退订名单

BR-051: 邮件发送应引入消息队列,支持发送状态追踪(pending/sent/failed/bounced)和失败重试(指数退避)。

BR-052: 退订检查应在所有邮件发送路径统一执行,包括确认邮件和取消邮件。

BR-053: 邮件模板变量替换应抽取为独立的 EmailTemplateEngine,支持变量注册、验证和缺失变量报告。

3.6.3 邮件邀请系统

  • 基于 ServiceType 配置邀请模板
  • 支持邀请追踪(tracking pixel + invitationId)
  • 支持快速邀请和批量邀请

BR-054: 邀请发送需满足前置条件:对应 ServiceType 有邀请模板、注册站点为 Active 状态。

3.6.4 定时邮件

  • 支持"立即发送"和"定时任务"两种模式
  • 定时规则:X 天前(sendType=0)、X 天后(sendType=1)、日期范围内每 X 天(sendType=2)
  • 按参会者类型、注册状态、签到状态过滤收件人

BR-055: 定时邮件任务应支持激活/停用,逻辑删除。

3.6.5 统一告警系统

系统应使用统一的 Notification 模型替代当前分散的 4 种告警表:

Notification
├── id, type, category, title, description
├── targetUserType, targetUserId
├── sourceType, sourceId
├── actionUrl, actionType
├── status (unread/read/dismissed)
└── createdAt, readAt

BR-056: 告警系统应统一存储、统一查询、统一已读管理,替代 t_alert、t_custom_alert、t_meeting_alert、t_budget_alert 及其 view_history 表。

3.6.6 提醒系统

提醒类型频率描述
注册提醒每天 7AM ET向 Invited 但未注册的参会者重发邀请
邀请提醒(Planner)每周日 8AM ET向 Planner 发送未注册参会者汇总
邀请提醒(Attendee)每周二 8AM ET向参会者重发邀请
待审批提醒每天 2AM超过 2 天的待审批 Program 提醒 DM
Speaker 提醒查询驱动未培训模块、未签合同、新视频标记

BR-057: 提醒时间和频率应可配置,不得硬编码产品 ID 或时间参数。

3.6.7 SendGrid 集成

BR-058: SendGrid 用于邮件活动追踪(opens, clicks 等),每日增量同步。未来可考虑通过 SendGrid Webhook 替代定时轮询实现实时事件通知。


3.7 Geographic & Territory

3.7.1 领域描述

管理制药企业销售组织的地理层级结构,是平台预算分配和数据可见性控制的基础设施。

3.7.2 层级结构

Product
  └── SalesForce (销售部队)
        └── Region (大区) - 关联 RegionManager
              └── District (区域) - 关联 DistrictManager
                    └── Territory (辖区) - 关联 Sales Rep

Team (跨地理团队)
  ├── 关联 SalesForce (1:1)
  ├── 关联 Brand[] (M:N)
  └── 关联 ProgramType[] (M:N)

3.7.3 Planner 分配

Planner 分配支持层级继承:从最低层级(Territory)向上查找第一个非 null 的 plannerId。

BR-059: Planner 分配到 Region 级别时,应级联更新该 Region 下所有 District 和 Territory 的 plannerId。

3.7.4 地理节点重分配

BR-060: District 重分配前应检查预算是否已反分配(当 brandBudgetAllocationEnabled 时)。

BR-061: 重分配操作应在事务中级联更新 UserProduct 和 MeetingRequest 的地理关联字段。

3.7.5 用户地理绑定

BR-062: 用户数据可见范围由地理绑定决定:

  • Sales Person -> 仅本人 Territory
  • District Manager -> 所属 District 下所有 Territory
  • Regional Manager -> 所属 Region 下所有 District/Territory
  • 支持 Secondary Geography(附加可查看的 Region/District)

3.7.6 验证规则

BR-063: 同一层级下节点名称不能重复(如同一 productId 下 Region 名称唯一)。

BR-064: 节点下有关联数据时不可删除(有子节点、关联用户、关联 Program)。

3.7.7 自定义标签

BR-065: 地理层级标签(Region/District/Territory)应支持客户自定义(通过 CustomLabelConfiguration)。


3.8 Reporting & Analytics

3.8.1 领域描述

为三类用户提供多维度数据可视化、统计分析和数据导出能力,覆盖 Program 活动报告、Attendee 分析、At a Glance 仪表板、Ad-hoc 报告构建器、Custom Reports 和 Data Extract 等。

3.8.2 标准报告体系

Program Activity 报告:

  • Program Summary(项目汇总下载)
  • Fiscal YTD Spend by Brand(按品牌年度至今花费)
  • Programs by Budget Status(按预算状态)
  • Program Activity by Geography and Spend(按地理和花费)
  • Program Activity by Sales Representatives(按销售代表)
  • Speaker Utilization(Speaker 利用率)

Attendee Analytics 报告:

  • Attendee Tracker(参会者追踪下载)
  • Registration Summary(注册摘要)
  • Registration by Specialty / Geography / Program

BR-066: 所有报告应统一 Product/Region/District 三级权限过滤,抽取为通用的 ReportPermissionFilter

BR-067: 大报告应采用异步模式:提交报告任务 -> 后台生成 -> 完成后通知用户下载。

3.8.3 Ad-hoc 报告构建器

  • 支持 34 个系统字段 + 自定义字段选择
  • 用户拖拽排序字段构建报告
  • 支持运行、分页查看和 Excel 下载

BR-068: Ad-hoc 报告字段应从数据库配置加载,支持动态扩展。同一 Program 下报告名称唯一。

3.8.4 导出引擎

系统应提供注解驱动的通用导出框架:

  • 支持 @ExcelColumn 注解定义导出字段元数据
  • 支持按 AgencyConfig / ProductConfig 动态控制列的显示/隐藏
  • 支持 DynamicField 运行时列
  • 支持 XLSX、CSV、TXT 格式

BR-069: 导出引擎应统一在 ReportExporter 中,支持 Excel、CSV、PDF(未来扩展)格式。

3.8.5 Custom Reports

BR-070: 系统应将 R/Python 脚本报告迁移到 Java 服务端或沙箱化报告模板引擎,消除服务器环境依赖和安全风险。


3.9 Content & Document

3.9.1 领域描述

管理平台全部文档和内容资产,包括文档模板管理(XDocReport Velocity 模板引擎)、通用文件上传/下载服务、内容库管理(演示文稿、模块、案例研究)。

3.9.2 文档模板生成

  • 使用 XDocReport + Velocity 模板引擎
  • 支持 DOCX、PDF、XHTML 三种输出格式
  • 模板匹配优先级:serviceType > programType > productId > 全局
  • 上下文变量:meetingrequest、speaker、planner、salesrep、attendees、regQRCode 等

文档类型:签到表、纸质邀请、参会者问卷回复、签名报告、酬金发票、Speaker 费用报销、项目后认证、酬金附函

BR-071: PDF 转换策略应配置驱动,不得硬编码模板文件名来决定使用 Docx4J 还是 CloudConvert。

BR-072: 文档模板上传应验证文件扩展名和大小限制。

3.9.3 文件管理

  • 支持 26 种文件类型分类存储
  • 文件使用 MD5 哈希命名实现去重
  • 目标:迁移到对象存储服务(S3/MinIO),支持水平扩展

BR-073: 文件上传应添加类型白名单、大小限制和恶意内容扫描。

BR-074: 文件搜索必须使用参数化查询,禁止 SQL 拼接。

3.9.4 内容库

  • Content 类型:Core Presentation(type=0, sub=0)、Module(type=0, sub=1)、Case Study(type=0, sub=2)、Other Content(type=1)
  • 内容关联 Topic 和 SpeakerGroup
  • Speaker 按 SpeakerGroup 可见性查看内容

BR-075: Content 和 Document 概念应统一为 Asset 模型,使用枚举替代魔法数字。


3.10 Survey & Feedback

3.10.1 领域描述

管理药品演讲项目相关的问卷调查功能:问卷模板创建、问卷与产品/项目类型绑定、问卷填写(Attendee/Speaker/Sales Rep)、结果统计分析和 Excel 下载。

3.10.2 问卷类型

类型填写者触发方式
Attendee Survey参会者项目结束后邮件通知
Sales Rep SurveySales Rep项目结束后在 Salesview 填写
Speaker SurveySpeaker在 Speakerview 填写
Attendee In Program Survey参会者在特定 Program 中填写

3.10.3 问卷流程

  1. Planner 创建问卷模板(SurveyBuilder 可视化编辑器)
  2. 配置问卷的产品/项目类型绑定
  3. 激活问卷
  4. 参会者/Speaker/Sales Rep 填写问卷
  5. 查看统计分析和下载结果

BR-076: 问卷模板应使用统一的动态模板系统,废弃 Speakerview 中按 companyId 硬编码的 Speaker Survey 字段定义。

BR-077: 问卷名称唯一性检查;更新已有回答的问卷时需确认(forceUpdate=true),更新后自动停用。

BR-078: Attendee Survey 按 attendeeId 去重,其他类型按 meetingRequestId 去重。

BR-079: 如启用 enableCloseOutProgram 且项目已关闭,禁止提交问卷。

3.10.4 数据模型改进

BR-080: products JSONB 字段应拆分为 t_survey_productt_survey_program_type 关联表。

BR-081: 为 contentresponse 定义强类型 DTO。


3.11 Expense Management

3.11.1 领域描述

管理 Speaker 在演讲项目中产生的费用报销流程:费用报告创建、明细管理、收据上传、提交审批、审批/拒绝、历史记录。

3.11.2 费用状态工作流

DRAFT(0) --> PENDING_APPROVED(3) --> APPROVED(1)
                                 --> REJECTED(2) --> DRAFT(0)

3.11.3 费用报告流程

  1. Speaker 选择会议,创建费用报告(初始状态 DRAFT)
  2. 添加费用明细(交通、住宿、餐饮等)+ 上传收据
  3. 提交费用报告(状态 -> PENDING_APPROVED)
  4. Planner 审批或拒绝

BR-082: 费用报告和明细应使用软删除,保留数据审计能力。

BR-083: 提交时后端应自动从 ExpenseItem 合计 amount,不接受前端传入的 amount。

BR-084: 每个操作应验证 Speaker 权限(checkSpeakerPermission)。

BR-085: 费用分类支持层级结构(parentCategoryId)。

3.11.4 收据上传

BR-086: 收据上传应统一使用 File Module,先上传获取 fileId 再关联到 ExpenseItem,添加文件类型和大小限制。


3.12 Virtual Programs

3.12.1 领域描述

管理药品演讲项目的虚拟会议功能,支持 Zoom Virtual Meeting、Zoom Webinar 和第三方虚拟会议。

3.12.2 虚拟会议类型

类型代码描述
Zoom Virtual Meeting1标准 Zoom 会议
Zoom Webinar2Zoom 网络研讨会
Third-Party3第三方虚拟会议(手动管理 URL)

3.12.3 创建流程

  1. Planner 选择 Zoom 用户(Host)
  2. 系统通过 Zoom API 创建 Meeting/Webinar
  3. 保存虚拟会议信息到独立数据表
  4. 参会者注册时自动注册到 Zoom 会议
  5. 发送虚拟会议邀请

BR-087: 虚拟会议信息应存储在独立数据表(t_virtual_meetingt_virtual_meeting_attendee),替代 JSONB 字段。

BR-088: Zoom Host 选择顺序:指定的 zoomUser > Sales Rep email > Planner email > 默认配置。

3.12.4 Webhook 处理

  • participant.join - 记录参会者加入时间
  • participant.leave - 记录参会者离开时间
  • meeting.ended - 获取会议报告,更新参会记录

BR-089: Webhook 签名验证使用 HMAC-SHA256,时间戳容差 5 分钟。

3.12.5 Token 管理

BR-090: Zoom Access Token 应按 productId 缓存,支持多产品使用不同 Zoom 账号。


4. External Integration Requirements

4.1 集成清单

外部系统方向协议用途
Salesforce双向REST API(迁移自 SOAP)CRM 联系人/活动同步
Veeva CRM双向SOAP Partner APIVeeva 多渠道活动同步
Zoom双向REST API + Webhook虚拟会议管理
SendGrid入向REST API / Webhook邮件活动追踪
iCal4j出向iCalendar 标准日历邀请生成
Google Maps出向REST API地理编码
SFTP出向SSH/SFTP文件传输
CloudConvert出向REST APIDOCX 到 PDF 转换
SSO/SAML入向SAML 2.0Azure AD/Okta SSO
NPI Registry入向数据库查询医疗人员标识验证
Mosaic出向数据库 + Excel合规数据导出
Podio出向REST WebhookProgram 创建通知

4.2 统一集成架构

BR-091: 所有外部集成应使用统一的集成基础设施层:

IntegrationClient (统一抽象)
├── RetryPolicy (指数退避 + 抖动, 使用 Resilience4j)
├── CircuitBreaker (断路器)
├── TimeoutPolicy (超时控制)
├── RateLimiter (限流)
├── Metrics (Micrometer 指标)
└── CredentialProvider (密钥管理)

4.3 Salesforce 集成要求

BR-092: 从 SOAP Partner API 迁移到 REST API。

BR-093: 消除 SOQL 拼接,使用参数化查询。

BR-094: 按产品隔离连接,每个产品拥有独立的 Salesforce 连接。

BR-095: 大批量同步使用消息队列异步处理。

4.4 Zoom 集成要求

BR-096: 合并 Meeting 和 Webinar 服务的公共逻辑到基类,通过策略模式差异化。

BR-097: 处理 429 Rate Limit 响应,实现指数退避。

4.5 凭据管理

BR-098: 所有集成凭据应迁移到密钥管理服务(如 AWS Secrets Manager 或 HashiCorp Vault),支持自动轮换和访问日志审计。

4.6 SSO 统一

BR-099: 合并 pharmagin-sso 和 pharmagin-login 为单一服务,使用 Spring Security SAML2(5.x+),SSO 成功后直接签发 JWT。


5. Configuration Requirements

5.1 配置层级

Agency Config (实例级)
  └── Company Config (公司级 - 面向 Speaker 品牌定制)
       └── Product Config (产品级 - 最细粒度功能开关)

5.2 配置存储

BR-100: 所有 Feature Flags 应从 YAML 迁移到数据库表,支持运行时动态切换:

t_feature_flag (
  flag_key VARCHAR,
  scope ENUM('AGENCY', 'PRODUCT', 'COMPANY'),
  scope_id INTEGER,
  value JSONB,
  description TEXT,
  updated_at TIMESTAMP,
  updated_by INTEGER
)

BR-101: YAML 仅保留基础设施配置(数据库连接、端口、外部服务 URL 等)。

5.3 Feature Flag 命名规范

BR-102: 全部使用正向命名 xxxEnabled(boolean, true = enabled),消除 disable* 反向命名的混淆。

5.4 配置 API 安全

BR-103: 公共 API 只返回前端需要的配置子集,严格排除 API Keys、Passwords 等敏感信息。

5.5 字典数据管理

系统应管理以下字典数据:Products、Brands、Topics、ProgramTypes、ServiceTypes、Regions、Districts、Territories、Teams、Venues、PLIDs、Speaker Levels、Medical Specialties(60+)等。

BR-104: 字典数据应支持 CRUD 操作和下拉框查询两种模式。

5.6 主题/品牌系统

BR-105: 系统应支持客户自定义视觉风格(primaryColor, secondaryColor, logo, footer),由 Nginx 注入的客户 ID 头驱动品牌配置加载。


6. Non-Functional Requirements

6.1 性能要求

BR-106: 标准列表查询响应时间 < 500ms,报告生成 < 5s(小报告)或异步(大报告)。

BR-107: 支持水平扩展,无状态认证(JWT),Redis 或数据库持久化会话相关数据。

6.2 安全要求

BR-108: 所有 API 端点添加 RBAC 权限控制。

BR-109: 文件上传添加白名单、大小限制、恶意内容扫描。

BR-110: 消除所有 SQL 注入风险,使用参数化查询。

BR-111: 密码使用 BCrypt 加密,移除所有明文密码机制。

BR-112: 登录接口添加 Rate Limiting 防暴力破解。

6.3 审计要求

BR-113: 所有关键业务操作应记录审计日志:Program 状态变更、审批操作、预算分配、合规文档状态变更、配置变更。

BR-114: 审计日志应包含:操作人、操作时间、操作类型、变更前值、变更后值。

6.4 可观测性

BR-115: 所有外部集成操作使用 MDC 记录 correlation ID、集成名称、操作类型。

BR-116: 每次外部调用记录延迟、成功/失败计数(Micrometer 指标)。

BR-117: 暴露 /actuator/health 中各集成的连通性检查。

6.5 数据迁移

BR-118: 系统应提供从旧系统(MeetingRequest/Meeting 双实体模型)到新系统(统一 Program 模型)的数据迁移方案。

BR-119: ID 类型统一策略:Attendee 主键从 UUID String 改为 Long 自增,保留 UUID 作为公开标识符。


7. Data Model Requirements

7.1 核心实体(目标状态)

Program Domain

实体描述主键
Program项目核心信息Long (auto-increment)
ProgramLocation项目地理信息Long, FK: programId
ProgramRequestor请求者信息Long, FK: programId
ProgramSpeaker项目演讲者关联(一对多)Long, FK: programId + speakerId
ProgramApproval审批记录Long, FK: programId
ProgramFinancial财务信息Long, FK: programId
ProgramCustomField动态字段Long, FK: programId
ProgramTask项目任务Long, FK: programId
RegistrationSite注册站点Long, FK: programId
ProgramType项目类型Long
ServiceType服务类型Long

Speaker Domain

实体描述主键
Speaker核心身份信息Long
SpeakerAddress地址(一对多)Long, FK: speakerId
SpeakerContact联系方式Long, FK: speakerId
SpeakerCredential医疗执照Long, FK: speakerId
SpeakerContract合同Long, FK: speakerId
ContractHonorariaItem合同报酬项Long, FK: contractId
SpeakerTraining培训记录(统一)Long, FK: speakerId
SpeakerGroup分组Long

Attendee Domain

实体描述主键
Attendee参会者Long (UUID 作为 externalId)
AttendeeType参会者类型Long
AttendeeSignature电子签名Long, FK: attendeeId
SleepingRoom住宿Long
SleepingRoomInventory房型库存Long, FK: sleepingRoomId

Budget Domain

实体描述主键
BudgetVersion预算版本Long
BudgetCategory预算分类Long
BudgetItem预算行项目Long
BudgetCapLocale区域预算上限Long
BudgetAllocationHistory分配历史Long
FiscalYear财务年度Long

Virtual Meeting Domain

实体描述主键
VirtualMeeting虚拟会议信息Long, FK: programId
VirtualMeetingAttendee虚拟参会者Long, FK: virtualMeetingId

7.2 命名统一规则

旧名称新名称
MeetingRequestProgram
MeetingRegistrationSite
MeetingProgramTypeProgramType
ProgramServiceTypeServiceType
MeetingProjectTaskProgramTask
SalesTeamSalesForce

7.3 数据完整性规则

BR-120: 所有实体使用统一的软删除策略(deleted 标记字段)。

BR-121: 所有 JSONB 字段应定义强类型 Java DTO,使用 JSON Schema 验证结构。

BR-122: 数据库表名统一使用 t_ 前缀。

BR-123: 所有外键关系应在数据库层面定义约束。


Appendix A: Feature Flags Inventory

A.1 Agency Level Flags (14 个)

Flag描述
projectTaskEnabled启用项目任务功能
enableScheduledReports启用定时报告
enableApprovalFlow启用可配置审批流
enableAutomatedEmail启用自动化邮件
enablePreferredSpeakersList启用首选 Speaker 列表
enableForceTargetInvitation启用强制目标邀请
enableHonorariaAmount启用酬金金额设置
enableCloseOutProgram启用关闭项目功能
enableUnsubscribedEmail启用退订邮件管理
enableDataExceptions启用数据异常追踪
enableAttendeeTrackerDataToSftp启用参会者数据 SFTP 传输
enableMosaicIntegration启用 Mosaic 集成
enablePorzioAggSpendReport启用 Porzio 聚合支出报告
enableGoogleGeocodeAPI启用 Google 地理编码

A.2 Product Level Flags (按类别)

Program Configuration (9 个): editProgram, editProgramOnlyApproved, approvalEnabled, attachmentsEnabled, shareProgramEnabled, cancelProgramEnabled, enableApproverComment, lunchAndLearnProgram, enableProgramPresentations

Program List (7 个): brandEnabled, topicEnabled, teamEnabled, venueEnabled, locationEnabled, districtManagerEnabled, regionalManagerEnabled

Registration (19 个): openRegistrationEnabled, registrationSiteEnabled, closeAttendeeListEnabled, closeAttendeeListPendingStatusCheckEnabled, copyAttendeesEnabled, updateCRMAttendeesEnabled, setRegistrationStatusEnabled, unreconcileEnabled, deleteAttendeeEnabled, addToSalesforceEnabled, enableEmailInvitation, allowSalesRepChangeEmailAlias, useDefaultStatusAsNextStatusForInvitedStatus, enableRegistrationSiteStatus, enableLookUpNPI, enableBatchRegistrationBasedOnAffiliation, enableBatchRegistration, enableCustomizedBrandPrefix, disableQuickRegistration

Speaker Search (17 个): filterEnabled, stateEnabled, specialityEnabled, regionReadOnly, honorariaCapEnabled, availableAmountEnabled, continueWithoutSpeakerEnabled, ratingEnabled, trainingEnabled, requiredNoticeEnabled, unavailableDaysEnabled, otherLanguageEnabled, localHonorariaEnabled, travelHonorariaEnabled, disableNotes, enableSpeakerCategory, enableSpeakerLevel

Document Template (8 模板 x 4 子 flag = 32 个): 每个模板(signInSheet, paperInvitation, attendeeSurveyResponses, signatureReport, honorariaInvoice, speakerExpenseReimbursement, postProgramCertification, honorariaCoverLetter)包含:enabled, restricted, permitAll, enableDocx/enablePdf

其他 Product Level (41 个): plannerIdFromProgramType, brandBudgetAllocationEnabled, disallowProgramIfBudgetReached, disallowProgramSubmission, switchProductEnabled, presentationsEnabled, enableNewSurvey, enableCustomReport, enableSpeakerNomination, enablePLID, enableTOVCalculationNotification, enableSpeakerRandomization, enableSignInAttendees, enableQuickEmailInvitation, enableMultipleEmailInvitation

Survey (2 个): salesRepSurveyEnabled, attendeeSurveyEnabled

Alert (1 个): salesRepSurveyEnabled

A.3 Company Level Flags (19 个)

disableSurveyAlerts, speakerSurveyEnabled, disablePresentationDelete, surveyReport, disableUserGroup, enableEditProfile, enableSignUp, enablePresentationMergeField, disablePresentationOnTraining, enableContractAdvanced, enableLEIECheck

Navigation (8 个): disableTopics, disableTraining, disableExpenseReports, disableNominations, disableReports, disableScheduledPrograms, disableCompletedPrograms, enableAdmin

A.4 Database Config Flags (4 个)

topicEnabled, speakerEnabled, prohibitTrainedSpeaker, frequencyCheckEnabled

A.5 统计汇总

类别数量
Agency Level14
Product Level (全部)~128
Company Level19
Database Config4
Active Total~165
已移除18

Appendix B: Business Rules Catalog

Program Domain

ID规则描述
BR-001系统应使用标准 JWT 替代内存 UUID Token,支持无状态认证和水平扩展
BR-002SSO Cookie 必须设置 HttpOnly=true, Secure=true, SameSite=Strict
BR-003密码重置 Token 应持久化存储,包含过期时间,支持多实例部署
BR-004Speaker 认证统一纳入 UnifiedUser 体系
BR-005所有 API 端点应使用 @PreAuthorize 注解进行权限控制
BR-006权限变更通过短有效期 Access Token + Refresh Token 实时生效
BR-007用户数量限制按视图控制,白名单域名用户不受限
BR-008Program 状态流转使用状态机引擎
BR-009状态变更使用命令模式 API
BR-010审批配置使用强类型数据模型
BR-011部分审批支持逐级通知下一审批人
BR-012审批超时自动提醒(可配置产品范围和时间阈值)
BR-013Program 创建时验证 Topic 有效期
BR-014Program 关闭需满足:ACT 版本已创建、参会者列表已关闭、ToV 已完成
BR-015支持 Project Task 模板管理,自动生成任务清单

Speaker Domain

ID规则描述
BR-016Speaker 创建时邮箱唯一性检查(忽略大小写,按 companyId 范围)
BR-017Speaker 删除使用软删除
BR-018合同报酬使用结构化的 honoraria items 表
BR-019合同签署时验证身份所有权
BR-020programQuantityLimit 超限时禁用 Speaker 选择
BR-021演示文稿生成异步处理
BR-022Content 可见性通过 SpeakerGroup 控制
BR-023独立的报酬计算服务统一管理 balance 计算

Attendee & Registration Domain

ID规则描述
BR-024注册状态流转使用状态机,每个 Product 可配置状态转换矩阵
BR-025注册时检查最大参会人数限制
BR-026统一的 ReconciliationService 作为调和操作入口
BR-027批量自动调和仅当精确匹配 1 条时自动合并
BR-028注册时自动执行频率检查
BR-029频率检查支持按月/FiscalYear、按 Topic 过滤、白名单跳过
BR-030频率限制触发时自动通知 Planner
BR-031支持签到、电子签名和地理位置记录
BR-032支持酒店房间管理和库存自动更新
BR-033支持住宿报表下载
BR-034Attendee 主键改为 Long,保留 UUID 作为公开标识符
BR-035状态字段使用 PostgreSQL ENUM 类型

Budget & Financial Domain

ID规则描述
BR-036分配预算不超过 Region unallocatedBudget
BR-037取消分配不超过 District 当前预算
BR-038转移预算不超过源 District 余额
BR-039预算充足检查基于实际 BudgetItem 成本
BR-040版本复制:已有对应 item 更新,没有则插入
BR-041成本计算统一为独立的 BudgetCalculator 服务
BR-042同一 productId 不允许重叠的 fiscal year
BR-043FiscalPeriod 年份列表动态生成

Compliance & Regulatory Domain

ID规则描述
BR-044Aggregate Spend 报告按 Product 配置字段,支持运行时动态配置
BR-045报告格式配置化管理,消除客户特定硬编码
BR-046TOV 计算前置:Budget Version = ACT,Attendee List 已关闭
BR-047TOV 支持手动调整并记录调整原因
BR-048PLID 匹配抽取为独立服务,使用枚举表示匹配结果
BR-049Admin/Planner 管理审计状态,Sales Rep 只读
BR-050合规文件清单按 Product 和 ServiceOption 筛选

Communication Domain

ID规则描述
BR-051邮件发送引入消息队列,支持状态追踪和失败重试
BR-052退订检查在所有邮件发送路径统一执行
BR-053邮件模板变量替换抽取为独立的 EmailTemplateEngine
BR-054邀请发送需有对应模板且注册站点 Active
BR-055定时邮件支持激活/停用,逻辑删除
BR-056告警系统统一为 Notification 模型
BR-057提醒时间和频率可配置,不硬编码
BR-058SendGrid 用于邮件活动追踪,考虑 Webhook 替代定时轮询

Geographic & Territory Domain

ID规则描述
BR-059Planner 分配支持层级级联
BR-060District 重分配前检查预算反分配
BR-061重分配在事务中级联更新关联数据
BR-062用户数据可见范围由地理绑定决定
BR-063同层级节点名称唯一
BR-064有关联数据的节点不可删除
BR-065地理层级标签支持客户自定义

Reporting Domain

ID规则描述
BR-066统一三级权限过滤
BR-067大报告异步生成
BR-068Ad-hoc 字段从数据库配置加载,报告名唯一
BR-069统一导出引擎,支持 Excel/CSV/PDF
BR-070R/Python 脚本迁移到 Java 或沙箱化模板引擎

Content & Document Domain

ID规则描述
BR-071PDF 转换策略配置驱动
BR-072模板上传验证文件扩展名和大小
BR-073文件上传添加白名单、大小限制、恶意内容扫描
BR-074文件搜索使用参数化查询
BR-075Content 和 Document 统一为 Asset 模型

Survey Domain

ID规则描述
BR-076统一动态问卷模板系统,废弃硬编码 Speaker Survey
BR-077问卷名唯一,更新已有回答时需确认并自动停用
BR-078Attendee Survey 按 attendeeId 去重,其他按 meetingRequestId 去重
BR-079关闭的项目禁止提交问卷(可配置)
BR-080products JSONB 拆分为关联表
BR-081定义强类型 DTO

Expense Domain

ID规则描述
BR-082费用报告和明细使用软删除
BR-083提交时后端自动合计 amount
BR-084每个操作验证 Speaker 权限
BR-085费用分类支持层级结构
BR-086收据上传统一使用 File Module

Virtual Program Domain

ID规则描述
BR-087虚拟会议信息存储在独立数据表
BR-088Zoom Host 选择按优先级顺序
BR-089Webhook HMAC-SHA256 签名验证,5 分钟时间戳容差
BR-090Zoom Token 按 productId 缓存

Integration Domain

ID规则描述
BR-091统一集成基础设施层(重试、断路器、超时、限流、指标)
BR-092Salesforce 从 SOAP 迁移到 REST API
BR-093消除 SOQL 拼接
BR-094按产品隔离 Salesforce 连接
BR-095大批量同步使用消息队列
BR-096Zoom Meeting/Webinar 服务合并公共逻辑
BR-097处理 429 Rate Limit
BR-098凭据迁移到密钥管理服务
BR-099SSO 服务统一

Configuration Domain

ID规则描述
BR-100Feature Flags 迁移到数据库,支持运行时切换
BR-101YAML 仅保留基础设施配置
BR-102统一正向命名 xxxEnabled
BR-103公共 API 排除敏感信息
BR-104字典数据支持 CRUD 和下拉查询
BR-105客户自定义品牌样式

Non-Functional

ID规则描述
BR-106标准查询 < 500ms,大报告异步
BR-107无状态认证,支持水平扩展
BR-108所有端点 RBAC 权限控制
BR-109文件上传安全限制
BR-110消除 SQL 注入
BR-111BCrypt 加密,移除明文密码
BR-112登录 Rate Limiting
BR-113关键操作审计日志
BR-114审计日志包含操作人、时间、类型、变更值
BR-115外部集成 MDC correlation ID
BR-116外部调用 Micrometer 指标
BR-117集成健康检查端点
BR-118旧系统到新系统数据迁移方案
BR-119Attendee ID 类型统一策略
BR-120统一软删除策略
BR-121JSONB 字段强类型 DTO
BR-122表名统一 t_ 前缀
BR-123外键约束数据库层定义

Document End

Total Business Rules: 123 (BR-001 to BR-123) Total Feature Flags (Active): ~165 Total Domains: 12 Core + Configuration + Integration = 14