Newer
Older
alarm / WebRoot / WEB-INF / classes / com / casic / dma / dmamanager / SupplyWaterManager.java
zhout on 2 Mar 2022 3 KB first commit
package com.casic.dma.dmamanager;

import com.casic.alarm.domain.Device;
import com.casic.core.hibernate.HibernateEntityDao;
import com.casic.dma.SupplyWater;
import com.casic.dma.model.domain.SensorFlowRecord;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Created by yxw on 2017/2/20.
 */
@Service
public class SupplyWaterManager extends HibernateEntityDao<SupplyWater> {

    @Resource
    private DmaDeviceManager dmaDeviceManager;

    @Resource
    public DmaLogManager dmaLogManager;

    public SupplyWater GetSupplyWaterByTimeRange(Date start,Date end,int regionId)
    {
        SupplyWater supplyWater=new SupplyWater();
        Session session=this.getSession();
        long dmaInfoId=dmaDeviceManager.getDMAInfoByDBID(regionId).getID();

        try{
            supplyWater.setDateStart(start);
            supplyWater.setDateEnd(end);
            supplyWater.setRegionID(regionId);

            Map<Device, String>  map = dmaDeviceManager.getDevByRegionIdAndType(regionId, "000031"); //0:流量监测点
            if(map==null)
            {
                dmaLogManager.saveLog(dmaInfoId,false,"分区设备获取失败");
                return null;
            }
            double waterQuantity=getWaterQuantity(session,start,end,map,regionId);
            supplyWater.setWaterQuantity(waterQuantity);
            if(waterQuantity==0) {
                supplyWater.setOk(false);
                dmaLogManager.saveLog(dmaInfoId,false,"时间区间"+start+"至"+end+"中供水量监测数据缺失");
            }
            else{
                supplyWater.setOk(true);
            }
        } catch (Exception e) {
            e.printStackTrace();
            supplyWater.setOk(false);
            dmaLogManager.saveLog(dmaInfoId,false,"供水量计算失败");
        }
        return supplyWater;
    }

    private double getWaterQuantity(Session session,Date start,Date _end,Map<Device, String> map,int regionId)
    {
        Date end=(Date)_end.clone();

        end.setTime(end.getTime()+24*60*60*1000);//推迟一天
        double startFlow = getHqlNetData(start,map,regionId);
        double endFlow = getHqlNetData(end,map,regionId);

        double waterQuatity;
        if(startFlow > 0 && endFlow > 0)
        {
            waterQuatity=endFlow-startFlow;
        }
        else
        {
            waterQuatity=0;
        }
        return waterQuatity;
    }

    private double getHqlNetData(Date _date, Map<Device, String> map,int regionId)
    {
        Date date=(Date)_date.clone();

        double flowData=0;
        for (Map.Entry<Device, String> strMap : map.entrySet()) {
            double netData=GetNetDataFromTable(strMap,date);
            if(netData==0)
            {
                //TODO LIST:predator 判断这个设备究竟有没有流量传感器:
                dmaLogManager.saveLog(regionId,false,
                        "设备:"+strMap.getKey()+"在"+date.toString()+"无数据");
                return 0;
            }
            else
            {
                flowData+=netData*Double.parseDouble(strMap.getValue());
            }
        }
        return flowData;
    }

    private double GetNetDataFromTable(Map.Entry<Device, String> map,Date date) {
        Criteria criteria = getSession().createCriteria(SensorFlowRecord.class);
        criteria.add(Restrictions.eq("uptime", date));
        criteria.add(Restrictions.eq("devId", map.getKey().getDevCode()));
        double netData = 0;
        if(criteria.list().size()>0)
        {
            List<SensorFlowRecord> sensorFlowRecords = criteria.list();
            netData=Double.parseDouble(sensorFlowRecords.get(0).getNetData());
        }
        else
        {
            return 0;
        }
        return netData;
    }

}