## 任务目标
请检查 Java 审批状态分支,并设计业务测试。
以核查和评审为主,给出有证据的判断及可复核的修改建议;本次用户另有明确实现要求时,按其授权范围执行。
## 输入信息(选填)
两项均可留空,也可直接用一句话说明目标并附上已有资料。无需自行整理版本、配置或完整需求表;能读取的内容由执行者补齐。
审批流程:
工程与审批规则:
## 信息不完整时
先使用本次对话中已经说明的信息;用户留空、写“暂无/不清楚”或未替换输入标记,都按缺失处理,不当作真实路径、参数或业务值。已能从资料确定的内容不重复询问,不编造文件、日志、接口、业务值或执行结果。在用户已授权的范围内读取相关工程和材料,不为补齐输入擅自扩大操作范围。
### 优先确认
- 将入口操作、角色、对象归属和状态枚举对应到具体分支。
- 检查 switch 默认分支、复合条件顺序、未知和历史状态的处理。
- 追踪数据库条件更新、版本字段、唯一约束和外部动作,识别重复与并发覆盖。
- 对照现有测试和业务说明,分别记录代码现状与已确认规则。
### 可采用的默认处理
- 默认只读检查和测试设计,给保持行为的最小整理建议,不自动新增审批步骤。
- 规则缺失时描述当前代码行为并标记待确认,不把现有分支直接当成已批准的业务规则。
- 未知状态不默认放行,权限、短路顺序和副作用按现有可信契约保留。
### 必须有依据的事项
- 合法状态迁移、批准角色或对象归属规则没有可信依据时,不编造最终状态与越权测试的业务预期。
- 重复审批、撤回或并发竞争应由哪个操作生效不明确时,不擅自决定状态覆盖策略。
只有缺口会改变业务结果、权限边界或关键实现,且无法从现有资料确认时,才集中提出最多 3 个关键问题;说明影响,并继续完成不依赖答案的部分。一般命名、排版和可逆实现细节按现有约定决定,不逐项等待确认。
### 资料仍不足时的交付
- 有代码无规则时交付实际分支覆盖图、冲突与遗漏证据,以及业务预期待确认的测试表。
- 无工程时给状态迁移表、条件组合与重复并发测试模板,示例角色和状态仅用于说明方法。
## 执行要求
适用范围:Java实现的有限业务状态与条件分支;状态迁移、权限和幂等策略以业务规则为准,不能按通用审批流程擅自补业务。
保持条件表达式易于理解,明确 switch 中未匹配情况的处理方式和各分支结束条件。
检查步骤:
1. 从业务资料整理状态迁移表,逐项记录起始状态、操作、角色、前置条件和终止状态;资料与代码冲突时列明两种行为并指出需要确认的事实。
2. 将每条合法迁移对应到实际代码路径,检查条件顺序是否遮蔽后续规则,以及缺少字段、未知枚举和历史状态会进入哪一条路径。
3. 为复合判断建立条件组合,找出权限、状态和数据归属之间的联动;不为追求代码简短而改变短路顺序或触发原先不会发生的副作用。
4. 检查重复提交和并发操作是否可能把状态覆盖回旧值,明确数据库约束或更新条件如何保障业务结果;未提供持久化代码时不得认定并发安全。
5. 给出保持行为的分支整理与需要业务决定的行为修正,分别列出改动;替换复杂判断时使用业务含义清楚的命名,不为了形式增加无用抽象。
6. 根据迁移表生成正常、拒绝、越权、重复、并发和异常测试,测试应观察数据库状态、外部动作次数与响应;说明哪些属于单元验证、哪些需真实集成环境。
## 交付与验收
输出要求:依次提供状态迁移表、遗漏和冲突清单、最小代码修改、测试矩阵。每个测试使用“初始状态|角色与归属|操作及并发条件|预期最终状态|可观察证据”。 只报告有证据支持的问题;区分“已验证”“推测”和“待验证”,涉及变更时给出受影响文件或对象、最小修改和复核方法。代码与操作示例使用占位符,不写入真实密码。
### 本条完成检查
- 每条迁移列出起始状态、操作、角色、前提和目标状态,并关联代码证据。
- 区分保持行为的整理与需要业务决定的修正。
- 测试观察数据库最终状态、响应及副作用次数,持久化代码缺失时不声称并发安全。
按本条要求组织结果,使用简洁中文和一致的编号、术语、缩进及空行;已有项目格式优先。只说明实际完成的内容,将采用的假设、未完成项和缺少的条件写在相关位置,不额外生成无关文档。未执行、无法复现或缺少证据的检查如实标注,不宣称已通过或已有性能收益。
## 参考资料与适用边界
来源(核验日期:2026-09-08):
[阿里巴巴《P3C-PMD 官方公开规则》](https://github.com/alibaba/p3c/blob/master/p3c-pmd/README.md)
整理范围:仅依据上述公开文档的相关建议,业务场景、变量、检查流程与验收格式均为独立改写,不代表相关企业完整内部规范。