writeOff/会议核销SaaS系统_技术开发文档.md
haomingming 815aa04fe8 first
2026-05-20 18:21:39 +08:00

41 KiB
Raw Permalink Blame History

会议核销SaaS系统技术开发文档

1. 文档说明

1.1 文档目的

  • 基金会、协会、北京欣欣会议核销系统_完整版.md 的业务需求落地为可研发实施的技术方案。
  • 作为产品、研发、测试、运维的统一执行基线。

1.2 适用范围

  • 多租户会议核销SaaS平台。
  • 覆盖系统设置、项目管理、会议管理、审核管理、专家(参会人)管理、模板管理、财务管理等模块。

1.3 术语统一

  • 租户:单位主体。
  • 模板:统一使用“模板”命名。
  • 专家:参会人主数据实体。
  • 审核聚合状态:待审核、审核中、审核通过、审核拒绝。

2. 总体技术架构

2.1 架构分层

  • 前端层Web管理端PC优先
  • 网关层:统一鉴权、限流、审计埋点入口。
  • 业务服务层:用户权限、项目会议、审核、模板、财务、专家服务。
  • 任务调度层:通知发送、超时催办、报表导出、文件处理。
  • 数据层:关系型数据库 + 对象存储 + 缓存。

2.2 推荐技术栈

  • 前端:Vue3 + TypeScript + Element Plus(最终确定)。
  • 后端:Java Spring Boot(最终确定)。
  • 数据库:MySQL 5.7(最终确定)。
  • 缓存:Redis(会话、字典、短期查询缓存、分布式锁)。
  • 对象存储:阿里云 OSS(会议资料、模板、附件,最终确定)。
  • 消息队列:当前阶段不引入,异步任务采用 Spring Scheduler + 数据库任务表 实现。

2.3 部署拓扑

  • 环境:dev / test / staging / prod 四套。
  • 组件:apiworkerschedulerwebmysqlredisobject-storage
  • 网络:内外网隔离,数据库与对象存储走私网。

2.4 前端组件规范Element Plus

  • 页面类型统一
    • 列表页:查询区 + 表格区 + 分页区 + 批量操作区。
    • 详情页:基础信息卡片 + 状态流转卡片 + 操作记录时间线。
    • 表单页:分步表单或分组卡片表单,统一必填标识与校验提示。
  • 组件选型统一
    • 表格:el-table,大列表必须启用服务端分页与排序。
    • 表单:el-form + el-form-item统一校验触发时机blur/change
    • 弹窗:el-dialog,二次确认场景统一危险操作提示文案。
    • 抽屉:el-drawer,用于轻量编辑与详情预览。
    • 上传:el-upload,统一文件类型、大小、命名校验。
  • 交互规范
    • 所有异步操作提供加载态、防重复提交和结果反馈。
    • 高风险操作(删除、状态回滚、支付确认)必须二次确认。
    • 权限不足按钮置灰并提供提示,不直接隐藏关键功能入口。
  • 视觉与主题
    • 统一使用 Element Plus 主题变量管理色板、间距、字体。
    • 状态色规范:成功(绿)、处理中(蓝)、拒绝/异常(红)、待处理(橙)。

