diff --git a/cmvr-iot-admin/pom.xml b/cmvr-iot-admin/pom.xml
index 8d72ab6..c9ed060 100644
--- a/cmvr-iot-admin/pom.xml
+++ b/cmvr-iot-admin/pom.xml
@@ -66,6 +66,12 @@
cmvr-iot-vi
+
+
+ com.cmvr
+ cmvr-iot-ti
+
+
dev
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleConfigController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleConfigController.java
new file mode 100644
index 0000000..e324a12
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleConfigController.java
@@ -0,0 +1,70 @@
+package com.cmvr.web.controller.ti;
+
+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.ti.model.domain.TiVehicleConfig;
+import com.cmvr.ti.model.vo.VehicleConfigTreeVO;
+import com.cmvr.ti.service.ITiVehicleConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "触控交互--车辆配置")
+@RestController
+@RequestMapping("/ti/config")
+@RequiredArgsConstructor
+public class TiVehicleConfigController extends BaseController {
+
+ private final ITiVehicleConfigService tiVehicleConfigService;
+
+ @ApiOperation("查询车辆配置列表")
+ @PreAuthorize("@ss.hasPermi('ti:config:list')")
+ @GetMapping("/list")
+ public List list() {
+ return tiVehicleConfigService.selectTiVehicleConfigList();
+ }
+
+ @ApiOperation("获取车辆配置详细信息")
+ @PreAuthorize("@ss.hasPermi('ti:config:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id) {
+ return success(tiVehicleConfigService.selectTiVehicleConfigById(id));
+ }
+
+ @ApiOperation("新增车辆配置")
+ @PreAuthorize("@ss.hasPermi('ti:config:add')")
+ @Log(title = "车辆配置", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody TiVehicleConfig tiVehicleConfig) {
+ return toAjax(tiVehicleConfigService.insertTiVehicleConfig(tiVehicleConfig));
+ }
+
+ @ApiOperation("修改车辆配置")
+ @PreAuthorize("@ss.hasPermi('ti:config:edit')")
+ @Log(title = "车辆配置", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody TiVehicleConfig tiVehicleConfig) {
+ return toAjax(tiVehicleConfigService.updateTiVehicleConfig(tiVehicleConfig));
+ }
+
+ @ApiOperation("删除车辆配置")
+ @PreAuthorize("@ss.hasPermi('ti:config:remove')")
+ @Log(title = "车辆配置", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids) {
+ return toAjax(tiVehicleConfigService.deleteTiVehicleConfigByIds(ids));
+ }
+}
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleFunctionController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleFunctionController.java
new file mode 100644
index 0000000..d9ebaa3
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleFunctionController.java
@@ -0,0 +1,71 @@
+package com.cmvr.web.controller.ti;
+
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.core.page.TableDataInfo;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.ti.model.domain.TiVehicleFunction;
+import com.cmvr.ti.service.ITiVehicleFunctionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "触控交互--车机功能")
+@RestController
+@RequestMapping("/ti/function")
+@RequiredArgsConstructor
+public class TiVehicleFunctionController extends BaseController {
+ private final ITiVehicleFunctionService tiVehicleFunctionService;
+
+ @ApiOperation("查询车机功能列表")
+ @PreAuthorize("@ss.hasPermi('ti:function:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(TiVehicleFunction tiVehicleFunction) {
+ startPage();
+ List list = tiVehicleFunctionService.selectTiVehicleFunctionList(tiVehicleFunction);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("获取车机功能详细信息")
+ @PreAuthorize("@ss.hasPermi('ti:function:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id) {
+ return success(tiVehicleFunctionService.selectTiVehicleFunctionById(id));
+ }
+
+ @ApiOperation("新增车机功能")
+ @PreAuthorize("@ss.hasPermi('ti:function:add')")
+ @Log(title = "车机功能", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody TiVehicleFunction tiVehicleConfig) {
+ return toAjax(tiVehicleFunctionService.insertTiVehicleFunction(tiVehicleConfig));
+ }
+
+ @ApiOperation("修改车机功能")
+ @PreAuthorize("@ss.hasPermi('ti:function:edit')")
+ @Log(title = "车机功能", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody TiVehicleFunction tiVehicleConfig) {
+ return toAjax(tiVehicleFunctionService.updateTiVehicleFunction(tiVehicleConfig));
+ }
+
+ @ApiOperation("删除车机功能")
+ @PreAuthorize("@ss.hasPermi('ti:function:remove')")
+ @Log(title = "车机功能", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids) {
+ return toAjax(tiVehicleFunctionService.deleteTiVehicleFunctionByIds(ids));
+ }
+}
diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleUiController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleUiController.java
new file mode 100644
index 0000000..825cbd6
--- /dev/null
+++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/ti/TiVehicleUiController.java
@@ -0,0 +1,72 @@
+package com.cmvr.web.controller.ti;
+
+import com.cmvr.common.annotation.Log;
+import com.cmvr.common.core.controller.BaseController;
+import com.cmvr.common.core.domain.AjaxResult;
+import com.cmvr.common.core.page.TableDataInfo;
+import com.cmvr.common.enums.BusinessType;
+import com.cmvr.ti.model.domain.TiVehicleUi;
+import com.cmvr.ti.service.ITiVehicleFunctionService;
+import com.cmvr.ti.service.ITiVehicleUiService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "触控交互--车机界面")
+@RestController
+@RequestMapping("/ti/ui")
+@RequiredArgsConstructor
+public class TiVehicleUiController extends BaseController {
+ private final ITiVehicleUiService tiVehicleUiService;
+
+ @ApiOperation("查询车机功能列表")
+ @PreAuthorize("@ss.hasPermi('ti:ui:list')")
+ @GetMapping("/list")
+ public TableDataInfo list(TiVehicleUi tiVehicleUi) {
+ startPage();
+ List list = tiVehicleUiService.selectTiVehicleUiList(tiVehicleUi);
+ return getDataTable(list);
+ }
+
+ @ApiOperation("获取车机功能详细信息")
+ @PreAuthorize("@ss.hasPermi('ti:ui:query')")
+ @GetMapping(value = "/{id}")
+ public AjaxResult getInfo(@PathVariable("id") Long id) {
+ return success(tiVehicleUiService.selectTiVehicleUiById(id));
+ }
+
+ @ApiOperation("新增车机功能")
+ @PreAuthorize("@ss.hasPermi('ti:ui:add')")
+ @Log(title = "车机界面", businessType = BusinessType.INSERT)
+ @PostMapping
+ public AjaxResult add(@RequestBody TiVehicleUi tiVehicleUi) {
+ return toAjax(tiVehicleUiService.insertTiVehicleUi(tiVehicleUi));
+ }
+
+ @ApiOperation("修改车机功能")
+ @PreAuthorize("@ss.hasPermi('ti:ui:edit')")
+ @Log(title = "车机界面", businessType = BusinessType.UPDATE)
+ @PutMapping
+ public AjaxResult edit(@RequestBody TiVehicleUi tiVehicleUi) {
+ return toAjax(tiVehicleUiService.updateTiVehicleUi(tiVehicleUi));
+ }
+
+ @ApiOperation("删除车机功能")
+ @PreAuthorize("@ss.hasPermi('ti:ui:remove')")
+ @Log(title = "车机界面", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public AjaxResult remove(@PathVariable Long[] ids) {
+ return toAjax(tiVehicleUiService.deleteTiVehicleUiByIds(ids));
+ }
+}
diff --git a/cmvr-iot-ti/pom.xml b/cmvr-iot-ti/pom.xml
new file mode 100644
index 0000000..df5344e
--- /dev/null
+++ b/cmvr-iot-ti/pom.xml
@@ -0,0 +1,33 @@
+
+
+ 4.0.0
+
+ com.cmvr
+ cmvr-iot
+ 3.8.9
+
+
+ cmvr-iot-ti
+
+
+ 触控交互模块
+
+
+
+
+
+
+ com.cmvr
+ cmvr-iot-common
+
+
+
+
+ com.cmvr
+ cmvr-iot-test
+
+
+
+
+
\ No newline at end of file
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleConfigMapper.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleConfigMapper.java
new file mode 100644
index 0000000..1caa2e9
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleConfigMapper.java
@@ -0,0 +1,10 @@
+package com.cmvr.ti.mapper;
+
+import com.cmvr.ti.model.domain.TiVehicleConfig;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 车辆配置Mapper接口
+ */
+public interface TiVehicleConfigMapper extends MPJBaseMapper {
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleFunctionMapper.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleFunctionMapper.java
new file mode 100644
index 0000000..3dfd64c
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleFunctionMapper.java
@@ -0,0 +1,10 @@
+package com.cmvr.ti.mapper;
+
+import com.cmvr.ti.model.domain.TiVehicleFunction;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 车机功能Mapper接口
+ */
+public interface TiVehicleFunctionMapper extends MPJBaseMapper {
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleUiMapper.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleUiMapper.java
new file mode 100644
index 0000000..3ce03e9
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/mapper/TiVehicleUiMapper.java
@@ -0,0 +1,10 @@
+package com.cmvr.ti.mapper;
+
+import com.cmvr.ti.model.domain.TiVehicleUi;
+import com.github.yulichang.base.MPJBaseMapper;
+
+/**
+ * 车机界面Mapper接口
+ */
+public interface TiVehicleUiMapper extends MPJBaseMapper {
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleConfig.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleConfig.java
new file mode 100644
index 0000000..dc96f8f
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleConfig.java
@@ -0,0 +1,28 @@
+package com.cmvr.ti.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.cmvr.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("触控交互--车辆配置")
+public class TiVehicleConfig extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.AUTO)
+ @ApiModelProperty("主键ID")
+ private Long id;
+
+ @ApiModelProperty("父节点ID(0 表示根节点)")
+ private Long parentId;
+
+ @ApiModelProperty("节点名称")
+ private String name;
+
+ @ApiModelProperty("节点类型(oem / model / version)")
+ private String type;
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleFunction.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleFunction.java
new file mode 100644
index 0000000..61fc564
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleFunction.java
@@ -0,0 +1,34 @@
+package com.cmvr.ti.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.cmvr.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("触控交互--车机功能")
+public class TiVehicleFunction extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.AUTO)
+ @ApiModelProperty("主键ID")
+ private Long id;
+
+ @ApiModelProperty("车辆配置ID")
+ private Long vehicleConfigId;
+
+ @ApiModelProperty("所属界面ID")
+ private Long uiId;
+
+ @ApiModelProperty("功能字典键值(sys_dict_data.value)")
+ private String funcKey;
+
+ @ApiModelProperty("图标URL")
+ private String iconUrl;
+
+ @ApiModelProperty("备注")
+ private String remark;
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleUi.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleUi.java
new file mode 100644
index 0000000..5a4e2f1
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/domain/TiVehicleUi.java
@@ -0,0 +1,32 @@
+package com.cmvr.ti.model.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.cmvr.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("触控交互--车机界面")
+@Data
+public class TiVehicleUi extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ @TableId(type = IdType.AUTO)
+ @ApiModelProperty("主键ID")
+ private Long id;
+
+ @ApiModelProperty("车辆配置ID")
+ private Long vehicleConfigId;
+
+ @ApiModelProperty("界面功能")
+ private String funcIds;
+
+ @ApiModelProperty("界面字典键值(sys_dict_data.value)")
+ private String uiKey;
+
+ @ApiModelProperty("界面截图URL")
+ private String uiUrl;
+
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/te.sql b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/te.sql
new file mode 100644
index 0000000..b27f9ad
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/te.sql
@@ -0,0 +1,65 @@
+CREATE TABLE `te_vehicle_config`
+(
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+
+ `oem` VARCHAR(50) NOT NULL COMMENT '车企名称',
+ `model` VARCHAR(50) NOT NULL COMMENT '车型名称',
+ `version` VARCHAR(50) NOT 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 '更新时间',
+
+ PRIMARY KEY (`id`)
+
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='触控交互-车辆配置表';
+
+
+DROP TABLE IF EXISTS `ti_vehicle_ui`;
+CREATE TABLE `ti_vehicle_ui`
+(
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+
+ `vehicle_config_id` BIGINT(20) NOT NULL COMMENT '所属车辆配置ID(te_vehicle_config.id)',
+
+ `ui_key` VARCHAR(50) NOT NULL COMMENT '界面字典键值(来自 sys_dict_data.value)',
+
+ `ui_url` VARCHAR(255) DEFAULT NULL COMMENT '界面截图URL',
+
+ `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 COMMENT='触控交互-车机界面表';
+
+
+DROP TABLE IF EXISTS `ti_vehicle_function`;
+CREATE TABLE `ti_vehicle_function`
+(
+ `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
+
+ `vehicle_config_id` BIGINT(20) NOT NULL COMMENT '关联车辆配置ID(te_vehicle_config.id)',
+ `ui_id` BIGINT(20) NOT NULL COMMENT '所属界面ID(ti_vehicle_ui.id)',
+
+ `func_key` VARCHAR(50) NOT NULL COMMENT '功能字典键值(来自 sys_dict_data.value)',
+
+ `icon_url` VARCHAR(255) DEFAULT NULL COMMENT '图标URL(可选)',
+
+ `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 COMMENT='触控交互-车机功能表';
+
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/vo/VehicleConfigTreeVO.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/vo/VehicleConfigTreeVO.java
new file mode 100644
index 0000000..39c699d
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/vo/VehicleConfigTreeVO.java
@@ -0,0 +1,30 @@
+package com.cmvr.ti.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("车辆配置树形VO")
+public class VehicleConfigTreeVO {
+
+ @ApiModelProperty("节点ID(对应车辆配置ID)")
+ private Long id;
+
+ @ApiModelProperty("父节点ID(0表示根节点)")
+ private Long parentId;
+
+ @ApiModelProperty("节点名称")
+ private String label;
+
+ @ApiModelProperty("节点类型(oem / model / version)")
+ private String type;
+
+ @ApiModelProperty("描述")
+ private String remark;
+
+ @ApiModelProperty("子节点")
+ private List children;
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleConfigService.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleConfigService.java
new file mode 100644
index 0000000..20e15b0
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleConfigService.java
@@ -0,0 +1,56 @@
+package com.cmvr.ti.service;
+
+import com.cmvr.ti.model.domain.TiVehicleConfig;
+import com.cmvr.ti.model.vo.VehicleConfigTreeVO;
+
+import java.util.List;
+
+/**
+ * 车辆配置Service接口
+ */
+public interface ITiVehicleConfigService {
+ /**
+ * 查询车辆配置
+ *
+ * @param id 车辆配置主键
+ * @return 车辆配置
+ */
+ public TiVehicleConfig selectTiVehicleConfigById(Long id);
+
+ /**
+ * 查询车辆配置列表
+ */
+ public List selectTiVehicleConfigList();
+
+ /**
+ * 新增车辆配置
+ *
+ * @param tiVehicleConfig 车辆配置
+ * @return 结果
+ */
+ public int insertTiVehicleConfig(TiVehicleConfig tiVehicleConfig);
+
+ /**
+ * 修改车辆配置
+ *
+ * @param tiVehicleConfig 车辆配置
+ * @return 结果
+ */
+ public int updateTiVehicleConfig(TiVehicleConfig tiVehicleConfig);
+
+ /**
+ * 批量删除车辆配置
+ *
+ * @param ids 需要删除的车辆配置主键集合
+ * @return 结果
+ */
+ public int deleteTiVehicleConfigByIds(Long[] ids);
+
+ /**
+ * 删除车辆配置信息
+ *
+ * @param id 车辆配置主键
+ * @return 结果
+ */
+ public int deleteTiVehicleConfigById(Long id);
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleFunctionService.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleFunctionService.java
new file mode 100644
index 0000000..df06c86
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleFunctionService.java
@@ -0,0 +1,51 @@
+package com.cmvr.ti.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cmvr.ti.model.domain.TiVehicleFunction;
+
+import java.util.List;
+
+/**
+ * 车辆功能Service接口
+ */
+public interface ITiVehicleFunctionService extends IService {
+ /**
+ * 查询车辆功能
+ *
+ * @param id 车辆功能主键
+ * @return 车辆功能
+ */
+ public TiVehicleFunction selectTiVehicleFunctionById(Long id);
+
+ /**
+ * 查询车辆功能列表
+ *
+ * @param tiVehicleFunction 车辆功能
+ * @return 列表
+ */
+ public List selectTiVehicleFunctionList(TiVehicleFunction tiVehicleFunction);
+
+ /**
+ * 新增车辆功能
+ *
+ * @param tiVehicleFunction 车辆功能
+ * @return 结果
+ */
+ public int insertTiVehicleFunction(TiVehicleFunction tiVehicleFunction);
+
+ /**
+ * 修改车辆功能
+ *
+ * @param tiVehicleFunction 车辆功能
+ * @return 结果
+ */
+ public int updateTiVehicleFunction(TiVehicleFunction tiVehicleFunction);
+
+ /**
+ * 批量删除车辆功能
+ *
+ * @param ids 需要删除的车辆功能主键集合
+ * @return 结果
+ */
+ public int deleteTiVehicleFunctionByIds(Long[] ids);
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleUiService.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleUiService.java
new file mode 100644
index 0000000..3c665e8
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ITiVehicleUiService.java
@@ -0,0 +1,51 @@
+package com.cmvr.ti.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cmvr.ti.model.domain.TiVehicleUi;
+
+import java.util.List;
+
+/**
+ * 车机界面Service接口
+ */
+public interface ITiVehicleUiService extends IService {
+ /**
+ * 查询车机界面
+ *
+ * @param id 车机界面主键
+ * @return 车机界面
+ */
+ public TiVehicleUi selectTiVehicleUiById(Long id);
+
+ /**
+ * 查询车机界面列表
+ *
+ * @param TiVehicleUi 车机界面
+ * @return 车机界面集合
+ */
+ public List selectTiVehicleUiList(TiVehicleUi TiVehicleUi);
+
+ /**
+ * 新增车机界面
+ *
+ * @param TiVehicleUi 车机界面
+ * @return 结果
+ */
+ public int insertTiVehicleUi(TiVehicleUi TiVehicleUi);
+
+ /**
+ * 修改车机界面
+ *
+ * @param TiVehicleUi 车机界面
+ * @return 结果
+ */
+ public int updateTiVehicleUi(TiVehicleUi TiVehicleUi);
+
+ /**
+ * 批量删除车机界面
+ *
+ * @param ids 需要删除的车机界面主键集合
+ * @return 结果
+ */
+ public int deleteTiVehicleUiByIds(Long[] ids);
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleConfigServiceImpl.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleConfigServiceImpl.java
new file mode 100644
index 0000000..400c9b1
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleConfigServiceImpl.java
@@ -0,0 +1,119 @@
+package com.cmvr.ti.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cmvr.common.exception.GlobalException;
+import com.cmvr.ti.mapper.TiVehicleConfigMapper;
+import com.cmvr.ti.model.domain.TiVehicleConfig;
+import com.cmvr.ti.model.vo.VehicleConfigTreeVO;
+import com.cmvr.ti.service.ITiVehicleConfigService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 车辆配置Service业务层处理
+ */
+@Service
+@RequiredArgsConstructor
+public class TiVehicleConfigServiceImpl
+ extends ServiceImpl
+ implements ITiVehicleConfigService {
+
+ @Override
+ public TiVehicleConfig selectTiVehicleConfigById(Long id) {
+ return this.baseMapper.selectById(id);
+ }
+
+ /**
+ * 返回树结构:OEM → Model → Version
+ */
+ @Override
+ public List selectTiVehicleConfigList() {
+
+ // 1. 获取全部节点
+ List list = this.list();
+
+ // 2. 转为 VO
+ List treeNodes = list.stream().map(cfg -> {
+ VehicleConfigTreeVO vo = new VehicleConfigTreeVO();
+ vo.setId(cfg.getId());
+ vo.setParentId(cfg.getParentId());
+ vo.setLabel(cfg.getName());
+ vo.setType(cfg.getType());
+ vo.setRemark(cfg.getRemark());
+ return vo;
+ }).collect(Collectors.toList());
+
+ // 3. 组装树
+ return buildTree(treeNodes);
+ }
+
+ /**
+ * 标准树构建
+ */
+ private List buildTree(List nodes) {
+ Map map = nodes.stream()
+ .collect(Collectors.toMap(VehicleConfigTreeVO::getId, n -> n));
+
+ List root = new ArrayList<>();
+
+ for (VehicleConfigTreeVO node : nodes) {
+ if (node.getParentId() == 0) {
+ root.add(node);
+ } else {
+ VehicleConfigTreeVO parent = map.get(node.getParentId());
+ if (parent != null) {
+ if (parent.getChildren() == null) {
+ parent.setChildren(new ArrayList<>());
+ }
+ parent.getChildren().add(node);
+ }
+ }
+ }
+
+ return root;
+ }
+
+ @Override
+ public int insertTiVehicleConfig(TiVehicleConfig tiVehicleConfig) {
+ return this.baseMapper.insert(tiVehicleConfig);
+ }
+
+ @Override
+ public int updateTiVehicleConfig(TiVehicleConfig tiVehicleConfig) {
+ return this.baseMapper.updateById(tiVehicleConfig);
+ }
+
+ @Override
+ public int deleteTiVehicleConfigByIds(Long[] ids) {
+ for (Long id : ids) {
+ long childCount = this.lambdaQuery()
+ .eq(TiVehicleConfig::getParentId, id)
+ .count();
+ if (childCount > 0) {
+ throw new GlobalException("节点下存在子节点,无法批量删除!");
+ }
+ }
+ return this.baseMapper.deleteBatchIds(Arrays.asList(ids));
+ }
+ @Override
+ public int deleteTiVehicleConfigById(Long id) {
+
+ long childCount = this.lambdaQuery()
+ .eq(TiVehicleConfig::getParentId, id)
+ .count();
+
+ if (childCount > 0) {
+ throw new GlobalException("当前节点存在子节点,无法删除,请先删除其子节点!");
+ }
+
+ return this.baseMapper.deleteById(id);
+ }
+
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleFunctionServiceImpl.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleFunctionServiceImpl.java
new file mode 100644
index 0000000..79f4512
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleFunctionServiceImpl.java
@@ -0,0 +1,52 @@
+package com.cmvr.ti.service.impl;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cmvr.ti.mapper.TiVehicleFunctionMapper;
+import com.cmvr.ti.model.domain.TiVehicleFunction;
+import com.cmvr.ti.service.ITiVehicleFunctionService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 车机功能Service业务层处理
+ */
+@Service
+@RequiredArgsConstructor
+public class TiVehicleFunctionServiceImpl extends ServiceImpl implements ITiVehicleFunctionService {
+
+ @Override
+ public TiVehicleFunction selectTiVehicleFunctionById(Long id) {
+ return this.getById(id);
+ }
+
+ @Override
+ public List selectTiVehicleFunctionList(TiVehicleFunction tiVehicleFunction) {
+ LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
+ wrapper.like(StrUtil.isNotEmpty(tiVehicleFunction.getFuncKey()), TiVehicleFunction::getFuncKey, tiVehicleFunction.getFuncKey())
+ .like(StrUtil.isNotEmpty(tiVehicleFunction.getRemark()), TiVehicleFunction::getRemark, tiVehicleFunction.getRemark());
+ return this.list(wrapper);
+ }
+
+ @Override
+ public int insertTiVehicleFunction(TiVehicleFunction TiVehicleFunction) {
+ return this.baseMapper.insert(TiVehicleFunction);
+ }
+
+ @Override
+ public int updateTiVehicleFunction(TiVehicleFunction TiVehicleFunction) {
+ return this.baseMapper.updateById(TiVehicleFunction);
+ }
+
+ @Override
+ public int deleteTiVehicleFunctionByIds(Long[] ids) {
+ return this.baseMapper.deleteBatchIds(Arrays.asList(ids));
+ }
+}
diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleUiServiceImpl.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleUiServiceImpl.java
new file mode 100644
index 0000000..ced44cc
--- /dev/null
+++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/impl/TiVehicleUiServiceImpl.java
@@ -0,0 +1,53 @@
+package com.cmvr.ti.service.impl;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cmvr.ti.mapper.TiVehicleUiMapper;
+import com.cmvr.ti.model.domain.TiVehicleFunction;
+import com.cmvr.ti.model.domain.TiVehicleUi;
+import com.cmvr.ti.service.ITiVehicleUiService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 车机界面Service业务层处理
+ */
+@Service
+@RequiredArgsConstructor
+public class TiVehicleUiServiceImpl extends ServiceImpl implements ITiVehicleUiService {
+
+ @Override
+ public TiVehicleUi selectTiVehicleUiById(Long id) {
+ return this.baseMapper.selectById(id);
+ }
+
+ @Override
+ public List selectTiVehicleUiList(TiVehicleUi tiVehicleUi) {
+ LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
+ wrapper.like(StrUtil.isNotEmpty(tiVehicleUi.getUiKey()), TiVehicleUi::getUiKey, tiVehicleUi.getUiKey())
+ .like(StrUtil.isNotEmpty(tiVehicleUi.getRemark()), TiVehicleUi::getRemark, tiVehicleUi.getRemark());
+ return this.list(wrapper);
+ }
+
+ @Override
+ public int insertTiVehicleUi(TiVehicleUi tiVehicleUi) {
+ return this.baseMapper.insert(tiVehicleUi);
+ }
+
+ @Override
+ public int updateTiVehicleUi(TiVehicleUi tiVehicleUi) {
+ return this.baseMapper.updateById(tiVehicleUi);
+ }
+
+ @Override
+ public int deleteTiVehicleUiByIds(Long[] ids) {
+ return this.baseMapper.deleteBatchIds(Arrays.asList(ids));
+ }
+}
diff --git a/pom.xml b/pom.xml
index 3faa4ad..7b37818 100644
--- a/pom.xml
+++ b/pom.xml
@@ -267,6 +267,13 @@
${cmvr-iot.version}
+
+
+ com.cmvr
+ cmvr-iot-ti
+ ${cmvr-iot.version}
+
+
com.cmvr
@@ -322,6 +329,7 @@
cmvr-iot-test
cmvr-iot-api
cmvr-iot-vi
+ cmvr-iot-ti
pom