diff --git a/das-dn/cmg/ry.cpp b/das-dn/cmg/ry.cpp index 3f2239a9..0c562793 100644 --- a/das-dn/cmg/ry.cpp +++ b/das-dn/cmg/ry.cpp @@ -316,7 +316,12 @@ bool CRYDevice::publish_sensor_data(const std::string traceId, const char* comma std::string outputConfig = Json::writeString(builder, jsonRoot); if (traceId != "") { - vLog(LOG_DEBUG, "send cmd: %s, payload: %d, %128s\n", command, outputConfig.length(), outputConfig.c_str()); + vLog(LOG_DEBUG, "send cmd: %s, payload: %d\n", command, outputConfig.length()); + } else { + std::string com = command; + if (com == "deviceEvent") { + vLog(LOG_DEBUG, "send cmd: %s, payload: %d\n", command, outputConfig.length()); + } } int rc = websocket_write(outputConfig.c_str(), outputConfig.length()); if (rc != 0) { @@ -2014,7 +2019,7 @@ bool CRYDevice::publishdeviceEventData(void) } if (root.size()) { - //return publish_sensor_data("", "deviceEvent", root); + return publish_sensor_data("", "deviceEvent", root); //vLog(LOG_DEBUG, "%s", root.toStyledString().c_str()); } diff --git a/das/src/main/java/com/das/modules/calc/domain/vo/DeviceInfoCache.java b/das/src/main/java/com/das/modules/cache/domain/DeviceInfoCache.java similarity index 75% rename from das/src/main/java/com/das/modules/calc/domain/vo/DeviceInfoCache.java rename to das/src/main/java/com/das/modules/cache/domain/DeviceInfoCache.java index fba18494..172a819c 100644 --- a/das/src/main/java/com/das/modules/calc/domain/vo/DeviceInfoCache.java +++ b/das/src/main/java/com/das/modules/cache/domain/DeviceInfoCache.java @@ -1,4 +1,4 @@ -package com.das.modules.calc.domain.vo; +package com.das.modules.cache.domain; import lombok.Data; @@ -9,6 +9,7 @@ import lombok.Data; public class DeviceInfoCache { private Long deviceId; private String deviceCode; + private String deviceName; private Integer objectType; private Long parentDeviceId; } diff --git a/das/src/main/java/com/das/modules/calc/service/CacheService.java b/das/src/main/java/com/das/modules/cache/service/CacheService.java similarity index 94% rename from das/src/main/java/com/das/modules/calc/service/CacheService.java rename to das/src/main/java/com/das/modules/cache/service/CacheService.java index 3f74999f..886f4c87 100644 --- a/das/src/main/java/com/das/modules/calc/service/CacheService.java +++ b/das/src/main/java/com/das/modules/cache/service/CacheService.java @@ -1,6 +1,6 @@ -package com.das.modules.calc.service; +package com.das.modules.cache.service; -import com.das.modules.calc.domain.vo.DeviceInfoCache; +import com.das.modules.cache.domain.DeviceInfoCache; import com.das.modules.equipment.entity.SysEquipment; import com.das.modules.equipment.mapper.SysEquipmentMapper; import jakarta.annotation.PostConstruct; @@ -61,6 +61,7 @@ public class CacheService { DeviceInfoCache deviceInfoCache = new DeviceInfoCache(); deviceInfoCache.setDeviceId(equipment.getId()); deviceInfoCache.setDeviceCode(equipment.getCode()); + deviceInfoCache.setDeviceName(equipment.getName()); deviceInfoCache.setObjectType(equipment.getObjectType()); deviceInfoCache.setParentDeviceId(equipment.getParentEquipmentId()); deviceInfoCaches.add(deviceInfoCache); @@ -68,8 +69,7 @@ public class CacheService { deviceCodeIndex.put(deviceInfoCache.getDeviceCode(),i); //创建Id索引 deviceIdIndex.put(equipment.getId(),i); - //关联风场缓存 -// if (equipment.getObjectType().equals() + } } diff --git a/das/src/main/java/com/das/modules/calc/functions/FunctionRealData.java b/das/src/main/java/com/das/modules/calc/functions/FunctionRealData.java index 6fb013c5..4fa75677 100644 --- a/das/src/main/java/com/das/modules/calc/functions/FunctionRealData.java +++ b/das/src/main/java/com/das/modules/calc/functions/FunctionRealData.java @@ -1,12 +1,11 @@ package com.das.modules.calc.functions; -import com.das.modules.calc.domain.vo.DeviceInfoCache; -import com.das.modules.calc.service.CacheService; +import com.das.modules.cache.domain.DeviceInfoCache; +import com.das.modules.cache.service.CacheService; import com.das.modules.data.domain.SnapshotValueQueryParam; import com.das.modules.data.service.DataService; import com.googlecode.aviator.runtime.function.AbstractFunction; import com.googlecode.aviator.runtime.type.*; -import com.googlecode.aviator.utils.Env; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; diff --git a/das/src/main/java/com/das/modules/calc/functions/FunctionSaveCalcData.java b/das/src/main/java/com/das/modules/calc/functions/FunctionSaveCalcData.java index 4601a90f..71ce79e0 100644 --- a/das/src/main/java/com/das/modules/calc/functions/FunctionSaveCalcData.java +++ b/das/src/main/java/com/das/modules/calc/functions/FunctionSaveCalcData.java @@ -1,11 +1,9 @@ package com.das.modules.calc.functions; -import com.das.modules.calc.domain.vo.DeviceInfoCache; -import com.das.modules.calc.service.CacheService; -import com.das.modules.data.domain.SnapshotValueQueryParam; +import com.das.modules.cache.domain.DeviceInfoCache; +import com.das.modules.cache.service.CacheService; import com.das.modules.data.service.DataService; import com.das.modules.node.domain.bo.CalculateRTData; -import com.googlecode.aviator.runtime.function.AbstractFunction; import com.googlecode.aviator.runtime.function.AbstractVariadicFunction; import com.googlecode.aviator.runtime.function.FunctionUtils; import com.googlecode.aviator.runtime.type.AviatorObject; @@ -79,7 +77,7 @@ public class FunctionSaveCalcData extends AbstractVariadicFunction { dataList.add(dt); } -// dataService.updateCalFieldData(dataList); + dataService.updateCalFieldData(dataList); return AviatorRuntimeJavaType.valueOf(0); } } diff --git a/das/src/main/java/com/das/modules/calc/service/CalcJob.java b/das/src/main/java/com/das/modules/calc/service/CalcJob.java index 104cde7e..98426749 100644 --- a/das/src/main/java/com/das/modules/calc/service/CalcJob.java +++ b/das/src/main/java/com/das/modules/calc/service/CalcJob.java @@ -1,5 +1,6 @@ package com.das.modules.calc.service; +import com.das.modules.cache.service.CacheService; import com.das.modules.calc.domain.entity.CalcModule; import com.googlecode.aviator.AviatorEvaluatorInstance; import com.googlecode.aviator.Expression; diff --git a/das/src/main/java/com/das/modules/calc/service/CalcService.java b/das/src/main/java/com/das/modules/calc/service/CalcService.java index 6b8bba3e..bc72a2af 100644 --- a/das/src/main/java/com/das/modules/calc/service/CalcService.java +++ b/das/src/main/java/com/das/modules/calc/service/CalcService.java @@ -1,6 +1,7 @@ package com.das.modules.calc.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.das.modules.cache.service.CacheService; import com.das.modules.calc.domain.entity.CalcModule; import com.das.modules.calc.functions.FunctionRealData; import com.das.modules.calc.functions.FunctionSaveCalcData; diff --git a/das/src/main/java/com/das/modules/data/service/TDEngineService.java b/das/src/main/java/com/das/modules/data/service/TDEngineService.java index d85e8010..b5d4ee07 100644 --- a/das/src/main/java/com/das/modules/data/service/TDEngineService.java +++ b/das/src/main/java/com/das/modules/data/service/TDEngineService.java @@ -11,6 +11,7 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import jakarta.annotation.PreDestroy; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.EnableAsync; @@ -31,8 +32,6 @@ public class TDEngineService { private HikariDataSource hikariDataSource; - private DataServiceImpl dataService; - @Value("${tdengine.url}") private String url; @@ -348,10 +347,11 @@ public class TDEngineService { sb.setLength(0); sb.append("insert into "); for (CalculateRTData dv : list) { - sb.append("c"); + sb.append("c_"); sb.append(dv.getDeviceId()); + sb.append("_").append(dv.getIotModelField()); sb.append(" using c_"); - sb.append(dataService.deviceModelMap.get(dv.getDeviceId().toString())); + sb.append(dv.getModelCode()); sb.append("_").append(dv.getIotModelField()); sb.append(" tags ("); sb.append(dv.getDeviceId()); diff --git a/das/src/main/java/com/das/modules/data/service/impl/DataServiceImpl.java b/das/src/main/java/com/das/modules/data/service/impl/DataServiceImpl.java index 1c471f97..98a3b084 100644 --- a/das/src/main/java/com/das/modules/data/service/impl/DataServiceImpl.java +++ b/das/src/main/java/com/das/modules/data/service/impl/DataServiceImpl.java @@ -175,6 +175,7 @@ public class DataServiceImpl implements DataService { for (CalculateRTData value : list) { String key = String.format("RT:%s:%s", value.getDeviceId(), value.getIotModelField().toLowerCase()); keyValueMap.put(key, value.getDataValue()); + value.setModelCode(deviceModelMap.get(value.getDeviceId().toString())); } adminRedisTemplate.mSet(keyValueMap); tdEngineService.updateCalFieldValues(list); diff --git a/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java b/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java index 83aec758..7d9bb92d 100644 --- a/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java +++ b/das/src/main/java/com/das/modules/equipment/service/impl/SysEquipmentServiceImpl.java @@ -15,6 +15,7 @@ import com.das.common.utils.PageQuery; import com.das.common.utils.SequenceUtils; import com.das.modules.auth.domain.vo.SysUserVo; import com.das.modules.auth.mapper.SysOrgMapper; +import com.das.modules.data.service.impl.DataServiceImpl; import com.das.modules.equipment.domain.dto.SysEquipmentDto; import com.das.modules.equipment.domain.excel.SysEquipmentExcel; import com.das.modules.equipment.domain.vo.SysEquipmentVo; @@ -58,6 +59,9 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { @Autowired private SysIotModelMapper sysIotModelMapper; + @Autowired + private DataServiceImpl dataService; + @Override public SysEquipmentVo creatSysEquipment(SysEquipmentDto sysEquipmentDto) { //去除空格 @@ -76,6 +80,10 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { sysEquipment.setUpdatedBy(sysUserVo.getAccount()); sysEquipment.setRevision(1); sysEquipmentMapper.insert(sysEquipment); + //物模型不为空 增加设备物模型mapping缓存 + if (sysEquipment.getIotModelId() != null){ + dataService.deviceModelMap.put(sysEquipment.getId().toString(),dataService.iotModelMap.get(sysEquipment.getIotModelId().toString())); + } SysEquipmentVo sysEquipmentVo = new SysEquipmentVo(); BeanCopyUtils.copy(sysEquipment, sysEquipmentVo); return sysEquipmentVo; @@ -98,6 +106,9 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { sysEquipment.setUpdatedTime(new Date()); sysEquipment.setUpdatedBy(sysUserVo.getAccount()); sysEquipmentMapper.updateById(sysEquipment); + if (oldSysEquipment.getIotModelId() == null && sysEquipment.getIotModelId() != null){ + dataService.deviceModelMap.put(sysEquipment.getId().toString(),dataService.iotModelMap.get(sysEquipment.getIotModelId().toString())); + } SysEquipmentVo sysEquipmentVo = new SysEquipmentVo(); BeanCopyUtils.copy(sysEquipment, sysEquipmentVo); return sysEquipmentVo; @@ -110,6 +121,8 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { throw new RuntimeException("该设备下有子设备,不能删除"); } sysEquipmentMapper.deleteById(sysEquipmentDto.getId()); + //删除缓存 + dataService.deviceModelMap.remove(sysEquipmentDto.getId().toString()); } @Override @@ -277,12 +290,30 @@ public class SysEquipmentServiceImpl implements SysEquipmentService { } } sysEquipmentMapper.insertBatch(addSysEquipmentList); + for (SysEquipment item : addSysEquipmentList){ + if (item.getIotModelId() != null){ + String modelCode = dataService.iotModelMap.get(item.getIotModelId().toString()); + dataService.deviceModelMap.put(item.getId().toString(),modelCode); + } + } if (CollectionUtils.isNotEmpty(updateSysEquipmentList)) { sysEquipmentMapper.updateBatchById(updateSysEquipmentList); + for (SysEquipment item : updateSysEquipmentList){ + if (item.getIotModelId() != null){ + String modelCode = dataService.iotModelMap.get(item.getIotModelId().toString()); + dataService.deviceModelMap.put(item.getId().toString(),modelCode); + } + } } if (CollectionUtils.isNotEmpty(delSysEquipmentList)) { // 删除设备 sysEquipmentMapper.deleteBatchIds(delSysEquipmentList); + for (SysEquipment item : updateSysEquipmentList){ + if (item.getIotModelId() != null){ + String modelCode = dataService.iotModelMap.get(item.getIotModelId().toString()); + dataService.deviceModelMap.put(item.getId().toString(),modelCode); + } + } } } diff --git a/das/src/main/java/com/das/modules/node/domain/bo/CalculateRTData.java b/das/src/main/java/com/das/modules/node/domain/bo/CalculateRTData.java index da619244..6b549cba 100644 --- a/das/src/main/java/com/das/modules/node/domain/bo/CalculateRTData.java +++ b/das/src/main/java/com/das/modules/node/domain/bo/CalculateRTData.java @@ -20,4 +20,6 @@ public class CalculateRTData { private Object dataValue; private String iotModelField; + + private String modelCode; } diff --git a/das/src/main/java/com/das/modules/operation/controller/ManualOperatorController.java b/das/src/main/java/com/das/modules/operation/controller/ManualOperatorController.java index 8386170f..46bbc977 100644 --- a/das/src/main/java/com/das/modules/operation/controller/ManualOperatorController.java +++ b/das/src/main/java/com/das/modules/operation/controller/ManualOperatorController.java @@ -5,7 +5,7 @@ import com.das.common.constant.MeasType; import com.das.common.constant.SysAuthorityIds; import com.das.common.exceptions.ServiceException; import com.das.common.result.R; -import com.das.modules.operation.domain.CommandInfoDto; +import com.das.modules.operation.domain.dto.CommandInfoDto; import com.das.modules.operation.service.OperationService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; diff --git a/das/src/main/java/com/das/modules/operation/controller/OperationLogController.java b/das/src/main/java/com/das/modules/operation/controller/OperationLogController.java new file mode 100644 index 00000000..10ff0103 --- /dev/null +++ b/das/src/main/java/com/das/modules/operation/controller/OperationLogController.java @@ -0,0 +1,36 @@ +package com.das.modules.operation.controller; + +import com.das.common.result.R; +import com.das.common.utils.PageDataInfo; +import com.das.modules.operation.domain.dto.EventLogDto; +import com.das.modules.operation.domain.vo.SysOperationLogVo; +import com.das.modules.operation.service.OperationLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RequestMapping("/api/operation") +@RestController +public class OperationLogController { + + @Autowired + private OperationLogService operationLogService; + + /** + * 获取事件记录 + */ + @PostMapping("/getEventLogList") + public R> getEventLogList(@RequestBody EventLogDto eventLogDto) { + if (eventLogDto.getPageNum() ==null){ + eventLogDto.setPageNum(1); + } + if (eventLogDto.getPageSize() ==null){ + eventLogDto.setPageSize(30); + } + return R.success(operationLogService.getEventLogList(eventLogDto)); + } +} diff --git a/das/src/main/java/com/das/modules/operation/domain/CommandInfoDto.java b/das/src/main/java/com/das/modules/operation/domain/dto/CommandInfoDto.java similarity index 94% rename from das/src/main/java/com/das/modules/operation/domain/CommandInfoDto.java rename to das/src/main/java/com/das/modules/operation/domain/dto/CommandInfoDto.java index 15c6b203..acd512bc 100644 --- a/das/src/main/java/com/das/modules/operation/domain/CommandInfoDto.java +++ b/das/src/main/java/com/das/modules/operation/domain/dto/CommandInfoDto.java @@ -1,4 +1,4 @@ -package com.das.modules.operation.domain; +package com.das.modules.operation.domain.dto; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; diff --git a/das/src/main/java/com/das/modules/operation/domain/dto/EventLogDto.java b/das/src/main/java/com/das/modules/operation/domain/dto/EventLogDto.java new file mode 100644 index 00000000..5f18c2e5 --- /dev/null +++ b/das/src/main/java/com/das/modules/operation/domain/dto/EventLogDto.java @@ -0,0 +1,22 @@ +package com.das.modules.operation.domain.dto; + +import lombok.Data; + +@Data +public class EventLogDto { + + private String startTime; + + + private String endTime; + + private String windTurbinesCode; + + private String userName; + + private Integer pageNum; + + private Integer pageSize; + + +} diff --git a/das/src/main/java/com/das/modules/operation/domain/vo/SysOperationLogVo.java b/das/src/main/java/com/das/modules/operation/domain/vo/SysOperationLogVo.java new file mode 100644 index 00000000..1dc2ff13 --- /dev/null +++ b/das/src/main/java/com/das/modules/operation/domain/vo/SysOperationLogVo.java @@ -0,0 +1,70 @@ +package com.das.modules.operation.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +import java.io.Serial; +import java.util.Date; + + +@Data +public class SysOperationLogVo { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 记录id + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** + * 操作人账号 + */ + private String userId; + + /** + * 操作人名称 + */ + private String userName; + + /** + * 操作时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date optTime; + /** + * 操作人IP地址 + */ + private String ipAddress; + /** + * 操作设备id + */ + private Long deviceId; + /** + * 设备属性编码 + */ + private String attributeCode; + /** + * 设备属性名称 + */ + private String attributeName; + /** + * 操作描述 + */ + private String optDesc; + /** + * 设备名称 + */ + private String name; + + + + + + + +} diff --git a/das/src/main/java/com/das/modules/operation/entity/SysManualStatus.java b/das/src/main/java/com/das/modules/operation/entity/SysManualStatus.java index 9cd32c6f..14c91819 100644 --- a/das/src/main/java/com/das/modules/operation/entity/SysManualStatus.java +++ b/das/src/main/java/com/das/modules/operation/entity/SysManualStatus.java @@ -43,4 +43,6 @@ public class SysManualStatus extends BaseEntity { */ @TableField("status") private Integer status; + + private Integer count; } diff --git a/das/src/main/java/com/das/modules/operation/mapper/SysManualStatusMapper.java b/das/src/main/java/com/das/modules/operation/mapper/SysManualStatusMapper.java index 5d12b179..053d8e5e 100644 --- a/das/src/main/java/com/das/modules/operation/mapper/SysManualStatusMapper.java +++ b/das/src/main/java/com/das/modules/operation/mapper/SysManualStatusMapper.java @@ -1,9 +1,12 @@ package com.das.modules.operation.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.das.modules.auth.mapper.BaseMapperPlus; import com.das.modules.operation.entity.SysManualStatus; import org.apache.ibatis.annotations.Mapper; @Mapper -public interface SysManualStatusMapper extends BaseMapper { +public interface SysManualStatusMapper extends BaseMapperPlus { + + int sysManualStatusInsertOrUpdate(SysManualStatus sysManualStatus); } diff --git a/das/src/main/java/com/das/modules/operation/mapper/SysOperationLogMapper.java b/das/src/main/java/com/das/modules/operation/mapper/SysOperationLogMapper.java index 7b137e38..87b56f34 100644 --- a/das/src/main/java/com/das/modules/operation/mapper/SysOperationLogMapper.java +++ b/das/src/main/java/com/das/modules/operation/mapper/SysOperationLogMapper.java @@ -1,9 +1,18 @@ package com.das.modules.operation.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.das.modules.auth.mapper.BaseMapperPlus; +import com.das.modules.operation.domain.dto.EventLogDto; +import com.das.modules.operation.domain.vo.SysOperationLogVo; import com.das.modules.operation.entity.SysOperationLog; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper -public interface SysOperationLogMapper extends BaseMapper { +public interface SysOperationLogMapper extends BaseMapperPlus { + + IPage getEventLogList(IPage page , + @Param("info") EventLogDto eventLogDto); + + } diff --git a/das/src/main/java/com/das/modules/operation/service/OperationLogService.java b/das/src/main/java/com/das/modules/operation/service/OperationLogService.java new file mode 100644 index 00000000..31d61f19 --- /dev/null +++ b/das/src/main/java/com/das/modules/operation/service/OperationLogService.java @@ -0,0 +1,10 @@ +package com.das.modules.operation.service; + +import com.das.common.utils.PageDataInfo; +import com.das.modules.operation.domain.dto.EventLogDto; +import com.das.modules.operation.domain.vo.SysOperationLogVo; + +public interface OperationLogService { + + PageDataInfo getEventLogList(EventLogDto eventLogDto); +} diff --git a/das/src/main/java/com/das/modules/operation/service/OperationService.java b/das/src/main/java/com/das/modules/operation/service/OperationService.java index df671e6d..187b3b14 100644 --- a/das/src/main/java/com/das/modules/operation/service/OperationService.java +++ b/das/src/main/java/com/das/modules/operation/service/OperationService.java @@ -12,7 +12,7 @@ import com.das.modules.node.disruptor.TerminalMessageEventHandler; import com.das.modules.node.domain.bo.TerminalMessage; import com.das.modules.node.domain.vo.SysNodeVo; import com.das.modules.node.mapper.SysNodeMapper; -import com.das.modules.operation.domain.CommandInfoDto; +import com.das.modules.operation.domain.dto.CommandInfoDto; import com.das.modules.operation.entity.SysManualStatus; import com.das.modules.operation.entity.SysOperationLog; import com.das.modules.operation.mapper.SysManualStatusMapper; @@ -71,11 +71,11 @@ public class OperationService { sysManualStatus.setDeviceId(cmdInfo.getDeviceId()); sysManualStatus.setAttributeCode(cmdInfo.getServiceCode()); sysManualStatus.setStatus( Integer.valueOf(cmdInfo.getOpValue().toString())); - sysManualStatusMapper.insert(sysManualStatus); + sysManualStatusMapper.sysManualStatusInsertOrUpdate(sysManualStatus); // 2、更新redis RT实时数据值 String key = String.format("RT:%s:%s", cmdInfo.getDeviceId(), cmdInfo.getServiceCode().toLowerCase()); // 存入redis - adminRedisTemplate.set(key, cmdInfo.getOpValue()); + adminRedisTemplate.set(key, cmdInfo.getOpValue()); } else { sendCommand(cmdInfo); //发送命令消息 } diff --git a/das/src/main/java/com/das/modules/operation/service/impl/OperationLogServiceImpl.java b/das/src/main/java/com/das/modules/operation/service/impl/OperationLogServiceImpl.java new file mode 100644 index 00000000..ff1f2b37 --- /dev/null +++ b/das/src/main/java/com/das/modules/operation/service/impl/OperationLogServiceImpl.java @@ -0,0 +1,30 @@ +package com.das.modules.operation.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.das.common.utils.PageDataInfo; +import com.das.common.utils.PageQuery; +import com.das.modules.operation.domain.dto.EventLogDto; +import com.das.modules.operation.domain.vo.SysOperationLogVo; +import com.das.modules.operation.mapper.SysOperationLogMapper; +import com.das.modules.operation.service.OperationLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class OperationLogServiceImpl implements OperationLogService { + + @Autowired + private SysOperationLogMapper sysOperationLogMapper; + + /** + * 获取事件记录 + */ + @Override + public PageDataInfo getEventLogList(EventLogDto eventLogDto) { + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageNum(eventLogDto.getPageNum()); + pageQuery.setPageSize(eventLogDto.getPageSize()); + IPage iPage = sysOperationLogMapper.getEventLogList(pageQuery.build(), eventLogDto); + return PageDataInfo.build(iPage.getRecords(), iPage.getTotal()); + } +} diff --git a/das/src/main/java/com/das/modules/page/controller/HomeController.java b/das/src/main/java/com/das/modules/page/controller/HomeController.java index 38f191d0..ed5e62db 100644 --- a/das/src/main/java/com/das/modules/page/controller/HomeController.java +++ b/das/src/main/java/com/das/modules/page/controller/HomeController.java @@ -1,9 +1,10 @@ package com.das.modules.page.controller; import com.das.common.result.R; -import com.das.modules.page.domian.HomeWindFarmRealDataVo; -import com.das.modules.page.domian.HomeWindTurbineMatrixDataVoVo; +import com.das.modules.data.domain.TSValueQueryParam; import com.das.modules.page.domian.dto.WindFarmRealDataDto; +import com.das.modules.page.domian.vo.HomeWindFarmRealDataVo; +import com.das.modules.page.domian.vo.HomeWindTurbineMatrixDataVoVo; import com.das.modules.page.service.HomeService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Map; /** * 首页相关Controller @@ -46,4 +48,12 @@ public class HomeController { } + + /** + * 获取历史数据(1.获取功率趋势的曲线,2.发电量日 趋势的曲线) + */ + @PostMapping("/getHistoryData") + public R>>> getHistoryData(@RequestBody TSValueQueryParam param) { + return R.success(homeService.getHistoryData(param)); + } } diff --git a/das/src/main/java/com/das/modules/page/domian/HomeWindFarmRealDataVo.java b/das/src/main/java/com/das/modules/page/domian/vo/HomeWindFarmRealDataVo.java similarity index 83% rename from das/src/main/java/com/das/modules/page/domian/HomeWindFarmRealDataVo.java rename to das/src/main/java/com/das/modules/page/domian/vo/HomeWindFarmRealDataVo.java index e9ce6c9f..cb31be2f 100644 --- a/das/src/main/java/com/das/modules/page/domian/HomeWindFarmRealDataVo.java +++ b/das/src/main/java/com/das/modules/page/domian/vo/HomeWindFarmRealDataVo.java @@ -1,4 +1,4 @@ -package com.das.modules.page.domian; +package com.das.modules.page.domian.vo; import lombok.Data; diff --git a/das/src/main/java/com/das/modules/page/domian/HomeWindTurbineMatrixDataVoVo.java b/das/src/main/java/com/das/modules/page/domian/vo/HomeWindTurbineMatrixDataVoVo.java similarity index 94% rename from das/src/main/java/com/das/modules/page/domian/HomeWindTurbineMatrixDataVoVo.java rename to das/src/main/java/com/das/modules/page/domian/vo/HomeWindTurbineMatrixDataVoVo.java index 1669b648..0541368d 100644 --- a/das/src/main/java/com/das/modules/page/domian/HomeWindTurbineMatrixDataVoVo.java +++ b/das/src/main/java/com/das/modules/page/domian/vo/HomeWindTurbineMatrixDataVoVo.java @@ -1,4 +1,4 @@ -package com.das.modules.page.domian; +package com.das.modules.page.domian.vo; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; diff --git a/das/src/main/java/com/das/modules/page/service/HomeService.java b/das/src/main/java/com/das/modules/page/service/HomeService.java index 4658829b..b7c86286 100644 --- a/das/src/main/java/com/das/modules/page/service/HomeService.java +++ b/das/src/main/java/com/das/modules/page/service/HomeService.java @@ -1,10 +1,12 @@ package com.das.modules.page.service; -import com.das.modules.page.domian.HomeWindFarmRealDataVo; -import com.das.modules.page.domian.HomeWindTurbineMatrixDataVoVo; +import com.das.modules.data.domain.TSValueQueryParam; import com.das.modules.page.domian.dto.WindFarmRealDataDto; +import com.das.modules.page.domian.vo.HomeWindFarmRealDataVo; +import com.das.modules.page.domian.vo.HomeWindTurbineMatrixDataVoVo; import java.util.List; +import java.util.Map; public interface HomeService { /** @@ -22,30 +24,13 @@ public interface HomeService { */ HomeWindFarmRealDataVo getWindFarmRealData(WindFarmRealDataDto windFarmRealDataDto); - /** - * 接口3: 获取功率趋势的曲线 - * 页面左下角【功率趋势】 - * 测点:WindFarmActivePower全场总有功功率、WindFarmAvgWindSpeed 全场平均风速 - * 时间间隔 5分钟 - * 时间区间从 今天的00:00:00 到 现在的时间 - */ /** - * 接口4: 发电量日 趋势的曲线 - * 页面右中角【发电量趋势】中的日 - * 测点:WindFarmDayProdEnergy 日发电量 - * 时间间隔 1天 - * 时间区间从 本月1号 到月末31号 一个月一天一条记录 - * 同期就是去年对应时间 + * 获取历史数据(1.获取功率趋势的曲线,2.发电量日趋势的曲线) */ + Map>> getHistoryData(TSValueQueryParam param); + + - /** - * 接口5: 发电量月 趋势的曲线 - * 页面右中角【发电量趋势】中的日 - * 测点:WIndFarmMonthProdEnergy 月发电量 - * 时间间隔 1月 - * 时间区间从 今年的1月1日 到 年底12月31日 一年每个月一条记录 - * 同期就是去年对应时间 - */ } diff --git a/das/src/main/java/com/das/modules/page/service/impl/HomeServiceImpl.java b/das/src/main/java/com/das/modules/page/service/impl/HomeServiceImpl.java index 7b5da110..9df86272 100644 --- a/das/src/main/java/com/das/modules/page/service/impl/HomeServiceImpl.java +++ b/das/src/main/java/com/das/modules/page/service/impl/HomeServiceImpl.java @@ -2,15 +2,19 @@ package com.das.modules.page.service.impl; import com.das.common.constant.EquipmentTypeIds; +import com.das.common.utils.JsonUtils; import com.das.modules.data.domain.SnapshotValueQueryParam; +import com.das.modules.data.domain.TSValueQueryParam; import com.das.modules.data.service.impl.DataServiceImpl; import com.das.modules.equipment.domain.dto.SysEquipmentDto; import com.das.modules.equipment.domain.vo.SysEquipmentVo; import com.das.modules.equipment.mapper.SysEquipmentMapper; -import com.das.modules.page.domian.HomeWindFarmRealDataVo; -import com.das.modules.page.domian.HomeWindTurbineMatrixDataVoVo; import com.das.modules.page.domian.dto.WindFarmRealDataDto; +import com.das.modules.page.domian.vo.HomeWindFarmRealDataVo; +import com.das.modules.page.domian.vo.HomeWindTurbineMatrixDataVoVo; import com.das.modules.page.service.HomeService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +@Slf4j @Service public class HomeServiceImpl implements HomeService { @@ -145,4 +150,35 @@ public class HomeServiceImpl implements HomeService { } return homeWindFarmRealDataVo; } + + + /** + * 获取历史数据(1.获取功率趋势的曲线,2.发电量日 趋势的曲线) + */ + @Override + public Map>> getHistoryData(TSValueQueryParam param) { + List devices = param.getDevices(); + for (SnapshotValueQueryParam device : devices) { + if (StringUtils.isBlank(device.getDeviceId())){ + //查询数据库中风电场设备,取第一个风电场 + SysEquipmentDto sysEquipmentDto = new SysEquipmentDto(); + sysEquipmentDto.setObjectType(EquipmentTypeIds.EQUIPMENT_TYPE_WIND_FARM); + List list = sysEquipmentMapper.queryEquipmentList(sysEquipmentDto); + if(list.isEmpty()){ + throw new RuntimeException("系统中没有风电场台账信息"); + } + device.setDeviceId(list.get(0).getId().toString()); + } + } + Map>> mapResult = dataServiceImpl.queryTimeSeriesValues(param); + if (log.isDebugEnabled()){ + log.debug("/api/home/getHistoryData is calling"); + log.debug("参数:"+JsonUtils.toJsonString(param)); + log.debug("返回值:"+JsonUtils.toJsonString(mapResult)); + } + return mapResult; + } + + + } diff --git a/das/src/main/resources/application-dev.yml b/das/src/main/resources/application-dev.yml new file mode 100644 index 00000000..d33a2bc2 --- /dev/null +++ b/das/src/main/resources/application-dev.yml @@ -0,0 +1,100 @@ +server: + port: 8080 + # SpringBoot中我们既可以使用Tomcat作为Http服务,也可以用Undertow来代替。Undertow在高并发业务场景中,性能优于Tomcat + undertow: + threads: + # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 + io: 16 + # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载 + worker: 400 + # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理 + # 每块buffer的空间大小,越小的空间被利用越充分 + buffer-size: 1024 + # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的 + max-http-post-size: -1 + # 是否分配的直接内存 + direct-buffers: true + +sa-token: + # token有效期,单位秒 + expireTime: 7200 + refreshExpireTime: 604800 + # 是否允许同一账号多终端登录,默认为true + is-concurrent: true + + +spring: + application: + name: das + #json格式化全局配置,相当于@JsonFormat + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + # 指定默认包含的熟悉,NON_NULL表示只序列化非空属性 + default-property-inclusion: non_null + # 配置文件上传大小限制 + servlet: + multipart: + # 单个文件最大大小 + max-file-size: 1024MB + # 多个文件总大小 + max-request-size: 2048MB + datasource: + url: jdbc:postgresql://192.168.109.102:5432/das + username: das + password: qwaszx12 + # # redis相关配置 + data: + redis: + host: 192.168.109.195 + database: 0 + port: 6379 + password: + client-type: lettuce + + +# 配置 xml 文件所在位置 配置全局的 主键策略,默认为 ASSIGN_ID 默认为 【雪花算法】 , auto 自增 +mybatis-plus: + mapper-locations: classpath*:/mapper/**/*.xml + # 搜索指定包别名 + typeAliasesPackage: com.das.**.entity + global-config: + # 关闭MP3.0自带的banner + banner: false + db-config: + id-type: ASSIGN_ID + # 逻辑删除 + logic-not-delete-value: 0 + logic-delete-value: 1 + #字段策略 + insert-strategy: not_null + update-strategy: not_null + where-strategy: not_empty + #驼峰下划线转换 + table-underline: true + # 开启驼峰命名 默认开启驼峰命名 + # mybatis-plus配置控制台打印完整带参数SQL语句 + configuration: + map-underscore-to-camel-case: true + cache-enabled: false + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +# 验证码相关 +captcha: + enabled: true + verify-type: calculate + expire: 120 + +das: + aes: + key: b6967ee87b86d85a + +logging: + level: + com: + das: DEBUG + +tdengine: + password: taosdata + url: jdbc:TAOS-RS://192.168.109.160:6041/das + username: root \ No newline at end of file diff --git a/das/src/main/resources/mapper/SysManualStatusMapper.xml b/das/src/main/resources/mapper/SysManualStatusMapper.xml new file mode 100644 index 00000000..dd0117b2 --- /dev/null +++ b/das/src/main/resources/mapper/SysManualStatusMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + select count(*) FROM sys_manual_status where device_id =#{deviceId} and attribute_code =#{attributeCode} + + + INSERT INTO public.sys_manual_status + (id, device_id, attribute_code, status) + VALUES(#{id}, #{deviceId}, #{attributeCode}, #{status}) + + + UPDATE public.sys_manual_status + SET status=#{status} + WHERE device_id=#{deviceId} AND attribute_code=#{attributeCode} + + + + + + diff --git a/das/src/main/resources/mapper/SysOperationLogMapper.xml b/das/src/main/resources/mapper/SysOperationLogMapper.xml new file mode 100644 index 00000000..55481f57 --- /dev/null +++ b/das/src/main/resources/mapper/SysOperationLogMapper.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_sidebar.md b/docs/_sidebar.md index fae6dcb8..9375cbe0 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -4,6 +4,8 @@ - [设备管理接口](api/equipment.md) - [节点管理接口](api/node.md) - [数据访问接口](api/data.md) + - [数据字段接口](api/enumPage.md) + - [人工操作接口](api/operation.md) - [页面访问接口](api/pages/) - [首页接口](api/pages/home.md) - [数据采集](datacollect/) diff --git a/docs/api/operation.md b/docs/api/operation.md new file mode 100644 index 00000000..cafe2137 --- /dev/null +++ b/docs/api/operation.md @@ -0,0 +1,195 @@ +# 操作相关模块 + +## API接口一览表 + +| 接口分类 | 接口描述 | API接口 | 权限 | +|---------|-----------------| ------------------------------------- | --------------------------- | +| 2.1操作记录 | 2.1.1获取相关操作记录 | /api/operation/getEventLogList | | +| 2.2手动操作 | 2.2.1设备遥控操作 下令 | /api/operation/command | SYS_AUTHORITY_ID_DEVICE_CTRL| +| | 2.2.2设备遥调操作 下令 | /api/operation/setPoint | SYS_AUTHORITY_ID_DEVICE_CTRL| +| | 2.2.3设备手工至位 不下令 | /api/operation/manualCommand | SYS_AUTHORITY_ID_DEVICE_CTRL| + + +### 2.1 操作相关模块接口 + +#### 2.1.1 获取相关操作记录 + +POST 请求接口 + +> /api/operation/getEventLogList + +请求参数 + +```json +{ + "startTime": "2024-10-21 23:00:00:00", + "endTime": "2024-10-31 23:00:00:00",YES + "windTurbinesCode": "SC-01", + "userName": "张三", + "pageNum": 1, + "pageSize": 10 +} +``` +入参描述 + +| 参数名 | 参数类型 | 可选 | 描述 | +| ------------ |---------|-----|--------| +| startTime | String | YES | 开始时间 | +| endTime | String | YES | 结束时间 | +| windTurbinesCode | String | YES | 风机编号 | +| userName | String | YES | 操作人员 | +| pageNum | Integer | NO | 当前页 | +| pageSize | Integer | NO | 每页显示大小 | + +返回报文 + +```json +{ + "code": 200, + "success": true, + "data": { + "total": 2, + "rows": [ + { + "id": "1851903283326214146", + "userName": "张三", + "optTime": "2024-10-31 16:25:24", + "deviceId": 863256444266222, + "attributeCode": "testCode", + "attributeName": "测试遥控2", + "optDesc": "手动调试2", + "name": "A-001" + } + ], + "code": 200, + "msg": "查询成功" + }, + "msg": "操作成功" +} +``` +返参描述 + +| 参数名 | 参数类型 | 可选 | 描述 | +|---------------|--------| ---- |--------| +| id | Long | 否 | id | +| optTime | String | 否 | 时间 | +| attributeCode | String | 否 | 风机编号 | +| attributeName | String | 否 | 操作类型 | +| optDesc | String | 否 | 操作详情 | +| userName | String | 否 | 操作员 | +| deviceId | Long | 否 | 操作设备id | +| name | String | 否 | 设备名称 | + + +### 2.2 手动操作相关接口 + +#### 2.2.1 设备遥控操作 下令 + +POST 请求接口 + +> /api/operation/command + +请求参数 + +```json +{ + "deviceId": 863256444266222, + "serviceCode": "setTurbineStop", + "serviceName": "风机停机指令", + "optDesc": "风机停机", + "opValue": 0 +} +``` +入参描述 + +| 参数名 | 参数类型 | 可选 | 描述 | +| ------------ |---------|-----|------| +| deviceId | Long | NO | 设备id | +| serviceCode | String | NO | 命令编码 | +| serviceName | String | YES | 遥控名称 | +| optDesc | String | YES | 风机停机、风机启动等操作描述 | +| opValue | Integer | NO | 遥控值 | + +返回报文 + +```json +{ + "code": 200, + "success": true, + "msg": "操作成功" +} +``` + +#### 2.2.2 设备遥调操作 下令 + +POST 请求接口 + +> /api/operation/setPoint + +请求参数 + +```json +{ + "deviceId": 863256444266222, + "serviceCode": "setGenSpeedLimitValue", + "serviceName": "发电机转速给定值", + "optDesc": "发电机转速给定值:12.45", + "opValue": 12.45 +} +``` +入参描述 + +| 参数名 | 参数类型 | 可选 | 描述 | +| ------------ |---------|-----|------| +| deviceId | Long | NO | 设备id | +| serviceCode | String | NO | 命令编码 | +| serviceName | String | YES | 遥控名称 | +| optDesc | String | YES | 设定值描述 | +| opValue | Integer | NO | 遥控值 | + +返回报文 + +```json +{ + "code": 200, + "success": true, + "msg": "操作成功" +} +``` + +#### 2.2.3 设备手工至位 不下令 + +POST 请求接口 + +> /api/operation/manualCommand + +请求参数 + +```json +{ + "deviceId": 863256444266222, + "serviceCode": "Locked", + "serviceName": "风机被锁定", + "optDesc": "风机锁定", + "opValue": 1 +} +``` +入参描述 + +| 参数名 | 参数类型 | 可选 | 描述 | +| ------------ |---------|-----|------| +| deviceId | Long | NO | 设备id | +| serviceCode | String | NO | 命令编码 | +| serviceName | String | YES | 遥控名称 | +| optDesc | String | YES | 风机锁定、风机解锁类似这样的描述 | +| opValue | Integer | NO | 遥控值 | + +返回报文 + +```json +{ + "code": 200, + "success": true, + "msg": "操作成功" +} +``` \ No newline at end of file diff --git a/docs/api/pages/home.md b/docs/api/pages/home.md index 70392fd9..d04a37d6 100644 --- a/docs/api/pages/home.md +++ b/docs/api/pages/home.md @@ -2,25 +2,19 @@ ## API接口一览表 -| 接口分类 | 接口描述 | 查询条件 | API接口 | 权限 | -|--------|-------------|------------------------------| ---------------------------- | ---------------------------- | -| 2.1 首页 | 2.1.1风场概况 | 实时数据,没有入参 | /api/home/windFarmOverview | | -| | 2.1.2今日运行状态 | 实时数据,没有入参 | /api/home/currentDayStatus | | -| | 2.1.3功率趋势 | 当天24小时数据,5分钟间隔 | /api/home/powerTrends | | -| | 2.1.4风机矩阵 | 实时数据,没有参数 | /api/home/windTurbineMatrix | | -| | 2.1.5发电量概况 | 昨日数据; | /api/home/generationOverview | | -| | 2.1.6发电量趋势 | 日: 当前月的每日数据;同期是去年数据;月:当年每月月数据,12个月; | /api/home/generationTrend | | -| | 2.1.7实时告警 | 近一个月内所有的报警数据,滚动显示;已确认的数据 按钮灰色;未确认的显示确认按钮 | /api/home/realTimeAlert | | -| | 2.1.8实时告警确认 | 告警记录ID | /api/home/realTimeAlertConfirm | | +| 接口分类 | 接口描述 | 查询条件 | API接口 | 权限 | +|--------|----------------|-----------| ---------------------------- | ---------------------------- | +| 2.1 首页 | 2.1.1风机矩阵 | 实时数据,没有入参 | /api/home/getWindTurbineMatrixData | | +| | 2.1.2获取风电场实时数据 | 风电场id | /api/home/getWindFarmRealData | | ## 2.1 首页相关接口 -### 2.1.1 风场概况 +### 2.1.1 风机矩阵 POST 请求接口 -> /api/home/windFarmOverview +> /api/home/getWindTurbineMatrixData 请求参数 @@ -32,366 +26,157 @@ POST 请求接口 ```json { - "code": 200, - "msg": "操作成功", - "success": true, - "data": - { - "power": 56.2, - "windSpeed": 45.3, - "dailyUsageHours": 20, - "monthlyUsageHours": 78 - } + "code": 200, + "success": true, + "data": [ + { + "irn": "1846101273013739522", + "name": "A-001", + "modelId": "1807685851882508289", + "model": "倍福1.5", + "belongLine": "线路1", + "standard": 1, + "nominalCapacity": 66.23, + "attributeMap": { + "iwindspeed": 10.84000015258789, + "iturbineoperationmode": 6, + "iyplevel": 0, + "ikwhthisday": 0, + "igenpower": 0, + "gridlostdetected": 0 + } + } + ], + "msg": "操作成功" } ``` 返参描述 | 参数名 | 参数类型 | 可选 | 描述 | -| ------------- |---------| ---- |--------| -| power | Double | 否 | 功率 | -| windSpeed | Double | 否 | 风速 | -| dailyUsageHours | Integer | 否 | 日利用小时数 | -| monthlyUsageHours | Integer | 否 | 月利用小时数 | +| ------------ |---------| ---- |--------| +| standard | Integer | 否 | 是否标杆 | +| nominalCapacity | Double | 否 | 容量 | +| iwindspeed | Double | 否 | 风速 | +| iyplevel | Double | 否 | 偏航运行模式 | +| ikwhthisday | Double | 否 | 日发电量 | +| igenpower | Double | 否 | 有功功率 | +| gridlostdetected | Double | 否 | 风机电网掉电 | -### 2.1.2 今日运行状态 +### 2.1.2 获取风电场实时数据 POST 请求接口 -> /api/home/currentDayStatus +> /api/home/getWindFarmRealData 请求参数 +```json +{ + "windFarmId":1846101273013739522 +} +``` +入参描述 -无 - -注:实时数据,没有入参 +| 参数名 | 参数类型 | 可选 | 描述 | +| ------------ |------| ---- |------| +| windFarmId | Long | yes | 风场id | 返回报文 ```json { - "code": 200, - "msg": "操作成功", - "success": true, - "data": - { - "windTurbineNum": 40, - "installedCapacity": 45.32, - "runCapacity": 20.2, - "runNum": 78, - "standbyCapacity": 63.2, - "standbyNum": 35, - "faultCapacity": 56.4, - "faultNum": 53, - "offlineCapacity": 16.4, - "offlineNum": 20 - } + "code": 200, + "success": true, + "data": { + "windFarmId": 1848624295633317890, + "attributeMap": { + "windfarmactivepower": 111.01, + "windfarmavgwindspeed": 111.01, + "windfarmdayoperationhours": 111.01, + "windfarmmonthoperationhours": 111.01, + "windfarmdayprodenergy": 111.01, + "windfarmmonthprodenergy": 111.01, + "windfarmyearprodenergy": 111.01, + "windfarmtotalprodenergy": 111.01 + } + }, + "msg": "操作成功" } ``` 返参描述 | 参数名 | 参数类型 | 可选 | 描述 | | ------------- |---------| ---- |------| -| windTurbineNum | Integer | 否 | 风机台数 | -| installedCapacity | Double | 否 | 装机容量 | -| runCapacity | Double | 否 | 运行容量 | -| runNum | Integer | 否 | 运行台数 | -| standbyCapacity | Double | 否 | 待机容量 | -| standbyNum | Integer | 否 | 待机台数 | -| faultCapacity | Double | 否 | 故障容量 | -| faultNum | Integer | 否 | 故障台数 | -| offlineCapacity | Double | 否 | 离线容量 | -| offlineNum | Integer | 否 | 离线台数 | +| windFarmId | Long | 否 | 风场id | +| windfarmactivepower | Double | 否 | 功率 | +| windfarmavgwindspeed | Double | 否 | 平均风速 | +| windfarmdayoperationhours | Double | 否 | 日利用小时 | +| windfarmmonthoperationhours | Double | 否 | 月利用小时 | +| windfarmdayprodenergy | Double | 否 | 日发电量 | +| windfarmmonthprodenergy | Double | 否 | 月发电量 | +| windfarmyearprodenergy | Double | 否 | 年发电量 | +| windfarmtotalprodenergy | Double | 否 | 总发电量 | - -### 2.1.3 功率趋势 +### 2.1.3 获取风电场历史数据 POST 请求接口 -> /api/home/powerTrends +> /api/home/getHistoryData 请求参数 - -无 - -注:当天24小时数据,5分钟间隔 - -返回报文 - ```json { - "code": 200, - "msg": "操作成功", - "success": true, - "data": [ - { - "power": 12.6, - "windSpeed": 56.3, - "dataTime": "2024-10-17 00:00:00" - }, - { - "power": 10.6, - "windSpeed": 16.3, - "dataTime": "2024-10-17 00:05:00" - } - ] + "startTime": "123452435324242", + "endTime": "123452435924242", + "devices": [ + { + "deviceId":"129476828342323", + "attributes":["power","windSpeed"] + }, + { + "deviceId":"129476828342324", + "attributes":["power","dailyUsageHours"] + } + ], + "interval": "5m" } ``` - -返参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -|-------------|--------| ---- |------| -| power | Double | 否 | 功率 | -| windSpeed | Double | 否 | 风速 | -| dataTime | String | 否 | 数据时间 | - -### 2.1.4 风机矩阵 - -POST 请求接口 - -> /api/home/windTurbineMatrix - -请求参数 - -无 - -注:实时数据 - -返回报文 - -```json -{ - "code": 200, - "msg": "操作成功", - "success": true, - "data": [ - { - "power": 12.6, - "windSpeed": 56.3, - "dayGeneration": 56.2, - "windStatus": "并网", - "standard": 1, - "windTurbine": "GDWT00001" - }, - { - "power": 12.6, - "windSpeed": 56.3, - "dayGeneration": 56.2, - "windStatus": "待机", - "standard": 1, - "windTurbine": "GDWT00002" - } - ] -} -``` - -返参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -|-------------|---------| ---- |---------| -| power | Double | 否 | 功率 | -| windSpeed | Double | 否 | 风速 | -| dayGeneration | Double | 否 | 日发电量 | -| windStatus | String | 否 | 风机状态 | -| standard | Integer | 否 | 是否为标杆机组 | -| windTurbine | String | 否 | 风机编码 | - -### 2.1.5 发电量概况 - -POST 请求接口 - -> /api/home/generationOverview - -请求参数 - - -```json -{ - "requestTime":"2024-10-16" -} -``` - 入参描述 | 参数名 | 参数类型 | 可选 | 描述 | | ------------ | -------- | ---- |------| -| requestTime | String | yes | 请求时间 | - -注:请求时间默认为:昨日时间 - +| startTime | String | no | 开始时间戳 | +| endTime | String | no | 结束时间戳 | +| devices.deviceId | String | no | 设备ID | +| devices.attributes | StringArray | no | 要查询实时数据的设备属性列表 | +| interval | String | yes | 抽样间隔,1a(毫秒),1s(秒),1m(分),1h(小时),1d(天),1w(周)。 忽略或者值为空时,返回原始数据(不抽样) | +| endTime | String | no | 结束时间戳 | 返回报文 ```json { - "code": 200, - "msg": "操作成功", - "success": true, - "data": - { - "dailyGeneration": 63.2, - "dayGeneration": 56.2, - "monthGeneration": 60.2, - "yearGeneration": 200.6, - "totalGeneration": 500.6 + "code": 200, + "msg": "操作成功", + "success": true, + "data": { + //设备ID + "129476828342323":{ + //属性名 + "power": { + //时间戳列表 + "times": [123452435924242,123452435924342,123452435924442,123452435924542], + //值列表 + "values": [123.23,35.21,34.56,67] + } , + //属性名 + "windSpeed": { + "times": [123452435924242,123452435924342,123452435924442,123452435924542], + "values": [123.23,35.21,34.56,67] } - + }, + ....... + } } ``` - -返参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -|-------------|---------| ---- |-------| -| dailyGeneration | Double | 否 | 当日发电量 | -| dayGeneration | Double | 否 | 日发电量 | -| monthGeneration | Double | 否 | 月发电量 | -| yearGeneration | Double | 否 | 年发电量 | -| totalGeneration | Double | 否 | 总发电量 | - -### 2.1.6 发电量趋势 - -POST 请求接口 - -> /api/home/generationTrend - -请求参数 - - -```json -{ - "timeType":"日" -} -``` -注: 日:当前月的每日数据;同期是去年数据;月:当年每月月数据,12个月; - -入参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -| ------------ | -------- | ---- |------| -| timeType | String | yes | 时间类型 | - - -返回报文 - -```json -{ - "code": 200, - "msg": "操作成功", - "success": true, - "data": [ - { - "currentPeriod": 56.3, - "samePeriod": 63.5, - "generationTime": "2024-10-01" - }, - { - "currentPeriod": 66.3, - "samePeriod": 73.5, - "generationTime": "2024-10-02" - } - ] - -} -``` - -返参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -|-------------|---------| ---- |-------| -| currentPeriod | Double | 否 | 本期 | -| samePeriod | Double | 否 | 同期 | -| generationTime | Double | 否 | 发电量时间 | - -### 2.1.7 实时告警 - -POST 请求接口 - -> /api/home/realTimeAlert - -请求参数 - -无 - -注:近一个月内所有的报警数据,滚动显示;已确认的数据 按钮灰色;未确认的显示确认按钮 - -返回报文 - -```json -{ - "code": 200, - "msg": "操作成功", - "success": true, - "data": [ - { - "alertTime": "2024-10-16 12:16:42", - "windTurbine": "SC-01", - "alertContent": "故障", - "alertId": 4562366, - "confirmStatus": 0 - }, - { - "alertTime": "2024-10-16 12:16:42", - "windTurbine": "SC-01", - "alertContent": "待机", - "alertId": 4562366555, - "confirmStatus": 1 - } - ] - -} -``` -返参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -|-------------|---------| ---- |------| -| alertTime | String | 否 | 告警时间 | -| windTurbine | String | 否 | 风机编码 | -| alertContent | String | 否 | 告警内容 | -| alertId | Long | 否 | 告警id | -| confirmStatus | Integer | 否 | 确认状态 | - -### 2.1.8 实时告警-确认 - -POST 请求接口 - -> /api/home/realTimeAlertConfirm - -请求参数 - - -```json -{ - "alertId":45566222 -} -``` - -入参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -| ------------ |------| ---- |------| -| alertId | Long | yes | 告警id | - - - -返回报文 - -```json -{ - "code": 200, - "msg": "操作成功", - "success": true, - "data": [ - - ] - -} -``` - -返参描述 - -| 参数名 | 参数类型 | 可选 | 描述 | -|-------------|---------| ---- |-------| - diff --git a/docs/deploy/asserts/image-10.png b/docs/deploy/asserts/image-10.png new file mode 100644 index 00000000..bb5fb3d7 Binary files /dev/null and b/docs/deploy/asserts/image-10.png differ diff --git a/docs/deploy/asserts/image-11.png b/docs/deploy/asserts/image-11.png new file mode 100644 index 00000000..37bd0af6 Binary files /dev/null and b/docs/deploy/asserts/image-11.png differ diff --git a/docs/deploy/asserts/image-2.png b/docs/deploy/asserts/image-2.png new file mode 100644 index 00000000..cff97605 Binary files /dev/null and b/docs/deploy/asserts/image-2.png differ diff --git a/docs/deploy/asserts/image-3.png b/docs/deploy/asserts/image-3.png new file mode 100644 index 00000000..111f0dd5 Binary files /dev/null and b/docs/deploy/asserts/image-3.png differ diff --git a/docs/deploy/asserts/image-4.png b/docs/deploy/asserts/image-4.png new file mode 100644 index 00000000..67c6640a Binary files /dev/null and b/docs/deploy/asserts/image-4.png differ diff --git a/docs/deploy/asserts/image-5.png b/docs/deploy/asserts/image-5.png new file mode 100644 index 00000000..c0ac4967 Binary files /dev/null and b/docs/deploy/asserts/image-5.png differ diff --git a/docs/deploy/asserts/image-6.png b/docs/deploy/asserts/image-6.png new file mode 100644 index 00000000..e46cad08 Binary files /dev/null and b/docs/deploy/asserts/image-6.png differ diff --git a/docs/deploy/asserts/image-7.png b/docs/deploy/asserts/image-7.png new file mode 100644 index 00000000..21e7b86b Binary files /dev/null and b/docs/deploy/asserts/image-7.png differ diff --git a/docs/deploy/asserts/image-8.png b/docs/deploy/asserts/image-8.png new file mode 100644 index 00000000..21e7b86b Binary files /dev/null and b/docs/deploy/asserts/image-8.png differ diff --git a/docs/deploy/asserts/image-9.png b/docs/deploy/asserts/image-9.png new file mode 100644 index 00000000..5219c841 Binary files /dev/null and b/docs/deploy/asserts/image-9.png differ diff --git a/docs/deploy/linux.md b/docs/deploy/linux.md index 9f0b819d..d3c7a154 100644 --- a/docs/deploy/linux.md +++ b/docs/deploy/linux.md @@ -1,3 +1,51 @@ # OpenEuler 24.03 (LTS) 安装部署 -!> 等待更新 \ No newline at end of file +## 操作系统安装 + +OpenEuler的安装和Centos差不多,这里不详细说明了,就把几个建议步骤说下,这样可以减少后期手动配置的麻烦。 + +![alt text](asserts/image-2.png) + +> 语言这里选 `English`。 + +![alt text](asserts/image-3.png) + +> `Keyboard` 不修改。 + +> `Installation Source` 不修改。 + +> `Installation Destination` 这里要配置磁盘分区。(不是一定要这样配置,会的随意配置) + +![alt text](asserts/image-4.png) + +![alt text](asserts/image-5.png) + +![alt text](asserts/image-6.png) + +点左下角的`+`,新建分区 + +![alt text](asserts/image-7.png) + +`Mount Point`填: /das, 大小不用填,默认会使用剩余所有空间。 + +![alt text](asserts/image-9.png) + +点击 `Done`完成分区配置。 + +> `Lanage Support` 这个需要勾上中文。 + +![alt text](asserts/image-10.png) + +> `Software Selection` 这里基础环境选择"Server", 右侧再勾上一个开发工具包,以防后续内网环境下编译安装程序时需要。 + +![alt text](asserts/image-11.png) + +> `Network & Hostname` 根据实际情况配置。 + +> `Time & Date` 时区不用修改了。 + +下面的root账号密码设置下,普通用户就不用创建了。 + +## 系统配置 + +!> 未完待续 \ No newline at end of file diff --git a/ui/dasadmin/src/layouts/backend/components/aside.vue b/ui/dasadmin/src/layouts/backend/components/aside.vue index 162e22f6..0297ec81 100644 --- a/ui/dasadmin/src/layouts/backend/components/aside.vue +++ b/ui/dasadmin/src/layouts/backend/components/aside.vue @@ -1,8 +1,19 @@ @@ -22,6 +33,14 @@ const config = useConfig() const navTabs = useNavTabs() const menuWidth = computed(() => config.menuWidth()) + +const onMenuCollapse = () => { + if (config.layout.menuCollapse) { + config.setLayout('menuCollapse', false) + } else { + config.setLayout('menuCollapse', true) + } +} diff --git a/ui/dasadmin/src/layouts/backend/components/menus/menuVertical.vue b/ui/dasadmin/src/layouts/backend/components/menus/menuVertical.vue index a9ca45a6..978e835b 100644 --- a/ui/dasadmin/src/layouts/backend/components/menus/menuVertical.vue +++ b/ui/dasadmin/src/layouts/backend/components/menus/menuVertical.vue @@ -29,6 +29,10 @@ const state = reactive({ defaultActive: '', }) +const width = computed(() => { + return config.layout.menuCollapse ? '5px' : '20px' +}) + const verticalMenusScrollbarHeight = computed(() => { let menuTopBarHeight = 0 if (config.layout.menuShowTopBar) { @@ -70,7 +74,8 @@ onBeforeRouteUpdate((to) => { } .layouts-menu-vertical { border: 0; - padding: 10px 20px 30px 20px; + width: 100%; + padding: 10px v-bind(width) 30px v-bind(width); --el-menu-bg-color: transparent; --el-menu-active-color: #ffffff; li, diff --git a/ui/dasadmin/src/layouts/backend/index.vue b/ui/dasadmin/src/layouts/backend/index.vue index 42132a9d..b476a965 100644 --- a/ui/dasadmin/src/layouts/backend/index.vue +++ b/ui/dasadmin/src/layouts/backend/index.vue @@ -350,7 +350,7 @@ const menu = [ ], }, ] -debugger + function transformNode(menu: any) { menu = menu.map((node: any) => { return { diff --git a/ui/dasadmin/src/stores/config.ts b/ui/dasadmin/src/stores/config.ts index 27ece963..8f137b64 100644 --- a/ui/dasadmin/src/stores/config.ts +++ b/ui/dasadmin/src/stores/config.ts @@ -10,7 +10,7 @@ export const useConfig = defineStore( /* 全局 */ showDrawer: false, // 是否收缩布局(小屏设备) - shrink: false, + shrink: true, // 后台布局方式,可选值 layoutMode: 'Classic', // 后台主页面切换动画,可选值 @@ -70,7 +70,7 @@ export const useConfig = defineStore( return layout.menuCollapse ? '0px' : layout.menuWidth + 'px' } // 菜单是否折叠 - return layout.menuCollapse ? '64px' : layout.menuWidth + 'px' + return layout.menuCollapse ? '74px' : layout.menuWidth + 'px' } function setLang(val: string) { diff --git a/ui/dasadmin/src/views/backend/report/MulipleReport.vue b/ui/dasadmin/src/views/backend/report/MulipleReport.vue index 7b70b2eb..30efce76 100644 --- a/ui/dasadmin/src/views/backend/report/MulipleReport.vue +++ b/ui/dasadmin/src/views/backend/report/MulipleReport.vue @@ -218,12 +218,12 @@ const queryWindBlower = () => { } }) windBlowerValue.value = windBlowerList.value.map((item) => item.irn) - reportTableData.value = windBlowerList.value.map((val) => { - return { - deviceId: val.irn, - id: shortUuid(), - } - }) + // reportTableData.value = windBlowerList.value.map((val) => { + // return { + // deviceId: val.irn, + // id: shortUuid(), + // } + // }) } }) } @@ -236,7 +236,7 @@ const selectWindBlower = (val: any) => { } }) windBlowerValue.value = rankWindBlowerValue - reportTableData.value = reportTableData.value.filter((item: any) => windBlowerValue.value.includes(item.deviceId)) + // reportTableData.value = reportTableData.value.filter((item: any) => windBlowerValue.value.includes(item.deviceId)) } else { reportTableData.value = [] } @@ -394,6 +394,7 @@ const queryHistoryData = () => { reportTableData.value = lastResults.flat() if (!reportTableData.value.length) { ElMessage.warning('查询数据为空!') + reportTableData.value = [] } } else { ElMessage.warning('查询数据为空!') @@ -434,7 +435,7 @@ const generateMissingData = (data: any, deviceIds: any) => { if (!deviceData.length) { const generatedData = firstNonEmptyArray.map((item: any) => { const generatedItem = { - id: item.id + 1, + id: shortUuid(), time: item.time, deviceId: deviceId, } as any diff --git a/ui/dasadmin/src/views/backend/report/RunningReport.vue b/ui/dasadmin/src/views/backend/report/RunningReport.vue new file mode 100644 index 00000000..9d7c9f7c --- /dev/null +++ b/ui/dasadmin/src/views/backend/report/RunningReport.vue @@ -0,0 +1,308 @@ + + + + + diff --git a/ui/dasadmin/src/views/backend/report/SingleReport.vue b/ui/dasadmin/src/views/backend/report/SingleReport.vue index 7c8d5340..8fc4eab7 100644 --- a/ui/dasadmin/src/views/backend/report/SingleReport.vue +++ b/ui/dasadmin/src/views/backend/report/SingleReport.vue @@ -312,7 +312,7 @@ const reportTableColumn = ref([ }, ]) -const reportTableData = ref([]) +const reportTableData = ref([]) as any const idCounter = ref(0) const queryHistoryData = () => { if (!windBlowerValue.value) return ElMessage.warning('请选择风机!') @@ -359,10 +359,15 @@ const queryHistoryData = () => { }) }) } - reportTableData.value = Array.from(processedData.values()) as any + reportTableData.value = Array.from(processedData.values()) + if (!reportTableData.value.length) { + ElMessage.warning('查询数据为空!') + reportTableData.value = [] + } reportLoading.value = false } else { ElMessage.warning('查询数据为空!') + reportTableData.value = [] reportLoading.value = false } } else { diff --git a/ui/dasadmin/src/views/backend/report/index.vue b/ui/dasadmin/src/views/backend/report/index.vue index 3b65f53d..d6984ad7 100644 --- a/ui/dasadmin/src/views/backend/report/index.vue +++ b/ui/dasadmin/src/views/backend/report/index.vue @@ -2,7 +2,9 @@
- 运行报表 + + + @@ -18,12 +20,13 @@ import { ref } from 'vue' import SingleReport from './SingleReport.vue' import MulipleReport from './MulipleReport.vue' +import RunningReport from './RunningReport.vue' import { useI18n } from 'vue-i18n' const { t } = useI18n() import { useAdminInfo } from '/@/stores/adminInfo' const adminInfo = useAdminInfo() -const activeIndex = ref('2') +const activeIndex = ref('1') const handleClick = (val: any) => { activeIndex.value = val.props.name } @@ -45,12 +48,7 @@ const handleClick = (val: any) => { height: calc(100% - 80px); } } - .runningReport { - .header { - width: 100%; - height: 60px; - } - } + .runningReport, .singleReport, .mltipleReport { width: 100%; diff --git a/ui/dasadmin/src/views/backend/report/measureList.vue b/ui/dasadmin/src/views/backend/report/measureList.vue index 0e54a981..f1f8c95a 100644 --- a/ui/dasadmin/src/views/backend/report/measureList.vue +++ b/ui/dasadmin/src/views/backend/report/measureList.vue @@ -43,8 +43,6 @@ import { reactive, ref, watch, defineEmits, onMounted, nextTick } from 'vue' import { ElMessage } from 'element-plus' import type { ModelAttributeFieldsEnums, GetModelAttributeType } from '/@/views/backend/auth/model/type' import { getModelAttributeListReq, getRealValueListReq } from '/@/api/backend/deviceModel/request' -import { queryWindTurbinesPages, historyReq } from '/@/api/backend/statAnalysis/request' -import { WindBlowerList, RequestData, Devices } from './type' import { useI18n } from 'vue-i18n' const { t } = useI18n() const props = defineProps({ @@ -95,12 +93,6 @@ const tableColumn = [ const tableData = ref([]) const emit = defineEmits(['handleSelections']) const selectedRows = ref([] as any) -// const handleSelectionChange = (selection) => { -// selectedRows.value = selection -// emit('handleSelections', selectedRows.value) -// } -const windBlowerValue = ref('') -const windBlowerList = ref([]) const selectWindBlower = (val: any) => { getCompleteData() } @@ -246,37 +238,12 @@ const pageSetting = reactive({ const getcurrentPage = () => { getCompleteData() } -const queryWindBlower = () => { - return new Promise((resolve) => { - queryWindTurbinesPages().then((res) => { - if (res.code == 200) { - windBlowerList.value = res.data.map((item: WindBlowerList) => { - return { - irn: item.irn, - name: item.name ?? '-', - modelId: item.modelId, - } - }) - if (windBlowerList.value.length) { - windBlowerValue.value = windBlowerList.value[0].irn - } - resolve(windBlowerList.value) - } - }) - }) -} watch( () => props.show, (newVal) => { if (newVal) { - if (props.isMultiple) { - queryWindBlower().then((res) => { - getCompleteData() - }) - } else { - getCompleteData() - } + getCompleteData() } }, { @@ -305,9 +272,7 @@ watch( } ) -onMounted(() => { - // queryWindBlower() -}) +onMounted(() => {}) diff --git a/ui/dasadmin/src/views/backend/statAnalysis/trendAnalysis.vue b/ui/dasadmin/src/views/backend/statAnalysis/trendAnalysis.vue index 61325ce2..c184e021 100644 --- a/ui/dasadmin/src/views/backend/statAnalysis/trendAnalysis.vue +++ b/ui/dasadmin/src/views/backend/statAnalysis/trendAnalysis.vue @@ -24,12 +24,7 @@
{{ t('statAnalysis.interval') }} - +
@@ -83,7 +78,7 @@
-
+