package com.dy.pipIrrRemote.monitor; 
 | 
  
 | 
import cn.hutool.core.date.DateUtil; 
 | 
import com.alibaba.fastjson2.JSON; 
 | 
import com.alibaba.fastjson2.JSONArray; 
 | 
import com.alibaba.fastjson2.JSONObject; 
 | 
import com.dy.common.mw.protocol.Command; 
 | 
import com.dy.common.mw.protocol.CommandBackParam; 
 | 
import com.dy.common.mw.protocol.rtuState.RtuStatus; 
 | 
import com.dy.common.util.DateTime; 
 | 
import com.dy.common.webUtil.BaseResponse; 
 | 
import com.dy.common.webUtil.QueryResultVo; 
 | 
import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper; 
 | 
import com.dy.pipIrrGlobal.rtuMw.CodeLocal; 
 | 
import com.dy.pipIrrGlobal.rtuMw.Web2RtuMw; 
 | 
import com.dy.pipIrrGlobal.voPr.VoOnLineIntake; 
 | 
import lombok.extern.slf4j.Slf4j; 
 | 
import org.apache.dubbo.common.utils.PojoUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.core.env.Environment; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.web.client.RestTemplate; 
 | 
  
 | 
import java.text.DateFormat; 
 | 
import java.time.format.DateTimeFormatter; 
 | 
import java.util.HashMap; 
 | 
import java.util.List; 
 | 
import java.util.Map; 
 | 
  
 | 
/** 
 | 
 * @Author: liurunyu 
 | 
 * @Date: 2024/10/23 11:32 
 | 
 * @Description 
 | 
 */ 
 | 
@Slf4j 
 | 
@Service 
 | 
public class MonitorSv extends Web2RtuMw { 
 | 
  
 | 
    @Autowired 
 | 
    private PrIntakeMapper prIntakeMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private Environment env; 
 | 
  
 | 
    @Autowired 
 | 
    private RestTemplate restTemplate; 
 | 
  
