Newer
Older
smartwell_demos / src / main / java / com / casic / service / impl / ThirdDataServiceImpl.java
chaizhuang on 29 Aug 2023 8 KB 中石化thingsboard,联调bug
package com.casic.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.casic.dao.AlarmRecordMapper;
import com.casic.dao.DataH2sMapper;
import com.casic.enums.H2sParamsEnum;
import com.casic.model.AlarmRecord;
import com.casic.model.DataH2s;
import com.casic.service.ThirdDataService;
import com.casic.util.RedisCommon;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Slf4j
@RequiredArgsConstructor
public class ThirdDataServiceImpl extends ServiceImpl<DataH2sMapper, DataH2s> implements ThirdDataService, H2sParamsEnum {

    private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
    private final RedisCommon redisCommon;
    private final AlarmRecordMapper alarmRecordMapper;

    @Override
    public Object h2sData(Map<String, String> h2sDataMap) {
        try {
            if (h2sDataMap.containsKey(ICCID)) {
                //开机上报->存储映射管理->查询是否有下发配置-进行回应
                return powerOnReport(h2sDataMap);
            } else if (h2sDataMap.containsKey(H2S_VALUE)) {                //数据上报
                if (ObjectUtils.isNotEmpty(h2sDataMap.get(DEVCODE))) {
                    //清除离线-清除报警-报警-存库-查询是否有下发配置-进行回应
                    return dataSave(h2sDataMap);
                }
            }
        } catch (DataAccessException dae) {
            log.error("设备上报数据异常,设备传入的json是{},异常信息{}", dae.getMessage());
        }
        return defaultDeliveryConfig(null);
    }


    private Map<String, Object> defaultDeliveryConfig(Map<String, Object> configDataMap) {
        Map<String, Object> map = new HashMap();
        //必带参数,否则会被thingsboard舍弃
        map.put("method", "setParams");
        //判断是否有下发配置必须
        map.put("status", ObjectUtils.isNotEmpty(configDataMap) ? 200 : 201);
        map.put("params", configDataMap);
        //可省略
        map.put("timeout", "3000");
        return map;
    }

    /**
     * 开机上报->储存,是否有下发配置,选择合适的格式返回
     *
     * @param h2sDataMap
     */
    private Map<String, Object> powerOnReport(Map<String, String> h2sDataMap) {
        /**
         * 三码上报
         */
        String iccid = (String) h2sDataMap.get(ICCID);
        String imei = (String) h2sDataMap.get(IMEI);
        String devcode = (String) h2sDataMap.get(DEVCODE);
        //清除离线
        this.baseMapper.clearOnline(devcode);
        //先查,是否有数据,有数据直接覆盖,否则插入数据
        String isImei = this.baseMapper.getImeiByDevcode(devcode);
        int save = StringUtils.isEmpty(isImei) ? this.baseMapper.addImeiDevcode(devcode, imei, iccid) :
                this.baseMapper.updateImeiDevcode(devcode, imei, iccid);
        if (save > 0) {
            //保存三码关系
            Map<String, Object> configDataMap = redisCommon.getMsg((String) h2sDataMap.get(DEVCODE));
            if (ObjectUtils.isNotEmpty(configDataMap)) {
                return defaultDeliveryConfig(configDataMap);
            }
        } else {
            throw new RuntimeException("三码上传保存异常,异常数据为" + JSON.toJSON(h2sDataMap));
        }
        return defaultDeliveryConfig(null);
    }

    private Map<String, Object> dataSave(Map<String, String> h2sDataMap) {
        DataH2s dataH2s = initH2sData(h2sDataMap);
        this.baseMapper.clearOnline((String) h2sDataMap.get(DEVCODE));
        if (ObjectUtils.isNotEmpty(dataH2s)) {
            checkAlarm(dataH2s);
            Map<String, Object> configDataMap = redisCommon.getMsg((String) h2sDataMap.get(DEVCODE));
            if (ObjectUtils.isNotEmpty(configDataMap)) {
                return defaultDeliveryConfig(configDataMap);
            }
        }
        return defaultDeliveryConfig(null);
    }

