yeg
2026-09-05 aa89745fe575f876d474b4bb85e01e7a999ebd22
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/TTestController.java
@@ -19,9 +19,21 @@
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
@@ -30,6 +42,12 @@
{
    @Autowired
    private ITTestService testService;
    @Autowired
    private ITestConsoleDataService consoleDataService;
    @Autowired
    private ITestDataQueryService testDataQueryService;
    @PreAuthorize("@ss.hasAnyPermi('system:test:add,system:test:edit')")
    @GetMapping("/options")
@@ -57,8 +75,9 @@
    @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());
@@ -69,8 +88,9 @@
    @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);
@@ -96,7 +116,7 @@
        return success(testService.selectTestById(testId));
    }
    /** 独立暂停接收动作;只关闭系统接收区间,不向设备发送控制命令。 */
    /** 独立暂停接收动作;停止该测试数据请求,不向设备发送控制命令。 */
    @PreAuthorize("@ss.hasPermi('system:test:pause')")
    @Log(title = "测试数据接收", businessType = BusinessType.UPDATE)
    @PostMapping("/{testId}/reception/pause")
@@ -106,7 +126,7 @@
        return success(testService.selectTestById(testId));
    }
    /** 独立继续接收动作;从新的成功观测边界打开区间,不向设备发送控制命令。 */
    /** 独立继续接收动作;恢复该测试数据请求,不向设备发送控制命令。 */
    @PreAuthorize("@ss.hasPermi('system:test:resume')")
    @Log(title = "测试数据接收", businessType = BusinessType.UPDATE)
    @PostMapping("/{testId}/reception/resume")
@@ -116,14 +136,99 @@
        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)
@@ -141,4 +246,48 @@
        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;
    }
}