diff --git a/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs b/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs index b341f8d..214bb9b 100644 --- a/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs +++ b/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs @@ -392,26 +392,46 @@ namespace YD_AllHeartRates.Api.Mqtt foreach (var key in keys) { var data = _caching.Get(key); - if (data == null || string.IsNullOrWhiteSpace(data.StudentNo)) continue; var exist = await dbContext.JumpRopeData .FirstOrDefaultAsync(x => x.StudentNo == data.StudentNo && x.ScoreTime.Date == today); - if (exist != null && data.JumpValue > exist.JumpValue) + if (exist != null) { - exist.JumpValue = data.JumpValue; - exist.ErrorNumber = data.ErrorNumber; - exist.QuantityOfElectricity = data.QuantityOfElectricity; - exist.ScoreTime = data.ScoreTime; + if (data.JumpValue > exist.JumpValue) + { + exist.JumpValue = data.JumpValue; + exist.ErrorNumber = data.ErrorNumber; + exist.QuantityOfElectricity = data.QuantityOfElectricity; + exist.ScoreTime = data.ScoreTime; + } } else { - dbContext.JumpRopeData.Add(data); + try + { + dbContext.JumpRopeData.Add(data); + await dbContext.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + // 如果是唯一约束冲突,说明有并发插入 + // 可以忽略或重试更新 + var existRetry = await dbContext.JumpRopeData + .FirstOrDefaultAsync(x => x.StudentNo == data.StudentNo && x.ScoreTime.Date == today); + + if (existRetry != null && data.JumpValue > existRetry.JumpValue) + { + existRetry.JumpValue = data.JumpValue; + existRetry.ErrorNumber = data.ErrorNumber; + existRetry.QuantityOfElectricity = data.QuantityOfElectricity; + existRetry.ScoreTime = data.ScoreTime; + await dbContext.SaveChangesAsync(); + } + } } } - - await dbContext.SaveChangesAsync(); _lastJumpRopeSaveTime = DateTime.Now; } catch (Exception ex)