四两拨千斤

  1 public void hazardAlertJob(){
  2             Map<String,Map<String,Object>> alertTranNoMaps=new HashMap<String,Map<String,Object>>();
  3             EmConfig config=emConfigMapper.select();
  4             Long startTranNo=0L;
  5             if(config!=null&&config.getHazardDataTranNo()!=null){
  6                 startTranNo=config.getHazardDataTranNo();
  7             }
  8             Long maxTranNo=hazardMonitorDataMapper.selectMaxTranNo();
  9             if(maxTranNo==null||startTranNo>=maxTranNo){
 10                 return;
 11             }
 12             List<Map<String,Object>> list=hazardMonitorDataMapper.selectAlertRecord(startTranNo, maxTranNo);
 13             for(Map<String,Object> map:list){
 14                 Long alertTranNo=null;
 15                 Boolean alertIsReported=null;
 16                 Date alertTime=null;
 17                 String deviceCode=(String)map.get("deviceCode");
 18                 String deviceName=(String)map.get("deviceName");
 19                 Long tranNo=((BigDecimal)map.get("tranNo")).longValue();
 20                 Date timeCreated=(Date)map.get("timeCreated");
 21                 Map<String,Object> res=alertTranNoMaps.get(deviceCode);
 22                 if(res!=null){//上一条已经触发阀值,取存储的值
 23                     alertTranNo=(Long)res.get("alertTranNo");
 24                     alertIsReported=(Boolean)res.get("alertIsReported");
 25                     alertTime=(Date)res.get("alertTime");
 26                 }else{
 27                     Object atn=map.get("alertTranNo");
 28                     alertTranNo=atn==null?null:((BigDecimal)atn).longValue();
 29                     Object air=map.get("alertIsReported");
 30                     alertIsReported=air==null?null:(map.get("alertIsReported").equals("1")?true:false);
 31                     Object atc=map.get("alertTime");
 32                     alertTime=atc==null?null:(Date)atc;
 33                 }
 34                 Map<String,Object> newMap=new HashMap<String,Object>();
 35                 newMap.put("alertTranNo", tranNo);
 36                 newMap.put("alertTime", timeCreated);
 37
 38                 boolean isContinuous =false;
 39                 if(alertTranNo!=null&&alertTime!=null){
 40 /*                    Calendar calendar=Calendar.getInstance();
 41                     calendar.setTime(timeCreated);
 42                     calendar.add(Calendar.SECOND, -10);
 43                     Calendar alertCalendar=Calendar.getInstance();
 44                     alertCalendar.setTime(alertTime);
 45                     //if(calendar.compareTo(alertCalendar)<=0&&tranNo-alertTranNo.longValue()==1){
 46                     if(calendar.compareTo(alertCalendar)<=0){//10秒内计为连续批次,因数据采集的时间无规律,有5秒、10更新采集的
 47                         isContinuous=true;
 48                     }*/
 49
 50                     Map<String,Object> frontData=hazardMonitorDataMapper.selectFrontFirstData(deviceCode, timeCreated);
 51                     if(frontData!=null&&((Date)frontData.get("timeCreated")).compareTo(alertTime)==0){//前一个数据与设备表中的已经报警过的日期相等,则为连续记录
 52                         isContinuous=true;
 53                     }
 54                 }
 55
 56                 newMap.put("alertIsReported", isContinuous);
 57                 alertTranNoMaps.put(deviceCode, newMap);
 58                 hazardMonitorDeviceMapper.updateAlertTranNo(deviceCode, tranNo, isContinuous,timeCreated);
 59                 if(!isContinuous){
 60                     continue;
 61                 }
 62
 63                 if(alertIsReported!=null&&alertIsReported==false){//连续的且上一次没有生成报警记录
 64                      AlertInfo info=new AlertInfo();
 65                      info.setMonitoringPoint(deviceName);
 66                      info.setEquipmentType(String.valueOf(FinalStaticValues.WEIXIANYUAN));
 67                      info.setAlertTime((Date)timeCreated);
 68                      BigDecimal dataValue=(BigDecimal)map.get("dataValue");
 69                      BigDecimal hValue=(BigDecimal)map.get("hValue");
 70                      BigDecimal hhValue=(BigDecimal)map.get("hhValue");
 71                      BigDecimal lValue=(BigDecimal)map.get("lValue");
 72                      BigDecimal llValue=(BigDecimal)map.get("llValue");
 73                      String alertLevel=null;
 74                      String alertInfo="监测值:"+dataValue;
 75                      BigDecimal rate=null;
 76                      if(dataValue.compareTo(hhValue)>=0){
 77                          alertLevel="HH";
 78                          alertInfo+=",高二级报警(HH:"+hhValue+")";
 79                      }else if(dataValue.compareTo(hValue)>=0){
 80                          alertLevel="H";
 81                          alertInfo+=",高一级报警(H:"+hValue+")";
 82                      }else if(dataValue.compareTo(llValue)<=0){
 83                          alertLevel="LL";
 84                          alertInfo+=",低二级报警(LL:"+llValue+")";
 85                      }else if(dataValue.compareTo(lValue)<=0){
 86                          alertLevel="L";
 87                          alertInfo+=",低一级报警(L:"+lValue+")";
 88                      }
 89                      if(alertLevel.equals("HH")||alertLevel.equals("H")){
 90                          if(hValue.doubleValue()==0){
 91                              rate=dataValue;
 92                          }else{
 93                              rate=dataValue.subtract(hValue).divide(hValue,3, BigDecimal.ROUND_HALF_UP);
 94                          }
 95                      }else if(alertLevel.equals("LL")||alertLevel.equals("L")){
 96                          if(lValue.doubleValue()==0){
 97                              rate=dataValue;
 98                          }else{
 99                              rate=dataValue.subtract(lValue).divide(lValue).setScale(3, BigDecimal.ROUND_HALF_UP);
100                          }
101                      }
102                      info.setAlertInfo(alertInfo);
103                      info.setAlertLevel(alertLevel);
104                      info.setEquipmentId(deviceCode);
105                      info.setEntId((String)map.get("companyId"));
106                      info.setCurrentValue(String.valueOf(dataValue));
107                      info.setRate(rate.doubleValue()==0?"0":rate.toString());
108                      info.setlValue(lValue.doubleValue());
109                      info.setLlValue(llValue.doubleValue());
110                      info.sethValue(hValue.doubleValue());
111                      info.setHhValue(hhValue.doubleValue());
112                      alertInfoMapper.insert2(info);
113                  }
114             }
115             emConfigMapper.update("HAZARD_DATA_TRAN_NO",maxTranNo);
116     }

