Esempio n. 1
0
        // 将Map中由key指定的DataTable,从startRow开始返回界面最大行数的集合
        private List <CEntityEva> CopyDataToList(int key, int startRow)
        {
            List <CEntityEva> result = new List <CEntityEva>();
            // 取最小值 ,保证不越界
            int       endRow = Math.Min(m_mapDataTable[key].Rows.Count, startRow + CDBParams.GetInstance().UIPageRowCount);
            DataTable table  = m_mapDataTable[key];

            for (; startRow < endRow; ++startRow)
            {
                CEntityEva Eva = new CEntityEva();
                Eva.StationID   = table.Rows[startRow][CN_StationId].ToString();
                Eva.TimeCollect = DateTime.Parse(table.Rows[startRow][CN_DataTime].ToString());
                if (!table.Rows[startRow][CN_Temp].ToString().Equals(""))
                {
                    Eva.Temperature = Decimal.Parse(table.Rows[startRow][CN_Temp].ToString());
                }
                if (!table.Rows[startRow][CN_Eva].ToString().Equals(""))
                {
                    Eva.Eva = Decimal.Parse(table.Rows[startRow][CN_Eva].ToString());
                }
                if (!table.Rows[startRow][CN_Voltage].ToString().Equals(""))
                {
                    Eva.Voltage = Decimal.Parse(table.Rows[startRow][CN_Voltage].ToString());
                }
                if (!table.Rows[startRow][CN_Rain].ToString().Equals(""))
                {
                    Eva.Rain = Decimal.Parse(table.Rows[startRow][CN_Rain].ToString());
                }
                Eva.type = table.Rows[startRow][CN_ACT].ToString();
                Eva.act  = table.Rows[startRow][CN_ACT].ToString();
                result.Add(Eva);
            }
            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// 根据站点ID和时间查询
        /// </summary>
        /// <param name="stationid"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        public List <CEntityEva> getEvabyTime(string stationid, DateTime start, DateTime end)
        {
            List <CEntityEva> evaList       = new List <CEntityEva>();
            String            sql           = "select * from " + CT_TableName + " where STCD=" + stationid + " and DT between '" + start + "'and '" + end + "';";
            SqlDataAdapter    adapter       = new SqlDataAdapter(sql, CDBManager.GetInstacne().GetConnection());
            DataTable         dataTableTemp = new DataTable();

            adapter.Fill(dataTableTemp);
            int flag = dataTableTemp.Rows.Count;

            if (flag == 0)
            {
                return(null);
            }
            else
            {
                for (int rowid = 0; rowid < dataTableTemp.Rows.Count; ++rowid)
                {
                    CEntityEva eva = new CEntityEva();
                    eva.StationID   = dataTableTemp.Rows[rowid][CN_StationId].ToString();
                    eva.TimeCollect = DateTime.Parse(dataTableTemp.Rows[rowid][CN_DataTime].ToString());
                    if (dataTableTemp.Rows[rowid][CN_Eva] != null && dataTableTemp.Rows[rowid][CN_Eva].ToString() != "")
                    {
                        eva.E = decimal.Parse(dataTableTemp.Rows[rowid][CN_Eva].ToString());
                    }
                    else
                    {
                        eva.E = null;
                    }
                    if (dataTableTemp.Rows[rowid][CN_Rain] != null && dataTableTemp.Rows[rowid][CN_Rain].ToString() != "")
                    {
                        eva.P = decimal.Parse(dataTableTemp.Rows[rowid][CN_Rain].ToString());
                    }
                    else
                    {
                        eva.P = null;
                    }
                    if (dataTableTemp.Rows[rowid][CN_Rain8] != null && dataTableTemp.Rows[rowid][CN_Rain8].ToString() != "")
                    {
                        eva.P8 = decimal.Parse(dataTableTemp.Rows[rowid][CN_Rain8].ToString());
                    }
                    else
                    {
                        eva.P8 = null;
                    }
                    if (dataTableTemp.Rows[rowid][CN_Rain20] != null && dataTableTemp.Rows[rowid][CN_Rain20].ToString() != "")
                    {
                        eva.P20 = decimal.Parse(dataTableTemp.Rows[rowid][CN_Rain20].ToString());
                    }
                    else
                    {
                        eva.P20 = null;
                    }
                    evaList.Add(eva);
                }
            }
            return(evaList);
        }
Esempio n. 3
0
        /// <summary>
        /// 增加原始蒸发数据表
        /// </summary>
        /// <param name="Eva"></param>
        public void AddNewRow(CEntityEva Eva)
        {
            //m_mutexDataTable.WaitOne(); //等待互斥量

            DataRow row = m_tableDataAdded.NewRow();

            row[CN_StationId] = Eva.StationID;
            row[CN_DataTime]  = Eva.TimeCollect.ToString(CDBParams.GetInstance().DBDateTimeFormat);
            row[CN_Temp]      = Eva.Temperature;
            row[CN_Eva]       = Eva.Eva;
            row[CN_Voltage]   = Eva.Voltage;
            row[CN_Rain]      = Eva.Rain;
            row[CN_ACT]       = Eva.type;
            row[CN_TEva]      = Eva.TE;
            row[CN_TRain]     = Eva.TP;
            m_tableDataAdded.Rows.Add(row);

            // 如果超过最大值,写入数据库
            NewTask(() => { AddDataToDB(); });

            //m_mutexDataTable.ReleaseMutex();
        }
Esempio n. 4
0
 public void AddNewRow(CEntityEva Eva)
 {
     throw new NotImplementedException();
 }
Esempio n. 5
0
        /// <summary>
        /// 蒸发计算
        /// </summary>
        /// <param name="Dictionary<string, string>"></param>
        /// <param name=""></param>
        public Dictionary <string, string> EvaCal(CEntityEva eva)
        {
            Dictionary <string, string> evaDic = new Dictionary <string, string>();  //输出的蒸发计算结果
                                                                                     //int sumRawDataRows = rawDataList.Count;
            string strForInserts = string.Empty;

            //rawDataNew[0] = myDic["StationID"];
            rawDataNew[0] = eva.StationID;
            //rawDataNew[1] = myDic["Time"];
            rawDataNew[1] = eva.TimeCollect.ToString();
            //rawDataNew[2] = myDic["Voltge"];
            rawDataNew[2] = eva.Voltage.ToString();
            //rawDataNew[3] = myDic["Evp"];
            rawDataNew[3] = eva.Eva.ToString();
            //rawDataNew[4] = myDic["Rain"];
            rawDataNew[4] = eva.Rain.ToString();
            //rawDataNew[5] = myDic["Temperature"];
            rawDataNew[5] = eva.Temperature.ToString();
            //rawDataNew[6] = myDic["EvpType"];
            rawDataNew[6] = eva.type;
            rawDataNew[7] = DateTime.Now.ToString();
            stcdForCal    = eva.StationID;



            rawDataNew[8]  = EvaConf.kp.ToString();   //降雨转换系数
            rawDataNew[9]  = EvaConf.ke.ToString();   //蒸发转换系数
            rawDataNew[10] = EvaConf.dh.ToString();   //人工数据比测初始高度差
            rawDataNew[11] = EvaConf.comP.ToString(); //是否降雨补偿


            rawDataNew[8]  = "";                      //降雨转换系数
            rawDataNew[9]  = "";                      //蒸发转换系数
            rawDataNew[10] = EvaConf.dh.ToString();   //人工数据比测初始高度差
            rawDataNew[11] = EvaConf.comP.ToString(); //是否降雨补偿

            //判断是否为有效数字
            double d1;
            bool   isD1 = double.TryParse(rawDataNew[2], out d1);
            double d2;
            bool   isD2 = double.TryParse(rawDataNew[3], out d2);
            double d3;
            bool   isD3 = double.TryParse(rawDataNew[4], out d3);
            double d4;
            bool   isD4 = double.TryParse(rawDataNew[5], out d4);

            if (!isD1 || !isD2 || !isD3 || !isD4 || d1 <= 0.0d || d2 <= 0.0d || d3 <= 0.0d || d4 <= 0.0d)
            {
                return(evaDic);
            }

            //==========增加转换系数==============
            double ConDouE;
            double ConDouP;
            string EConvert;
            string PConvert;


            //判断是否有降雨、蒸发转换系数输入,如果有则替换初始转换系数
            if (rawDataNew[8] != "")
            {
                Kp = double.Parse(rawDataNew[8]);
            }

            if (rawDataNew[9] != "")
            {
                Ke = double.Parse(rawDataNew[9]);
            }


            if (double.TryParse(rawDataNew[3], out ConDouE))    //蒸发
            {
                EConvert = (ConDouE * Ke).ToString("F2");
            }
            else
            {
                return(evaDic);
            }

            if (double.TryParse(rawDataNew[4], out ConDouP))    //降雨
            {
                PConvert = (ConDouP * Kp).ToString("F2");
            }

            else
            {
                return(evaDic);
            }


            //蒸发桶里面的水位需要减去一个高度差dh,结果作为人工数据比对用
            //*******************************需要写进小时表中**********************************
            double compareH = Convert.ToDouble(rawDataNew[3]) - Convert.ToDouble(rawDataNew[10]);

            evaDic.Add("dH", compareH.ToString("F2"));



            //*******************************************数据入库************************************************
            //在原始表中加入转换后的雨量刻度值TP和蒸发量刻度值TE
            //第一次数据入库
            eva.TE = Decimal.Parse(EConvert);
            eva.TP = Decimal.Parse(PConvert);
            IEvaProxy evaProxy = CDBDataMgr.Instance.GetEvaProxy();

            evaProxy.AddNewRow(eva);
            System.Threading.Thread.Sleep(5000);
            //TODO sql语句
            //*******************************************需要修改*******************************************
            //string strSqlForInquire = "SELECT top 1 * FROM dbo.[RawData]";
            //DataTable dtReadSql = ExecuteDatatable(sqlConStr, strSqlForInquire);
            //*******************************************需要修改*******************************************



            //*******************************************计算时段蒸发量*******************************************
            double hourP = 0.0d;    //小时降雨
            double hourE = 0.0d;    //小时蒸发
            double hourT = 0.0d;    //小时温度
            double hourU = 0.0d;    //小时电压



            //=======首先判断是否是整点,整点处理(读取该整点至上个整点的数据,分段计算),否则看上个数据是不是"RE"数据,不处理========
            DateTime time = DateTime.Parse(rawDataNew[1]);

            if (time.Minute == 0 && time.Second == 0)
            {
                //=========按时间顺序读取这个整点至上个整点的数据==========
                //*******************************************需要修改*******************************************
                string strSqlForHour = "SELECT * FROM dbo.[RawData] where dt>='" + Convert.ToDateTime(rawDataNew[1]).AddHours(-1).ToString() + "' and dt<='" + rawDataNew[1] + "' and stcd='" + stcdForCal + "' order by cast([STCD] as int),cast([DT] as datetime)";
                //TODO List
                DataTable RawHour = ExecuteDatatable(sqlConStr, strSqlForHour);
                //*******************************************需要修改*******************************************

                int rawHourRows = RawHour.Rows.Count;

                if (rawHourRows == 0)
                {
                    Console.WriteLine("数据整点格式有误!请检查!");
                    return(evaDic);
                }

                else if (rawHourRows == 1)
                #region
                {
                    //未能检索到上一个时刻的数据,则按距离当前最近的时刻间的均值
                    DateTime dtTemp = Convert.ToDateTime(rawDataNew[1]);
                    //当一天之内只有两条数据时,小时蒸发、降雨等于日蒸发、降雨,写在小时表和日表中
                    string    strSqlForOne1 = "SELECT * FROM dbo.[RawData] where dt>='" + dtTemp.AddDays(-1).ToString() + "' and dt<='" + dtTemp.ToString() + "' and stcd='" + stcdForCal + "' order by DT desc";
                    DataTable dtForOne1     = ExecuteDatatable(sqlConStr, strSqlForOne1);

                    //*******************************************需要修改*******************************************
                    string strSqlForOne = "SELECT top 2 * FROM dbo.[RawData] where dt>='" + dtTemp.AddDays(-1).ToString() + "' and dt<='" + dtTemp.ToString() + "' and stcd='" + stcdForCal + "' order by DT desc";
                    //TODO
                    DataTable dtForOne = ExecuteDatatable(sqlConStr, strSqlForOne);
                    //*******************************************需要修改*******************************************
                    int    dtForOneRows = dtForOne.Rows.Count;
                    double hours        = 1.0d;
                    if (dtForOneRows == 1)
                    {
                        hourP = 0.0d;
                        hourE = 0.0d;
                        hourT = (Convert.ToDouble(dtForOne.Rows[0]["T"]));
                        hourU = (Convert.ToDouble(dtForOne.Rows[0]["U"]));
                    }
                    else
                    {
                        //计算采用转换后的刻度值
                        hourP = (Convert.ToDouble(dtForOne.Rows[0]["TP"]) - Convert.ToDouble(dtForOne.Rows[1]["TP"])) / hours;
                        hourE = (Convert.ToDouble(dtForOne.Rows[0]["TE"]) - Convert.ToDouble(dtForOne.Rows[1]["TE"])) / hours;
                        hourT = (Convert.ToDouble(dtForOne.Rows[0]["T"]) + Convert.ToDouble(dtForOne.Rows[1]["T"])) / 2.0;
                        hourU = (Convert.ToDouble(dtForOne.Rows[0]["U"]) + Convert.ToDouble(dtForOne.Rows[1]["U"])) / 2.0;
                        hourE = hourP - hourE;
                    }


                    //如果小时雨量筒变化为-1.5mm以下,小时蒸发大于1.5mm或者小于-1.5mm。将ACT设置为“err”,并修改原始数据库中的ACT的值
                    if (hourP <= -1.5d || hourE > 1.5d || hourE < -1.5d)
                    {
                        eva.type = "ERR";
                        string updateSql = "update rawdata act = 'ER' where stcd = 'rawDataNew[0]' and dt = 'time'";
                        evaProxy.UpdateRows(updateSql);
                    }

                    if (hourP < 0.05d)
                    {
                        hourP = 0.0;
                    }

                    if (hourE < 0.0d)
                    {
                        hourE = 0.0;
                    }

                    evaDic.Add("hourP", hourP.ToString("F2"));
                    evaDic.Add("hourE", hourE.ToString("F2"));
                    evaDic.Add("hourT", hourT.ToString("F2"));
                    evaDic.Add("hourU", hourU.ToString("F2"));

                    //************************** 当每天只有8点发一条数据时计算日降雨量 *****************************
                    #region
                    DateTime theNewDT  = Convert.ToDateTime(rawDataNew[1]);
                    DateTime theKeyDT1 = Convert.ToDateTime(Convert.ToDateTime(rawDataNew[1]).ToString("yyyy-MM-dd ") + "08:00:00");
                    DateTime theKeyDT2 = Convert.ToDateTime(Convert.ToDateTime(rawDataNew[1]).ToString("yyyy-MM-dd ") + "09:00:00");
                    #region
                    if (theNewDT >= theKeyDT1 && theNewDT < theKeyDT2 && rawDataNew[6] == null)
                    {
                        decimal tempE;
                        decimal tempP;
                        decimal p8;
                        decimal p20;
                        //当每天只有两组数据时,小时量=日量
                        if (dtForOne1.Rows.Count == 2)
                        {
                            tempE = decimal.Parse(hourE.ToString());
                            tempP = decimal.Parse(hourP.ToString());
                            p8    = tempP / 2;
                            p20   = p8;
                            if (tempE > 12m)
                            {
                                tempE = 12m;
                            }

                            evaDic.Add("dayE", tempE.ToString());
                            evaDic.Add("dayP", tempP.ToString());
                            evaDic.Add("dayT", rawDataNew[5]);
                            evaDic.Add("P8", p8.ToString());
                            evaDic.Add("P20", p20.ToString());
                            evaDic.Add("hourComP", "");
                            evaDic.Add("needCover", "");
                            return(evaDic);
                        }

                        //确定统计的起止时间,读取数据库数据
                        DateTime theBegDT = Convert.ToDateTime((Convert.ToDateTime(rawDataNew[1]).AddDays(-1)).ToString("yyyy-MM-dd ") + "09:00:00"); //前一天8点
                        DateTime theMidDT = Convert.ToDateTime((Convert.ToDateTime(rawDataNew[1]).AddDays(-1)).ToString("yyyy-MM-dd ") + "21:00:00"); //前一天20点
                        DateTime theEndDT = Convert.ToDateTime(Convert.ToDateTime(rawDataNew[1]).ToString("yyyy-MM-dd ") + "09:00:00");               //今天8点
                                                                                                                                                      //*******************************************需要修改*******************************************
                        string strSqlForDayData  = "select stcd,sum(E) as E, sum(P) as P, avg(T) as T from data where dt>='" + theBegDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "' group by stcd";
                        string strSqlForDayData1 = "select sum(P) as P8 from data where dt>='" + theMidDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "' group by stcd";
                        //TODO
                        DataTable dayDT  = ExecuteDatatable(sqlConStr, strSqlForDayData);   //今天8点到昨天8点日累积降雨和蒸发
                        DataTable dayDT1 = ExecuteDatatable(sqlConStr, strSqlForDayData1);  //今天8点到昨天20点累积降雨


                        tempE = Decimal.Parse(dayDT.Rows[0]["E"].ToString()) + decimal.Parse(hourE.ToString());   //日蒸发
                        tempP = Decimal.Parse(dayDT.Rows[0]["P"].ToString()) + decimal.Parse(hourP.ToString());   //日降雨+8点钟的降雨
                        p8    = Decimal.Parse(dayDT1.Rows[0]["P8"].ToString()) + decimal.Parse(hourP.ToString()); //后12小时降雨+8点钟的降雨



                        //判断降雨小时数
                        #region
                        int    hourPNums    = 0; //记录降雨小时数
                        int    hourP8Nums   = 0; //记录p8的12个小时内的降雨小时数
                        string strSqlPNums  = "select P from data where dt>='" + theBegDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "'";
                        string strSqlP8Nums = "select P from data where dt>='" + theMidDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "'";
                        //TODO
                        DataTable hourPDT  = ExecuteDatatable(sqlConStr, strSqlPNums);
                        DataTable hourP8DT = ExecuteDatatable(sqlConStr, strSqlP8Nums);
                        //8小时的数据还未入库
                        if (hourP > 0)
                        {
                            hourPNums  += 1;
                            hourP8Nums += 1;
                        }
                        for (int i = 0; i < hourPDT.Rows.Count; i++)
                        {
                            if (decimal.Parse(hourPDT.Rows[i]["P"].ToString()) != 0m)
                            {
                                hourPNums += 1;
                            }
                        }

                        for (int i = 0; i < hourP8DT.Rows.Count; i++)
                        {
                            if (decimal.Parse(hourP8DT.Rows[i]["P"].ToString()) != 0m)
                            {
                                hourP8Nums += 1;
                            }
                        }
                        #endregion


                        //判断当天有无排水或者注水操作,如果有则用小时累加值,如果无则取小时累加值和两个8点差值中的最小值
                        //*******************************************需要修改*******************************************
                        string strForSumTemp = "select * from RawData where DT>='" + theBegDT.AddHours(-1).ToString() + " ' AND DT<'" + theEndDT.ToString() + " ' and stcd='" + stcdForCal + "'";
                        //TODO
                        DataTable dtForDaySumTemp        = ExecuteDatatable(sqlConStr, strForSumTemp);
                        int       countP                 = 0;//记录人工操作次数
                        int       sumdtForDaySumTempRows = dtForDaySumTemp.Rows.Count;
                        for (int j = 0; j < sumdtForDaySumTempRows; j++)
                        {
                            if (dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "PP" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "PE" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "ZE" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "RE" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "ER")
                            {
                                countP = countP + 1;
                            }
                        }


                        //雨量和蒸发值,明天8点减今天8点值,而不是累加值
                        if (countP == 0)
                        {
                            //*******************************************需要修改*******************************************
                            string strForSum2 = "SELECT a.TE-b.TE as E, b.TP-a.TP as P FROM RawData as a,RawData as b where a.DT='" + theBegDT.AddHours(-1).ToString() + " ' AND b.DT = '" + theEndDT.AddHours(-1).ToString() + " ' and a.stcd='" + stcdForCal + "'";
                            string strForSum3 = "SELECT  b.TP-a.TP as P8 FROM RawData as a, RawData as b where a.DT='" + theMidDT.AddHours(-1).ToString() + " ' AND b.DT = '" + theEndDT.AddHours(-1).ToString() + " ' and a.stcd='" + stcdForCal + "'";
                            //TODO
                            DataTable dtForDaySum2 = ExecuteDatatable(sqlConStr, strForSum2);
                            DataTable dtForDaySum3 = ExecuteDatatable(sqlConStr, strForSum3);

                            tempP = decimal.Parse((dtForDaySum2.Rows[0]["P"]).ToString());  //24小时降雨值存在temp中
                            p8    = decimal.Parse((dtForDaySum3.Rows[0]["P8"]).ToString()); //p8重赋值

                            //double E1 = 0.0d;
                            // double P2 = 0.0d;
                            decimal E = 0.0m;
                            if (dtForDaySum2.Rows.Count > 0)      //如果取得到昨天八点到今天八点的值
                            {
                                if (tempP < 0.03m)
                                {
                                    tempP = 0.0m;
                                }
                                if (p8 < 0.03m)
                                {
                                    p8 = 0.0m;
                                }
                                E = decimal.Parse((dtForDaySum2.Rows[0]["E"]).ToString()) + tempP;
                                if (E > 0)
                                {
                                    tempE = E;     // tempE = Math.Min(tempE, E);
                                }
                            }
                        }

                        //用p的值减去p8的值即为p20的值,计算中没有涉及对降雨的修改,只有对蒸发的修改,因此直接相减即可
                        p20 = tempP - p8;    //前12小时降雨



                        //*****************日降雨补偿********************************
                        int     needCover = 0;
                        decimal hourComP  = 0m;   //小时降雨补偿
                        #region
                        //当补偿系数不为0且降雨超过3个小时,需要进行日降雨补偿
                        if (bool.Parse(rawDataNew[11]) != false && hourPNums > 3)
                        {
                            needCover = 1;
                            decimal sumComP;
                            if (hourPNums >= 13)
                            {
                                sumComP = 0.5m;
                            }
                            sumComP  = 0.05m * (hourPNums - 3); //补偿总量
                            hourComP = sumComP / hourPNums;
                            tempP   += sumComP;                 //对日降雨量进行补偿
                            p8      += hourComP * hourP8Nums;
                            p20      = tempP - p8;
                        }
                        #endregion

                        if (tempE >= 12m)
                        {
                            tempE = 12m;
                        }


                        //构造dayData数组
                        dayData[0] = dayDT.Rows[0]["STCD"].ToString();
                        dayData[1] = theKeyDT1.AddDays(-1).ToShortDateString();
                        dayData[2] = tempE.ToString();      //真实蒸发,考虑容器的换算?
                        dayData[3] = tempP.ToString();
                        dayData[4] = dayDT.Rows[0]["T"].ToString();
                        dayData[5] = p8.ToString();    //存储p8
                        dayData[6] = p20.ToString();   //存储p20
                        dayData[7] = "";


                        evaDic.Add("dayE", dayData[2]);
                        evaDic.Add("dayP", dayData[3]);
                        evaDic.Add("dayT", dayData[4]);
                        evaDic.Add("P8", dayData[5]);
                        evaDic.Add("P20", dayData[6]);
                        evaDic.Add("hourComP", hourComP.ToString());
                        evaDic.Add("needCover", needCover.ToString());    //只有拿到这个值为1时,去修改小时表,每个不为0的降雨全部加上hourComP
                        #endregion
                    }
                    else
                    {
                        evaDic.Add("dayE", "");
                        evaDic.Add("dayP", "");
                        evaDic.Add("dayT", "");
                        evaDic.Add("P8", "");
                        evaDic.Add("P20", "");
                        evaDic.Add("hourComP", "");
                        evaDic.Add("needCover", "");
                    }
                    return(evaDic);

                    #endregion
                }
                #endregion
                else
                #region
                {
                    //最先判断是否有RE字段,如果有则重新界定小时时段检索时间,新的时间段为从最新采集数据时刻到RE之间的时段
                    bool   hasRE    = false;
                    string newDTStr = string.Empty;
                    for (int i = 0; i < rawHourRows; i++)
                    {
                        //判断是否有RE(初始化)字符
                        if (RawHour.Rows[i]["ACT"].ToString().Trim() == "RE")
                        {
                            hasRE    = true;
                            newDTStr = RawHour.Rows[i]["DT"].ToString().Trim();
                        }
                    }

                    if (hasRE)
                    {
                        //如果有则重新界定小时时段检索时间,新的时间段为从最新采集数据时刻到RE之间的时段
                        //*******************************************需要修改*******************************************
                        strSqlForHour = "SELECT * FROM dbo.[RawData] where dt>='" + newDTStr + "' and dt<='" + rawDataNew[1] + "' and stcd='" + stcdForCal + "' order by cast([STCD] as int),cast([DT] as datetime)";
                        //TODO
                        RawHour = ExecuteDatatable(sqlConStr, strSqlForHour);
                        //*******************************************需要修改*******************************************
                        rawHourRows = RawHour.Rows.Count;
                    }

                    //首先判断P或ZE的个数,并记录下特征位置
                    List <int> PorZ = new List <int>();
                    for (int i = 0; i < rawHourRows; i++)
                    {
                        if (RawHour.Rows[i]["ACT"].ToString().Trim() == "PP" || RawHour.Rows[i]["ACT"].ToString().Trim() == "PE" || RawHour.Rows[i]["ACT"].ToString().Trim() == "ZE")
                        {
                            PorZ.Add(i);
                        }
                    }

                    int sumPorZ = PorZ.Count;
                    //1、如果无P或Z,则直接上下时刻相减;
                    #region
                    if (sumPorZ == 0)
                    {
                        hourE = Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["TE"]) - Convert.ToDouble(RawHour.Rows[0]["TE"]);
                        hourP = Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["TP"]) - Convert.ToDouble(RawHour.Rows[0]["TP"]);
                        hourT = (Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["T"]) + Convert.ToDouble(RawHour.Rows[0]["T"])) / 2.0f;
                        hourU = (Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["U"]) + Convert.ToDouble(RawHour.Rows[0]["U"])) / 2.0f;
                        //hourE = hourP - hourE;
                    }
                    #endregion
                    //2、如果有PP、PE或ZE,则分段计算。PP说明是雨量筒排水,排水期间的降雨量由蒸发桶计算;PE说明是蒸发桶排水,期间降雨量则为真实值;ZE为注水操作。
                    #region
                    else
                    {
                        for (int i = 0; i < sumPorZ; i++)
                        {
                            //每个特征位置需要减两次:(1)是特征位的上一行数据减上一特征位数据;(2)是特征位数据减上一行数据
                            if (i == 0)     //如果是第一个特征位,则认为上一特征位为第一行
                            {
                                //第一次减
                                hourE = hourE + Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TE"]) - Convert.ToDouble(RawHour.Rows[0]["TE"]);
                                hourP = hourP + Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TP"]) - Convert.ToDouble(RawHour.Rows[0]["TP"]);

                                //第二次减
                                //如果是雨量桶排水,则排水时段雨量就按蒸发筒计算
                                if (RawHour.Rows[PorZ[i]]["ACT"].ToString().Trim() == "PP")
                                {
                                    hourE = hourE + 0.0f;
                                    hourP = hourP + Convert.ToDouble(RawHour.Rows[PorZ[i]]["TE"]) - Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TE"]);
                                }
                                //如果是蒸发桶排水或注水,则排水时段雨量就按雨量筒计算
                                else
                                {
                                    hourE = hourE + 0.0f;
                                    hourP = hourP + Convert.ToDouble(RawHour.Rows[PorZ[i]]["TP"]) - Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TP"]);
                                }
                            }
                            else
                            {
                                //第一次减
                                hourE = hourE + Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TE"]) - Convert.ToDouble(RawHour.Rows[PorZ[i - 1]]["TE"]);
                                hourP = hourP + Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TP"]) - Convert.ToDouble(RawHour.Rows[PorZ[i - 1]]["TP"]);

                                //第二次减
                                //如果是雨量桶排水,则排水时段雨量就按蒸发筒计算
                                if (RawHour.Rows[PorZ[i]]["ACT"].ToString().Trim() == "PP")
                                {
                                    hourE = hourE + 0.0f;
                                    hourP = hourP + Convert.ToDouble(RawHour.Rows[PorZ[i]]["TE"]) - Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TE"]);

                                    //少个特征位置之间的差值
                                }
                                //如果是蒸发桶排水或注水,则排水时段雨量就按雨量筒计算
                                else
                                {
                                    hourE = hourE + 0.0f;
                                    hourP = hourP + Convert.ToDouble(RawHour.Rows[PorZ[i]]["TP"]) - Convert.ToDouble(RawHour.Rows[PorZ[i] - 1]["TP"]);
                                }
                            }
                        }
                        hourE = hourE + Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["TE"]) - Convert.ToDouble(RawHour.Rows[PorZ[sumPorZ - 1]]["TE"]);
                        hourP = hourP + Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["TP"]) - Convert.ToDouble(RawHour.Rows[PorZ[sumPorZ - 1]]["TP"]);
                        hourT = hourT + (Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["T"]) + Convert.ToDouble(RawHour.Rows[0]["T"])) / 2.0f;
                        hourU = hourU + (Convert.ToDouble(RawHour.Rows[rawHourRows - 1]["U"]) + Convert.ToDouble(RawHour.Rows[0]["U"])) / 2.0f;
                        //hourE = hourP - hourE;
                    }
                    #endregion

                    //如果小时雨量筒变化为-1.5mm以下,小时蒸发大于1.5mm或者小于-1.5mm。将ACT设置为“err”,并将原始数据库中的ACT修改过来
                    if (hourP <= -1.5d || hourE > 1.5d || hourE < -1.5d)
                    {
                        eva.type = "ERR";
                        string updateSql = "update rawdata act = 'ER' where stcd = 'rawDataNew[0]'and dt = 'time'";
                        evaProxy.UpdateRows(updateSql);
                    }
                    //TODO


                    double dtHours = 1.0f;
                    //构造hourData数组,存储输出信息
                    hourData[0] = RawHour.Rows[rawHourRows - 1]["STCD"].ToString();  //站码
                    hourData[1] = RawHour.Rows[rawHourRows - 1]["DT"].ToString();    //时间

                    if (hourP < 0.05f)
                    {
                        hourData[3] = "0.00";      //真实降雨
                        hourP       = 0.0f;
                    }
                    else
                    {
                        hourData[3] = (hourP / dtHours).ToString("F2");      //真实降雨
                    }
                    //如果蒸发和降雨为负,则赋值为0
                    if ((hourP - hourE) < 0.0f)
                    {
                        hourData[2] = "0.00";      //真实蒸发
                    }
                    else if ((hourP - hourE) > 1.5f)
                    {
                        hourData[2] = "0.00";      //真实蒸发
                    }
                    else
                    {
                        hourData[2] = ((hourP - hourE) / dtHours).ToString("F2");      //真实蒸发
                    }
                    hourData[4] = hourT.ToString("F2");
                    hourData[5] = hourU.ToString("F2");

                    //evaDic.Add("STCD", hourData[0]);
                    //evaDic.Add("DT", hourData[1]);
                    evaDic.Add("hourE", hourData[2]);
                    evaDic.Add("hourP", hourData[3]);
                    evaDic.Add("hourT", hourData[4]);
                    evaDic.Add("hourU", hourData[5]);



                    //***************************每天的8点,整理过去一天的日累积降雨量和蒸发量*********************************
                    #region
                    DateTime theNewDT  = Convert.ToDateTime(rawDataNew[1]);
                    DateTime theKeyDT1 = Convert.ToDateTime(Convert.ToDateTime(rawDataNew[1]).ToString("yyyy-MM-dd ") + "08:00:00");
                    DateTime theKeyDT2 = Convert.ToDateTime(Convert.ToDateTime(rawDataNew[1]).ToString("yyyy-MM-dd ") + "09:00:00");
                    #region
                    if (theNewDT >= theKeyDT1 && theNewDT < theKeyDT2 && rawDataNew[6] == null)
                    {
                        //确定统计的起止时间,读取数据库数据
                        DateTime theBegDT = Convert.ToDateTime((Convert.ToDateTime(rawDataNew[1]).AddDays(-1)).ToString("yyyy-MM-dd ") + "09:00:00"); //前一天8点
                        DateTime theMidDT = Convert.ToDateTime((Convert.ToDateTime(rawDataNew[1]).AddDays(-1)).ToString("yyyy-MM-dd ") + "21:00:00"); //前一天20点
                        DateTime theEndDT = Convert.ToDateTime(Convert.ToDateTime(rawDataNew[1]).ToString("yyyy-MM-dd ") + "09:00:00");               //今天8点
                                                                                                                                                      //*******************************************需要修改*******************************************
                        string strSqlForDayData  = "select stcd,sum(E) as E, sum(P) as P, avg(T) as T from data where dt>='" + theBegDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "' group by stcd";
                        string strSqlForDayData1 = "select sum(P) as P8 from data where dt>='" + theMidDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "' group by stcd";
                        //TODO
                        DataTable dayDT  = ExecuteDatatable(sqlConStr, strSqlForDayData);                                 //今天8点到昨天8点日累积降雨和蒸发
                        DataTable dayDT1 = ExecuteDatatable(sqlConStr, strSqlForDayData1);                                //今天8点到昨天20点累积降雨

                        decimal tempE = Decimal.Parse(dayDT.Rows[0]["E"].ToString()) + decimal.Parse(hourE.ToString());   //日蒸发
                        decimal tempP = Decimal.Parse(dayDT.Rows[0]["P"].ToString()) + decimal.Parse(hourP.ToString());   //日降雨+8点钟的降雨
                        decimal p8    = Decimal.Parse(dayDT1.Rows[0]["P8"].ToString()) + decimal.Parse(hourP.ToString()); //后12小时降雨+8点钟的降雨



                        //判断降雨小时数
                        #region
                        int    hourPNums    = 0; //记录降雨小时数
                        int    hourP8Nums   = 0; //记录p8的12个小时内的降雨小时数
                        string strSqlPNums  = "select P from data where dt>='" + theBegDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "'";
                        string strSqlP8Nums = "select P from data where dt>='" + theMidDT.ToString() + "' and dt<'" + theEndDT.ToString() + "' and stcd='" + stcdForCal + "'";
                        //TODO
                        DataTable hourPDT  = ExecuteDatatable(sqlConStr, strSqlPNums);
                        DataTable hourP8DT = ExecuteDatatable(sqlConStr, strSqlP8Nums);
                        //8小时的数据还未入库
                        if (hourP > 0)
                        {
                            hourPNums  += 1;
                            hourP8Nums += 1;
                        }
                        for (int i = 0; i < hourPDT.Rows.Count; i++)
                        {
                            if (decimal.Parse(hourPDT.Rows[i]["P"].ToString()) != 0m)
                            {
                                hourPNums += 1;
                            }
                        }

                        for (int i = 0; i < hourP8DT.Rows.Count; i++)
                        {
                            if (decimal.Parse(hourP8DT.Rows[i]["P"].ToString()) != 0m)
                            {
                                hourP8Nums += 1;
                            }
                        }
                        #endregion


                        //判断当天有无排水或者注水操作,如果有则用小时累加值,如果无则取小时累加值和两个8点差值中的最小值
                        //*******************************************需要修改*******************************************
                        string strForSumTemp = "select * from RawData where DT>='" + theBegDT.AddHours(-1).ToString() + " ' AND DT<'" + theEndDT.ToString() + " ' and stcd='" + stcdForCal + "'";
                        //TODO
                        DataTable dtForDaySumTemp        = ExecuteDatatable(sqlConStr, strForSumTemp);
                        int       countP                 = 0;//记录人工操作次数
                        int       sumdtForDaySumTempRows = dtForDaySumTemp.Rows.Count;
                        for (int j = 0; j < sumdtForDaySumTempRows; j++)
                        {
                            if (dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "PP" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "PE" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "ZE" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "RE" || dtForDaySumTemp.Rows[j]["ACT"].ToString().Trim() == "ER")
                            {
                                countP = countP + 1;
                            }
                        }


                        //雨量和蒸发值,明天8点减今天8点值,而不是累加值
                        if (countP == 0)
                        {
                            //*******************************************需要修改*******************************************
                            string strForSum2 = "SELECT a.TE-b.TE as E, b.TP-a.TP as P FROM RawData as a,RawData as b where a.DT='" + theBegDT.AddHours(-1).ToString() + " ' AND b.DT = '" + theEndDT.AddHours(-1).ToString() + " ' and a.stcd='" + stcdForCal + "'";
                            string strForSum3 = "SELECT  b.TP-a.TP as P8 FROM RawData as a, RawData as b where a.DT='" + theMidDT.AddHours(-1).ToString() + " ' AND b.DT = '" + theEndDT.AddHours(-1).ToString() + " ' and a.stcd='" + stcdForCal + "'";
                            //TODO
                            DataTable dtForDaySum2 = ExecuteDatatable(sqlConStr, strForSum2);
                            DataTable dtForDaySum3 = ExecuteDatatable(sqlConStr, strForSum3);

                            tempP = decimal.Parse((dtForDaySum2.Rows[0]["P"]).ToString());  //24小时降雨值存在temp中
                            p8    = decimal.Parse((dtForDaySum3.Rows[0]["P8"]).ToString()); //p8重赋值

                            //double E1 = 0.0d;
                            // double P2 = 0.0d;
                            decimal E = 0.0m;
                            if (dtForDaySum2.Rows.Count > 0)      //如果取得到昨天八点到今天八点的值
                            {
                                if (tempP < 0.03m)
                                {
                                    tempP = 0.0m;
                                }
                                if (p8 < 0.03m)
                                {
                                    p8 = 0.0m;
                                }
                                E = decimal.Parse((dtForDaySum2.Rows[0]["E"]).ToString()) + tempP;
                                if (E > 0)
                                {
                                    tempE = E;     // tempE = Math.Min(tempE, E);
                                }
                            }
                        }

                        //用p的值减去p8的值即为p20的值,计算中没有涉及对降雨的修改,只有对蒸发的修改,因此直接相减即可
                        decimal p20 = tempP - p8;    //前12小时降雨



                        //*****************日降雨补偿********************************
                        int     needCover = 0;
                        decimal hourComP  = 0m;   //小时降雨补偿
                        #region
                        //当补偿系数不为0且降雨超过3个小时,需要进行日降雨补偿
                        if (bool.Parse(rawDataNew[11]) != false && hourPNums > 3)
                        {
                            needCover = 1;
                            decimal sumComP;
                            if (hourPNums >= 13)
                            {
                                sumComP = 0.5m;
                            }
                            sumComP  = 0.05m * (hourPNums - 3); //补偿总量
                            hourComP = sumComP / hourPNums;
                            tempP   += sumComP;                 //对日降雨量进行补偿
                            p8      += hourComP * hourP8Nums;
                            p20      = tempP - p8;
                        }
                        #endregion


                        if (tempE >= 12m)
                        {
                            tempE = 12m;
                        }

                        //构造dayData数组
                        dayData[0] = dayDT.Rows[0]["STCD"].ToString();
                        dayData[1] = theKeyDT1.AddDays(-1).ToShortDateString();
                        dayData[2] = tempE.ToString();      //真实蒸发,考虑容器的换算?
                        dayData[3] = tempP.ToString();
                        dayData[4] = dayDT.Rows[0]["T"].ToString();
                        dayData[5] = p8.ToString();    //存储p8
                        dayData[6] = p20.ToString();   //存储p20
                        dayData[7] = "";


                        evaDic.Add("dayE", dayData[2]);
                        evaDic.Add("dayP", dayData[3]);
                        evaDic.Add("dayT", dayData[4]);
                        evaDic.Add("P8", dayData[5]);
                        evaDic.Add("P20", dayData[6]);
                        evaDic.Add("hourComP", hourComP.ToString());
                        evaDic.Add("needCover", needCover.ToString());    //只有拿到这个值为1时,去修改小时表,每个不为0的降雨全部加上hourComP

                        #endregion
                    }

                    else
                    {
                        evaDic.Add("dayE", "");
                        evaDic.Add("dayP", "");
                        evaDic.Add("dayT", "");
                        evaDic.Add("P8", "");
                        evaDic.Add("P20", "");
                        evaDic.Add("hourComP", "");
                        evaDic.Add("needCover", "");
                    }

                    #endregion
                }
            }
            #endregion
            return(evaDic);
        }