whycxzp
2021-03-27 93ef112510f1840d8a26a2429984387313cf0a33
更新 设备实时状态
10个文件已添加
6个文件已修改
409 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/DynamicLoadStateController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/Electric2MWStateController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/ElectricStateController.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/MotorStateController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/DynamicLoadStateMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/Electric2MWStateMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/ElectricStateMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/DynamicLoadStateRt.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/Electric2MWState.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/ElectricState.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/DynamicLoadStateService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/Electric2MWStateService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/ElectricStateService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/swagger/SwaggerConfig4Knife.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/timer/Timer.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/ws/DeviceWebSocket.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/DynamicLoadStateController.java
New file
@@ -0,0 +1,24 @@
package com.whyc.controller;
import com.whyc.dto.Response;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 交流电阻负载-状态
 */
@RestController
@RequestMapping("dynamicLoadState")
@Api(tags = "交流电阻负载-状态")
public class DynamicLoadStateController {
    @GetMapping("ws")
    @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId")
    public Response doc(){
        return new Response().setMsg(1,"查看接口描述");
    }
}
src/main/java/com/whyc/controller/Electric2MWStateController.java
New file
@@ -0,0 +1,24 @@
package com.whyc.controller;
import com.whyc.dto.Response;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 交流电阻负载-状态
 */
@RestController
@RequestMapping("electric2MWState")
@Api(tags = "3号大功率整流电源-状态")
public class Electric2MWStateController {
    @GetMapping("ws")
    @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId")
    public Response doc(){
        return new Response().setMsg(1,"查看接口描述");
    }
}
src/main/java/com/whyc/controller/ElectricStateController.java
New file
@@ -0,0 +1,24 @@
package com.whyc.controller;
import com.whyc.dto.Response;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 交流电阻负载-状态
 */
@RestController
@RequestMapping("electricState")
@Api(tags = "1号,2号大功率整流电源-状态")
public class ElectricStateController {
    @GetMapping("ws")
    @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId")
    public Response doc(){
        return new Response().setMsg(1,"查看接口描述");
    }
}
src/main/java/com/whyc/controller/MotorStateController.java
@@ -12,8 +12,8 @@
import javax.annotation.Resource;
@RestController
@RequestMapping("motor")
@Api(tags = "电机")
@RequestMapping("motorState")
@Api(tags = "电机-状态")
@Slf4j
public class MotorStateController {
    @Resource
@@ -45,4 +45,10 @@
        return motorStateService.getAll(pageNum,pageSize);
    }
    @GetMapping("ws")
    @ApiOperation(value="查询webSocket",protocols = "ws",notes = "接口:ws://localhost:8090/websocket,发送消息为deviceId")
    public Response doc(){
        return new Response().setMsg(1,"查看接口描述");
    }
}
src/main/java/com/whyc/mapper/DynamicLoadStateMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.DynamicLoadStateRt;
public interface DynamicLoadStateMapper extends CustomMapper<DynamicLoadStateRt> {
}
src/main/java/com/whyc/mapper/Electric2MWStateMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.Electric2MWState;
public interface Electric2MWStateMapper extends CustomMapper<Electric2MWState> {
}
src/main/java/com/whyc/mapper/ElectricStateMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.ElectricState;
public interface ElectricStateMapper extends CustomMapper<ElectricState> {
}
src/main/java/com/whyc/pojo/DynamicLoadStateRt.java
@@ -1,5 +1,6 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.ibatis.type.Alias;
@@ -7,7 +8,7 @@
import java.util.Date;
/**
 * 动态负载状态实时
 * 水冷交流电阻负载-状态
 */