原文地址:https://www.cnblogs.com/A-a-r-o-n/p/8290013.html

时间: 2024-10-07 07:59:08

四两拨千斤的相关文章

(转载)你好,C++(15)四两拨千斤——3.9 指向内存位置的指针

你好,C++(15)四两拨千斤——3.9 指向内存位置的指针 3.9  指向内存位置的指针 一天,两个变量在街上遇到了: “老兄,你家住哪儿啊?改天找你玩儿去.” “哦,我家在静态存储区的0x0049A024号,你家呢?” “我家在动态存储区的0x0022FF0C号.有空来玩儿啊.” 在前面的章节中,我们学会了用int等数值数据类型表达各种数字数据,用char等字符数据类型表达文字数据,我们甚至还可以用结构体将多个基本数据类型组合形成新的数据类型,用以表达更加复杂的事物.除了这些现实世界中常见的

你好,C++(15)四两拨千斤——3.9 指向内存位置的指针

3.9  指向内存位置的指针 一天,两个变量在街上遇到了: “老兄,你家住哪儿啊?改天找你玩儿去.” “哦,我家在静态存储区的0x0049A024号,你家呢?” “我家在动态存储区的0x0022FF0C号.有空来玩儿啊.” 在前面的章节中,我们学会了用int等数值数据类型表达各种数字数据,用char等字符数据类型表达文字数据,我们甚至还可以用结构体将多个基本数据类型组合形成新的数据类型,用以表达更加复杂的事物.除了这些现实世界中常见的数据之外,在程序设计当中,我们还有另外一种数据经常需要处理,那

金融篇-保证金制度(四两拨千斤)

期货市场中有一种叫做保证金制度,这种制度有以小博大,四两拨千斤的功效.简单的说,就是你可以用100元的钱,买到1000元的东西.有点不好理解了吧,在说清楚点,他的规则是这样的,比如,有一张黄豆的期货合约,每斤黄豆10元,数量为1000斤,这张合约的价值就是10*1000=10000元,按理说,如果你要买这张合约,你就需要10000元,你身上现在只有1000元,但是你明明知道在过一段时间,黄豆价格就要上涨,这就让你看到钱也赚不到.现在有了保证金制度后,你可以这样去做,把你的1000元到期货市场开个

