src/main/java/com/whyc/mapper/PowerBattRtMapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.PowerBattRt; public interface PowerBattRtMapper extends CustomMapper<PowerBattRt>{ } src/main/java/com/whyc/mapper/PowerInfMapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.PowerInf; public interface PowerInfMapper extends CustomMapper<PowerInf>{ } src/main/java/com/whyc/mapper/PowerRealRt1Mapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.PowerRealRt1; public interface PowerRealRt1Mapper extends CustomMapper<PowerRealRt1>{ } src/main/java/com/whyc/mapper/PowerRealRt2Mapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.PowerRealRt2; public interface PowerRealRt2Mapper extends CustomMapper<PowerRealRt2>{ } src/main/java/com/whyc/mapper/PowerRealRt3Mapper.java
New file @@ -0,0 +1,6 @@ package com.whyc.mapper; import com.whyc.pojo.PowerRealRt3; public interface PowerRealRt3Mapper extends CustomMapper<PowerRealRt3>{ } src/main/java/com/whyc/pojo/PowerBattRt.java
New file @@ -0,0 +1,57 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; /** * <p> * * </p> * * @author lxw * @since 2024-12-04 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName(schema = "db_power_rt",value = "tb_power_batt_rt") @ApiModel(value="PowerBattRt对象", description="") public class PowerBattRt implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "自增主键") @TableId(value = "num", type = IdType.AUTO) private Long num; @ApiModelProperty(value = "电源ID") private Integer powerId; @ApiModelProperty(value = "记录时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date recordTime; @ApiModelProperty(value = "单体编号") private Integer monNum; @ApiModelProperty(value = "单体电压") private Float monVol; @ApiModelProperty(value = "单体内阻") private Float monRes; @ApiModelProperty(value = "单体温度") private Float monTmp; } src/main/java/com/whyc/pojo/PowerInf.java
@@ -45,5 +45,13 @@ @ApiModelProperty("直流输出电压下限阈值") private Float dcoutvolLowLimit; @TableField("power_ip") @ApiModelProperty("电源ip") private String powerIp; @TableField("dev_type") @ApiModelProperty("电源类型:1<包含电源实时rt>,2<包含电源实时rt>,3<不包含电源实时rt>") private Integer devType; } src/main/java/com/whyc/pojo/PowerRealRt1.java
New file @@ -0,0 +1,182 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; /** * <p> * * </p> * * @author lxw * @since 2024-12-04 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName(schema = "db_power_rt",value = "tb_power_real_rt1") @ApiModel(value="PowerRealRt1对象", description="") public class PowerRealRt1 implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "自增主键") @TableId(value = "num", type = IdType.AUTO) private Long num; private Integer powerId; @ApiModelProperty(value = "记录时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date recordTime; private Float charOutVol; private Float charOutCurr; private Float groupVol; private Float groupCurr; private Float groupTmp; private Float busVol; private Float ac1Vola; private Float ac1Volb; private Float ac1Volc; private Float ac2Vola; private Float ac2Volb; private Float ac2Volc; private Float busVolPositive; private Float busVolNegative; private Float busResPositive; private Float busResNegative; private Integer charJunFloat; private Integer charOpenClose; private Integer charModelError; private Integer charOutOvervol; private Integer charOutLessvol; private Integer battOvervol; private Integer battLessvol; private Integer battMonOvervol; private Integer battMonLessvol; private Integer battState; private Integer controlBusOvervol; private Integer controlBusLessvol; private Integer insualBusVolError; private Integer controlBusPositiveError; private Integer controlBusNegativeError; private Integer insualBusAcvolOvervol; private Integer battPatrolDetectorError; private Integer insualError; private Integer acin1Qf11; private Integer acin1Qf12; private Integer charOutBusDk11; private Integer charOutBattDk12; private Integer battOutQf1; private Integer busSwitchN1lzk; private Integer ac1Fault; private Integer ac2Fault; private Integer mainSwitchFault; private Integer feederTripFault; private Integer thunderFault; private Integer feedersCommFault; private Integer dcFeeder7to9Switch1; private Integer dcFeeder7Switch; private Integer dcFeeder7Bus1Zk11; private Integer dcFeeder7Bus2Zk12; private Integer dcFeeder8Switch; private Integer dcFeeder8Bus1Zk11; private Integer dcFeeder8Bus2Zk12; private Integer dcFeeder9Switch; private Integer dcFeeder9Bus1Zk11; private Integer dcFeeder9Bus2Zk12; private Integer acFeeder7Switch; private Integer acFeeder7Acin1Q11; private Integer acFeeder7Acin2Q12; private Integer acFeeder7Acin1Fault; private Integer acFeeder7Acin2Fault; private Integer acFeeder9Switch; private Integer acFeeder9Acin1Q11; private Integer acFeeder9Acin2Q12; private Integer acFeeder9Acin1Fault; private Integer acFeeder9Acin2Fault; private Integer insualCommFault; private Integer insualInsualFault; private Integer insualMiainCommFault; } src/main/java/com/whyc/pojo/PowerRealRt2.java
New file @@ -0,0 +1,170 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; /** * <p> * * </p> * * @author lxw * @since 2024-12-04 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName(schema = "db_power_rt",value = "tb_power_real_rt2") @ApiModel(value="PowerRealRt2对象", description="") public class PowerRealRt2 implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "自增主键") @TableId(value = "num", type = IdType.AUTO) private Long num; private Integer powerId; @ApiModelProperty(value = "记录时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date recordTime; private Float charOutVol; private Float charOutCurr; private Float groupVol; private Float groupCurr; private Float groupTmp; private Float busVol; private Float ac1Vola; private Float ac1Volb; private Float ac1Volc; private Float ac2Vola; private Float ac2Volb; private Float ac2Volc; private Float busVolPositive; private Float busVolNegative; private Float busResPositive; private Float busResNegative; private Integer charJunFloat; private Integer charOpenClose; private Integer charModelError; private Integer charOutOvervol; private Integer charOutLessvol; private Integer battOvervol; private Integer battLessvol; private Integer battMonOvervol; private Integer battMonLessvol; private Integer battState; private Integer controlBusOvervol; private Integer controlBusLessvol; private Integer insualBusVolError; private Integer controlBusPositiveError; private Integer controlBusNegativeError; private Integer insualBusAcvolOvervol; private Integer battPatrolDetectorError; private Integer insualError; private Integer acin2Qf21; private Integer acin2Qf22; private Integer charOutBusDk21; private Integer charOutBattDk22; private Integer battOutQf1; private Integer ac1Fault; private Integer ac2Fault; private Integer mainSwitchFault; private Integer feederTripFault; private Integer thunderFault; private Integer feedersCommFault; private Integer dcFeeder7to9Switch1; private Integer dcFeeder7Switch; private Integer dcFeeder7Bus1Zk21; private Integer dcFeeder7Bus2Zk22; private Integer dcFeeder8Switch; private Integer dcFeeder8Bus1Zk21; private Integer dcFeeder8Bus2Zk22; private Integer dcFeeder9Switch; private Integer dcFeeder9Bus1Zk21; private Integer dcFeeder9Bus2Zk22; private Integer acFeeder8Switch; private Integer acFeeder8Acin1Q11; private Integer acFeeder8Acin2Q12; private Integer acFeeder8Acin1Fault; private Integer acFeeder8Acin2Fault; private Integer insualCommFault; private Integer insualInsualFault; private Integer insualMiainCommFault; } src/main/java/com/whyc/pojo/PowerRealRt3.java
New file @@ -0,0 +1,86 @@ package com.whyc.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; /** * <p> * * </p> * * @author lxw * @since 2024-12-04 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName(schema = "db_power_rt",value = "tb_power_real_rt3") @ApiModel(value="PowerRealRt3对象", description="") public class PowerRealRt3 implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "自增主键") @TableId(value = "num", type = IdType.AUTO) private Long num; private Integer powerId; @ApiModelProperty(value = "记录时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date recordTime; private Float charOutVol; private Float charOutCurr; private Float ac1Vola; private Float ac1Volb; private Float ac1Volc; private Float ac2Vola; private Float ac2Volb; private Float ac2Volc; private Integer charJunFloat; private Integer charOpenClose; private Integer charModelError; private Integer charOutOvervol; private Integer charOutLessvol; private Integer acin3Qf31; private Integer acin3Qf32; private Integer charOutBatt1Dk31; private Integer charOutBatt2Dk31; private Integer ac1Fault; private Integer ac2Fault; private Integer mainSwitchFault; private Integer thunderFault; } src/main/java/com/whyc/pojo/StationInf.java
@@ -28,7 +28,7 @@ @TableField("stype") @ApiModelProperty("机房类型: 1<电池组> 2<电源>") @ApiModelProperty("机房类型: 0<包含电池组和电源>1<电池组> 2<电源>") private Integer stype; @TableField(exist = false) src/main/java/com/whyc/service/PowerBattRtService.java
New file @@ -0,0 +1,7 @@ package com.whyc.service; import org.springframework.stereotype.Service; @Service public class PowerBattRtService { } src/main/java/com/whyc/service/PowerInfService.java
New file @@ -0,0 +1,75 @@ package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.whyc.dto.Response; import com.whyc.mapper.*; import com.whyc.pojo.PowerBattRt; import com.whyc.pojo.PowerInf; import com.whyc.pojo.PowerRealRt1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class PowerInfService { @Autowired(required = false) private PowerInfMapper mapper; @Autowired(required = false) private PowerBattRtMapper powerRtmapper; @Autowired(required = false) private PowerRealRt1Mapper realRt1Mapper; @Autowired(required = false) private PowerRealRt2Mapper realRt2Mapper; @Autowired(required = false) private PowerRealRt3Mapper realRt3Mapper; //根据id获取电源信息 public Map<String,Object> getInfById(int powerId) { Map<String,Object> map=new HashMap<>(); QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("power_id",powerId); wrapper.last("limit 1"); PowerInf pinf=mapper.selectOne(wrapper); Integer devType=pinf.getDevType(); map.put("devType",devType); if(devType!=3){//第三种不包含单体实时 List<PowerBattRt> list=getBattRt(powerId); map.put("battRt",list); } Object obj=getRealRt(powerId,devType); map.put("realRt"+devType,obj); return map; } //获取电电源信息 private Object getRealRt(int powerId,int devType) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("power_id",powerId); wrapper.last("limit 1"); Object obj=null; if(devType==1){ obj=realRt1Mapper.selectOne(wrapper); } if(devType==2){ obj=realRt2Mapper.selectOne(wrapper); } if(devType==3){ obj=realRt3Mapper.selectOne(wrapper); } return obj; } //获取电源电池组信息 private List<PowerBattRt> getBattRt(int powerId) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("power_id",powerId); List<PowerBattRt> list=mapper.selectList(wrapper); return list; } } src/main/java/com/whyc/service/PowerRealRt1Service.java
New file @@ -0,0 +1,7 @@ package com.whyc.service; import org.springframework.stereotype.Service; @Service public class PowerRealRt1Service { } src/main/java/com/whyc/service/PowerRealRt2Service.java
New file @@ -0,0 +1,7 @@ package com.whyc.service; import org.springframework.stereotype.Service; @Service public class PowerRealRt2Service { } src/main/java/com/whyc/service/PowerRealRt3Service.java
New file @@ -0,0 +1,7 @@ package com.whyc.service; import org.springframework.stereotype.Service; @Service public class PowerRealRt3Service { } src/main/java/com/whyc/webSocket/PowerSocket.java
New file @@ -0,0 +1,126 @@ package com.whyc.webSocket; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.whyc.config.WebSocketConfig; import com.whyc.dto.Response; import com.whyc.factory.ThreadPoolExecutorFactory; import com.whyc.pojo.PowerInf; import com.whyc.pojo.RtState; import com.whyc.pojo.StationInf; import com.whyc.service.*; import com.whyc.util.ActionUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.http.HttpSession; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * packageName com.whyc.websocket * * @author lxw * @version JDK 8 * @className PowerSocket (此处以class为例) * @date 2024/6/15 * @description TODO */ @Component @ServerEndpoint(value = "/power", encoders = WebSocketEncoder.class) public class PowerSocket{ private Session session; private Thread thread; private volatile boolean runFlag = true; private volatile Map<String, Thread> threadMap = new HashMap<>(); private static final int executeTime = 5000; private static PowerInfService pinfService; private volatile Map<Long,Boolean> threadFlagMap = new HashMap<>(); @Autowired public void setPowerInfService(PowerInfService pinfService) { PowerSocket.pinfService = pinfService; } @OnOpen public void onOpen(Session session) { this.session = session; } @OnMessage public void onMessage(Session session, String message) { int powerId=Integer.valueOf(message); thread = new Thread("Thread_PowerSocket") { @Override public void run() { while (runFlag && !isInterrupted()) { Thread thread = currentThread(); threadFlagMap.put(thread.getId(), true); try { Map<String,Object> map=getPowerRt(powerId); if (session.isOpen()) { //推送信息 synchronized (session) { session.getBasicRemote().sendObject(new Response().set(1, map)); } threadFlagMap.put(thread.getId(), false); } sleep(executeTime); } catch (Exception e) { interrupt(); } } } }; thread.start(); threadFlagMap.put(thread.getId(),true); //停止老的socket线程 Thread threadBefore = threadMap.get(session.getId()); if(threadBefore !=null && threadBefore.isAlive()){ while (threadFlagMap.get(threadBefore.getId())){ } threadBefore.interrupt(); } //将线程存储,便于调用定位 threadMap.put(session.getId(), this.thread); } //获取电源的实时数据 private Map<String,Object> getPowerRt(int powerId) { Map<String,Object> map=pinfService.getInfById(powerId); return map; } @OnClose public void onClose(CloseReason closeReason){ System.err.println("closeReason = " + closeReason); runFlag = false; if (thread != null && thread.isAlive()) { thread.interrupt(); } threadMap.remove(session.getId()); } @OnError public void onError(Throwable error) { error.printStackTrace(); if (thread != null && thread.isAlive()) { thread.interrupt(); } threadMap.remove(session.getId()); } }