Cross-Cutting Issues Analysis
本文档汇总 15 个领域深入分析文档中发现的跨领域问题,识别重复模式、冲突、依赖关系,并提供优先级排序的问题矩阵。
1. Security Vulnerabilities Summary
1.1 Critical Security Issues(跨领域安全漏洞汇总)
| # | 严重级别 | 类别 | 问题描述 | 位置 | 来源域 |
|---|---|---|---|---|---|
| S-01 | CRITICAL | SQL Injection | SiteController 直接拼接用户输入到 SQL 条件 | SiteController.java:168 | #04 Attendee |
| S-02 | CRITICAL | SQL Injection | FileService 文件名搜索直接拼接字符串到 SQL | FileService.java:42 | #13 Content |
| S-03 | CRITICAL | SQL Injection | ExpenseMapper.xml 使用 ${direction} 而非 #{direction} | ExpenseMapper.xml:118-125 | #15 Expense |
| S-04 | CRITICAL | SQL Injection | Salesforce SOQL 查询拼接无参数化 | SfdcFacade.java:203, DefaultAccountService.java:169-185 | #09 Integration |
| S-05 | CRITICAL | RCE | Custom Reports 通过 ProcessBuilder 执行文件系统上的 R/Python 脚本 | ProductCustomReportService.java:314-324 | #10 Reporting |
| S-06 | CRITICAL | Data Exposure | 公共 API 泄露 SendGrid API Key、SFTP 密码、Google API Key | PublicConfigurationController.java:30-43 | #11 Config |
| S-07 | CRITICAL | Data Exposure | Data Extract 使用 PGConnection 直接执行 SQL,无用户权限过滤 | ProductCustomReportService.java:348-394 | #10 Reporting |
| S-08 | CRITICAL | Auth Bypass | SSO Cookie 缺少 HttpOnly/Secure 标志 | CustomAuthenticationSuccessHandler.java:161-162 | #07 User |
| S-09 | CRITICAL | Auth Bypass | Legacy 密码明文比对仍然活跃 | UserPasswordAuthenticationProvider.java:66-67 | #07 User |
| S-10 | CRITICAL | Auth Bypass | External-Authorization JWT 无 claim 验证(audience/expiry),签名有效即获 SYSTEM 权限 | AuthInfoPreAuthFilter.java:78-99 | #07 User |
| S-11 | HIGH | MITM | SFTP 禁用主机密钥验证 (PromiscuousVerifier) | SFTPService.java:140 | #09 Integration |
| S-12 | HIGH | Credential Exposure | 所有集成凭据明文存储在 YAML 配置文件中 | 全部集成模块 | #09 Integration |
| S-13 | HIGH | Credential Exposure | Zoom OAuth secrets 直接存储在 YAML 中 | VirtualProgramConfig.java | #11 Config |
| S-14 | HIGH | XSS | Speakerview 使用 dangerouslySetInnerHTML | App/index.js:215 | #03 Speaker |
| S-15 | HIGH | Unauth Access | /v1/public/document-url 通过 attendeeId 即可下载 PDF,无鉴权 | PublicDocumentURLController.java:15 | #13 Content |
| S-16 | HIGH | Unauth Access | DocXManagementController 直接列出服务器文件系统目录 | DocXManagementController.java:39-43 | #13 Content |
| S-17 | MEDIUM | Weak RNG | Zoom 密码使用 Random 而非 SecureRandom | ZoomAbstractService | #16 Virtual |
| S-18 | MEDIUM | Hash | MD5 用于文件哈希(应使用 SHA-256) | FileService.java:65 | #13 Content |
1.2 Authentication & Authorization Gaps(认证授权缺口)
缺失权限控制的 Controller 汇总:
| Controller | 端点数量 | 问题 | 来源域 |
|---|---|---|---|
UserController | 18 | 全部端点无权限控制,任何登录用户可 CRUD 任何用户 | #07 User |
RoleController | ~10 | 角色/权限管理无权限控制 | #07 User |
ComplianceController | ~10 | 合规配置无权限控制 | #06 Compliance |
GeographyController | 18 | 地理结构管理无权限控制 | #12 Geographic |
SalesForceController | 6 | SalesForce 管理无权限控制 | #12 Geographic |
TeamController | 5 | Team 管理无权限控制 | #12 Geographic |
ContentController | 19 | 内容管理无权限控制 | #13 Content |
FileController | ~5 | 文件管理无权限控制 | #13 Content |
Token/Session 问题:
- Token 使用内存 Guava Cache(非 JWT),不支持水平扩展 (
AuthManager.java:27-28) → #07 - SSO Token 不删除,
t_user_auth_token表无限增长 (UserTokenAuthenticationProvider.java:47-51) → #07 - 密码重置 Token 使用 JVM 内存 Guava Cache,重启丢失 (
SpeakerService.java:133-137) → #03 - 密码重置 Token 使用 JVM 内存 Cache (
UserService.java:151-154) → #07 - 权限信息缓存不随修改更新 (
AuthInfoUserDetailsService.java) → #07
2. Architectural Anti-Patterns
2.1 God Classes(超大类汇总)
| 文件 | 行数 | 职责 | 来源域 |
|---|---|---|---|
AttendeeService.java | 2,100+ | 注册、reconciliation、导入、签到、TOV 等 | #04 Attendee |
ProgramService.java | 1,577 | 创建、审批、状态变更、列表查询、合规 | #02 Program |
ProductReportService.java | 1,430 | 29 种标准报表 + 权限过滤 | #10 Reporting |
UserService.java | 1,109 | 用户 CRUD、密码、角色、限制检查 | #07 User |
CommunicationService.java | 964 | 邮件发送、模板解析、变量替换 | #08 Communication |
DocumentTemplateService.java | 954 | 文档上下文组装、格式转换、文件 IO | #13 Content |
ContentService.java | 993 | 内容管理、幻灯片编辑、演示文稿生成 | #03 Speaker |
MeetingService.java | 967 | Meeting CRUD、分配、下载、共享 | #02 Program |
SpeakerService.java | 980 | Speaker CRUD、搜索、认证、密码重置 | #03 Speaker |
BudgetAllocationService.java | 824 | 预算分配、策略模式、成本计算 | #05 Budget |
ComplianceService.java | 640 | 合规文档、Agg Spend、导出 | #06 Compliance |
GeographyService.java | 600+ | 地理 CRUD、重分配、Planner 分配 | #12 Geographic |
2.2 Naming Inconsistencies(命名混乱汇总)
| 混乱对 | 问题描述 | 影响范围 |
|---|---|---|
| Meeting vs MeetingRequest vs Program | MeetingRequest = 业务 "Program",Meeting = "Registration Site",但模块名为 meeting,Controller 分 meetings 和 programs | 全局核心概念 |
| SalesTeam vs SalesForce | DB 表 t_sales_team,视图 v_sales_force 重命名。Entity 同时有 salesTeamId 和 salesForceId,需手动同步 | #12 Geographic |
| FiscalYear vs FiscalPeriod | DTO 和 Entity 中两个名字混用,指同一概念 | #05 Budget |
| deleted vs del_flag vs status | 软删除字段命名不一致 | 全局(见 2.3) |
| ProductConfiguration | 两个完全不同的类同名:DB Entity (3 fields) vs YAML POJO (100+ fields) | #11 Config |
| speakerName vs speakername | Speaker 实体中大小写不一致的重复字段 | #03 Speaker |
| enable vs disable** | Feature flag 命名正反混用 | #11 Config |
2.3 Data Model Anti-Patterns
Missing @Id / Primary Key:
| Entity | 问题 | 来源域 |
|---|---|---|
MeetingChangeLog | 无 @Id 注解 | #02 Program |
FiscalYear | 无主键 | #05 Budget |
AttendeeSurveyResponse | 缺少主键 | #14 Survey |
UserProductRole | 缺少主键 | #07 User |
SiteTemplate | 仅 attendee_type_id 作为主键,缺少 meeting_id | #13 Content |
软删除不一致:
| Entity | 字段 | 模式 | 来源域 |
|---|---|---|---|
Attendee | deleted | Boolean | #04 |
Content | del_flag | Integer | #13 |
Document | deleted | Integer | #13 |
BudgetItem | deleted | String ("ACTIVE"/"INACTIVE") | #05 |
Brand | status | Integer (0/1) | #11 |
Speaker | 硬删除(无软删除字段) | N/A | #03 |
Expense | 硬删除 | N/A | #15 |
JSONB 滥用(无类型 Object 字段):
| Entity | 字段 | 来源域 |
|---|---|---|
MeetingRequest | approvals, dynamicProgramFields, virtualProgramInfo, zoomProgramInfo, speakerRandomization | #02 |
MeetingComplianceDocument | files | #06 |
ComplianceDocument | config | #06 |
Mail | config | #08 |
ScheduledEmail | config | #08 |
EmailSandbox | config | #08 |
AttendeeSurvey | content (问卷模板) | #14 |
Product | productConfig | #11 |
ProductConfiguration | logos | #11 |
UserCompany | productIds | #07 |
Attendee | virtualProgramAttendeeInfo, registrationSource | #04, #16 |
自定义序列化格式:
| 格式 | 用途 | 位置 | 来源域 |
|---|---|---|---|
@-@ / @=@ 分隔符 | meetingRequestInfo KV 存储 | MeetingRequestDTO.java | #02 |
| 分号分隔字符串 | mailTo 多收件人 | Mail.java:65 | #08 |
| 分号分隔字符串 | attendeeId 列表 | CommunicationService | #08 |
| 逗号分隔字符串 | contract IDs 下载 | SpeakerContractController.java:117 | #03 |
2.4 Hardcoded Values(硬编码汇总)
客户特定逻辑:
| 硬编码值 | 用途 | 位置 | 来源域 |
|---|---|---|---|
productId == 24 (Tesaro) | 特殊字段处理 | MeetingRequestDTO.java | #02 |
productId == 24 | 待审批提醒仅此客户可用 | MeetingTask.java:54 | #08 |
"Noven Therapeutics, LLC" | Porzio 报告格式 | PorzioAggSpendReport.java:19,25,28,42,74 | #06 |
| Noven 参会者字段映射 | 报表列 | ProductReportService.java:429-436 | #10 |
FOOD_BEVERAGE_SUB_CATEGORY = 15923 | TOV 计算 | AttendeeTovService.java:75-78 | #06 |
categoryId 9/4 | 预算类型(Honoraria/Speaker Expense) | BudgetItemTemplateService.java:168-169,184 | #05 |
countryId = 2 (US) | Program 创建默认值 | CreateProgramRequest.java | #02 |
过期时间硬编码:
| 硬编码值 | 过期时间 | 位置 | 来源域 |
|---|---|---|---|
| DST 时间表 2017-2030 | 2031年失效 | MailService.java:639-658 | #08 |
| FiscalPeriod 年份到 2025 | 2026年已失效 | FiscalPeriod.java:11-22 | #11 |
| "2024 Noven SP Attendees" | 已过期 | NovenAttendanceFrequencyCheckService.java:98 | #04 |
3. Cross-Domain Dependencies
3.1 Dependency Map
┌──────────────┐
│ Configuration│
│ (#11) │
└──────┬───────┘
│ feature flags / product config
┌────────────┼────────────────┐
▼ ▼ ▼
┌────────────┐ ┌──────────┐ ┌──────────────┐
│ User & │ │Geographic│ │Communication │
│ Permission │ │ (#12) │ │ (#08) │
│ (#07) │ └────┬─────┘ └──────┬───────┘
└─────┬──────┘ │ │
│ │ │ emails/alerts
│ auth │ territory │
▼ ▼ ▼
┌─────────────────────────────────────────┐
│ Program & Meeting (#02) │
│ (Central Hub - most dependencies) │
└──┬────────┬────────┬────────┬───────┬───┘
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
┌─────────┐ ┌──────┐ ┌──────┐ ┌─────┐ ┌──────────┐
│ Speaker │ │Budget│ │Attend│ │Comp-│ │ Virtual │
│ (#03) │ │(#05) │ │-ee │ │lian-│ │ Program │
└────┬────┘ └──────┘ │(#04) │ │ce │ │ (#16) │
│ └──┬───┘ │(#06)│ └──────────┘
│ │ └──┬──┘
▼ ▼ │
┌─────────┐ ┌──────────┐ │
│ Content │ │ Survey │ │
│ (#13) │ │ (#14) │ │
└─────────┘ └──────────┘ │
│
┌─────────┐ ┌──────────┐ │
│ Expense │ │Reporting │◄──┘ (compliance reports)
│ (#15) │ │ (#10) │
└─────────┘ └──────────┘
┌──────────────┐
│ Integration │←── connects to: Salesforce, Zoom, SendGrid, SSO, SFTP
│ (#09) │
└──────────────┘3.2 Shared Entity Analysis(跨域共享实体)
| Entity | 主域 | 使用域 | 冲突说明 |
|---|---|---|---|
MeetingRequest | #02 Program | #03 Speaker, #04 Attendee, #05 Budget, #06 Compliance, #08 Comm, #10 Report, #16 Virtual | 98 字段的"上帝实体",所有域都直接读写 |
Attendee | #04 Attendee | #06 Compliance (TOV), #10 Report, #14 Survey | 40 字段,被合规和报表直接查询 |
Speaker | #03 Speaker | #02 Program (speaker slots), #05 Budget (honoraria), #10 Report | 88 字段,预算和报表直接引用 |
Product | #11 Config | 几乎所有域 | 产品 ID 作为全局上下文,所有业务查询都需要 |
UnifiedUser | #07 User | 几乎所有域 | 用户身份贯穿所有操作 |
Mail | #08 Comm | #08 (邮件发送 + 邀请模板) | 同一张表双重职责 |
3.3 Coupling Issues(耦合问题)
Service 层循环依赖:
MeetingService↔ProgramService互相注入 (#02)ProgramController直接调用ComplianceService(#02 → #06)- 合规功能分散在
ComplianceController,ProgramController,AttendeeTovController,ProductReportController四个 Controller (#06)
过度注入(10+ @Autowired 依赖的 Service):
MeetingService- 20+ 依赖 (#02)ProgramService- 15+ 依赖 (#02)AttendeeService- 15+ 依赖 (#04)CommunicationService- 10+ 依赖 (#08)
4. Duplicated Logic
4.1 Code Duplication Patterns
| 重复模式 | 重复次数 | 位置 | 来源域 |
|---|---|---|---|
| 权限过滤 (Product/Region/District) | 8+ 次 | ProductReportService.java | #10 |
| PLID enrichment 逻辑 | 2 次 | ComplianceService.java export() + getMeetingToVData() | #06 |
| Reconciliation 实现 | 3 套 | NPI + Target + Salesforce,各自独立 | #04 |
| 频率检查 | 2 套 | Noven 特殊实现 + Plus 通用实现 | #04 |
| 登录组件 | 3 套 | 三个前端各自实现 Login 组件 | #07 |
| 路由配置 | 重复 200 行 | plannerview meetings/:id vs registrations/:id | #02 |
| BudgetItem vs BudgetItemTemplate | 大量重复字段 | Entity 层 | #05 |
| Zoom Meeting vs Webinar Service | 大量代码重复 | ZoomVirtualMeetingService vs ZoomWebinarService | #09 |
| Saga worker 模板代码 | 28 个 | salesview Reports redux | #10 |
4.2 Dual/Redundant Systems
| 冗余系统 | 系统 A | 系统 B | 说明 | 来源域 |
|---|---|---|---|---|
| Controller 双入口 | MeetingController | ProgramController | 同一数据(MeetingRequest),不同视角,职责重叠 | #02 |
| 注册双入口 | site 模块 | registration 模块 | 重叠的注册端点,最终调用同一个 AttendeeService.saveRegistration() | #04 |
| 合同 Controller 双入口 | SpeakerContractController | SecureSpeakerContractController | 同一 Contract 资源,不同安全模型 | #03 |
| Alert 五系统 | Alert | CustomAlert + MeetingAlert + BudgetAlert + BudgetAlertViewHistory | 无统一告警模型 | #08 |
| SSO 双服务 | pharmagin-sso | pharmagin-login | 新旧并存,login 未上线 | #07, #09 |
| 报表四系统 | Standard | Ad-hoc + Custom R/Python + Data Extract | 无统一报表框架 | #10 |
| Survey 双系统 | Backend 动态模板 | Speakerview 硬编码 fields.js | 不兼容 | #14 |
| 配置三来源 | YAML | DB t_product.product_config JSONB | DB t_product_configuration 表 | #11 |
5. Infrastructure Issues
5.1 Scalability Blockers(可扩展性阻断点)
| 阻断点 | 问题 | 位置 | 来源域 |
|---|---|---|---|
| In-memory token storage | Guava Cache 存 auth token,重启丢失 | AuthManager.java:27-28 | #07 |
| In-memory password reset | Guava Cache 存重置 token | SpeakerService.java:133-137, UserService.java:151-154 | #03, #07 |
| Local filesystem storage | 文件存本地磁盘 | FileService.java, TemplateService.java | #13 |
| Thread-unsafe singletons | FieldMappingFactory 静态单例共享可变状态 | FieldMappingFactory.java:40-41,56-63 | #09 |
| Thread-unsafe singletons | SfdcFacade 单例共享 PartnerConnection | SfdcFacade.java:36-37,52 | #09 |
| Thread-unsafe singletons | ZoomAccessTokenManager 全局静态缓存 | ZoomAccessTokenManager.java:12 | #09, #16 |
| Thread-unsafe singletons | Strategy 单例共享 comment 字段 | RegionToDistrictStrategy.java:23, DistrictToDistrictStrategy.java:21 | #05 |
| SimpleDateFormat 共享 | 多处作为实例变量使用 | SendGridService.java:41, MosaicService.java:29 | #09 |
| 裸 Thread 使用 | 文档生成使用 new Thread() | DocumentTemplateService.java:315,351 | #13 |
5.2 Configuration Chaos(配置混乱)
- 三重配置来源无优先级:YAML(AgencyConfiguration)、DB JSONB(product_config)、DB 表(t_product_configuration)优先级未定义 (#11)
- 165+ Feature Flags 全部需重启:所有 flag 嵌入 YAML,无运行时切换能力 (#11)
- 正反命名混用:
enable*和disable*混用,前端逻辑易出错 (#11) - 配置层级重叠:
speakerLevels同时出现在 CompanyConfiguration 和 ProductConfiguration (#11)
5.3 Missing Infrastructure(缺失基础设施)
| 缺失组件 | 影响 | 当前替代方案 |
|---|---|---|
| 消息队列 | 邮件发送无重试、事件驱动不完整 | @Async + 直接调用 |
| 分布式缓存 | Token/Session 不支持多实例 | JVM 内存 Guava Cache |
| API 网关 | 无统一认证、限流、路由 | Nginx + 各服务独立认证 |
| 断路器 | 外部集成无容错(Salesforce/Zoom/SendGrid) | 直接调用无重试(仅 Podio 有 Spring Retry) |
| 集中式日志 | 分散在各服务日志文件 | log.error() + printStackTrace() 混用 |
| 配置中心(运行时) | 功能开关需重启 | Spring Cloud Config(启动时加载,不可热更新) |
| 对象存储 | 文件存本地磁盘 | 服务器文件系统 |
| 任务调度平台 | 定时任务分散在各服务 | Spring @Scheduled 注解 |
6. Frontend Cross-Cutting Issues
6.1 Technology Debt
| 技术 | 当前版本 | 目标版本 | 影响的前端 |
|---|---|---|---|
| React | 15.x-16.x | 18.x+ | plannerview, speakerview |
| React Router | 3.x-4.x | 6.x+ | plannerview, speakerview |
| Ant Design | 3.x | 5.x+ | plannerview, speakerview |
| Redux | Class-based | Redux Toolkit / Zustand | 全部 |
| Build Tool | CRACO | Vite | 全部 |
| Dynamic Import | System.import | import() | speakerview |
| Lifecycle Methods | componentWillReceiveProps (deprecated) | Hooks | 全部 |
| String Refs | ref="xxx" | useRef / createRef | plannerview Ad-hoc Report |
6.2 Shared Code Gaps
| 缺失组件 | 现状 | 影响 |
|---|---|---|
| 共享组件库 | 三个前端独立开发相同组件 | 3x 代码量 |
| 共享 API 客户端 | 各自实现 fetch/axios 调用 | 错误处理不一致 |
| 共享 Auth 模块 | 三个 Login 组件各自实现 | 登录行为不一致 |
| 共享类型定义 | 无 TypeScript | 165+ feature flags 无类型检查 |
| 共享状态管理 | Redux / sessionStorage / props 混用 | 数据不同步 |
6.3 State Management Issues
- sessionStorage 不跨标签页:用户体验差,不同标签页状态不同步 (#07)
- 前端硬编码角色检查:Speakerview 使用简单字符串角色 ('Admin', 'Speaker', 'Sales') 忽略后端 RBAC (#07)
- 配置双重存储:Redux 和 sessionStorage 中双重存储配置 (#11)
- Saga 模板代码大量重复:28 个 saga workers 可用通用工厂简化 (#10)
- 前端包含大量业务逻辑:TOV 计算、权限过滤等应在后端处理
7. Data Integrity Risks
7.1 Missing Transactions(缺失事务控制)
| 操作 | 风险 | 位置 | 来源域 |
|---|---|---|---|
| 地理重分配 (District/Territory) | 多步骤 DB 更新无 @Transactional | GeographyService.java reassign 方法 | #12 |
| Attendee Response 保存 | 先删后插无事务,并发可能数据丢失 | AttendeeService.java:725-746 | #04 |
| Aggregate Spend 配置保存 | DELETE ALL + INSERT ONE-BY-ONE | ComplianceService.java:322-337 | #06 |
| 预算分配 | 多步骤分配无事务保护 | BudgetAllocationService.java | #05 |
7.2 Cascade Delete Risks(级联删除风险)
| 操作 | 问题 | 位置 | 来源域 |
|---|---|---|---|
| Speaker 删除 | 硬删除,无法恢复 | SpeakerService.java:503 | #03 |
| Expense 删除 | 物理删除 | ExpenseService | #15 |
| MeetingAlert 删除 | 空 Example 删除所有记录 | MeetingController.java:153-156 | #02 |
| BudgetItem 删除 | 设 deleted=INACTIVE 后立即物理删除 | BudgetItemService.java:143-144 | #05 |
7.3 Orphan Data Risks
t_user_auth_token无过期清理机制,无限增长 (#07)- 临时文件(DOCX、PNG)异常时不清理 (#13)
- BudgetAllocationHistory 和 ExpenseHistory 累积完整记录副本 (#05, #15)
8. Prioritized Issue Matrix
8.1 P0 - Must Fix Before/During Rewrite(必须修复)
| # | 问题 | 类别 | 来源域 | 影响 |
|---|---|---|---|---|
| P0-01 | SQL Injection (4处) | Security | #04, #13, #15, #09 | 数据泄露/破坏 |
| P0-02 | RCE via ProcessBuilder | Security | #10 | 服务器完全控制 |
| P0-03 | 公共 API 泄露 API Keys/密码 | Security | #11 | 凭据泄露 |
| P0-04 | Data Extract 无权限过滤 | Security | #10 | 数据泄露 |
| P0-05 | SSO Cookie 无 HttpOnly/Secure | Security | #07 | Session 劫持 |
| P0-06 | JWT 无 claim 验证 | Security | #07 | 身份伪造 |
| P0-07 | 多个 Controller 无权限控制 | Security | #07, #06, #12, #13 | 未授权操作 |
| P0-08 | 明文密码比对 | Security | #07 | 密码泄露 |
| P0-09 | In-memory token 阻止水平扩展 | Architecture | #07 | 不可扩展 |
| P0-10 | MeetingRequest 98字段上帝实体 | Architecture | #02 | 核心数据模型不可维护 |
| P0-11 | AttendeeService 2100+ 行 God Class | Architecture | #04 | 核心逻辑不可维护 |
| P0-12 | Meeting vs MeetingRequest 命名混淆 | Architecture | #02 | 开发效率极低 |
| P0-13 | FiscalPeriod 硬编码到 2025 | Bug | #11 | 功能已失效 |
| P0-14 | assignPlannerToSalesforce 逻辑反转 | Bug | #12 | 功能完全失效 |
| P0-15 | NPI/Target 过滤条件 Bug | Bug | #04 | Reconciliation 静默失败 |
8.2 P1 - Fix During Rewrite(重写时修复)
| # | 问题 | 类别 | 来源域 |
|---|---|---|---|
| P1-01 | 三重配置来源无优先级 | Architecture | #11 |
| P1-02 | 165+ Feature Flags 需重启 | Architecture | #11 |
| P1-03 | Alert 五系统碎片化 | Architecture | #08 |
| P1-04 | 报表四系统碎片化 | Architecture | #10 |
| P1-05 | SSO 双服务并存 | Architecture | #07, #09 |
| P1-06 | Controller 双入口 (meetings + programs) | Architecture | #02 |
| P1-07 | 注册双入口 (site + registration) | Architecture | #04 |
| P1-08 | Speaker 88 字段单表 | Data Model | #03 |
| P1-09 | 合同报酬 15+ 硬编码字段 | Data Model | #03 |
| P1-10 | JSONB 字段无类型安全 (10+ 处) | Data Model | 多域 |
| P1-11 | 软删除模式不统一 | Data Model | 全局 |
| P1-12 | 自定义序列化格式 (@-@, 分号等) | Data Model | #02, #08 |
| P1-13 | 审批逻辑 200+ 行 if/else | Business Logic | #02 |
| P1-14 | 三套独立 Reconciliation 实现 | Business Logic | #04 |
| P1-15 | Reconciliation 逻辑散在多个 Service | Business Logic | #04 |
| P1-16 | 权限过滤逻辑重复 8+ 次 | Code Quality | #10 |
| P1-17 | 本地文件系统存储 | Infrastructure | #13 |
| P1-18 | Thread-unsafe 单例 (4处) | Concurrency | #05, #09 |
| P1-19 | 所有凭据明文存储 | Security | #09 |
| P1-20 | SFTP 禁用主机密钥验证 | Security | #09 |
8.3 P2 - Nice to Have(改善项)
| # | 问题 | 类别 | 来源域 |
|---|---|---|---|
| P2-01 | Lombok 使用不统一 | Code Style | 全局 |
| P2-02 | React 版本过旧 (15.x-16.x) | Frontend | 全局 |
| P2-03 | 无共享前端组件库 | Frontend | 全局 |
| P2-04 | 无 TypeScript 类型 | Frontend | 全局 |
| P2-05 | Deprecated React 生命周期方法 | Frontend | 全局 |
| P2-06 | Saga 模板代码大量重复 | Frontend | #10 |
| P2-07 | Swagger 注解不完整/错误 | API Docs | 多域 |
| P2-08 | 一次性迁移 Controller 未移除 | Cleanup | #05, #14 |
| P2-09 | 已移除功能的遗留字段 | Cleanup | #03, #04, #15 |
| P2-10 | 拼写错误 (trainnedDate, parmaeters, deactive, MTBudgetSeachForm) | Code Quality | 多域 |
9. Statistics Summary
9.1 Issue Counts by Domain
| Domain | Critical | Design | Tech Debt | Total |
|---|---|---|---|---|
| #02 Program & Meeting | 6 | 8 | 8 | 22 |
| #03 Speaker | 9 | 10 | 10 | 29 |
| #04 Attendee & Registration | 6 | 9 | 10 | 25 |
| #05 Budget & Financial | 6 | 10 | 10 | 26 |
| #06 Compliance | 5 | 10 | 8 | 23 |
| #07 User & Permission | 8 | 10 | 10 | 28 |
| #08 Communication | 6 | 8 | 7 | 21 |
| #09 Integration | 7 | 11 | 10 | 28 |
| #10 Reporting | 5 | 8 | 8 | 21 |
| #11 Configuration | 5 | 8 | 8 | 21 |
| #12 Geographic | 5 | 8 | 7 | 20 |
| #13 Content & Document | 7 | 10 | 10 | 27 |
| #14 Survey | 3 | 5 | 5 | 13 |
| #15 Expense | 4 | 5 | 5 | 14 |
| #16 Virtual Program | 3 | 6 | 5 | 14 |
| Total | 85 | 126 | 121 | 332 |
9.2 Issue Counts by Category
| 类别 | 数量 | 占比 |
|---|---|---|
| Security (安全漏洞) | 18 | 5.4% |
| Architecture (架构问题) | 45 | 13.6% |
| Data Model (数据模型) | 52 | 15.7% |
| Business Logic (业务逻辑) | 38 | 11.4% |
| API Design (API 设计) | 35 | 10.5% |
| Code Quality (代码质量) | 48 | 14.5% |
| Frontend (前端) | 55 | 16.6% |
| Infrastructure (基础设施) | 15 | 4.5% |
| Concurrency (并发) | 8 | 2.4% |
| Other | 18 | 5.4% |
| Total | 332 | 100% |