四两拨千斤,一招搞定数字格式化问题

问题描述 今天在处理一个数字的格式显示问题时,遇到下面的一些需求: 可以显示千分符 可以显示百分比 可以显示小数位数 如下图,如果勾选的话就使能该项设置. 百分比和小数位数比较好解决,百分比只需要在源数字后面加两个零再加上百分号:小数只需要在小数点后面加零即可.最主要的是千分符的处理,好,就来说千分符. 千分符问题 数字千分符的处理有很多处理方案,最主要的有下面几种. 方法一:循环遍历 思路: 将数字转换成字符串,然后倒序遍历取值,每取3个字符插入一个,逗号,直到遍历到第一个字符. 代码很简单,

借力用力,一两拨千斤——抛弃程序员天生的自负

工作了几年,辗转了几个公司,最近一直在思考一个问题:如何借力用力,一两拨千斤.程序员,总是有一种自负:总感觉自己做的系统比他人好,自己写的代码比人优雅,然后自己重新实现类似的系统.编写类似的代码,遇到了类型的问题.甚至比别人多踩了一些大坑,才恍然大悟原来他人为何要那么做.系统设计.软件实现,其实是一个权衡.妥协的过程. 各种设计,各种实现都有实现者的权衡考虑,一个有责任.有思考力的设计者都会有自己的设计.实现初衷.取舍.我们不应该先入为主地做判断.这种程序员的自负情节是要不得的. 这跟借力用力.

知乎&#183;果壳:两枚知识型社区的生存样本解剖

在移植硅谷创新产品的历史中,问答社交网站Quora是相对比较特殊的一个审视对象--它既距离商业路途遥远,也受到搜索引擎与社交网络的共同挤压--所以除了兵行险着的风险投资商对其期望颇高,中国诸多秉承实用主义的创业团队大多对Quora意兴阑珊,缺少临摹的动力. 所以,迄今为止,Quora只在中国下了两个蛋,左边的蛋取了Quora的形,名曰知乎,右边的蛋得了Quora的意,叫作果壳. 这场货真价实的互联网实验,非常值得回首和总结. Quora的示范与刺激 在2009年,Facebook的工程师Char

《运营笔记》:主要是猫扑论坛运营经验。3星。

书中有不少运营的经验,其中以作者在猫扑的运营经验为主.条理略差,在移动互联网时代这些经验的价值也在逐步降低中.总体来说还是值得看一看的.我的评价是3星. 以下是书中一些内容的摘抄: 1:其实真正有消费能力的用户,白天可能根本不会上你的平台,因为他们都有自己繁忙的事情要处理.他们很可能晚上出现.如果你第一次不理他,第一次不理他,第三次还是不理他,那么,很有可能意味着你将失去他了.p56 2:如果帖子内容里面含有视频.图片,可以在标题里加上(图).(视频).(图+视频)的字样.p59 3:最好的用户

OWASP top10

PhishTank 是互联网上免费提供恶意网址黑名单的组织之一,它的黑名单由世界各地的志愿者提供,且更新频繁. 1.XSS 1.1. XSS简介 跨站脚本攻击,英文全称是Cross Site Script,本来缩写是CSS,但是为了和层叠样式表有所区分,所以在安全领域叫做"XSS". XSS攻击,通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. 1.2. XSS分类 XSS根据效果的不同可以分成如下几类 第

单片机中三极管的使用

三极管在数字电路里的开关特征,最罕见的使用有 2 个:一个是掌握使用,一个是驱动使用.所谓的掌握就是如图 3-7 里边引见的,我们可以经过单片机掌握三极管的基极来直接掌握后边的小灯的亮灭,用法人人根本熟习了.还有一个掌握就是停止分歧电压之间的转换掌握,比方我们的单片机是 5V 零碎,它如今要跟一个 12V 的零碎对接,假如 IO 直接接 12V电压就会烧坏单片机,所以我们加一个三极管,三极管的任务电压高于单片机的 IO 口电压,用 5V 的 IO 口来掌握 12V 的电路,如图 3-8 所示.