@Alias("DynamicLoadStateRt")
@TableName(schema = "db_experiment",value = "tb_dynamicload_state_rt")
@@ -28,12 +29,19 @@
    Float     actualCurr        ; //实际电流
    Float     actualMov         ; //实际电压
    Integer       switchOn          ; //是否合闸
    @TableField("FZ_autostate1")
    Integer       FZAutoState1      ; //FZ自动状态1
    @TableField("FZ_autostate2")
    Integer       FZAutoState2      ; //FZ自动状态2
    @TableField("FZ_autostate3")
    Integer       FZAutoState3      ; //FZ自动状态3
    @TableField("FZ_autostate4")
    Integer       FZAutoState4      ; //FZ自动状态4
    @TableField("FZ_autostate5")
    Integer       FZAutoState5      ; //FZ自动状态5
    @TableField("react_overtem")
    Integer       reactOverTem      ; //电抗超温
    @TableField("water_overtem")
    Integer       waterOverTem      ; //冷却水超温
    Integer       waterLevelLow    ; //冷却水液位低
    Integer       waterPressureHigh; //冷却水压高
src/main/java/com/whyc/pojo/Electric2MWState.java
@@ -1,5 +1,6 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.ibatis.type.Alias;
@@ -7,35 +8,56 @@
import java.util.Date;
/**
 * TODO:电子2mw状态
 * 3号大功率整流电源-状态
 */
@Alias("Electric2MWState")
@TableName(schema = "db_experiment",value = "tb_electric2mw_state")
public class Electric2MWState {
    Long           num;
    @TableField("electric2KW_id")
    Integer        electric2KWId;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "Asia/Shanghai")
    Date           recordTime;
    @TableField("brachdcvol")
    Float          branchDCVol             ; // 分直流电压
    @TableField("brachdccurr")
    Float          branchDCCurr            ; // 分直流电流
    @TableField("alldcvol")
    Float          allDCVol               ; // 总直流电压
    @TableField("alldccurr")
    Float          allDCCurr              ; // 总直流电流
    @TableField("stopchargevol_one")
    Float          stopChargeVolOne      ; // 第1阶段充电终止电压
    @TableField("stopchargevol_two")
    Float          stopChargeVolTwo      ; // 第2阶段充电终止电压
    @TableField("stopchargevol_three")
    Float          stopChargeVolThree    ; // 第3阶段充电终止电压
    @TableField("stopchargevol_four")
    Float          stopChargeVolFour     ; // 第4阶段充电终止电压
    @TableField("stopchargevol_five")
    Float          stopChargeVolFive     ; // 第5阶段充电终止电压
    @TableField("controlangle")
    Float          controlAngle           ; // 控制角
    @TableField("localgivevol")
    Float          localGiveVol           ; // 当前给定电压
    @TableField("volset")
    Float          VolSet                 ; // 电压设定值
    @TableField("localgivecurr")
    Float          localGiveCurr          ; // 当前给定电流
    @TableField("currset")
    Float          CurrSet                ; // 电流设定值
    @TableField("chargecurr_one")
    Float          ChargeCurrOne         ; // 第1阶段充电电流值
    @TableField("chargecurr_two")
    Float          ChargeCurrTwo         ; // 第2阶段充电电流值
    @TableField("chargecurr_three")
    Float          ChargeCurrThree       ; // 第3阶段充电电流值
    @TableField("chargecurr_four")
    Float          ChargeCurrFour        ; // 第4阶段充电电流值
    @TableField("chargecurr_five")
    Float          ChargeCurrFive        ; // 第5阶段充电电流值
    @TableField("consvolmode_chargecurr")
    Float          consVolModeChargeCurr ; // 转为恒压模式充电电压值
    String        note                   ; // 备用
src/main/java/com/whyc/pojo/ElectricState.java
@@ -1,5 +1,6 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.ibatis.type.Alias;
@@ -7,7 +8,7 @@
import java.util.Date;
/**
 * TODO:电子设备状态
 * 1号,2号大功率整流电源-状态
 */
@Alias("ElectricState")
@TableName(schema = "db_experiment",value = "tb_electric_state")
@@ -23,12 +24,16 @@
    Integer       stopButton                  ; //急停按钮
    Integer       mainCabinetFanStatus      ; //主柜风机状态
    Integer       transCabinetDoorLock      ; //变压器柜门连锁
    @TableField("trans_cabinet_overtem_alarm")
    Integer       transCabinetOverTemAlarm  ; //变压器超温报警
    @TableField("trans_cabinet_overtem_trip")
    Integer       transCabinetOverTemTrip   ; //变压器超温跳闸
    Integer       qs1State                    ; //QS1状态
    Integer       qs2State                    ; //QS2状态
    Integer       switchCabinetDoorStatus   ; //转换开关柜门状态
    @TableField("alldcvol")
    Float         allDCVol                     ; //总直流电压
    @TableField("alldccurr")
    Float         allDCCurr                    ; //总直流电流
    Integer       connFlag                    ; //串/并联状态
    String   note;
