diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskController.java index 227e7ce..6533d48 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskController.java @@ -58,6 +58,14 @@ public class AimaTaskController extends BaseController { return toAjax(aimaTaskService.insertAimaTask(aimaTask)); } + @ApiOperation("复制爱玛任务") + @PreAuthorize("@ss.hasPermi('aima:task:add')") + @Log(title = "爱玛任务管理", businessType = BusinessType.INSERT) + @PostMapping("/copy/{id}") + public AjaxResult copy(@PathVariable String id) { + return success(aimaTaskService.copyAimaTask(id)); + } + @ApiOperation("修改任务") @PreAuthorize("@ss.hasPermi('aima:task:edit')") @Log(title = "任务管理", businessType = BusinessType.UPDATE) diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestCaseController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestCaseController.java index 4c331fc..90b0cf0 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestCaseController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestCaseController.java @@ -58,6 +58,14 @@ public class AimaTestCaseController extends BaseController { return toAjax(aimaTestCaseService.insertAimaTestCase(aimaTestCase)); } + @ApiOperation("复制测试用例") + @PreAuthorize("@ss.hasPermi('aima:testcase:add')") + @Log(title = "测试用例管理", businessType = BusinessType.INSERT) + @PostMapping("/copy/{id}") + public AjaxResult copy(@PathVariable String id) { + return success(aimaTestCaseService.copyAimaTestCase(id)); + } + @ApiOperation("修改测试用例") @PreAuthorize("@ss.hasPermi('aima:testcase:edit')") @Log(title = "测试用例管理", businessType = BusinessType.UPDATE) diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionTaskController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionTaskController.java index c144cbe..b30a500 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionTaskController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionTaskController.java @@ -89,6 +89,15 @@ public class InspectionTaskController extends BaseController return toAjax(inspectionTaskService.insertInspectionTask(inspectionTask)); } + @ApiOperation("复制巡检任务") + @PreAuthorize("@ss.hasPermi('inspection:task:add')") + @Log(title = "巡检任务", businessType = BusinessType.INSERT) + @PostMapping("/copy/{id}") + public AjaxResult copy(@PathVariable String id) + { + return success(inspectionTaskService.copyInspectionTask(id)); + } + /** * 修改巡检任务 */ diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionWaypointController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionWaypointController.java index 1d0f8aa..285758b 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionWaypointController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/InspectionWaypointController.java @@ -88,6 +88,15 @@ public class InspectionWaypointController extends BaseController return toAjax(inspectionWaypointService.insertInspectionWaypoint(inspectionWaypoint)); } + @ApiOperation("复制巡检点位") + @PreAuthorize("@ss.hasPermi('inspection:waypoint:add')") + @Log(title = "巡检点位", businessType = BusinessType.INSERT) + @PostMapping("/copy/{id}") + public AjaxResult copy(@PathVariable String id) + { + return success(inspectionWaypointService.copyInspectionWaypoint(id)); + } + /** * 修改巡检点位 */ diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeDetectionItemController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeDetectionItemController.java index 3c4a12a..7cdb049 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeDetectionItemController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeDetectionItemController.java @@ -60,6 +60,14 @@ public class TeDetectionItemController extends BaseController { return toAjax(rows); } + @ApiOperation("复制检测项配置") + @PreAuthorize("@ss.hasPermi('test:detect:add')") + @Log(title = "检测项配置", businessType = BusinessType.INSERT) + @PostMapping("/copy/{id}") + public AjaxResult copy(@PathVariable String id) { + return success(teDetectionItemService.copyTeDetectionItem(id)); + } + @ApiOperation("修改检测项配置") @PreAuthorize("@ss.hasPermi('test:detect:edit')") @Log(title = "检测项配置", businessType = BusinessType.UPDATE) diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTaskConfigInfoController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTaskConfigInfoController.java index 26404e9..b1f41b9 100644 --- a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTaskConfigInfoController.java +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/test/TeTaskConfigInfoController.java @@ -48,6 +48,14 @@ public class TeTaskConfigInfoController extends BaseController { return toAjax(teTaskConfigInfoService.insertTeTaskConfigInfo(teTaskConfigInfo)); } + @ApiOperation("复制任务配置") + @PreAuthorize("@ss.hasPermi('test:config:add')") + @Log(title = "任务配置", businessType = BusinessType.INSERT) + @PostMapping("/copy/{id}") + public AjaxResult copy(@PathVariable String id) { + return success(teTaskConfigInfoService.copyTeTaskConfigInfo(id)); + } + @ApiOperation("修改任务配置信息") @PreAuthorize("@ss.hasPermi('test:config:edit')") @Log(title = "任务配置信息", businessType = BusinessType.UPDATE) diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskService.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskService.java index 05960fa..f816588 100644 --- a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskService.java +++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskService.java @@ -16,6 +16,7 @@ public interface IAimaTaskService { List selectAimaTaskList(AimaTask aimaTask); List selectAimaTaskVoList(AimaTask aimaTask); int insertAimaTask(AimaTask aimaTask); + String copyAimaTask(String id); int updateAimaTask(AimaTask aimaTask); int deleteAimaTaskByIds(String[] ids); int deleteAimaTaskById(String id); diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestCaseService.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestCaseService.java index 551e8f3..a438d6a 100644 --- a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestCaseService.java +++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestCaseService.java @@ -43,6 +43,9 @@ public interface IAimaTestCaseService { */ int insertAimaTestCase(AimaTestCase aimaTestCase); + /** Copy a test case and its independent detection item. */ + String copyAimaTestCase(String id); + /** * 修改爱玛测试用例 * diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskServiceImpl.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskServiceImpl.java index 14cf561..5b02469 100644 --- a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskServiceImpl.java +++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskServiceImpl.java @@ -18,6 +18,7 @@ import com.cmvr.test.service.ITeTaskOrchestrationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.cmvr.common.utils.DateUtils; +import com.cmvr.common.utils.EntityCopyUtils; import com.cmvr.common.utils.SecurityUtils; import com.cmvr.aima.mapper.AimaTaskMapper; import com.cmvr.aima.mapper.AimaTaskTestCaseMapper; @@ -75,6 +76,39 @@ public class AimaTaskServiceImpl extends ServiceImpl i return aimaTaskMapper.insertAimaTask(aimaTask); } + @Override + @Transactional(rollbackFor = Exception.class) + public String copyAimaTask(String id) { + AimaTask source = aimaTaskMapper.selectAimaTaskById(id); + if (source == null) { + throw new IllegalArgumentException("爱玛任务不存在: " + id); + } + if (source.getTaskConfigId() == null || source.getTaskConfigId().isEmpty()) { + throw new IllegalStateException("爱玛任务未关联任务配置,无法完整复制: " + id); + } + + String copiedConfigId = teTaskConfigInfoService.copyTeTaskConfigInfo(source.getTaskConfigId()); + AimaTask copy = new AimaTask(); + copy.setId(UUID.randomUUID().toString().replace("-", "")); + copy.setTaskCode(EntityCopyUtils.copyCode(source.getTaskCode(), 50)); + copy.setTaskName(EntityCopyUtils.copyName(source.getTaskName(), 100)); + copy.setTaskType(source.getTaskType()); + copy.setPhoneId(source.getPhoneId()); + copy.setVehicleId(source.getVehicleId()); + copy.setTestCaseCount(0); + copy.setTaskConfigId(copiedConfigId); + copy.setRemark(source.getRemark()); + copy.setCreateTime(DateUtils.getNowDate()); + copy.setCreateBy(SecurityUtils.getUsername()); + aimaTaskMapper.insertAimaTask(copy); + + List testCaseIds = aimaTaskTestCaseMapper.selectTestCasesByTaskId(id).stream() + .map(AimaTestCase::getId) + .collect(Collectors.toList()); + bindTestCases(copy.getId(), testCaseIds); + return copy.getId(); + } + @Override public int updateAimaTask(AimaTask aimaTask) { aimaTask.setUpdateTime(DateUtils.getNowDate()); diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestCaseServiceImpl.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestCaseServiceImpl.java index 9ea72ff..61fb690 100644 --- a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestCaseServiceImpl.java +++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestCaseServiceImpl.java @@ -9,6 +9,7 @@ import com.cmvr.test.service.ITeDetectionItemService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.cmvr.common.utils.DateUtils; +import com.cmvr.common.utils.EntityCopyUtils; import com.cmvr.common.utils.SecurityUtils; import com.cmvr.aima.mapper.AimaTestCaseMapper; import com.cmvr.aima.domain.AimaTestCase; @@ -87,6 +88,40 @@ public class AimaTestCaseServiceImpl extends ServiceImpl baseMaxLength) { + baseName = baseName.substring(0, baseMaxLength); + } + return baseName + COPY_NAME_SUFFIX; + } + + public static String copyCode(String sourceCode, int maxLength) { + String suffix = "_COPY_" + UUID.randomUUID().toString().replace("-", "").substring(0, 12); + String baseCode = StringUtils.isBlank(sourceCode) ? "COPY" : sourceCode; + int baseMaxLength = Math.max(0, maxLength - suffix.length()); + if (baseCode.length() > baseMaxLength) { + baseCode = baseCode.substring(0, baseMaxLength); + } + return baseCode + suffix; + } +} diff --git a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionTaskService.java b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionTaskService.java index 8f90067..aa0b348 100644 --- a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionTaskService.java +++ b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionTaskService.java @@ -38,6 +38,9 @@ public interface IInspectionTaskService extends IService */ int insertInspectionTask(InspectionTask inspectionTask); + /** Copy a task, its independent task configuration and ordered waypoint bindings. */ + String copyInspectionTask(String id); + /** * 修改巡检任务 * diff --git a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionWaypointService.java b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionWaypointService.java index 2668dce..4cbc4f3 100644 --- a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionWaypointService.java +++ b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/IInspectionWaypointService.java @@ -38,6 +38,9 @@ public interface IInspectionWaypointService extends IService */ int insertInspectionWaypoint(InspectionWaypoint inspectionWaypoint); + /** Copy a waypoint and its independent detection item. */ + String copyInspectionWaypoint(String id); + /** * 修改巡检点位 * diff --git a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionTaskServiceImpl.java b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionTaskServiceImpl.java index 614807f..9b9426e 100644 --- a/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionTaskServiceImpl.java +++ b/cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/InspectionTaskServiceImpl.java @@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.cmvr.common.utils.DateUtils; +import com.cmvr.common.utils.EntityCopyUtils; import com.cmvr.common.utils.SecurityUtils; import com.cmvr.inspection.mapper.InspectionTaskMapper; import com.cmvr.inspection.domain.InspectionTask; @@ -90,6 +91,39 @@ public class InspectionTaskServiceImpl extends ServiceImpl { */ public int insertTeDetectionItem(TeDetectionItem teDetectionItem); + /** + * Copy a detection item, including its flow and parameter configuration. + * + * @param id source detection item ID + * @return copied detection item ID + */ + String copyTeDetectionItem(String id); + /** * 修改检测项配置 * diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/service/ITeTaskConfigInfoService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/service/ITeTaskConfigInfoService.java index 6cfe84d..fdb2b80 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/service/ITeTaskConfigInfoService.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/service/ITeTaskConfigInfoService.java @@ -36,6 +36,14 @@ public interface ITeTaskConfigInfoService extends IService { */ public int insertTeTaskConfigInfo(TeTaskConfigInfo teTaskConfigInfo); + /** + * Copy a task configuration and its ordered detection-item orchestration. + * + * @param id source task configuration ID + * @return copied task configuration ID + */ + String copyTeTaskConfigInfo(String id); + /** * 修改任务流程编排 * diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeDetectionItemServiceImpl.java b/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeDetectionItemServiceImpl.java index 6365102..ad276e5 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeDetectionItemServiceImpl.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeDetectionItemServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl; import com.cmvr.common.core.domain.entity.SysGroup; +import com.cmvr.common.utils.EntityCopyUtils; import com.cmvr.test.enums.NodeTypeEnum; import com.cmvr.test.mapper.TeDetectionItemMapper; import com.cmvr.test.model.domain.TeDetectionItem; @@ -83,6 +84,30 @@ public class TeDetectionItemServiceImpl extends ServiceImpl itemIds = taskOrchestrationService.queryByTaskId(id).stream() + .map(item -> item.getItemId()) + .collect(Collectors.toList()); + if (!itemIds.isEmpty()) { + taskOrchestrationService.insertTeTaskOrchestration(TeTaskOrchestraVO.builder() + .taskId(copy.getId()) + .itemIds(itemIds) + .build()); + } + return copy.getId(); + } + /** * 修改任务流程编排 *