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

import com.casic.alarm.utils.DateUtils;
import com.casic.alarm.utils.PropertiesUtil;
import com.casic.dma.dmamanager.DmaLogManager;
import com.casic.dma.model.domain.DMAInfo;
import org.springframework.stereotype.Service;

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

/**
 * Created by admin on 2017/2/15.
 */
@Service
public class BackgroundLeakageFetcherImp implements IBackgroundLeakageFetcher {

    @Resource
    public DmaLogManager dmaLogManager;

    @Resource
    public AveragePressFetcher averagePressFetcher;

    protected PropertiesUtil propUtil = new PropertiesUtil("application.properties");

    //公式:背景漏失量(m3/h)= 1/24×(18×主管道长度(km) + 0.80×管道连接数(个) + 25×私有管道长度(个))×管道压力(mpa)
    @Override
    public BackgroundLeakageSum getBackgroundLeakage(DMAInfo dmaInfo, MinimumFlowSum flowSum, Date start, Date end) {
        BackgroundLeakageSum backgroundLeakageSum = new BackgroundLeakageSum();

        try {
            //每日夜间最小流量期间的平均压力List
            AveragePressList avgPressList = averagePressFetcher.
                    getAvgPressList(dmaInfo, flowSum, start, end);
            if(null == avgPressList) {
                backgroundLeakageSum.setOk(false);
                return backgroundLeakageSum;
            }

            //获取参数
            double mainPipeLength = dmaInfo.getPipeLeng();//主管道长度,单位km
            double pipeLinkNum = dmaInfo.getPipeLinks();//管道连接数,单位个
            double privatePipeLength = dmaInfo.getUserPipeLeng();//私有管道长度,单位km
            double pressSum = getPressSum(dmaInfo, avgPressList,start, end);
            double dayNightFactor = Double.parseDouble(propUtil.getProperty("dma.dayNightFactor"));
            //总和:这段时间内的总和,单位m3
            double backLeakSum = 1 / 24.0 * dayNightFactor
                    * (18 * mainPipeLength + 0.8 * pipeLinkNum + 25 * privatePipeLength) * pressSum;

            backgroundLeakageSum.setBackgroundLeakageSum(backLeakSum);
            backgroundLeakageSum.setRegionID(dmaInfo.getID());
            backgroundLeakageSum.setStart(start);
            backgroundLeakageSum.setEnd(end);
            backgroundLeakageSum.setOk(true);
        } catch (Exception e) {
            e.printStackTrace();
            backgroundLeakageSum.setOk(false);
            dmaLogManager.saveLog(dmaInfo.getID(), false, "计算分区'" + dmaInfo.getName() +
                    "'的背景漏失量出错," + getClass().getName() + "," + e.getMessage());
        }
        return backgroundLeakageSum;
    }

    //一段时间内管道压力之和, 单位m
    private double getPressSum(DMAInfo dmaInfo, AveragePressList avgPressList, Date start, Date end) {
        double sum = 0;
        try {
            List<AveragePress> averagePressList = avgPressList.getAveragePressList();
            double pressSum = 0;
            for(AveragePress averagePress : averagePressList) {
                pressSum += averagePress.getAvgPress();
            }
            //计算天数:没有问题
            int days = DateUtils.getDateDiff(start, end) + 1;
            sum = pressSum/averagePressList.size()*days;//单位MPa
            //单位换算:换算为m, 1MPa=101.972m
/*
            sum *= 101.972;
*/
        } catch (Exception e) {
            e.printStackTrace();
            dmaLogManager.saveLog(dmaInfo.getID(), false, "计算分区'" + dmaInfo.getName() +
                    "'的平均压力出错," + getClass().getName() + "," + e.getMessage());
        }
        return sum;
    }
}