src/main/java/com/whyc/service/DynamicLoadStateService.java
New file
@@ -0,0 +1,24 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.whyc.dto.Response;
import com.whyc.mapper.DynamicLoadStateMapper;
import com.whyc.pojo.DynamicLoadStateRt;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class DynamicLoadStateService {
    @Resource
    private DynamicLoadStateMapper mapper;
    public Response<DynamicLoadStateRt> get(Integer deviceId){
        QueryWrapper<DynamicLoadStateRt> wrapper = Wrappers.query();
        wrapper.eq("dev_id",deviceId).last("limit 1");
        DynamicLoadStateRt dynamicLoadStateRt = mapper.selectOne(wrapper);
        return new Response<DynamicLoadStateRt>().set(1,dynamicLoadStateRt);
    }
}
src/main/java/com/whyc/service/Electric2MWStateService.java
New file
@@ -0,0 +1,26 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.whyc.dto.Response;
import com.whyc.mapper.Electric2MWStateMapper;
import com.whyc.mapper.ElectricStateMapper;
import com.whyc.pojo.Electric2MWState;
import com.whyc.pojo.ElectricState;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class Electric2MWStateService {
    @Resource
    private Electric2MWStateMapper mapper;
    public Response<Electric2MWState> get(Integer deviceId){
        QueryWrapper<Electric2MWState> wrapper = Wrappers.query();
        wrapper.eq("electric2KW_id",deviceId).last("limit 1");
        Electric2MWState electricState = mapper.selectOne(wrapper);
        return new Response<Electric2MWState>().set(1,electricState);
    }
}
src/main/java/com/whyc/service/ElectricStateService.java
New file
@@ -0,0 +1,26 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.whyc.dto.Response;
import com.whyc.mapper.DynamicLoadStateMapper;
import com.whyc.mapper.ElectricStateMapper;
import com.whyc.pojo.DynamicLoadStateRt;
import com.whyc.pojo.ElectricState;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class ElectricStateService {
    @Resource
    private ElectricStateMapper mapper;
    public Response<ElectricState> get(Integer deviceId){
        QueryWrapper<ElectricState> wrapper = Wrappers.query();
        wrapper.eq("electric_id",deviceId).last("limit 1");
        ElectricState electricState = mapper.selectOne(wrapper);
        return new Response<ElectricState>().set(1,electricState);
    }
}
src/main/java/com/whyc/swagger/SwaggerConfig4Knife.java
@@ -22,7 +22,7 @@
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("半仿真试验系统")
                .groupName("实验室仿真系统")
                .select()
                .apis(RequestHandlerSelectors.any())
                .apis(RequestHandlerSelectors.basePackage("com.whyc.controller"))
@@ -31,9 +31,9 @@
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("半仿真试验系统")               //大标题 title
                .title("实验室仿真系统")               //大标题 title
                .contact(new Contact("PerryHsu","todo","todo"))
                .description("半仿真试验系统")             //小标题
                .description("实验室仿真系统")             //小标题
                .version("1.0")                           //版本
