From 22463c1763fc22c8fbd13a4eefd4d276be048a66 Mon Sep 17 00:00:00 2001 From: lixiaolong <702156524@qq.com> Date: Thu, 5 Feb 2026 16:16:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(util):=20=E4=BF=AE=E5=A4=8D=E8=BD=A6?= =?UTF-8?q?=E8=BE=86=E8=B7=AF=E5=BE=84=E6=9F=A5=E6=89=BE=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=9B=BE=E6=A0=87=E5=90=8D=E7=A7=B0=E6=AF=94?= =?UTF-8?q?=E8=BE=83=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复CarPathFinderUtil中使用iconName而非iconImage进行功能匹配 - 添加ExTiVehicleFunctionService接口的findNextClickToFunction方法定义 - 实现车辆功能服务中的路径查找逻辑,支持查找从当前页面到目标功能的最短点击路径 - 集成字典数据服务以获取功能和界面配置的映射关系 - 在车辆界面控制器中暴露路径查找API端点 - 添加必要的Lombok注解和依赖注入配置 --- .../controller/ti/TiVehicleUiController.java | 9 ++ .../cmvr/system/util/CarPathFinderUtil.java | 2 +- .../ex/ExTiVehicleFunctionService.java | 2 + .../com/cmvr/ti/model/domain/TiVehicleUi.java | 6 + .../cmvr/ti/model/vo/TiVehicleFunctionVO.java | 6 + .../ex/ExTiVehicleFunctionServiceImpl.java | 105 +++++++++++++++++- 6 files changed, 128 insertions(+), 2 deletions(-) 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 index 825cbd6..3f3f131 100644 --- 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 @@ -5,6 +5,7 @@ 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.test.service.ex.ExTiVehicleFunctionService; import com.cmvr.ti.model.domain.TiVehicleUi; import com.cmvr.ti.service.ITiVehicleFunctionService; import com.cmvr.ti.service.ITiVehicleUiService; @@ -30,6 +31,8 @@ import java.util.List; public class TiVehicleUiController extends BaseController { private final ITiVehicleUiService tiVehicleUiService; + private final ExTiVehicleFunctionService exTiVehicleFunctionService; + @ApiOperation("查询车机功能列表") @PreAuthorize("@ss.hasPermi('ti:ui:list')") @GetMapping("/list") @@ -69,4 +72,10 @@ public class TiVehicleUiController extends BaseController { public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(tiVehicleUiService.deleteTiVehicleUiByIds(ids)); } + + @ApiOperation("搜索路径") + @GetMapping("/findNextClickToFunction") + public AjaxResult findNextClickToFunction(Long vehicleConfigId, String currentUi, String clickFunction) { + return AjaxResult.success(exTiVehicleFunctionService.findNextClickToFunction(vehicleConfigId, currentUi, clickFunction)); + } } diff --git a/cmvr-iot-system/src/main/java/com/cmvr/system/util/CarPathFinderUtil.java b/cmvr-iot-system/src/main/java/com/cmvr/system/util/CarPathFinderUtil.java index 3b445a0..d6c2842 100644 --- a/cmvr-iot-system/src/main/java/com/cmvr/system/util/CarPathFinderUtil.java +++ b/cmvr-iot-system/src/main/java/com/cmvr/system/util/CarPathFinderUtil.java @@ -87,7 +87,7 @@ public class CarPathFinderUtil { if (ObjUtil.isEmpty(icon.getIconImage())) { continue; } - if (icon.getIconImage().equals(targetFeature)) { + if (icon.getIconName().equals(targetFeature)) { currentPath.add(icon); return currentPath; } diff --git a/cmvr-iot-test/src/main/java/com/cmvr/test/service/ex/ExTiVehicleFunctionService.java b/cmvr-iot-test/src/main/java/com/cmvr/test/service/ex/ExTiVehicleFunctionService.java index b2451af..980259b 100644 --- a/cmvr-iot-test/src/main/java/com/cmvr/test/service/ex/ExTiVehicleFunctionService.java +++ b/cmvr-iot-test/src/main/java/com/cmvr/test/service/ex/ExTiVehicleFunctionService.java @@ -9,4 +9,6 @@ public interface ExTiVehicleFunctionService { public JSONObject queryById(Long id); + public JSONObject findNextClickToFunction(Long vehicleConfigId, String currentUi, String clickFunction); + } 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 index e285210..29b8349 100644 --- 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 @@ -5,10 +5,16 @@ 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.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; @Data @ApiModel("触控交互--车机界面") +@Builder +@NoArgsConstructor +@AllArgsConstructor public class TiVehicleUi extends BaseEntity { private static final long serialVersionUID = 1L; diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/vo/TiVehicleFunctionVO.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/vo/TiVehicleFunctionVO.java index 25ef60e..b1afe7b 100644 --- a/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/vo/TiVehicleFunctionVO.java +++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/model/vo/TiVehicleFunctionVO.java @@ -2,12 +2,18 @@ package com.cmvr.ti.model.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @Data @ApiModel("触控交互--车机功能列表查询") +@Builder +@AllArgsConstructor +@NoArgsConstructor public class TiVehicleFunctionVO { @ApiModelProperty("车辆配置ID") diff --git a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ex/ExTiVehicleFunctionServiceImpl.java b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ex/ExTiVehicleFunctionServiceImpl.java index 3e276e5..a7a9296 100644 --- a/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ex/ExTiVehicleFunctionServiceImpl.java +++ b/cmvr-iot-ti/src/main/java/com/cmvr/ti/service/ex/ExTiVehicleFunctionServiceImpl.java @@ -4,13 +4,24 @@ import cn.hutool.core.text.StrPool; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; +import com.cmvr.common.core.domain.entity.SysDictData; +import com.cmvr.common.exception.GlobalException; +import com.cmvr.common.utils.StringUtils; +import com.cmvr.system.domain.vo.CarIcon; +import com.cmvr.system.domain.vo.CarUi; +import com.cmvr.system.service.ISysDictTypeService; +import com.cmvr.system.util.CarPathFinderUtil; import com.cmvr.test.service.ex.ExTiVehicleFunctionService; import com.cmvr.ti.model.domain.TiVehicleFunction; +import com.cmvr.ti.model.domain.TiVehicleUi; +import com.cmvr.ti.model.vo.TiVehicleFunctionVO; import com.cmvr.ti.service.ITiVehicleFunctionService; +import com.cmvr.ti.service.ITiVehicleUiService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; -import java.util.List; +import java.util.*; @Service @RequiredArgsConstructor @@ -18,6 +29,11 @@ public class ExTiVehicleFunctionServiceImpl implements ExTiVehicleFunctionServic private final ITiVehicleFunctionService tiVehicleFunctionService; + private final ITiVehicleUiService tiVehicleUiService; + + private final ISysDictTypeService iSysDictTypeService; + + @Override public JSONArray queryByIds(String ids) { List tiVehicleFunctions = tiVehicleFunctionService.listByIds(StrUtil.split(StrPool.COMMA, ids)); @@ -29,5 +45,92 @@ public class ExTiVehicleFunctionServiceImpl implements ExTiVehicleFunctionServic return JSONObject.from(tiVehicleFunctionService.getById(id)); } + /** + * 寻找从当前页面到能执行目标功能的最短点击路径 + * 返回:点击的功能序列(JSONArray 包装 List) + */ + @Override + public JSONObject findNextClickToFunction( + Long vehicleConfigId, + String startUiName, + String targetFuncName) { + // 功能字典 + // 实际用的是 sys_dict_data,这里假设你有方法能查到 data 列表 + List functionDictData = iSysDictTypeService.selectDictDataByType("ti_function_config"); + + // 界面字典 + List uiDictData = iSysDictTypeService.selectDictDataByType("ti_ui_config"); + + // 构建 功能 value → label 的映射 + Map funcValueToLabel = new HashMap<>(); + for (SysDictData data : functionDictData) { + funcValueToLabel.put(data.getDictValue(), data.getDictLabel()); + } + + // 构建 界面 value → label 的映射 + Map uiValueToLabel = new HashMap<>(); + for (SysDictData data : uiDictData) { + uiValueToLabel.put(data.getDictValue(), data.getDictLabel()); + } + + // 1. 查询当前车型的实际界面和功能数据 + List uiList = tiVehicleUiService.selectTiVehicleUiList( + TiVehicleUi.builder().vehicleConfigId(vehicleConfigId).build()); + + List funcList = tiVehicleFunctionService.selectTiVehicleFunctionList( + TiVehicleFunctionVO.builder().vehicleConfigId(vehicleConfigId).build()); + + // 2. uiKey → TiVehicleUi + Map uiByKey = new HashMap(); + for (TiVehicleUi ui : uiList) { + uiByKey.put(ui.getUiKey(), ui); + } + + // 3. funcKey → TiVehicleFunction + Map funcById = new HashMap(); + for (TiVehicleFunction f : funcList) { + funcById.put(f.getId(), f); + } + // 4.组装uiMap + Map uiMap = new HashMap<>(); + List icons; + CarUi carUi; + for (TiVehicleUi ui : uiList) { + icons = new ArrayList<>(); + for (String funcId : StringUtils.split(ui.getFuncIds(), StrPool.COMMA)) { + TiVehicleFunction func = funcById.get(Long.valueOf(funcId)); + CarIcon icon = new CarIcon( + funcValueToLabel.get(func.getFuncKey()), + func.getIconUrl(), + "", + "", + "1".equals(func.getRemark()) ? funcValueToLabel.get(func.getFuncKey()) : "" + ); + icons.add(icon); + } + carUi = new CarUi( + uiValueToLabel.get(ui.getUiKey()), + ui.getUiUrl(), + icons + ); + uiMap.put(carUi.getUiName(), carUi); + } + // 5.获取路径 + List path = CarPathFinderUtil.findPath(uiMap, startUiName, targetFuncName); + if (CollectionUtils.isEmpty(path)) { + throw new GlobalException("没有找到匹配的路径"); + } + // 组装结果 + Map map = new HashMap<>(); + map.put("nextLocation", path.get(0).getIconName()); + map.put("isEnd", path.size() == 1); + map.put("iconUrl", path.get(0).getIconImage()); + + return JSONObject.from(map); + + + } + + }