refactor(mes-excoil): 优化外部卷材数据同步性能(只插入不更新)

- 添加空数据检查并返回默认结果
- 实现批量数据转换提升处理效率
- 采用批量查询替代逐条查询减少数据库访问
- 分离新增和更新操作支持批量处理
- 实现分批插入和更新避免大数据量问题
- 每批处理500条记录确保系统稳定性
This commit is contained in:
2026-05-21 15:35:15 +08:00
parent b580d1798e
commit e531ce019d

View File

@@ -155,28 +155,84 @@ public class MesExCoilServiceImpl implements IMesExCoilService {
apiRows = fetchIncrementalFromApi(maxInsdate);
}
if (apiRows == null || apiRows.isEmpty()) {
Map<String, Object> result = new HashMap<>();
result.put("totalFetched", 0);
result.put("insertCount", 0);
result.put("updateCount", 0);
result.put("fullSync", isFullSync);
return result;
}
int insertCount = 0;
int updateCount = 0;
Date now = new Date();
// 1. 批量转换所有数据
List<MesExCoil> allEntities = new ArrayList<>(apiRows.size());
for (Map<String, Object> row : apiRows) {
MesExCoil entity = mapRowToEntity(row);
entity.setSyncTime(now);
LambdaQueryWrapper<MesExCoil> wrapper = Wrappers.lambdaQuery();
wrapper.eq(MesExCoil::getExcoilid, entity.getExcoilid());
MesExCoil existing = baseMapper.selectOne(wrapper);
if (existing != null) {
entity.setExId(existing.getExId());
baseMapper.updateById(entity);
updateCount++;
} else {
baseMapper.insert(entity);
insertCount++;
}
allEntities.add(entity);
}
// // 2. 收集所有 excoilid
// List<String> excoilids = allEntities.stream()
// .map(MesExCoil::getExcoilid)
// .filter(StringUtils::isNotBlank)
// .distinct()
// .collect(java.util.stream.Collectors.toList());
// // 3. 批量查询已存在的记录
// Map<String, MesExCoil> existingMap = new HashMap<>();
// if (!excoilids.isEmpty()) {
// LambdaQueryWrapper<MesExCoil> wrapper = Wrappers.lambdaQuery();
// wrapper.in(MesExCoil::getExcoilid, excoilids);
// List<MesExCoil> existingList = baseMapper.selectList(wrapper);
// existingMap = existingList.stream()
// .collect(java.util.stream.Collectors.toMap(MesExCoil::getExcoilid, v -> v, (a, b) -> a));
// }
// 4. 分离新增和更新的记录
List<MesExCoil> toInsert = new ArrayList<>();
// List<MesExCoil> toUpdate = new ArrayList<>();
for (MesExCoil entity : allEntities) {
// MesExCoil existing = existingMap.get(entity.getExcoilid());
// if (existing != null) {
// // 更新:设置主键
// entity.setExId(existing.getExId());
// toUpdate.add(entity);
// } else {
// 新增
toInsert.add(entity);
// }
}
// 5. 批量插入
if (!toInsert.isEmpty()) {
// 分批插入每批500条
int batchSize = 500;
for (int i = 0; i < toInsert.size(); i += batchSize) {
int end = Math.min(i + batchSize, toInsert.size());
List<MesExCoil> batch = toInsert.subList(i, end);
baseMapper.insertBatch(batch);
}
insertCount = toInsert.size();
}
// // 6. 批量更新
// if (!toUpdate.isEmpty()) {
// // 分批更新每批500条
// int batchSize = 500;
// for (int i = 0; i < toUpdate.size(); i += batchSize) {
// int end = Math.min(i + batchSize, toUpdate.size());
// List<MesExCoil> batch = toUpdate.subList(i, end);
// baseMapper.updateBatchById(batch, batch.size());
// }
// updateCount = toUpdate.size();
// }
Map<String, Object> result = new HashMap<>();
result.put("totalFetched", apiRows.size());
result.put("insertCount", insertCount);