 | 
    /** 
 | 
     * 查询设备是否在线 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public Boolean isOnLine4Rtu(String devId) { 
 | 
        return selectOnOrOffLine4Rtu(devId) ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询设备是否在线 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public Boolean isOnLine4Mqtt(String devId) { 
 | 
        return selectOnOrOffLine4Mqtt(devId) ; 
 | 
    } 
 | 
    /** 
 | 
     * 获取已经绑定控制器的取水口列表(并标记在线与不在线) 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public QueryResultVo<List<VoOnLineIntake>> selectOnLineIntakes(QueryVo vo) { 
 | 
        if(vo.getIsOnLine() == null){ 
 | 
            //不区分在线与离线 
 | 
            return selectIntakesIgnoreOnOffLine(vo) ; 
 | 
        }else{ 
 | 
            //在线 或 离线 
 | 
            return selectIntakesOnOrOffLine(vo) ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询RTU在通信中间件中的状态 
 | 
     * @param rtuAddr 
 | 
     * @return 
 | 
     */ 
 | 
    public RtuStatus rtuStatus(String rtuAddr) throws Exception{ 
 | 
        //向通信中间件发关命令,查询部分RTU在线情况 
 | 
        RtuStatus rtuStatus = null ; 
 | 
        Command com = this.createInnerCommand(CodeLocal.oneRtuStates); 
 | 
        com.setParam(rtuAddr) ; 
 | 
        String rqUrl = this.get2MwRequestUrl(this.env, ContextComSend) ; 
 | 
        BaseResponse res = sendPostRequest2Mw(restTemplate, rqUrl, com) ; 
 | 
        if(res != null){ 
 | 
            if(res.isSuccess()){ 
 | 
                Command reCom = JSON.parseObject(res.getContent() == null ? null : JSON.toJSONString(res.getContent()), Command.class) ; 
 | 
                CommandBackParam bakParam = JSON.parseObject((reCom== null || reCom.param == null) ? null : JSON.toJSONString(reCom.param), CommandBackParam.class) ; 
 | 
                if(bakParam != null){ 
 | 
                    if(bakParam.getSuccess().booleanValue()){ 
 | 
                        //通信中间件成功返回命令结果 
 | 
                        if(reCom.getAttachment() != null){ 
 | 
                            rtuStatus = JSON.parseObject(JSON.toJSONString(reCom.getAttachment()), RtuStatus.class); 
 | 
                        }else{ 
 | 
                            throw new Exception("通信中间件未掌握该RTU的状态,可能该RTU未上线") ; 
 | 
                        } 
 | 
                    } 
 | 
                }else{ 
 | 
                    log.error("通信中间件返回内部命令结果中不包含CommandBackParam类型参数"); 
 | 
                    throw new Exception("通信中间件执行命令出错") ; 
 | 
                } 
 | 
            }else{ 
 | 
                log.error("通信中间件返回内部命令执行失败" + (res.getMsg() == null? "" : ("," + res.getMsg()))) ; 
 | 
                throw new Exception("通信中间件执行命令出错" + (res.getMsg() == null? "" : ("," + res.getMsg()))) ; 
 | 
            } 
 | 
        }else{ 
 | 
            log.error("通信中间件返回内部命令结果为null"); 
 | 
            throw new Exception("通信中间件执行命令出错,返回内部命令结果为null") ; 
 | 
        } 
 | 
        return rtuStatus ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询取水口,不限制在线与离线状态 
 | 
     * @param vo 
 | 
     * @return 
 | 
     */ 
 | 
    private QueryResultVo<List<VoOnLineIntake>> selectIntakesIgnoreOnOffLine(QueryVo vo) { 
 | 
        QueryResultVo<List<VoOnLineIntake>> rsVo = this.queryDb(vo) ; 
 | 
        if(rsVo != null && rsVo.obj != null && (rsVo.obj.size() > 0)){ 
 | 
            String rtuAddrs = "" ; 
 | 
            boolean first = true ; 
 | 
            for(VoOnLineIntake rVo : rsVo.obj){ 
 | 
                if(first){ 
 | 
                    first = false ; 
 | 
                    rtuAddrs += rVo.getRtuAddr() ; 
 | 
                }else{ 
 | 
                    rtuAddrs += "," + rVo.getRtuAddr() ; 
 | 
                } 
 | 
            } 
 | 
            //向通信中间件发关命令,查询部分RTU在线情况 
 | 
            Command com = this.createInnerCommand(CodeLocal.onLinePart); 
 | 
            com.setParam(rtuAddrs) ; 
 | 
            String rqUrl = this.get2MwRequestUrl(this.env, ContextComSend) ; 
 | 
            BaseResponse res = sendPostRequest2Mw(restTemplate, rqUrl, com) ; 
 | 
            if(res != null){ 
 | 
                if(res.isSuccess()){ 
 | 
                    Command reCom = JSON.parseObject(res.getContent() == null ? null : JSON.toJSONString(res.getContent()), Command.class) ; 
 | 
                    CommandBackParam bakParam = JSON.parseObject((reCom== null || reCom.param == null) ? null : JSON.toJSONString(reCom.param), CommandBackParam.class) ; 
 | 
                    if(bakParam != null){ 
 | 
                        if(bakParam.getSuccess().booleanValue()){ 
 | 
                            //通信中间件成功返回命令结果 
 | 
                            HashMap<String, Boolean> onLineMap = JSON.parseObject(JSON.toJSONString(reCom.getAttachment()), HashMap.class); 
 | 
                            for(VoOnLineIntake rVo : rsVo.obj){ 
 | 
                                if(onLineMap.containsKey(rVo.getRtuAddr())) { 
 | 
                                    rVo.setIsOnLine(onLineMap.get(rVo.getRtuAddr())); 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                    }else{ 
 | 
                        log.error("通信中间件返回内部命令结果中不包含CommandBackParam类型参数"); 
 | 
                    } 
 | 
                }else{ 
 | 
                    log.error("通信中间件返回内部命令执行失败" + (res.getMsg() == null? "" : ("," + res.getMsg()))) ; 
 | 
                } 
 | 
            }else{ 
 | 
                log.error("通信中间件返回内部命令结果为null"); 
 | 
            } 
 | 
        } 
 | 
        return rsVo; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 查询RTU在线或离线状态 
 | 
     * @param rtuAddr 
 | 
     * @return 
 | 
     */ 
 | 
    private Boolean selectOnOrOffLine4Rtu(String rtuAddr) { 
 | 
        //向通信中间件发关命令,查询部分RTU在线情况 
 | 
        Command com = this.createInnerCommand(CodeLocal.onPartLineMqtt); 
 | 
        com.setParam(rtuAddr) ; 
 | 
        String rqUrl = this.get2MwRequestUrl(this.env, ContextComSend) ; 
 | 
        BaseResponse res = sendPostRequest2Mw(restTemplate, rqUrl, com) ; 
 | 
        if(res != null){ 
 | 
            if(res.isSuccess()){ 
 | 
                Command reCom = JSON.parseObject(res.getContent() == null ? null : JSON.toJSONString(res.getContent()), Command.class) ; 
 | 
                CommandBackParam bakParam = JSON.parseObject((reCom== null || reCom.param == null) ? null : JSON.toJSONString(reCom.param), CommandBackParam.class) ; 
 | 
                if(bakParam != null){ 
 | 
                    if(bakParam.getSuccess().booleanValue()){ 
 | 
                        //通信中间件成功返回命令结果 
 | 
                        HashMap<String, Boolean> onLineMap = JSON.parseObject(JSON.toJSONString(reCom.getAttachment()), HashMap.class); 
 | 
                        Boolean flag = onLineMap.get(rtuAddr); 
 | 
                        if(flag != null){ 
 | 
                            return flag ; 
 | 
                        } 
 | 
                    } 
 | 
                }else{ 
 | 
                    log.error("通信中间件返回内部命令结果中不包含CommandBackParam类型参数"); 
 | 
                } 
 | 
            }else{ 
 | 
                log.error("通信中间件返回内部命令执行失败" + (res.getMsg() == null? "" : ("," + res.getMsg()))) ; 
 | 
            } 
 | 
        }else{ 
 | 
            log.error("通信中间件返回内部命令结果为null"); 
 | 
        } 
 | 
        return null ; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 查询MQTT在线或离线状态 
 | 
     * @param devId 
 | 
     * @return 
 | 
     */ 
 | 
    private Boolean selectOnOrOffLine4Mqtt(String devId) { 
 | 
        //向通信中间件发关命令,查询部分RTU在线情况 
 | 
        Command com = this.createInnerCommand(CodeLocal.onPartLineMqtt); 
 | 
        com.setParam(devId) ; 
 | 
        String rqUrl = this.get2MwRequestUrl(this.env, ContextComSend) ; 
 | 
        BaseResponse res = sendPostRequest2Mw(restTemplate, rqUrl, com) ; 
 | 
        if(res != null){ 
 | 
            if(res.isSuccess()){ 
 | 
                Command reCom = JSON.parseObject(res.getContent() == null ? null : JSON.toJSONString(res.getContent()), Command.class) ; 
 | 
                CommandBackParam bakParam = JSON.parseObject((reCom== null || reCom.param == null) ? null : JSON.toJSONString(reCom.param), CommandBackParam.class) ; 
 | 
                if(bakParam != null){ 
 | 
                    if(bakParam.getSuccess().booleanValue()){ 
 | 
                        //通信中间件成功返回命令结果 
 | 
                        HashMap<String, Boolean> onLineMap = JSON.parseObject(JSON.toJSONString(reCom.getAttachment()), HashMap.class); 
 | 
                        Boolean flag = onLineMap.get(devId); 
 | 
                        if(flag != null){ 
 | 
                            return flag ; 
 | 
                        } 
 | 
                    } 
 | 
                }else{ 
 | 
                    log.error("通信中间件返回内部命令结果中不包含CommandBackParam类型参数"); 
 | 
                } 
 | 
            }else{ 
 | 
                log.error("通信中间件返回内部命令执行失败" + (res.getMsg() == null? "" : ("," + res.getMsg()))) ; 
 | 
            } 
 | 
        }else{ 
 | 
            log.error("通信中间件返回内部命令结果为null"); 
 | 
        } 
 | 
        return null ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询取水口,在线或离线状态 
 | 
     * @param vo 
 | 
     * @return 
 | 
     */ 
 | 
    private QueryResultVo<List<VoOnLineIntake>> selectIntakesOnOrOffLine(QueryVo vo) { 
 | 
        //向通信中间件发关命令,查询部分RTU在线情况 
 | 
        Command com = this.createInnerCommand(CodeLocal.onLineAll); 
 | 
        String rqUrl = this.get2MwRequestUrl(this.env, ContextComSend) ; 
 | 
        BaseResponse res = sendPostRequest2Mw(restTemplate, rqUrl, com) ; 
 | 
        if(res != null){ 
 | 
            if(res.isSuccess()){ 
 | 
                Command reCom = JSON.parseObject(res.getContent() == null ? null : JSON.toJSONString(res.getContent()), Command.class) ; 
 | 
                CommandBackParam bakParam = JSON.parseObject((reCom== null || reCom.param == null) ? null : JSON.toJSONString(reCom.param), CommandBackParam.class) ; 
 | 
                if(bakParam != null){ 
 | 
                    if(bakParam.getSuccess().booleanValue()){ 
 | 
                        //通信中间件成功返回命令结果 
 | 
                        HashMap<String, Boolean> onLineMap = JSON.parseObject(JSON.toJSONString(reCom.getAttachment()), HashMap.class); 
 | 
                        JSONArray jsonArray = new JSONArray(); 
 | 
                        for (Map.Entry<String, Boolean> entry : onLineMap.entrySet()) { 
 | 
                            JSONObject jsonObject = new JSONObject(); 
 | 
                            jsonObject.put("rtuAddr", entry.getKey()); 
 | 
                            jsonObject.put("isOnLine", entry.getValue()); 
 | 
                            jsonArray.add(jsonObject); 
 | 
                        } 
 | 
                        vo.setOnLineMap(jsonArray.toJSONString()); 
 | 
                    } 
 | 
                }else{ 
 | 
                    log.error("通信中间件返回内部命令结果中不包含CommandBackParam类型参数"); 
 | 
                } 
 | 
            }else{ 
 | 
                log.error("通信中间件返回内部命令执行失败" + (res.getMsg() == null? "" : ("," + res.getMsg()))) ; 
 | 
            } 
 | 
        }else{ 
 | 
            log.error("通信中间件返回内部命令结果为null"); 
 | 
        } 
 | 
  
 | 
        return this.queryDb(vo) ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 查询数据库 
 | 
     * @param vo 
 | 
     * @return 
 | 
     */ 
 | 
    private QueryResultVo<List<VoOnLineIntake>> queryDb(QueryVo vo){ 
 | 
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo); 
 | 
        Long itemTotal = prIntakeMapper.selectIntakesCountForOnLine(params); 
 | 
  
 | 
        QueryResultVo<List<VoOnLineIntake>> rsVo = new QueryResultVo<>(); 
 | 
        rsVo.pageSize = vo.pageSize; 
 | 
        rsVo.pageCurr = vo.pageCurr; 
 | 
        rsVo.calculateAndSet(itemTotal, params); 
 | 
        List<VoOnLineIntake> records = prIntakeMapper.selectIntakesForOnLine(params) ; 
 | 
        rsVo.obj = records ; 
 | 
        for(VoOnLineIntake rVo : records){ 
 | 
            if(rVo.getAlarm() != null && !rVo.getAlarm().trim().equals("") && rVo.getAlarm().endsWith(",")){ 
 | 
                if(rVo.getAlarmDt() != null){ 
 | 
                    rVo.setAlarm(rVo.getAlarm().substring(0, rVo.getAlarm().length() - 1) + "\n" + DateTime.yyyy_MM_dd_HH_mm_ss(rVo.getAlarmDt()) ) ; 
 | 
                }else{ 
 | 
                    rVo.setAlarm(rVo.getAlarm().substring(0, rVo.getAlarm().length() - 1)) ; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return rsVo ; 
 | 
    } 
 | 
  
 | 
} 
 |