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` 等