状态值合并、停用或重命名后,常见的不一致有两类:存量工作项的状态字段仍指向旧值,以及统计报表继续按旧口径聚合。处置时先判断问题出在哪一层,再按旧值到新值的映射修正存量数据、同步报表口径,并在备份和试跑通过后全量执行。
要点总览(TL;DR)
- 先区分两类不一致:存量工作项状态字段仍指向旧值,以及统计报表按旧口径聚合;两者处置对象不同,不宜混在一起修改。
- 原因排查按假设逐项验证:查状态字段取值分布、比对配置与工作项状态集合、重跑报表检查分组维度、检查工作流中的状态引用。
- 处置遵循先备份、再小范围试跑、验证通过后全量执行;停用状态保留历史记录并标记归档,避免直接删除取值。
- 统计口径同步后重跑报表,比对调整前后分组与合计,确认无空值、无旧值残留,数值差异能对应到映射关系。
- 把映射表、备份、试跑、报表同步和通知使用方固化为状态变更检查清单,定期核对配置状态集合与工作项实际取值集合。
先确认不一致出现在哪一层
状态配置调整后,症状往往同时出现,但来源不同。工作项层面的问题是:打开某条需求、任务或缺陷,状态字段显示的是已合并、已停用或已改名的旧值,或者该值在新状态下拉中已找不到对应项。统计层面的问题是:同一张状态分布报表在调整前后数值跳变,分组里出现空值、旧名称或已停用状态。两类问题可能同时存在,但处置对象一个是工作项记录,一个是报表的聚合与过滤条件,混在一起处理容易改错地方。
区分方法是从两个方向抽样核对。工作项方向,按调整前的状态分布抽取样本,覆盖每个旧状态至少若干条,逐条比对当前状态字段取值与新状态定义,记录哪些仍指向旧值、哪些已落到新值。统计方向,选取调整前后都存在的指标,例如某项目缺陷状态分布,分别查看调整前后的分组名称、分组数量和合计值,重点看是否出现空分组、旧名称分组,以及同一分组数值是否发生无法用业务变化解释的跳变。
可以用一张简单的症状分类表界定范围:
| 症状 | 观察位置 | 初步判断 |
|---|---|---|
| 工作项详情中状态显示旧名称或已停用值 | 工作项状态字段 | 存量映射问题 |
| 按状态筛选时结果数量与预期不符 | 筛选器、列表视图 | 存量映射问题,可能叠加筛选条件未更新 |
| 报表分组出现空值或旧状态名称 | 统计报表分组维度 | 统计口径问题 |
| 同一指标调整前后数值跳变且无业务事件对应 | 报表合计与趋势 | 统计口径问题,需核对过滤条件 |
本文的处置边界限定在存量工作项映射修正与统计口径同步。状态值本身的业务含义、状态机如何设计、旧配置整体搬迁到新平台,属于另外的问题,不在本次处置范围内。先把边界写清楚,后续修正才不会顺手改动不该动的配置。
原因假设与逐项排除证据
症状确认后,不要直接下结论。下面四类原因在实际环境中都可能单独或叠加出现,建议按顺序验证,每项都用可观察的数据作为证据,验证一项排除一项。
| 假设 | 验证方式 | 可观察证据 | 排除顺序 |
|---|---|---|---|
| 存量工作项未随状态配置调整而迁移 | 导出或查询状态字段的实际取值分布,与调整前分布对比 | 取值集合中仍存在旧值,且集中在调整前创建的工作项上 | 第一项 |
| 合并时只改了配置,未处理历史数据 | 比对配置中的状态集合与工作项表中的状态值集合 | 配置侧已无旧值,工作项侧仍有旧值,两侧集合不一致 | 第二项 |
| 统计报表使用固定状态枚举或缓存结果 | 重跑报表,检查分组维度与过滤条件配置 | 重跑后分组仍显示旧值,或分组配置中写死了旧状态 | 第三项 |
| 部分工作流仍引用旧状态 | 检查工作流定义中的状态引用与流转条件 | 工作流节点或条件中引用了已停用、已合并的状态值 | 第四项 |
第一项验证的关键是取值分布,而不是个别样本。如果旧值只出现在少量记录上,可能是调整期间产生的边界数据;如果旧值覆盖调整前的大部分记录,说明配置调整没有触及存量数据。第二项验证把配置侧和工作项侧的状态集合放在一起比对,两侧一致说明映射已完成,不一致则说明存在缺口,缺口部分就是需要修正的对象。
第三项验证要区分两种情况:报表重跑后分组恢复正常,说明只是缓存或上次运行结果未刷新;重跑后仍出现旧值,说明报表的分组或过滤条件中固定引用了旧状态,需要改配置而不是反复重跑。第四项验证容易被忽略,工作流中的状态引用不影响工作项字段显示,但会在流转时把工作项带入旧状态或导致流转失败,检查时应把工作流定义与状态配置一起看。
排除顺序建议从数据分布开始,因为它的证据最直接、成本最低;确认存量映射是否存在缺口后,再检查报表口径,最后检查工作流引用。每项验证都留下记录,写明验证时间、数据范围和结论,后续复核和复盘时可以直接使用。
按映射表处置存量工作项与统计口径
原因确认后进入处置。整个过程遵循一个原则:先备份、再试跑、验证通过后全量执行,任何一步不通过就停止并回退。
第一步,建立旧值到新值的映射表。逐项列出每个旧状态值的去向,并标注处理类型。合并的旧值写明目标值;停用的旧值写明归档去向和是否保留可查询;重命名的旧值写明新旧名称对应关系。映射表是后续修正和核对的基础,每一项都要有明确去向,不留“待定”。
| 旧状态值 | 处理类型 | 目标值或去向 | 备注 |
|---|---|---|---|
| 待评审 | 合并 | 评审中 | 调整前处于该状态的工作项统一并入 |
| 已关闭(旧) | 重命名 | 已关闭 | 仅名称变化,取值语义不变 |
| 挂起 | 停用 | 归档,保留历史记录 | 不再作为可选状态,历史数据可查 |
第二步,全量备份并确定回退点。备份范围包括工作项数据中的状态字段及相关属性、状态配置本身、报表的分组与过滤配置、涉及状态引用的工作流定义。备份完成后记录备份时间和回退方式,明确一旦试跑失败恢复到哪个状态。没有可用回退点之前,不执行任何批量修改。
第三步,小范围试跑。选取覆盖各旧状态的一小批工作项,按映射表执行修正,逐条核对修正后的状态值、变更记录是否完整、关联视图和筛选器是否正常。试跑样本要包含合并、停用、重命名三种类型,避免只验证一种情况就全量执行。试跑结果与映射表不一致时停止,查明原因后重新试跑。
第四步,处理停用状态。停用的状态值建议保留历史记录并标记为归档,让存量工作项仍可追溯调整前的状态,而不是直接删除取值。直接删除会让历史记录失去参照,也会让按旧状态统计的历史报表无法解释。归档后在新状态下拉中不再出现,但查询和审计时仍能还原当时的取值。
第五步,同步统计口径。按映射表调整报表的状态分组和过滤条件:合并的旧值并入目标分组,重命名的更新显示名称,停用的从常规分组中移出或单列为归档。调整后重跑报表,把调整前后的同一指标放在一起比对,确认分组无空值、无旧值残留,数值差异能对应到映射关系上。
在ONES Project中,需求状态与多种属性可以自定义,报表支持自定义数据范围和维度,缺陷状态分布也有对应统计。执行上述处置时,可以先用任务筛选器按状态条件定位仍指向旧值的工作项,缩小修正范围;报表侧调整分组和过滤后重跑,再与调整前结果比对。状态值调整与报表口径是否自动同步,需要以实际环境的验证结果为准,不能默认配置变更会带动历史数据和报表一起更新。
验证恢复与防止再次不一致
处置完成后,验证要回答两个问题:存量数据是否全部落到新状态集合内,统计结果是否与业务实际一致。
第一项验证看集合完整性。查询工作项状态字段的实际取值分布,确认所有取值都落在新状态集合内,不存在旧值、空值或未定义值。报表侧检查每个分组名称都属于新状态定义,分组合计与工作项总数能够对上。第二项验证看业务一致性,按状态分布抽取样本,人工核对工作项当前状态与其实际进展是否相符,重点检查合并和停用涉及的工作项,确认映射后的状态没有改变业务含义。
验证通过后,把这次处置中形成的约定固定下来,作为下次状态调整前的检查清单:
- 映射表已建立,每个旧值都有明确去向和处理类型;
- 工作项数据、状态配置、报表配置、工作流定义均已备份,回退点明确;
- 小范围试跑覆盖合并、停用、重命名三类情况并通过;
- 存量工作项修正完成,变更记录可查;
- 报表分组与过滤条件已同步,重跑结果与调整前完成比对;
- 报表使用方已收到状态调整通知,知晓口径变化。
复发预防落在日常核对上。定期比对配置中的状态集合与工作项实际状态值集合,两者出现差异时及时查明来源;状态值调整纳入变更流程,调整前完成映射表和备份,调整后执行上述验证。ONES 自动化规则提供运行日志,可辅助排查状态联动类规则是否按预期运行;涉及状态同步、父子工作项状态联动的规则,在状态调整后应一并检查,避免规则继续按旧状态触发。把状态配置变更、存量修正、报表核对和通知使用方放在同一条流程里,下一次调整时就不必再从零排查。
常见问题
状态值合并后,旧状态下的工作项是自动迁移还是需要手工修正?
这取决于平台对存量数据的处理方式,不能默认配置调整会带动历史工作项一起更新。稳妥的做法是先查状态字段的实际取值分布:如果旧值仍大量存在,说明存量数据未随配置迁移,需要按映射表批量修正;如果旧值只出现在少量记录上,可能是调整期间产生的边界数据,单独核对处理即可。修正前先备份并小范围试跑,确认映射结果符合预期后再全量执行。
停用的状态值直接删除和标记归档,对历史统计有什么影响?
直接删除停用状态值,会让存量工作项的历史状态失去参照,按旧状态统计的历史报表也无法解释当时的取值。标记归档则保留历史记录,存量工作项仍可追溯调整前的状态,查询和审计时能还原当时的取值,同时该状态不再出现在新状态下拉中。处置时建议选择归档,并在报表中把归档状态单列或从常规分组中移出,避免与在用状态混在一起统计。
报表重跑后分组仍显示旧状态名称,应该改报表还是改数据?
先判断旧值出现在哪一侧。如果工作项状态字段已经全部落到新状态集合内,报表分组仍显示旧名称,说明报表的分组或过滤条件中固定引用了旧状态,需要改报表配置;如果工作项侧仍有旧值,则先修正存量数据,再重跑报表。两种情况可能同时存在,建议先查工作项状态取值分布,确认数据侧干净后再调整报表口径,避免反复重跑却找不到原因。
状态调整后,工作流中的旧状态引用需要一并检查吗?
需要。工作流定义中的状态引用不影响工作项字段的显示,但会在流转时把工作项带入旧状态或导致流转失败,这类问题在报表和工作项列表上不一定直接暴露。检查时应把工作流定义与状态配置放在一起看,重点核对节点和流转条件中是否引用了已合并、已停用或已改名的状态值。涉及状态同步、父子工作项状态联动的自动化规则,在状态调整后也应一并检查,避免规则继续按旧状态触发。
如何防止下一次状态值调整再次出现映射和统计不一致?
把这次处置中形成的约定固定为状态变更前的检查清单:映射表已建立且每个旧值有明确去向、工作项数据与状态配置及报表配置均已备份、小范围试跑覆盖合并停用重命名三类情况并通过、报表分组与过滤条件已同步并完成前后比对、报表使用方已收到口径变化通知。日常再定期比对配置中的状态集合与工作项实际状态值集合,出现差异时及时查明来源,把状态调整纳入变更流程而不是临时操作。
