Commit 2585c4753ab33baa81c0a4aae0ecc0640c6bdb8c
Committed by
Gitee
!1306 新增场景联动所需接口
Merge pull request !1306 from puhui999/iot
Showing
11 changed files
with
122 additions
and
8 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java
| @@ -185,4 +185,12 @@ public class IotDeviceController { | @@ -185,4 +185,12 @@ public class IotDeviceController { | ||
| 185 | return success(deviceService.getMqttConnectionParams(deviceId)); | 185 | return success(deviceService.getMqttConnectionParams(deviceId)); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | -} | ||
| 189 | \ No newline at end of file | 188 | \ No newline at end of file |
| 189 | + @GetMapping("/list-by-product-key-and-names") | ||
| 190 | + @Operation(summary = "通过产品标识和设备名称列表获取设备") | ||
| 191 | + @PreAuthorize("@ss.hasPermission('iot:device:query')") | ||
| 192 | + public CommonResult<List<IotDeviceRespVO>> getDevicesByProductKeyAndNames(@Valid IotDeviceByProductKeyAndNamesReqVO reqVO) { | ||
| 193 | + List<IotDeviceDO> devices = deviceService.getDevicesByProductKeyAndNames(reqVO.getProductKey(), reqVO.getDeviceNames()); | ||
| 194 | + return success(BeanUtils.toBean(devices, IotDeviceRespVO.class)); | ||
| 195 | + } | ||
| 196 | + | ||
| 197 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceByProductKeyAndNamesReqVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | +import jakarta.validation.constraints.NotBlank; | ||
| 5 | +import jakarta.validation.constraints.NotEmpty; | ||
| 6 | +import lombok.Data; | ||
| 7 | + | ||
| 8 | +import java.util.List; | ||
| 9 | + | ||
| 10 | +@Schema(description = "管理后台 - 通过产品标识和设备名称列表获取设备 Request VO") | ||
| 11 | +@Data | ||
| 12 | +public class IotDeviceByProductKeyAndNamesReqVO { | ||
| 13 | + | ||
| 14 | + @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1de24640dfe") | ||
| 15 | + @NotBlank(message = "产品标识不能为空") | ||
| 16 | + private String productKey; | ||
| 17 | + | ||
| 18 | + @Schema(description = "设备名称列表", requiredMode = Schema.RequiredMode.REQUIRED, example = "device001,device002") | ||
| 19 | + @NotEmpty(message = "设备名称列表不能为空") | ||
| 20 | + private List<String> deviceNames; | ||
| 21 | + | ||
| 22 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/product/IotProductController.java
| @@ -93,6 +93,21 @@ public class IotProductController { | @@ -93,6 +93,21 @@ public class IotProductController { | ||
| 93 | })); | 93 | })); |
| 94 | } | 94 | } |
| 95 | 95 | ||
| 96 | + @GetMapping("/get-by-key") | ||
| 97 | + @Operation(summary = "通过 ProductKey 获得产品") | ||
| 98 | + @Parameter(name = "productKey", description = "产品Key", required = true, example = "abc123") | ||
| 99 | + @PreAuthorize("@ss.hasPermission('iot:product:query')") | ||
| 100 | + public CommonResult<IotProductRespVO> getProductByKey(@RequestParam("productKey") String productKey) { | ||
| 101 | + IotProductDO product = productService.getProductByProductKey(productKey); | ||
| 102 | + // 拼接数据 | ||
| 103 | + IotProductCategoryDO category = categoryService.getProductCategory(product.getCategoryId()); | ||
| 104 | + return success(BeanUtils.toBean(product, IotProductRespVO.class, bean -> { | ||
| 105 | + if (category != null) { | ||
| 106 | + bean.setCategoryName(category.getName()); | ||
| 107 | + } | ||
| 108 | + })); | ||
| 109 | + } | ||
| 110 | + | ||
| 96 | @GetMapping("/page") | 111 | @GetMapping("/page") |
| 97 | @Operation(summary = "获得产品分页") | 112 | @Operation(summary = "获得产品分页") |
| 98 | @PreAuthorize("@ss.hasPermission('iot:product:query')") | 113 | @PreAuthorize("@ss.hasPermission('iot:product:query')") |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/rule/IotDataBridgeController.java
| 1 | package cn.iocoder.yudao.module.iot.controller.admin.rule; | 1 | package cn.iocoder.yudao.module.iot.controller.admin.rule; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 6 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| @@ -17,7 +18,10 @@ import org.springframework.security.access.prepost.PreAuthorize; | @@ -17,7 +18,10 @@ import org.springframework.security.access.prepost.PreAuthorize; | ||
| 17 | import org.springframework.validation.annotation.Validated; | 18 | import org.springframework.validation.annotation.Validated; |
| 18 | import org.springframework.web.bind.annotation.*; | 19 | import org.springframework.web.bind.annotation.*; |
| 19 | 20 | ||
| 21 | +import java.util.List; | ||
| 22 | + | ||
| 20 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 23 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 24 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | ||
| 21 | 25 | ||
| 22 | @Tag(name = "管理后台 - IoT 数据桥梁") | 26 | @Tag(name = "管理后台 - IoT 数据桥梁") |
| 23 | @RestController | 27 | @RestController |
| @@ -69,4 +73,12 @@ public class IotDataBridgeController { | @@ -69,4 +73,12 @@ public class IotDataBridgeController { | ||
| 69 | return success(BeanUtils.toBean(pageResult, IotDataBridgeRespVO.class)); | 73 | return success(BeanUtils.toBean(pageResult, IotDataBridgeRespVO.class)); |
| 70 | } | 74 | } |
| 71 | 75 | ||
| 72 | -} | ||
| 73 | \ No newline at end of file | 76 | \ No newline at end of file |
| 77 | + @GetMapping("/simple-list") | ||
| 78 | + @Operation(summary = "获取数据桥梁的精简信息列表", description = "主要用于前端的下拉选项") | ||
| 79 | + public CommonResult<List<IotDataBridgeRespVO>> getSimpleDataBridgeList() { | ||
| 80 | + List<IotDataBridgeDO> list = dataBridgeService.getDataBridgeList(CommonStatusEnum.ENABLE.getStatus()); | ||
| 81 | + return success(convertList(list, dataBridge -> // 只返回 id、name 字段 | ||
| 82 | + new IotDataBridgeRespVO().setId(dataBridge.getId()).setName(dataBridge.getName()))); | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/rule/IotRuleSceneDO.java
| @@ -144,8 +144,16 @@ public class IotRuleSceneDO extends TenantBaseDO { | @@ -144,8 +144,16 @@ public class IotRuleSceneDO extends TenantBaseDO { | ||
| 144 | @Data | 144 | @Data |
| 145 | public static class TriggerConditionParameter { | 145 | public static class TriggerConditionParameter { |
| 146 | 146 | ||
| 147 | + // TODO @芋艿: identifier0 存事件和服务的 identifier 属性的情况 identifier0 就为 null 解决前端回显问题 | ||
| 147 | /** | 148 | /** |
| 148 | - * 标识符(属性、事件、服务) | 149 | + * 标识符(事件、服务) |
| 150 | + * | ||
| 151 | + * 关联 {@link IotThingModelDO#getIdentifier()} | ||
| 152 | + */ | ||
| 153 | + private String identifier0; | ||
| 154 | + | ||
| 155 | + /** | ||
| 156 | + * 标识符(属性) | ||
| 149 | * | 157 | * |
| 150 | * 关联 {@link IotThingModelDO#getIdentifier()} | 158 | * 关联 {@link IotThingModelDO#getIdentifier()} |
| 151 | */ | 159 | */ |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java
| @@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Mapper; | @@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Mapper; | ||
| 11 | 11 | ||
| 12 | import javax.annotation.Nullable; | 12 | import javax.annotation.Nullable; |
| 13 | import java.time.LocalDateTime; | 13 | import java.time.LocalDateTime; |
| 14 | +import java.util.Collection; | ||
| 14 | import java.util.List; | 15 | import java.util.List; |
| 15 | import java.util.Map; | 16 | import java.util.Map; |
| 16 | 17 | ||
| @@ -77,6 +78,12 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> { | @@ -77,6 +78,12 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> { | ||
| 77 | .geIfPresent(IotDeviceDO::getCreateTime, createTime)); | 78 | .geIfPresent(IotDeviceDO::getCreateTime, createTime)); |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 81 | + default List<IotDeviceDO> selectByProductKeyAndDeviceNames(String productKey, Collection<String> deviceNames) { | ||
| 82 | + return selectList(new LambdaQueryWrapperX<IotDeviceDO>() | ||
| 83 | + .eq(IotDeviceDO::getProductKey, productKey) | ||
| 84 | + .in(IotDeviceDO::getDeviceName, deviceNames)); | ||
| 85 | + } | ||
| 86 | + | ||
| 80 | /** | 87 | /** |
| 81 | * 查询指定产品下各状态的设备数量 | 88 | * 查询指定产品下各状态的设备数量 |
| 82 | * | 89 | * |
| @@ -93,4 +100,4 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> { | @@ -93,4 +100,4 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> { | ||
| 93 | */ | 100 | */ |
| 94 | List<Map<String, Object>> selectDeviceCountGroupByState(); | 101 | List<Map<String, Object>> selectDeviceCountGroupByState(); |
| 95 | 102 | ||
| 96 | -} | ||
| 97 | \ No newline at end of file | 103 | \ No newline at end of file |
| 104 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/rule/IotDataBridgeMapper.java
| @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBr | @@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBr | ||
| 7 | import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; | 7 | import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; |
| 8 | import org.apache.ibatis.annotations.Mapper; | 8 | import org.apache.ibatis.annotations.Mapper; |
| 9 | 9 | ||
| 10 | +import java.util.List; | ||
| 11 | + | ||
| 10 | /** | 12 | /** |
| 11 | * IoT 数据桥梁 Mapper | 13 | * IoT 数据桥梁 Mapper |
| 12 | * | 14 | * |
| @@ -23,4 +25,10 @@ public interface IotDataBridgeMapper extends BaseMapperX<IotDataBridgeDO> { | @@ -23,4 +25,10 @@ public interface IotDataBridgeMapper extends BaseMapperX<IotDataBridgeDO> { | ||
| 23 | .orderByDesc(IotDataBridgeDO::getId)); | 25 | .orderByDesc(IotDataBridgeDO::getId)); |
| 24 | } | 26 | } |
| 25 | 27 | ||
| 28 | + default List<IotDataBridgeDO> selectList(Integer status) { | ||
| 29 | + return selectList(new LambdaQueryWrapperX<IotDataBridgeDO>() | ||
| 30 | + .eqIfPresent(IotDataBridgeDO::getStatus, status) | ||
| 31 | + .orderByDesc(IotDataBridgeDO::getId)); | ||
| 32 | + } | ||
| 33 | + | ||
| 26 | } | 34 | } |
| 27 | \ No newline at end of file | 35 | \ No newline at end of file |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java
| @@ -219,4 +219,13 @@ public interface IotDeviceService { | @@ -219,4 +219,13 @@ public interface IotDeviceService { | ||
| 219 | */ | 219 | */ |
| 220 | Map<Integer, Long> getDeviceCountMapByState(); | 220 | Map<Integer, Long> getDeviceCountMapByState(); |
| 221 | 221 | ||
| 222 | -} | ||
| 223 | \ No newline at end of file | 222 | \ No newline at end of file |
| 223 | + /** | ||
| 224 | + * 通过产品标识和设备名称列表获取设备列表 | ||
| 225 | + * | ||
| 226 | + * @param productKey 产品标识 | ||
| 227 | + * @param deviceNames 设备名称列表 | ||
| 228 | + * @return 设备列表 | ||
| 229 | + */ | ||
| 230 | + List<IotDeviceDO> getDevicesByProductKeyAndNames(String productKey, List<String> deviceNames); | ||
| 231 | + | ||
| 232 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
| @@ -451,4 +451,12 @@ public class IotDeviceServiceImpl implements IotDeviceService { | @@ -451,4 +451,12 @@ public class IotDeviceServiceImpl implements IotDeviceService { | ||
| 451 | )); | 451 | )); |
| 452 | } | 452 | } |
| 453 | 453 | ||
| 454 | -} | ||
| 455 | \ No newline at end of file | 454 | \ No newline at end of file |
| 455 | + @Override | ||
| 456 | + public List<IotDeviceDO> getDevicesByProductKeyAndNames(String productKey, List<String> deviceNames) { | ||
| 457 | + if (StrUtil.isBlank(productKey) || CollUtil.isEmpty(deviceNames)) { | ||
| 458 | + return Collections.emptyList(); | ||
| 459 | + } | ||
| 460 | + return deviceMapper.selectByProductKeyAndDeviceNames(productKey, deviceNames); | ||
| 461 | + } | ||
| 462 | + | ||
| 463 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotDataBridgeService.java
| @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBr | @@ -6,6 +6,8 @@ import cn.iocoder.yudao.module.iot.controller.admin.rule.vo.databridge.IotDataBr | ||
| 6 | import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; | 6 | import cn.iocoder.yudao.module.iot.dal.dataobject.rule.IotDataBridgeDO; |
| 7 | import jakarta.validation.Valid; | 7 | import jakarta.validation.Valid; |
| 8 | 8 | ||
| 9 | +import java.util.List; | ||
| 10 | + | ||
| 9 | /** | 11 | /** |
| 10 | * IoT 数据桥梁 Service 接口 | 12 | * IoT 数据桥梁 Service 接口 |
| 11 | * | 13 | * |
| @@ -51,4 +53,12 @@ public interface IotDataBridgeService { | @@ -51,4 +53,12 @@ public interface IotDataBridgeService { | ||
| 51 | */ | 53 | */ |
| 52 | PageResult<IotDataBridgeDO> getDataBridgePage(IotDataBridgePageReqVO pageReqVO); | 54 | PageResult<IotDataBridgeDO> getDataBridgePage(IotDataBridgePageReqVO pageReqVO); |
| 53 | 55 | ||
| 54 | -} | ||
| 55 | \ No newline at end of file | 56 | \ No newline at end of file |
| 57 | + /** | ||
| 58 | + * 获取数据桥梁列表 | ||
| 59 | + * | ||
| 60 | + * @param status 状态,如果为空,则不进行筛选 | ||
| 61 | + * @return 数据桥梁列表 | ||
| 62 | + */ | ||
| 63 | + List<IotDataBridgeDO> getDataBridgeList(Integer status); | ||
| 64 | + | ||
| 65 | +} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/IotDataBridgeServiceImpl.java
| @@ -10,6 +10,8 @@ import jakarta.annotation.Resource; | @@ -10,6 +10,8 @@ import jakarta.annotation.Resource; | ||
| 10 | import org.springframework.stereotype.Service; | 10 | import org.springframework.stereotype.Service; |
| 11 | import org.springframework.validation.annotation.Validated; | 11 | import org.springframework.validation.annotation.Validated; |
| 12 | 12 | ||
| 13 | +import java.util.List; | ||
| 14 | + | ||
| 13 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 15 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 14 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_BRIDGE_NOT_EXISTS; | 16 | import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DATA_BRIDGE_NOT_EXISTS; |
| 15 | 17 | ||
| @@ -67,4 +69,9 @@ public class IotDataBridgeServiceImpl implements IotDataBridgeService { | @@ -67,4 +69,9 @@ public class IotDataBridgeServiceImpl implements IotDataBridgeService { | ||
| 67 | return dataBridgeMapper.selectPage(pageReqVO); | 69 | return dataBridgeMapper.selectPage(pageReqVO); |
| 68 | } | 70 | } |
| 69 | 71 | ||
| 70 | -} | ||
| 71 | \ No newline at end of file | 72 | \ No newline at end of file |
| 73 | + @Override | ||
| 74 | + public List<IotDataBridgeDO> getDataBridgeList(Integer status) { | ||
| 75 | + return dataBridgeMapper.selectList(status); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | +} |