diff --git a/das/src/main/java/com/das/common/constant/SysAuthorityIds.java b/das/src/main/java/com/das/common/constant/SysAuthorityIds.java index 95b5bd3e..058214f4 100644 --- a/das/src/main/java/com/das/common/constant/SysAuthorityIds.java +++ b/das/src/main/java/com/das/common/constant/SysAuthorityIds.java @@ -16,4 +16,9 @@ public interface SysAuthorityIds { * 设备台账浏览权限 */ Integer SYS_AUTHORITY_ID_DEVICE_VIEW = 103; + + /** + * 风机启停复位控制权限 + */ + Integer SYS_AUTHORITY_ID_TURBINE_CTRL=104; } diff --git a/das/src/main/java/com/das/modules/data/controller/DataController.java b/das/src/main/java/com/das/modules/data/controller/DataController.java index f312ec6f..edcaecd3 100644 --- a/das/src/main/java/com/das/modules/data/controller/DataController.java +++ b/das/src/main/java/com/das/modules/data/controller/DataController.java @@ -29,7 +29,7 @@ public class DataController { /** * 实时数据查询 - * @param param 查询数据请求体 + * @param param 查询条件 * @return redis数据 */ @PostMapping("/snapshot") @@ -43,8 +43,8 @@ public class DataController { /** * 历史区间数据查询 - * @param param - * @return + * @param param 查询条件 + * @return TD数据库数据 */ @PostMapping("/history") public R>>> queryTimeSeriesValues(@RequestBody @Valid TSValueQueryParam param) { diff --git a/das/src/main/java/com/das/modules/data/domain/SnapshotValueQueryParam.java b/das/src/main/java/com/das/modules/data/domain/SnapshotValueQueryParam.java index c431d698..31cc3be6 100644 --- a/das/src/main/java/com/das/modules/data/domain/SnapshotValueQueryParam.java +++ b/das/src/main/java/com/das/modules/data/domain/SnapshotValueQueryParam.java @@ -6,15 +6,20 @@ import lombok.Data; import java.util.List; +/** + * 数据查询参数 + */ @JsonIgnoreProperties(ignoreUnknown = true) @Data public class SnapshotValueQueryParam { /** - * 测点irn列表 + * 设备ID */ @NotNull private String deviceId; - + /** + * 设备所属物模型中的属性列表 + */ private List attributes; } diff --git a/das/src/main/java/com/das/modules/data/service/DataService.java b/das/src/main/java/com/das/modules/data/service/DataService.java index 4cd55fdc..d91de72a 100644 --- a/das/src/main/java/com/das/modules/data/service/DataService.java +++ b/das/src/main/java/com/das/modules/data/service/DataService.java @@ -35,7 +35,11 @@ public class DataService { @Autowired private DataServiceImpl dataService; - // 读取实时数据快照 + /** + * 读取实时数据快照 + * @param paramList 设备id及设备属性列表 + * @return + */ public Map> querySnapshotValues(List paramList) { long start = System.currentTimeMillis(); Map> result = new HashMap<>(paramList.size()); @@ -80,7 +84,11 @@ public class DataService { return finalResult; } - + /** + * 历史区间数据查询 + * @param param 查询条件 + * @return TD数据库数据 + */ public Map>> queryTimeSeriesValues(TSValueQueryParam param) { if (CollectionUtil.isEmpty(param.getDevices()) || (param.getStartTime() == null && param.getEndTime() == null)) { throw new ServiceException("必要参数缺失"); diff --git a/das/src/main/java/com/das/modules/equipment/domain/dto/SysIotModelFieldDto.java b/das/src/main/java/com/das/modules/equipment/domain/dto/SysIotModelFieldDto.java index 9d081a3d..a800f88d 100644 --- a/das/src/main/java/com/das/modules/equipment/domain/dto/SysIotModelFieldDto.java +++ b/das/src/main/java/com/das/modules/equipment/domain/dto/SysIotModelFieldDto.java @@ -68,6 +68,10 @@ public class SysIotModelFieldDto implements Serializable { private String orderColumn; private String orderType; + /** + * 单位 + */ + private String unit; } diff --git a/das/src/main/java/com/das/modules/equipment/domain/excel/SysIotModelFieldExcel.java b/das/src/main/java/com/das/modules/equipment/domain/excel/SysIotModelFieldExcel.java index 7cd599fe..86717758 100644 --- a/das/src/main/java/com/das/modules/equipment/domain/excel/SysIotModelFieldExcel.java +++ b/das/src/main/java/com/das/modules/equipment/domain/excel/SysIotModelFieldExcel.java @@ -60,5 +60,10 @@ public class SysIotModelFieldExcel { * 是否可见 */ private Integer visible; + /** + * 单位 + */ + private String unit; + } diff --git a/das/src/main/java/com/das/modules/equipment/domain/vo/SysIotModelFieldVo.java b/das/src/main/java/com/das/modules/equipment/domain/vo/SysIotModelFieldVo.java index cc510347..56c4ca55 100644 --- a/das/src/main/java/com/das/modules/equipment/domain/vo/SysIotModelFieldVo.java +++ b/das/src/main/java/com/das/modules/equipment/domain/vo/SysIotModelFieldVo.java @@ -44,13 +44,26 @@ public class SysIotModelFieldVo { private Integer porder; private Integer revision; - + /** + * 属性频度:0低频属性,1高频属性 + */ private Integer highSpeed; - + /** + * 子系统 + */ private String subSystem; - + /** + * 数据类型:int4,int8;float4;float8 + */ private String dataType; - + /** + * 是否可见:0不可见,1可见 + */ private Integer visible; + /** + * + * 单位 + */ + private String unit; } diff --git a/das/src/main/java/com/das/modules/equipment/entity/SysIotModelField.java b/das/src/main/java/com/das/modules/equipment/entity/SysIotModelField.java index 6f5409ea..58e87492 100644 --- a/das/src/main/java/com/das/modules/equipment/entity/SysIotModelField.java +++ b/das/src/main/java/com/das/modules/equipment/entity/SysIotModelField.java @@ -93,4 +93,10 @@ public class SysIotModelField extends BaseEntity { */ @TableField("visible") private Integer visible; + + /** + * 单位 + */ + @TableField("unit") + private String unit; } diff --git a/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java b/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java index cddb1293..05e86556 100644 --- a/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java +++ b/das/src/main/java/com/das/modules/equipment/service/impl/SysIotModelServiceImpl.java @@ -186,10 +186,9 @@ public class SysIotModelServiceImpl implements SysIotModelService { } SysIotModelFieldVo sysIotModelFieldQuery = sysIotModelFieldMapper.selectByAttributeCode(sysIotModelFieldDto.getIotModelId(), sysIotModelFieldDto.getAttributeCode()); if (!(sysIotModelFieldQuery == null)) { - if (sysIotModelFieldQuery.getId() != sysIotModelFieldDto.getId()){ + if (!sysIotModelFieldQuery.getId().equals(sysIotModelFieldDto.getId())){ throw new ServiceException("物模型属性code已经存在"); } - } sysIotModelFieldMapper.updateById(sysIotModelField); @@ -284,6 +283,7 @@ public class SysIotModelServiceImpl implements SysIotModelService { map.put("attributeCode", "*物模型属性编码"); map.put("attributeName", "*物模型属性名称"); map.put("attributeType", "*属性类型(138:模拟量,139:累积量,140:离散量)"); + map.put("unit", "单位"); map.put("porder", "*测点序号"); map.put("subSystem", "子系統"); map.put("dataType", "数据类型"); @@ -453,11 +453,12 @@ public class SysIotModelServiceImpl implements SysIotModelService { field.setAttributeCode(row.get(3).toString().toLowerCase()); field.setAttributeName(row.get(4).toString()); field.setAttributeType(Integer.valueOf(row.get(5).toString())); - field.setPorder(Integer.valueOf(row.get(6).toString())); - field.setSubSystem(row.get(7).toString()); - field.setDataType(row.get(8).toString()); - field.setVisible(Integer.valueOf(row.get(9).toString())); - field.setHighSpeed(Integer.valueOf(row.get(10).toString())); + field.setUnit(row.get(6).toString()); + field.setPorder(Integer.valueOf(row.get(7).toString())); + field.setSubSystem(row.get(8).toString()); + field.setDataType(row.get(9).toString()); + field.setVisible(Integer.valueOf(row.get(10).toString())); + field.setHighSpeed(Integer.valueOf(row.get(11).toString())); field.setIotModelId(Long.valueOf(iotModelId)); } diff --git a/das/src/main/java/com/das/modules/node/controller/SysNodeController.java b/das/src/main/java/com/das/modules/node/controller/SysNodeController.java index f6568784..d4e05401 100644 --- a/das/src/main/java/com/das/modules/node/controller/SysNodeController.java +++ b/das/src/main/java/com/das/modules/node/controller/SysNodeController.java @@ -48,7 +48,7 @@ public class SysNodeController { public R createSysNode(@RequestBody SysNodeDto sysNodeDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -60,7 +60,7 @@ public class SysNodeController { public R updateSysNode(@RequestBody SysNodeDto sysNodeDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -72,7 +72,7 @@ public class SysNodeController { public R deleteSysNode(@RequestBody SysNodeDto sysNodeDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -104,7 +104,7 @@ public class SysNodeController { public R createSysCommunicationLink(@RequestBody SysCommunicationLinkDto sysCommunicationLinkDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -116,7 +116,7 @@ public class SysNodeController { public R updateSysCommunicationLink(@RequestBody SysCommunicationLinkDto sysCommunicationLinkDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -128,7 +128,7 @@ public class SysNodeController { public R deleteSysCommunicationLink(@RequestBody SysCommunicationLinkDto sysCommunicationLinkDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -160,13 +160,13 @@ public class SysNodeController { public R getMappingList(@RequestBody SysImptabmappingDto sysImptabmappingDto) { //判断是否有权限 -// boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); -// if(!hasPermission){ -// return R.fail("没有节点管理权限"); -// } -// if (sysImptabmappingDto.getLinkId() == null) { -// throw new ServiceException("参数缺失"); -// } + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); + if(!hasPermission){ + return R.fail("没有节点管理权限"); + } + if (sysImptabmappingDto.getLinkId() == null) { + throw new ServiceException("参数缺失"); + } List list = sysNodeService.getMappingList(sysImptabmappingDto); return R.success(list); } @@ -176,7 +176,7 @@ public class SysNodeController { public R getBindDeviceTree(@RequestBody SysImptabmappingDto sysImptabmappingDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -192,7 +192,7 @@ public class SysNodeController { public R bindMeas(@RequestBody BindEquipmentDto bindEquipmentDto) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -205,7 +205,7 @@ public class SysNodeController { public R saveMappingList(@RequestBody List impList) { //判断是否有权限 - boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_DEVICE_MGR.toString()); + boolean hasPermission = StpUtil.hasPermission(SysAuthorityIds.SYS_AUTHORITY_ID_ADMIN.toString()); if(!hasPermission){ return R.fail("没有节点管理权限"); } @@ -232,10 +232,22 @@ public class SysNodeController { return R.success("导入失败"); } - /** 遥控遥调 */ - @PostMapping("/link/deviceControl") - public void deviceControl(@RequestBody DeviceControlDto device) { - sysNodeService.deviceControl(device); + /** + * 设备遥控操作 + * @param deviceInfo 遥控信息 + */ + @PostMapping("/link/command") + public void deviceCommand(@RequestBody DeviceCommandDto deviceInfo) { + sysNodeService.deviceCommand(deviceInfo); + } + + /** + * 设备遥调操作 + * @param deviceInfo 遥控信息 + */ + @PostMapping("/link/setPoint") + public void deviceSetPoint(@RequestBody DeviceSetPointDto deviceInfo) { + sysNodeService.deviceSetPoint(deviceInfo); } } diff --git a/das/src/main/java/com/das/modules/node/domain/dto/DeviceControlDto.java b/das/src/main/java/com/das/modules/node/domain/dto/DeviceCommandDto.java similarity index 65% rename from das/src/main/java/com/das/modules/node/domain/dto/DeviceControlDto.java rename to das/src/main/java/com/das/modules/node/domain/dto/DeviceCommandDto.java index 1eb7df2f..dfba26ce 100644 --- a/das/src/main/java/com/das/modules/node/domain/dto/DeviceControlDto.java +++ b/das/src/main/java/com/das/modules/node/domain/dto/DeviceCommandDto.java @@ -4,17 +4,23 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; +/** + * 设备控制 输入参数 + */ @Data -public class DeviceControlDto { - - - @JsonSerialize(using = ToStringSerializer.class) - private Long nodeId; - +public class DeviceCommandDto { + /** + * 设备ID + */ @JsonSerialize(using = ToStringSerializer.class) private Long deviceId; + /** + * 遥控命令 + */ private String serviceName; - + /** + *遥控值, 1或者0 + */ private Integer opValue; } diff --git a/das/src/main/java/com/das/modules/node/domain/dto/DeviceSetPointDto.java b/das/src/main/java/com/das/modules/node/domain/dto/DeviceSetPointDto.java new file mode 100644 index 00000000..2fba41da --- /dev/null +++ b/das/src/main/java/com/das/modules/node/domain/dto/DeviceSetPointDto.java @@ -0,0 +1,23 @@ +package com.das.modules.node.domain.dto; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +@Data +public class DeviceSetPointDto { + /** + * 设备ID + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long deviceId; + + /** + * 遥调命令 + */ + private String serviceName; + /** + *遥调值,浮点数 + */ + private Float opValue; +} diff --git a/das/src/main/java/com/das/modules/node/service/SysNodeService.java b/das/src/main/java/com/das/modules/node/service/SysNodeService.java index bc0c4d9e..0af0ef54 100644 --- a/das/src/main/java/com/das/modules/node/service/SysNodeService.java +++ b/das/src/main/java/com/das/modules/node/service/SysNodeService.java @@ -43,5 +43,15 @@ public interface SysNodeService { boolean importMappingList(String linkId, MultipartFile file); - void deviceControl(DeviceControlDto device); + /** + * 设备遥控操作 + * @param deviceInfo 遥控具体的设备信息,设备id、遥控命令、遥控值 + */ + void deviceCommand(DeviceCommandDto deviceInfo); + + /** + * 设备遥调操作 + * @param deviceInfo 遥调具体的设备信息,设备id、遥调命令、遥调值 + */ + void deviceSetPoint(DeviceSetPointDto deviceInfo); } diff --git a/das/src/main/java/com/das/modules/node/service/impl/SysNodeServiceImpl.java b/das/src/main/java/com/das/modules/node/service/impl/SysNodeServiceImpl.java index 37f9724b..eb9f51df 100644 --- a/das/src/main/java/com/das/modules/node/service/impl/SysNodeServiceImpl.java +++ b/das/src/main/java/com/das/modules/node/service/impl/SysNodeServiceImpl.java @@ -289,7 +289,7 @@ public class SysNodeServiceImpl implements SysNodeService { } IoUtil.close(os); } catch (IOException e) { - e.printStackTrace(); + log.error(e.getMessage(),e); } } @@ -334,7 +334,7 @@ public class SysNodeServiceImpl implements SysNodeService { } @Override - public void deviceControl(DeviceControlDto device) { + public void deviceCommand(DeviceCommandDto device) { try { HashMap map = new HashMap<>(); ObjectMapper objectMapper = new ObjectMapper(); @@ -345,6 +345,12 @@ public class SysNodeServiceImpl implements SysNodeService { map.put("serviceName", device.getServiceName()); map.put("opValue", device.getOpValue()); + //激活的node节点Id + long activeNodeId = getActiveNodeId(); + if(activeNodeId==0){ + throw new RuntimeException("找不到激活的节点信息"); + } + // 将 HashMap 转换为 JsonNode ObjectNode jsonNode = objectMapper.convertValue(map, ObjectNode.class); TerminalMessage configUpdate = TerminalMessage.builder() @@ -353,13 +359,58 @@ public class SysNodeServiceImpl implements SysNodeService { .time(time) .data(jsonNode) .build(); - terminalMessageEventHandler.sendTerminalMessageWithResult(device.getNodeId(), configUpdate); + terminalMessageEventHandler.sendTerminalMessageWithResult(activeNodeId, configUpdate); + } catch (Exception e) { + log.error("设备控制失败 ", e); + } + } + + @Override + public void deviceSetPoint(DeviceSetPointDto device) { + try { + HashMap map = new HashMap<>(); + ObjectMapper objectMapper = new ObjectMapper(); + String cmd = NodeConstant.DEVICE_CONTROL; + Long time = System.currentTimeMillis(); + + map.put("deviceId", device.getDeviceId()); + map.put("serviceName", device.getServiceName()); + map.put("opValue", device.getOpValue()); + + //激活的node节点Id + long activeNodeId = getActiveNodeId(); + if(activeNodeId==0){ + throw new RuntimeException("找不到激活的节点信息"); + } + + // 将 HashMap 转换为 JsonNode + ObjectNode jsonNode = objectMapper.convertValue(map, ObjectNode.class); + TerminalMessage configUpdate = TerminalMessage.builder() + .cmd(cmd) + .cmdId(String.valueOf(device.getDeviceId())) + .time(time) + .data(jsonNode) + .build(); + terminalMessageEventHandler.sendTerminalMessageWithResult(activeNodeId, configUpdate); } catch (Exception e) { log.error("设备控制失败 ", e); } } + /** + * 获得当前激活的节点id + * @return 节点id + */ + private long getActiveNodeId(){ + List list = sysNodeMapper.querySysNodeList(); + if(list.isEmpty()){ + return 0; + }else{ + return list.get(0).getId(); + } + } + // 绑定设备的测点信息,不是绑定设备到映射表 private void addSysImptabmapping(List equipmentId, Long linkId, SysUserVo sysUserVo, List addList) { diff --git a/das/src/main/java/com/das/modules/page/controller/WindTurbinesPageController.java b/das/src/main/java/com/das/modules/page/controller/WindTurbinesPageController.java new file mode 100644 index 00000000..595ff7b2 --- /dev/null +++ b/das/src/main/java/com/das/modules/page/controller/WindTurbinesPageController.java @@ -0,0 +1,29 @@ +package com.das.modules.page.controller; + +import com.das.common.result.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author houwei + * @date 2024-10-24 + * @description: 风机列表页面 对应的 后端api + */ +@Slf4j +@RequestMapping("/api/page/turbines") +@RestController +public class WindTurbinesPageController { + /** + * 获取风机机组所属线路列表 + * @return 返回字符串数组 + */ + @PostMapping("/lines") + public R> queryBelongLines() { + //TODO: 查询sql: select distinct belong_line as name from sys_equipment t where t.object_type = 10002 and belong_line !=''; + return R.success(); + } +} diff --git a/das/src/main/resources/mapper/SysIotModelFieldMapper.xml b/das/src/main/resources/mapper/SysIotModelFieldMapper.xml index 4f92fa5d..1468de4a 100644 --- a/das/src/main/resources/mapper/SysIotModelFieldMapper.xml +++ b/das/src/main/resources/mapper/SysIotModelFieldMapper.xml @@ -10,6 +10,7 @@ +