From 08099e2eda8550582bf665c0103572fdfe149266 Mon Sep 17 00:00:00 2001
From: lixiaolong <702156524@qq.com>
Date: Wed, 24 Jun 2026 08:47:52 +0800
Subject: [PATCH] =?UTF-8?q?feat(aima):=20=E6=B7=BB=E5=8A=A0=E7=88=B1?=
=?UTF-8?q?=E7=8E=9B=E7=94=B5=E5=8A=A8=E8=BD=A6=E6=B5=8B=E8=AF=95=E6=A8=A1?=
=?UTF-8?q?=E5=9D=97=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 在pom.xml中添加爱玛电动车测试模块依赖
- 创建爱玛电动车测试模块数据库表结构
- 实现爱玛告警管理相关实体类、控制器、服务类和映射器
- 集成爱玛测试工作流执行监听器
- 完成爱玛告警管理的CRUD操作接口
- 重构TeTaskConfigInfoServiceImpl解决循环依赖问题
---
cmvr-iot-admin/pom.xml | 6 +
.../controller/aima/AimaAlarmController.java | 75 +++++
.../controller/aima/AimaPhoneController.java | 113 +++++++
.../controller/aima/AimaTaskController.java | 98 +++++++
.../aima/AimaTaskInstanceController.java | 120 ++++++++
.../aima/AimaTestCaseController.java | 76 +++++
.../aima/AimaTestLogController.java | 75 +++++
.../aima/AimaVehicleController.java | 75 +++++
cmvr-iot-aima/pom.xml | 33 +++
.../java/com/cmvr/aima/domain/AimaAlarm.java | 118 ++++++++
.../java/com/cmvr/aima/domain/AimaPhone.java | 61 ++++
.../java/com/cmvr/aima/domain/AimaTask.java | 59 ++++
.../cmvr/aima/domain/AimaTaskInstance.java | 87 ++++++
.../cmvr/aima/domain/AimaTaskTestCase.java | 26 ++
.../com/cmvr/aima/domain/AimaTestCase.java | 79 +++++
.../com/cmvr/aima/domain/AimaTestLog.java | 102 +++++++
.../com/cmvr/aima/domain/AimaVehicle.java | 59 ++++
.../aima/domain/vo/AimaTaskInstanceVo.java | 136 +++++++++
.../com/cmvr/aima/domain/vo/AimaTaskVo.java | 77 +++++
.../cmvr/aima/domain/vo/AimaTestCaseVo.java | 100 +++++++
.../com/cmvr/aima/enums/AimaLogTypeEnum.java | 31 ++
.../cmvr/aima/enums/AimaTaskStatusEnum.java | 34 +++
.../listener/AimaFlowExecutionListener.java | 199 +++++++++++++
.../com/cmvr/aima/mapper/AimaAlarmMapper.java | 61 ++++
.../com/cmvr/aima/mapper/AimaPhoneMapper.java | 61 ++++
.../aima/mapper/AimaTaskInstanceMapper.java | 70 +++++
.../com/cmvr/aima/mapper/AimaTaskMapper.java | 70 +++++
.../aima/mapper/AimaTaskTestCaseMapper.java | 48 +++
.../cmvr/aima/mapper/AimaTestCaseMapper.java | 70 +++++
.../cmvr/aima/mapper/AimaTestLogMapper.java | 61 ++++
.../cmvr/aima/mapper/AimaVehicleMapper.java | 61 ++++
.../cmvr/aima/service/IAimaAlarmService.java | 19 ++
.../cmvr/aima/service/IAimaPhoneService.java | 60 ++++
.../service/IAimaTaskInstanceService.java | 63 ++++
.../cmvr/aima/service/IAimaTaskService.java | 38 +++
.../aima/service/IAimaTestCaseService.java | 69 +++++
.../aima/service/IAimaTestLogService.java | 19 ++
.../aima/service/IAimaVehicleService.java | 60 ++++
.../service/impl/AimaAlarmServiceImpl.java | 63 ++++
.../service/impl/AimaPhoneServiceImpl.java | 100 +++++++
.../impl/AimaTaskInstanceServiceImpl.java | 231 +++++++++++++++
.../service/impl/AimaTaskServiceImpl.java | 159 ++++++++++
.../service/impl/AimaTestCaseServiceImpl.java | 139 +++++++++
.../service/impl/AimaTestLogServiceImpl.java | 63 ++++
.../service/impl/AimaVehicleServiceImpl.java | 63 ++++
.../resources/mapper/aima/AimaAlarmMapper.xml | 84 ++++++
.../resources/mapper/aima/AimaPhoneMapper.xml | 106 +++++++
.../mapper/aima/AimaTaskInstanceMapper.xml | 116 ++++++++
.../resources/mapper/aima/AimaTaskMapper.xml | 114 ++++++++
.../mapper/aima/AimaTaskTestCaseMapper.xml | 29 ++
.../mapper/aima/AimaTestCaseMapper.xml | 167 +++++++++++
.../mapper/aima/AimaTestLogMapper.xml | 86 ++++++
.../mapper/aima/AimaVehicleMapper.xml | 102 +++++++
.../impl/TeTaskConfigInfoServiceImpl.java | 7 +-
pom.xml | 8 +
sql/aima_module.sql | 210 +++++++++++++
智能巡检模块-创建说明.md | 276 ------------------
57 files changed, 4514 insertions(+), 278 deletions(-)
create mode 100644 cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaAlarmController.java
create mode 100644 cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaPhoneController.java
create mode 100644 cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskController.java
create mode 100644 cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskInstanceController.java
create mode 100644 cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestCaseController.java
create mode 100644 cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestLogController.java
create mode 100644 cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaVehicleController.java
create mode 100644 cmvr-iot-aima/pom.xml
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaAlarm.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaPhone.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTask.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskInstance.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskTestCase.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestCase.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestLog.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaVehicle.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskInstanceVo.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskVo.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTestCaseVo.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaLogTypeEnum.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaTaskStatusEnum.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/listener/AimaFlowExecutionListener.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaAlarmMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaPhoneMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskInstanceMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskTestCaseMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestCaseMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestLogMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaVehicleMapper.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaAlarmService.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaPhoneService.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskInstanceService.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskService.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestCaseService.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestLogService.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaVehicleService.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaAlarmServiceImpl.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaPhoneServiceImpl.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskInstanceServiceImpl.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskServiceImpl.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestCaseServiceImpl.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestLogServiceImpl.java
create mode 100644 cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaVehicleServiceImpl.java
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaAlarmMapper.xml
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaPhoneMapper.xml
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskInstanceMapper.xml
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskMapper.xml
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskTestCaseMapper.xml
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestCaseMapper.xml
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestLogMapper.xml
create mode 100644 cmvr-iot-aima/src/main/resources/mapper/aima/AimaVehicleMapper.xml
create mode 100644 sql/aima_module.sql
delete mode 100644 智能巡检模块-创建说明.md
diff --git a/cmvr-iot-admin/pom.xml b/cmvr-iot-admin/pom.xml
index 17b0b2d..02c72c2 100644
--- a/cmvr-iot-admin/pom.xml
+++ b/cmvr-iot-admin/pom.xml
@@ -83,6 +83,12 @@
com.cmvr
cmvr-iot-inspection
+
+
+
+ com.cmvr
+ cmvr-iot-aima
+
dev
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaAlarmController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaAlarmController.java
new file mode 100644
index 0000000..a35c5ad
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaAlarmController.java
@@ -0,0 +1,75 @@
+package com.cmvr.web.controller.aima;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.aima.domain.AimaAlarm;
+import com.cmvr.aima.service.IAimaAlarmService;
+import com.cmvr.common.utils.poi.ExcelUtil;
+import com.cmvr.common.core.page.TableDataInfo;
+
+@RestController
+@RequestMapping("/aima/alarm")
+@Api(tags = "爱玛电动车--告警管理")
+public class AimaAlarmController extends BaseController {
+ @Autowired
+ private IAimaAlarmService aimaAlarmService;
+
+ @ApiOperation("查询告警列表")
+ @PreAuthorize("@ss.hasPermi('aima:alarm:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(AimaAlarm aimaAlarm) {
+ startPage();
+ List list = aimaAlarmService.selectAimaAlarmList(aimaAlarm);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("导出告警列表")
+ @PreAuthorize("@ss.hasPermi('aima:alarm:export')")
+ @Log(title = "告警管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, AimaAlarm aimaAlarm) {
+ List list = aimaAlarmService.selectAimaAlarmList(aimaAlarm);
+ ExcelUtil util = new ExcelUtil<>(AimaAlarm.class);
+ util.exportExcel(response, list, "告警数据");
+ }
+
+ @ApiOperation("获取告警详细信息")
+ @PreAuthorize("@ss.hasPermi('aima:alarm:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") String id) {
+ return success(aimaAlarmService.selectAimaAlarmById(id));
+ }
+
+ @ApiOperation("新增告警")
+ @PreAuthorize("@ss.hasPermi('aima:alarm:add')")
+ @Log(title = "告警管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody AimaAlarm aimaAlarm) {
+ return toAjax(aimaAlarmService.insertAimaAlarm(aimaAlarm));
+ }
+
+ @ApiOperation("修改告警")
+ @PreAuthorize("@ss.hasPermi('aima:alarm:edit')")
+ @Log(title = "告警管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody AimaAlarm aimaAlarm) {
+ return toAjax(aimaAlarmService.updateAimaAlarm(aimaAlarm));
+ }
+
+ @ApiOperation("删除告警")
+ @PreAuthorize("@ss.hasPermi('aima:alarm:remove')")
+ @Log(title = "告警管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable String[] ids) {
+ return toAjax(aimaAlarmService.deleteAimaAlarmByIds(ids));
+ }
+}
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaPhoneController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaPhoneController.java
new file mode 100644
index 0000000..5b30a35
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaPhoneController.java
@@ -0,0 +1,113 @@
+package com.cmvr.web.controller.aima;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.aima.domain.AimaPhone;
+import com.cmvr.aima.service.IAimaPhoneService;
+import com.cmvr.common.utils.poi.ExcelUtil;
+import com.cmvr.common.core.page.TableDataInfo;
+
+/**
+ * 爱玛手机管理Controller
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@RestController
+@RequestMapping("/aima/phone")
+@Api(tags = "爱玛电动车--手机管理")
+public class AimaPhoneController extends BaseController
+{
+ @Autowired
+ private IAimaPhoneService aimaPhoneService;
+
+ /**
+ * 查询爱玛手机管理列表
+ */
+ @ApiOperation("查询爱玛手机管理列表")
+ @PreAuthorize("@ss.hasPermi('aima:phone:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(AimaPhone aimaPhone)
+ {
+ startPage();
+ List list = aimaPhoneService.selectAimaPhoneList(aimaPhone);
+ return getDataTable(list);
+ }
+
+ /**
+ * 导出爱玛手机管理列表
+ */
+ @ApiOperation("导出爱玛手机管理列表")
+ @PreAuthorize("@ss.hasPermi('aima:phone:export')")
+ @Log(title = "爱玛手机管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, AimaPhone aimaPhone)
+ {
+ List list = aimaPhoneService.selectAimaPhoneList(aimaPhone);
+ ExcelUtil util = new ExcelUtil<>(AimaPhone.class);
+ util.exportExcel(response, list, "爱玛手机管理数据");
+ }
+
+ /**
+ * 获取爱玛手机管理详细信息
+ */
+ @ApiOperation("获取爱玛手机管理详细信息")
+ @PreAuthorize("@ss.hasPermi('aima:phone:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") String id)
+ {
+ return success(aimaPhoneService.selectAimaPhoneById(id));
+ }
+
+ /**
+ * 新增爱玛手机管理
+ */
+ @ApiOperation("新增爱玛手机管理")
+ @PreAuthorize("@ss.hasPermi('aima:phone:add')")
+ @Log(title = "爱玛手机管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody AimaPhone aimaPhone)
+ {
+ return toAjax(aimaPhoneService.insertAimaPhone(aimaPhone));
+ }
+
+ /**
+ * 修改爱玛手机管理
+ */
+ @ApiOperation("修改爱玛手机管理")
+ @PreAuthorize("@ss.hasPermi('aima:phone:edit')")
+ @Log(title = "爱玛手机管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody AimaPhone aimaPhone)
+ {
+ return toAjax(aimaPhoneService.updateAimaPhone(aimaPhone));
+ }
+
+ /**
+ * 删除爱玛手机管理
+ */
+ @ApiOperation("删除爱玛手机管理")
+ @PreAuthorize("@ss.hasPermi('aima:phone:remove')")
+ @Log(title = "爱玛手机管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable String[] ids)
+ {
+ return toAjax(aimaPhoneService.deleteAimaPhoneByIds(ids));
+ }
+}
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
new file mode 100644
index 0000000..ef713ee
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskController.java
@@ -0,0 +1,98 @@
+package com.cmvr.web.controller.aima;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.aima.domain.AimaTask;
+import com.cmvr.aima.domain.vo.AimaTaskVo;
+import com.cmvr.aima.service.IAimaTaskService;
+import com.cmvr.common.utils.poi.ExcelUtil;
+import com.cmvr.common.core.page.TableDataInfo;
+
+@RestController
+@RequestMapping("/aima/task")
+@Api(tags = "爱玛电动车--任务管理")
+public class AimaTaskController extends BaseController {
+ @Autowired
+ private IAimaTaskService aimaTaskService;
+
+ @ApiOperation("查询任务列表")
+ @PreAuthorize("@ss.hasPermi('aima:task:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(AimaTask aimaTask) {
+ startPage();
+ List list = aimaTaskService.selectAimaTaskVoList(aimaTask);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("导出任务列表")
+ @PreAuthorize("@ss.hasPermi('aima:task:export')")
+ @Log(title = "任务管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, AimaTask aimaTask) {
+ List list = aimaTaskService.selectAimaTaskVoList(aimaTask);
+ ExcelUtil util = new ExcelUtil<>(AimaTaskVo.class);
+ util.exportExcel(response, list, "任务数据");
+ }
+
+ @ApiOperation("获取任务详细信息")
+ @PreAuthorize("@ss.hasPermi('aima:task:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") String id) {
+ return success(aimaTaskService.selectAimaTaskById(id));
+ }
+
+ @ApiOperation("新增任务")
+ @PreAuthorize("@ss.hasPermi('aima:task:add')")
+ @Log(title = "任务管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody AimaTask aimaTask) {
+ return toAjax(aimaTaskService.insertAimaTask(aimaTask));
+ }
+
+ @ApiOperation("修改任务")
+ @PreAuthorize("@ss.hasPermi('aima:task:edit')")
+ @Log(title = "任务管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody AimaTask aimaTask) {
+ return toAjax(aimaTaskService.updateAimaTask(aimaTask));
+ }
+
+ @ApiOperation("删除任务")
+ @PreAuthorize("@ss.hasPermi('aima:task:remove')")
+ @Log(title = "任务管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable String[] ids) {
+ return toAjax(aimaTaskService.deleteAimaTaskByIds(ids));
+ }
+
+ /**
+ * 绑定测试用例到任务
+ */
+ @ApiOperation("绑定测试用例")
+ @PreAuthorize("@ss.hasPermi('aima:task:edit')")
+ @Log(title = "任务管理", businessType = BusinessType.UPDATE)
+ @PostMapping("/bindTestCases/{taskId}")
+ public AjaxResult bindTestCases(@PathVariable("taskId") String taskId, @RequestBody List testCaseIds) {
+ aimaTaskService.bindTestCases(taskId, testCaseIds);
+ return success();
+ }
+
+ /**
+ * 获取任务的测试用例列表
+ */
+ @ApiOperation("获取任务测试用例")
+ @PreAuthorize("@ss.hasPermi('aima:task:query')")
+ @GetMapping("/testCases/{taskId}")
+ public AjaxResult getTestCases(@PathVariable String taskId) {
+ return success(aimaTaskService.getTestCaseIds(taskId));
+ }
+}
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskInstanceController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskInstanceController.java
new file mode 100644
index 0000000..a831cdc
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTaskInstanceController.java
@@ -0,0 +1,120 @@
+package com.cmvr.web.controller.aima;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.aima.domain.AimaTaskInstance;
+import com.cmvr.aima.domain.vo.AimaTaskInstanceVo;
+import com.cmvr.aima.service.IAimaTaskInstanceService;
+import com.cmvr.common.utils.poi.ExcelUtil;
+import com.cmvr.common.core.page.TableDataInfo;
+
+@RestController
+@RequestMapping("/aima/taskinstance")
+@Api(tags = "爱玛电动车--任务执行实例")
+public class AimaTaskInstanceController extends BaseController {
+ @Autowired
+ private IAimaTaskInstanceService aimaTaskInstanceService;
+
+ @ApiOperation("查询任务实例列表")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(AimaTaskInstance aimaTaskInstance) {
+ startPage();
+ List list = aimaTaskInstanceService.selectAimaTaskInstanceVoList(aimaTaskInstance);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("导出任务实例列表")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:export')")
+ @Log(title = "任务执行实例", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, AimaTaskInstance aimaTaskInstance) {
+ List list = aimaTaskInstanceService.selectAimaTaskInstanceVoList(aimaTaskInstance);
+ ExcelUtil util = new ExcelUtil<>(AimaTaskInstanceVo.class);
+ util.exportExcel(response, list, "任务实例数据");
+ }
+
+ @ApiOperation("获取任务实例详细信息")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") String id) {
+ return success(aimaTaskInstanceService.selectAimaTaskInstanceById(id));
+ }
+
+ @ApiOperation("新增任务实例")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:add')")
+ @Log(title = "任务执行实例", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody AimaTaskInstance aimaTaskInstance) {
+ return toAjax(aimaTaskInstanceService.insertAimaTaskInstance(aimaTaskInstance));
+ }
+
+ @ApiOperation("修改任务实例")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:edit')")
+ @Log(title = "任务执行实例", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody AimaTaskInstance aimaTaskInstance) {
+ return toAjax(aimaTaskInstanceService.updateAimaTaskInstance(aimaTaskInstance));
+ }
+
+ @ApiOperation("删除任务实例")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:remove')")
+ @Log(title = "任务执行实例", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable String[] ids) {
+ return toAjax(aimaTaskInstanceService.deleteAimaTaskInstanceByIds(ids));
+ }
+
+ /**
+ * 开始执行任务实例
+ */
+ @ApiOperation("开始执行任务实例")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:edit')")
+ @Log(title = "任务执行实例", businessType = BusinessType.UPDATE)
+ @PutMapping("/start/{id}")
+ public AjaxResult start(@PathVariable("id") String id) {
+ return toAjax(aimaTaskInstanceService.startInstance(id));
+ }
+
+ /**
+ * 暂停任务实例
+ */
+ @ApiOperation("暂停任务实例")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:edit')")
+ @Log(title = "任务执行实例", businessType = BusinessType.UPDATE)
+ @PutMapping("/pause/{id}")
+ public AjaxResult pause(@PathVariable("id") String id) {
+ return toAjax(aimaTaskInstanceService.pauseInstance(id));
+ }
+
+ /**
+ * 终止任务实例
+ */
+ @ApiOperation("终止任务实例")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:edit')")
+ @Log(title = "任务执行实例", businessType = BusinessType.UPDATE)
+ @PutMapping("/stop/{id}")
+ public AjaxResult stop(@PathVariable("id") String id) {
+ return toAjax(aimaTaskInstanceService.stopInstance(id));
+ }
+
+ /**
+ * 恢复任务实例
+ */
+ @ApiOperation("恢复任务实例")
+ @PreAuthorize("@ss.hasPermi('aima:taskinstance:edit')")
+ @Log(title = "任务执行实例", businessType = BusinessType.UPDATE)
+ @PutMapping("/resume/{id}")
+ public AjaxResult resume(@PathVariable("id") String id) {
+ return toAjax(aimaTaskInstanceService.resumeInstance(id));
+ }
+}
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
new file mode 100644
index 0000000..8cabb2b
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestCaseController.java
@@ -0,0 +1,76 @@
+package com.cmvr.web.controller.aima;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.aima.domain.AimaTestCase;
+import com.cmvr.aima.domain.vo.AimaTestCaseVo;
+import com.cmvr.aima.service.IAimaTestCaseService;
+import com.cmvr.common.utils.poi.ExcelUtil;
+import com.cmvr.common.core.page.TableDataInfo;
+
+@RestController
+@RequestMapping("/aima/testcase")
+@Api(tags = "爱玛电动车--测试用例管理")
+public class AimaTestCaseController extends BaseController {
+ @Autowired
+ private IAimaTestCaseService aimaTestCaseService;
+
+ @ApiOperation("查询测试用例列表")
+ @PreAuthorize("@ss.hasPermi('aima:testcase:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(AimaTestCase aimaTestCase) {
+ startPage();
+ List list = aimaTestCaseService.selectAimaTestCaseVoList(aimaTestCase);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("导出测试用例列表")
+ @PreAuthorize("@ss.hasPermi('aima:testcase:export')")
+ @Log(title = "测试用例管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, AimaTestCase aimaTestCase) {
+ List list = aimaTestCaseService.selectAimaTestCaseVoList(aimaTestCase);
+ ExcelUtil util = new ExcelUtil<>(AimaTestCaseVo.class);
+ util.exportExcel(response, list, "测试用例数据");
+ }
+
+ @ApiOperation("获取测试用例详细信息")
+ @PreAuthorize("@ss.hasPermi('aima:testcase:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") String id) {
+ return success(aimaTestCaseService.selectAimaTestCaseById(id));
+ }
+
+ @ApiOperation("新增测试用例")
+ @PreAuthorize("@ss.hasPermi('aima:testcase:add')")
+ @Log(title = "测试用例管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody AimaTestCase aimaTestCase) {
+ return toAjax(aimaTestCaseService.insertAimaTestCase(aimaTestCase));
+ }
+
+ @ApiOperation("修改测试用例")
+ @PreAuthorize("@ss.hasPermi('aima:testcase:edit')")
+ @Log(title = "测试用例管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody AimaTestCase aimaTestCase) {
+ return toAjax(aimaTestCaseService.updateAimaTestCase(aimaTestCase));
+ }
+
+ @ApiOperation("删除测试用例")
+ @PreAuthorize("@ss.hasPermi('aima:testcase:remove')")
+ @Log(title = "测试用例管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable String[] ids) {
+ return toAjax(aimaTestCaseService.deleteAimaTestCaseByIds(ids));
+ }
+}
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestLogController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestLogController.java
new file mode 100644
index 0000000..1829f46
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaTestLogController.java
@@ -0,0 +1,75 @@
+package com.cmvr.web.controller.aima;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.aima.domain.AimaTestLog;
+import com.cmvr.aima.service.IAimaTestLogService;
+import com.cmvr.common.utils.poi.ExcelUtil;
+import com.cmvr.common.core.page.TableDataInfo;
+
+@RestController
+@RequestMapping("/aima/testlog")
+@Api(tags = "爱玛电动车--测试日志管理")
+public class AimaTestLogController extends BaseController {
+ @Autowired
+ private IAimaTestLogService aimaTestLogService;
+
+ @ApiOperation("查询测试日志列表")
+ @PreAuthorize("@ss.hasPermi('aima:testlog:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(AimaTestLog aimaTestLog) {
+ startPage();
+ List list = aimaTestLogService.selectAimaTestLogList(aimaTestLog);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("导出测试日志列表")
+ @PreAuthorize("@ss.hasPermi('aima:testlog:export')")
+ @Log(title = "测试日志管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, AimaTestLog aimaTestLog) {
+ List list = aimaTestLogService.selectAimaTestLogList(aimaTestLog);
+ ExcelUtil util = new ExcelUtil<>(AimaTestLog.class);
+ util.exportExcel(response, list, "测试日志数据");
+ }
+
+ @ApiOperation("获取测试日志详细信息")
+ @PreAuthorize("@ss.hasPermi('aima:testlog:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") String id) {
+ return success(aimaTestLogService.selectAimaTestLogById(id));
+ }
+
+ @ApiOperation("新增测试日志")
+ @PreAuthorize("@ss.hasPermi('aima:testlog:add')")
+ @Log(title = "测试日志管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody AimaTestLog aimaTestLog) {
+ return toAjax(aimaTestLogService.insertAimaTestLog(aimaTestLog));
+ }
+
+ @ApiOperation("修改测试日志")
+ @PreAuthorize("@ss.hasPermi('aima:testlog:edit')")
+ @Log(title = "测试日志管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody AimaTestLog aimaTestLog) {
+ return toAjax(aimaTestLogService.updateAimaTestLog(aimaTestLog));
+ }
+
+ @ApiOperation("删除测试日志")
+ @PreAuthorize("@ss.hasPermi('aima:testlog:remove')")
+ @Log(title = "测试日志管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable String[] ids) {
+ return toAjax(aimaTestLogService.deleteAimaTestLogByIds(ids));
+ }
+}
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaVehicleController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaVehicleController.java
new file mode 100644
index 0000000..15297f7
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/aima/AimaVehicleController.java
@@ -0,0 +1,75 @@
+package com.cmvr.web.controller.aima;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.aima.domain.AimaVehicle;
+import com.cmvr.aima.service.IAimaVehicleService;
+import com.cmvr.common.utils.poi.ExcelUtil;
+import com.cmvr.common.core.page.TableDataInfo;
+
+@RestController
+@RequestMapping("/aima/vehicle")
+@Api(tags = "爱玛电动车--车辆管理")
+public class AimaVehicleController extends BaseController {
+ @Autowired
+ private IAimaVehicleService aimaVehicleService;
+
+ @ApiOperation("查询车辆列表")
+ @PreAuthorize("@ss.hasPermi('aima:vehicle:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(AimaVehicle aimaVehicle) {
+ startPage();
+ List list = aimaVehicleService.selectAimaVehicleList(aimaVehicle);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("导出车辆列表")
+ @PreAuthorize("@ss.hasPermi('aima:vehicle:export')")
+ @Log(title = "车辆管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(HttpServletResponse response, AimaVehicle aimaVehicle) {
+ List list = aimaVehicleService.selectAimaVehicleList(aimaVehicle);
+ ExcelUtil util = new ExcelUtil<>(AimaVehicle.class);
+ util.exportExcel(response, list, "车辆数据");
+ }
+
+ @ApiOperation("获取车辆详细信息")
+ @PreAuthorize("@ss.hasPermi('aima:vehicle:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") String id) {
+ return success(aimaVehicleService.selectAimaVehicleById(id));
+ }
+
+ @ApiOperation("新增车辆")
+ @PreAuthorize("@ss.hasPermi('aima:vehicle:add')")
+ @Log(title = "车辆管理", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody AimaVehicle aimaVehicle) {
+ return toAjax(aimaVehicleService.insertAimaVehicle(aimaVehicle));
+ }
+
+ @ApiOperation("修改车辆")
+ @PreAuthorize("@ss.hasPermi('aima:vehicle:edit')")
+ @Log(title = "车辆管理", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody AimaVehicle aimaVehicle) {
+ return toAjax(aimaVehicleService.updateAimaVehicle(aimaVehicle));
+ }
+
+ @ApiOperation("删除车辆")
+ @PreAuthorize("@ss.hasPermi('aima:vehicle:remove')")
+ @Log(title = "车辆管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable String[] ids) {
+ return toAjax(aimaVehicleService.deleteAimaVehicleByIds(ids));
+ }
+}
diff --git a/cmvr-iot-aima/pom.xml b/cmvr-iot-aima/pom.xml
new file mode 100644
index 0000000..93a13e6
--- /dev/null
+++ b/cmvr-iot-aima/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+
+ com.cmvr
+ cmvr-iot
+ 3.8.9
+
+
+ cmvr-iot-aima
+
+
+ 爱玛电动车测试模块
+
+
+
+
+
+
+ com.cmvr
+ cmvr-iot-common
+
+
+
+
+ com.cmvr
+ cmvr-iot-test
+
+
+
+
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaAlarm.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaAlarm.java
new file mode 100644
index 0000000..79d5166
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaAlarm.java
@@ -0,0 +1,118 @@
+package com.cmvr.aima.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 爱玛告警管理对象 aima_alarm
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛告警管理")
+public class AimaAlarm extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @Excel(name = "告警编码")
+ @ApiModelProperty("告警编码")
+ private String alarmCode;
+
+ @Excel(name = "任务执行实例ID")
+ @ApiModelProperty("任务执行实例ID")
+ private String taskInstanceId;
+
+ @Excel(name = "任务ID")
+ @ApiModelProperty("任务ID")
+ private String taskId;
+
+ @Excel(name = "任务名称")
+ @ApiModelProperty("任务名称")
+ private String taskName;
+
+ @Excel(name = "手机ID")
+ @ApiModelProperty("手机ID")
+ private String phoneId;
+
+ @Excel(name = "手机名称")
+ @ApiModelProperty("手机名称")
+ private String phoneName;
+
+ @Excel(name = "车辆ID")
+ @ApiModelProperty("车辆ID")
+ private String vehicleId;
+
+ @Excel(name = "车架号")
+ @ApiModelProperty("车架号")
+ private String vin;
+
+ @Excel(name = "测试用例ID")
+ @ApiModelProperty("测试用例ID")
+ private String testCaseId;
+
+ @Excel(name = "用例名称")
+ @ApiModelProperty("用例名称")
+ private String caseName;
+
+ @Excel(name = "告警级别")
+ @ApiModelProperty("告警级别(1提示 2警告 3严重)")
+ private String alarmLevel;
+
+ @Excel(name = "告警类型")
+ @ApiModelProperty("告警类型(1设备异常 2测试异常 3通信异常 4性能异常)")
+ private String alarmType;
+
+ @Excel(name = "告警标题")
+ @ApiModelProperty("告警标题")
+ private String alarmTitle;
+
+ @Excel(name = "告警内容")
+ @ApiModelProperty("告警内容")
+ private String alarmContent;
+
+ @Excel(name = "告警位置")
+ @ApiModelProperty("告警位置/步骤")
+ private String alarmLocation;
+
+ @Excel(name = "告警时间")
+ @ApiModelProperty("告警时间")
+ private Date alarmTime;
+
+ @Excel(name = "处理状态")
+ @ApiModelProperty("处理状态(0未处理 1处理中 2已处理 3已忽略)")
+ private String handleStatus;
+
+ @Excel(name = "处理人")
+ @ApiModelProperty("处理人")
+ private String handler;
+
+ @Excel(name = "处理时间")
+ @ApiModelProperty("处理时间")
+ private Date handleTime;
+
+ @Excel(name = "处理说明")
+ @ApiModelProperty("处理说明")
+ private String handleRemark;
+
+ @ApiModelProperty("图片证据")
+ private String evidenceImage;
+
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaPhone.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaPhone.java
new file mode 100644
index 0000000..f1ea217
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaPhone.java
@@ -0,0 +1,61 @@
+package com.cmvr.aima.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+
+/**
+ * 爱玛手机管理对象 aima_phone
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛手机管理")
+public class AimaPhone extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @Excel(name = "手机名称")
+ @ApiModelProperty("手机名称")
+ private String phoneName;
+
+ @Excel(name = "手机型号")
+ @ApiModelProperty("手机型号")
+ private String phoneModel;
+
+ @Excel(name = "操作系统")
+ @ApiModelProperty("操作系统(Android/iOS)")
+ private String osSystem;
+
+ @Excel(name = "系统版本")
+ @ApiModelProperty("系统版本")
+ private String osVersion;
+
+ @Excel(name = "规格参数")
+ @ApiModelProperty("规格参数")
+ private String specifications;
+
+ @Excel(name = "厂商")
+ @ApiModelProperty("厂商")
+ private String manufacturer;
+
+ @Excel(name = "状态")
+ @ApiModelProperty("状态(0正常 1停用)")
+ private String status;
+
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTask.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTask.java
new file mode 100644
index 0000000..3a40dd6
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTask.java
@@ -0,0 +1,59 @@
+package com.cmvr.aima.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+
+/**
+ * 爱玛任务管理对象 aima_task
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛任务管理")
+public class AimaTask extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @Excel(name = "任务编码")
+ @ApiModelProperty("任务编码")
+ private String taskCode;
+
+ @Excel(name = "任务名称")
+ @ApiModelProperty("任务名称")
+ private String taskName;
+
+ @Excel(name = "任务类型")
+ @ApiModelProperty("任务类型(1常规测试 2回归测试 3专项测试)")
+ private String taskType;
+
+ @ApiModelProperty("手机ID")
+ private String phoneId;
+
+ @ApiModelProperty("车辆ID")
+ private String vehicleId;
+
+ @Excel(name = "测试用例数量")
+ @ApiModelProperty("测试用例数量")
+ private Integer testCaseCount;
+
+ /** 任务配置id(关联test模块) */
+ @ApiModelProperty("任务配置id")
+ private String taskConfigId;
+
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskInstance.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskInstance.java
new file mode 100644
index 0000000..a70e974
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskInstance.java
@@ -0,0 +1,87 @@
+package com.cmvr.aima.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 爱玛任务执行实例对象 aima_task_instance
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛任务执行实例")
+public class AimaTaskInstance extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @Excel(name = "任务ID")
+ @ApiModelProperty("任务ID")
+ private String taskId;
+
+ @Excel(name = "手机ID")
+ @ApiModelProperty("手机ID")
+ private String phoneId;
+
+ @Excel(name = "车辆ID")
+ @ApiModelProperty("车辆ID")
+ private String vehicleId;
+
+ @Excel(name = "第几次执行")
+ @ApiModelProperty("第几次执行")
+ private Integer executionNumber;
+
+ @Excel(name = "执行状态")
+ @ApiModelProperty("执行状态(0待执行 1执行中 2已完成 3已取消 4执行失败 5已暂停)")
+ private Integer status;
+
+ /** 流程实例id(关联test模块) */
+ @ApiModelProperty("流程实例id")
+ private String taskInsId;
+
+ @Excel(name = "总用例数")
+ @ApiModelProperty("总用例数")
+ private Integer totalCases;
+
+ @Excel(name = "已完成用例数")
+ @ApiModelProperty("已完成用例数")
+ private Integer completedCases;
+
+ @Excel(name = "通过用例数")
+ @ApiModelProperty("通过用例数")
+ private Integer passedCases;
+
+ @Excel(name = "失败用例数")
+ @ApiModelProperty("失败用例数")
+ private Integer failedCases;
+
+ @Excel(name = "执行进度")
+ @ApiModelProperty("执行进度(百分比,保留2位小数)")
+ private Double progress;
+
+ @Excel(name = "开始时间")
+ @ApiModelProperty("开始时间")
+ private Date startTime;
+
+ @Excel(name = "结束时间")
+ @ApiModelProperty("结束时间")
+ private Date endTime;
+
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskTestCase.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskTestCase.java
new file mode 100644
index 0000000..aaeb162
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTaskTestCase.java
@@ -0,0 +1,26 @@
+package com.cmvr.aima.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 爱玛任务与测试用例关联对象 aima_task_test_case
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class AimaTaskTestCase
+{
+ /** 任务ID */
+ private String taskId;
+
+ /** 测试用例ID */
+ private String testCaseId;
+
+ /** 排序号 */
+ private Integer sortOrder;
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestCase.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestCase.java
new file mode 100644
index 0000000..51e0f30
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestCase.java
@@ -0,0 +1,79 @@
+package com.cmvr.aima.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+
+/**
+ * 爱玛测试用例对象 aima_test_case
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Builder
+@ApiModel("爱玛测试用例")
+public class AimaTestCase extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @Excel(name = "用例编码")
+ @ApiModelProperty("用例编码")
+ private String caseCode;
+
+ @Excel(name = "用例名称")
+ @ApiModelProperty("用例名称")
+ private String caseName;
+
+ @Excel(name = "用例分类")
+ @ApiModelProperty("用例分类(功能测试/性能测试/安全测试等)")
+ private String caseCategory;
+
+ @Excel(name = "测试描述")
+ @ApiModelProperty("测试描述")
+ private String testDescription;
+
+ @Excel(name = "前置条件")
+ @ApiModelProperty("前置条件")
+ private String precondition;
+
+ @Excel(name = "测试步骤")
+ @ApiModelProperty("测试步骤")
+ private String testSteps;
+
+ @Excel(name = "预期结果")
+ @ApiModelProperty("预期结果")
+ private String expectedResult;
+
+ @Excel(name = "优先级")
+ @ApiModelProperty("优先级(1高 2中 3低)")
+ private String priority;
+
+ @Excel(name = "是否启用")
+ @ApiModelProperty("是否启用(0启用 1禁用)")
+ private String enabled;
+
+ @Excel(name = "排序号")
+ @ApiModelProperty("排序号")
+ private Integer sortOrder;
+
+ @Excel(name = "预计执行时长")
+ @ApiModelProperty("预计执行时长(秒)")
+ private Integer estimatedDuration;
+
+ /** 检测项配置id(关联test模块) */
+ @ApiModelProperty("检测项配置id")
+ private String detectItemId;
+
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestLog.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestLog.java
new file mode 100644
index 0000000..1d98ed4
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaTestLog.java
@@ -0,0 +1,102 @@
+package com.cmvr.aima.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 爱玛测试日志对象 aima_test_log
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛测试日志")
+@Builder
+public class AimaTestLog extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @Excel(name = "任务执行实例ID")
+ @ApiModelProperty("任务执行实例ID")
+ private String taskInstanceId;
+
+ @Excel(name = "任务ID")
+ @ApiModelProperty("任务ID")
+ private String taskId;
+
+ @Excel(name = "任务名称")
+ @ApiModelProperty("任务名称")
+ private String taskName;
+
+ @Excel(name = "测试用例ID")
+ @ApiModelProperty("测试用例ID")
+ private String testCaseId;
+
+ @Excel(name = "用例名称")
+ @ApiModelProperty("用例名称")
+ private String caseName;
+
+ @Excel(name = "日志级别")
+ @ApiModelProperty("日志级别(DEBUG/INFO/WARN/ERROR)")
+ private String logLevel;
+
+ @Excel(name = "日志类型")
+ @ApiModelProperty("日志类型(执行日志/系统日志/异常日志)")
+ private String logType;
+
+ @Excel(name = "日志内容")
+ @ApiModelProperty("日志内容")
+ private String logMessage;
+
+ @Excel(name = "日志时间")
+ @ApiModelProperty("日志时间")
+ private Date logTime;
+
+ @Excel(name = "执行步骤")
+ @ApiModelProperty("执行步骤")
+ private String executionStep;
+
+ @Excel(name = "实际结果")
+ @ApiModelProperty("实际结果")
+ private String actualResult;
+
+ @Excel(name = "测试结果")
+ @ApiModelProperty("测试结果(0未执行 1通过 2失败 3跳过)")
+ private String testStatus;
+
+ @ApiModelProperty("截图URL")
+ private String screenshotUrl;
+
+ @ApiModelProperty("视频URL")
+ private String videoUrl;
+
+ @ApiModelProperty("错误堆栈")
+ private String errorStack;
+
+ @Excel(name = "执行耗时")
+ @ApiModelProperty("执行耗时(毫秒)")
+ private Long durationMs;
+
+ @Excel(name = "进度")
+ @ApiModelProperty("执行进度(百分比)")
+ private Double progress;
+
+ @Excel(name = "状态")
+ @ApiModelProperty("执行状态(0待执行 1执行中 2已完成 3已取消 4执行失败 5已暂停)")
+ private Integer status;
+
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaVehicle.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaVehicle.java
new file mode 100644
index 0000000..4789a4e
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/AimaVehicle.java
@@ -0,0 +1,59 @@
+package com.cmvr.aima.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 爱玛车辆管理对象 aima_vehicle
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛车辆管理")
+public class AimaVehicle extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty("主键ID")
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ private String id;
+
+ @Excel(name = "车架号")
+ @ApiModelProperty("车架号(VIN)")
+ private String vin;
+
+ @Excel(name = "车型")
+ @ApiModelProperty("车型")
+ private String vehicleModel;
+
+ @Excel(name = "车辆名称")
+ @ApiModelProperty("车辆名称")
+ private String vehicleName;
+
+ @Excel(name = "颜色")
+ @ApiModelProperty("颜色")
+ private String color;
+
+ @Excel(name = "生产日期")
+ @ApiModelProperty("生产日期")
+ private Date productionDate;
+
+ @Excel(name = "状态")
+ @ApiModelProperty("状态(0正常 1停用)")
+ private String status;
+
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskInstanceVo.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskInstanceVo.java
new file mode 100644
index 0000000..a34483b
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskInstanceVo.java
@@ -0,0 +1,136 @@
+package com.cmvr.aima.domain.vo;
+
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * 爱玛任务执行实例视图对象(包含关联信息)
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛任务执行实例视图对象")
+public class
+
+
+
+
+
+
+AimaTaskInstanceVo extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** id */
+ @ApiModelProperty("id")
+ private String id;
+
+ /** 任务ID */
+ @Excel(name = "任务ID")
+ @ApiModelProperty("任务ID")
+ private String taskId;
+
+ /** 任务名称 */
+ @Excel(name = "任务名称")
+ @ApiModelProperty("任务名称")
+ private String taskName;
+
+ /** 任务编码 */
+ @Excel(name = "任务编码")
+ @ApiModelProperty("任务编码")
+ private String taskCode;
+
+ /** 手机ID */
+ @ApiModelProperty("手机ID")
+ private String phoneId;
+
+ /** 手机名称 */
+ @Excel(name = "手机名称")
+ @ApiModelProperty("手机名称")
+ private String phoneName;
+
+ /** 车辆ID */
+ @ApiModelProperty("车辆ID")
+ private String vehicleId;
+
+ /** 车辆名称 */
+ @Excel(name = "车辆名称")
+ @ApiModelProperty("车辆名称")
+ private String vehicleName;
+
+ /** 车架号 */
+ @Excel(name = "车架号")
+ @ApiModelProperty("车架号")
+ private String vin;
+
+ /** 第几次执行 */
+ @Excel(name = "执行次数")
+ @ApiModelProperty("第几次执行")
+ private Integer executionNumber;
+
+ /** 执行状态 */
+ @Excel(name = "执行状态")
+ @ApiModelProperty("执行状态(0待执行 1执行中 2已完成 3已取消 4执行失败 5已暂停)")
+ private Integer status;
+
+ /** 流程实例id */
+ @ApiModelProperty("流程实例id")
+ private String taskInsId;
+
+ /** 总用例数 */
+ @Excel(name = "总用例数")
+ @ApiModelProperty("总用例数")
+ private Integer totalCases;
+
+ /** 已完成用例数 */
+ @Excel(name = "已完成")
+ @ApiModelProperty("已完成用例数")
+ private Integer completedCases;
+
+ /** 通过用例数 */
+ @Excel(name = "通过数")
+ @ApiModelProperty("通过用例数")
+ private Integer passedCases;
+
+ /** 失败用例数 */
+ @Excel(name = "失败数")
+ @ApiModelProperty("失败用例数")
+ private Integer failedCases;
+
+ /** 执行进度 */
+ @Excel(name = "执行进度")
+ @ApiModelProperty("执行进度(百分比,保留2位小数)")
+ private Double progress;
+
+ /** 开始时间 */
+ @Excel(name = "开始时间", dateFormat = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("开始时间")
+ private Date startTime;
+
+ /** 结束时间 */
+ @Excel(name = "结束时间", dateFormat = "yyyy-MM-dd HH:mm:ss")
+ @ApiModelProperty("结束时间")
+ private Date endTime;
+
+ /** 创建人昵称 */
+ @Excel(name = "创建人昵称")
+ @ApiModelProperty("创建人昵称")
+ private String createByName;
+
+ /** 修改人昵称 */
+ @Excel(name = "修改人昵称")
+ @ApiModelProperty("修改人昵称")
+ private String updateByName;
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskVo.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskVo.java
new file mode 100644
index 0000000..e66b118
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTaskVo.java
@@ -0,0 +1,77 @@
+package com.cmvr.aima.domain.vo;
+
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * 爱玛任务视图对象(包含关联信息)
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛任务视图对象")
+public class AimaTaskVo extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** id */
+ @ApiModelProperty("id")
+ private String id;
+
+ /** 任务编码 */
+ @Excel(name = "任务编码")
+ @ApiModelProperty("任务编码")
+ private String taskCode;
+
+ /** 任务名称 */
+ @Excel(name = "任务名称")
+ @ApiModelProperty("任务名称")
+ private String taskName;
+
+ /** 任务类型 */
+ @Excel(name = "任务类型")
+ @ApiModelProperty("任务类型(1常规测试 2回归测试 3专项测试)")
+ private String taskType;
+
+ /** 手机ID */
+ @ApiModelProperty("手机ID")
+ private String phoneId;
+
+ /** 手机名称 */
+ @Excel(name = "手机名称")
+ @ApiModelProperty("手机名称")
+ private String phoneName;
+
+ /** 车辆ID */
+ @ApiModelProperty("车辆ID")
+ private String vehicleId;
+
+ /** 测试用例数量 */
+ @Excel(name = "测试用例数量")
+ @ApiModelProperty("测试用例数量")
+ private Integer testCaseCount;
+
+ /** 任务配置id */
+ @ApiModelProperty("任务配置id")
+ private String taskConfigId;
+
+ /** 创建人昵称 */
+ @Excel(name = "创建人昵称")
+ @ApiModelProperty("创建人昵称")
+ private String createByName;
+
+ /** 修改人昵称 */
+ @Excel(name = "修改人昵称")
+ @ApiModelProperty("修改人昵称")
+ private String updateByName;
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTestCaseVo.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTestCaseVo.java
new file mode 100644
index 0000000..447374d
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/domain/vo/AimaTestCaseVo.java
@@ -0,0 +1,100 @@
+package com.cmvr.aima.domain.vo;
+
+import com.cmvr.common.annotation.Excel;
+import com.cmvr.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * 爱玛测试用例视图对象(包含关联信息)
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("爱玛测试用例视图对象")
+public class AimaTestCaseVo extends BaseEntity
+{
+ private static final long serialVersionUID = 1L;
+
+ /** id */
+ @ApiModelProperty("id")
+ private String id;
+
+ /** 用例编码 */
+ @Excel(name = "用例编码")
+ @ApiModelProperty("用例编码")
+ private String caseCode;
+
+ /** 用例名称 */
+ @Excel(name = "用例名称")
+ @ApiModelProperty("用例名称")
+ private String caseName;
+
+ /** 用例分类 */
+ @Excel(name = "用例分类")
+ @ApiModelProperty("用例分类(功能测试/性能测试/安全测试等)")
+ private String caseCategory;
+
+ /** 测试描述 */
+ @ApiModelProperty("测试描述")
+ private String testDescription;
+
+ /** 前置条件 */
+ @ApiModelProperty("前置条件")
+ private String precondition;
+
+ /** 测试步骤 */
+ @ApiModelProperty("测试步骤")
+ private String testSteps;
+
+ /** 预期结果 */
+ @ApiModelProperty("预期结果")
+ private String expectedResult;
+
+ /** 优先级 */
+ @Excel(name = "优先级")
+ @ApiModelProperty("优先级(1高 2中 3低)")
+ private String priority;
+
+ /** 是否启用 */
+ @Excel(name = "是否启用")
+ @ApiModelProperty("是否启用(0启用 1禁用)")
+ private String enabled;
+
+ /** 排序号 */
+ @Excel(name = "排序号")
+ @ApiModelProperty("排序号")
+ private Integer sortOrder;
+
+ /** 预计执行时长 */
+ @Excel(name = "预计执行时长")
+ @ApiModelProperty("预计执行时长(秒)")
+ private Integer estimatedDuration;
+
+ /** 检测项配置id */
+ @ApiModelProperty("检测项配置id")
+ private String detectItemId;
+
+ /** 配置状态 */
+ @Excel(name = "配置状态")
+ @ApiModelProperty("配置状态(0未部署 1已部署)")
+ private String configStatus;
+
+ /** 创建人昵称 */
+ @Excel(name = "创建人昵称")
+ @ApiModelProperty("创建人昵称")
+ private String createByName;
+
+ /** 修改人昵称 */
+ @Excel(name = "修改人昵称")
+ @ApiModelProperty("修改人昵称")
+ private String updateByName;
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaLogTypeEnum.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaLogTypeEnum.java
new file mode 100644
index 0000000..bf0fb97
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaLogTypeEnum.java
@@ -0,0 +1,31 @@
+package com.cmvr.aima.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 爱玛测试日志类型枚举
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Getter
+@AllArgsConstructor
+public enum AimaLogTypeEnum {
+ TEXT(1, "文字"),
+ IMAGE(2, "图片"),
+ VIDEO(3, "视频"),
+ AUDIO(4, "音频");
+
+ private final int code;
+ private final String desc;
+
+ public static AimaLogTypeEnum fromCode(int code) {
+ for (AimaLogTypeEnum type : values()) {
+ if (type.code == code) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaTaskStatusEnum.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaTaskStatusEnum.java
new file mode 100644
index 0000000..926e26e
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/enums/AimaTaskStatusEnum.java
@@ -0,0 +1,34 @@
+package com.cmvr.aima.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 爱玛任务状态枚举
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Getter
+@AllArgsConstructor
+public enum AimaTaskStatusEnum {
+ // 未执行
+ NOT_STARTED(5, "未执行"),
+ SUCCESS(0, "已完成"),
+ RUNNING(1, "执行中"),
+ FAILED(2, "失败"),
+ PAUSED(3, "已暂停"),
+ STOPPED(4, "已终止");
+
+ private final int code;
+ private final String desc;
+
+ public static AimaTaskStatusEnum fromCode(int code) {
+ for (AimaTaskStatusEnum status : values()) {
+ if (status.code == code) {
+ return status;
+ }
+ }
+ return null;
+ }
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/listener/AimaFlowExecutionListener.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/listener/AimaFlowExecutionListener.java
new file mode 100644
index 0000000..f5c2c6a
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/listener/AimaFlowExecutionListener.java
@@ -0,0 +1,199 @@
+package com.cmvr.aima.listener;
+
+import cn.hutool.core.util.StrUtil;
+import com.cmvr.common.utils.DateUtils;
+import com.cmvr.framework.websocket.service.MessagePushService;
+import com.cmvr.aima.domain.AimaTaskInstance;
+import com.cmvr.aima.domain.AimaTestLog;
+import com.cmvr.aima.enums.AimaTaskStatusEnum;
+import com.cmvr.aima.service.IAimaTaskInstanceService;
+import com.cmvr.aima.service.IAimaTestLogService;
+import com.cmvr.test.flow.runtime.event.FlowExecutionEvent;
+import com.cmvr.test.flow.runtime.event.FlowExecutionListener;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 爱玛测试工作流执行监听器
+ * 监听流程引擎事件,自动记录测试日志和更新任务状态
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Component
+@Slf4j
+public class AimaFlowExecutionListener implements FlowExecutionListener {
+ private final IAimaTaskInstanceService aimaTaskInstanceService;
+ private final IAimaTestLogService aimaTestLogService;
+ private final MessagePushService messagePushService;
+
+ /** key:itemId, value:已完成节点集合 */
+ private final Map> itemNodeExecutMap = new HashMap<>();
+ /** key:taskInsId(流程实例id), value:已执行item集合 */
+ private final Map> taskItemExecutMap = new HashMap<>();
+
+ public AimaFlowExecutionListener(IAimaTaskInstanceService aimaTaskInstanceService,
+ IAimaTestLogService aimaTestLogService,
+ MessagePushService messagePushService) {
+ this.aimaTaskInstanceService = aimaTaskInstanceService;
+ this.aimaTestLogService = aimaTestLogService;
+ this.messagePushService = messagePushService;
+ }
+
+ @Override
+ public void onEvent(FlowExecutionEvent event) {
+ String instId = event.getInstId();
+ String itemId = event.getItemId();
+ String nodeId = event.getNodeId();
+ if (StrUtil.isBlank(instId)) {
+ return;
+ }
+
+ // 1.节点完成才记录当前item下node
+ if (StrUtil.isNotBlank(itemId) && StrUtil.isNotBlank(nodeId)
+ && FlowExecutionEvent.EventType.NODE_COMPLETED == event.getEventType()) {
+ itemNodeExecutMap.computeIfAbsent(itemId, k -> new HashSet<>()).add(nodeId);
+ }
+ // 任意事件:当前任务绑定item(item一启动就入Map)
+ if (StrUtil.isNotBlank(instId) && StrUtil.isNotBlank(itemId)) {
+ taskItemExecutMap.computeIfAbsent(instId, k -> new HashSet<>()).add(itemId);
+ }
+
+ // 查询任务实例
+ AimaTaskInstance taskInstance = aimaTaskInstanceService.lambdaQuery()
+ .eq(AimaTaskInstance::getTaskInsId, instId)
+ .one();
+ if (taskInstance == null) {
+ log.warn("未查询到爱玛测试实例,taskInsId:{}", instId);
+ return;
+ }
+
+ int targetStatus = AimaTaskStatusEnum.RUNNING.getCode();
+ boolean needUpdateDb = false;
+ Date now = DateUtils.getNowDate();
+
+ switch (event.getEventType()) {
+ case TASK_COMPLETED:
+ targetStatus = AimaTaskStatusEnum.SUCCESS.getCode();
+ needUpdateDb = true;
+ clearCache(instId);
+ pushCompleteMsg(taskInstance.getId(), now, targetStatus);
+ break;
+ case TASK_FAILED:
+ targetStatus = AimaTaskStatusEnum.FAILED.getCode();
+ needUpdateDb = true;
+ clearCache(instId);
+ break;
+ case NODE_COMPLETED:
+ default:
+ break;
+ }
+
+ if (needUpdateDb) {
+ taskInstance.setStatus(targetStatus);
+ taskInstance.setEndTime(now);
+ aimaTaskInstanceService.updateById(taskInstance);
+ }
+
+ // 节点推送 - 记录日志
+ if (StrUtil.isNotBlank(nodeId)) {
+ int totalCases = taskInstance.getTotalCases() == null ? 0 : taskInstance.getTotalCases();
+ double progress = 0D;
+ if (totalCases > 0) {
+ // 当前任务已执行item数量
+ Set itemSet = taskItemExecutMap.getOrDefault(instId, new HashSet<>());
+ int itemTotal = itemSet.size();
+ int finishedItemNum = itemTotal - 1;
+
+ // 当前item已完成节点数
+ Set finishedNodeSet = itemNodeExecutMap.getOrDefault(itemId, new HashSet<>());
+ int finishedNode = finishedNodeSet.size();
+ int totalNode = event.getNodeCount() == 0 ? 1 : event.getNodeCount();
+
+ // 已完整跑完用例占比
+ double itemTotalRatio = finishedItemNum / (double) totalCases;
+ // 当前运行item内部节点占比
+ double innerRatio = finishedNode / (double) totalNode / totalCases;
+
+ // 防止循环节点进度超限
+ double singleItemBase = 1d / totalCases;
+ innerRatio = Math.max(singleItemBase - 0.01, innerRatio);
+
+ progress = (itemTotalRatio + innerRatio) * 100;
+ }
+
+ String info = event.getEventType() == FlowExecutionEvent.EventType.NODE_STARTED ? "开始执行" : "执行完成";
+ String logId = UUID.randomUUID().toString().replace("-", "");
+ // 四舍五入保留2位小数
+ progress = Math.round(progress * 100) / 100.0;
+
+ // 保存日志到数据库
+ AimaTestLog testLog = AimaTestLog.builder()
+ .id(logId)
+ .taskInstanceId(taskInstance.getId())
+ .taskId(taskInstance.getTaskId())
+ .testCaseId(itemId)
+ .logLevel("INFO")
+ .logType("执行日志")
+ .logMessage("节点【" + event.getNodeName() + "】" + info)
+ .logTime(now)
+ .executionStep(event.getNodeName())
+ .testStatus("0") // 0未执行
+ .durationMs(0L)
+ .progress( progress)
+ .build();
+
+ try {
+ aimaTestLogService.insertAimaTestLog(testLog);
+ log.info("爱玛测试日志保存成功,logId:{},taskInstanceId:{},nodeId:{}", logId, taskInstance.getId(), nodeId);
+ } catch (Exception e) {
+ log.error("爱玛测试日志保存失败,taskInstanceId:{},nodeId:{}", taskInstance.getId(), nodeId, e);
+ }
+
+ try {
+ messagePushService.pushToChannel("AimaTaskInstance", testLog);
+ } catch (Exception e) {
+ log.info("消息推送异常,无订阅忽略,itemId:{}", itemId, e);
+ }
+ }
+ }
+
+ /** 任务结束统一清理缓存 */
+ private void clearCache(String taskInsId) {
+ Set itemList = taskItemExecutMap.getOrDefault(taskInsId, new HashSet<>());
+ itemList.forEach(itemNodeExecutMap::remove);
+ taskItemExecutMap.remove(taskInsId);
+ }
+
+ /**
+ * 推送完成任务信息
+ */
+ public void pushCompleteMsg(String dbInsId, Date now, int targetStatus) {
+ String logId = UUID.randomUUID().toString().replace("-", "");
+
+ // 保存完成日志
+ AimaTestLog testLog = AimaTestLog.builder()
+ .id(logId)
+ .taskInstanceId(dbInsId)
+ .logLevel("INFO")
+ .logType("系统日志")
+ .logMessage("任务执行完成")
+ .logTime(now)
+ .status(targetStatus)
+ .build();
+
+ try {
+ aimaTestLogService.insertAimaTestLog(testLog);
+ log.info("任务完成日志保存成功,logId:{},taskInstanceId:{}", logId, dbInsId);
+ } catch (Exception e) {
+ log.error("任务完成日志保存失败,taskInstanceId:{}", dbInsId, e);
+ }
+ try {
+ messagePushService.pushToChannel("AimaTaskInstance", testLog);
+ } catch (Exception e) {
+ log.info("消息推送异常,无订阅忽略,insId:{}", dbInsId, e);
+ }
+ }
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaAlarmMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaAlarmMapper.java
new file mode 100644
index 0000000..31ba06f
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaAlarmMapper.java
@@ -0,0 +1,61 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cmvr.aima.domain.AimaAlarm;
+
+/**
+ * 爱玛告警管理Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaAlarmMapper extends BaseMapper {
+ /**
+ * 查询爱玛告警管理
+ *
+ * @param id 爱玛告警管理主键
+ * @return 爱玛告警管理
+ */
+ AimaAlarm selectAimaAlarmById(String id);
+
+ /**
+ * 查询爱玛告警管理列表
+ *
+ * @param aimaAlarm 爱玛告警管理
+ * @return 爱玛告警管理集合
+ */
+ List selectAimaAlarmList(AimaAlarm aimaAlarm);
+
+ /**
+ * 新增爱玛告警管理
+ *
+ * @param aimaAlarm 爱玛告警管理
+ * @return 结果
+ */
+ int insertAimaAlarm(AimaAlarm aimaAlarm);
+
+ /**
+ * 修改爱玛告警管理
+ *
+ * @param aimaAlarm 爱玛告警管理
+ * @return 结果
+ */
+ int updateAimaAlarm(AimaAlarm aimaAlarm);
+
+ /**
+ * 删除爱玛告警管理
+ *
+ * @param id 爱玛告警管理主键
+ * @return 结果
+ */
+ int deleteAimaAlarmById(String id);
+
+ /**
+ * 批量删除爱玛告警管理
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteAimaAlarmByIds(String[] ids);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaPhoneMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaPhoneMapper.java
new file mode 100644
index 0000000..88b94b0
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaPhoneMapper.java
@@ -0,0 +1,61 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cmvr.aima.domain.AimaPhone;
+
+/**
+ * 爱玛手机管理Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaPhoneMapper extends BaseMapper {
+ /**
+ * 查询爱玛手机管理
+ *
+ * @param id 爱玛手机管理主键
+ * @return 爱玛手机管理
+ */
+ AimaPhone selectAimaPhoneById(String id);
+
+ /**
+ * 查询爱玛手机管理列表
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 爱玛手机管理集合
+ */
+ List selectAimaPhoneList(AimaPhone aimaPhone);
+
+ /**
+ * 新增爱玛手机管理
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 结果
+ */
+ int insertAimaPhone(AimaPhone aimaPhone);
+
+ /**
+ * 修改爱玛手机管理
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 结果
+ */
+ int updateAimaPhone(AimaPhone aimaPhone);
+
+ /**
+ * 删除爱玛手机管理
+ *
+ * @param id 爱玛手机管理主键
+ * @return 结果
+ */
+ int deleteAimaPhoneById(String id);
+
+ /**
+ * 批量删除爱玛手机管理
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteAimaPhoneByIds(String[] ids);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskInstanceMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskInstanceMapper.java
new file mode 100644
index 0000000..7931795
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskInstanceMapper.java
@@ -0,0 +1,70 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cmvr.aima.domain.AimaTaskInstance;
+import com.cmvr.aima.domain.vo.AimaTaskInstanceVo;
+
+/**
+ * 爱玛任务执行实例Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaTaskInstanceMapper extends BaseMapper {
+ /**
+ * 查询爱玛任务执行实例
+ *
+ * @param id 爱玛任务执行实例主键
+ * @return 爱玛任务执行实例
+ */
+ AimaTaskInstance selectAimaTaskInstanceById(String id);
+
+ /**
+ * 查询爱玛任务执行实例列表
+ *
+ * @param aimaTaskInstance 爱玛任务执行实例
+ * @return 爱玛任务执行实例集合
+ */
+ List selectAimaTaskInstanceList(AimaTaskInstance aimaTaskInstance);
+
+ /**
+ * 查询爱玛任务执行实例视图列表(包含关联信息)
+ *
+ * @param aimaTaskInstance 爱玛任务执行实例
+ * @return 爱玛任务执行实例视图集合
+ */
+ List selectAimaTaskInstanceVoList(AimaTaskInstance aimaTaskInstance);
+
+ /**
+ * 新增爱玛任务执行实例
+ *
+ * @param aimaTaskInstance 爱玛任务执行实例
+ * @return 结果
+ */
+ int insertAimaTaskInstance(AimaTaskInstance aimaTaskInstance);
+
+ /**
+ * 修改爱玛任务执行实例
+ *
+ * @param aimaTaskInstance 爱玛任务执行实例
+ * @return 结果
+ */
+ int updateAimaTaskInstance(AimaTaskInstance aimaTaskInstance);
+
+ /**
+ * 删除爱玛任务执行实例
+ *
+ * @param id 爱玛任务执行实例主键
+ * @return 结果
+ */
+ int deleteAimaTaskInstanceById(String id);
+
+ /**
+ * 批量删除爱玛任务执行实例
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteAimaTaskInstanceByIds(String[] ids);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskMapper.java
new file mode 100644
index 0000000..b5d5131
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskMapper.java
@@ -0,0 +1,70 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cmvr.aima.domain.AimaTask;
+import com.cmvr.aima.domain.vo.AimaTaskVo;
+
+/**
+ * 爱玛任务管理Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaTaskMapper extends BaseMapper {
+ /**
+ * 查询爱玛任务管理
+ *
+ * @param id 爱玛任务管理主键
+ * @return 爱玛任务管理
+ */
+ AimaTask selectAimaTaskById(String id);
+
+ /**
+ * 查询爱玛任务管理列表
+ *
+ * @param aimaTask 爱玛任务管理
+ * @return 爱玛任务管理集合
+ */
+ List selectAimaTaskList(AimaTask aimaTask);
+
+ /**
+ * 查询爱玛任务视图列表(包含关联信息)
+ *
+ * @param aimaTask 爱玛任务管理
+ * @return 爱玛任务视图集合
+ */
+ List selectAimaTaskVoList(AimaTask aimaTask);
+
+ /**
+ * 新增爱玛任务管理
+ *
+ * @param aimaTask 爱玛任务管理
+ * @return 结果
+ */
+ int insertAimaTask(AimaTask aimaTask);
+
+ /**
+ * 修改爱玛任务管理
+ *
+ * @param aimaTask 爱玛任务管理
+ * @return 结果
+ */
+ int updateAimaTask(AimaTask aimaTask);
+
+ /**
+ * 删除爱玛任务管理
+ *
+ * @param id 爱玛任务管理主键
+ * @return 结果
+ */
+ int deleteAimaTaskById(String id);
+
+ /**
+ * 批量删除爱玛任务管理
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteAimaTaskByIds(String[] ids);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskTestCaseMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskTestCaseMapper.java
new file mode 100644
index 0000000..555e8ca
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTaskTestCaseMapper.java
@@ -0,0 +1,48 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import org.apache.ibatis.annotations.Param;
+import com.cmvr.aima.domain.AimaTaskTestCase;
+
+/**
+ * 爱玛任务与测试用例关联Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaTaskTestCaseMapper extends MPJBaseMapper
+{
+ /**
+ * 批量插入任务-测试用例关联
+ *
+ * @param list 任务-测试用例关联列表
+ * @return 结果
+ */
+ void batchInsertTaskTestCase(@Param("list") List list);
+
+ /**
+ * 根据任务ID删除关联
+ *
+ * @param taskId 任务ID
+ * @return 结果
+ */
+ void deleteTaskTestCaseByTaskId(String taskId);
+
+ /**
+ * 根据任务ID查询测试用例ID列表
+ *
+ * @param taskId 任务ID
+ * @return 测试用例ID列表
+ */
+ List selectTestCaseIdsByTaskId(String taskId);
+
+ /**
+ * 批量删除任务-测试用例关联
+ *
+ * @param taskIds 需要删除的任务ID数组
+ * @return 结果
+ */
+ void deleteTaskTestCaseByTaskIds(String[] taskIds);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestCaseMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestCaseMapper.java
new file mode 100644
index 0000000..3e73b87
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestCaseMapper.java
@@ -0,0 +1,70 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cmvr.aima.domain.AimaTestCase;
+import com.cmvr.aima.domain.vo.AimaTestCaseVo;
+
+/**
+ * 爱玛测试用例Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaTestCaseMapper extends BaseMapper {
+ /**
+ * 查询爱玛测试用例
+ *
+ * @param id 爱玛测试用例主键
+ * @return 爱玛测试用例
+ */
+ AimaTestCase selectAimaTestCaseById(String id);
+
+ /**
+ * 查询爱玛测试用例列表
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 爱玛测试用例集合
+ */
+ List selectAimaTestCaseList(AimaTestCase aimaTestCase);
+
+ /**
+ * 查询爱玛测试用例视图列表(包含关联信息)
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 爱玛测试用例视图集合
+ */
+ List selectAimaTestCaseVoList(AimaTestCase aimaTestCase);
+
+ /**
+ * 新增爱玛测试用例
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 结果
+ */
+ int insertAimaTestCase(AimaTestCase aimaTestCase);
+
+ /**
+ * 修改爱玛测试用例
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 结果
+ */
+ int updateAimaTestCase(AimaTestCase aimaTestCase);
+
+ /**
+ * 删除爱玛测试用例
+ *
+ * @param id 爱玛测试用例主键
+ * @return 结果
+ */
+ int deleteAimaTestCaseById(String id);
+
+ /**
+ * 批量删除爱玛测试用例
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteAimaTestCaseByIds(String[] ids);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestLogMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestLogMapper.java
new file mode 100644
index 0000000..dc7cac8
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaTestLogMapper.java
@@ -0,0 +1,61 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cmvr.aima.domain.AimaTestLog;
+
+/**
+ * 爱玛测试日志Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaTestLogMapper extends BaseMapper {
+ /**
+ * 查询爱玛测试日志
+ *
+ * @param id 爱玛测试日志主键
+ * @return 爱玛测试日志
+ */
+ AimaTestLog selectAimaTestLogById(String id);
+
+ /**
+ * 查询爱玛测试日志列表
+ *
+ * @param aimaTestLog 爱玛测试日志
+ * @return 爱玛测试日志集合
+ */
+ List selectAimaTestLogList(AimaTestLog aimaTestLog);
+
+ /**
+ * 新增爱玛测试日志
+ *
+ * @param aimaTestLog 爱玛测试日志
+ * @return 结果
+ */
+ int insertAimaTestLog(AimaTestLog aimaTestLog);
+
+ /**
+ * 修改爱玛测试日志
+ *
+ * @param aimaTestLog 爱玛测试日志
+ * @return 结果
+ */
+ int updateAimaTestLog(AimaTestLog aimaTestLog);
+
+ /**
+ * 删除爱玛测试日志
+ *
+ * @param id 爱玛测试日志主键
+ * @return 结果
+ */
+ int deleteAimaTestLogById(String id);
+
+ /**
+ * 批量删除爱玛测试日志
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteAimaTestLogByIds(String[] ids);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaVehicleMapper.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaVehicleMapper.java
new file mode 100644
index 0000000..3f474a6
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/mapper/AimaVehicleMapper.java
@@ -0,0 +1,61 @@
+package com.cmvr.aima.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cmvr.aima.domain.AimaVehicle;
+
+/**
+ * 爱玛车辆管理Mapper接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface AimaVehicleMapper extends BaseMapper {
+ /**
+ * 查询爱玛车辆管理
+ *
+ * @param id 爱玛车辆管理主键
+ * @return 爱玛车辆管理
+ */
+ AimaVehicle selectAimaVehicleById(String id);
+
+ /**
+ * 查询爱玛车辆管理列表
+ *
+ * @param aimaVehicle 爱玛车辆管理
+ * @return 爱玛车辆管理集合
+ */
+ List selectAimaVehicleList(AimaVehicle aimaVehicle);
+
+ /**
+ * 新增爱玛车辆管理
+ *
+ * @param aimaVehicle 爱玛车辆管理
+ * @return 结果
+ */
+ int insertAimaVehicle(AimaVehicle aimaVehicle);
+
+ /**
+ * 修改爱玛车辆管理
+ *
+ * @param aimaVehicle 爱玛车辆管理
+ * @return 结果
+ */
+ int updateAimaVehicle(AimaVehicle aimaVehicle);
+
+ /**
+ * 删除爱玛车辆管理
+ *
+ * @param id 爱玛车辆管理主键
+ * @return 结果
+ */
+ int deleteAimaVehicleById(String id);
+
+ /**
+ * 批量删除爱玛车辆管理
+ *
+ * @param ids 需要删除的数据主键集合
+ * @return 结果
+ */
+ int deleteAimaVehicleByIds(String[] ids);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaAlarmService.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaAlarmService.java
new file mode 100644
index 0000000..5cb8e17
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaAlarmService.java
@@ -0,0 +1,19 @@
+package com.cmvr.aima.service;
+
+import java.util.List;
+import com.cmvr.aima.domain.AimaAlarm;
+
+/**
+ * 爱玛告警管理Service接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface IAimaAlarmService {
+ AimaAlarm selectAimaAlarmById(String id);
+ List selectAimaAlarmList(AimaAlarm aimaAlarm);
+ int insertAimaAlarm(AimaAlarm aimaAlarm);
+ int updateAimaAlarm(AimaAlarm aimaAlarm);
+ int deleteAimaAlarmByIds(String[] ids);
+ int deleteAimaAlarmById(String id);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaPhoneService.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaPhoneService.java
new file mode 100644
index 0000000..2f5ef01
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaPhoneService.java
@@ -0,0 +1,60 @@
+package com.cmvr.aima.service;
+
+import java.util.List;
+import com.cmvr.aima.domain.AimaPhone;
+
+/**
+ * 爱玛手机管理Service接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface IAimaPhoneService {
+ /**
+ * 查询爱玛手机管理
+ *
+ * @param id 爱玛手机管理主键
+ * @return 爱玛手机管理
+ */
+ AimaPhone selectAimaPhoneById(String id);
+
+ /**
+ * 查询爱玛手机管理列表
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 爱玛手机管理集合
+ */
+ List selectAimaPhoneList(AimaPhone aimaPhone);
+
+ /**
+ * 新增爱玛手机管理
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 结果
+ */
+ int insertAimaPhone(AimaPhone aimaPhone);
+
+ /**
+ * 修改爱玛手机管理
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 结果
+ */
+ int updateAimaPhone(AimaPhone aimaPhone);
+
+ /**
+ * 批量删除爱玛手机管理
+ *
+ * @param ids 需要删除的爱玛手机管理主键集合
+ * @return 结果
+ */
+ int deleteAimaPhoneByIds(String[] ids);
+
+ /**
+ * 删除爱玛手机管理信息
+ *
+ * @param id 爱玛手机管理主键
+ * @return 结果
+ */
+ int deleteAimaPhoneById(String id);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskInstanceService.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskInstanceService.java
new file mode 100644
index 0000000..c699e44
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskInstanceService.java
@@ -0,0 +1,63 @@
+package com.cmvr.aima.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cmvr.aima.domain.AimaTaskInstance;
+import com.cmvr.aima.domain.vo.AimaTaskInstanceVo;
+
+/**
+ * 爱玛任务执行实例Service接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface IAimaTaskInstanceService extends IService {
+ AimaTaskInstance selectAimaTaskInstanceById(String id);
+ List selectAimaTaskInstanceList(AimaTaskInstance aimaTaskInstance);
+ List selectAimaTaskInstanceVoList(AimaTaskInstance aimaTaskInstance);
+ int insertAimaTaskInstance(AimaTaskInstance aimaTaskInstance);
+ int updateAimaTaskInstance(AimaTaskInstance aimaTaskInstance);
+ int deleteAimaTaskInstanceByIds(String[] ids);
+ int deleteAimaTaskInstanceById(String id);
+
+ /**
+ * 开始执行任务实例
+ *
+ * @param id 任务实例ID
+ * @return 结果
+ */
+ int startInstance(String id);
+
+ /**
+ * 暂停任务实例
+ *
+ * @param id 任务实例ID
+ * @return 结果
+ */
+ int pauseInstance(String id);
+
+ /**
+ * 终止任务实例
+ *
+ * @param id 任务实例ID
+ * @return 结果
+ */
+ int stopInstance(String id);
+
+ /**
+ * 恢复任务实例(从暂停恢复为执行中)
+ *
+ * @param id 任务实例ID
+ * @return 结果
+ */
+ int resumeInstance(String id);
+
+ /**
+ * 更新任务实例进度
+ *
+ * @param instanceId 任务实例ID
+ * @param progress 执行进度(百分比,保留2位小数)
+ */
+ void updateProgress(String instanceId, Double progress);
+}
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
new file mode 100644
index 0000000..05960fa
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTaskService.java
@@ -0,0 +1,38 @@
+package com.cmvr.aima.service;
+
+import java.util.List;
+import com.cmvr.aima.domain.AimaTask;
+import com.cmvr.aima.domain.AimaTestCase;
+import com.cmvr.aima.domain.vo.AimaTaskVo;
+
+/**
+ * 爱玛任务管理Service接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface IAimaTaskService {
+ AimaTask selectAimaTaskById(String id);
+ List selectAimaTaskList(AimaTask aimaTask);
+ List selectAimaTaskVoList(AimaTask aimaTask);
+ int insertAimaTask(AimaTask aimaTask);
+ int updateAimaTask(AimaTask aimaTask);
+ int deleteAimaTaskByIds(String[] ids);
+ int deleteAimaTaskById(String id);
+
+ /**
+ * 为任务绑定测试用例
+ *
+ * @param taskId 任务ID
+ * @param testCaseIds 测试用例ID列表
+ */
+ void bindTestCases(String taskId, List testCaseIds);
+
+ /**
+ * 获取任务的测试用例列表
+ *
+ * @param taskId 任务ID
+ * @return 测试用例ID列表
+ */
+ List getTestCaseIds(String taskId);
+}
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
new file mode 100644
index 0000000..551e8f3
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestCaseService.java
@@ -0,0 +1,69 @@
+package com.cmvr.aima.service;
+
+import java.util.List;
+import com.cmvr.aima.domain.AimaTestCase;
+import com.cmvr.aima.domain.vo.AimaTestCaseVo;
+
+/**
+ * 爱玛测试用例Service接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface IAimaTestCaseService {
+ /**
+ * 查询爱玛测试用例
+ *
+ * @param id 爱玛测试用例主键
+ * @return 爱玛测试用例
+ */
+ AimaTestCase selectAimaTestCaseById(String id);
+
+ /**
+ * 查询爱玛测试用例列表
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 爱玛测试用例集合
+ */
+ List selectAimaTestCaseList(AimaTestCase aimaTestCase);
+
+ /**
+ * 查询爱玛测试用例视图列表(包含关联信息)
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 爱玛测试用例视图集合
+ */
+ List selectAimaTestCaseVoList(AimaTestCase aimaTestCase);
+
+ /**
+ * 新增爱玛测试用例
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 结果
+ */
+ int insertAimaTestCase(AimaTestCase aimaTestCase);
+
+ /**
+ * 修改爱玛测试用例
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 结果
+ */
+ int updateAimaTestCase(AimaTestCase aimaTestCase);
+
+ /**
+ * 批量删除爱玛测试用例
+ *
+ * @param ids 需要删除的爱玛测试用例主键集合
+ * @return 结果
+ */
+ int deleteAimaTestCaseByIds(String[] ids);
+
+ /**
+ * 删除爱玛测试用例信息
+ *
+ * @param id 爱玛测试用例主键
+ * @return 结果
+ */
+ int deleteAimaTestCaseById(String id);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestLogService.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestLogService.java
new file mode 100644
index 0000000..ad5fe9c
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaTestLogService.java
@@ -0,0 +1,19 @@
+package com.cmvr.aima.service;
+
+import java.util.List;
+import com.cmvr.aima.domain.AimaTestLog;
+
+/**
+ * 爱玛测试日志Service接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface IAimaTestLogService {
+ AimaTestLog selectAimaTestLogById(String id);
+ List selectAimaTestLogList(AimaTestLog aimaTestLog);
+ int insertAimaTestLog(AimaTestLog aimaTestLog);
+ int updateAimaTestLog(AimaTestLog aimaTestLog);
+ int deleteAimaTestLogByIds(String[] ids);
+ int deleteAimaTestLogById(String id);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaVehicleService.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaVehicleService.java
new file mode 100644
index 0000000..3243644
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/IAimaVehicleService.java
@@ -0,0 +1,60 @@
+package com.cmvr.aima.service;
+
+import java.util.List;
+import com.cmvr.aima.domain.AimaVehicle;
+
+/**
+ * 爱玛车辆管理Service接口
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+public interface IAimaVehicleService {
+ /**
+ * 查询爱玛车辆管理
+ *
+ * @param id 爱玛车辆管理主键
+ * @return 爱玛车辆管理
+ */
+ AimaVehicle selectAimaVehicleById(String id);
+
+ /**
+ * 查询爱玛车辆管理列表
+ *
+ * @param aimaVehicle 爱玛车辆管理
+ * @return 爱玛车辆管理集合
+ */
+ List selectAimaVehicleList(AimaVehicle aimaVehicle);
+
+ /**
+ * 新增爱玛车辆管理
+ *
+ * @param aimaVehicle 爱玛车辆管理
+ * @return 结果
+ */
+ int insertAimaVehicle(AimaVehicle aimaVehicle);
+
+ /**
+ * 修改爱玛车辆管理
+ *
+ * @param aimaVehicle 爱玛车辆管理
+ * @return 结果
+ */
+ int updateAimaVehicle(AimaVehicle aimaVehicle);
+
+ /**
+ * 批量删除爱玛车辆管理
+ *
+ * @param ids 需要删除的爱玛车辆管理主键集合
+ * @return 结果
+ */
+ int deleteAimaVehicleByIds(String[] ids);
+
+ /**
+ * 删除爱玛车辆管理信息
+ *
+ * @param id 爱玛车辆管理主键
+ * @return 结果
+ */
+ int deleteAimaVehicleById(String id);
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaAlarmServiceImpl.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaAlarmServiceImpl.java
new file mode 100644
index 0000000..8c6d5a4
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaAlarmServiceImpl.java
@@ -0,0 +1,63 @@
+package com.cmvr.aima.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.cmvr.common.utils.DateUtils;
+import com.cmvr.common.utils.SecurityUtils;
+import com.cmvr.aima.mapper.AimaAlarmMapper;
+import com.cmvr.aima.domain.AimaAlarm;
+import com.cmvr.aima.service.IAimaAlarmService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 爱玛告警管理Service业务层处理
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Service
+@Transactional
+public class AimaAlarmServiceImpl extends ServiceImpl implements IAimaAlarmService {
+ @Autowired
+ private AimaAlarmMapper aimaAlarmMapper;
+
+ @Override
+ public AimaAlarm selectAimaAlarmById(String id) {
+ return aimaAlarmMapper.selectAimaAlarmById(id);
+ }
+
+ @Override
+ public List selectAimaAlarmList(AimaAlarm aimaAlarm) {
+ return aimaAlarmMapper.selectAimaAlarmList(aimaAlarm);
+ }
+
+ @Override
+ public int insertAimaAlarm(AimaAlarm aimaAlarm) {
+ if (aimaAlarm.getId() == null || aimaAlarm.getId().isEmpty()) {
+ aimaAlarm.setId(UUID.randomUUID().toString().replace("-", ""));
+ }
+ aimaAlarm.setCreateTime(DateUtils.getNowDate());
+ aimaAlarm.setCreateBy(SecurityUtils.getUsername());
+ return aimaAlarmMapper.insertAimaAlarm(aimaAlarm);
+ }
+
+ @Override
+ public int updateAimaAlarm(AimaAlarm aimaAlarm) {
+ aimaAlarm.setUpdateTime(DateUtils.getNowDate());
+ aimaAlarm.setUpdateBy(SecurityUtils.getUsername());
+ return aimaAlarmMapper.updateAimaAlarm(aimaAlarm);
+ }
+
+ @Override
+ public int deleteAimaAlarmByIds(String[] ids) {
+ return aimaAlarmMapper.deleteAimaAlarmByIds(ids);
+ }
+
+ @Override
+ public int deleteAimaAlarmById(String id) {
+ return aimaAlarmMapper.deleteAimaAlarmById(id);
+ }
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaPhoneServiceImpl.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaPhoneServiceImpl.java
new file mode 100644
index 0000000..78bd1e7
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaPhoneServiceImpl.java
@@ -0,0 +1,100 @@
+package com.cmvr.aima.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.cmvr.common.utils.DateUtils;
+import com.cmvr.common.utils.SecurityUtils;
+import com.cmvr.aima.mapper.AimaPhoneMapper;
+import com.cmvr.aima.domain.AimaPhone;
+import com.cmvr.aima.service.IAimaPhoneService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 爱玛手机管理Service业务层处理
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Service
+@Transactional
+public class AimaPhoneServiceImpl extends ServiceImpl implements IAimaPhoneService {
+ @Autowired
+ private AimaPhoneMapper aimaPhoneMapper;
+
+ /**
+ * 查询爱玛手机管理
+ *
+ * @param id 爱玛手机管理主键
+ * @return 爱玛手机管理
+ */
+ @Override
+ public AimaPhone selectAimaPhoneById(String id) {
+ return aimaPhoneMapper.selectAimaPhoneById(id);
+ }
+
+ /**
+ * 查询爱玛手机管理列表
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 爱玛手机管理
+ */
+ @Override
+ public List selectAimaPhoneList(AimaPhone aimaPhone) {
+ return aimaPhoneMapper.selectAimaPhoneList(aimaPhone);
+ }
+
+ /**
+ * 新增爱玛手机管理
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 结果
+ */
+ @Override
+ public int insertAimaPhone(AimaPhone aimaPhone) {
+ // 生成UUID作为主键
+ if (aimaPhone.getId() == null || aimaPhone.getId().isEmpty()) {
+ aimaPhone.setId(UUID.randomUUID().toString().replace("-", ""));
+ }
+ aimaPhone.setCreateTime(DateUtils.getNowDate());
+ aimaPhone.setCreateBy(SecurityUtils.getUsername());
+ return aimaPhoneMapper.insertAimaPhone(aimaPhone);
+ }
+
+ /**
+ * 修改爱玛手机管理
+ *
+ * @param aimaPhone 爱玛手机管理
+ * @return 结果
+ */
+ @Override
+ public int updateAimaPhone(AimaPhone aimaPhone) {
+ aimaPhone.setUpdateTime(DateUtils.getNowDate());
+ aimaPhone.setUpdateBy(SecurityUtils.getUsername());
+ return aimaPhoneMapper.updateAimaPhone(aimaPhone);
+ }
+
+ /**
+ * 批量删除爱玛手机管理
+ *
+ * @param ids 需要删除的爱玛手机管理主键
+ * @return 结果
+ */
+ @Override
+ public int deleteAimaPhoneByIds(String[] ids) {
+ return aimaPhoneMapper.deleteAimaPhoneByIds(ids);
+ }
+
+ /**
+ * 删除爱玛手机管理信息
+ *
+ * @param id 爱玛手机管理主键
+ * @return 结果
+ */
+ @Override
+ public int deleteAimaPhoneById(String id) {
+ return aimaPhoneMapper.deleteAimaPhoneById(id);
+ }
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskInstanceServiceImpl.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskInstanceServiceImpl.java
new file mode 100644
index 0000000..b8ff9b5
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskInstanceServiceImpl.java
@@ -0,0 +1,231 @@
+package com.cmvr.aima.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cmvr.aima.domain.vo.AimaTaskInstanceVo;
+import com.cmvr.common.exception.ServiceException;
+import com.cmvr.common.utils.SecurityUtils;
+import com.cmvr.test.flow.control.FlowControlService;
+import com.cmvr.test.flow.runtime.engine.FlowTaskRuntimeService;
+import com.cmvr.test.model.vo.TeTaskExecuteNormalVO;
+import com.cmvr.test.service.ITeTaskOrchestrationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import com.cmvr.common.utils.DateUtils;
+import com.cmvr.aima.mapper.AimaTaskInstanceMapper;
+import com.cmvr.aima.domain.AimaTaskInstance;
+import com.cmvr.aima.service.IAimaTaskInstanceService;
+import com.cmvr.aima.enums.AimaTaskStatusEnum;
+import com.cmvr.aima.service.IAimaTaskService;
+import com.cmvr.aima.domain.AimaTask;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 爱玛任务执行实例Service业务层处理
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Service
+@Transactional
+public class AimaTaskInstanceServiceImpl extends ServiceImpl implements IAimaTaskInstanceService {
+ @Autowired
+ private AimaTaskInstanceMapper aimaTaskInstanceMapper;
+
+ @Autowired
+ private IAimaTaskService aimaTaskService;
+
+ @Autowired
+ private ITeTaskOrchestrationService teTaskOrchestrationService;
+
+ @Autowired
+ @Lazy
+ private FlowTaskRuntimeService flowTaskRuntimeService;
+
+ @Autowired
+ @Lazy
+ private FlowControlService flowControlService;
+
+ @Override
+ public AimaTaskInstance selectAimaTaskInstanceById(String id) {
+ return aimaTaskInstanceMapper.selectAimaTaskInstanceById(id);
+ }
+
+ @Override
+ public List selectAimaTaskInstanceList(AimaTaskInstance aimaTaskInstance) {
+ return aimaTaskInstanceMapper.selectAimaTaskInstanceList(aimaTaskInstance);
+ }
+
+ @Override
+ public List selectAimaTaskInstanceVoList(AimaTaskInstance aimaTaskInstance) {
+ return aimaTaskInstanceMapper.selectAimaTaskInstanceVoList(aimaTaskInstance);
+ }
+
+ @Override
+ public int insertAimaTaskInstance(AimaTaskInstance aimaTaskInstance) {
+ if (aimaTaskInstance.getId() == null || aimaTaskInstance.getId().isEmpty()) {
+ aimaTaskInstance.setId(UUID.randomUUID().toString().replace("-", ""));
+ }
+ aimaTaskInstance.setStatus(AimaTaskStatusEnum.NOT_STARTED.getCode());
+ aimaTaskInstance.setCreateTime(DateUtils.getNowDate());
+ aimaTaskInstance.setCreateBy(SecurityUtils.getUsername());
+ // 获取测试用例数量
+ AimaTask aimaTask = aimaTaskService.selectAimaTaskById(aimaTaskInstance.getTaskId());
+ if (aimaTask != null && aimaTask.getTestCaseCount() != null) {
+ aimaTaskInstance.setTotalCases(aimaTask.getTestCaseCount());
+ }
+ return aimaTaskInstanceMapper.insertAimaTaskInstance(aimaTaskInstance);
+ }
+
+ @Override
+ public int updateAimaTaskInstance(AimaTaskInstance aimaTaskInstance) {
+ // 校验状态,只有未执行可以修改
+ if (AimaTaskStatusEnum.NOT_STARTED.getCode() != aimaTaskInstance.getStatus()) {
+ throw new ServiceException("只有未执行状态的任务实例才能修改");
+ }
+ aimaTaskInstance.setUpdateTime(DateUtils.getNowDate());
+ aimaTaskInstance.setUpdateBy(SecurityUtils.getUsername());
+ // 获取测试用例数量
+ AimaTask aimaTask = aimaTaskService.selectAimaTaskById(aimaTaskInstance.getTaskId());
+ if (aimaTask != null && aimaTask.getTestCaseCount() != null) {
+ aimaTaskInstance.setTotalCases(aimaTask.getTestCaseCount());
+ }
+ return aimaTaskInstanceMapper.updateAimaTaskInstance(aimaTaskInstance);
+ }
+
+ @Override
+ public int deleteAimaTaskInstanceByIds(String[] ids) {
+ // 校验状态,只有未执行可以删除
+ for (String id : ids) {
+ AimaTaskInstance instance = aimaTaskInstanceMapper.selectAimaTaskInstanceById(id);
+ if (instance != null && AimaTaskStatusEnum.NOT_STARTED.getCode() != instance.getStatus()) {
+ throw new ServiceException("只有未执行状态的任务实例才能删除");
+ }
+ }
+ return aimaTaskInstanceMapper.deleteAimaTaskInstanceByIds(ids);
+ }
+
+ @Override
+ public int deleteAimaTaskInstanceById(String id) {
+ return aimaTaskInstanceMapper.deleteAimaTaskInstanceById(id);
+ }
+
+ /**
+ * 开始执行任务实例
+ */
+ @Override
+ public int startInstance(String id) {
+ AimaTaskInstance instance = aimaTaskInstanceMapper.selectAimaTaskInstanceById(id);
+ if (instance == null) {
+ throw new ServiceException("任务实例不存在");
+ }
+ if (AimaTaskStatusEnum.NOT_STARTED.getCode() != instance.getStatus()) {
+ throw new ServiceException("只有待执行状态的任务实例才能开始执行");
+ }
+ AimaTaskInstance update = new AimaTaskInstance();
+ update.setId(id);
+ update.setStatus(AimaTaskStatusEnum.RUNNING.getCode());
+ update.setStartTime(DateUtils.getNowDate());
+ update.setUpdateTime(DateUtils.getNowDate());
+ update.setUpdateBy(SecurityUtils.getUsername());
+
+
+
+ AimaTask aimaTask = aimaTaskService.selectAimaTaskById(instance.getTaskId());
+ JSONObject runParams = new JSONObject();
+ // 从test模块的任务编排中获取所有的检测项id
+ if (aimaTask != null && aimaTask.getTaskConfigId() != null) {
+ teTaskOrchestrationService.queryByTaskId(aimaTask.getTaskConfigId())
+ .forEach(item -> runParams.put(item.getItemId(), new JSONObject()));
+ }
+ // 调用流程引擎执行
+ String insId = flowTaskRuntimeService.executeTask(
+ TeTaskExecuteNormalVO.builder()
+ .taskId(aimaTask.getTaskConfigId())
+ .runParams(runParams)
+ .build()
+ );
+ update.setTaskInsId(insId);
+ return aimaTaskInstanceMapper.updateAimaTaskInstance(update);
+ }
+
+ /**
+ * 暂停任务实例
+ */
+ @Override
+ public int pauseInstance(String id) {
+ AimaTaskInstance instance = aimaTaskInstanceMapper.selectAimaTaskInstanceById(id);
+ if (instance == null) {
+ throw new ServiceException("任务实例不存在");
+ }
+ if (AimaTaskStatusEnum.RUNNING.getCode() != instance.getStatus()) {
+ throw new ServiceException("只有执行中状态的任务实例才能暂停");
+ }
+ AimaTaskInstance update = new AimaTaskInstance();
+ update.setId(id);
+ update.setStatus(AimaTaskStatusEnum.PAUSED.getCode());
+ update.setUpdateTime(DateUtils.getNowDate());
+ update.setUpdateBy(SecurityUtils.getUsername());
+ flowControlService.pause(instance.getTaskInsId());
+ return aimaTaskInstanceMapper.updateAimaTaskInstance(update);
+ }
+
+ /**
+ * 终止任务实例
+ */
+ @Override
+ public int stopInstance(String id) {
+ AimaTaskInstance instance = aimaTaskInstanceMapper.selectAimaTaskInstanceById(id);
+ if (instance == null) {
+ throw new ServiceException("任务实例不存在");
+ }
+ if (AimaTaskStatusEnum.NOT_STARTED.getCode() != instance.getStatus()
+ && AimaTaskStatusEnum.RUNNING.getCode() != instance.getStatus()) {
+ throw new ServiceException("已完成或已取消的任务实例不能终止");
+ }
+ AimaTaskInstance update = new AimaTaskInstance();
+ update.setId(id);
+ update.setStatus(AimaTaskStatusEnum.STOPPED.getCode());
+ update.setEndTime(DateUtils.getNowDate());
+ update.setUpdateTime(DateUtils.getNowDate());
+ update.setUpdateBy(SecurityUtils.getUsername());
+ flowControlService.stop(instance.getTaskInsId());
+ return aimaTaskInstanceMapper.updateAimaTaskInstance(update);
+ }
+
+ /**
+ * 恢复任务实例(从暂停恢复为执行中)
+ */
+ @Override
+ public int resumeInstance(String id) {
+ AimaTaskInstance instance = aimaTaskInstanceMapper.selectAimaTaskInstanceById(id);
+ if (instance == null) {
+ throw new ServiceException("任务实例不存在");
+ }
+ if (AimaTaskStatusEnum.PAUSED.getCode() != instance.getStatus()) {
+ throw new ServiceException("只有已暂停状态的任务实例才能恢复");
+ }
+ AimaTaskInstance update = new AimaTaskInstance();
+ update.setId(id);
+ update.setStatus(AimaTaskStatusEnum.RUNNING.getCode());
+ update.setUpdateTime(DateUtils.getNowDate());
+ update.setUpdateBy(SecurityUtils.getUsername());
+ flowControlService.resume(instance.getTaskInsId());
+ return aimaTaskInstanceMapper.updateAimaTaskInstance(update);
+ }
+
+ /**
+ * 更新任务实例进度
+ */
+ @Override
+ public void updateProgress(String instanceId, Double progress) {
+ AimaTaskInstance update = new AimaTaskInstance();
+ update.setId(instanceId);
+ update.setProgress(progress);
+ update.setUpdateTime(DateUtils.getNowDate());
+ aimaTaskInstanceMapper.updateAimaTaskInstance(update);
+ }
+}
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
new file mode 100644
index 0000000..7343db8
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTaskServiceImpl.java
@@ -0,0 +1,159 @@
+package com.cmvr.aima.service.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cmvr.aima.domain.AimaTaskTestCase;
+import com.cmvr.aima.domain.AimaTestCase;
+import com.cmvr.aima.domain.vo.AimaTaskVo;
+import com.cmvr.aima.mapper.AimaTestCaseMapper;
+import com.cmvr.test.model.domain.TeTaskConfigInfo;
+import com.cmvr.test.model.vo.TeTaskOrchestraVO;
+import com.cmvr.test.service.ITeTaskConfigInfoService;
+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.SecurityUtils;
+import com.cmvr.aima.mapper.AimaTaskMapper;
+import com.cmvr.aima.mapper.AimaTaskTestCaseMapper;
+import com.cmvr.aima.domain.AimaTask;
+import com.cmvr.aima.service.IAimaTaskService;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class AimaTaskServiceImpl extends ServiceImpl implements IAimaTaskService {
+ @Autowired
+ private AimaTaskMapper aimaTaskMapper;
+
+ @Autowired
+ private AimaTaskTestCaseMapper aimaTaskTestCaseMapper;
+
+ @Autowired
+ private AimaTestCaseMapper aimaTestCaseMapper;
+
+ @Autowired
+ private ITeTaskOrchestrationService teTaskOrchestrationService;
+
+ @Autowired
+ private ITeTaskConfigInfoService teTaskConfigInfoService;
+
+ @Override
+ public AimaTask selectAimaTaskById(String id) {
+ return aimaTaskMapper.selectAimaTaskById(id);
+ }
+
+ @Override
+ public List selectAimaTaskList(AimaTask aimaTask) {
+ return aimaTaskMapper.selectAimaTaskList(aimaTask);
+ }
+
+ @Override
+ public List selectAimaTaskVoList(AimaTask aimaTask) {
+ return aimaTaskMapper.selectAimaTaskVoList(aimaTask);
+ }
+
+ @Override
+ public int insertAimaTask(AimaTask aimaTask) {
+ // 生成UUID作为主键
+ if (aimaTask.getId() == null || aimaTask.getId().isEmpty()) {
+ aimaTask.setId(UUID.randomUUID().toString().replace("-", ""));
+ }
+ aimaTask.setCreateTime(DateUtils.getNowDate());
+ aimaTask.setCreateBy(SecurityUtils.getUsername());
+ // 同步新增任务配置到test模块
+ TeTaskConfigInfo teTaskConfigInfo = TeTaskConfigInfo.builder()
+ .taskName(aimaTask.getTaskName())
+ .build();
+ teTaskConfigInfoService.insertTeTaskConfigInfo(teTaskConfigInfo);
+ aimaTask.setTaskConfigId(teTaskConfigInfo.getId());
+ return aimaTaskMapper.insertAimaTask(aimaTask);
+ }
+
+ @Override
+ public int updateAimaTask(AimaTask aimaTask) {
+ aimaTask.setUpdateTime(DateUtils.getNowDate());
+ aimaTask.setUpdateBy(SecurityUtils.getUsername());
+ // 同步更新任务配置名称
+ if (aimaTask.getTaskConfigId() != null) {
+ TeTaskConfigInfo teTaskConfigInfo = teTaskConfigInfoService.selectTeTaskConfigInfoById(aimaTask.getTaskConfigId());
+ if (teTaskConfigInfo != null) {
+ teTaskConfigInfo.setTaskName(aimaTask.getTaskName());
+ teTaskConfigInfoService.updateTeTaskConfigInfo(teTaskConfigInfo);
+ }
+ }
+ return aimaTaskMapper.updateAimaTask(aimaTask);
+ }
+
+ @Override
+ public int deleteAimaTaskByIds(String[] ids) {
+ // 先删除关联表数据
+ aimaTaskTestCaseMapper.deleteTaskTestCaseByTaskIds(ids);
+ // 批量查询任务
+ List aimaTasks = this.baseMapper.selectBatchIds(Arrays.asList(ids));
+ // 批量删除任务配置
+ teTaskConfigInfoService.deleteTeTaskConfigInfoByIds(
+ aimaTasks.stream().map(AimaTask::getTaskConfigId).toArray(String[]::new)
+ );
+ return aimaTaskMapper.deleteAimaTaskByIds(ids);
+ }
+
+ @Override
+ public int deleteAimaTaskById(String id) {
+ return aimaTaskMapper.deleteAimaTaskById(id);
+ }
+
+ @Override
+ public void bindTestCases(String taskId, List testCaseIds) {
+ // 先删除旧的关联
+ aimaTaskTestCaseMapper.deleteTaskTestCaseByTaskId(taskId);
+
+ // 批量插入新的关联
+ if (testCaseIds != null && !testCaseIds.isEmpty()) {
+ List list = new ArrayList<>();
+ for (int i = 0; i < testCaseIds.size(); i++) {
+ AimaTaskTestCase taskTestCase = new AimaTaskTestCase();
+ taskTestCase.setTaskId(taskId);
+ taskTestCase.setTestCaseId(testCaseIds.get(i));
+ taskTestCase.setSortOrder(i);
+ list.add(taskTestCase);
+ }
+ aimaTaskTestCaseMapper.batchInsertTaskTestCase(list);
+
+ // 更新任务的测试用例数量
+ AimaTask task = new AimaTask();
+ task.setId(taskId);
+ task.setTestCaseCount(testCaseIds.size());
+ aimaTaskMapper.updateAimaTask(task);
+
+ // 查询测试用例,获取detectItemId列表
+ List testCases = aimaTestCaseMapper.selectBatchIds(testCaseIds);
+ List detectItemIds = testCases.stream()
+ .map(AimaTestCase::getDetectItemId)
+ .filter(itemId -> itemId != null && !itemId.isEmpty())
+ .collect(Collectors.toList());
+
+ // 同步任务编排到test模块
+ if (!detectItemIds.isEmpty()) {
+ AimaTask aimaTask = aimaTaskMapper.selectAimaTaskById(taskId);
+ TeTaskOrchestraVO teTaskOrchestraVO = TeTaskOrchestraVO.builder()
+ .taskId(aimaTask.getTaskConfigId())
+ .itemIds(detectItemIds)
+ .build();
+ teTaskOrchestrationService.insertTeTaskOrchestration(teTaskOrchestraVO);
+ }
+ }
+ }
+
+ @Override
+ public List getTestCaseIds(String taskId) {
+ List ids = aimaTaskTestCaseMapper.selectTestCaseIdsByTaskId(taskId);
+ return aimaTestCaseMapper.selectList(new QueryWrapper().in("id", ids));
+ }
+}
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
new file mode 100644
index 0000000..022de12
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestCaseServiceImpl.java
@@ -0,0 +1,139 @@
+package com.cmvr.aima.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cmvr.aima.domain.vo.AimaTestCaseVo;
+import com.cmvr.test.model.domain.TeDetectionItem;
+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.SecurityUtils;
+import com.cmvr.aima.mapper.AimaTestCaseMapper;
+import com.cmvr.aima.domain.AimaTestCase;
+import com.cmvr.aima.service.IAimaTestCaseService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 爱玛测试用例Service业务层处理
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Service
+@Transactional
+public class AimaTestCaseServiceImpl extends ServiceImpl implements IAimaTestCaseService {
+ @Autowired
+ private AimaTestCaseMapper aimaTestCaseMapper;
+
+ @Autowired
+ private ITeDetectionItemService teDetectionItemService;
+
+ /**
+ * 查询爱玛测试用例
+ *
+ * @param id 爱玛测试用例主键
+ * @return 爱玛测试用例
+ */
+ @Override
+ public AimaTestCase selectAimaTestCaseById(String id) {
+ return aimaTestCaseMapper.selectAimaTestCaseById(id);
+ }
+
+ /**
+ * 查询爱玛测试用例列表
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 爱玛测试用例
+ */
+ @Override
+ public List selectAimaTestCaseList(AimaTestCase aimaTestCase) {
+ return aimaTestCaseMapper.selectAimaTestCaseList(aimaTestCase);
+ }
+
+ /**
+ * 查询爱玛测试用例视图列表(包含关联信息)
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 爱玛测试用例视图集合
+ */
+ @Override
+ public List selectAimaTestCaseVoList(AimaTestCase aimaTestCase) {
+ return aimaTestCaseMapper.selectAimaTestCaseVoList(aimaTestCase);
+ }
+
+ /**
+ * 新增爱玛测试用例
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 结果
+ */
+ @Override
+ public int insertAimaTestCase(AimaTestCase aimaTestCase) {
+ // 生成UUID作为主键
+ if (aimaTestCase.getId() == null || aimaTestCase.getId().isEmpty()) {
+ aimaTestCase.setId(UUID.randomUUID().toString().replace("-", ""));
+ }
+ aimaTestCase.setCreateTime(DateUtils.getNowDate());
+ aimaTestCase.setCreateBy(SecurityUtils.getUsername());
+ // 同步新增检测项配置到test模块
+ TeDetectionItem teDetectionItem = TeDetectionItem.builder()
+ .detectName(aimaTestCase.getCaseName())
+ .groupId(7L) // 可以根据实际情况调整分组ID
+ .build();
+ teDetectionItemService.insertTeDetectionItem(teDetectionItem);
+ aimaTestCase.setDetectItemId(teDetectionItem.getId());
+ return aimaTestCaseMapper.insertAimaTestCase(aimaTestCase);
+ }
+
+ /**
+ * 修改爱玛测试用例
+ *
+ * @param aimaTestCase 爱玛测试用例
+ * @return 结果
+ */
+ @Override
+ public int updateAimaTestCase(AimaTestCase aimaTestCase) {
+ aimaTestCase.setUpdateTime(DateUtils.getNowDate());
+ aimaTestCase.setUpdateBy(SecurityUtils.getUsername());
+ // 同步更新检测项名称
+ if (aimaTestCase.getDetectItemId() != null) {
+ TeDetectionItem teDetectionItem = teDetectionItemService.selectTeDetectionItemById(aimaTestCase.getDetectItemId());
+ if (teDetectionItem != null) {
+ teDetectionItem.setDetectName(aimaTestCase.getCaseName());
+ teDetectionItemService.updateTeDetectionItem(teDetectionItem);
+ }
+ }
+ return aimaTestCaseMapper.updateAimaTestCase(aimaTestCase);
+ }
+
+ /**
+ * 批量删除爱玛测试用例
+ *
+ * @param ids 需要删除的爱玛测试用例主键
+ * @return 结果
+ */
+ @Override
+ public int deleteAimaTestCaseByIds(String[] ids) {
+ // 先查询数据,删除绑定的检测项
+ for (String id : ids) {
+ AimaTestCase aimaTestCase = aimaTestCaseMapper.selectAimaTestCaseById(id);
+ if (aimaTestCase != null && aimaTestCase.getDetectItemId() != null) {
+ teDetectionItemService.deleteTeDetectionItemById(aimaTestCase.getDetectItemId());
+ }
+ }
+ return aimaTestCaseMapper.deleteAimaTestCaseByIds(ids);
+ }
+
+ /**
+ * 删除爱玛测试用例信息
+ *
+ * @param id 爱玛测试用例主键
+ * @return 结果
+ */
+ @Override
+ public int deleteAimaTestCaseById(String id) {
+ return aimaTestCaseMapper.deleteAimaTestCaseById(id);
+ }
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestLogServiceImpl.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestLogServiceImpl.java
new file mode 100644
index 0000000..7845911
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaTestLogServiceImpl.java
@@ -0,0 +1,63 @@
+package com.cmvr.aima.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.cmvr.common.utils.DateUtils;
+import com.cmvr.common.utils.SecurityUtils;
+import com.cmvr.aima.mapper.AimaTestLogMapper;
+import com.cmvr.aima.domain.AimaTestLog;
+import com.cmvr.aima.service.IAimaTestLogService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 爱玛测试日志Service业务层处理
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Service
+@Transactional
+public class AimaTestLogServiceImpl extends ServiceImpl implements IAimaTestLogService {
+ @Autowired
+ private AimaTestLogMapper aimaTestLogMapper;
+
+ @Override
+ public AimaTestLog selectAimaTestLogById(String id) {
+ return aimaTestLogMapper.selectAimaTestLogById(id);
+ }
+
+ @Override
+ public List selectAimaTestLogList(AimaTestLog aimaTestLog) {
+ return aimaTestLogMapper.selectAimaTestLogList(aimaTestLog);
+ }
+
+ @Override
+ public int insertAimaTestLog(AimaTestLog aimaTestLog) {
+ if (aimaTestLog.getId() == null || aimaTestLog.getId().isEmpty()) {
+ aimaTestLog.setId(UUID.randomUUID().toString().replace("-", ""));
+ }
+ aimaTestLog.setCreateTime(DateUtils.getNowDate());
+ aimaTestLog.setCreateBy(SecurityUtils.getUsername());
+ return aimaTestLogMapper.insertAimaTestLog(aimaTestLog);
+ }
+
+ @Override
+ public int updateAimaTestLog(AimaTestLog aimaTestLog) {
+ aimaTestLog.setUpdateTime(DateUtils.getNowDate());
+ aimaTestLog.setUpdateBy(SecurityUtils.getUsername());
+ return aimaTestLogMapper.updateAimaTestLog(aimaTestLog);
+ }
+
+ @Override
+ public int deleteAimaTestLogByIds(String[] ids) {
+ return aimaTestLogMapper.deleteAimaTestLogByIds(ids);
+ }
+
+ @Override
+ public int deleteAimaTestLogById(String id) {
+ return aimaTestLogMapper.deleteAimaTestLogById(id);
+ }
+}
diff --git a/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaVehicleServiceImpl.java b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaVehicleServiceImpl.java
new file mode 100644
index 0000000..f9e9ae0
--- /dev/null
+++ b/cmvr-iot-aima/src/main/java/com/cmvr/aima/service/impl/AimaVehicleServiceImpl.java
@@ -0,0 +1,63 @@
+package com.cmvr.aima.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.cmvr.common.utils.DateUtils;
+import com.cmvr.common.utils.SecurityUtils;
+import com.cmvr.aima.mapper.AimaVehicleMapper;
+import com.cmvr.aima.domain.AimaVehicle;
+import com.cmvr.aima.service.IAimaVehicleService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 爱玛车辆管理Service业务层处理
+ *
+ * @author cmvr-iot
+ * @since 2026-06-22
+ */
+@Service
+@Transactional
+public class AimaVehicleServiceImpl extends ServiceImpl implements IAimaVehicleService {
+ @Autowired
+ private AimaVehicleMapper aimaVehicleMapper;
+
+ @Override
+ public AimaVehicle selectAimaVehicleById(String id) {
+ return aimaVehicleMapper.selectAimaVehicleById(id);
+ }
+
+ @Override
+ public List selectAimaVehicleList(AimaVehicle aimaVehicle) {
+ return aimaVehicleMapper.selectAimaVehicleList(aimaVehicle);
+ }
+
+ @Override
+ public int insertAimaVehicle(AimaVehicle aimaVehicle) {
+ if (aimaVehicle.getId() == null || aimaVehicle.getId().isEmpty()) {
+ aimaVehicle.setId(UUID.randomUUID().toString().replace("-", ""));
+ }
+ aimaVehicle.setCreateTime(DateUtils.getNowDate());
+ aimaVehicle.setCreateBy(SecurityUtils.getUsername());
+ return aimaVehicleMapper.insertAimaVehicle(aimaVehicle);
+ }
+
+ @Override
+ public int updateAimaVehicle(AimaVehicle aimaVehicle) {
+ aimaVehicle.setUpdateTime(DateUtils.getNowDate());
+ aimaVehicle.setUpdateBy(SecurityUtils.getUsername());
+ return aimaVehicleMapper.updateAimaVehicle(aimaVehicle);
+ }
+
+ @Override
+ public int deleteAimaVehicleByIds(String[] ids) {
+ return aimaVehicleMapper.deleteAimaVehicleByIds(ids);
+ }
+
+ @Override
+ public int deleteAimaVehicleById(String id) {
+ return aimaVehicleMapper.deleteAimaVehicleById(id);
+ }
+}
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaAlarmMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaAlarmMapper.xml
new file mode 100644
index 0000000..6710feb
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaAlarmMapper.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, create_by, create_time, update_by, update_time, remark, alarm_code, task_instance_id, task_id, task_name, phone_id, phone_name, vehicle_id, vin, test_case_id, case_name, alarm_level, alarm_type, alarm_title, alarm_content, alarm_location, alarm_time, handle_status, handler, handle_time, handle_remark, evidence_image from aima_alarm
+
+
+
+
+
+
+
+ insert into aima_alarm
+ id,create_by,create_time,
+ update_by,update_time,remark,
+ alarm_code,task_instance_id,task_id,
+ task_name,phone_id,phone_name,
+ vehicle_id,vin,test_case_id,
+ case_name,alarm_level,alarm_type,
+ alarm_title,alarm_content,alarm_location,
+ alarm_time,handle_status,handler,
+ handle_time,handle_remark,evidence_image,
+
+
+ #{id},#{createBy},#{createTime},
+ #{updateBy},#{updateTime},#{remark},
+ #{alarmCode},#{taskInstanceId},#{taskId},
+ #{taskName},#{phoneId},#{phoneName},
+ #{vehicleId},#{vin},#{testCaseId},
+ #{caseName},#{alarmLevel},#{alarmType},
+ #{alarmTitle},#{alarmContent},#{alarmLocation},
+ #{alarmTime},#{handleStatus},#{handler},
+ #{handleTime},#{handleRemark},#{evidenceImage},
+
+
+
+
+ update aima_alarm
+ create_by = #{createBy},create_time = #{createTime},
+ update_by = #{updateBy},update_time = #{updateTime},
+ remark = #{remark},alarm_code = #{alarmCode},
+ task_instance_id = #{taskInstanceId},task_id = #{taskId},
+ task_name = #{taskName},phone_id = #{phoneId},
+ phone_name = #{phoneName},vehicle_id = #{vehicleId},
+ vin = #{vin},test_case_id = #{testCaseId},
+ case_name = #{caseName},alarm_level = #{alarmLevel},
+ alarm_type = #{alarmType},alarm_title = #{alarmTitle},
+ alarm_content = #{alarmContent},alarm_location = #{alarmLocation},
+ alarm_time = #{alarmTime},handle_status = #{handleStatus},
+ handler = #{handler},handle_time = #{handleTime},
+ handle_remark = #{handleRemark},evidence_image = #{evidenceImage},
+ where id = #{id}
+
+
+ delete from aima_alarm where id = #{id}
+
+ delete from aima_alarm where id in #{id}
+
+
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaPhoneMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaPhoneMapper.xml
new file mode 100644
index 0000000..4423888
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaPhoneMapper.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, create_by, create_time, update_by, update_time, remark, phone_name, phone_model, os_system, os_version, specifications, manufacturer, status from aima_phone
+
+
+
+
+
+
+
+ insert into aima_phone
+
+ id,
+ create_by,
+ create_time,
+ update_by,
+ update_time,
+ remark,
+ phone_name,
+ phone_model,
+ os_system,
+ os_version,
+ specifications,
+ manufacturer,
+ status,
+
+
+ #{id},
+ #{createBy},
+ #{createTime},
+ #{updateBy},
+ #{updateTime},
+ #{remark},
+ #{phoneName},
+ #{phoneModel},
+ #{osSystem},
+ #{osVersion},
+ #{specifications},
+ #{manufacturer},
+ #{status},
+
+
+
+
+ update aima_phone
+
+ create_by = #{createBy},
+ create_time = #{createTime},
+ update_by = #{updateBy},
+ update_time = #{updateTime},
+ remark = #{remark},
+ phone_name = #{phoneName},
+ phone_model = #{phoneModel},
+ os_system = #{osSystem},
+ os_version = #{osVersion},
+ specifications = #{specifications},
+ manufacturer = #{manufacturer},
+ status = #{status},
+
+ where id = #{id}
+
+
+
+ delete from aima_phone where id = #{id}
+
+
+
+ delete from aima_phone where id in
+
+ #{id}
+
+
+
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskInstanceMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskInstanceMapper.xml
new file mode 100644
index 0000000..a3ba18a
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskInstanceMapper.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, create_by, create_time, update_by, update_time, remark, task_id, phone_id, vehicle_id, execution_number, status, task_ins_id, total_cases, completed_cases, passed_cases, failed_cases, progress, start_time, end_time from aima_task_instance
+
+
+
+
+
+
+
+
+
+ insert into aima_task_instance
+ id,create_by,create_time,
+ update_by,update_time,remark,
+ task_id,phone_id,
+ vehicle_id,
+ execution_number,status,total_cases,
+ completed_cases,passed_cases,failed_cases,
+ progress,
+ start_time,end_time,
+
+
+ #{id},#{createBy},#{createTime},
+ #{updateBy},#{updateTime},#{remark},
+ #{taskId},#{phoneId},
+ #{vehicleId},
+ #{executionNumber},#{status},#{totalCases},
+ #{completedCases},#{passedCases},#{failedCases},
+ #{progress},
+ #{startTime},#{endTime},
+
+
+
+
+ update aima_task_instance
+ create_by = #{createBy},create_time = #{createTime},
+ update_by = #{updateBy},update_time = #{updateTime},
+ remark = #{remark},task_id = #{taskId},
+ phone_id = #{phoneId},
+ vehicle_id = #{vehicleId},
+ execution_number = #{executionNumber},
+ status = #{status},total_cases = #{totalCases},
+ completed_cases = #{completedCases},passed_cases = #{passedCases},
+ failed_cases = #{failedCases},progress = #{progress},
+ start_time = #{startTime},end_time = #{endTime},
+ task_ins_id = #{taskInsId},
+
+ where id = #{id}
+
+
+ delete from aima_task_instance where id = #{id}
+
+ delete from aima_task_instance where id in #{id}
+
+
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskMapper.xml
new file mode 100644
index 0000000..cf5edeb
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskMapper.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, create_by, create_time, update_by, update_time, remark, task_code, task_name, task_type, phone_id, vehicle_id, test_case_count, task_config_id from aima_task
+
+
+
+
+
+
+
+
+
+ insert into aima_task
+ id,create_by,create_time,
+ update_by,update_time,remark,
+ task_code,task_name,task_type,
+ phone_id,vehicle_id,
+ test_case_count,task_config_id,
+
+
+ #{id},#{createBy},#{createTime},
+ #{updateBy},#{updateTime},#{remark},
+ #{taskCode},#{taskName},#{taskType},
+ #{phoneId},#{vehicleId},
+ #{testCaseCount},#{taskConfigId},
+
+
+
+
+ update aima_task
+ create_by = #{createBy},create_time = #{createTime},
+ update_by = #{updateBy},update_time = #{updateTime},
+ remark = #{remark},task_code = #{taskCode},
+ task_name = #{taskName},task_type = #{taskType},
+ phone_id = #{phoneId},
+ vehicle_id = #{vehicleId},
+ test_case_count = #{testCaseCount},task_config_id = #{taskConfigId},
+ where id = #{id}
+
+
+ delete from aima_task where id = #{id}
+
+ delete from aima_task where id in #{id}
+
+
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskTestCaseMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskTestCaseMapper.xml
new file mode 100644
index 0000000..4ed38ac
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTaskTestCaseMapper.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+ INSERT INTO aima_task_test_case (task_id, test_case_id, sort_order) VALUES
+
+ (#{item.taskId}, #{item.testCaseId}, #{item.sortOrder})
+
+
+
+
+ DELETE FROM aima_task_test_case WHERE task_id = #{taskId}
+
+
+
+
+
+ DELETE FROM aima_task_test_case WHERE task_id IN
+
+ #{taskId}
+
+
+
+
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestCaseMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestCaseMapper.xml
new file mode 100644
index 0000000..02aae66
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestCaseMapper.xml
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, create_by, create_time, update_by, update_time, remark, case_code, case_name, case_category, test_description, precondition, test_steps, expected_result, priority, enabled, sort_order, estimated_duration, detect_item_id from aima_test_case
+
+
+
+
+
+
+
+
+
+ insert into aima_test_case
+
+ id,
+ create_by,
+ create_time,
+ update_by,
+ update_time,
+ remark,
+ case_code,
+ case_name,
+ case_category,
+ test_description,
+ precondition,
+ test_steps,
+ expected_result,
+ priority,
+ enabled,
+ sort_order,
+ estimated_duration,
+ detect_item_id,
+
+
+ #{id},
+ #{createBy},
+ #{createTime},
+ #{updateBy},
+ #{updateTime},
+ #{remark},
+ #{caseCode},
+ #{caseName},
+ #{caseCategory},
+ #{testDescription},
+ #{precondition},
+ #{testSteps},
+ #{expectedResult},
+ #{priority},
+ #{enabled},
+ #{sortOrder},
+ #{estimatedDuration},
+ #{detectItemId},
+
+
+
+
+ update aima_test_case
+
+ create_by = #{createBy},
+ create_time = #{createTime},
+ update_by = #{updateBy},
+ update_time = #{updateTime},
+ remark = #{remark},
+ case_code = #{caseCode},
+ case_name = #{caseName},
+ case_category = #{caseCategory},
+ test_description = #{testDescription},
+ precondition = #{precondition},
+ test_steps = #{testSteps},
+ expected_result = #{expectedResult},
+ priority = #{priority},
+ enabled = #{enabled},
+ sort_order = #{sortOrder},
+ estimated_duration = #{estimatedDuration},
+ detect_item_id = #{detectItemId},
+
+ where id = #{id}
+
+
+
+ delete from aima_test_case where id = #{id}
+
+
+
+ delete from aima_test_case where id in
+
+ #{id}
+
+
+
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestLogMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestLogMapper.xml
new file mode 100644
index 0000000..504f666
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaTestLogMapper.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, create_by, create_time, update_by, update_time, remark, task_instance_id, task_id, task_name, test_case_id, case_name, log_level, log_type, log_message, log_time, execution_step, actual_result, test_status, screenshot_url, video_url, error_stack, duration_ms,progress,status from aima_test_log
+
+
+
+
+
+
+
+ insert into aima_test_log
+ id,create_by,create_time,
+ update_by,update_time,remark,
+ task_instance_id,task_id,task_name,
+ test_case_id,case_name,log_level,
+ log_type,log_message,log_time,
+ execution_step,actual_result,test_status,
+ screenshot_url,video_url,error_stack,
+ duration_ms,
+ progress,
+ status,
+
+
+ #{id},#{createBy},#{createTime},
+ #{updateBy},#{updateTime},#{remark},
+ #{taskInstanceId},#{taskId},#{taskName},
+ #{testCaseId},#{caseName},#{logLevel},
+ #{logType},#{logMessage},#{logTime},
+ #{executionStep},#{actualResult},#{testStatus},
+ #{screenshotUrl},#{videoUrl},#{errorStack},
+ #{durationMs},
+ #{progress},
+ #{status},
+
+
+
+
+ update aima_test_log
+ create_by = #{createBy},create_time = #{createTime},
+ update_by = #{updateBy},update_time = #{updateTime},
+ remark = #{remark},task_instance_id = #{taskInstanceId},
+ task_id = #{taskId},task_name = #{taskName},
+ test_case_id = #{testCaseId},case_name = #{caseName},
+ log_level = #{logLevel},log_type = #{logType},
+ log_message = #{logMessage},log_time = #{logTime},
+ execution_step = #{executionStep},actual_result = #{actualResult},
+ test_status = #{testStatus},screenshot_url = #{screenshotUrl},
+ video_url = #{videoUrl},error_stack = #{errorStack},
+ duration_ms = #{durationMs},
+ progress = #{progress},
+ status = #{status},
+ where id = #{id}
+
+
+ delete from aima_test_log where id = #{id}
+
+ delete from aima_test_log where id in #{id}
+
+
diff --git a/cmvr-iot-aima/src/main/resources/mapper/aima/AimaVehicleMapper.xml b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaVehicleMapper.xml
new file mode 100644
index 0000000..79305c6
--- /dev/null
+++ b/cmvr-iot-aima/src/main/resources/mapper/aima/AimaVehicleMapper.xml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id, create_by, create_time, update_by, update_time, remark, vin, vehicle_model, vehicle_name, color, production_date, status from aima_vehicle
+
+
+
+
+
+
+
+ insert into aima_vehicle
+
+ id,
+ create_by,
+ create_time,
+ update_by,
+ update_time,
+ remark,
+ vin,
+ vehicle_model,
+ vehicle_name,
+ color,
+ production_date,
+ status,
+
+
+ #{id},
+ #{createBy},
+ #{createTime},
+ #{updateBy},
+ #{updateTime},
+ #{remark},
+ #{vin},
+ #{vehicleModel},
+ #{vehicleName},
+ #{color},
+ #{productionDate},
+ #{status},
+
+
+
+
+ update aima_vehicle
+
+ create_by = #{createBy},
+ create_time = #{createTime},
+ update_by = #{updateBy},
+ update_time = #{updateTime},
+ remark = #{remark},
+ vin = #{vin},
+ vehicle_model = #{vehicleModel},
+ vehicle_name = #{vehicleName},
+ color = #{color},
+ production_date = #{productionDate},
+ status = #{status},
+
+ where id = #{id}
+
+
+
+ delete from aima_vehicle where id = #{id}
+
+
+
+ delete from aima_vehicle where id in
+
+ #{id}
+
+
+
diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeTaskConfigInfoServiceImpl.java b/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeTaskConfigInfoServiceImpl.java
index 36ba4b0..c03cb93 100644
--- a/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeTaskConfigInfoServiceImpl.java
+++ b/cmvr-iot-test/src/main/java/com/cmvr/test/service/impl/TeTaskConfigInfoServiceImpl.java
@@ -12,7 +12,7 @@ import com.cmvr.test.model.vo.TeTaskConfigInfoVO;
import com.cmvr.test.service.ITeTaskConfigInfoService;
import com.cmvr.test.service.ITeTaskOrchestrationService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.Arrays;
@@ -24,10 +24,13 @@ import java.util.List;
* @author cmvr-iot
*/
@Service
-@RequiredArgsConstructor
public class TeTaskConfigInfoServiceImpl extends ServiceImpl implements ITeTaskConfigInfoService {
private final ITeTaskOrchestrationService taskOrchestrationService;
+
+ public TeTaskConfigInfoServiceImpl(@Lazy ITeTaskOrchestrationService taskOrchestrationService) {
+ this.taskOrchestrationService = taskOrchestrationService;
+ }
/**
* 查询任务流程编排
*
diff --git a/pom.xml b/pom.xml
index 2887975..55dd59f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -309,6 +309,13 @@
${cmvr-iot.version}
+
+
+ com.cmvr
+ cmvr-iot-aima
+ ${cmvr-iot.version}
+
+
cn.hutool
@@ -346,6 +353,7 @@
cmvr-iot-ti
cmvr-iot-evaluation
cmvr-iot-inspection
+ cmvr-iot-aima
pom
diff --git a/sql/aima_module.sql b/sql/aima_module.sql
new file mode 100644
index 0000000..d7f23ae
--- /dev/null
+++ b/sql/aima_module.sql
@@ -0,0 +1,210 @@
+-- ----------------------------
+-- 爱玛电动车测试模块数据库表设计
+-- ----------------------------
+
+-- ----------------------------
+-- 1、手机管理表
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_phone`;
+CREATE TABLE `aima_phone` (
+ `id` varchar(64) NOT NULL COMMENT '主键ID',
+ `phone_name` varchar(100) DEFAULT NULL COMMENT '手机名称',
+ `phone_model` varchar(100) DEFAULT NULL COMMENT '手机型号',
+ `os_system` varchar(50) DEFAULT NULL COMMENT '操作系统(Android/iOS)',
+ `os_version` varchar(50) DEFAULT NULL COMMENT '系统版本',
+ `specifications` varchar(500) DEFAULT NULL COMMENT '规格参数',
+ `manufacturer` varchar(100) DEFAULT NULL COMMENT '厂商',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛手机管理表';
+
+-- ----------------------------
+-- 2、车辆管理表
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_vehicle`;
+CREATE TABLE `aima_vehicle` (
+ `id` varchar(64) NOT NULL COMMENT '主键ID',
+ `vin` varchar(50) DEFAULT NULL COMMENT '车架号(VIN)',
+ `vehicle_model` varchar(100) DEFAULT NULL COMMENT '车型',
+ `vehicle_name` varchar(100) DEFAULT NULL COMMENT '车辆名称',
+ `color` varchar(50) DEFAULT NULL COMMENT '颜色',
+ `production_date` date DEFAULT NULL COMMENT '生产日期',
+ `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_vin` (`vin`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛车辆管理表';
+
+-- ----------------------------
+-- 3、测试用例管理表(对标巡检点位)
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_test_case`;
+CREATE TABLE `aima_test_case` (
+ `id` varchar(64) NOT NULL COMMENT '主键ID',
+ `case_code` varchar(50) DEFAULT NULL COMMENT '用例编码',
+ `case_name` varchar(100) DEFAULT NULL COMMENT '用例名称',
+ `case_category` varchar(50) DEFAULT NULL COMMENT '用例分类(功能测试/性能测试/安全测试等)',
+ `test_description` text COMMENT '测试描述',
+ `precondition` text COMMENT '前置条件',
+ `test_steps` text COMMENT '测试步骤',
+ `expected_result` text COMMENT '预期结果',
+ `priority` char(1) DEFAULT '2' COMMENT '优先级(1高 2中 3低)',
+ `enabled` char(1) DEFAULT '0' COMMENT '是否启用(0启用 1禁用)',
+ `sort_order` int DEFAULT '0' COMMENT '排序号',
+ `estimated_duration` int DEFAULT NULL COMMENT '预计执行时长(秒)',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `detect_item_id` varchar(64) DEFAULT NULL COMMENT '检测项ID',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_case_code` (`case_code`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛测试用例表';
+
+-- ----------------------------
+-- 4、任务管理表
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_task`;
+CREATE TABLE `aima_task` (
+ `id` varchar(64) NOT NULL COMMENT '主键ID',
+ `task_code` varchar(50) DEFAULT NULL COMMENT '任务编码',
+ `task_name` varchar(100) DEFAULT NULL COMMENT '任务名称',
+ `task_type` char(1) DEFAULT '1' COMMENT '任务类型(1常规测试 2回归测试 3专项测试)',
+ `phone_id` varchar(64) DEFAULT NULL COMMENT '手机ID',
+ `vehicle_id` varchar(64) DEFAULT NULL COMMENT '车辆ID',
+ `test_case_count` int DEFAULT '0' COMMENT '测试用例数量',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `task_config_id` varchar(64) DEFAULT NULL COMMENT '任务配置ID',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_task_code` (`task_code`),
+ KEY `idx_phone_id` (`phone_id`),
+ KEY `idx_vehicle_id` (`vehicle_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛任务管理表';
+
+-- ----------------------------
+-- 5、任务与测试用例关联表
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_task_test_case`;
+CREATE TABLE `aima_task_test_case` (
+ `task_id` varchar(64) NOT NULL COMMENT '任务ID',
+ `test_case_id` varchar(64) NOT NULL COMMENT '测试用例ID',
+ `sort_order` int(11) DEFAULT '0' COMMENT '排序号',
+ PRIMARY KEY (`task_id`, `test_case_id`),
+ KEY `idx_task_id` (`task_id`),
+ KEY `idx_test_case_id` (`test_case_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛任务与测试用例关联表';
+
+-- ----------------------------
+-- 6、任务执行实例表
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_task_instance`;
+CREATE TABLE `aima_task_instance` (
+ `id` varchar(64) NOT NULL COMMENT '主键ID',
+ `task_id` varchar(64) DEFAULT NULL COMMENT '任务ID',
+ `phone_id` varchar(64) DEFAULT NULL COMMENT '手机ID',
+ `vehicle_id` varchar(64) DEFAULT NULL COMMENT '车辆ID',
+ `execution_number` int DEFAULT '1' COMMENT '第几次执行',
+ `status` int DEFAULT '0' COMMENT '执行状态(0待执行 1执行中 2已完成 3已取消 4执行失败 5已暂停)',
+ `total_cases` int DEFAULT '0' COMMENT '总用例数',
+ `completed_cases` int DEFAULT '0' COMMENT '已完成用例数',
+ `passed_cases` int DEFAULT '0' COMMENT '通过用例数',
+ `failed_cases` int DEFAULT '0' COMMENT '失败用例数',
+ `progress` decimal(5,2) DEFAULT '0.00' COMMENT '执行进度(百分比,保留2位小数)',
+ `start_time` datetime DEFAULT NULL COMMENT '开始时间',
+ `end_time` datetime DEFAULT NULL COMMENT '结束时间',
+ `remark` varchar(500) DEFAULT NULL COMMENT '备注',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ `task_ins_id` varchar(64) DEFAULT NULL COMMENT '任务执行实例ID',
+ PRIMARY KEY (`id`),
+ KEY `idx_task_id` (`task_id`),
+ KEY `idx_phone_id` (`phone_id`),
+ KEY `idx_vehicle_id` (`vehicle_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛任务执行实例表';
+
+-- ----------------------------
+-- 6、日志管理表(单独存表)
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_test_log`;
+CREATE TABLE `aima_test_log` (
+ `id` varchar(64) NOT NULL COMMENT '主键ID',
+ `task_instance_id` varchar(64) DEFAULT NULL COMMENT '任务执行实例ID',
+ `task_id` varchar(64) DEFAULT NULL COMMENT '任务ID',
+ `task_name` varchar(100) DEFAULT NULL COMMENT '任务名称',
+ `test_case_id` varchar(64) DEFAULT NULL COMMENT '测试用例ID',
+ `case_name` varchar(100) DEFAULT NULL COMMENT '用例名称',
+ `log_level` varchar(20) DEFAULT 'INFO' COMMENT '日志级别(DEBUG/INFO/WARN/ERROR)',
+ `log_type` varchar(50) DEFAULT NULL COMMENT '日志类型(执行日志/系统日志/异常日志)',
+ `log_message` text COMMENT '日志内容',
+ `log_time` datetime DEFAULT NULL COMMENT '日志时间',
+ `execution_step` varchar(100) DEFAULT NULL COMMENT '执行步骤',
+ `actual_result` text COMMENT '实际结果',
+ `test_status` char(1) DEFAULT NULL COMMENT '测试结果(0未执行 1通过 2失败 3跳过)',
+ `screenshot_url` varchar(500) DEFAULT NULL COMMENT '截图URL',
+ `video_url` varchar(500) DEFAULT NULL COMMENT '视频URL',
+ `error_stack` text COMMENT '错误堆栈',
+ `duration_ms` bigint DEFAULT NULL COMMENT '执行耗时(毫秒)',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `progress` decimal(5,2) DEFAULT '0.00' COMMENT '执行进度(百分比,保留2位小数)',
+ `status` char(1) DEFAULT '0' COMMENT '执行状态(0进行中 1已完成 2已暂停 3已取消 4已失败)',
+ PRIMARY KEY (`id`),
+ KEY `idx_task_instance_id` (`task_instance_id`),
+ KEY `idx_task_id` (`task_id`),
+ KEY `idx_test_case_id` (`test_case_id`),
+ KEY `idx_log_time` (`log_time`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛测试日志表';
+
+-- ----------------------------
+-- 7、告警管理表
+-- ----------------------------
+DROP TABLE IF EXISTS `aima_alarm`;
+CREATE TABLE `aima_alarm` (
+ `id` varchar(64) NOT NULL COMMENT '主键ID',
+ `alarm_code` varchar(50) DEFAULT NULL COMMENT '告警编码',
+ `task_instance_id` varchar(64) DEFAULT NULL COMMENT '任务执行实例ID',
+ `task_id` varchar(64) DEFAULT NULL COMMENT '任务ID',
+ `task_name` varchar(100) DEFAULT NULL COMMENT '任务名称',
+ `phone_id` varchar(64) DEFAULT NULL COMMENT '手机ID',
+ `phone_name` varchar(100) DEFAULT NULL COMMENT '手机名称',
+ `vehicle_id` varchar(64) DEFAULT NULL COMMENT '车辆ID',
+ `vin` varchar(50) DEFAULT NULL COMMENT '车架号',
+ `test_case_id` varchar(64) DEFAULT NULL COMMENT '测试用例ID',
+ `case_name` varchar(100) DEFAULT NULL COMMENT '用例名称',
+ `alarm_level` char(1) DEFAULT '2' COMMENT '告警级别(1提示 2警告 3严重)',
+ `alarm_type` char(1) DEFAULT '1' COMMENT '告警类型(1设备异常 2测试异常 3通信异常 4性能异常)',
+ `alarm_title` varchar(200) DEFAULT NULL COMMENT '告警标题',
+ `alarm_content` text COMMENT '告警内容',
+ `alarm_location` varchar(200) DEFAULT NULL COMMENT '告警位置/步骤',
+ `alarm_time` datetime DEFAULT NULL COMMENT '告警时间',
+ `handle_status` char(1) DEFAULT '0' COMMENT '处理状态(0未处理 1处理中 2已处理 3已忽略)',
+ `handler` varchar(64) DEFAULT NULL COMMENT '处理人',
+ `handle_time` datetime DEFAULT NULL COMMENT '处理时间',
+ `handle_remark` varchar(500) DEFAULT NULL COMMENT '处理说明',
+ `evidence_image` varchar(500) DEFAULT NULL COMMENT '图片证据',
+ `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
+ `update_time` datetime DEFAULT NULL COMMENT '更新时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_alarm_code` (`alarm_code`),
+ KEY `idx_task_instance_id` (`task_instance_id`),
+ KEY `idx_task_id` (`task_id`),
+ KEY `idx_alarm_time` (`alarm_time`),
+ KEY `idx_handle_status` (`handle_status`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='爱玛告警管理表';
diff --git a/智能巡检模块-创建说明.md b/智能巡检模块-创建说明.md
deleted file mode 100644
index b9a7e49..0000000
--- a/智能巡检模块-创建说明.md
+++ /dev/null
@@ -1,276 +0,0 @@
-# 智能巡检模块 - 已创建文件清单
-
-## ✅ 已完成创建的文件
-
-### 1. 模块配置
-- ✅ `cmvr-iot-inspection/pom.xml` - 模块Maven配置
-- ✅ `pom.xml` - 父POM已添加模块依赖
-- ✅ `cmvr-iot-admin/pom.xml` - Admin模块已添加inspection依赖
-
-### 2. 实体类(Domain)- 5个
-- ✅ `InspectionRobot.java` - 巡检机器人实体
-- ✅ `InspectionMap.java` - 巡检地图实体
-- ✅ `InspectionTask.java` - 巡检任务实体
-- ✅ `InspectionWaypoint.java` - 巡检点位实体
-- ✅ `InspectionAlarm.java` - 巡检告警实体
-
----
-
-## 📋 还需要创建的文件(参照 cmvr-iot-device 模块模式)
-
-### 3. Mapper 接口(5个)
-位置:`cmvr-iot-inspection/src/main/java/com/cmvr/inspection/mapper/`
-
-需要创建:
-- `InspectionRobotMapper.java`
-- `InspectionMapMapper.java`
-- `InspectionTaskMapper.java`
-- `InspectionWaypointMapper.java`
-- `InspectionAlarmMapper.java`
-
-参考模板:`DeDeviceRegistrationMapper.java`
-
-### 4. Mapper XML(5个)
-位置:`cmvr-iot-inspection/src/main/resources/mapper/inspection/`
-
-需要创建:
-- `InspectionRobotMapper.xml`
-- `InspectionMapMapper.xml`
-- `InspectionTaskMapper.xml`
-- `InspectionWaypointMapper.xml`
-- `InspectionAlarmMapper.xml`
-
-参考模板:`DeDeviceRegistrationMapper.xml`
-
-### 5. Service 接口(5个)
-位置:`cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/`
-
-需要创建:
-- `IInspectionRobotService.java`
-- `IInspectionMapService.java`
-- `IInspectionTaskService.java`
-- `IInspectionWaypointService.java`
-- `IInspectionAlarmService.java`
-
-参考模板:`IDeDeviceRegistrationService.java`
-
-### 6. Service 实现类(5个)
-位置:`cmvr-iot-inspection/src/main/java/com/cmvr/inspection/service/impl/`
-
-需要创建:
-- `InspectionRobotServiceImpl.java`
-- `InspectionMapServiceImpl.java`
-- `InspectionTaskServiceImpl.java`
-- `InspectionWaypointServiceImpl.java`
-- `InspectionAlarmServiceImpl.java`
-
-参考模板:`DeDeviceRegistrationServiceImpl.java`
-
-### 7. Controller(5个)
-位置:`cmvr-iot-admin/src/main/java/com/cmvr/web/controller/inspection/`
-
-需要创建:
-- `InspectionRobotController.java`
-- `InspectionMapController.java`
-- `InspectionTaskController.java`
-- `InspectionWaypointController.java`
-- `InspectionAlarmController.java`
-
-参考模板:`DeDeviceRegistrationController.java`
-
-### 8. 数据库脚本
-位置:项目根目录或 `sql/` 目录
-
-需要创建:
-- `inspection_module.sql` - 包含5张表的建表语句
-
----
-
-## 🗄️ 数据库表结构
-
-### 1. inspection_robot (巡检机器人表)
-```sql
-CREATE TABLE `inspection_robot` (
- `id` varchar(64) NOT NULL,
- `robot_code` varchar(64) NOT NULL COMMENT '机器人编码',
- `robot_name` varchar(100) NOT NULL COMMENT '机器人名称',
- `robot_model` varchar(100) DEFAULT NULL COMMENT '机器人型号',
- `robot_type` varchar(50) DEFAULT NULL COMMENT '机器人类型',
- `ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址',
- `port` int(11) DEFAULT NULL COMMENT '端口号',
- `map_id` varchar(64) DEFAULT NULL COMMENT '关联地图ID',
- `status` char(1) DEFAULT '0' COMMENT '状态(0在线 1离线 2充电中 3巡检中)',
- `battery_level` int(3) DEFAULT NULL COMMENT '电量百分比',
- `current_position` varchar(200) DEFAULT NULL COMMENT '当前位置',
- `remark` varchar(500) DEFAULT NULL COMMENT '备注',
- `create_by` varchar(64) DEFAULT '',
- `create_time` datetime DEFAULT NULL,
- `update_by` varchar(64) DEFAULT '',
- `update_time` datetime DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_robot_code` (`robot_code`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-```
-
-### 2. inspection_map (巡检地图表)
-```sql
-CREATE TABLE `inspection_map` (
- `id` varchar(64) NOT NULL,
- `map_code` varchar(64) NOT NULL COMMENT '地图编码',
- `map_name` varchar(100) NOT NULL COMMENT '地图名称',
- `map_type` char(1) DEFAULT '1' COMMENT '地图类型(1室内 2室外)',
- `map_file_path` varchar(500) DEFAULT NULL COMMENT '地图文件路径',
- `map_image_path` varchar(500) DEFAULT NULL COMMENT '地图图片路径',
- `resolution` decimal(10,4) DEFAULT NULL COMMENT '分辨率(米/像素)',
- `width` int(11) DEFAULT NULL COMMENT '地图宽度(像素)',
- `height` int(11) DEFAULT NULL COMMENT '地图高度(像素)',
- `origin_x` decimal(10,2) DEFAULT NULL COMMENT '原点X坐标',
- `origin_y` decimal(10,2) DEFAULT NULL COMMENT '原点Y坐标',
- `status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
- `remark` varchar(500) DEFAULT NULL COMMENT '备注',
- `create_by` varchar(64) DEFAULT '',
- `create_time` datetime DEFAULT NULL,
- `update_by` varchar(64) DEFAULT '',
- `update_time` datetime DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_map_code` (`map_code`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-```
-
-### 3. inspection_task (巡检任务表)
-```sql
-CREATE TABLE `inspection_task` (
- `id` varchar(64) NOT NULL,
- `task_code` varchar(64) NOT NULL COMMENT '任务编码',
- `task_name` varchar(100) NOT NULL COMMENT '任务名称',
- `robot_id` varchar(64) DEFAULT NULL COMMENT '机器人ID',
- `robot_name` varchar(100) DEFAULT NULL COMMENT '机器人名称',
- `map_id` varchar(64) DEFAULT NULL COMMENT '地图ID',
- `map_name` varchar(100) DEFAULT NULL COMMENT '地图名称',
- `task_type` char(1) DEFAULT '1' COMMENT '任务类型(1立即执行 2定时执行 3周期执行)',
- `priority` char(1) DEFAULT '2' COMMENT '优先级(1低 2中 3高)',
- `waypoints` text COMMENT '巡检点位列表(JSON格式)',
- `scheduled_start_time` datetime DEFAULT NULL COMMENT '计划开始时间',
- `scheduled_end_time` datetime DEFAULT NULL COMMENT '计划结束时间',
- `actual_start_time` datetime DEFAULT NULL COMMENT '实际开始时间',
- `actual_end_time` datetime DEFAULT NULL COMMENT '实际结束时间',
- `status` char(1) DEFAULT '0' COMMENT '任务状态(0待执行 1执行中 2已完成 3已取消 4失败)',
- `progress` int(3) DEFAULT '0' COMMENT '进度百分比',
- `cron_expression` varchar(100) DEFAULT NULL COMMENT 'Cron表达式',
- `remark` varchar(500) DEFAULT NULL COMMENT '备注',
- `create_by` varchar(64) DEFAULT '',
- `create_time` datetime DEFAULT NULL,
- `update_by` varchar(64) DEFAULT '',
- `update_time` datetime DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_task_code` (`task_code`),
- KEY `idx_robot_id` (`robot_id`),
- KEY `idx_status` (`status`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-```
-
-### 4. inspection_waypoint (巡检点位表)
-```sql
-CREATE TABLE `inspection_waypoint` (
- `id` varchar(64) NOT NULL,
- `waypoint_code` varchar(64) NOT NULL COMMENT '点位编码',
- `waypoint_name` varchar(100) NOT NULL COMMENT '点位名称',
- `map_id` varchar(64) NOT NULL COMMENT '所属地图ID',
- `map_name` varchar(100) DEFAULT NULL COMMENT '所属地图名称',
- `x_coordinate` decimal(10,2) DEFAULT NULL COMMENT 'X坐标',
- `y_coordinate` decimal(10,2) DEFAULT NULL COMMENT 'Y坐标',
- `z_coordinate` decimal(10,2) DEFAULT NULL COMMENT 'Z坐标',
- `orientation` decimal(5,2) DEFAULT NULL COMMENT '朝向角度',
- `waypoint_type` char(1) DEFAULT '1' COMMENT '点位类型(1普通点位 2充电点 3必经点)',
- `dwell_time` int(11) DEFAULT '0' COMMENT '停留时长(秒)',
- `enabled` char(1) DEFAULT '0' COMMENT '是否启用(0启用 1禁用)',
- `sort_order` int(11) DEFAULT '0' COMMENT '排序号',
- `remark` varchar(500) DEFAULT NULL COMMENT '备注',
- `create_by` varchar(64) DEFAULT '',
- `create_time` datetime DEFAULT NULL,
- `update_by` varchar(64) DEFAULT '',
- `update_time` datetime DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_waypoint_code` (`waypoint_code`),
- KEY `idx_map_id` (`map_id`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-```
-
-### 5. inspection_alarm (巡检告警表)
-```sql
-CREATE TABLE `inspection_alarm` (
- `id` varchar(64) NOT NULL,
- `alarm_code` varchar(64) NOT NULL COMMENT '告警编码',
- `task_id` varchar(64) DEFAULT NULL COMMENT '任务ID',
- `task_name` varchar(100) DEFAULT NULL COMMENT '任务名称',
- `robot_id` varchar(64) DEFAULT NULL COMMENT '机器人ID',
- `robot_name` varchar(100) DEFAULT NULL COMMENT '机器人名称',
- `alarm_level` char(1) DEFAULT '2' COMMENT '告警级别(1提示 2警告 3严重)',
- `alarm_type` char(1) DEFAULT NULL COMMENT '告警类型(1设备异常 2环境异常 3任务异常 4通信异常)',
- `alarm_title` varchar(200) DEFAULT NULL COMMENT '告警标题',
- `alarm_content` text COMMENT '告警内容',
- `alarm_location` varchar(200) DEFAULT NULL COMMENT '告警位置',
- `alarm_time` datetime DEFAULT NULL COMMENT '告警时间',
- `handle_status` char(1) DEFAULT '0' COMMENT '处理状态(0未处理 1处理中 2已处理 3已忽略)',
- `handler` varchar(64) DEFAULT NULL COMMENT '处理人',
- `handle_time` datetime DEFAULT NULL COMMENT '处理时间',
- `handle_remark` varchar(500) DEFAULT NULL COMMENT '处理说明',
- `evidence_image` varchar(500) DEFAULT NULL COMMENT '图片证据',
- `create_by` varchar(64) DEFAULT '',
- `create_time` datetime DEFAULT NULL,
- `update_by` varchar(64) DEFAULT '',
- `update_time` datetime DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_alarm_code` (`alarm_code`),
- KEY `idx_task_id` (`task_id`),
- KEY `idx_robot_id` (`robot_id`),
- KEY `idx_alarm_time` (`alarm_time`),
- KEY `idx_handle_status` (`handle_status`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-```
-
----
-
-## 🚀 后续步骤
-
-1. **创建 Mapper 层**:参照 `DeDeviceRegistrationMapper` 创建5个Mapper接口和XML
-2. **创建 Service 层**:参照 `IDeDeviceRegistrationService` 和实现类创建5个Service
-3. **创建 Controller 层**:参照 `DeDeviceRegistrationController` 创建5个Controller
-4. **执行数据库脚本**:在MySQL中执行上述5张表的建表SQL
-5. **配置菜单权限**:在系统管理中添加智能巡检相关菜单
-6. **开发前端页面**:创建对应的Vue页面
-
----
-
-## 📁 完整目录结构
-
-```
-cmvr-iot-inspection/
-├── pom.xml
-└── src/main/
- ├── java/com/cmvr/inspection/
- │ ├── domain/
- │ │ ├── InspectionRobot.java ✅
- │ │ ├── InspectionMap.java ✅
- │ │ ├── InspectionTask.java ✅
- │ │ ├── InspectionWaypoint.java ✅
- │ │ └── InspectionAlarm.java ✅
- │ ├── mapper/ (待创建)
- │ ├── service/ (待创建)
- │ │ └── impl/ (待创建)
- └── resources/
- └── mapper/inspection/ (待创建)
-
-cmvr-iot-admin/src/main/java/com/cmvr/web/controller/
-└── inspection/ (待创建)
-```
-
----
-
-## 💡 关键注意事项
-
-1. **不使用 @TableName 注解**:项目通过 MyBatis XML 映射表名
-2. **继承 BaseEntity**:包含 create_by, create_time, update_by, update_time 等公共字段
-3. **使用 UUID 主键**:`@TableId(value = "id", type = IdType.ASSIGN_UUID)`
-4. **遵循命名规范**:表名使用下划线,类名使用驼峰
-5. **权限标识**:如 `inspection:robot:list`、`inspection:robot:add` 等