From 43c8a44f5651c52edb1cc823bbb120881f732e36 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 31 八月 2026 23:36:02 +0800
Subject: [PATCH] 实现测试工步设置与工步汇总

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java |   34 ++++++++++++++++++++++++++++++++++
 1 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java
index 046b8c3..7c2e5f4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java
@@ -25,6 +25,7 @@
 import com.ruoyi.system.domain.TTestResult;
 import com.ruoyi.system.domain.TTestFieldSnapshot;
 import com.ruoyi.system.domain.TTestWarningThreshold;
+import com.ruoyi.system.domain.TTestLogicStepMapping;
 import com.ruoyi.system.domain.TDetectionChannel;
 import com.ruoyi.system.domain.vo.TestConfigurationOptionsVo;
 import com.ruoyi.system.mapper.TTestMapper;
@@ -333,6 +334,35 @@
         return testMapper.selectTestResults(result);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int saveLogicStepMappings(Long testId, List<TTestLogicStepMapping> mappings, Long operatorId, String updateBy)
+    {
+        if (testId == null || operatorId == null) throw new ServiceException("测试和操作人不能为空");
+        TTest current = testMapper.selectTestByIdForUpdate(testId);
+        if (current == null) throw new ServiceException("测试不存在");
+        List<TTestLogicStepMapping> normalized = mappings == null ? List.of() : mappings;
+        int previousEnd = 0;
+        int expectedNo = 1;
+        for (TTestLogicStepMapping mapping : normalized)
+        {
+            if (mapping == null || mapping.getLogicalNo() == null || mapping.getLogicalNo() != expectedNo
+                    || mapping.getStartStepNo() == null || mapping.getEndStepNo() == null
+                    || mapping.getStartStepNo() < 1 || mapping.getEndStepNo() < mapping.getStartStepNo()
+                    || mapping.getStartStepNo() <= previousEnd || StringUtils.isEmpty(trimToNull(mapping.getLogicalName())))
+                throw new ServiceException("逻辑工步必须按连续实际工步升序且互不重叠");
+            mapping.setLogicalName(trimToNull(mapping.getLogicalName()));
+            previousEnd = mapping.getEndStepNo();
+            expectedNo++;
+        }
+        String oldJson = current.getLogicStepMappingsJson();
+        String newJson = JSON.toJSONString(normalized);
+        int rows = testMapper.updateLogicStepMappings(testId, newJson, updateBy, new Date());
+        if (rows != 1) throw new ServiceException("工步设置已变更,请刷新后重试");
+        testMapper.insertTestAudit(testId, "LOGIC_STEP_MAPPING_UPDATED", operatorId, updateBy, oldJson, newJson);
+        return rows;
+    }
+
     private void loadConfiguration(TTest test)
     {
         Long testId = test.getTestId();
@@ -385,6 +415,10 @@
         test.setReceptionIntervals(intervals == null ? List.of() : intervals);
         List<TTestFieldSnapshot> loadedSnapshots = sharedFieldSnapshotService.selectByTestId(testId);
         test.setFieldSnapshots(loadedSnapshots == null ? mutable(test.getFieldSnapshots()) : loadedSnapshots);
+        String mappingJson = test.getLogicStepMappingsJson();
+        try { test.setLogicStepMappings(mappingJson == null || mappingJson.isBlank()
+                ? new ArrayList<>() : JSON.parseArray(mappingJson, TTestLogicStepMapping.class)); }
+        catch (JSONException exception) { throw new ServiceException("逻辑工步设置无法解析"); }
     }
 
     private void validateBase(TTest test, boolean update)

--
Gitblit v1.7.1