5-13会议BUG提交
This commit is contained in:
commit
ef033aa4bb
@ -17,9 +17,9 @@ package com.yfd.platform.component.iec104.client;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.yfd.platform.component.iec104.config.Iec104Config;
|
||||
import com.yfd.platform.component.utils.OptimizedThreadPool;
|
||||
import com.yfd.platform.component.iec104.server.Iec104Master;
|
||||
import com.yfd.platform.component.iec104.server.Iec104MasterFactory;
|
||||
import com.yfd.platform.component.utils.OptimizedThreadPool;
|
||||
import com.yfd.platform.modules.auxcontrol.domain.GatewayDevice;
|
||||
import com.yfd.platform.modules.auxcontrol.mapper.GatewayDeviceMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@ -61,30 +61,30 @@ public class IEC104ClientRunner implements ApplicationRunner {
|
||||
GatewayDevice::getIpAddr, GatewayDevice::getIecAddr);
|
||||
queryWrapper.orderByAsc(GatewayDevice::getDeviceCode);
|
||||
List<GatewayDevice> list = gatewayDeviceMapper.selectList(queryWrapper);
|
||||
if (list.size() > 0) {
|
||||
for (GatewayDevice gatewayDevice : list) {
|
||||
Iec104Config iec104Config = new Iec104Config();
|
||||
iec104Config.setFrameAmountMax((short) 10);
|
||||
short terminnalAddress = gatewayDevice.getIecAddr().shortValue();
|
||||
//通讯网关机地址
|
||||
iec104Config.setTerminnalAddress(terminnalAddress);
|
||||
iec104Config.setSlaveCode(gatewayDevice.getDeviceCode());
|
||||
iec104Config.setSlaveIP(gatewayDevice.getIpAddr());
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
Iec104Master iec104server = Iec104MasterFactory.createTcpClientMaster(iec104Config.getSlaveIP(),
|
||||
2404);
|
||||
try {
|
||||
iec104server.setDataHandler(new MasterSysDataHandler()).setConfig(iec104Config).run();
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error(String.format("%s-对应的终端连接失败!", iec104Config.getSlaveIP()));
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
}
|
||||
|
||||
}
|
||||
// if (list.size() > 0) {
|
||||
// for (GatewayDevice gatewayDevice : list) {
|
||||
// Iec104Config iec104Config = new Iec104Config();
|
||||
// iec104Config.setFrameAmountMax((short) 10);
|
||||
// short terminnalAddress = gatewayDevice.getIecAddr().shortValue();
|
||||
// //通讯网关机地址
|
||||
// iec104Config.setTerminnalAddress(terminnalAddress);
|
||||
// iec104Config.setSlaveCode(gatewayDevice.getDeviceCode());
|
||||
// iec104Config.setSlaveIP(gatewayDevice.getIpAddr());
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// Iec104Master iec104server = Iec104MasterFactory.createTcpClientMaster(iec104Config.getSlaveIP(),
|
||||
// 2404);
|
||||
// try {
|
||||
// iec104server.setDataHandler(new MasterSysDataHandler()).setConfig(iec104Config).run();
|
||||
//
|
||||
// } catch (Exception e) {
|
||||
// log.error(String.format("%s-对应的终端连接失败!", iec104Config.getSlaveIP()));
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -60,26 +60,26 @@ public class ControlManageUtil {
|
||||
* 启动S发送S确认帧 的任务
|
||||
*/
|
||||
public void startSendFrameTask() {
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
while (true) {
|
||||
try {
|
||||
synchronized (sendSframeLock) {
|
||||
if (frameAmount >= frameAmountMax) {
|
||||
// 查过最大帧 的数量就要发送一个确认帧出去
|
||||
byte[] control = Iec104Util.getScontrol(accept);
|
||||
MessageDetail ruleDetail104 = new MessageDetail(control);
|
||||
ctx.channel().writeAndFlush(Encoder104.encoder(ruleDetail104));
|
||||
frameAmount = 0;
|
||||
}
|
||||
sendSframeLock.wait();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("Exception caught", e);
|
||||
}
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// while (true) {
|
||||
// try {
|
||||
// synchronized (sendSframeLock) {
|
||||
// if (frameAmount >= frameAmountMax) {
|
||||
// // 查过最大帧 的数量就要发送一个确认帧出去
|
||||
// byte[] control = Iec104Util.getScontrol(accept);
|
||||
// MessageDetail ruleDetail104 = new MessageDetail(control);
|
||||
// ctx.channel().writeAndFlush(Encoder104.encoder(ruleDetail104));
|
||||
// frameAmount = 0;
|
||||
// }
|
||||
// sendSframeLock.wait();
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// LOGGER.error("Exception caught", e);
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
|
||||
}
|
||||
|
||||
|
@ -72,22 +72,22 @@ public class ScheduledTaskPool {
|
||||
* @Description: 发送测试帧
|
||||
*/
|
||||
private void sendTestFrame() {
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
try {
|
||||
BootNettyClientChannel channel = BootNettyClientChannelCache.get(ctx.channel().id().asShortText());
|
||||
if(ObjUtil.isNotEmpty(channel )){
|
||||
String slaveIp = channel .getCode();
|
||||
LOGGER.info(String.format("向从站[%s]发送测试链路指令!",slaveIp ));
|
||||
ctx.channel().writeAndFlush(BasicInstruction104.TESTFR);
|
||||
//对时指令
|
||||
ctx.channel().writeAndFlush(BasicInstruction104.getTimeScale104());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("Exception caught", e);
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// try {
|
||||
// BootNettyClientChannel channel = BootNettyClientChannelCache.get(ctx.channel().id().asShortText());
|
||||
// if(ObjUtil.isNotEmpty(channel )){
|
||||
// String slaveIp = channel .getCode();
|
||||
// LOGGER.info(String.format("向从站[%s]发送测试链路指令!",slaveIp ));
|
||||
// ctx.channel().writeAndFlush(BasicInstruction104.TESTFR);
|
||||
// //对时指令
|
||||
// ctx.channel().writeAndFlush(BasicInstruction104.getTimeScale104());
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// LOGGER.error("Exception caught", e);
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
}
|
||||
|
||||
|
||||
@ -101,21 +101,21 @@ public class ScheduledTaskPool {
|
||||
}
|
||||
|
||||
private void sendGeneralCall() {
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
try {
|
||||
BootNettyClientChannel channel = BootNettyClientChannelCache.get(ctx.channel().id().asShortText());
|
||||
if (ObjUtil.isNotEmpty(channel)) {
|
||||
String slaveIp = channel.getCode();
|
||||
MessageDetail messageDetail = BasicInstruction104.getGeneralCallRuleDetail104();
|
||||
LOGGER.info(String.format("向从站[%s]发送总召唤指令[%s]!", slaveIp, messageDetail.getHexString()));
|
||||
ctx.channel().writeAndFlush(messageDetail);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("Exception caught", e);
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// try {
|
||||
// BootNettyClientChannel channel = BootNettyClientChannelCache.get(ctx.channel().id().asShortText());
|
||||
// if (ObjUtil.isNotEmpty(channel)) {
|
||||
// String slaveIp = channel.getCode();
|
||||
// MessageDetail messageDetail = BasicInstruction104.getGeneralCallRuleDetail104();
|
||||
// LOGGER.info(String.format("向从站[%s]发送总召唤指令[%s]!", slaveIp, messageDetail.getHexString()));
|
||||
// ctx.channel().writeAndFlush(messageDetail);
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// LOGGER.error("Exception caught", e);
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
}
|
||||
|
||||
public void stopSendCommandTask() {
|
||||
|
@ -49,17 +49,17 @@ public class Iec104ClientHandler extends SimpleChannelInboundHandler<MessageDeta
|
||||
BootNettyClientChannelCache.remove(ctx.channel().id().asShortText());
|
||||
BootNettyClientChannelCache.save(ctx.channel().id().asShortText(),Channel);
|
||||
|
||||
if (dataHandler != null) {
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
try {
|
||||
dataHandler.handlerAdded(new ChannelHandlerImpl(ctx));
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("Exception caught", e);
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
}
|
||||
// if (dataHandler != null) {
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// try {
|
||||
// dataHandler.handlerAdded(new ChannelHandlerImpl(ctx));
|
||||
// } catch (Exception e) {
|
||||
// LOGGER.error("Exception caught", e);
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
// }
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -76,18 +76,18 @@ public class Iec104ClientHandler extends SimpleChannelInboundHandler<MessageDeta
|
||||
|
||||
@Override
|
||||
public void channelRead0(ChannelHandlerContext ctx, MessageDetail ruleDetail104) throws IOException {
|
||||
if (dataHandler != null) {
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
try {
|
||||
dataHandler.channelRead(new ChannelHandlerImpl(ctx), ruleDetail104);
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
LOGGER.error("Exception caught", e);
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
}
|
||||
// if (dataHandler != null) {
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// try {
|
||||
// dataHandler.channelRead(new ChannelHandlerImpl(ctx), ruleDetail104);
|
||||
// } catch (Exception e) {
|
||||
// // TODO Auto-generated catch block
|
||||
// LOGGER.error("Exception caught", e);
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
@ -40,17 +40,17 @@ public class Iec104TcpSlaveHandler extends SimpleChannelInboundHandler<MessageDe
|
||||
* 启动
|
||||
*/
|
||||
Iec104ThreadLocal.getControlPool().startSendFrameTask();
|
||||
if (dataHandler != null) {
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
try {
|
||||
dataHandler.handlerAdded(new ChannelHandlerImpl(ctx));
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("Exception caught", e);
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
}
|
||||
// if (dataHandler != null) {
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// try {
|
||||
// dataHandler.handlerAdded(new ChannelHandlerImpl(ctx));
|
||||
// } catch (Exception e) {
|
||||
// LOGGER.error("Exception caught", e);
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
@ -65,18 +65,18 @@ public class Iec104TcpSlaveHandler extends SimpleChannelInboundHandler<MessageDe
|
||||
*/
|
||||
@Override
|
||||
protected void channelRead0(ChannelHandlerContext ctx, MessageDetail ruleDetail104) throws Exception {
|
||||
if (dataHandler != null) {
|
||||
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> {
|
||||
try {
|
||||
dataHandler.channelRead(new ChannelHandlerImpl(ctx), ruleDetail104);
|
||||
} catch (Exception e) {
|
||||
LOGGER.error("Exception caught", e);
|
||||
}
|
||||
});
|
||||
threadPool.shutdown();
|
||||
}
|
||||
// if (dataHandler != null) {
|
||||
//
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> {
|
||||
// try {
|
||||
// dataHandler.channelRead(new ChannelHandlerImpl(ctx), ruleDetail104);
|
||||
// } catch (Exception e) {
|
||||
// LOGGER.error("Exception caught", e);
|
||||
// }
|
||||
// });
|
||||
// threadPool.shutdown();
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -45,10 +45,10 @@ public class IEC61850ClientRunner implements ApplicationRunner {
|
||||
queryWrapper.orderByAsc(GatewayDevice::getDeviceCode);
|
||||
List<GatewayDevice> list = gatewayDeviceMapper.selectList(queryWrapper);
|
||||
if (!list.isEmpty()) {
|
||||
for (GatewayDevice systemDevice : list) {
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(() -> iec61850Service.connect(systemDevice));
|
||||
}
|
||||
// for (GatewayDevice systemDevice : list) {
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(() -> iec61850Service.connect(systemDevice));
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,7 @@ import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@ -72,7 +73,7 @@ public class DeviceWorkDataController {
|
||||
// 构建xAxis和series数据
|
||||
List<String> xAxisData = new ArrayList<>();
|
||||
List<Double> seriesData = new ArrayList<>();
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH分mm秒");
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH时mm分");
|
||||
for (LocalDateTime slot : minuteSlots) {
|
||||
xAxisData.add(slot.format(formatter));
|
||||
BigDecimal value = minuteDataMap.getOrDefault(slot, BigDecimal.ZERO);
|
||||
@ -123,4 +124,5 @@ public class DeviceWorkDataController {
|
||||
return ResponseResult.success();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -129,7 +129,7 @@ public class DeviceSignal implements Serializable {
|
||||
/**
|
||||
* 信号当前状态
|
||||
*/
|
||||
private BigDecimal ycValue;
|
||||
private String ycValue;
|
||||
|
||||
/**
|
||||
* 备用1
|
||||
|
@ -57,7 +57,8 @@ public class DeviceSignalServiceImpl extends ServiceImpl<DeviceSignalMapper, Dev
|
||||
deviceSignal.setYxValue(Integer.parseInt(value));
|
||||
} else {
|
||||
// 遥测
|
||||
deviceSignal.setYcValue(Convert.toBigDecimal(value));
|
||||
deviceSignal.setYcValue(value);
|
||||
// deviceSignal.setYcValue(Convert.toBigDecimal(value));
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
// 处理转换异常,例如返回false或抛出更具体的异常
|
||||
|
@ -167,17 +167,17 @@ public class GatewayDeviceServiceImpl extends ServiceImpl<GatewayDeviceMapper, G
|
||||
log.error("Exception caught", e);
|
||||
}
|
||||
}
|
||||
Runnable runnable = () -> {
|
||||
Iec104Master iec104server = Iec104MasterFactory.createTcpClientMaster(iec104Config.getSlaveIP(), 2404);
|
||||
try {
|
||||
iec104server.setDataHandler(new MasterSysDataHandler()).setConfig(iec104Config).run();
|
||||
} catch (Exception e) {
|
||||
EventLoopGroupManager.shutdownEventLoopGroup(ip);
|
||||
log.error(String.format("%s-对应的终端连接失败!", iec104Config.getSlaveIP()));
|
||||
}
|
||||
};
|
||||
OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
threadPool.execute(runnable);
|
||||
// Runnable runnable = () -> {
|
||||
// Iec104Master iec104server = Iec104MasterFactory.createTcpClientMaster(iec104Config.getSlaveIP(), 2404);
|
||||
// try {
|
||||
// iec104server.setDataHandler(new MasterSysDataHandler()).setConfig(iec104Config).run();
|
||||
// } catch (Exception e) {
|
||||
// EventLoopGroupManager.shutdownEventLoopGroup(ip);
|
||||
// log.error(String.format("%s-对应的终端连接失败!", iec104Config.getSlaveIP()));
|
||||
// }
|
||||
// };
|
||||
// OptimizedThreadPool threadPool = OptimizedThreadPool.getInstance();
|
||||
// threadPool.execute(runnable);
|
||||
|
||||
}
|
||||
return true;
|
||||
|
@ -0,0 +1,43 @@
|
||||
package com.yfd.platform.modules.basedata.controller;
|
||||
|
||||
import com.yfd.platform.annotation.Log;
|
||||
import com.yfd.platform.config.ResponseResult;
|
||||
import com.yfd.platform.modules.basedata.domain.FaultDevice;
|
||||
import com.yfd.platform.modules.basedata.service.IFaultDeviceService;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
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;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author zhengsl
|
||||
* @since 2025-05-12
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/basedata/fault-device")
|
||||
public class FaultDeviceController {
|
||||
|
||||
@Resource
|
||||
private IFaultDeviceService faultDeviceService;
|
||||
|
||||
@Log(module = "故障检测", value = "新增故障信息", type = "1")
|
||||
@PostMapping("/batchAddFaultDevice")
|
||||
@ApiOperation("新增故障信息")
|
||||
public ResponseResult batchAddFaultDevice(@RequestBody List<FaultDevice> faultDevices) {
|
||||
|
||||
boolean isOk = faultDeviceService.batchAddFaultDevice(faultDevices);
|
||||
if (isOk) {
|
||||
return ResponseResult.success();
|
||||
}
|
||||
return ResponseResult.error();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
package com.yfd.platform.modules.basedata.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import java.time.LocalDateTime;
|
||||
import java.io.Serializable;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
*
|
||||
* </p>
|
||||
*
|
||||
* @author zhengsl
|
||||
* @since 2025-05-12
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@TableName("iis_fault_device")
|
||||
public class FaultDevice implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* ID
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 故障编号
|
||||
*/
|
||||
private String dictionaryCode;
|
||||
|
||||
/**
|
||||
* 故障名称
|
||||
*/
|
||||
private String dictionaryName;
|
||||
|
||||
/**
|
||||
* 参数编号(和算法约定好的固定值)
|
||||
*/
|
||||
private String paramCode;
|
||||
|
||||
/**
|
||||
* 参数名称(用来描述参数含义)
|
||||
*/
|
||||
private String paramName;
|
||||
|
||||
/**
|
||||
* 设备点位名称
|
||||
*/
|
||||
private String deviceName;
|
||||
|
||||
/**
|
||||
* 设备点位id
|
||||
*/
|
||||
private String deviceId;
|
||||
|
||||
/**
|
||||
* 来源类型(1:巡视点位;2:辅控信号)
|
||||
*/
|
||||
private String sourceType;
|
||||
|
||||
/**
|
||||
* 数据状态
|
||||
*/
|
||||
private String datastatus;
|
||||
|
||||
/**
|
||||
* 修改人
|
||||
*/
|
||||
private String lastmodifier;
|
||||
|
||||
/**
|
||||
* 最近修改时间
|
||||
*/
|
||||
private LocalDateTime lastmodifydate;
|
||||
|
||||
/**
|
||||
* 备用1
|
||||
*/
|
||||
private String custom1;
|
||||
|
||||
/**
|
||||
* 备用2
|
||||
*/
|
||||
private String custom2;
|
||||
|
||||
/**
|
||||
* 备用3
|
||||
*/
|
||||
private String custom3;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.yfd.platform.modules.basedata.mapper;
|
||||
|
||||
import com.yfd.platform.modules.basedata.domain.FaultDevice;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author zhengsl
|
||||
* @since 2025-05-12
|
||||
*/
|
||||
public interface FaultDeviceMapper extends BaseMapper<FaultDevice> {
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.yfd.platform.modules.basedata.service;
|
||||
|
||||
import com.yfd.platform.modules.basedata.domain.FaultDevice;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author zhengsl
|
||||
* @since 2025-05-12
|
||||
*/
|
||||
public interface IFaultDeviceService extends IService<FaultDevice> {
|
||||
|
||||
boolean batchAddFaultDevice(List<FaultDevice> faultDevices);
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.yfd.platform.modules.basedata.service.impl;
|
||||
|
||||
import com.yfd.platform.modules.basedata.domain.FaultDevice;
|
||||
import com.yfd.platform.modules.basedata.mapper.FaultDeviceMapper;
|
||||
import com.yfd.platform.modules.basedata.service.IFaultDeviceService;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author zhengsl
|
||||
* @since 2025-05-12
|
||||
*/
|
||||
@Service
|
||||
public class FaultDeviceServiceImpl extends ServiceImpl<FaultDeviceMapper, FaultDevice> implements IFaultDeviceService {
|
||||
|
||||
@Override
|
||||
public boolean batchAddFaultDevice(List<FaultDevice> faultDevices) {
|
||||
return this.saveBatch(faultDevices);
|
||||
}
|
||||
}
|
@ -2,18 +2,19 @@ package com.yfd.platform.modules.patroltask.controller;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.beanit.iec61850bean.BdaBoolean;
|
||||
import com.beanit.iec61850bean.BdaTimestamp;
|
||||
import com.yfd.platform.component.WebSocketServer;
|
||||
import com.yfd.platform.config.ResponseResult;
|
||||
import com.yfd.platform.modules.auxcontrol.mapper.DeviceSignalMapper;
|
||||
import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService;
|
||||
import com.yfd.platform.modules.basedata.domain.DeviceChannel;
|
||||
import com.yfd.platform.modules.basedata.domain.SubstationDevice;
|
||||
import com.yfd.platform.modules.basedata.service.IDeviceChannelService;
|
||||
import com.yfd.platform.modules.basedata.service.ISubstationDeviceService;
|
||||
import com.yfd.platform.modules.patroltask.domain.AlarmLog;
|
||||
@ -57,6 +58,8 @@ public class AlarmLogController {
|
||||
|
||||
@Resource
|
||||
private IDeviceWorkDataService deviceWorkDataService;
|
||||
@Resource
|
||||
private DeviceSignalMapper deviceSignalMapper;
|
||||
|
||||
@GetMapping("/getAlarmLogList")
|
||||
@ApiOperation("查询报警信息")
|
||||
@ -291,14 +294,36 @@ public class AlarmLogController {
|
||||
|
||||
@GetMapping("/createAlarmData")
|
||||
@ApiOperation("生成报警")
|
||||
public ResponseResult createAlarmData(String from,String type,String slaveIp,String address,String value) {
|
||||
deviceWorkDataService.insertData(from, type, slaveIp, address, value);
|
||||
alarmLogService.doAlaramRecord(from, type, slaveIp, address, value);
|
||||
// alarmLogService.doAlaramRecord("IEC61850", "yx", "192.168.1.1", "10", "2");
|
||||
public ResponseResult createAlarmData(String from, String type, String slaveIp, String address, String value) {
|
||||
|
||||
deviceWorkDataService.insertData(from, slaveIp, address, value, getCurrentTime());
|
||||
alarmLogService.doAlaramRecord(from, type, slaveIp, address, value);
|
||||
// alarmLogService.doAlaramRecord("IEC61850", "yx", "192.168.1.1", "10", "2");
|
||||
return ResponseResult.success();
|
||||
}
|
||||
public static String getCurrentTime() {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
||||
return sdf.format(new Date());
|
||||
}
|
||||
@PostMapping("/sendAnalogData")
|
||||
@ApiOperation("批量发送数据")
|
||||
public ResponseResult sendAnalogData(String from, String type, String slaveIp, String address, String value) {
|
||||
if ("yc".equals(type)) {
|
||||
//更新信号数据值
|
||||
deviceSignalMapper.updateDeviceSignalValue_yc(address, value, getCurrentTime());
|
||||
//插入历史数据
|
||||
deviceWorkDataService.insertData("IEC61850", null, address, value, getCurrentTime());
|
||||
//执行报警处理
|
||||
alarmLogService.doAlaramRecord("IEC61850", "yc", null, address, value);
|
||||
|
||||
}
|
||||
if ("yx".equals(type)) {
|
||||
//更新信号状态
|
||||
deviceSignalMapper.updateDeviceSignalValue_yx(address, value, getCurrentTime());
|
||||
//执行报警处理:生成设备自身报警记录(status=1)
|
||||
alarmLogService.doAlaramRecord("IEC61850", "yx", null, address, value);
|
||||
}
|
||||
return ResponseResult.success();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -207,4 +207,6 @@ public interface TaskResultMapper extends BaseMapper<TaskResult> {
|
||||
|
||||
Page<Map<String, Object>> getResultByPatroldevice(Page<Map<String, Object>> page, String internationalId,String mainDeviceId, String taskName, String recognitionType, String valid,String isReport,String startDate,String endDate);
|
||||
List<TaskResult> getNonCoherentResult(String areaId,String bayId,String mainDeviceId,String componentId,String recognitionTypeList,String meterType,String resultId,String taskTodoId,String phase);
|
||||
|
||||
Page<Map<String, Object>> getHistoryDevice(Page<Map<String, Object>> page, String startDate, String endDate, String deviceId);
|
||||
}
|
||||
|
@ -1983,29 +1983,30 @@ public class TaskTodoServiceImpl extends ServiceImpl<TaskTodoMapper, TaskTodo> i
|
||||
@Override
|
||||
public Page<Map<String, Object>> getHistoryDevice(Page<Map<String, Object>> page, String startDate,
|
||||
String endDate, String deviceId) {
|
||||
LambdaQueryWrapper<TaskResult> queryWrapper = new LambdaQueryWrapper<>();
|
||||
String startFormat = "";
|
||||
queryWrapper.ne(TaskResult::getFlag, "0");
|
||||
if (StrUtil.isNotBlank(startDate)) {
|
||||
Date parseStart = DateUtil.parse(startDate);
|
||||
//一天的开始
|
||||
Date beginOfDay = DateUtil.beginOfDay(parseStart);
|
||||
startFormat = DateUtil.format(beginOfDay, "yyyy-MM-dd HH:mm:ss");
|
||||
queryWrapper.ge(TaskResult::getPatroldeviceDate, startFormat);
|
||||
}
|
||||
String endFormat = "";
|
||||
if (StrUtil.isNotBlank(startDate)) {
|
||||
Date parseEnd = DateUtil.parse(endDate);
|
||||
//一天的结束
|
||||
Date endOfDay = DateUtil.endOfDay(parseEnd);
|
||||
endFormat = DateUtil.format(endOfDay, "yyyy-MM-dd HH:mm:ss");
|
||||
queryWrapper.le(TaskResult::getPatroldeviceDate, endFormat);
|
||||
}
|
||||
if (StrUtil.isNotBlank(deviceId)) {
|
||||
queryWrapper.eq(TaskResult::getDeviceId, deviceId);
|
||||
}
|
||||
queryWrapper.orderByAsc(TaskResult::getPatroldeviceDate);
|
||||
return taskResultMapper.selectMapsPage(page, queryWrapper);
|
||||
// LambdaQueryWrapper<TaskResult> queryWrapper = new LambdaQueryWrapper<>();
|
||||
// String startFormat = "";
|
||||
// queryWrapper.ne(TaskResult::getFlag, "0");
|
||||
// if (StrUtil.isNotBlank(startDate)) {
|
||||
// Date parseStart = DateUtil.parse(startDate);
|
||||
// //一天的开始
|
||||
// Date beginOfDay = DateUtil.beginOfDay(parseStart);
|
||||
// startFormat = DateUtil.format(beginOfDay, "yyyy-MM-dd HH:mm:ss");
|
||||
// queryWrapper.ge(TaskResult::getPatroldeviceDate, startFormat);
|
||||
// }
|
||||
// String endFormat = "";
|
||||
// if (StrUtil.isNotBlank(startDate)) {
|
||||
// Date parseEnd = DateUtil.parse(endDate);
|
||||
// //一天的结束
|
||||
// Date endOfDay = DateUtil.endOfDay(parseEnd);
|
||||
// endFormat = DateUtil.format(endOfDay, "yyyy-MM-dd HH:mm:ss");
|
||||
// queryWrapper.le(TaskResult::getPatroldeviceDate, endFormat);
|
||||
// }
|
||||
// if (StrUtil.isNotBlank(deviceId)) {
|
||||
// queryWrapper.eq(TaskResult::getDeviceId, deviceId);
|
||||
// }
|
||||
// queryWrapper.orderByAsc(TaskResult::getPatroldeviceDate);
|
||||
// return taskResultMapper.selectMapsPage(page, queryWrapper);
|
||||
return taskResultMapper.getHistoryDevice(page, startDate, endDate, deviceId);
|
||||
}
|
||||
|
||||
/**********************************
|
||||
|
@ -138,7 +138,7 @@ httpserver: #配置http请求访问的地址
|
||||
app:
|
||||
patrolserver: #巡视主机服务器
|
||||
ip: 192.168.1.20
|
||||
httpport: 8070
|
||||
httpport: 8090
|
||||
tcpport: 10014
|
||||
udpport: 8090
|
||||
appname:
|
||||
|
@ -51,10 +51,10 @@
|
||||
c.ip_addr = #{slaveIp}
|
||||
</if>
|
||||
<if test="type=='yx'">
|
||||
and b.yx_addr = #{address}
|
||||
and b.yx_addr = #{type}
|
||||
</if>
|
||||
<if test="type=='yc'">
|
||||
and b.yc_addr = #{address}
|
||||
and b.yc_addr = #{type}
|
||||
</if>
|
||||
limit 1
|
||||
</select>
|
||||
|
@ -6,6 +6,7 @@
|
||||
SELECT
|
||||
station_id,
|
||||
device_id,
|
||||
systemcode,
|
||||
device_name,
|
||||
signal_id,
|
||||
signal_name,
|
||||
@ -15,7 +16,10 @@
|
||||
FROM
|
||||
fk_device_work_data
|
||||
WHERE 1=1
|
||||
AND signal_id=#{signalId}
|
||||
<if test="signalId != null and signalId != ''">
|
||||
AND signal_id=#{signalId}
|
||||
</if>
|
||||
|
||||
<if test="startDate != null and startDate != ''">
|
||||
AND start_time >= #{startDate}
|
||||
</if>
|
||||
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.yfd.platform.modules.basedata.mapper.FaultDeviceMapper">
|
||||
|
||||
</mapper>
|
@ -881,4 +881,34 @@ ORDER BY
|
||||
<select id="getValueByDeviceId" resultType="java.util.Map">
|
||||
SELECT * FROM iis_recognition WHERE device_id=#{deviceId}
|
||||
</select>
|
||||
<select id="getHistoryDevice" resultType="java.util.Map">
|
||||
SELECT
|
||||
t.*,
|
||||
CASE
|
||||
|
||||
WHEN t.flag = '4' THEN
|
||||
'识别失败'
|
||||
WHEN t.flag = '6' THEN
|
||||
'采集失败'
|
||||
WHEN t.valid1 = '2' THEN
|
||||
'异常' -- 或者你可以设置一个默认值
|
||||
WHEN t.valid1 = '1' THEN
|
||||
'正常' -- 或者你可以设置一个默认值
|
||||
ELSE NULL
|
||||
END AS analysisResult
|
||||
FROM
|
||||
( SELECT *, CASE WHEN revise_valid = '0' THEN '1' WHEN revise_valid = '1' THEN '2' ELSE valid END AS valid1 FROM iis_task_result ) t
|
||||
WHERE
|
||||
t.datastatus = '1'
|
||||
AND t.flag != '0'
|
||||
<if test="deviceId != null and deviceId != ''">
|
||||
AND t.device_id = #{deviceId}
|
||||
</if>
|
||||
<if test="startDate != null and startDate != ''">
|
||||
AND t.patroldevice_date >= #{startDate}
|
||||
</if>
|
||||
<if test="endDate != null and endDate != ''">
|
||||
AND t.patroldevice_date <= #{endDate}
|
||||
</if>
|
||||
</select>
|
||||
</mapper>
|
||||
|
@ -3,7 +3,7 @@
|
||||
# 变量必须以 VITE_ 为前缀才能暴露给外部读取
|
||||
NODE_ENV='development'
|
||||
|
||||
VITE_APP_TITLE = '变电站远程智能巡视系统'
|
||||
VITE_APP_TITLE = '配电网人工智能平台'
|
||||
VITE_APP_PORT = 3000
|
||||
VITE_APP_BASE_API = '/dev-api'
|
||||
VITE_APP_BASE_URL = 'http://192.168.1.20:18080'
|
||||
|
@ -1,7 +1,7 @@
|
||||
## 生产环境
|
||||
NODE_ENV='production'
|
||||
|
||||
VITE_APP_TITLE = '变电站远程智能巡视系统'
|
||||
VITE_APP_TITLE = '配电网人工智能平台'
|
||||
VITE_APP_PORT = 3000
|
||||
VITE_APP_BASE_API = '/prod-api'
|
||||
VITE_APP_BASE_URL = 'http://192.168.1.20:18080'
|
||||
|
@ -1,6 +1,6 @@
|
||||
## 模拟环境
|
||||
NODE_ENV='staging'
|
||||
|
||||
VITE_APP_TITLE = '变电站远程智能巡视系统'
|
||||
VITE_APP_TITLE = '配电网人工智能平台'
|
||||
VITE_APP_PORT = 3000
|
||||
VITE_APP_BASE_API = '/prod--api'
|
||||
|
@ -9,7 +9,7 @@
|
||||
<link rel="stylesheet" type="text/css" href="./static/css/iconfont.css">
|
||||
<script type="text/javascript" type="module" src="./static/js/jessibuca.js"></script>
|
||||
<script type="text/javascript" type="module" src="./webconfig.js"></script>
|
||||
<title>变电站远程智能巡视系统</title>
|
||||
<title>配电网人工智能平台</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
@ -140,16 +140,18 @@ export function getDictionaryItems(params: any) {
|
||||
export function getComponentByBayPage(params: any) {
|
||||
return request({
|
||||
url: '/basedata/substation-maindevice/getComponentByBayPage',
|
||||
method: 'get',
|
||||
params: params
|
||||
method: 'post',
|
||||
data: params
|
||||
|
||||
});
|
||||
}
|
||||
//根据条件获取主设备(分页)
|
||||
export function getMainDevicePage(params: any) {
|
||||
return request({
|
||||
url: '/basedata/substation-maindevice/getMainDevicePage',
|
||||
method: 'get',
|
||||
params: params
|
||||
method: 'post',
|
||||
data: params
|
||||
|
||||
});
|
||||
}
|
||||
// 保存模板图片
|
||||
|
@ -29,7 +29,7 @@ export function getTaskToDo(params:any){
|
||||
//分页查询检修计划
|
||||
export function getTaskList(params:any){
|
||||
return request({
|
||||
url: '/patroltasks/examine-plan/getExaminePlanPage' ,
|
||||
url: '/patroltasks/examine-plan/getTaskList' ,
|
||||
method: 'get',
|
||||
params:params
|
||||
});
|
||||
|
@ -6,7 +6,7 @@ export default {
|
||||
},
|
||||
// 登录页面国际化
|
||||
login: {
|
||||
title: '变电站远程智能巡视系统',
|
||||
title: '配电网人工智能平台',
|
||||
username: '用户名',
|
||||
rulesUsername: '请输入用户名',
|
||||
password: '密码',
|
||||
|
@ -10,7 +10,7 @@ interface DefaultSettings {
|
||||
}
|
||||
|
||||
const defaultSettings: DefaultSettings = {
|
||||
title: '变电站远程智能巡视系统',
|
||||
title: '配电网人工智能平台',
|
||||
showSettings: false,
|
||||
tagsView: true,
|
||||
fixedHeader: true,
|
||||
|
@ -655,10 +655,7 @@ input {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.el-table .el-table__row.el-table__row--striped {
|
||||
background: #17212e !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
|
||||
.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell {
|
||||
background: transparent !important;
|
||||
|
@ -4981,7 +4981,7 @@ function getComponentPage() {
|
||||
bayId: pageInfo.value.bayId,
|
||||
componentName: componentName.value
|
||||
}
|
||||
getComponentByBayPage(params).then(res => {
|
||||
getComponentByBayPage(JSON.stringify(params)).then(res => {
|
||||
componentData.value = res.data.records
|
||||
pageInfo.value.size = res.data.size
|
||||
pageInfo.value.current = res.data.current
|
||||
@ -5012,7 +5012,7 @@ function getmainDevicePage() {
|
||||
getSubstationBayByArea({ stationCode: userStore.stationCode }).then((res) => {
|
||||
bayIdType.value = res.data
|
||||
})
|
||||
getMainDevicePage(params).then(res => {
|
||||
getMainDevicePage(JSON.stringify(params)).then(res => {
|
||||
mainDeviceData.value = res.data.records
|
||||
pageInfo.value.size = res.data.size
|
||||
pageInfo.value.current = res.data.current
|
||||
|
@ -36,6 +36,7 @@ import Measurement_2 from '@/components/Measurement_2/index.vue'
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
import { downloadFile } from '@/utils/index';
|
||||
import Eldialog from '@/components/seccmsdialog/eldialog.vue';
|
||||
import { getdata } from "@/api/voiceprint";
|
||||
const userStore = useUserStore();
|
||||
const url = userStore.webApiBaseUrl;
|
||||
//左侧树形控件
|
||||
@ -268,7 +269,7 @@ function delClick() {
|
||||
}
|
||||
//表格多选
|
||||
const deviceInfos: any = ref([])
|
||||
function handleSelectionChange(val: any) {
|
||||
function handleSelectionChange1(val: any) {
|
||||
deviceInfos.value = val
|
||||
}
|
||||
const tableRowClassName = ({
|
||||
@ -456,6 +457,7 @@ function addClick() {
|
||||
isAlarm: '0',
|
||||
deviceInfo: '',
|
||||
identifyMaterialId: '0',
|
||||
labelAttri: '0',
|
||||
lowerValue: '',
|
||||
upperValue: '',
|
||||
phase: '',
|
||||
@ -474,9 +476,10 @@ function addClick() {
|
||||
pictureAnalysisTypeList: '',
|
||||
PictureAnalysisType: '',
|
||||
PictureDefectAnalysisType: '',
|
||||
voiceAnalysisTypeList: [],
|
||||
PictureDiscriminateAnalysisType: '',
|
||||
outsideFeature: '',
|
||||
deviceClass: '',
|
||||
pointType: '',
|
||||
patroldeviceJson: {
|
||||
device_name: '',
|
||||
device_code: '',
|
||||
@ -496,10 +499,16 @@ function addClick() {
|
||||
alertvalue: '',
|
||||
}
|
||||
]
|
||||
vicode.value = [{
|
||||
patroldevice_name: '',
|
||||
patroldevice_code: '',
|
||||
}]
|
||||
duration.value = ''
|
||||
|
||||
imgUrl.value = ''
|
||||
deviceIdText.value = ''
|
||||
device.value = ''
|
||||
arrdata.value.length = 0
|
||||
title.value = "新增巡视点位";
|
||||
dialogVisible.value = true;
|
||||
beforehandPosition.value = 1
|
||||
@ -651,12 +660,13 @@ function mainChange(row: any) {
|
||||
const deviceIdText = ref()
|
||||
const miannDeviceId = ref()
|
||||
function handleEdit(row: any) {
|
||||
duration.value = row.duration
|
||||
threshold.value = ''
|
||||
beforName.value = ''
|
||||
tabs.value = 1
|
||||
miannDeviceId.value = row.mainDeviceId
|
||||
deviceIdText.value = row.deviceId
|
||||
|
||||
arrdata.value.length = 0
|
||||
device.value = ''
|
||||
title.value = "修改巡视点位";
|
||||
dialogVisible.value = true;
|
||||
@ -672,50 +682,70 @@ function handleEdit(row: any) {
|
||||
effective_region: ''
|
||||
}
|
||||
]
|
||||
if (row.patroldeviceJson) {
|
||||
if (typeof row.patroldeviceJson != 'object') {
|
||||
row.patroldeviceJson = JSON.parse(row.patroldeviceJson)
|
||||
}
|
||||
vicode.value = [{
|
||||
patroldevice_name: '',
|
||||
patroldevice_code: '',
|
||||
}]
|
||||
if (row.recognitionTypeList == "5") {
|
||||
if (row.patroldeviceJson) {
|
||||
if (typeof row.patroldeviceJson != 'object') {
|
||||
row.patroldeviceJson = JSON.parse(row.patroldeviceJson)
|
||||
|
||||
if (row.patroldeviceJson.length == 0) {
|
||||
index.value = [
|
||||
{
|
||||
}
|
||||
|
||||
if (row.patroldeviceJson[0].patroldevice_name && row.patroldeviceJson[0].patroldevice_code) {
|
||||
vicode.value = row.patroldeviceJson
|
||||
|
||||
|
||||
} else {
|
||||
vicode.value = [{
|
||||
patroldevice_name: '',
|
||||
patroldevice_code: '',
|
||||
patroldevice_channelcode: '',
|
||||
patroldevice_pos: '',
|
||||
pos_name: '',
|
||||
baseimage: '',
|
||||
alertvalue: '',
|
||||
effective_region: ''
|
||||
}
|
||||
]
|
||||
} else {
|
||||
index.value = row.patroldeviceJson
|
||||
|
||||
// channelId.value
|
||||
getCamera()
|
||||
}
|
||||
}]
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
if (row.patroldeviceJson) {
|
||||
if (typeof row.patroldeviceJson != 'object') {
|
||||
row.patroldeviceJson = JSON.parse(row.patroldeviceJson)
|
||||
}
|
||||
|
||||
if (row.patroldeviceJson.length == 0) {
|
||||
index.value = [
|
||||
{
|
||||
patroldevice_name: '',
|
||||
patroldevice_code: '',
|
||||
patroldevice_channelcode: '',
|
||||
patroldevice_pos: '',
|
||||
pos_name: '',
|
||||
baseimage: '',
|
||||
alertvalue: '',
|
||||
effective_region: ''
|
||||
}
|
||||
]
|
||||
} else {
|
||||
index.value = row.patroldeviceJson
|
||||
getCamera()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const infoall = JSON.parse(JSON.stringify(row))
|
||||
if (infoall.outsideAngle) {
|
||||
// debugger
|
||||
if (infoall.recognitionTypeList == "4") {
|
||||
droPoint.value = JSON.parse(infoall.outsideAngle)
|
||||
} else if (infoall.recognitionTypeList == "5") {
|
||||
infoall.decibel = JSON.parse(infoall.outsideAngle).decibel
|
||||
infoall.frequency = JSON.parse(infoall.outsideAngle).frequency
|
||||
} else {
|
||||
arrdata.value = JSON.parse(infoall.outsideAngle)
|
||||
}
|
||||
|
||||
}
|
||||
if (infoall.videoPos) {
|
||||
infoall.videoPos = JSON.parse(infoall.videoPos)
|
||||
infoall.device_code = infoall.videoPos.device_code
|
||||
infoall.device_pos = infoall.videoPos.device_pos
|
||||
infoall.robot_code = infoall.videoPos.robot_code
|
||||
infoall.robot_pos = infoall.videoPos.robot_pos
|
||||
infoall.uav_code = infoall.videoPos.uav_code
|
||||
}
|
||||
if (infoall.pictureAnalysisTypeList) {
|
||||
infoall.pictureAnalysisTypeList = JSON.parse(infoall.pictureAnalysisTypeList)
|
||||
infoall.PictureAnalysisType = infoall.pictureAnalysisTypeList.PictureAnalysisType
|
||||
@ -727,16 +757,20 @@ function handleEdit(row: any) {
|
||||
if (infoall.PictureDefectAnalysisType == undefined || infoall.PictureDefectAnalysisType[0] == '') {
|
||||
infoall.PictureDefectAnalysisType = []
|
||||
}
|
||||
if (infoall.voiceAnalysisTypeList) {
|
||||
infoall.voiceAnalysisTypeList = infoall.voiceAnalysisTypeList.split(",")
|
||||
}
|
||||
|
||||
info.value = infoall
|
||||
|
||||
// info.value.componentId = infoall.componentName
|
||||
|
||||
// beforehandPosition.value = info.value.device_pos
|
||||
notification()
|
||||
|
||||
}
|
||||
//新增弹窗-基本信息-确定
|
||||
function confirmClick(formEl: any) {
|
||||
if (info.value.PictureAnalysisType == undefined && info.value.PictureDefectAnalysisType.length == 0 && info.value.PictureDiscriminateAnalysisType == undefined) {
|
||||
ElMessage.error('请在状态分析类型, 缺陷分析类型,判别分析类型中最少选择一项')
|
||||
return
|
||||
}
|
||||
tabs.value = 1
|
||||
formEl.validate((valid: any) => {
|
||||
if (valid) {
|
||||
@ -749,13 +783,7 @@ function confirmClick(formEl: any) {
|
||||
newObjOne.appearanceType = newObjOne.appearanceType.toString()
|
||||
}
|
||||
|
||||
let newObjThree = {
|
||||
device_code: info.value.device_code,
|
||||
device_pos: info.value.device_pos,
|
||||
robot_code: info.value.robot_code,
|
||||
robot_pos: info.value.robot_pos,
|
||||
uav_code: info.value.uav_code,
|
||||
}
|
||||
|
||||
let newObjFour: any = {
|
||||
PictureAnalysisType: info.value.PictureAnalysisType,
|
||||
PictureDefectAnalysisType: info.value.PictureDefectAnalysisType.toString(),
|
||||
@ -770,23 +798,42 @@ function confirmClick(formEl: any) {
|
||||
newObjOne.PictureDefectAnalysisType = newObjOne.PictureDefectAnalysisType.toString()
|
||||
if (info.value.recognitionTypeList == "4") {
|
||||
newObjOne.outsideAngle = JSON.stringify(droPoint.value)
|
||||
} else if (info.value.recognitionTypeList == "5") {
|
||||
let pinyv = {
|
||||
decibel: info.value.decibel,//分贝
|
||||
frequency: info.value.frequency,//频率
|
||||
}
|
||||
newObjOne.outsideAngle = JSON.stringify(pinyv)
|
||||
} else {
|
||||
newObjOne.outsideAngle = JSON.stringify(arrdata.value)
|
||||
}
|
||||
if (newObjThree.device_code != undefined) {
|
||||
newObjOne.videoPos = JSON.stringify(newObjThree)
|
||||
} else {
|
||||
newObjOne.videoPos = null
|
||||
if (index.value.length > 0) {
|
||||
const videoposlist: any = []
|
||||
index.value.forEach((res: any) => {
|
||||
videoposlist.push({ device_code: res.patroldevice_code, device_pos: res.patroldevice_pos })
|
||||
})
|
||||
newObjOne.videoPos = JSON.stringify(videoposlist)
|
||||
}
|
||||
newObjOne.pictureAnalysisTypeList = JSON.stringify(tempObjFour)
|
||||
newObjOne.duration = duration.value
|
||||
if (newObjOne.voiceAnalysisTypeList) {
|
||||
newObjOne.voiceAnalysisTypeList = newObjOne.voiceAnalysisTypeList.toString()
|
||||
}
|
||||
|
||||
|
||||
newObjOne.pictureAnalysisTypeList = JSON.stringify(tempObjFour)
|
||||
if (index.value.length > 0) {
|
||||
if (info.value.recognitionTypeList == 5) {
|
||||
if (typeof index.value == 'object') {
|
||||
newObjOne.patroldeviceJson = JSON.stringify(index.value)
|
||||
newObjOne.patroldeviceJson = JSON.stringify(vicode.value)
|
||||
}
|
||||
} else {
|
||||
if (index.value.length > 0) {
|
||||
if (typeof index.value == 'object') {
|
||||
newObjOne.patroldeviceJson = JSON.stringify(index.value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (info.value.deviceId) {
|
||||
editPosition(newObjOne).then((res: any) => {
|
||||
if (res != undefined && res.code == 0) {
|
||||
@ -816,6 +863,7 @@ function confirmClick(formEl: any) {
|
||||
const allCamera = ref([])
|
||||
//获取摄像头数据
|
||||
const patroldeviceName = ref()
|
||||
const manufacturerList: any = ref([])
|
||||
//获取用户列表信息
|
||||
onMounted(() => {
|
||||
getSelect();
|
||||
@ -823,6 +871,11 @@ onMounted(() => {
|
||||
getDeviceByType({ dictcode: 'DeviceClass' }).then((res: any) => {
|
||||
DeviceClass.value = res.data
|
||||
})
|
||||
getDeviceByType({ dictcode: 'ManuFacturer' }).then((res: any) => {
|
||||
if (res.data != undefined) {
|
||||
manufacturerList.value = res.data
|
||||
}
|
||||
})
|
||||
});
|
||||
// function checkSelectable(row: any) {
|
||||
// return row.datastatus == 0
|
||||
@ -1092,7 +1145,7 @@ function getImgWidth() {
|
||||
var img = new Image()
|
||||
img.src = AngleUrl.value
|
||||
img.onload = function () {
|
||||
|
||||
|
||||
imgWidth.value = img.width
|
||||
imgHeight.value = img.height
|
||||
}
|
||||
@ -1124,7 +1177,7 @@ function getCamera() {
|
||||
onSubmit(res.data[num])
|
||||
devicecode.value = res.data[num].deviceId
|
||||
channelcode.value = res.data[num].channelId
|
||||
|
||||
|
||||
if (indexRow.value) {
|
||||
beforehandPosition.value = index.value[indexRow.value].patroldevice_pos
|
||||
} else {
|
||||
@ -1291,10 +1344,64 @@ const vMove = {
|
||||
}
|
||||
const activeName = ref('first')
|
||||
const handleClick1 = (tab: TabsPaneContext, event: Event) => {
|
||||
|
||||
console.log(tab.props.name, event);
|
||||
if(tab.props.name == 'three'){
|
||||
getData1()
|
||||
}
|
||||
}
|
||||
|
||||
const isGaoliang: any = ref("")
|
||||
// 声纹数据获取
|
||||
const duration: any = ref('')
|
||||
const paramstable1: any = ref({
|
||||
size: 10,
|
||||
current: 1,
|
||||
stationId: '',
|
||||
type: 14,
|
||||
patrolDeviceName: '',
|
||||
deviceModel: '',
|
||||
manufacturer: '',
|
||||
})
|
||||
const vicode = ref([{
|
||||
patroldevice_name: '',
|
||||
patroldevice_code: '',
|
||||
}])
|
||||
const total1 = ref()
|
||||
const tableData1: any = ref()
|
||||
function getData1() {
|
||||
loading.value = true
|
||||
paramstable1.value.stationId = value.value
|
||||
getdata(JSON.stringify(paramstable1.value)).then((res: any) => {
|
||||
loading.value = false
|
||||
tableData1.value = res.data.records
|
||||
total1.value = res.data.total
|
||||
paramstable1.value.size = res.data.size
|
||||
paramstable1.value.current = res.data.current
|
||||
loading.value = false
|
||||
tableData1.value.forEach((item: any) => {
|
||||
|
||||
if (item.patroldeviceCode == vicode.value[0].patroldevice_code) {
|
||||
setTimeout(() => {
|
||||
multipleTableRef.value!.toggleRowSelection(item, undefined)
|
||||
}, 1000); // 延迟1秒
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
})
|
||||
}
|
||||
const multipleTableRef = ref()
|
||||
function handleSelectionChange(val: any) {
|
||||
if (val.length > 1) {
|
||||
val.pop()
|
||||
multipleTableRef.value!.toggleRowSelection(val[0], undefined)
|
||||
}
|
||||
if (val[0]) {
|
||||
vicode.value[0].patroldevice_name = val[0].patroldeviceName
|
||||
vicode.value[0].patroldevice_code = val[0].patroldeviceCode
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@ -1316,8 +1423,8 @@ const isGaoliang: any = ref("")
|
||||
placeholder="请输入巡视点位名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="点位分类" style="width:50%" prop="deviceClass">
|
||||
<el-select v-model="info.deviceClass" placeholder="请选择" style="width: 90%;margin-left: 8px;"
|
||||
@visible-change="notification">
|
||||
<el-select v-model="info.deviceClass" placeholder="请选择"
|
||||
style="width: 90%;margin-left: 8px;" @visible-change="notification">
|
||||
<el-option v-for="item in DeviceClass" :key="item.id" :label="item.dictname"
|
||||
:value="item.itemcode" />
|
||||
</el-select>
|
||||
@ -1334,8 +1441,9 @@ const isGaoliang: any = ref("")
|
||||
placeholder="请输入主设备类型"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="所属部件" style="width:50%" prop="componentId">
|
||||
<el-select :disabled="info.mainDeviceId == ''" v-model="info.componentId" placeholder="请选择"
|
||||
style="width: 90%;margin-left: 8px;" @visible-change="notification">
|
||||
<el-select :disabled="info.mainDeviceId == ''" v-model="info.componentId"
|
||||
placeholder="请选择" style="width: 90%;margin-left: 8px;"
|
||||
@visible-change="notification">
|
||||
<el-option v-for="item in getacaType" :key="item.componentId"
|
||||
:label="item.componentName" :value="item.componentId" />
|
||||
</el-select>
|
||||
@ -1348,8 +1456,8 @@ const isGaoliang: any = ref("")
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="数据来源" style="width:50%">
|
||||
<el-select v-model="info.dataType" placeholder="请选择" style="width: 90%;margin-left: 8px;"
|
||||
clearable>
|
||||
<el-select v-model="info.dataType" placeholder="请选择"
|
||||
style="width: 90%;margin-left: 8px;" clearable>
|
||||
<el-option v-for="item in dataType" :key="item.id" :label="item.dictname"
|
||||
:value="item.itemcode" />
|
||||
</el-select>
|
||||
@ -1419,16 +1527,21 @@ const isGaoliang: any = ref("")
|
||||
<el-input v-model="info.upperValue" style="width: 90%;;margin-left: 8px;"
|
||||
placeholder="请输入正常范围上限"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="info.recognitionTypeList == 5" label="频域范围" prop="frequency"
|
||||
style="width:50%">
|
||||
<el-input v-model="info.frequency" style="width: 90%;margin-left: 8px;"
|
||||
placeholder="例如:20@20000"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="info.recognitionTypeList == 5" label="分贝区间" prop="decibel"
|
||||
style="width:50%">
|
||||
<el-input v-model="info.decibel" style="width: 90%;;margin-left: 8px;"
|
||||
placeholder="例如:40@70"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="计量单位" style="width:50%" prop="unit">
|
||||
<el-input v-model="info.unit" style="width: 90%;;margin-left: 8px;"
|
||||
placeholder=""></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="相位" style="width:50%;">
|
||||
<el-select v-model="info.phase" style="width:90%;margin-left: 7px" clearable>
|
||||
<el-option v-for="item in DevicePhase" :key="item.id" :label="item.dictname"
|
||||
:value="item.itemcode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="是否告警" style="width:50%">
|
||||
<el-radio-group v-model="info.isAlarm" style="margin-left: 10px;">
|
||||
<el-radio :label="'1'">是</el-radio>
|
||||
@ -1441,10 +1554,17 @@ const isGaoliang: any = ref("")
|
||||
<el-radio :label="'0'">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="人工关注" style="width:50%">
|
||||
<el-radio-group v-model="info.labelAttri" style="margin-left: 10px;">
|
||||
<el-radio :label="'1'">是</el-radio>
|
||||
<el-radio :label="'0'">否</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注信息" prop="deviceInfo"
|
||||
style="width:100%;margin-left: 8px;display:flex;align-items:flex-start !important;">
|
||||
<el-input type="textarea" v-model="info.deviceInfo" :autosize="{ minRows: 2, maxRows: 8 }"
|
||||
style="width: 96% ;" placeholder="请输入备注信息"></el-input>
|
||||
<el-input type="textarea" v-model="info.deviceInfo"
|
||||
:autosize="{ minRows: 2, maxRows: 8 }" style="width: 96% ;"
|
||||
placeholder="请输入备注信息"></el-input>
|
||||
</el-form-item>
|
||||
<div style="width:90%;display:flex;">
|
||||
|
||||
@ -1460,7 +1580,8 @@ const isGaoliang: any = ref("")
|
||||
<div class="details-button" @click="confirmClick(infoForm)">确定</div>
|
||||
</span>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="摄像机设置" name="second">
|
||||
|
||||
<el-tab-pane label="摄像机设置" name="second" v-if="info.recognitionTypeList != 5">
|
||||
<el-scrollbar height="645px">
|
||||
<div style="display: flex;align-items: center;margin-top: 20px;">
|
||||
<div style="width: 5px;height: 15px;background: #409eff;"></div>
|
||||
@ -1499,7 +1620,8 @@ const isGaoliang: any = ref("")
|
||||
</div>
|
||||
<div style="margin-top:10px;">
|
||||
|
||||
<el-table :data="arrdata" style="width: 100%;margin-top:10px;height: 418px; overflow: auto;"
|
||||
<el-table :data="arrdata"
|
||||
style="width: 100%;margin-top:10px;height: 418px; overflow: auto;"
|
||||
v-if="info.recognitionTypeList == 1"
|
||||
:header-cell-style="{ background: '#253b51', color: '#b5d7ff', height: '50px' }">
|
||||
<el-table-column prop="index" label="序号" width="100" align="center" />
|
||||
@ -1535,6 +1657,48 @@ const isGaoliang: any = ref("")
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="声纹设置" name="three" v-if="info.recognitionTypeList == 5">
|
||||
<div style="display:flex;align-items:center;"><span>录制时长:</span> <el-input v-model="duration"
|
||||
placeholder=" " clearable style="width:250px;margin-left:15px;">
|
||||
<template #append>秒</template>
|
||||
</el-input></div>
|
||||
<el-table v-loading="loading" :data="tableData1" style="width: 100%;height: calc(40vh);margin-top:15px;
|
||||
overflow: auto;;margin-bottom: 15px;" row-key="id" border
|
||||
@selection-change="handleSelectionChange" default-expand-all
|
||||
:row-class-name="tableRowClassName" ref="multipleTableRef"
|
||||
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
|
||||
<el-table-column type="selection" width="50" align="center" />
|
||||
<el-table-column type="index" label="序号" width="70px" align="center" />
|
||||
<el-table-column label="设备编码" prop="patroldeviceCode"></el-table-column>
|
||||
<el-table-column label="设备名称" prop="patroldeviceName"></el-table-column>
|
||||
<el-table-column label="设备型号" prop="deviceModel" width="100"></el-table-column>
|
||||
<el-table-column label="设备来源" prop="deviceSource" width="110"></el-table-column>
|
||||
<el-table-column label="生产厂家" prop="manufacturer" width="110">
|
||||
<template #default="scope">
|
||||
{{ currency(manufacturerList, scope.row.manufacturer) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="安装位置" prop="place"></el-table-column>
|
||||
<el-table-column label="实时状态" width="100" prop="datastatus">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.datastatus == 1" style="color:#409F84"><img
|
||||
src="@/assets/MenuIcon/u495.png" alt=""
|
||||
style="display: inline-block; margin: 0px 5px; "> 在线</span>
|
||||
<span v-else style="color:#F24444"> <img src="@/assets/MenuIcon/u499.png" alt=""
|
||||
style="display: inline-block; margin: 0px 5px; ">离线</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
</el-table>
|
||||
<Page :total="total1" v-model:size="paramstable1.size" v-model:current="paramstable1.current"
|
||||
@pagination="getData1()"></Page>
|
||||
<span class="dialog-footer"
|
||||
style="width: 100%;margin: auto; display: flex;display: -webkit-flex; justify-content: flex-end;-webkit-justify-content: flex-end;margin-top: 20px;">
|
||||
<el-button @click="handleClose">取 消</el-button>
|
||||
<el-button type="primary" @click="confirmClick(infoForm)"
|
||||
style="margin-right: 15px;">保存</el-button>
|
||||
</span>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
</Eldialog>
|
||||
@ -1550,7 +1714,8 @@ const isGaoliang: any = ref("")
|
||||
:value="item.stationId" style="width:100%" />
|
||||
</el-select>
|
||||
<el-scrollbar height="calc(78vh)" style="width:99%">
|
||||
<el-tree ref="treeRef" :class="useAppStore().size === 'default' ? 'silderLeft-large' : 'silderLeft-default'"
|
||||
<el-tree ref="treeRef"
|
||||
:class="useAppStore().size === 'default' ? 'silderLeft-large' : 'silderLeft-default'"
|
||||
node-key="bayId" :data="treedata" :current-node-key="currentNodeKey" :highlight-current="true"
|
||||
:props="defaultProps" v-loading="treeloading" @node-click="handleNodeClick">
|
||||
<template #default="{ node }">
|
||||
@ -1571,13 +1736,13 @@ const isGaoliang: any = ref("")
|
||||
|
||||
<el-input v-model="deviceName" placeholder="请输入巡视点位名称" @clear="getData()" @keyup.enter="getData()"
|
||||
style="margin-right:15px ;width: 185px;" clearable />
|
||||
<el-select clearable v-model="paramstable.mainDeviceId" placeholder="所属主设备" style="margin-right:15px ;"
|
||||
@visible-change="notification" @change="getData()">
|
||||
<el-select clearable v-model="paramstable.mainDeviceId" placeholder="所属主设备"
|
||||
style="margin-right:15px ;" @visible-change="notification" @change="getData()">
|
||||
<el-option v-for="item in mainEquipment" :key="item.mainDeviceId" :label="item.mainDeviceName"
|
||||
:value="item.mainDeviceId" />
|
||||
</el-select>
|
||||
<el-select clearable v-model="paramstable.componentId" placeholder="所属部件" style="margin-right:15px ;"
|
||||
@visible-change="notification" @change="getData()">
|
||||
<el-select clearable v-model="paramstable.componentId" placeholder="所属部件"
|
||||
style="margin-right:15px ;" @visible-change="notification" @change="getData()">
|
||||
<el-option v-for="item in getacaTypeBayId" :key="item.componentId" :label="item.componentName"
|
||||
:value="item.componentId" />
|
||||
</el-select>
|
||||
@ -1593,14 +1758,15 @@ const isGaoliang: any = ref("")
|
||||
<el-button class="searchButton" v-hasPerm="['add:device']" type="primary" @click="addClick"
|
||||
:disabled="treedata.length == 0"> 新增</el-button>
|
||||
<el-button class="searchButton" v-hasPerm="['del:device']" @click="delClick"
|
||||
:disabled="deviceInfos.length == 0" :type="deviceInfos.length > 0 ? 'primary' : ''"> 删除</el-button>
|
||||
:disabled="deviceInfos.length == 0" :type="deviceInfos.length > 0 ? 'primary' : ''">
|
||||
删除</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="draggable">
|
||||
<el-table v-loading="loading" :data="tableData" style="width: 100%;height: calc(78vh);
|
||||
overflow: auto;;margin-bottom: 15px;" row-key="id" @selection-change="handleSelectionChange"
|
||||
overflow: auto;;margin-bottom: 15px;" row-key="id" @selection-change="handleSelectionChange1"
|
||||
default-expand-all :row-class-name="tableRowClassName"
|
||||
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px'}">
|
||||
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
|
||||
<el-table-column type="selection" width="30" align="center" />
|
||||
<el-table-column type="index" label="序号" width="50px" align="center" />
|
||||
<el-table-column label="巡视点位编号" prop="deviceCode" width="140"></el-table-column>
|
||||
@ -1641,8 +1807,8 @@ const isGaoliang: any = ref("")
|
||||
<img v-hasPerm="['del:device']" src="@/assets/newimg/ht_sc.png" alt=""
|
||||
v-if="scope.row.datastatus == 0" title="删除" @click="handleDelete(scope.row)"
|
||||
style="cursor: pointer; ">
|
||||
<img v-hasPerm="['del:device']" src="@/assets/newimg/ht_sc1.png" alt="" v-else title="删除"
|
||||
style="cursor: pointer; ">
|
||||
<img v-hasPerm="['del:device']" src="@/assets/newimg/ht_sc1.png" alt="" v-else
|
||||
title="删除" style="cursor: pointer; ">
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -1695,8 +1861,9 @@ const isGaoliang: any = ref("")
|
||||
<span v-if="node.level == 1"
|
||||
:style="{ color: node.data.online == '1' ? '#409eff' : 'red' }">
|
||||
<svg t="1686725618148" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||
style="margin-right: 5px;" xmlns="http://www.w3.org/2000/svg" p-id="2814"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink" width="18" height="18">
|
||||
style="margin-right: 5px;" xmlns="http://www.w3.org/2000/svg"
|
||||
p-id="2814" xmlns:xlink="http://www.w3.org/1999/xlink" width="18"
|
||||
height="18">
|
||||
<path fill="currentColor"
|
||||
d="M954.88 590.72a432.64 432.64 0 0 0-409.6-457.6V0H151.04v64h263.04v76.8c-201.6 38.4-344.96 203.52-344.96 448-1.28 0.64 887.04 4.48 885.76 1.92zM197.76 661.12C198.4 860.16 311.68 1024 512 1024s314.24-161.92 314.24-360.96H197.76zM512 912A85.76 85.76 0 0 1 420.48 832 86.4 86.4 0 0 1 512 752.64 86.4 86.4 0 0 1 603.52 832 85.76 85.76 0 0 1 512 912z"
|
||||
p-id="2815"></path>
|
||||
@ -1715,29 +1882,34 @@ const isGaoliang: any = ref("")
|
||||
<div class="Camera-left">
|
||||
<div class="Camera-img">
|
||||
<JessibucaPlayer v-if="dialogMonitor" :_uid="33" ref="jessibuca" :visible.sync="true"
|
||||
:videoUrl="urls" :videofmp4="videofmp4" height="100px" :hasAudio="true" fluent autoplay
|
||||
live></JessibucaPlayer>
|
||||
:videoUrl="urls" :videofmp4="videofmp4" height="100px" :hasAudio="true" fluent
|
||||
autoplay live></JessibucaPlayer>
|
||||
</div>
|
||||
<div class="Camera-left-bottom">
|
||||
<div class="Camera-buttons-box">
|
||||
<div class="Camera-left-button1" @mousedown="ptzCamera('up')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
<div class="Camera-left-button2" @mousedown="ptzCamera('upright')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
@mouseup="ptzCamera('stop')">
|
||||
</div>
|
||||
<div class="Camera-left-button3" @mousedown="ptzCamera('right')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
<div class="Camera-left-button4" @mousedown="ptzCamera('downright')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
@mouseup="ptzCamera('stop')">
|
||||
</div>
|
||||
<div class="Camera-left-button5" @mousedown="ptzCamera('down')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
<div class="Camera-left-button6" @mousedown="ptzCamera('downleft')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
@mouseup="ptzCamera('stop')">
|
||||
</div>
|
||||
<div class="Camera-left-button7" @mousedown="ptzCamera('left')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
<div class="Camera-left-button8" @mousedown="ptzCamera('upleft')"
|
||||
@mouseup="ptzCamera('stop')"></div>
|
||||
@mouseup="ptzCamera('stop')">
|
||||
</div>
|
||||
<div class="Camera-left-button9" @click="presetPosition(130, beforehandPosition)"
|
||||
title="回到初始位置"></div>
|
||||
title="回到初始位置">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="Camera-left-buttons">
|
||||
@ -1750,24 +1922,27 @@ const isGaoliang: any = ref("")
|
||||
</div>
|
||||
<div class="videoOperationstext">缩放</div>
|
||||
<div class="videoOperations" style="border-radius:0 4px 4px 0;"
|
||||
:class="{ 'gaolaing': isGaoliang == 'zoomin' }" @mousedown="ptzCamera('zoomin')"
|
||||
@mouseup="ptzCamera('stop')"><el-icon>
|
||||
:class="{ 'gaolaing': isGaoliang == 'zoomin' }"
|
||||
@mousedown="ptzCamera('zoomin')" @mouseup="ptzCamera('stop')"><el-icon>
|
||||
<Plus />
|
||||
</el-icon></div>
|
||||
</div>
|
||||
<div style="display: flex;margin-top:15px;">
|
||||
<div class="videoOperations" @mouseup="quxiao"
|
||||
:class="{ 'gaolaing': isGaoliang == '66' }" @mousedown="condensationChang('减')">
|
||||
:class="{ 'gaolaing': isGaoliang == '66' }"
|
||||
@mousedown="condensationChang('减')">
|
||||
<el-icon>
|
||||
<Minus />
|
||||
</el-icon>
|
||||
</div>
|
||||
<div class="videoOperationstext">光聚</div>
|
||||
<div class="videoOperations" @mouseup="quxiao"
|
||||
:class="{ 'gaolaing': isGaoliang == '65' }" style="border-radius:0 4px 4px 0;"
|
||||
@mousedown="condensationChang('加')"><el-icon>
|
||||
:class="{ 'gaolaing': isGaoliang == '65' }"
|
||||
style="border-radius:0 4px 4px 0;" @mousedown="condensationChang('加')">
|
||||
<el-icon>
|
||||
<Plus />
|
||||
</el-icon></div>
|
||||
</el-icon>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display: flex;margin-top:15px;">
|
||||
<div class="videoOperations" @mouseup="quxiao"
|
||||
@ -1778,8 +1953,8 @@ const isGaoliang: any = ref("")
|
||||
</div>
|
||||
<div class="videoOperationstext">光圈</div>
|
||||
<div class="videoOperations" @mouseup="quxiao"
|
||||
:class="{ 'gaolaing': isGaoliang == '70' }" style="border-radius:0 4px 4px 0;"
|
||||
@mousedown="apertureChang('加')">
|
||||
:class="{ 'gaolaing': isGaoliang == '70' }"
|
||||
style="border-radius:0 4px 4px 0;" @mousedown="apertureChang('加')">
|
||||
<el-icon>
|
||||
<Plus />
|
||||
</el-icon>
|
||||
@ -1803,9 +1978,9 @@ const isGaoliang: any = ref("")
|
||||
</div>
|
||||
<div style="display: flex;"><span
|
||||
style="display: block;;padding-left:15px;display: inline-block;width: 50px;">雨刷</span>
|
||||
<el-switch class="nei" style="display: block;margin-left:0px" v-model="isWiper"
|
||||
inline-prompt active-text="开" inactive-text="关" @change="WiperClick"
|
||||
active-value="1" inactive-value="0" />
|
||||
<el-switch class="nei" style="display: block;margin-left:0px"
|
||||
v-model="isWiper" inline-prompt active-text="开" inactive-text="关"
|
||||
@change="WiperClick" active-value="1" inactive-value="0" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@ -1833,7 +2008,8 @@ const isGaoliang: any = ref("")
|
||||
<div v-if="indexRow % 2 == 1" style="width: 60px;margin-left: 20px;"><el-input
|
||||
v-model="threshold"></el-input></div>
|
||||
<div v-if="indexRow % 2 == 0" style="margin-left: 100px;"></div>
|
||||
<el-button class="searchButton" type="primary" style="width:90px;margin-left: 15px;"
|
||||
<el-button class="searchButton" type="primary"
|
||||
style="width:90px;margin-left: 15px;"
|
||||
@click="maintenanceArea">有效区域设置</el-button>
|
||||
<el-button class="searchButton" type="primary" style="width:90px;"
|
||||
@click="importclick()">保存基准图</el-button>
|
||||
@ -1886,20 +2062,20 @@ const isGaoliang: any = ref("")
|
||||
<Eldialog v-if="isMaintenanceArea" class="AngleBox" :title="'维护生效区域'" :zIndex="2000" :width="'1280px'"
|
||||
:height="'600px'" @before-close="closeMaintenanceArea">
|
||||
<template v-slot:PopFrameContent>
|
||||
<MaintenanceArea v-if="isMaintenanceArea" :AngleUrl="AngleUrl" :Custom3="Custom3" style="margin-top: 15px;"
|
||||
@closeMaintenanceArea="closeMaintenanceArea" />
|
||||
<MaintenanceArea v-if="isMaintenanceArea" :AngleUrl="AngleUrl" :Custom3="Custom3"
|
||||
style="margin-top: 15px;" @closeMaintenanceArea="closeMaintenanceArea" />
|
||||
</template>
|
||||
</Eldialog>
|
||||
<Eldialog v-if="isMeasurement" class="AngleBox" :title="'测温设置'" :zIndex="2000" :width="'1320px'" :height="'600px'"
|
||||
@before-close="closeMeasurement">
|
||||
<Eldialog v-if="isMeasurement" class="AngleBox" :title="'测温设置'" :zIndex="2000" :width="'1320px'"
|
||||
:height="'600px'" @before-close="closeMeasurement">
|
||||
<template v-slot:PopFrameContent>
|
||||
<!-- <el-scrollbar height="720px"> -->
|
||||
<!-- <el-scrollbar> -->
|
||||
<div style=" width:1280px;height:720px;overflow-y: auto;overflow-x: auto;margin-top:10px;">
|
||||
<Measurement v-if="isMeasurement" :AngleUrl="AngleUrl" :droPoint="droPoint" :imgWidth='imgWidth'
|
||||
style="margin-top: 15px;" :imgHeight='imgHeight' @closeMeasurement="closeMeasurement" />
|
||||
</div>
|
||||
<!-- </el-scrollbar> -->
|
||||
<!-- <el-scrollbar> -->
|
||||
<div style=" width:1280px;height:720px;overflow-y: auto;overflow-x: auto;margin-top:10px;">
|
||||
<Measurement v-if="isMeasurement" :AngleUrl="AngleUrl" :droPoint="droPoint" :imgWidth='imgWidth'
|
||||
style="margin-top: 15px;" :imgHeight='imgHeight' @closeMeasurement="closeMeasurement" />
|
||||
</div>
|
||||
<!-- </el-scrollbar> -->
|
||||
|
||||
<!-- </el-scrollbar> -->
|
||||
|
||||
@ -2502,6 +2678,5 @@ const isGaoliang: any = ref("")
|
||||
|
||||
.gaolaing {
|
||||
background: rgba(50, 177, 245, 0.4)
|
||||
}</style>
|
||||
|
||||
|
||||
}
|
||||
</style>
|
||||
|
@ -22,7 +22,7 @@ import {
|
||||
getComponentByBayId,
|
||||
getBindExamineDevice
|
||||
} from '@/api/task';
|
||||
import { getRobotAndUavList, getSubstationNaviTree } from '@/api/makeTask';
|
||||
import { getRobotAndUavList, getBayTree } from '@/api/makeTask';
|
||||
import { getdevicedata } from '@/api/device';
|
||||
import { getTreeList } from '@/api/linksignal';
|
||||
import { getDeviceByType, getaccType, getMainEquipment } from '@/api/device';
|
||||
@ -574,7 +574,7 @@ function getTree(val: any) {
|
||||
stationId: val
|
||||
};
|
||||
publicRelevanceData.value = [];
|
||||
getSubstationNaviTree(params)
|
||||
getBayTree(params)
|
||||
.then((res: any) => {
|
||||
|
||||
treedata.value = res.data;
|
||||
@ -1055,20 +1055,19 @@ function currency(list: any, itemcode: any) {
|
||||
return dictname;
|
||||
}
|
||||
const tableRowClassName = ({
|
||||
row,
|
||||
rowIndex
|
||||
row,
|
||||
rowIndex,
|
||||
}: {
|
||||
row: any;
|
||||
rowIndex: number;
|
||||
row: any
|
||||
rowIndex: number
|
||||
}) => {
|
||||
row.row_index = rowIndex;
|
||||
for (let i = 0; i < deviceInfos.value.length; i++) {
|
||||
if (deviceInfos.value[i].row_index === rowIndex) {
|
||||
return 'success-row';
|
||||
if (rowIndex % 2 === 0) {
|
||||
return 'warning-row'
|
||||
} else if (rowIndex % 2 === 1) {
|
||||
return 'success-row'
|
||||
}
|
||||
}
|
||||
return '';
|
||||
};
|
||||
return ''
|
||||
}
|
||||
onMounted(() => {
|
||||
getData();
|
||||
getDict();
|
||||
@ -1138,7 +1137,7 @@ function getrobotUAV() {
|
||||
</div>
|
||||
</div>
|
||||
<div class="draggable">
|
||||
<el-table stripe :header-cell-style="tableBg" v-loading="planLoading" :data="tableData" style="
|
||||
<el-table stripe :header-cell-style="tableBg" v-loading="planLoading" :data="tableData" :row-class-name="tableRowClassName" style="
|
||||
width: 100%;
|
||||
height: calc(75vh);
|
||||
overflow: auto;
|
||||
@ -1284,7 +1283,7 @@ function getrobotUAV() {
|
||||
<div class="publicline"></div>
|
||||
<div class="publictitle" style="color:#ffffff;">关联结果</div>
|
||||
</div>
|
||||
<el-table v-if="resultData.length != 0" :data="resultData" style="width: 100%" row-key="id"
|
||||
<el-table v-if="resultData.length != 0" :data="resultData" style="width: 100%" row-key="id" :row-class-name="tableRowClassName"
|
||||
:header-cell-style="tableBg" stripe :height="'calc(100vh - 400px)'">
|
||||
<el-table-column type="index" label="序号" width="50" align="center" />
|
||||
<el-table-column v-if="examineInfo.deviceLevel == '' ||
|
||||
@ -1397,7 +1396,7 @@ function getrobotUAV() {
|
||||
<el-button class="searchButton" type="primary" @click="addPublic()">添加</el-button>
|
||||
</div>
|
||||
<div class="draggable">
|
||||
<el-table :header-cell-style="tableBg" stripe :row-key="rowRelevanceKey" ref="multipleTableRef"
|
||||
<el-table :header-cell-style="tableBg" stripe :row-key="rowRelevanceKey" ref="multipleTableRef" :row-class-name="tableRowClassName"
|
||||
v-loading="loading3" :data="publicRelevanceData" style="width: 100%"
|
||||
@selection-change="publicSelectionChange" :height="'calc(100vh - 360px)'">
|
||||
<el-table-column type="selection" width="50" align="center" />
|
||||
@ -1430,7 +1429,7 @@ function getrobotUAV() {
|
||||
<Eldialog v-model="noneShow" :close-on-click-modal="false" @before-close="deviceClose" :title="'屏蔽的巡视点位'"
|
||||
append-to-body width="1100px" draggable>
|
||||
<template v-slot:PopFrameContent>
|
||||
<el-table :header-cell-style="tableBg" stripe :row-key="rowRelevanceKey" ref="multipleTableRef"
|
||||
<el-table :header-cell-style="tableBg" stripe :row-key="rowRelevanceKey" ref="multipleTableRef" :row-class-name="tableRowClassName"
|
||||
v-loading="loading4" :data="deviceData" style="width: 100%;margin-top:10px"
|
||||
@selection-change="publicSelectionChange" :height="'calc(100vh - 260px)'">
|
||||
<el-table-column type="index" label="序号" width="50" align="center" />
|
||||
@ -1462,8 +1461,8 @@ function getrobotUAV() {
|
||||
width: 300px;
|
||||
padding: 5px 0px 10px;
|
||||
box-sizing: border-box;
|
||||
// background: #fff;
|
||||
background-image: url(@/assets/newimg/jcpz_260.png);
|
||||
// background: #fff;
|
||||
background-image: url(@/assets/navigation/sanwei.png);
|
||||
background-size: 100% 100%;
|
||||
border-radius: 3px;
|
||||
position: relative;
|
||||
@ -1474,7 +1473,7 @@ function getrobotUAV() {
|
||||
.silderBox {
|
||||
width: 100%;
|
||||
height: calc(89vh);
|
||||
background-color: #131a25;
|
||||
// background-color: #131a25;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
padding: 5px 20px 0px;
|
||||
@ -1487,9 +1486,8 @@ function getrobotUAV() {
|
||||
.silderRight {
|
||||
flex: 1;
|
||||
width: 100%;
|
||||
height: calc(100vh - 290px);
|
||||
height: calc(100vh - 290px) !important;
|
||||
overflow: auto;
|
||||
// background-color: rgba(255, 255, 255, 1);
|
||||
border-radius: 3px;
|
||||
padding-bottom: 0px;
|
||||
box-sizing: border-box;
|
||||
|
@ -857,7 +857,7 @@ const tableRowClassName = ({
|
||||
width: 100%;
|
||||
height: calc(89vh);
|
||||
// overflow: auto;
|
||||
background-color: #131a25;
|
||||
// background-color: #131a25;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
padding: 5px 20px 0px;
|
||||
|
@ -279,13 +279,13 @@ onMounted(() => {
|
||||
</div>
|
||||
<div class="cont_bottom">
|
||||
<el-table v-loading="loading" :data="tableData" style="width: 100%;height: calc(30vh);
|
||||
overflow: auto;;margin-bottom: 15px;" row-key="id" default-expand-all
|
||||
overflow: auto;;margin-bottom: 15px;" row-key="id" default-expand-all
|
||||
:row-class-name="tableRowClassName"
|
||||
:header-cell-style="{ background: '#002b6a', color: '#B5D7FF', height: '50px' }">
|
||||
<el-table-column type="index" label="序号" width="50px" align="center" />
|
||||
<el-table-column label="采集时间" prop="startTime" width="120"></el-table-column>
|
||||
<el-table-column label="监测数值" prop="value"></el-table-column>
|
||||
<el-table-column label="单位" prop="unit"></el-table-column>
|
||||
<el-table-column label="采集时间" prop="startTime" width="120"></el-table-column>
|
||||
</el-table>
|
||||
<Page :total="total" v-model:size="tableform.size" v-model:current="tableform.current"
|
||||
@pagination="gettabledata()">
|
||||
|
@ -117,6 +117,7 @@ function getInit() {
|
||||
stationId: userStore.stationId
|
||||
}
|
||||
getDeviceWorkData(params).then((res: any) => {
|
||||
|
||||
environmentInfo.value = res.data
|
||||
})
|
||||
|
||||
@ -156,7 +157,8 @@ function gettype(){
|
||||
<div><img :src="`/environment/${item.itemcode}.png`" alt=""></div>
|
||||
<div class="img_box_nei">
|
||||
<div class="img_text1">{{ item.dictname }}</div>
|
||||
<div class="img_text2">{{ item.value }}<span class="img_unit"> {{ item.unit }}</span></div>
|
||||
<div v-if="item.value != '无'" class="img_text2">{{item.dictname == '风向'? item.value: Number(item.value).toFixed(2)}}<span class="img_unit"> {{ item.unit }}</span></div>
|
||||
<div v-else class="img_text2">{{item.value}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -243,7 +245,7 @@ function gettype(){
|
||||
.img_text2 {
|
||||
font-family: '钉钉进步体 Bold', '钉钉进步体';
|
||||
font-weight: 700;
|
||||
font-size: 36px;
|
||||
font-size: 24px;
|
||||
color: #00ffff;
|
||||
|
||||
.img_unit {
|
||||
|
@ -80,7 +80,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="one_box_all">
|
||||
<div class="all_img"><img src="@/assets/sytlechange/one_right4.svg" alt=""></div>
|
||||
<div class="all_text">
|
||||
@ -91,7 +91,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="one_box_all">
|
||||
<div class="all_img"><img src="@/assets/sytlechange/one_right5.svg" alt=""></div>
|
||||
<div class="all_text">
|
||||
@ -115,7 +115,8 @@
|
||||
<div class="two_text">
|
||||
<div class="two_text_one">
|
||||
<span class="one_one">摄像头</span>
|
||||
<span class="one_two">{{ patrolInfo.camera.online }}<span class="one_three">/{{ patrolInfo.camera.allCount }}</span></span>
|
||||
<span class="one_two">{{ patrolInfo.camera.online }}<span class="one_three">/{{
|
||||
patrolInfo.camera.allCount }}</span></span>
|
||||
</div>
|
||||
<div class="two_text_two">
|
||||
<span class="two_one">在线率:</span>
|
||||
@ -127,13 +128,14 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="two_box_all" v-if="patrolInfo.voice">
|
||||
<div class="two_box_all" v-if="patrolInfo.voice">
|
||||
<div class="two_img"><img src="@/assets/sytlechange/two-left-2.svg" alt=""></div>
|
||||
<div class="two_body">
|
||||
<div class="two_text">
|
||||
<div class="two_text_one">
|
||||
<span class="one_one">声纹设备</span>
|
||||
<span class="one_two">{{ patrolInfo.voice.online }}<span class="one_three">/{{ patrolInfo.voice.allCount }}</span></span>
|
||||
<span class="one_two">{{ patrolInfo.voice.online }}<span class="one_three">/{{
|
||||
patrolInfo.voice.allCount }}</span></span>
|
||||
</div>
|
||||
<div class="two_text_two">
|
||||
<span class="two_one">在线率:</span>
|
||||
@ -145,13 +147,14 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="two_box_all" v-if="patrolInfo.gateway">
|
||||
<div class="two_box_all" v-if="patrolInfo.gateway">
|
||||
<div class="two_img"><img src="@/assets/sytlechange/two-left-3.svg" alt=""></div>
|
||||
<div class="two_body">
|
||||
<div class="two_text">
|
||||
<div class="two_text_one">
|
||||
<span class="one_one">网关机</span>
|
||||
<span class="one_two">{{ patrolInfo.gateway.online }}<span class="one_three">/{{ patrolInfo.gateway.allCount }}</span></span>
|
||||
<span class="one_one">网关机</span>
|
||||
<span class="one_two">{{ patrolInfo.gateway.online }}<span class="one_three">/{{
|
||||
patrolInfo.gateway.allCount }}</span></span>
|
||||
</div>
|
||||
<div class="two_text_two">
|
||||
<span class="two_one">在线率:</span>
|
||||
@ -176,7 +179,8 @@
|
||||
<div class="three_top_right"><img src="@/assets/sytlechange/three1.svg" alt=""></div>
|
||||
</div>
|
||||
<div class="three_bottom">
|
||||
<span class="three_bottom_one">{{ environmentInfo.temperature }}</span>
|
||||
<span class="three_bottom_one">{{ environmentInfo.temperature == '无' ? environmentInfo.temperature :
|
||||
Number(environmentInfo.temperature).toFixed(2) }}</span>
|
||||
<span class="three_bottom_two">℃</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -186,7 +190,8 @@
|
||||
<div class="three_top_right"><img src="@/assets/sytlechange/three2.svg" alt=""></div>
|
||||
</div>
|
||||
<div class="three_bottom">
|
||||
<span class="three_bottom_one">{{ environmentInfo.humidity }}</span>
|
||||
<span class="three_bottom_one">{{ environmentInfo.humidity == '无' ? environmentInfo.humidity : Number(
|
||||
environmentInfo.humidity).toFixed(2) }}</span>
|
||||
<span class="three_bottom_two">RH</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -196,7 +201,9 @@
|
||||
<div class="three_top_right"><img src="@/assets/sytlechange/three3.svg" alt=""></div>
|
||||
</div>
|
||||
<div class="three_bottom">
|
||||
<span class="three_bottom_one">{{ environmentInfo.windSpeed }}</span>
|
||||
<span
|
||||
class="three_bottom_one">{{ environmentInfo.windSpeed == '无' ? environmentInfo.windSpeed : Number(environmentInfo.windSpeed).toFixed(2)
|
||||
}}</span>
|
||||
<span class="three_bottom_two">级</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -206,7 +213,7 @@
|
||||
<div class="three_top_right"><img src="@/assets/sytlechange/three4.svg" alt=""></div>
|
||||
</div>
|
||||
<div class="three_bottom">
|
||||
<span class="three_bottom_one">{{ environmentInfo.windDirection}}</span>
|
||||
<span class="three_bottom_one">{{ environmentInfo.windDirection }}</span>
|
||||
<span class="three_bottom_two">SW</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -216,7 +223,9 @@
|
||||
<div class="three_top_right"><img src="@/assets/sytlechange/three5.svg" alt=""></div>
|
||||
</div>
|
||||
<div class="three_bottom">
|
||||
<span class="three_bottom_one">{{ environmentInfo.pressure }}</span>
|
||||
<span class="three_bottom_one">{{
|
||||
environmentInfo.pressure == '无' ? environmentInfo.pressure : Number(environmentInfo.pressure).toFixed(2)
|
||||
}}</span>
|
||||
<span class="three_bottom_two">HPA</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -226,7 +235,9 @@
|
||||
<div class="three_top_right"><img src="@/assets/sytlechange/three6.svg" alt=""></div>
|
||||
</div>
|
||||
<div class="three_bottom">
|
||||
<span class="three_bottom_one">{{ environmentInfo.rainfall }}</span>
|
||||
<span class="three_bottom_one">{{
|
||||
environmentInfo.rainfall == '无' ? environmentInfo.rainfall : Number(environmentInfo.rainfall).toFixed(2)
|
||||
}}</span>
|
||||
<span class="three_bottom_two">MM</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -265,20 +276,20 @@
|
||||
<div class="right2_body" v-if="rate">
|
||||
<div class="right2_box">
|
||||
<div class="box_text">
|
||||
<div class="box_text_one">{{rate.confirmationRate || 0}}%</div>
|
||||
<div class="box_text_one">{{ rate.confirmationRate || 0 }}%</div>
|
||||
<div class="box_text_two">报警准确率</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right2_box_left">
|
||||
<div class="box_text">
|
||||
<div class="box_text1">告警总数</div>
|
||||
<div class="box_text1">核查总数</div>
|
||||
<div class="box_text3"> <img src="@/assets/navigation/sysy_gjl2.png" alt=""></div>
|
||||
<div class="box_text2">{{rate.totalAlarms || 0}} <span class="span">件</span></div>
|
||||
<div class="box_text2">{{ rate.totalAlarms || 0 }} <span class="span">条</span></div>
|
||||
</div>
|
||||
<div class="box_text" style="margin-top: 30px;">
|
||||
<div class="box_text1">告警总数</div>
|
||||
<div class="box_text1">确认告警总数</div>
|
||||
<div class="box_text3"> <img src="@/assets/navigation/sysy_gjl2.png" alt=""></div>
|
||||
<div class="box_text2">{{rate.confirmedCount || 0}} <span class="span">件</span></div>
|
||||
<div class="box_text2">{{ rate.confirmedCount || 0 }} <span class="span">条</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -294,7 +305,7 @@
|
||||
<span :class="tabs == 4 ? 'span1' : ''" @click="tourTaskInit(4)">日</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right_three_body" v-loading ="loading2">
|
||||
<div class="right_three_body" v-loading="loading2">
|
||||
<div class="three_left">
|
||||
<div class="three_left_top">{{ tourTaskInfo.executeRate }}%</div>
|
||||
<div class="three_left_bottom">任务执行率</div>
|
||||
@ -324,7 +335,7 @@ import Alarminformation from "@/views/monitorsystem/alarminformation.vue";
|
||||
import { getNotCheckAlarmCount } from '@/api/home';
|
||||
import { CountTo as BaseCountTo } from 'vue3-count-to'
|
||||
import { ref, onMounted, onBeforeUnmount, nextTick, reactive, watch } from "vue";
|
||||
import { getMainDeviceNumber, getPatrolDeviceOnLine, getWeatherLogList, getAlarmLogList, getExceptionEventStat, getTaskTodoStat,getConfirmationRate } from "@/api/home";
|
||||
import { getMainDeviceNumber, getPatrolDeviceOnLine, getWeatherLogList, getAlarmLogList, getExceptionEventStat, getTaskTodoStat, getConfirmationRate } from "@/api/home";
|
||||
import Modelset from './3DModelSet.vue';
|
||||
import { getTaskTodoStatByMonth } from "@/api/areaboard";
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
@ -416,24 +427,6 @@ function getInit() {
|
||||
}
|
||||
getWeatherLogList(params).then((res: any) => {
|
||||
environmentInfo.value = res.data
|
||||
if (res.data.temperature == "") {
|
||||
environmentInfo.value.temperature = "无"
|
||||
}
|
||||
if (res.data.humidity == "") {
|
||||
environmentInfo.value.humidity = "无"
|
||||
}
|
||||
if (res.data.rainfall == "") {
|
||||
environmentInfo.value.rainfall = "无"
|
||||
}
|
||||
if (res.data.windSpeed == "") {
|
||||
environmentInfo.value.windSpeed = "无"
|
||||
}
|
||||
if (res.data.windDirection == "") {
|
||||
environmentInfo.value.windDirection = "无"
|
||||
}
|
||||
if (res.data.pressure == "") {
|
||||
environmentInfo.value.pressure = "无"
|
||||
}
|
||||
})
|
||||
//获取巡视设备在线率
|
||||
getPatrolDeviceOnLine(params).then((res: any) => {
|
||||
@ -494,9 +487,9 @@ const environmentInfo = ref({
|
||||
pressure: ""
|
||||
})
|
||||
const environment = ref()
|
||||
const rate:any = ref()
|
||||
function getgetConfirmationRate(){
|
||||
getConfirmationRate({stationId:userStore.stationId}).then((res:any)=>{
|
||||
const rate: any = ref()
|
||||
function getgetConfirmationRate() {
|
||||
getConfirmationRate({ stationId: userStore.stationId }).then((res: any) => {
|
||||
rate.value = res.data
|
||||
})
|
||||
}
|
||||
@ -701,7 +694,7 @@ const tabs = ref(1)
|
||||
top: 16px;
|
||||
left: 15px;
|
||||
width: 450px;
|
||||
height: 458px;
|
||||
height: 400px;
|
||||
background: url(@/assets/navigation/sy_zsb.png);
|
||||
background-size: 100% 100%;
|
||||
background-color: #001f59d7;
|
||||
@ -721,7 +714,7 @@ const tabs = ref(1)
|
||||
background-image: url(@/assets/sytlechange/one.svg);
|
||||
position: relative;
|
||||
padding-left: 20px;
|
||||
margin-bottom: 30px;
|
||||
margin: 17px 0px;
|
||||
|
||||
.all_img {
|
||||
width: 23px;
|
||||
@ -766,10 +759,10 @@ const tabs = ref(1)
|
||||
|
||||
.stationboard-left2 {
|
||||
position: absolute;
|
||||
top: 490px;
|
||||
top: 430px;
|
||||
left: 15px;
|
||||
width: 450px;
|
||||
height: 247px;
|
||||
height: 290px;
|
||||
background: url(@/assets/navigation/sy_zz.png);
|
||||
background-size: 100% 100%;
|
||||
background-color: #001f59d7;
|
||||
@ -789,7 +782,7 @@ const tabs = ref(1)
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 25px;
|
||||
margin-bottom: 40px;
|
||||
|
||||
.two_img {
|
||||
width: 36px;
|
||||
@ -863,10 +856,10 @@ const tabs = ref(1)
|
||||
|
||||
.stationboard-left3 {
|
||||
position: absolute;
|
||||
top: 750px;
|
||||
top: 730px;
|
||||
left: 15px;
|
||||
width: 450px;
|
||||
height: 253px;
|
||||
height: 273px;
|
||||
background: url(@/assets/navigation/sy_gj.png);
|
||||
background-size: 100% 100%;
|
||||
background-color: #001f59d7;
|
||||
@ -889,7 +882,7 @@ const tabs = ref(1)
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 20px;
|
||||
|
||||
.three_top {
|
||||
width: 100%;
|
||||
@ -1109,6 +1102,7 @@ const tabs = ref(1)
|
||||
font-size: 20px;
|
||||
color: #00FFFF;
|
||||
}
|
||||
|
||||
.spanc2 {
|
||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
@ -1116,6 +1110,7 @@ const tabs = ref(1)
|
||||
font-size: 20px;
|
||||
color: #009933;
|
||||
}
|
||||
|
||||
.spanc3 {
|
||||
font-family: 'Arial Negreta', 'Arial Normal', 'Arial';
|
||||
font-weight: 700;
|
||||
@ -1150,15 +1145,17 @@ const tabs = ref(1)
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
.img_txt{
|
||||
|
||||
.img_txt {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #fff !important;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
img{
|
||||
|
||||
img {
|
||||
margin-right: 10px;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -549,7 +549,7 @@ function leadingOut() {
|
||||
<img src="@/assets/monitorsystem/top_bj.png" alt="" class="header-img-box">
|
||||
<div class="header-left">
|
||||
<img src="@/assets/monitorsystem/top_logo.png" alt="">
|
||||
<div class="header-left-title">变电站远程智能巡视系统
|
||||
<div class="header-left-title">配电网人工智能平台
|
||||
<span style="position: relative; display: inline-block; font-size: 18px;font-family: 'Arial Normal', 'Arial';
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
@ -607,7 +607,7 @@ function leadingOut() {
|
||||
<div class="header-information">
|
||||
<img src="@/assets/monitorsystem/header/u385.png" alt="" style="width:16px;height: 16px;">
|
||||
<div class="stationintroducebox">
|
||||
<div class="introduceboxtext1">变电站远程智能巡视系统</div>
|
||||
<div class="introduceboxtext1">配电网人工智能平台</div>
|
||||
<div class="introduceboxtext2">{{ systemInfo.version }}</div>
|
||||
<div style="display: flex;align-items: center;padding-bottom: 8px;">
|
||||
<div class="introduceboxline"></div>
|
||||
|
@ -1337,7 +1337,7 @@ onMounted(() => {
|
||||
border: 1px solid #131a25;
|
||||
border-top: 0px;
|
||||
padding: 0px 10px 20px 10px;
|
||||
background-color: #131a25;
|
||||
// background-color: #131a25;
|
||||
box-sizing: border-box;
|
||||
border-radius: 0px 5px 5px 5px;
|
||||
}
|
||||
|
@ -2909,7 +2909,7 @@ const open = () => {
|
||||
width: 100%;
|
||||
height: calc(100vh - 160px);
|
||||
overflow: auto;
|
||||
background-color: #131a25;
|
||||
// background-color: #131a25;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
padding: 5px 20px 0px;
|
||||
|
@ -352,7 +352,7 @@ onMounted(() => {
|
||||
.rightNav {
|
||||
width: 100%;
|
||||
height: calc(89vh);
|
||||
background-color: #131a25;
|
||||
// background-color: #131a25;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
padding: 10px 15px 0px;
|
||||
|
@ -4984,7 +4984,7 @@ function getComponentPage() {
|
||||
bayId: pageInfo.value.bayId,
|
||||
componentName: componentName.value
|
||||
}
|
||||
getComponentByBayPage(params).then(res => {
|
||||
getComponentByBayPage(JSON.stringify(params)).then(res => {
|
||||
componentData.value = res.data.records
|
||||
pageInfo.value.size = res.data.size
|
||||
pageInfo.value.current = res.data.current
|
||||
@ -5015,7 +5015,7 @@ function getmainDevicePage() {
|
||||
getSubstationBayByArea({ stationCode: userStore.stationCode }).then((res) => {
|
||||
bayIdType.value = res.data
|
||||
})
|
||||
getMainDevicePage(params).then(res => {
|
||||
getMainDevicePage(JSON.stringify(params)).then(res => {
|
||||
mainDeviceData.value = res.data.records
|
||||
pageInfo.value.size = res.data.size
|
||||
pageInfo.value.current = res.data.current
|
||||
|
@ -391,36 +391,46 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="desc" label="识别类型" width="140px">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.desc != null && scope.row.desc != ''">{{ scope.row.desc
|
||||
<span v-if="scope.row.recognitionType">{{ currency(recognitionType,
|
||||
scope.row.recognitionType,)
|
||||
}}</span>
|
||||
<span v-else>--</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="识别值" width="100px">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.valueType == 'meter' || scope.row.valueType == 'infrared'">
|
||||
<span
|
||||
v-if="scope.row.valueType == 'meter' || scope.row.valueType == 'partial' || scope.row.valueType == 'partial' || scope.row.valueType == 'infrared'">
|
||||
<span v-if="scope.row.analysisResult == '异常'" style="color: red;font-size: 16px;font-weight: bold;">
|
||||
{{
|
||||
scope.row.value }}
|
||||
{{ scope.row.unit }}</span>
|
||||
<span v-else> {{ scope.row.value }} {{ scope.row.unit }}</span>
|
||||
{{ scope.row.value }} {{ scope.row.unit }}
|
||||
</span>
|
||||
<span v-else>
|
||||
{{ scope.row.value }} {{ scope.row.unit }}
|
||||
</span>
|
||||
</span>
|
||||
<span v-else>
|
||||
<span v-if="scope.row.conf != null && scope.row.conf != ''">{{ scope.row.conf
|
||||
}}</span>
|
||||
<span v-if="scope.row.desc != null && scope.row.desc != '' && scope.row.valueType != 'sound'">
|
||||
{{ scope.row.desc }}
|
||||
</span>
|
||||
<span v-else>--</span>
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="analysisResult" label="巡视结论" align="center" width="80px">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.analysisResult == '正常'" style="color: rgb(0, 249, 162)">正常</span>
|
||||
<span v-if="scope.row.analysisResult == '异常'"
|
||||
style="color: rgb(255, 51, 0);color: red;font-size: 16px;font-weight: bold;">异常</span>
|
||||
<span v-if="scope.row.analysisResult == '设备检修'" style="color: rgb(0, 153, 255)">设备检修</span>
|
||||
<span v-if="scope.row.analysisResult == '失败'" style="color: rgb(255, 189, 0)">失败</span>
|
||||
<span v-if="scope.row.analysisResult == '成功'" style="color: rgb(0, 249, 162)">成功</span>
|
||||
<span v-if="scope.row.analysisResult == '' || scope.row.analysisResult == null">--</span>
|
||||
<span v-if="scope.row.analysisResult == '正常' && scope.row.flag != '7'"
|
||||
style="color: rgb(0, 249, 162)">正常</span>
|
||||
<span v-if="scope.row.analysisResult == '异常' && scope.row.flag != '7'"
|
||||
style="color: rgb(255, 51, 0);font-size: 16px;font-weight: bold;">异常</span>
|
||||
<span v-if="scope.row.analysisResult == '设备检修' && scope.row.flag != '7'"
|
||||
style="color: rgb(0, 153, 255)">设备检修</span>
|
||||
<span v-if="scope.row.analysisResult == '失败' && scope.row.flag != '7'"
|
||||
style="color: rgb(255, 189, 0)">失败</span>
|
||||
<span v-if="scope.row.analysisResult == '成功' && scope.row.flag != '7'"
|
||||
style="color: rgb(0, 249, 162)">成功</span>
|
||||
<span v-if="scope.row.flag == '7'" style="color: rgb(255, 51, 0);">表计读数异常</span>
|
||||
<span
|
||||
v-if="(scope.row.analysisResult == '' && scope.row.flag != '7') || (scope.row.analysisResult == null && scope.row.flag != '7')">--</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="reviseValue" label="修正值" align="center">
|
||||
@ -592,6 +602,7 @@ const srangingMouse = new THREE.Vector2()
|
||||
|
||||
// 初始化
|
||||
onMounted(() => {
|
||||
getTypeTwo()
|
||||
setupWebSocket()
|
||||
initRenderer()
|
||||
|
||||
@ -677,6 +688,12 @@ function Information(val) {
|
||||
})
|
||||
|
||||
}
|
||||
const recognitionType = ref([])
|
||||
function getTypeTwo() {
|
||||
getDeviceByType({ dictcode: 'recognition_type' }).then((res) => {
|
||||
recognitionType.value = res.data
|
||||
})
|
||||
}
|
||||
// 页面退出
|
||||
onBeforeUnmount(() => {
|
||||
window.removeEventListener('resize', resize)
|
||||
@ -2417,21 +2434,21 @@ function getVideoUrl(row, index) {
|
||||
videoUrl.value = res.data.data.ws_flv
|
||||
videofmp4.value = res.data.data.fmp4
|
||||
if (index == 'camera') {
|
||||
presetPosition(130,row.patroldevice_pos)
|
||||
presetPosition(130, row.patroldevice_pos)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}).catch(function (error) {
|
||||
})
|
||||
}
|
||||
function presetPosition(cmdCode,presetPos) { // 预置位操作 ---设置、删除、调用
|
||||
function presetPosition(cmdCode, presetPos) { // 预置位操作 ---设置、删除、调用
|
||||
|
||||
axios.get(userStore.webApiBaseUrl + '/basedata/substation-patroldevice/isWorkingOfPatrolDevice?stationcode=' + userStore.stationCode + "&devicecode=" + deviceId.value, {}).then((resize) => {
|
||||
axios.get(userStore.webApiBaseUrl + '/basedata/substation-patroldevice/isWorkingOfPatrolDevice?stationcode=' + userStore.stationCode + "&devicecode=" + deviceId.value, {}).then((resize) => {
|
||||
if (res.data.data == "0") {
|
||||
console.log("预置位")
|
||||
axios.post(userStore.webApiMonitorUrl + '/api/ptz/front_end_command/' + deviceId.value + '/' + channelId.value + '?cmdCode=' + cmdCode + '¶meter1=0¶meter2=' + presetPos + '&combindCode2=0', {}).then((res) => { })
|
||||
console.log("预置位")
|
||||
axios.post(userStore.webApiMonitorUrl + '/api/ptz/front_end_command/' + deviceId.value + '/' + channelId.value + '?cmdCode=' + cmdCode + '¶meter1=0¶meter2=' + presetPos + '&combindCode2=0', {}).then((res) => { })
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
//摄像机-摄像机-视频播放
|
||||
const videoChannelList = ref([])
|
||||
@ -2503,7 +2520,6 @@ const hisloading = ref(false)
|
||||
const timeSlot = ref([])
|
||||
const deviceIdone = ref('')
|
||||
function historicalRecords(row) {
|
||||
console.log(row)
|
||||
getType()
|
||||
deviceIdone.value = row
|
||||
historParams.value.deviceId = row.objinfo.deviceId
|
||||
@ -2520,7 +2536,7 @@ function historicalRecords(row) {
|
||||
getHistoryDevice(historParams.value).then(res => {
|
||||
if (res.code == 0) {
|
||||
historydata.value = res.data.records
|
||||
historParams.value.size = res.data.records
|
||||
historParams.value.size = res.data.size
|
||||
historParams.value.current = res.data.current
|
||||
histotal.value = res.data.total
|
||||
hisloading.value = false
|
||||
|
Loading…
Reference in New Issue
Block a user