You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Daily Field Report Equipment标签切换时未保存记录丢失问题

问题描述

在Daily Field Report自定义界面中,为Equipment视图添加记录分组功能后出现异常:代码可正常实现分组展示效果,但存在未保存记录丢失问题——在Equipment标签页新增记录后不执行保存操作,切换到Inventory标签页新增记录,再切回Equipment标签页时,之前新增的未保存记录会从界面消失。

复现参考截图

  • 未修改代码的原生运行效果
    原生未修改代码运行效果
  • 加入分组逻辑后的代码运行效果
    添加分组逻辑后的运行效果
问题根因

自定义的equipment()视图委托存在两个逻辑缺陷:

  • 委托仅返回了数据库聚合查询的结果 + 缓存当前(Current)对象,没有遍历返回缓存中所有处于未持久化状态的新增/修改记录。切换标签页时框架会重新执行视图委托拉取数据重绘界面,未被委托返回的缓存未保存记录不会被加载到UI层,表现为记录"消失"。
  • 代码末尾手动设置cache.IsDirty = false,强制将缓存标记为已干净状态,干扰了框架本身对未保存变更的追踪逻辑。
修复方案
  1. 移除手动设置cache.IsDirty = false的代码,缓存脏状态由框架自动管理,不要手动干预。
  2. 在数据库查询结果返回完成后,追加遍历缓存中所有插入状态的未保存记录,通过分组字段去重后一并返回,保证视图重绘时所有未保存记录都能被加载到界面。
  3. 对最后返回的Current对象也做去重判断,避免界面出现重复条目。

修复后参考代码

protected virtual IEnumerable equipment()
{
    PXCache cache = Base.Caches[typeof(EquipmentProjection)];
    HashSet<(int? dailyFieldReportId, string timeCardCD)> returnedRecordKeys = new HashSet<(int?, string)>();
    int? currentReportId = Base.Caches<DailyFieldReport>().Current?.DailyFieldReportId;

    // 返回数据库聚合分组的已持久化记录
    foreach (PXResult<EquipmentProjection> res in SelectFrom<EquipmentProjection>
        .Where<EquipmentProjection.dailyFieldReportId
            .IsEqual<DailyFieldReport.dailyFieldReportId.FromCurrent>>
        .AggregateTo<GroupBy<EquipmentProjection.timeCardCD>>.View.Select(Base))
    {
        EquipmentProjection equipment = res;
        returnedRecordKeys.Add((equipment.DailyFieldReportId, equipment.TimeCardCD));
        yield return equipment;
    }

    // 追加缓存中所有未持久化的新增记录
    foreach (EquipmentProjection insertRecord in cache.CacheInserted)
    {
        if (insertRecord.DailyFieldReportId == currentReportId 
            && !returnedRecordKeys.Contains((insertRecord.DailyFieldReportId, insertRecord.TimeCardCD)))
        {
            returnedRecordKeys.Add((insertRecord.DailyFieldReportId, insertRecord.TimeCardCD));
            yield return insertRecord;
        }
    }

    // 最后返回当前缓存对象,避免重复
    if (cache.Current is EquipmentProjection currentRecord 
        && currentRecord.DailyFieldReportId == currentReportId
        && !returnedRecordKeys.Contains((currentRecord.DailyFieldReportId, currentRecord.TimeCardCD)))
    {
        yield return currentRecord;
    }
}

补充说明:如果业务场景中存在未保存的修改记录也需要纳入分组展示,可以在遍历缓存新增记录的逻辑后,追加遍历cache.CacheUpdated集合,用同样的去重逻辑返回即可。

内容的提问来源于stack exchange,提问作者Marco A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:24:17