Exemplo n.º 1
0
        /// <summary>
        /// 将设备天数据批量放入缓存
        /// 由于输入的对象开始经过缓存和数据取得了,所以这时直接放入缓存即可
        /// </summary>
        /// <param name="dayDatas"></param>
        public void batchToCache(IList <IDictionary <string, DeviceDayData> > devicedayDataMapList)
        {
            string cachekey = string.Empty;

            //int[] mtkeys = collectordayDataMap.Keys.ToArray();
            foreach (IDictionary <string, DeviceDayData> tmp in devicedayDataMapList)
            {
                //string[] keys = tmp.Keys.ToArray();
                DeviceDayData dayData = null;
                foreach (string key in tmp.Keys)
                {
                    if (key == null || !tmp.ContainsKey(key))
                    {
                        continue;
                    }
                    dayData = tmp[key];
                    if (dayData == null || !dayData.changed)
                    {
                        continue;
                    }
                    //加入缓存,设置两天为缓存过期时间,避免时差问题
                    cachekey = CacheKeyUtil.buildDeviceDayDataKey(dayData.deviceID, dayData.yearmonth, dayData.sendDay, dayData.monitorCode);
                    mcs.Set(cachekey, dayData, DateTime.Now.AddDays(2));
                    //if (!persistentListKey.Contains(cachekey)) persistentListKey.Add(cachekey);
                    //dayData.changed = false;
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 缓存集合
        /// </summary>
        /// <param name="devicedayDataMapList"></param>
        public void batchToCacheList()
        {
            iswork = true;
            string cachekey = string.Empty;
            IDictionary <string, DeviceDayData> devicedayDataMap = BaseMessage.devicedayDataMapList[mtKey];
            DeviceDayData        dayData = null;
            ICollection <string> keys;

            try
            {
                keys = devicedayDataMap.Keys.ToArray();
            }
            catch (Exception ee) {
                LogUtil.error(ee.Message);
                return;
            }

            foreach (string key in keys)
            {
                try{
                    if (key == null || !devicedayDataMap.ContainsKey(key))
                    {
                        continue;
                    }
                    dayData = devicedayDataMap[key];
                    if (dayData == null || !dayData.changed)
                    {
                        continue;
                    }
                    //加入缓存,设置两天为缓存过期时间,避免时差问题
                    cachekey = CacheKeyUtil.buildDeviceDayDataKey(dayData.deviceID, dayData.yearmonth, dayData.sendDay, dayData.monitorCode);
                    MemcachedClientSatat.getInstance().Set(cachekey, dayData, DateTime.Now.AddDays(2));
                    //这里当数量大得时候,list结构插入很慢
                    //if (!DeviceDayDataService.persistentListKey.Contains(cachekey)) DeviceDayDataService.persistentListKey.Add(cachekey);
                    //dayData.changed = false;
                }
                catch (Exception onee)
                {
                    LogUtil.writeline("handle one devicedayDataMap in devicedayDataMapList ,the mtkey is: " + mtKey + "DeviceDayData is " + key + "error:" + onee.Message);
                    iswork = false;//出异常了让程序停止工作
                }
            }
            iswork = false;
        }
Exemplo n.º 3
0
 /// <summary>
 /// 删除天数据,按照id
 /// add by qhb in 20120828
 /// </summary>
 /// <param name="dayData"></param>
 /// <returns></returns>
 public bool Delete(DeviceDayData dayData)
 {
     return(_DevicePowerDaydataDao.Remove(dayData) > 0 ? true : false);
 }
Exemplo n.º 4
0
        /// <summary>
        /// 批量保持设备日数据对象
        /// </summary>
        /// <param name="unitDayDatas"></param>
        public void batchSave(IList <IDictionary <string, DeviceDayData> > devicedayDataMapList)
        {
            //从需要持久化的list中取出对象
            String[] keyArr;
            foreach (IDictionary <string, DeviceDayData> datadic in devicedayDataMapList)
            {
                keyArr = datadic.Keys.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;
                    }
                    DeviceDayData collectorDayData = (DeviceDayData)obj;
                    if (!collectorDayData.changed)
                    {
                        continue;
                    }
                    //持久化到数据库
                    if (collectorDayData.id == 0)
                    {
                        try
                        {
                            _DevicePowerDaydataDao.Insert(collectorDayData);
                            //添加id信息
                            MemcachedClientSatat.getInstance().Set(key, collectorDayData);
                            if (datadic.ContainsKey(key))
                            {
                                datadic[key].id = collectorDayData.id;
                            }
                        }
                        catch (Exception e)
                        {
                            LogUtil.error("insert device day data fail:" + e.Message);
                            //添加id信息
                            MemcachedClientSatat.getInstance().Set(key, collectorDayData);
                            if (datadic.ContainsKey(key))
                            {
                                datadic[key].id = collectorDayData.id;
                            }
                        }
                    }
                    else
                    {
                        try
                        {
                            _DevicePowerDaydataDao.Update(collectorDayData);
                        }
                        catch (Exception e)
                        {
                            //这里有些问题,稍后要调试下有插入索引约束异常
                            LogUtil.error("update" + collectorDayData.deviceType + " device day data fail:" + e.Message);
                        }
                    }

                    //将变化标识置为false
                    datadic[key].changed = false;
                }
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 取得设备天数据列表
        /// </summary>
        /// <returns></returns>
        public void getDeviceDayDataList()
        {
            if (this.listTcpbody != null && listTcpbody.Count > 0)
            {
                Device        device      = null;
                int           collectorID = GetCollectorId();
                DeviceDayData mdd         = null;
                foreach (DeviceDataBase ddb in ListTcpbody)
                {
                    int deviceID = GetDeviceId(collectorID, ddb.deviceAddress);
                    if (deviceID == 0)
                    {
                        //构造设备
                        device               = new Device();
                        device.collectorID   = collectorID;
                        device.deviceAddress = ddb.deviceAddress.ToString();
                        //根据协议类型取得说属大类型
                        device.deviceTypeCode = DeviceData.getProtocolTypeByCode(ddb.protocolType).deviceType.code;
                        device.deviceModel    = new DeviceModel()
                        {
                            code = ddb.deviceXh
                        };
                        device.status = ddb.deviceState.ToString();
                        deviceID      = DeviceService.GetInstance().Save(device);
                        LogUtil.info("has new device,collectorID is " + collectorID + ",deviceAddress is " + device.deviceAddress);
                        //有新设备要更新bank缓存
                        HttpClientUtil.requestUrl(bank_url);
                    }
                    else
                    {
                        //这里影响解析性能,出了型号会变,设备类型也会变所以也要更新
                        device = DeviceService.GetInstance().get(deviceID);
                        if (ddb.deviceXh != device.deviceModelCode || (DeviceData.getProtocolTypeByCode(ddb.protocolType).typecode != device.deviceTypeCode))
                        { //型号有变化更新设备信息
                            device.deviceModelCode = ddb.deviceXh;
                            device.deviceModel     = new DeviceModel()
                            {
                                code = ddb.deviceXh
                            };
                            device.deviceTypeCode = DeviceData.getProtocolTypeByCode(ddb.protocolType).typecode;
                            device.name           = "";
                            LogUtil.info("has device update,collectorID is " + collectorID + ",deviceAddress is " + device.deviceAddress);
                            DeviceService.GetInstance().Save(device);

                            //设备类型编号也要更新bank缓存
                            HttpClientUtil.requestUrl(bank_url);
                        }
                    }

                    //设置设备的发电量
                    if (ddb.todayEnergy > -1)
                    {
                        deviceEnergyMap[deviceID + ":" + messageHeader.year + messageHeader.month + messageHeader.day] = ddb.todayEnergy;
                    }

                    //设置设备的增量日照强度,参照发电量记录,用发电量的记录逻辑,因为发电量的设备id是逆变器,现在时环境监测仪所以不会重复,可以用发电量的结构
                    //如果增量日照强度大于0则表示有就记录下来,用于后面的累计 add by qianhb in 2012/01/13
                    if (ddb.todaySunshine > -1)
                    {
                        deviceEnergyMap[deviceID + ":" + messageHeader.year + messageHeader.month + messageHeader.day] = ddb.todaySunshine;
                    }


                    //这里需要改进为依据设备时间,防止设备数据的时间和采集器的时间是不一致的
                    string mapObjectKey;
                    IDictionary <string, DeviceDayData> tmpdic = null;
                    foreach (int key in ddb.historyMonitorMap.Keys)
                    {
                        tmpdic       = devicedayDataMapList[deviceID % 50];
                        mapObjectKey = CacheKeyUtil.buildDeviceDayDataKey(deviceID, messageHeader.year + messageHeader.month, int.Parse(messageHeader.day), key);
                        if (!tmpdic.ContainsKey(mapObjectKey))
                        {
                            //先从缓存中取得
                            mdd = DeviceDayDataService.GetInstance().getDeviceDayData(deviceID, key, int.Parse(messageHeader.day), int.Parse(messageHeader.year), int.Parse(messageHeader.month));
                            if (mdd == null)
                            {
                                mdd = new DeviceDayData()
                                {
                                    deviceID = deviceID, sendDay = int.Parse(messageHeader.day), monitorCode = key, deviceType = ddb.deviceType
                                }
                            }
                            ;
                            else
                            {
                                if (mdd.id == 0)
                                {
                                    LogUtil.warn("mdd id is 0" + deviceID + "-" + key + "-" + ddb.deviceType);
                                }
                            }

                            tmpdic[mapObjectKey] = mdd;
                        }
                        else
                        {
                            mdd = tmpdic[mapObjectKey];
                        }
                        //非持久化属性赋值,用于指定所在表
                        mdd.yearmonth = messageHeader.year + messageHeader.month;
                        float newValue = ddb.historyMonitorMap[key] == null ? 0 : float.Parse(ddb.historyMonitorMap[key].ToString());
                        mdd.dataContent    += "#" + messageHeader.hour + messageHeader.minute + messageHeader.second + ":" + newValue;
                        mdd.sendtime        = messageHeader.TimeNow;
                        mdd.localAcceptTime = DateTime.Now;
                        mdd.deviceType      = ddb.deviceType;
                        mdd.changed         = true;
                        //将功率和关照的最大发生时间记录下来,稍后在优化下
                        if (key == MonitorType.MIC_INVERTER_TOTALYGPOWER || key == MonitorType.MIC_DETECTOR_SUNLINGHT || key == MonitorType.MIC_BUSBAR_TOTALCURRENT)
                        {
                            deviceDataCounts.Add(new DeviceDataCount()
                            {
                                deviceId = deviceID, monitorCode = key, year = int.Parse(messageHeader.year), month = int.Parse(messageHeader.month), day = int.Parse(messageHeader.day), deviceTable = TableUtil.DEVICE, maxValue = newValue, maxTime = messageHeader.TimeNow, localAcceptTime = DateTime.Now
                            });
                        }
                    }
                }
            }
        }