    private DataH2s initH2sData(Map<String, String> h2sDataMap) {
        DataH2s dataH2s = new DataH2s();
        String devcode = (String) h2sDataMap.get(DEVCODE);
        String wellCode = this.baseMapper.getWellCode(devcode);
        dataH2s.setWellCode(wellCode);
        dataH2s.setDevcode(devcode);
        dataH2s.setStrength((String) h2sDataMap.get(H2S_VALUE));
        dataH2s.setCell((String) h2sDataMap.get(BATTERY_VALUE));
        dataH2s.setUptime(dateFormat.format(new Date()));
        dataH2s.setLogtime(dateFormat.format(new Date()));
        this.baseMapper.insert(dataH2s);
        return dataH2s;
    }

    /**
     * 检查是否有报警
     *
     * @param dataH2s
     */
    private void checkAlarm(DataH2s dataH2s) {
        final Float ruleValue = this.baseMapper.getRuleValue("24");
        if (ruleValue == null) {
            return;
        }
        if (!StringUtils.isEmpty(dataH2s.getStrength()) && !"null".equals(dataH2s.getStrength())) {
            String status = "3";
            if (Float.valueOf(dataH2s.getStrength()) > ruleValue) {
                //因新的报警消警   “0”
                status = "0";
                alarmRecordMapper.insert(buildAlarmRecord(dataH2s));
            }
            this.baseMapper.cancelAlarm(dataH2s.getDevcode(), status);
        }
    }

    private AlarmRecord buildAlarmRecord(DataH2s dataH2s) {
        AlarmRecord alarmRecord = AlarmRecord.builder()
                .devcode(dataH2s.getDevcode())
                .wellCode(dataH2s.getWellCode())
                .alarmType(dataH2s.getStrength())
                .alarmMessage("浓度超限")
                .deviceId(dataH2s.getId())
                .alarmType("1")
                .alarmContent("浓度超限")
                .status("1")
                .build();
        return alarmRecord;
    }

    // "在2023年1月12号 16时43分23秒,设备41232561发生了压力超标/浓度超限,数值为20"
    //                        + "设备" + devcode + "发生了压力超标,压力值为" + presss
    private void alarmPushBuilder(String devcode, String presss) {
//        ResponseData responseData = (ResponseData) alarmPushService.getAlarmPush("H2S");
//        AlarmPushConfig alarmPushConfig = (AlarmPushConfig) responseData.getData();
//        if (alarmPushConfig.getEnable().equals(1)) {
//            if (alarmPushConfig.getWebsocketAlarm().equals(1)) {
//                String msg = "在" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ","
//                        + "设备" + devcode + "发生了压力超标,压力值为" + presss;
//                try {
//                    messagePusherService.updateSinkJob("", URLDecoder.decode(msg, "UTF-8"));
//                } catch (UnsupportedEncodingException uee) {
//                    log.error("websocket推送,内容转码出现异常,异常信息为{}", uee.getMessage());
//                }
//            }
//            if (alarmPushConfig.getShortMessageAlarm().equals(1)) {
//                JSONArray msglist = new JSONArray();
//                JSONObject msgMap = new JSONObject();
//                msgMap.put("time", new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date()));
//                msgMap.put("devcode", devcode);
//                msgMap.put("value", presss);
//                msgMap.put("content", "压力超标");
//                String phoneJson = "";
//                List<String> aliSignNameList = new ArrayList<>();
//                String aliSignName = aliYunConfig.getSignNameJson();
//                if (!org.apache.commons.lang3.StringUtils.isEmpty(alarmPushConfig.getPhoneArray())) {
//                    String[] phones = alarmPushConfig.getPhoneArray().split(",");
//                    List<String> phoneList = new ArrayList<>();
//                    for (String phone : phones) {
//                        msglist.add(msgMap);
//                        phoneList.add(phone);
//                        aliSignNameList.add(aliSignName);
//                    }
//                    phoneJson = JSONObject.toJSONString(phoneList);
//                }
//                sendBatchSmsUtil.sendMsg(phoneJson, JSON.toJSONString(msgMap), JSONObject.toJSONString(aliSignNameList));
//            }
//        }
    }


}