| | |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.system.domain.TTest; |
| | | import com.ruoyi.system.domain.TTestBattery; |
| | | import com.ruoyi.system.domain.TTestChannelBinding; |
| | | import com.ruoyi.system.domain.TTestCollectorChannel; |
| | | import com.ruoyi.system.domain.TTestWarningThreshold; |
| | | import com.battery.business.test.dto.TestConfigurationDto; |
| | | import com.battery.business.test.dto.TestBatteryBindingDto; |
| | | import com.battery.business.test.dto.ThresholdDto; |
| | | import com.ruoyi.system.domain.TTestResult; |
| | | import com.ruoyi.system.domain.TTestReceptionInterval; |
| | | import com.ruoyi.system.domain.TTestLogicStepMapping; |
| | | import com.ruoyi.system.domain.TTestConsoleDetail; |
| | | import com.ruoyi.system.domain.TTestDataRevisionAction; |
| | | import com.ruoyi.system.domain.TTestDataOverride; |
| | | import com.ruoyi.system.service.ITTestService; |
| | | import com.ruoyi.system.service.ITestConsoleDataService; |
| | | import com.ruoyi.system.service.ITestDataQueryService; |
| | | |
| | | /** 测试管理 Controller。 */ |
| | | @RestController |
| | |
| | | { |
| | | @Autowired |
| | | private ITTestService testService; |
| | | |
| | | @Autowired |
| | | private ITestConsoleDataService consoleDataService; |
| | | |
| | | @Autowired |
| | | private ITestDataQueryService testDataQueryService; |
| | | |
| | | @PreAuthorize("@ss.hasAnyPermi('system:test:add,system:test:edit')") |
| | | @GetMapping("/options") |
| | |
| | | @PreAuthorize("@ss.hasPermi('system:test:add')") |
| | | @Log(title = "测试管理", businessType = BusinessType.INSERT) |
| | | @PostMapping |
| | | public AjaxResult add(@Validated @RequestBody TTest test) |
| | | public AjaxResult add(@Validated @RequestBody TestConfigurationDto request) |
| | | { |
| | | TTest test = toDomain(request); |
| | | test.setOperatorId(getUserId()); |
| | | test.setCreatorId(getUserId()); |
| | | test.setCreateBy(getUsername()); |
| | |
| | | @PreAuthorize("@ss.hasPermi('system:test:edit')") |
| | | @Log(title = "测试管理", businessType = BusinessType.UPDATE) |
| | | @PutMapping |
| | | public AjaxResult edit(@Validated @RequestBody TTest test) |
| | | public AjaxResult edit(@Validated @RequestBody TestConfigurationDto request) |
| | | { |
| | | TTest test = toDomain(request); |
| | | test.setOperatorId(getUserId()); |
| | | test.setUpdateBy(getUsername()); |
| | | testService.updateTest(test); |
| | |
| | | return success(testService.selectTestById(testId)); |
| | | } |
| | | |
| | | /** 独立暂停接收动作;只关闭系统接收区间,不向设备发送控制命令。 */ |
| | | /** 独立暂停接收动作;停止该测试数据请求,不向设备发送控制命令。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:pause')") |
| | | @Log(title = "测试数据接收", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/{testId}/reception/pause") |
| | |
| | | return success(testService.selectTestById(testId)); |
| | | } |
| | | |
| | | /** 独立继续接收动作;从新的成功观测边界打开区间,不向设备发送控制命令。 */ |
| | | /** 独立继续接收动作;恢复该测试数据请求,不向设备发送控制命令。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:resume')") |
| | | @Log(title = "测试数据接收", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/{testId}/reception/resume") |
| | |
| | | return success(testService.selectTestById(testId)); |
| | | } |
| | | |
| | | /** 返回测试各来源的接收区间、动作时间和实际采样边界。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:query')") |
| | | @GetMapping("/{testId}/reception/intervals") |
| | | public AjaxResult receptionIntervals(@PathVariable Long testId) |
| | | /** 独立停止测试动作;进入不可恢复终态且不向设备发送控制命令。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:stop')") |
| | | @Log(title = "停止测试", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/{testId}/stop") |
| | | public AjaxResult stopTest(@PathVariable Long testId) |
| | | { |
| | | List<TTestReceptionInterval> intervals = testService.selectReceptionIntervals(testId); |
| | | return success(intervals); |
| | | testService.stopTest(testId, getUserId(), getUsername()); |
| | | return success(testService.selectTestById(testId)); |
| | | } |
| | | |
| | | /** 人工结束接收动作别名;与停止测试共用停止请求并进入不可恢复终态的事务。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:stop')") |
| | | @Log(title = "人工结束接收", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/{testId}/reception/end") |
| | | public AjaxResult endReception(@PathVariable Long testId) |
| | | { |
| | | testService.stopTest(testId, getUserId(), getUsername()); |
| | | return success(testService.selectTestById(testId)); |
| | | } |
| | | |
| | | /** 保存当前测试的逻辑工步合并规则,不改写检测柜原始工步。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:edit')") |
| | | @Log(title = "测试工步设置", businessType = BusinessType.UPDATE) |
| | | @PutMapping("/{testId}/logic-step-mappings") |
| | | public AjaxResult saveLogicStepMappings(@PathVariable Long testId, |
| | | @RequestBody List<TTestLogicStepMapping> mappings) |
| | | { |
| | | testService.saveLogicStepMappings(testId, mappings, getUserId(), getUsername()); |
| | | return success(testService.selectTestById(testId)); |
| | | } |
| | | |
| | | /** 保存工步图表测试详情当前最新版,不参与测试配置、统计或审计。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:edit')") |
| | | @PutMapping("/{testId}/console-detail") |
| | | public AjaxResult saveConsoleDetail(@PathVariable Long testId, @RequestBody TTestConsoleDetail detail) |
| | | { |
| | | testService.saveConsoleDetail(testId, detail, getUserId(), getUsername()); |
| | | return success(testService.selectTestById(testId)); |
| | | } |
| | | |
| | | /** 返回当前测试某类数据的人工覆盖和删除状态,供刷新后恢复展示。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:query')") |
| | | @GetMapping("/{testId}/console-data/{dataType}/overrides") |
| | | public AjaxResult dataOverrides(@PathVariable Long testId, @PathVariable String dataType) |
| | | { |
| | | return success(consoleDataService.selectOverrides(testId, dataType)); |
| | | } |
| | | |
| | | /** 查询当前测试成功接收的检测柜与采集器实时观测。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:query')") |
| | | @GetMapping("/{testId}/data/records") |
| | | public AjaxResult persistedRecords(@PathVariable Long testId) |
| | | { |
| | | return success(testDataQueryService.records(testId)); |
| | | } |
| | | |
| | | /** 只查询当前测试持久化采样汇总出的工步事实。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:query')") |
| | | @GetMapping("/{testId}/data/steps") |
| | | public AjaxResult persistedSteps(@PathVariable Long testId) |
| | | { |
| | | return success(testDataQueryService.steps(testId)); |
| | | } |
| | | |
| | | /** 只查询当前测试持久化采样汇总出的循环事实。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:query')") |
| | | @GetMapping("/{testId}/data/cycles") |
| | | public AjaxResult persistedCycles(@PathVariable Long testId) |
| | | { |
| | | return success(testDataQueryService.cycles(testId)); |
| | | } |
| | | |
| | | /** 一次提交编辑、导入或删除;服务端只追加一条修订行为。 */ |
| | | @PreAuthorize("@ss.hasPermi('system:test:edit')") |
| | | @Log(title = "测试控制台数据修订", businessType = BusinessType.UPDATE) |
| | | @PostMapping("/{testId}/console-data/actions") |
| | | public AjaxResult dataAction(@PathVariable Long testId, @RequestBody ConsoleDataActionRequest request) |
| | | { |
| | | if (request == null) return error("数据操作不能为空"); |
| | | TTestDataRevisionAction action = new TTestDataRevisionAction(); |
| | | action.setTestId(testId); action.setDataType(request.dataType()); action.setOperationType(request.operationType()); |
| | | action.setScopeSummary(request.scopeSummary()); action.setIdentitySummary(request.identitySummary()); |
| | | action.setChangesSummary(request.changesSummary()); action.setReason(request.reason()); |
| | | action.setOperatorId(getUserId()); action.setOperatorName(getUsername()); |
| | | Long actionId = consoleDataService.submitAction(action, |
| | | request.overrides() == null ? java.util.Collections.emptyList() : request.overrides(), |
| | | request.btsSampleIds(), request.collectorSampleIds()); |
| | | return success().put("actionId", actionId); |
| | | } |
| | | |
| | | public record ConsoleDataActionRequest(String dataType, String operationType, String scopeSummary, |
| | | String identitySummary, String changesSummary, String reason, List<TTestDataOverride> overrides, |
| | | List<Long> btsSampleIds, List<Long> collectorSampleIds) { } |
| | | |
| | | @PreAuthorize("@ss.hasPermi('system:test:remove')") |
| | | @Log(title = "测试管理", businessType = BusinessType.DELETE) |
| | |
| | | startPage(); |
| | | return getDataTable(testService.selectTestResults(result)); |
| | | } |
| | | |
| | | /** 将测试配置 DTO 转换为现有测试服务模型;计划工步等废止字段不再进入服务。 */ |
| | | private TTest toDomain(TestConfigurationDto request) |
| | | { |
| | | if (request == null) return null; |
| | | TTest test = new TTest(); |
| | | test.setTestId(request.testId()); test.setTestName(request.testName()); test.setPrincipalId(request.principalId()); |
| | | test.setTestTypeId(request.testTypeId()); test.setTestPurpose(request.testPurpose()); |
| | | test.setMonitorTimeoutMinutes(request.monitorTimeoutMinutes()); test.setRemark(request.remark()); |
| | | java.util.List<TTestBattery> batteries = new java.util.ArrayList<>(); |
| | | if (request.batteries() != null) for (TestBatteryBindingDto item : request.batteries()) |
| | | { |
| | | if (item == null) continue; |
| | | TTestBattery battery = new TTestBattery(); battery.setTestBatteryId(item.resolvedTestBatteryId()); |
| | | battery.setGroupId(item.groupId()); battery.setBatteryNo(item.batteryNo()); battery.setCollectorId(item.collectorId()); |
| | | if (item.resolvedCabinetChannel() != null) |
| | | { |
| | | TTestChannelBinding binding = new TTestChannelBinding(); |
| | | binding.setTestBatteryId(item.resolvedTestBatteryId()); binding.setChannelId(item.resolvedCabinetChannel().channelId()); |
| | | binding.setExpectedBarcode(item.resolvedCabinetChannel().expectedBarcode()); battery.setBinding(binding); |
| | | } |
| | | java.util.List<TTestCollectorChannel> channels = new java.util.ArrayList<>(); |
| | | if (item.collectorChannels() != null) for (TestBatteryBindingDto.CollectorChannelDto channel : item.collectorChannels()) |
| | | { |
| | | if (channel == null) continue; |
| | | TTestCollectorChannel mapping = new TTestCollectorChannel(); mapping.setTestBatteryId(item.resolvedTestBatteryId()); |
| | | mapping.setCollectorId(item.collectorId()); mapping.setMeasurementCode(channel.measurementCode()); |
| | | mapping.setMeasurementName(channel.measurementName()); mapping.setChannelCode(channel.channelCode()); channels.add(mapping); |
| | | } |
| | | battery.setCollectorChannels(channels); batteries.add(battery); |
| | | } |
| | | test.setBatteries(batteries); |
| | | java.util.List<TTestWarningThreshold> thresholds = new java.util.ArrayList<>(); |
| | | if (request.thresholds() != null) for (ThresholdDto item : request.thresholds()) |
| | | { |
| | | if (item == null) continue; |
| | | TTestWarningThreshold threshold = new TTestWarningThreshold(); threshold.setMetricCode(item.metricCode()); |
| | | threshold.setMinValue(item.minValue()); threshold.setMaxValue(item.maxValue()); threshold.setUnit(item.unit()); |
| | | threshold.setSeverity(item.severity()); thresholds.add(threshold); |
| | | } |
| | | test.setThresholds(thresholds); |
| | | return test; |
| | | } |
| | | |
| | | } |