/// <summary> /// 根据年度,月份,和设备id取得相应的月天发电量统计信息 /// 经过缓存处理 /// </summary> /// <param name="year"></param> /// <param name="deviceID"></param> /// <param name="monitorCode"></param> /// <param name="month"></param> /// <returns></returns> public DeviceMonthDayData GetDeviceMonthDayData(int year, int deviceID, int month) { string cacheKey = CacheKeyUtil.buildDeviceEnergyMonthCountKey(deviceID, year, month); object obj = MemcachedClientSatat.getInstance().Get(cacheKey); DeviceMonthDayData deviceMonthDayData; if (obj == null) { //从数据库中取得 deviceMonthDayData = _DeviceMonthDataDao.GetDeviceMonthDayData(deviceID, year, month); if (deviceMonthDayData == null) //构造一个新实例 { deviceMonthDayData = new DeviceMonthDayData() { month = month, year = year, deviceID = deviceID } } ; deviceMonthDayData.localAcceptTime = DateTime.Now; deviceMonthDayData.year = year; MemcachedClientSatat.getInstance().Set(cacheKey, deviceMonthDayData); } else { deviceMonthDayData = (DeviceMonthDayData)obj; } return(deviceMonthDayData); }
/// <summary> /// 从缓存中批量持久化数据 /// </summary> public void batchSave() { DeviceMonthDayData energyData; String[] keyArr = persistentListKey.ToArray(); foreach (string key in keyArr) { object obj = MemcachedClientSatat.getInstance().Get(key); if (obj == null) { LogUtil.warn(key + "in cache is empty of device day data "); continue; } energyData = (DeviceMonthDayData)obj; string _Column = "d_" + energyData.curDay; float _value = 0; try { _value = (float)ReflectionUtil.getProperty(energyData, _Column); } catch (Exception e1) { LogUtil.error(e1.Message); } try { if (energyData.id > 0) { _DeviceMonthDataDao.UpdateDeviceMonthDayData(energyData.year, _Column, _value, energyData.id); } else { try { _DeviceMonthDataDao.InsertDeviceMonthDayData(_Column, _value, energyData.deviceID, energyData.year, energyData.month); } catch (Exception e) { LogUtil.error("insert device mOnth day error:" + e.Message); } DeviceMonthDayData tmp = _DeviceMonthDataDao.GetDeviceMonthDayData(energyData.deviceID, energyData.year, energyData.month); if (tmp == null) { tmp = _DeviceMonthDataDao.GetDeviceMonthDayData(energyData.deviceID, energyData.year, energyData.month); } energyData.id = tmp == null?0:tmp.id; MemcachedClientSatat.getInstance().Set(key, energyData); } } catch (Exception e2) { LogUtil.error(e2.Message); } //判断是否不在持久化 if (energyData.localAcceptTime.Month != DateTime.Now.Month) { energyData.dontPersitent = true; persistentListKey.Remove(key); } } }
/// <summary> /// 放入缓存 /// </summary> /// <param name="deviceMonthDayData"></param> public void Cache(DeviceMonthDayData deviceMonthDayData) { string cacheKey = CacheKeyUtil.buildDeviceEnergyMonthCountKey(deviceMonthDayData.deviceID, deviceMonthDayData.year, deviceMonthDayData.month); if (!persistentListKey.Contains(cacheKey)) { persistentListKey.Add(cacheKey); } //一个月3天后过期 MemcachedClientSatat.getInstance().Set(cacheKey, deviceMonthDayData, DateTime.Now.AddMonths(1).AddDays(3)); }
/// <summary> /// 保存单个设备的月天数据 /// </summary> /// <param name="year"></param> /// <param name="d_Column"></param> /// <param name="d_Value"></param> /// <param name="deviceID"></param> /// <param name="monitorCode"></param> /// <param name="month"></param> public void SaveDeviceMonthDayData(int year, string d_Column, double d_Value, int deviceID, int month) { DeviceMonthDayData deviceMonthDayData = GetDeviceMonthDayData(year, deviceID, month); if (deviceMonthDayData != null) { _DeviceMonthDataDao.UpdateDeviceMonthDayData(year, d_Column, d_Value, deviceMonthDayData.id); } else { _DeviceMonthDataDao.InsertDeviceMonthDayData(d_Column, d_Value, deviceID, year, month); } }
public double GetEnergy(int did, string startyyyyMMdd, string endyyyyMMdd) { //20111130 20111130 double returnValue = 0; DateTime startTime = DateTime.Parse(startyyyyMMdd); DateTime endTime = DateTime.Parse(endyyyyMMdd); IList <DeviceYearMonthData> dymds = new List <DeviceYearMonthData>(); int yyyy = startTime.Year; while (yyyy <= endTime.Year)//计算开始到结束时间的所在年发电量 { dymds.Add(DeviceYearMonthDataService.GetInstance().GetDeviceYearMonthData(did, yyyy)); yyyy++; } //计算开始到结束时间内的所有发电量 foreach (DeviceYearMonthData dymd in dymds) { if (dymd.year.Equals(startTime.Year) && startTime.AddMonths(1) < endTime) { returnValue += dymd.count(startTime.Month + 1, 12); } else if (dymd.year.Equals(endTime.Year) && endTime.AddMonths(-1) > startTime) { returnValue += dymd.count(1, endTime.Month - 1); } else if (startTime.Year.Equals(endTime.Year) == false) { returnValue += dymd.count(); } } DeviceMonthDayData dmdd = null; //计算边缘月的发电量 if (!(startTime.Year.Equals(endTime.Year) && startTime.Month.Equals(endTime.Month))) { dmdd = DeviceMonthDayDataService.GetInstance().GetDeviceMonthDayData(startTime.Year, did, startTime.Month); returnValue += dmdd.count(startTime.Day, 31); dmdd = DeviceMonthDayDataService.GetInstance().GetDeviceMonthDayData(startTime.Year, did, endTime.Month); returnValue += dmdd.count(1, endTime.Day); } else { dmdd = DeviceMonthDayDataService.GetInstance().GetDeviceMonthDayData(startTime.Year, did, endTime.Month); returnValue += dmdd.count(startTime.Day, endTime.Day); } return(returnValue); }
/// <summary> /// 取得电站的某天的性能 /// </summary> /// <param name="plant"></param> /// <param name="year"></param> /// <param name="month"></param> /// <param name="day"></param> /// <param name="dayEnergy"></param> /// <returns>已经转化为百分率了</returns> public double getDayPr(Plant plant, int year, int month, int day, double dayEnergy) { Device device = plant.getDetectorWithRenderSunshine(); if (device == null) { return(0); } DeviceMonthDayData deviceYearmonth = DeviceMonthDayDataService.GetInstance().GetDeviceMonthDayData(year, device.id, month); float monthsunlingt = deviceYearmonth.getDayData(day); if (monthsunlingt == 0) { return(0); } float dp = plant.design_power == 0 ? 1 : plant.design_power; return((dayEnergy / monthsunlingt * 1000 * dp) * 100); }
/// <summary> /// 将各个月度数据付给map /// </summary> /// <param name="monthDataMap"></param> /// <param name="deviceMonthData"></param> /// <param name="rate">每个设备的rate可能不一样,所以要单独计算</param> private void putMonthDayMap(Hashtable monthDataMap, DeviceMonthDayData deviceMonthData, float rate) { int month = deviceMonthData.month; int year = deviceMonthData.year; //使用反射获得对象的号到最后一天的属性值 int days = CalenderUtil.getMonthDays(year, month); for (int i = 1; i <= days; i++) { string key = year + TableUtil.convertIntToMnthStr(month) + TableUtil.convertIntToMnthStr(i); System.Object obj = monthDataMap[key]; object tmpvalue = deviceMonthData.GetType().GetProperty("d_" + i).GetValue(deviceMonthData, null); float value = tmpvalue == null ? 0 : StringUtil.stringtoFloat(tmpvalue.ToString()); if (obj != null || tmpvalue != null) { monthDataMap[key] = (obj == null ? 0 : StringUtil.stringtoFloat(obj.ToString())) + value * rate; } } }
/// <summary> /// 获取电站月数据 /// 需要传递一个Year 年份 /// plantId 电站编号 /// month 月份 /// </summary> /// <param name="data"></param> /// <returns></returns> public DeviceMonthDayData Get(DeviceMonthDayData data) { return(_DeviceMonthDataDao.Get(data)); }
/// <summary> /// 缓存设备发电量统计 /// 要进行修正缓存丢失 /// </summary> /// <param name="tcpmessage"></param> private static void CacheDeviceEnergyData(IDictionary <string, double> deviceEnergyMap) { int deviceID; string yearMonth; int year; int month; int day; float? data; //string[] keys = deviceEnergyMap.Keys.ToArray(); foreach (string ekey in deviceEnergyMap.Keys) { try { deviceID = int.Parse(ekey.Split(':')[0]); yearMonth = ekey.Split(':')[1]; year = int.Parse(yearMonth.Substring(0, 4)); month = int.Parse(yearMonth.Substring(4, 2)); day = int.Parse(yearMonth.Substring(6, 2)); data = float.Parse(deviceEnergyMap[ekey].ToString()); string d_column = "d_" + day; //取得月天数据对象 DeviceMonthDayData deviceMonthDayData = DeviceMonthDayDataService.GetInstance().GetDeviceMonthDayData(year, deviceID, month); deviceMonthDayData.curDay = day; //给相应属性赋值 if (deviceMonthDayData != null) { object ovalue = ReflectionUtil.getProperty(deviceMonthDayData, d_column); if (ovalue == null || float.Parse(ovalue.ToString()) < data) { ReflectionUtil.setProperty(deviceMonthDayData, d_column, data); } } DeviceMonthDayDataService.GetInstance().Cache(deviceMonthDayData); //更新年月发电量数据 //统计年月 string m_column = "m_" + month; float? m_value = deviceMonthDayData.count(); DeviceYearMonthData ymdData = DeviceYearMonthDataService.GetInstance().GetDeviceYearMonthData(deviceID, year); ymdData.curMonth = month; //给年月数据对象相应属性赋值 if (ymdData != null) { object ovalue = ReflectionUtil.getProperty(ymdData, m_column); if (ovalue == null || float.Parse(ovalue.ToString()) < m_value) { ReflectionUtil.setProperty(ymdData, m_column, m_value); } } DeviceYearMonthDataService.GetInstance().Cache(ymdData); //统计总体发电量 float? y_value = ymdData.count(); DeviceYearData yd = DeviceYearDataService.GetInstance().GetDeviceYearData(deviceID, year); if (yd == null) { yd = new DeviceYearData() { dataValue = 0, deviceID = deviceID, year = year } } ; yd.localAcceptTime = DateTime.Now; //给年月数据对象相应属性赋值 if (yd != null) { object ovalue = yd.dataValue; if (ovalue == null || float.Parse(ovalue.ToString()) < y_value) { yd.dataValue = y_value == null ? 0 : float.Parse(y_value.ToString()); } } DeviceYearDataService.GetInstance().Cache(yd); } catch (Exception onee) {//捕获单个异常,保证一个错误不影响其他设备数据处理 LogUtil.error("Cache deviceEnergyMap of ekey is " + ekey + " error:" + onee.Message); } } }