2.5 部署配置与环境变量清单(必须)

  • 应用基础
    • APP_ENVSERVER_PORTLOG_LEVELTIME_ZONE=Asia/Shanghai
  • MySQL 5.7
    • DB_URLDB_USERNAMEDB_PASSWORD
    • DB_POOL_MAX_ACTIVEDB_POOL_MIN_IDLEDB_CONN_TIMEOUT_MS
    • DB_TX_ISOLATION(建议按业务定义,默认 READ COMMITTED
  • Redis
    • REDIS_HOSTREDIS_PORTREDIS_PASSWORDREDIS_DB
    • REDIS_LOCK_TIMEOUT_MS
  • OSS
    • OSS_ENDPOINTOSS_BUCKETOSS_ACCESS_KEY_IDOSS_ACCESS_KEY_SECRET
    • OSS_SIGN_EXPIRE_SECONDSOSS_CORS_ORIGIN_WHITELIST
  • 鉴权与安全
    • JWT_SECRETJWT_EXPIRE_MINUTESREFRESH_TOKEN_EXPIRE_DAYS
    • DATA_ENCRYPT_KEY(敏感字段加密)/ KMS_KEY_ID如启用KMS
  • 调度任务
    • SCHEDULER_ENABLEDSCHEDULER_POLL_INTERVAL_MS
    • SCHEDULER_BATCH_SIZEJOB_MAX_RETRYJOB_TIMEOUT_SECONDS
  • 通知与邮件
    • 邮件 SMTP 参数统一在“通知网关配置 > 邮件网关”中维护
    • MAIL_FROMNOTIFY_CHANNELS

3. 多租户与权限模型

3.1 租户隔离策略

  • 所有业务表强制包含 tenant_id
  • 查询默认注入 tenant_id 过滤条件。
  • 导出、下载、搜索、统计均执行租户隔离校验。

3.2 RBAC + 数据范围

  • RBAC平台超级管理员、单位管理员、负责人、项目执行人、审核人、财务、审计只读。
  • 数据范围:租户范围、项目范围、会议范围、模块范围。
  • 策略优先级:显式拒绝 > 显式允许 > 默认拒绝。

3.3 职责互斥

  • 提交人与对应审核人不能同人。
  • 初审人与终审人默认不能同人(例外需留痕)。
  • 财务不可修改审核结论,审核人不可修改财务字段。

4. 业务模块技术拆分

4.1 系统设置

  • 租户管理(平台级):租户创建、启停、状态治理与审计留痕。
  • 企业管理:企业档案维护。
  • 用户管理:账号生命周期、代理授权、角色变更快照。
  • 菜单与权限:菜单可见性与动作权限绑定。
  • 审核流配置1级/2级/3级审核链配置。
  • 通知策略:渠道、触发事件、模板变量。
  • 审计日志:高风险操作留痕与查询。

4.2 项目管理

  • 项目主数据:负责人、执行人、预算、期数、状态。
  • 预算控制:超支阈值、审批链、冻结/解冻。
  • 变更控制:周期、预算、负责人、执行人变更留痕。
  • SLA预警到期预警、超支预警、资料缺失预警。

4.3 会议管理

  • 会议主数据:时间、地点、形式、费用、占比。
  • 资料模块:基础信息、核销材料、现场照片、劳务协议、发票明细、专家简介。
  • 会议级提交:必填模块完成后触发审核流程。
  • 字段锁定:提交后锁定费用类字段,终审后只读。

4.4 审核管理

  • 节点动作:通过、拒绝、退回修改、转审。
  • 状态映射:节点状态映射会议聚合状态。
  • SLA超时催办与升级通知。
  • 审核留痕:意见、附件、前后状态、操作终端。

4.5 专家(参会人)管理

  • 专家主数据:身份信息、联系方式、职称、机构。
  • 银行卡治理:多卡、默认卡、一致性校验。
  • 去重合并:身份证唯一 + 相似度辅助。
  • 快照引用:会议提交时固化专家关键字段快照。

4.6 模板管理

  • 模板全生命周期:草稿、已发布、已停用、已归档。
  • 版本管理:新版本发布、回滚、差异追踪。
  • 下载留痕:下载日志、水印、越权校验。
  • 流程联动:会议推荐模板、审核节点通知模板、结算模板。

4.7 财务管理

  • 入账口径:仅终审通过会议进入财务计算。
  • 支付流转:待提交 -> 待财务确认 -> 已确认 -> 部分支付 -> 已结清。
  • 对账结算:差异工单、锁账/解锁、台账导出。
  • 风控规则:超预算、超阈值、重复支付拦截。

4.8 会议字段管理(已下线)

  • 会议字段管理模块已从当前版本移除,不再提供字典配置页面与相关接口。
  • 会议模块字段由业务模型与接口契约直接维护。

4.9 发票管理(已实现)

  • 发票抬头主数据:企业名称、税号、开户行、账号、地址、电话。
  • 关联范围:支持按项目绑定默认抬头,会议可覆盖。
  • 合规校验:税号格式、账号长度、唯一性校验。
  • 留痕与导出:支持变更历史与按权限导出。

5. 核心状态机定义

5.1 项目状态机

  • 待开始 -> 进行中 -> 已完成
  • 可人工流转:进行中 -> 已中止已完成 -> 已归档任意 -> 已冻结

5.2 会议状态机

  • 未开始 -> 进行中 -> 已完成
  • 扩展流转:未开始 -> 已取消任意 -> 已冻结进行中/已完成 -> 已延期(标记)

5.3 审核状态机

  • 节点状态:待审核、初审拒绝、初审通过、复审拒绝、复审通过、终审拒绝、终审通过
  • 聚合状态:待审核、审核中、审核通过、审核拒绝
  • 关键规则:终审通过后若关键字段变更,回退到待审核

5.4 支付状态机

  • 待提交 -> 待财务确认 -> 已确认 -> 部分支付 -> 已结清
  • 风险场景:任意 -> 冻结支付

6. 数据模型设计(核心表)

以下为核心表建议,实际可按单体/微服务拆分。

6.1 租户与用户

  • tenant:租户信息。
  • user用户账号含状态、有效期、tenant_id
  • role / permission / role_permission:角色权限模型。
  • user_role:用户角色绑定。
  • user_delegation:代理授权记录(生效时间窗、状态、失效原因)。
  • data_scope_policy:数据范围策略。

6.1.1 平台设置补充模型

  • enterprise企业主数据名称、网址、Logo、状态
  • menu菜单定义层级、路由、排序、状态、permission_code
  • role_menu:角色与菜单绑定关系。

6.2 项目与会议

  • project:项目主表(预算、期数、状态、负责人)。
  • project_member:项目成员(主办/合作负责人、执行人)。
  • project_change_log:项目变更日志。
  • meeting:会议主表(时间、地点、费用、状态)。
  • meeting_material:会议资料主表(模块、版本、状态)。
  • meeting_material_file:资料附件文件表。
  • meeting_expert_snapshot:会议引用专家快照。

6.3 审核

  • audit_flow:审核流定义。
  • audit_flow_node:审核节点定义。
  • audit_task:审核任务实例(按会议+模块+节点)。
  • audit_action_log:审核动作日志(通过/拒绝/退回/转审)。

6.4 专家

  • expert:专家主表(脱敏展示字段 + 加密字段索引)。
  • expert_bank_card:专家银行卡表(默认卡、状态)。
  • expert_merge_log:专家合并记录。

6.5 模板

  • template:模板主表(类型、状态、范围)。
  • template_version:模板版本表(版本号、生效标记)。
  • template_download_log:模板下载日志。

6.6 财务

  • finance_project_summary:项目级财务汇总。
  • finance_meeting_bill:会议费用账单。
  • finance_payment:支付记录。
  • finance_reconciliation:对账记录。
  • finance_risk_event:财务风险事件。

6.7 通用

  • notification_policy / notification_policy_event:通知策略与事件绑定(已实现)。
  • notification_task:通知执行任务(已实现,支持任务化发送与重试)。
  • export_task:导出任务中心(已实现,支持任务化导出与状态跟踪)。
  • operation_audit_log:系统操作审计日志。

6.8 关键索引建议

  • 所有核心业务表组合索引:(tenant_id, status, updated_at)
  • 审核任务索引:(tenant_id, assignee_user_id, node_status)
  • 财务支付索引:(tenant_id, project_id, payment_status, payment_time)
  • 下载日志索引:(tenant_id, template_id, downloader_id, created_at)

6.9 字段级DDL规范MySQL 5.7

  • 通用字段(所有业务主表)
    • id bigint unsigned:主键。
    • tenant_id bigint unsigned:租户隔离键,必填并建索引。
    • status varchar(32):状态字段,必填并建索引。
    • is_deleted tinyint(1):软删除标记,默认 0
    • created_by bigint unsignedcreated_at datetime
    • updated_by bigint unsignedupdated_at datetime
  • 用户生命周期扩展字段(sys_user
    • valid_from datetime:账号生效时间。
    • valid_to datetime:账号失效时间。
    • 登录/鉴权/关键写操作均需校验有效期窗口。
  • 金额与比例字段
    • 金额统一 bigint(单位:分),禁止使用 float/double
    • 比例统一 decimal(8,6)(如 0.150000 表示 15%)。
  • 文本与枚举
    • 短文本优先 varchar,长文本使用 text
    • 枚举字段使用 varchar + 字典约束,避免 MySQL enum 变更成本。
  • 索引规范
    • 组合索引按“等值过滤字段在前、范围字段在后”。
    • 高频查询字段必须包含 tenant_id,避免跨租户扫描。
  • 约束规范
    • 关键业务唯一键建议:tenant_id + business_no 唯一索引。
    • 外键约束按性能评估可选,必须在应用层做强校验。

6.10 字段级数据字典补充(按业务优先级)

  • 目标
    • 将“完整版业务文档”的关键字段沉淀为研发可直接落库、联调、测试的统一口径。
    • 本节与 6.1~6.9 配套使用;未列出的字段可在模块详细设计中扩展。
  • project(项目主表)建议补充字段
    • 组织关系:host_enterprise_idpartner_enterprise_id
    • 人员关系:host_owner_user_idhost_executor_user_idpartner_owner_user_idpartner_executor_user_id
    • 预算控制:allow_meeting_over_budgetover_budget_threshold_ratioover_budget_approval_chain_json
    • 过程指标:meeting_total_countmeeting_completed_countbudget_execution_ratiorisk_flags_json
  • meeting(会议主表)建议补充字段
    • 基础维度:subjectsub_project_namemeeting_categorymeeting_formlocationstart_timeend_time
    • 预算维度:budget_amount_centlabor_ratiocatering_ratio
    • 流程维度:current_audit_nodelast_submit_atlast_reject_reason
    • 风险维度:overdue_daysrisk_flags_jsonis_frozenfreeze_reason
  • meeting_material(会议资料主表)建议补充字段
    • 模块标识:material_moduleBASIC/MATERIAL/PHOTO/LABOR/INVOICE/EXPERT_PROFILE
    • 版本链:material_versionis_latest_versionsource_version_id
    • 状态字段:fill_statusaudit_node_statusaudit_aggregate_status
    • 追溯字段:submit_remarkreject_countlast_reject_reasonresubmit_at
  • meeting_material_invoice_item(建议新增:发票明细项)
    • 明细口径:expense_typeinvoice_noinvoice_amount_centtax_amount_centdetail_amount_centvendor_nameoccur_dateremark
    • 索引建议:(tenant_id, meeting_id, expense_type, occur_date)
  • meeting_material_invoice_file(建议新增:发票明细附件)
    • 附件口径:file_typeINVOICE/DETAIL/PHOTO/TICKET/OTHERfile_nameoss_keycontent_typesize
    • 关联字段:invoice_item_idmeeting_idmaterial_version
  • meeting_invoice_summary(建议新增:发票模块汇总)
    • 汇总口径:category_amount_cent_jsonmeeting_total_amount_centis_over_budget
  • audit_task(审核任务)建议补充字段
    • SLA字段sla_deadline_atovertime_hoursis_overtime
    • 流转字段:transfer_from_user_idtransfer_reasonreturn_reason
    • 统计字段:reject_countlast_reject_reasonlast_action_at
  • audit_action_log(审核动作日志)建议补充字段
    • 动作细化:action_typeAPPROVE/REJECT/RETURN/TRANSFER/REMIND
    • 上下文字段:from_statusto_statusopinionattachment_json
    • 终端字段:operator_ipoperator_terminalrequest_id
  • expert(专家主表)建议补充字段
    • 基础字段:genderbirthdayid_card_noid_card_valid_untilphonetitlehospital
    • 状态治理:status_reasonstatus_changed_bystatus_changed_at
    • 合规模块:sensitive_mask_levelexport_restricted
  • expert_bank_card(专家银行卡)建议补充字段
    • 卡片字段:bank_namebank_account_nobank_provincebank_citybank_branch_name
    • 治理字段:is_defaultcard_statusinconsistent_name_approvedchange_reason
  • template / template_version 建议补充字段
    • 模板范围:template_typescope_typescope_ideffective_fromeffective_to
    • 版本治理:version_nois_effectivechange_logrollback_reason
    • 安全治理:watermark_enableddownload_rate_limit_per_hour
  • finance_meeting_bill(会议账单)建议补充字段
    • 分类费用:venue_amount_centbuild_amount_centhotel_amount_centcatering_amount_centlocal_traffic_amount_centlong_distance_traffic_amount_centmaterial_amount_centdesign_amount_centlabor_payable_amount_centlabor_actual_amount_cent
    • 财务录入:finance_review_fee_centmanagement_fee_centtax_fee_centcustom_fee_json
    • 对账结算:paid_amount_centunpaid_amount_centreconciliation_resultreconciliation_diff_amount_centreconciliation_diff_reasonsettlement_no
  • 与现有实现对齐建议
    • 6.10 字段优先用于新增列与新表设计,不破坏现有 API 契约。
    • 存量接口先兼容返回,新增字段按“可选字段 -> 必填字段”两阶段升级。

7. 接口设计规范与清单

7.1 API规范

  • 协议:HTTPS + RESTful + JSON
  • 鉴权:JWT + Refresh Token
  • 幂等:创建支付、审核动作、导出任务使用幂等键。
  • 错误码:统一业务错误码(权限不足、状态不允许、重复提交、超预算等)。

7.2 核心接口分组(示例)

  • 鉴权与用户
    • POST /api/auth/login
    • POST /api/users
    • PATCH /api/users/{id}/status
  • 平台设置(租户/企业/菜单)
    • GET /api/tenants
    • POST /api/tenants
    • POST /api/tenants/{id}/enable
    • POST /api/tenants/{id}/disable
    • GET /api/enterprises
    • POST /api/enterprises
    • PUT /api/enterprises/{id}
    • GET /api/menus
    • POST /api/menus
    • POST /api/roles/{id}/menus
  • 用户生命周期增强
    • POST /api/users/{id}/delegations
    • GET /api/users/{id}/delegations
    • POST /api/delegations/{id}/disable
  • 项目
    • GET /api/projects
    • POST /api/projects
    • PATCH /api/projects/{id}
    • POST /api/projects/{id}/freeze
  • 会议
    • GET /api/meetings
    • POST /api/meetings
    • POST /api/meetings/{id}/submit
    • POST /api/meetings/{id}/withdraw
  • 审核
    • GET /api/audits/tasks
    • POST /api/audits/tasks/{id}/approve
    • POST /api/audits/tasks/{id}/reject
    • POST /api/audits/tasks/{id}/return
    • POST /api/audits/tasks/{id}/transfer
  • 专家
    • GET /api/experts
    • POST /api/experts
    • POST /api/experts/{id}/merge
  • 模板
    • GET /api/templates
    • POST /api/templates
    • POST /api/templates/{id}/publish
    • POST /api/templates/{id}/rollback
    • GET /api/templates/{id}/download
  • 财务
    • GET /api/finance/projects
    • POST /api/finance/payments
    • POST /api/finance/reconciliation
    • POST /api/finance/lock
    • POST /api/finance/unlock

7.2.2 接口实施状态对照2026-03

  • 已实现(核心)
    • 租户、用户、角色、数据权限、审核流、项目、会议提交、会议资料六模块、审核动作(通过/拒绝/退回/转审/催办/SLA
    • 财务支付确认、对账、锁账/解锁;模板上传发布回滚归档水印下载与流程联动;专家主档案与合并/导入导出/银行卡;通知策略中心;可观测性告警中心。
    • POST /api/meetings/{id}/withdraw(会议撤回提交);发票管理模块(发票抬头主数据 API 与页面)。
    • POST /api/notifications/dispatch + POST /api/notifications/receipts + GET /api/notifications/tasks(通知执行引擎)。
    • GET/POST /api/export-tasks + POST /api/export-tasks/{id}/refresh-token + GET /api/export-tasks/{id}/download(导出任务中心,下载鉴权与过期控制)。
    • POST /api/observability/alert-rules/evaluate/auto(自动评估)+ GET /api/operations/dashboard(运营看板汇总)。
    • 代理授权生命周期:GET /api/users/{id}/delegationsPOST /api/users/{id}/delegationsPOST /api/delegations/{id}/disable,含有效期自动状态流转与代理权限继承判定。
  • 未实现(文档已定义)
    • 租户管理前端入口与平台菜单治理(菜单管理模块化能力)。
    • 企业管理模块化落地(企业主数据独立维护与项目引用联动)。
    • 账号有效期统一校验(登录/刷新令牌/关键写操作一致校验)。
    • 通知外部通道深度对接(真实短信/邮件供应商回执、失败原因标准化)。

7.2.1 接口权限映射规范(必须)

  • 每个接口必须绑定以下元数据
    • permissionCode:动作权限码(如 meeting.submit)。
    • dataScopeType:租户/项目/会议/模块范围校验类型。
    • auditActionCode:审计动作码(如 AUDIT_MEETING_SUBMIT)。
  • 权限校验顺序
    • 登录鉴权 -> 角色动作权限 -> 数据范围权限 -> 职责互斥规则 -> 状态机校验。
  • 前端按钮权限规则
    • permissionCode 控制可见/可点击;
    • 置灰时需展示无权限原因。

7.3 前后端统一开发规范(必须)

  • 接口契约统一
    • 所有接口采用 REST + JSON + UTF-8,路径前缀统一为 /api
    • 成功响应统一结构:{ code, message, data, requestId, timestamp },其中 code=0 表示成功。
    • 失败响应统一结构:{ code, message, errors, requestId, timestamp }errors 用于字段级错误。
  • 数据格式统一
    • 时间统一使用 ISO 8601(后端返回 UTC前端按时区展示
    • 金额统一使用“分”为最小单位(long),前端仅展示时转元并格式化。
    • 比例统一用百分比小数(如 0.15),前端展示为 15%
    • 枚举统一返回 code + label,禁止前端硬编码状态文案。
  • 分页与排序统一
    • 请求参数统一:pageNopageSizesortBysortOrder
    • 分页响应统一:{ list, total, pageNo, pageSize }
    • 大列表必须后端分页,禁止前端全量拉取再分页。
  • 权限与安全统一
    • 前端负责“可见性控制”,后端负责“最终权限校验”,两端都必须校验。
    • 所有写操作接口要求鉴权 + 操作审计埋点。
    • 高风险动作(删除、回滚、支付确认、锁账)要求二次确认与幂等键。
  • 命名与字段统一
    • 接口字段统一使用 camelCase
    • 数据库字段统一使用 snake_case
    • 布尔字段统一前缀:is/has;状态字段统一使用 status
    • 主键统一 id雪花或UUID业务单号使用独立字段orderNosettlementNo)。
  • 前后端协作流程统一
    • 先定义并评审接口文档(建议 OpenAPI后并行开发。
    • Mock 数据由后端提供 schema前端不得长期依赖手写假字段。
    • 联调前冻结字段名、枚举值、错误码,变更必须走变更单。
  • 日志与排障统一
    • 每个请求生成并透传 requestId,前后端日志可串联检索。
    • 关键链路(会议提交、审核动作、支付确认)必须输出结构化业务日志。
    • 前端错误上报包含路由、用户、请求接口、requestId、堆栈摘要。
  • 质量门禁统一
    • 后端:单元测试覆盖状态机、金额计算、权限校验。
    • 前端:核心页面需有组件测试与关键流程 E2E。
    • CI 门禁:代码扫描、测试通过、接口兼容性检查通过后方可合并。

7.4 统一错误码清单(必须)

  • 落地位置(当前实现)
    • 统一错误码由后端 Java 常量类维护:backend/src/main/java/com/writeoff/common/exception/ErrorCodes.java
    • 业务异常通过 BusinessException 抛出,并引用 ErrorCodes 常量,避免散落硬编码数字。
    • 数据库当前不维护错误码字典表(如需运营化配置可在后续版本新增)。
  • 通用规则
    • 错误码为整数,0 表示成功。
    • 错误码分段:1xxxx 通用与认证,2xxxx 权限与租户,3xxxx 业务状态机,4xxxx 财务与支付,5xxxx 文件与模板,9xxxx 系统异常。
    • message 面向用户,errors 面向前端字段级提示,requestId 用于排障追踪。
  • 10001 参数校验失败:必填项缺失或格式错误。
  • 10002 请求幂等冲突:重复提交被拦截。
  • 10003 资源不存在:目标对象不存在或已删除。
  • 10004 方法不允许:不支持的请求方法或路径。
  • 10005 请求过于频繁:触发限流策略。
  • 11001 未登录或Token无效需要重新登录。
  • 11002 Token已过期需要刷新或重新登录。
  • 11003 会话失效:账号被禁用或异地下线。
  • 20001 无操作权限:角色不具备动作权限。
  • 20002 无数据权限:越权访问租户/项目/会议数据。
  • 20003 租户状态异常:租户已停用或冻结。
  • 20004 职责互斥冲突:提交人与审核人冲突,或初审终审冲突。
  • 30001 状态不允许流转:当前状态不支持该动作。
  • 30002 审核节点不匹配:非当前节点审核人发起审核动作。
  • 30003 审核任务已处理:重复审核或并发处理冲突。
  • 30004 会议级提交条件不足:必填模块未完成。
  • 30005 终审后变更限制:关键字段变更需回退待审核。
  • 30006 项目变更校验失败:期数/周期/预算不满足约束。
  • 40001 超预算拦截:金额超过项目预算且未审批放行。
  • 40002 占比超阈值:餐费或劳务费超过阈值限制。
  • 40003 支付状态不允许:当前支付状态不能执行该动作。
  • 40004 缺少支付凭证:支付确认必填凭证未上传。
  • 40005 对账差异未处理:存在差异工单,不允许结清。
  • 40006 重复支付风险:同会议同金额同凭证号重复。
  • 50001 文件类型不支持:不在白名单范围内。
  • 50002 文件大小超限:超过模块上传限制。
  • 50003 文件安全校验失败:病毒扫描或格式校验失败。
  • 50004 模板状态不允许:草稿/停用/归档状态不支持该操作。
  • 50005 模板版本冲突:版本已变更,需要刷新重试。
  • 50006 文件下载越权:无项目或会议下载权限。
  • 90001 系统内部异常:未分类错误。
  • 90002 数据库异常:数据库连接或事务执行失败。
  • 90003 外部服务异常OSS或邮件服务调用失败。
  • 90004 异步任务执行失败:任务重试后仍失败。
  • 前端处理约定
    • 10001 返回字段级错误时,表单逐项高亮并定位首个错误项。
    • 11001/11002/11003 统一跳转登录页并提示登录状态失效。
    • 200xx/300xx/400xx/500xx 弹业务提示,不显示系统堆栈。
    • 900xx 展示统一兜底文案并提示 requestId 给运维排障。

7.5 HTTP状态码映射规范

  • 200:成功(code=0)。
  • 400:请求参数错误(通常对应 10001)。
  • 401:未认证/登录失效(11001/11002/11003)。
  • 403:权限不足或数据越权(20001/20002)。
  • 404:资源不存在(10003)。
  • 409:状态冲突或并发冲突(30001/30003/50005)。
  • 422:业务校验失败(30004/30006/40001/40002)。
  • 429:请求过于频繁(10005)。
  • 500:系统内部异常(90001+)。
  • 约束:前端以业务 code 为主处理逻辑HTTP状态码作为网络层辅助判断。

7.6 核心接口请求响应示例(节选)

  • 会议级提交
    • 请求:POST /api/meetings/{id}/submit
    • Body:
{
  "idempotencyKey": "submit-20260309-0001",
  "operatorId": 10001,
  "remark": "资料提交审核"
}
  • 响应:
{
  "code": 0,
  "message": "success",
  "data": {
    "meetingId": 20001,
    "auditStatus": "PENDING",
    "currentNode": "INIT_REVIEW"
  },
  "requestId": "9f0f8c2f7e9e4d24",
  "timestamp": "2026-03-09T10:20:30Z"
}
  • 审核通过
    • 请求:POST /api/audits/tasks/{id}/approve
    • Body:
{
  "idempotencyKey": "audit-approve-20260309-0101",
  "opinion": "资料完整,审核通过"
}
  • 响应:
{
  "code": 0,
  "message": "success",
  "data": {
    "taskId": 30001,
    "nodeStatus": "APPROVED",
    "meetingAuditStatus": "IN_REVIEW"
  },
  "requestId": "c4316bb50aa74c45",
  "timestamp": "2026-03-09T10:30:20Z"
}
  • 支付确认
    • 请求:POST /api/finance/payments
    • Body:
{
  "idempotencyKey": "pay-confirm-20260309-0008",
  "projectId": 5001,
  "meetingId": 20001,
  "amountCent": 1280000,
  "paymentVoucherOssKey": "1001/5001/20001/finance/202603/voucher-01.pdf"
}
  • 响应:
{
  "code": 0,
  "message": "success",
  "data": {
    "paymentId": 90001,
    "paymentStatus": "CONFIRMED"
  },
  "requestId": "8f7cd9b0b8f84b5b",
  "timestamp": "2026-03-09T10:40:02Z"
}

7.7 业务能力到接口映射补全(缺口收敛)

  • 系统设置-角色管理
    • GET /api/roles(角色列表)
    • POST /api/roles(创建角色)
    • PUT /api/roles/{id}(编辑角色)
    • POST /api/roles/{id}/enablePOST /api/roles/{id}/disable(启停)
    • POST /api/roles/{id}/permissions(动作权限绑定)
  • 系统设置-数据权限管理
    • GET /api/data-scope-policies
    • POST /api/data-scope-policies
    • PUT /api/data-scope-policies/{id}
    • POST /api/data-scope-policies/{id}/copy
    • POST /api/data-scope-policies/{id}/assign-roles
    • POST /api/data-scope-policies/{id}/enablePOST /api/data-scope-policies/{id}/disable
  • 系统设置-审计日志
    • GET /api/audit-logs(按账号/模块/动作/时间范围查询)
    • GET /api/audit-logs/export-tasksPOST /api/audit-logs/export-tasks(异步导出)
  • 会议资料与总结包
    • POST /api/meetings/{id}/materials/{module}/submit(模块提交)
    • POST /api/meetings/{id}/materials/{module}/resubmit(驳回后重提)
    • POST /api/meetings/{id}/materials/export(导出会议资料包,任务化)
    • POST /api/meetings/{id}/summary/generate(生成会议总结)
    • GET /api/meetings/{id}/summary/download(下载会议总结)
  • 审核运营动作
    • POST /api/audits/tasks/{id}/remind(单任务催办)
    • POST /api/audits/tasks/batch-remind(批量催办)
    • POST /api/audits/tasks/export-opinions(导出审核意见)
  • 通知策略中心(配置侧)
    • GET /api/notification-policies
    • POST /api/notification-policies
    • PUT /api/notification-policies/{id}
    • POST /api/notification-policies/{id}/events
    • POST /api/notification-policies/{id}/enablePOST /api/notification-policies/{id}/disable
  • 发票管理(抬头主数据)
    • GET /api/invoice-heads
    • POST /api/invoice-heads
    • PUT /api/invoice-heads/{id}
    • POST /api/invoice-heads/{id}/enablePOST /api/invoice-heads/{id}/disable

7.8 接口与权限矩阵总表(模块 -> 接口 -> 权限)

  • 约束
    • 每个接口在 OpenAPI 中必须绑定:permissionCodedataScopeTypeauditActionCode
    • 前端按钮权限与接口权限码同源维护,禁止“按钮权限码”和“接口权限码”双套定义。
  • 实施状态2026-03后端已落地
    • 已在后端注解层统一为:@RequirePermission(value=..., dataScope=..., auditAction=...)
    • 已新增启动期门禁组件:PermissionMetadataGuard(配置项:writeoff.permission-metadata.strict)。
    • 审计日志动作码已切换为优先读取 auditActionCode(未配置时回退 permissionCode)。
  • 基线矩阵(节选,可直接用于前后端同源配置)
    • 系统设置-角色管理
      • GET /api/roles -> permissionCode=role.readdataScopeType=TENANTauditActionCode=ROLE_LIST
      • POST /api/roles/{id}/permissions -> permissionCode=role.permission.binddataScopeType=TENANTauditActionCode=ROLE_BIND_PERMISSIONS
    • 系统设置-数据权限
      • POST /api/data-scope-policies/{id}/assign-roles -> permissionCode=data.permission.managedataScopeType=TENANTauditActionCode=DATA_PERMISSION_ASSIGN_ROLES
      • POST /api/data-scope-policies/{id}/enable -> permissionCode=data.permission.managedataScopeType=TENANTauditActionCode=DATA_PERMISSION_ENABLE
    • 系统设置-通知策略
      • POST /api/notification-policies/{id}/events -> permissionCode=notification.policy.managedataScopeType=TENANTauditActionCode=NOTIFICATION_POLICY_BIND_EVENTS
      • POST /api/notification-policies/{id}/disable -> permissionCode=notification.policy.managedataScopeType=TENANTauditActionCode=NOTIFICATION_POLICY_DISABLE
    • 会议资料与总结
      • POST /api/meetings/{id}/materials/export -> permissionCode=meeting.material.exportdataScopeType=MEETINGauditActionCode=MEETING_MATERIAL_EXPORT
      • GET /api/meetings/{id}/summary/download -> permissionCode=meeting.material.exportdataScopeType=MEETINGauditActionCode=MEETING_SUMMARY_DOWNLOAD
    • 审核与流程
      • POST /api/audits/tasks/{id}/approve -> permissionCode=audit.approvedataScopeType=MEETINGauditActionCode=AUDIT_APPROVE
      • POST /api/audit-flows/{id}/default -> permissionCode=audit.flow.managedataScopeType=TENANTauditActionCode=AUDIT_FLOW_SET_DEFAULT
    • 财务与导出
      • POST /api/finance/payments -> permissionCode=finance.payment.confirmdataScopeType=PROJECTauditActionCode=FINANCE_PAYMENT_CONFIRM
      • POST /api/finance/meeting-bills -> permissionCode=finance.reconciliationdataScopeType=PROJECTauditActionCode=FINANCE_MEETING_BILL_UPSERT
      • GET /api/audit-logs -> permissionCode=audit.log.readdataScopeType=GLOBAL_READONLYauditActionCode=AUDIT_LOG_LIST
  • 数据范围类型建议枚举
    • TENANTPROJECTMEETINGMEETING_MODULEGLOBAL_READONLY
  • 测试与门禁
    • 后端单测必须覆盖:权限码缺失拒绝发布、数据范围校验拒绝越权、审计动作码入库完整。
    • 前端联调必须覆盖:无权限置灰提示、越权请求统一错误码回传、批量接口的部分失败处理。

8. 文件存储与媒体处理

8.1 文件上传

  • 先传对象存储,后写业务记录。
  • 支持分片上传与断点续传(大视频场景)。

8.2 文件校验

  • 类型白名单、大小限制、病毒扫描、哈希去重。
  • 文件命名规范校验,不合规可自动重命名。

8.3 文件访问控制

  • 私有桶 + 预签名URL短时访问。
  • 下载权限与项目/会议数据权限联动。

8.4 阿里云OSS目录与生命周期策略

  • 路径规范
    • /{tenantId}/{projectId}/{meetingId}/{module}/{yyyyMM}/{fileName}
    • 模块建议:basicmaterialphotolaborinvoicetemplate
  • 上传策略
    • 大文件分片上传,完成后回调写入业务表。
    • 文件名落库前进行规范化,保存原始名与存储名。
  • 生命周期
    • 热数据近12个月标准存储。
    • 冷归档:超期转低频或归档存储(按合规策略)。
    • 删除策略:业务删除先软删,物理删由定时任务延迟执行。
  • 安全策略
    • Bucket 私有读,禁公网列举。
    • 预签名URL有效期建议 5-15 分钟。
    • 开启防盗链、跨域白名单和操作日志。

9. 安全与合规

9.1 数据安全

  • 敏感字段(身份证号、银行卡号)加密存储。
  • 前端脱敏展示,按角色控制明文可见性。
  • 导出敏感数据需二次确认并留痕。

9.2 审计安全

  • 高风险操作全量留痕:重置密码、角色变更、审核结论修改、支付确认、导出全量数据。
  • 审计日志不可篡改WORM策略或审计库隔离

9.3 访问安全

  • 登录失败策略、验证码、人机校验、IP风控。
  • 接口限流与防重放。

10. 异步任务与通知

10.0 实现方式(当前版本)

  • 不引入消息队列。
  • 使用 Spring @Scheduled 轮询任务表执行异步任务。
  • 任务表建议:async_job(任务定义)与 async_job_log(执行日志)。

10.1 任务类型

  • 超时催办任务。
  • 审核状态变更通知任务。
  • 模板过期停用任务。
  • 导出报表任务。

10.2 通知渠道

  • 站内信、邮件、微信(可扩展)。
  • 通知模板变量统一由模板管理维护。
  • 当前实现状态:已完成“通知策略配置中心 + 发送执行引擎”通道适配、重试、回执入库真实供应商SDK对接待补齐。

10.3 失败重试

  • 指数退避重试最多3次
  • 超过重试次数标记失败并告警,支持人工重试。

10.4 Scheduler分布式执行规范无消息队列场景

  • 任务表字段建议
    • job_idjob_typepayloadstatusnext_run_atretry_countmax_retrylocked_bylocked_at
  • 抢占与互斥
    • 使用 Redis 分布式锁 或 DB 乐观锁抢占任务,确保同一任务仅单实例执行。
    • 抢占条件:status=READY and next_run_at<=now
  • 超时回收
    • 执行超时任务由回收任务重置为 READY 或标记 FAILED
    • locked_at 超过阈值(如 10 分钟)触发回收。
  • 幂等保障
    • 任务执行前后校验幂等键,避免重复通知、重复导出、重复状态推进。
  • 批处理控制
    • 单次拉取任务上限(如 100 条),避免长事务和任务饥饿。
  • 默认参数(建议)
    • 轮询周期:3000ms
    • 单批拉取:100
    • 单任务超时:120s
    • 最大重试:3
    • 重试间隔:30s120s300s
    • 锁超时回收阈值:600s

11. 非功能性要求

11.1 性能指标(建议)

  • 页面列表接口P95 < 500ms。
  • 审核动作接口P95 < 300ms。
  • 文件上传成功率:> 99.9%。

11.2 可用性

  • 服务可用性目标99.9%。
  • 数据库主从 + 自动备份 + 灾备演练。
  • MySQL 5.7 运行基线
    • 字符集:utf8mb4;排序规则:utf8mb4_general_ci(或按业务统一)。
    • 时区:数据库与应用统一 Asia/Shanghai
    • sql_mode 固化到环境配置并在各环境保持一致。
    • 慢查询阈值、连接池、最大连接数需有统一基线值。

11.3 可观测性

  • 指标QPS、错误率、慢查询、任务堆积、任务失败率。
  • 日志:结构化日志 + TraceId 全链路追踪。
  • 告警:支付失败、审核超时、导出失败、存储异常。

11.4 SLO与告警阈值建议

  • SLO目标
    • 核心API可用性>=99.9%(月)。
    • 审核动作成功率:>=99.95%
    • 支付确认成功率:>=99.95%
  • 告警阈值
    • API 5xx 错误率连续5分钟 > 1% 触发P1告警。
    • 审核超时任务占比 > 3% 触发P2告警。
    • 异步任务堆积 > 1000 条或失败率 > 5% 触发P1告警。
    • 导出任务平均耗时 > 60s 连续10分钟触发P2告警。
  • 恢复阈值
    • 连续10分钟恢复到阈值以下自动关闭告警。
  • 当前实现状态
    • 已实现规则评估、触发、抑制窗口、事件恢复标记。
    • 已实现定时自动评估与连续恢复窗口判定(默认恢复窗口 10 分钟,可配置)。

12. 测试策略

12.1 测试层级

  • 单元测试:状态机、金额计算、权限校验。
  • 集成测试:审核流、支付流、通知流。
  • E2E项目->会议->审核->财务完整闭环。

12.2 重点用例

  • 提交人与审核人互斥校验。
  • 终审通过后关键字段变更回退。
  • 超预算拦截与审批放行。
  • 重复支付拦截。
  • 模板版本回滚与下载权限校验。

13. 研发排期建议(可直接排期)

13.1 P0核心上线

  • 多租户、RBAC、数据范围。
  • 项目/会议/审核/财务四大主流程闭环。
  • 审计日志与敏感字段合规。
  • 文件上传下载与权限联动。

13.2 P1高优先级增强

  • 模板版本治理、下载留痕。
  • 专家去重合并、多卡治理、快照机制。
  • SLA超时升级、批量催办、风险预警。
  • 对账工单与锁账流程。

13.3 P2效率优化

  • 报表中心与运营看板。
  • 高级搜索与统计分析。
  • 自动化策略(模板推荐、智能校验)。

13.4 发布与回滚策略(建议)

  • 发布策略
    • 默认小步快跑,按模块灰度(先内部租户后全量)。
    • 生产发布窗口避开财务结算高峰时段。
  • 数据库变更
    • DDL 采用向后兼容策略(先加字段再切流,再清理旧字段)。
    • 所有迁移脚本必须可回滚并在预发演练通过。
  • 回滚策略
    • 应用回滚保留最近2个稳定版本异常5分钟内回退。
    • 数据回滚:通过备份+增量日志恢复,禁止直接手改线上数据。
  • 灰度与自动回滚阈值
    • 灰度阶段 5xx 错误率连续5分钟 > 1% 自动触发回滚。
    • 核心接口P95延迟连续10分钟劣化 > 30% 触发人工确认回滚。
    • 关键业务失败率(审核通过/支付确认连续10分钟 > 2% 触发P1告警与回滚评估。
  • 灾备目标
    • 建议 RPO <= 15分钟RTO <= 60分钟

14. 待确认项(立项前必须冻结)

  • 部署方式(单体优先或微服务拆分)与服务拆分边界。
  • 合规要求细则(数据留存期限、加密算法、审计保留周期)。
  • 发票管理主数据口径(税号规则、唯一键、项目默认抬头覆盖规则)。
  • 通知执行通道范围(是否纳入企业微信/短信)与失败回执标准。
  • 导出任务中心口径(同步/异步分界、任务时限、下载安全策略)。