日期:2026-07-15 状态:数据清理与删除后复查已完成,等待最终代码部署
清理「应填报工时」表中的两类无效数据:
离职当天及之前的数据保留。无法匹配人员档案、人员档案公司或属性为空等其他情况继续沿用现有保留逻辑,不在本次清理范围内。
dateField_mh8xhqc7。workDay > offlineDate 过滤,离职日后不再新增应报工时。重复键为:
employeeId + "|" + workDay
employeeId 从 employeeField_mmd8onl4 提取。workDay 从 dateField_mmd8onl5 解析。skippedInvalidKey。每个重复组只保留一条,按以下顺序选择:
gmtModified 最近的记录。gmtCreate 最近的记录。formInstanceId 做稳定排序,保证重复执行结果一致。完整度仅统计已有应报工时业务字段:工时、Manager、员工编号、属性、部门、归属公司、是否 CF 员工。核心键字段不计分。
不合并不同记录的字段,避免构造从未真实存在过的组合数据。此前公司和属性已完成统一回填,因此选择最完整记录即可。
新增一次性接口:
GET /workhours/cleanup-duplicates?dryRun=true
GET /workhours/cleanup-duplicates
执行分为四步:
delete_batch,返回实际删除数与失败数。返回统计至少包含:
totaluniqueKeysduplicateGroupsduplicateRecordstoDeleteskippedInvalidKeydeletedfailsamples正式删除前必须把以下范围复述给用户并取得二次确认:
正式删除后必须再次执行:
/workhours/cleanup-duplicates?dryRun=true,期望 toDelete=0。/workhours/cleanup-after-offline?dryRun=true,期望 toDelete=0。/workhours/cleanup-future?dryRun=true,期望 toDelete=0。duplicateGroups=0、toDelete=0、skippedInvalidKey=0。toDelete=0。toDelete=0。采用测试驱动实现,至少覆盖:
delete_batch。workDay > offlineDate:离职当天保留,次日删除或跳过写入。最终执行模块测试、完整打包、差异检查,再提交和部署。
projectChangeSyncEnabled。