场景说明
合并待办详情查询(FlowDetailService.detail)对未读记录执行 flowRecord.read() + saveRecord(flowRecord) 以持久化已读标记,该保存链路会再次进入 FlowRecordSaveService.saveTodoMargeRecords()。
发现的问题
saveTodoMargeRecords() 对每条可合并待办记录无条件执行 addMergeCount() 并新增一条 FlowTodoMerge 关系,不判断该记录是否已登记过。因此:
- 每次打开(首次未读)一条合并子记录的详情,就会重复登记一次合并关系并把合并计数 +1;
- 实测(两条合并记录):查询前 cnt=2、关系 2 条 → 查询后 cnt=3、关系 3 条(出现重复关系);
- 详情
getMergeRecord() 随之返回重复记录,前端会出现同一条记录重复展示,且合并数量被放大。
复现输出:
详情前: mergeRels=[(todoId=2,recordId=2),(todoId=2,recordId=4)] cnt=2
详情后: mergeRels=3 条(recordId 重复) cnt=3
detail.todos = [rec=2, rec=4, rec=2] // 重复一条
期望实现
合并登记需幂等:已存在 (todoId, recordId) 关系的记录不得重复登记/计数。保存待办时按 (todoId, recordId) 去重后再新增关系与计数。
验证场景
- 合并后打开任一子记录详情,断言合并计数与关系数量不发生改变;
- 多条不同发起人合并的正常场景计数仍准确。
场景说明
合并待办详情查询(FlowDetailService.detail)对未读记录执行
flowRecord.read()+saveRecord(flowRecord)以持久化已读标记,该保存链路会再次进入FlowRecordSaveService.saveTodoMargeRecords()。发现的问题
saveTodoMargeRecords()对每条可合并待办记录无条件执行addMergeCount()并新增一条FlowTodoMerge关系,不判断该记录是否已登记过。因此:getMergeRecord()随之返回重复记录,前端会出现同一条记录重复展示,且合并数量被放大。复现输出:
期望实现
合并登记需幂等:已存在 (todoId, recordId) 关系的记录不得重复登记/计数。保存待办时按 (todoId, recordId) 去重后再新增关系与计数。
验证场景