//                .termsOfServiceUrl("http://xxx.xxx.com")    //终端服务程序
//                .license("LICENSE")                         //链接显示文字
src/main/java/com/whyc/timer/Timer.java
@@ -15,7 +15,7 @@
@EnableScheduling
public class Timer {
    @Scheduled(cron = "0/60 * * * * *")
    //@Scheduled(cron = "0/60 * * * * *")
    public void timer1() {
        //获取当前时间
        LocalDateTime localDateTime = LocalDateTime.now();
src/main/java/com/whyc/ws/DeviceWebSocket.java
New file
@@ -0,0 +1,184 @@
package com.whyc.ws;
import com.whyc.dto.Response;
import com.whyc.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
/**
 * webSocket实现与客户端消息交互
 *
 * 页面端,三个电源数据的实时监控,可以在打开第一个电源实时页面的时候,触发ws连接开启,点中某个电源时,页面ws发送message:传入参数:实时类型和电源id.
 * 一个WsSession一次开启ws,ws连接其实与http极为相似
 */
@ServerEndpoint(value = "/websocket",encoders = WebSocketEncoder.class)
@Component
public class DeviceWebSocket {
    private static DynamicLoadStateService dynamicLoadStateService;
    private static MotorStateService motorStateService;
    private static ElectricStateService electricStateService;
    private static Electric2MWStateService electric2MWStateService;
    @Autowired
    public void setDynamicLoadStateService(DynamicLoadStateService dynamicLoadStateService) {
        DeviceWebSocket.dynamicLoadStateService = dynamicLoadStateService;
    }
    @Autowired
    public void setMotorStateService(MotorStateService motorStateService) {
        DeviceWebSocket.motorStateService = motorStateService;
    }
    @Autowired
    public void setElectricStateService(ElectricStateService electricStateService) {
        DeviceWebSocket.electricStateService = electricStateService;
    }
    @Autowired
    public void setElectric2MWStateService(Electric2MWStateService electric2MWStateService) {
        DeviceWebSocket.electric2MWStateService = electric2MWStateService;
    }
    private Integer userId;
    //concurrent包的线程安全,用来存放每个客户端对应的MyWebSocket对象。
    //若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
//    private static Map<String, WebSocket> webSockets = new ConcurrentHashMap<>();
    private static CopyOnWriteArraySet<DeviceWebSocket> webSockets = new CopyOnWriteArraySet<>();
    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;
    /**
     * 连接建立成功调用的方法
     *
     * @param session    可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("websocket1...");
        this.session = session;
        webSockets.add(this);
    }
    /**
     * 收到客户端消息后调用的方法
     * 连续监控到3次消息,会启动3个线程,这样导致 ws到页面 是3个响应数据;所以需要关闭ws后再打开ws 或者...
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message,Session session) {
        try {
            this.sendMessage(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
        /*try {
            this.sendMessage(message);
        } catch (IOException e) {
            e.printStackTrace();
        }*/
        /*System.out.println(session.getId());
        final String powerDeviceId = message;
        final Session sessionThread = session;
        Thread thread = new Thread("Thread_PowerACDCData"){
            @Override
            public void run() {
                while (true) {
                    try {
                        sleep(4000);
                        //获取powerACData记录
                        ServiceModel model =service.get(powerDeviceId);
                        if(sessionThread.isOpen()) {
                            sessionThread.getBasicRemote().sendObject(model);
                        }else{
                            break;
                        }
                    } catch (IOException | InterruptedException | EncodeException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        thread.start();*/
        /*//群发消息
        for(PowerACDCDataWebSocket item: webSockets){
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }*/
    }
    /**
     * 该方法没有用注解,是根据自己需要添加的方法。在自己的业务中调用,发送消息给前端。
     */
    public void sendMessage(String deviceId) throws IOException{
        Thread thread = new Thread("Thread_DeviceManage"){
            @Override
            public void run() {
                while (true) {
                    try {
                        Response model = null;
                        //获取记录
                        if(deviceId.startsWith("1")) {
                            model = dynamicLoadStateService.get(Integer.parseInt(deviceId));
                        }
                        else if(deviceId.startsWith("2")) {
                            model = motorStateService.getById(Integer.parseInt(deviceId));
                        }
                        else if(deviceId.startsWith("3")) {
                            model = electricStateService.get(Integer.parseInt(deviceId));
                        }
                        else if(deviceId.startsWith("4")) {
                            model = electric2MWStateService.get(Integer.parseInt(deviceId));
                        }
                        if(session.isOpen()) {
                            session.getBasicRemote().sendObject(model);
                        }else{
                            break;
                        }
                        sleep(4000);
                    } catch (IOException | InterruptedException | EncodeException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        thread.start();
    }
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose() {
        System.out.println("closing");
        webSockets.remove(this);
    }
    /**
     * 发生错误时调用
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("发生错误");
        error.printStackTrace();
    }
}