| | |
| | | import java.util.Date; |
| | | import java.util.HexFormat; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.Optional; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import com.ruoyi.device.bts.BtsDevelopmentSimulator; |
| | |
| | | import com.ruoyi.system.domain.TTest; |
| | | import com.ruoyi.system.domain.TTestBattery; |
| | | import com.ruoyi.system.domain.TTestChannelBinding; |
| | | import com.ruoyi.system.domain.TTestReceptionInterval; |
| | | import com.ruoyi.system.mapper.TTestMapper; |
| | | import com.ruoyi.system.service.ITTestService; |
| | | import com.ruoyi.system.service.ITestDataReceptionService; |
| | |
| | | if (testIds == null) return; |
| | | for (Long testId : testIds) |
| | | { |
| | | // 锁住测试行直到本轮采样写入完成,暂停/停止动作只能在本轮接收提交后生效。 |
| | | TTest locked = mapper.selectTestByIdForUpdate(testId); |
| | | if (locked == null || !"RECEIVING".equals(locked.getReceptionStatus())) continue; |
| | | TTest test = tests.selectTestById(testId); |
| | | if (test == null || !"RECEIVING".equals(test.getReceptionStatus())) continue; |
| | | captureTest(test); |
| | |
| | | { |
| | | TTestChannelBinding binding = battery.getBinding(); |
| | | if (binding == null || binding.getDevid() == null || binding.getChlid() == null) continue; |
| | | Optional<TTestReceptionInterval> open = mapper.selectTestReceptionIntervals(test.getTestId()).stream() |
| | | .filter(item -> Objects.equals(item.getBindingId(), binding.getBindingId()) |
| | | && "CABINET_CHANNEL".equals(item.getSourceType()) |
| | | && Objects.equals(item.getSourceId(), binding.getChannelId()) |
| | | && "OPEN".equals(item.getIntervalStatus())) |
| | | .findFirst(); |
| | | if (open.isEmpty()) continue; |
| | | Date start = open.get().getStartBoundaryAtUtc(); |
| | | List<BtsHistoryRecord> records; |
| | | try { records = simulator.btsRecords(binding.getDevid(), binding.getChlid()); } |
| | | catch (IllegalArgumentException ignored) { continue; } |
| | | for (BtsHistoryRecord record : records) |
| | | { |
| | | if (start != null && record.deviceTime().isBefore(start.toInstant())) continue; |
| | | save(test, battery, binding, open.get(), record); |
| | | save(test, binding, record); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void save(TTest test, TTestBattery battery, TTestChannelBinding binding, |
| | | TTestReceptionInterval interval, BtsHistoryRecord record) |
| | | private void save(TTest test, TTestChannelBinding binding, |
| | | BtsHistoryRecord record) |
| | | { |
| | | // 模拟器历史 testid 按通道固定;接收事实必须再带测试作用域,避免顺序测试共用全局幂等键。 |
| | | String btsTestId = "SIM-" + binding.getDevid() + "-" + binding.getChlid() + "-T" + test.getTestId(); |
| | | byte[] hash = hash(record); |
| | | String old = mapper.selectSampleContentHash(binding.getChannelId(), btsTestId, record.sequenceId()); |
| | | String old = mapper.selectBtsSampleContentHash(binding.getChannelId(), btsTestId, record.sequenceId()); |
| | | if (old != null) |
| | | { |
| | | if (!old.equalsIgnoreCase(HexFormat.of().formatHex(hash))) |
| | | mapper.insertBackfillConflict(test.getTestId(), binding.getChannelId(), |
| | | mapper.insertSampleConflict(test.getTestId(), binding.getChannelId(), |
| | | "实时接收内容冲突 testid=" + btsTestId + ", seqid=" + record.sequenceId()); |
| | | return; |
| | | } |
| | | mapper.insertBtsSample(test.getTestId(), binding.getBindingId(), binding.getChannelId(), interval.getIntervalId(), |
| | | int inserted = mapper.insertBtsSample(test.getTestId(), binding.getBindingId(), binding.getChannelId(), |
| | | btsTestId, record.sequenceId(), Date.from(record.deviceTime()), |
| | | record.deviceTime().toString(), new Date(), record.cycleNo(), record.stepNo(), record.stepType(), |
| | | record.stepName(), null, |
| | | BigDecimal.valueOf(record.voltageV()), BigDecimal.valueOf(record.currentA()), |
| | | BigDecimal.valueOf(record.capacityAh()), BigDecimal.valueOf(record.energyWh()), hash); |
| | | if (inserted == 0) |
| | | { |
| | | String actual = mapper.selectBtsSampleContentHash(binding.getChannelId(), btsTestId, record.sequenceId()); |
| | | if (actual != null && !actual.equalsIgnoreCase(HexFormat.of().formatHex(hash))) |
| | | mapper.insertSampleConflict(test.getTestId(), binding.getChannelId(), |
| | | "实时接收并发内容冲突 testid=" + btsTestId + ", seqid=" + record.sequenceId()); |
| | | } |
| | | } |
| | | |
| | | private byte[] hash(BtsHistoryRecord record) |