yeg
2026-08-31 41dce73ba68e706bb876b3712a14cecb0269c962
删除偏移的全局结果查询接口

移除全局结果查询 Controller、Service、Mapper 和专用 DTO,保留测试级结果接口,并新增接口契约测试验证边界。
3个文件已删除
1个文件已添加
5个文件已修改
304 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/TTestController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/Ticket15ResultQueryContractTest.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/Ticket20ResultQueryRemovalTest.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TTestResultQuery.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TTestResultRecord.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTestMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ITTestService.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTestMapper.xml 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/TTestController.java
@@ -20,7 +20,6 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.TTest;
import com.ruoyi.system.domain.TTestResult;
import com.ruoyi.system.domain.TTestResultQuery;
import com.ruoyi.system.service.ITTestService;
/** 测试管理 Controller。 */
@@ -153,12 +152,4 @@
        return getDataTable(testService.selectTestResults(result));
    }
    /** 统一历史结果查询;仅返回检测完成测试的区间原始采样。 */
    @PreAuthorize("@ss.hasPermi('system:test:query')")
    @GetMapping("/results")
    public TableDataInfo historicalResults(TTestResultQuery query)
    {
        startPage();
        return getDataTable(testService.selectHistoricalResultRecords(query));
    }
}
ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/Ticket15ResultQueryContractTest.java
File was deleted
ruoyi-admin/src/test/java/com/ruoyi/web/controller/system/Ticket20ResultQueryRemovalTest.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.web.controller.system;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.junit.jupiter.api.Test;
import org.springframework.web.bind.annotation.GetMapping;
/** Ticket20:删除全局结果查询入口,同时保留测试控制台结果入口。 */
class Ticket20ResultQueryRemovalTest
{
    @Test
    void globalResultQueryIsRemovedButTestScopedResultsRemain()
    {
        Method[] methods = TTestController.class.getDeclaredMethods();
        assertFalse(hasGetMapping(methods, "/results"));
        assertTrue(hasGetMapping(methods, "/{testId}/results"));
    }
    private boolean hasGetMapping(Method[] methods, String path)
    {
        return Arrays.stream(methods)
                .map(method -> method.getAnnotation(GetMapping.class))
                .filter(mapping -> mapping != null)
                .flatMap(mapping -> Arrays.stream(mapping.value()))
                .anyMatch(path::equals);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/domain/TTestResultQuery.java
File was deleted
ruoyi-system/src/main/java/com/ruoyi/system/domain/TTestResultRecord.java
File was deleted
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTestMapper.java
@@ -10,8 +10,6 @@
import com.ruoyi.system.domain.TTestCollectorChannel;
import com.ruoyi.system.domain.TTestPlanStep;
import com.ruoyi.system.domain.TTestResult;
import com.ruoyi.system.domain.TTestResultQuery;
import com.ruoyi.system.domain.TTestResultRecord;
import com.ruoyi.system.domain.TTestWarningThreshold;
import com.ruoyi.system.domain.TTestCollectorSource;
import com.ruoyi.system.domain.TTestCollectorExceptionInterval;
@@ -57,7 +55,6 @@
    /** 按来源和起始边界顺序返回测试接收区间。 */
    List<TTestReceptionInterval> selectTestReceptionIntervals(Long testId);
    List<TTestResult> selectTestResults(TTestResult result);
    List<TTestResultRecord> selectHistoricalResultRecords(TTestResultQuery query);
    int countTestTypeEnabled(Long testTypeId);
    int countUserEnabled(Long userId);
    int countBatteryInEnabledGroup(@Param("groupId") Long groupId, @Param("batteryNo") String batteryNo);
ruoyi-system/src/main/java/com/ruoyi/system/service/ITTestService.java
@@ -3,8 +3,6 @@
import java.util.List;
import com.ruoyi.system.domain.TTest;
import com.ruoyi.system.domain.TTestResult;
import com.ruoyi.system.domain.TTestResultQuery;
import com.ruoyi.system.domain.TTestResultRecord;
import com.ruoyi.system.domain.vo.TestConfigurationOptionsVo;
/** 测试配置业务接口。 */
@@ -46,6 +44,4 @@
    /** 查询指定测试已持久化的结果记录。 */
    List<TTestResult> selectTestResults(TTestResult result);
    /** 查询检测完成测试的区间历史结果,实时快照和暂停数据不会返回。 */
    List<TTestResultRecord> selectHistoricalResultRecords(TTestResultQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java
@@ -23,8 +23,6 @@
import com.ruoyi.system.domain.TTestCollectorChannel;
import com.ruoyi.system.domain.TTestPlanStep;
import com.ruoyi.system.domain.TTestResult;
import com.ruoyi.system.domain.TTestResultQuery;
import com.ruoyi.system.domain.TTestResultRecord;
import com.ruoyi.system.domain.TTestFieldSnapshot;
import com.ruoyi.system.domain.TTestWarningThreshold;
import com.ruoyi.system.domain.TDetectionChannel;
@@ -333,12 +331,6 @@
        if (result == null || result.getTestId() == null) throw new ServiceException("测试ID不能为空");
        selectTestById(result.getTestId());
        return testMapper.selectTestResults(result);
    }
    @Override
    public List<TTestResultRecord> selectHistoricalResultRecords(TTestResultQuery query)
    {
        return testMapper.selectHistoricalResultRecords(query == null ? new TTestResultQuery() : query);
    }
    private void loadConfiguration(TTest test)
ruoyi-system/src/main/resources/mapper/system/TTestMapper.xml
@@ -113,35 +113,6 @@
        <result property="exceptionInfo" column="exception_info" />
        <result property="delFlag" column="del_flag" />
    </resultMap>
    <resultMap id="TTestResultRecordMap" type="TTestResultRecord">
        <id property="resultId" column="result_id" />
        <result property="sourceType" column="source_type" />
        <result property="testId" column="test_id" />
        <result property="testName" column="test_name" />
        <result property="testStatus" column="test_status" />
        <result property="receptionStatus" column="reception_status" />
        <result property="relationId" column="relation_id" />
        <result property="batteryNo" column="battery_no" />
        <result property="sourceId" column="source_id" />
        <result property="sourceIdentity" column="source_identity" />
        <result property="intervalId" column="interval_id" />
        <result property="intervalStartAtUtc" column="interval_start_at_utc" />
        <result property="intervalEndAtUtc" column="interval_end_at_utc" />
        <result property="cycleNo" column="cycle_no" />
        <result property="stepNo" column="step_no" />
        <result property="stepType" column="step_type" />
        <result property="workStatus" column="work_status" />
        <result property="voltageV" column="voltage_v" />
        <result property="currentA" column="current_a" />
        <result property="capacityAh" column="capacity_ah" />
        <result property="energyWh" column="energy_wh" />
        <result property="metricCode" column="metric_code" />
        <result property="metricValue" column="metric_value" />
        <result property="unit" column="unit" />
        <result property="deviceTimeUtc" column="device_time_utc" />
        <result property="deviceTimeRaw" column="device_time_raw" />
        <result property="serverReceivedAtUtc" column="server_received_at_utc" />
    </resultMap>
    <resultMap id="TTestCollectorExceptionIntervalResultMap" type="TTestCollectorExceptionInterval">
        <id property="intervalId" column="interval_id" />
        <result property="testId" column="test_id" />
@@ -380,58 +351,6 @@
        <if test="beginResultTime != null">and result.result_time &gt;= #{beginResultTime}</if>
        <if test="endResultTime != null">and result.result_time &lt;= #{endResultTime}</if>
        order by result.result_time, result.result_id
    </select>
    <select id="selectHistoricalResultRecords" parameterType="TTestResultQuery" resultMap="TTestResultRecordMap">
        select * from (
            select s.sample_id result_id, 'CABINET_CHANNEL' source_type, t.test_id, t.test_name,
                   t.test_status, t.reception_status, b.relation_id, b.battery_no,
                   s.channel_id source_id,
                   concat('CABINET:', coalesce(cab.adapter_code, ''), ':', coalesce(cab.devtype, ''), ':',
                          coalesce(cab.devid, ''), ':', coalesce(cab.subdevid, ''), ':', coalesce(cab.chlid, '')) source_identity,
                   s.reception_interval_id interval_id, i.start_boundary_at_utc interval_start_at_utc,
                   i.end_boundary_at_utc interval_end_at_utc, s.cycle_no, s.step_no, s.step_type,
                   s.step_type work_status, s.voltage_v, s.current_a, s.capacity_ah, s.energy_wh,
                   null metric_code, null metric_value, 'V/A/Ah/Wh' unit, 'voltage=V,current=A,capacity=Ah,energy=Wh' unit_metadata,
                   s.device_time_utc, s.device_time_raw, s.received_at_utc server_received_at_utc,
                   case when exists (select 1 from t_test_integrity_issue x where x.test_id = t.test_id and x.issue_status = 'OPEN') then '完成确认中' else '完整性已通过' end integrity_conclusion
            from t_test_sample s
            join t_test t on t.test_id = s.test_id and t.test_status = 'COMPLETED' and t.del_flag = 0
            join t_test_channel_binding tb on tb.binding_id = s.binding_id
            join t_test_battery b on b.relation_id = tb.battery_relation_id and b.del_flag = 0
            join t_test_reception_interval i on i.interval_id = s.reception_interval_id and i.interval_status = 'CLOSED'
            join t_detection_channel cab on cab.channel_id = s.channel_id
            union all
            select cs.sample_id result_id, 'COLLECTOR_CHANNEL' source_type, t.test_id, t.test_name,
                   t.test_status, t.reception_status, b.relation_id, b.battery_no,
                   cs.collector_id source_id,
                   concat('COLLECTOR:', coalesce(col.collector_code, cs.collector_id), ':', cs.collector_channel_code) source_identity,
                   cs.reception_interval_id interval_id, i.start_boundary_at_utc interval_start_at_utc,
                   i.end_boundary_at_utc interval_end_at_utc, null cycle_no, null step_no, null step_type,
                   null work_status, null voltage_v, null current_a, null capacity_ah, null energy_wh,
                   cs.metric_code, cs.metric_value, cs.unit, concat('metric=', cs.metric_code, ',unit=', cs.unit) unit_metadata,
                   cs.device_time_utc, cs.device_time_raw, cs.server_received_at_utc,
                   case when exists (select 1 from t_test_integrity_issue x where x.test_id = t.test_id and x.issue_status = 'OPEN') then '完成确认中' else '完整性已通过' end integrity_conclusion
            from t_test_collector_sample cs
            join t_test t on t.test_id = cs.test_id and t.test_status = 'COMPLETED' and t.del_flag = 0
            join t_test_channel_binding tb on tb.binding_id = cs.binding_id
            join t_test_battery b on b.relation_id = tb.battery_relation_id and b.del_flag = 0
            join t_collector col on col.collector_id = cs.collector_id
            join t_test_reception_interval i on i.interval_id = cs.reception_interval_id and i.interval_status = 'CLOSED'
        ) result
        <where>
            <if test="testId != null">and result.test_id = #{testId}</if>
            <if test="testName != null and testName != ''">and result.test_name like concat('%', #{testName}, '%')</if>
            <if test="batteryNo != null and batteryNo != ''">and result.battery_no like concat('%', #{batteryNo}, '%')</if>
            <if test="sourceType != null and sourceType != ''">and result.source_type = #{sourceType}</if>
            <if test="sourceId != null">and result.source_id = #{sourceId}</if>
            <if test="sourceChannelCode != null and sourceChannelCode != ''">and result.source_identity like concat('%:', #{sourceChannelCode})</if>
            <if test="beginDeviceTime != null">and result.device_time_utc &gt;= #{beginDeviceTime}</if>
            <if test="endDeviceTime != null">and result.device_time_utc &lt;= #{endDeviceTime}</if>
            <if test="cycleNo != null">and result.cycle_no = #{cycleNo}</if>
            <if test="stepNo != null">and result.step_no = #{stepNo}</if>
        </where>
        order by result.device_time_utc, result.source_type, result.result_id
    </select>
    <select id="countTestTypeEnabled" resultType="int">