// 添加新列 public void AddNewRow(CEntityWater water) { // 记录超过1000条,或者时间超过1分钟,就将当前的数据写入数据库 m_mutexDataTable.WaitOne(); //等待互斥量 DataRow row = m_tableDataAdded.NewRow(); row[CN_StationId] = water.StationID; row[CN_DataTime] = water.TimeCollect.ToString(CDBParams.GetInstance().DBDateTimeFormat); row[CN_WaterStage] = water.WaterStage; row[CN_WaterFlow] = water.WaterFlow; row[CN_MsgType] = CEnumHelper.MessageTypeToDBStr(water.MessageType); row[CN_TransType] = CEnumHelper.ChannelTypeToDBStr(water.ChannelType); row[CN_RecvDataTime] = water.TimeRecieved.ToString(CDBParams.GetInstance().DBDateTimeFormat); row[CN_State] = water.state; m_tableDataAdded.Rows.Add(row); m_mutexDataTable.ReleaseMutex(); // 判断是否需要创建新分区 //CSQLPartitionMgr.Instance.MaintainWater(water.TimeCollect); if (m_tableDataAdded.Rows.Count >= CDBParams.GetInstance().AddBufferMax) { // 如果超过最大值,写入数据库 //Task task = new Task(() => { AddDataToDB(); }); //task.Start(); NewTask(() => { AddDataToDB(); }); } else { // 没有超过缓存最大值,开启定时器进行检测,多次调用Start()会导致重新计数 m_addTimer.Start(); } }
/// <summary> /// 2018-11-24 gm /// 根据开始时间和结束时间查询水位信息 /// </summary> /// <param name="station"></param> /// <param name="start"></param> /// <param name="end"></param> /// <returns></returns> public List <CEntityWater> QueryByTime(string station, DateTime start, DateTime end) { List <CEntityWater> results = new List <CEntityWater>(); String sql = "select * from " + CT_TableName + " where StationID=" + station + " and Datatime 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) { } else { for (int rowid = 0; rowid < dataTableTemp.Rows.Count; ++rowid) { CEntityWater water = new CEntityWater(); water.StationID = dataTableTemp.Rows[rowid][CN_StationId].ToString(); water.WaterStage = decimal.Parse(dataTableTemp.Rows[rowid][CN_WaterStage].ToString()); water.TimeCollect = DateTime.Parse(dataTableTemp.Rows[rowid][CN_DataTime].ToString()); results.Add(water); } } return(results); }
//1009gm public List <CEntityWater> QueryA(string station, DateTime time) { List <CEntityWater> results = new List <CEntityWater>(); DateTime startTime = time; DateTime endTime = startTime.AddHours(23).AddMinutes(59).AddSeconds(59); CTF_TableName = "water" + time.Year.ToString() + time.Month.ToString() + "A"; CTT_TableName = "water" + time.Year.ToString() + time.Month.ToString() + "B"; String sql = "select * from " + CF_TableName + " where StationID=" + station + " and Datatime between '" + startTime + "'and '" + endTime + "';"; SqlDataAdapter adapter = new SqlDataAdapter(sql, CDBManager.GetInstacne().GetConnection()); DataTable dataTableTemp = new DataTable(); adapter.Fill(dataTableTemp); int flag = dataTableTemp.Rows.Count; if (flag == 0) { } else { for (int rowid = 0; rowid < dataTableTemp.Rows.Count; ++rowid) { CEntityWater water = new CEntityWater(); water.StationID = dataTableTemp.Rows[rowid][CN_StationId].ToString(); water.TimeCollect = DateTime.Parse(dataTableTemp.Rows[rowid][CN_DataTime].ToString()); water.WaterStage = decimal.Parse(dataTableTemp.Rows[rowid][CN_WaterStage].ToString()); results.Add(water); } } return(results); }
// 生成更新过的数据列表 private void GetUpdatedData() { // 如果标记为删除的就不需要再更新了 List <int> listUpdatedRows = new List <int>(); for (int i = 0; i < m_listEditedRows.Count; ++i) { if (!m_listMaskedDeletedRows.Contains(m_listEditedRows[i])) { // 如果不在删除列中,则需要更新 listUpdatedRows.Add(m_listEditedRows[i]); } } // 获取更新过的数据 for (int i = 0; i < listUpdatedRows.Count; ++i) { CEntityWater water = new CEntityWater(); // water.WaterID = long.Parse(base.Rows[listUpdatedRows[i]].Cells[CS_WaterID].Value.ToString()); water.StationID = m_strStaionId; water.TimeCollect = DateTime.Parse(base.Rows[listUpdatedRows[i]].Cells[CS_TimeCollected].Value.ToString()); water.TimeRecieved = DateTime.Parse(base.Rows[listUpdatedRows[i]].Cells[CS_TimeReceived].Value.ToString()); water.WaterStage = Decimal.Parse(base.Rows[listUpdatedRows[i]].Cells[CS_WaterStage].Value.ToString()); if (!base.Rows[listUpdatedRows[i]].Cells[CS_WaterFlow].Value.ToString().Equals("")) { water.WaterFlow = Decimal.Parse(base.Rows[listUpdatedRows[i]].Cells[CS_WaterFlow].Value.ToString()); } else { water.WaterFlow = null; } // 数据状态 string tmpDataState = base.Rows[listUpdatedRows[i]].Cells[CS_DataState].Value.ToString(); if (tmpDataState.Equals(CS_DataState_Normal)) { water.state = 1; } else if (tmpDataState.Equals(CS_DataState_AbNormal)) { water.state = 0; } water.MessageType = CEnumHelper.UIStrToMesssageType(base.Rows[listUpdatedRows[i]].Cells[CS_MsgType].Value.ToString()); water.ChannelType = CEnumHelper.UIStrToChannelType(base.Rows[listUpdatedRows[i]].Cells [CS_ChannelType].Value.ToString()); m_listUpdated.Add(water); } // 获取删除过的数据 for (int i = 0; i < base.m_listMaskedDeletedRows.Count; ++i) { // m_listDeleteWaters.Add(long.Parse(base.Rows[m_listMaskedDeletedRows[i]].Cells[CS_WaterID].Value.ToString())); m_listDeleteWaters_StationId.Add(base.Rows[m_listMaskedDeletedRows[i]].Cells[CS_StationID].Value.ToString()); m_listDeleteWaters_StationDate.Add(base.Rows[m_listMaskedDeletedRows[i]].Cells[CS_TimeCollected].Value.ToString()); } m_listEditedRows.Clear(); //清空此次记录 m_listMaskedDeletedRows.Clear(); //清空标记为删除的记录 }
// 将Map中由key指定的DataTable,从startRow开始返回界面最大行数的集合 private List <CEntityWater> CopyDataToList(int key, int startRow) { List <CEntityWater> result = new List <CEntityWater>(); // 取最小值 ,保证不越界 int endRow = Math.Min(m_mapDataTable[key].Rows.Count, startRow + CDBParams.GetInstance().UIPageRowCount); DataTable table = m_mapDataTable[key]; for (; startRow < endRow; ++startRow) { CEntityWater water = new CEntityWater(); // water.WaterID = long.Parse(table.Rows[startRow][CN_WaterID].ToString()); water.StationID = table.Rows[startRow][CN_StationId].ToString(); water.TimeCollect = DateTime.Parse(table.Rows[startRow][CN_DataTime].ToString()); //水位 if (!table.Rows[startRow][CN_WaterStage].ToString().Equals("")) { water.WaterStage = Decimal.Parse(table.Rows[startRow][CN_WaterStage].ToString()); } else { //11.12 water.WaterStage = -9999; } //流量 string tmp = table.Rows[startRow][CN_WaterFlow].ToString(); if (!tmp.Equals("")) { water.WaterFlow = Decimal.Parse(table.Rows[startRow][CN_WaterFlow].ToString()); } else { //11.12 water.WaterFlow = -9999; } if (table.Rows[startRow][CN_State].ToString() != "") { try { water.state = int.Parse(table.Rows[startRow][CN_State].ToString()); } #pragma warning disable CS0168 // 声明了变量“ex”,但从未使用过 catch (Exception ex) { } #pragma warning restore CS0168 // 声明了变量“ex”,但从未使用过 } else { water.state = 1; } water.TimeRecieved = DateTime.Parse(table.Rows[startRow][CN_RecvDataTime].ToString()); water.ChannelType = CEnumHelper.DBStrToChannelType(table.Rows[startRow][CN_TransType].ToString()); water.MessageType = CEnumHelper.DBStrToMessageType(table.Rows[startRow][CN_MsgType].ToString()); result.Add(water); } return(result); }
public CStationDataAddForm() { InitializeComponent(); InitUI(); m_currentStation = null; m_entityRain = null; m_entityVoltage = null; m_entityWater = null; FormHelper.InitUserModeEvent(this); }
//public void InitRainData() //{ // Random random = new Random(); // DateTime currentDate = DateTime.Now.Date; // List<CEntityRain> lists = new List<CEntityRain>(); // for (int i = 0; i < 24 * 10; ++i) // { // CEntityRain rain = new CEntityRain(); // rain.TimeCollect = currentDate; // rain.PeriodRain = (decimal)random.NextDouble(); // currentDate = currentDate.AddHours(1).AddMinutes(5).AddSeconds(1); // lists.Add(rain); // } // m_chartRain.AddRains(lists); //} public void InitWaterStage() { Random random = new Random(); DateTime currentDate = DateTime.Now.Date; List <CEntityWater> lists = new List <CEntityWater>(); for (int i = 0; i < 24 * 10; ++i) { CEntityWater water = new CEntityWater(); water.TimeCollect = currentDate; water.WaterStage = (decimal)random.NextDouble() + 100; water.WaterFlow = (decimal)random.NextDouble() * 10; currentDate = currentDate.AddHours(1).AddMinutes(5).AddSeconds(1); lists.Add(water); } m_chartWaterFlow.AddWaters(lists); }
/// <summary> /// 根据界面的数据,生成添加的实体类 /// </summary> private void GenerateAdddedDate() { if (chk_Rain.CheckState == CheckState.Checked) { // 新建雨量记录 m_entityRain = new CEntityRain(); m_entityRain.StationID = m_currentStation.StationID; m_entityRain.TimeCollect = dtp_CollectTime.Value; m_entityRain.TimeRecieved = dtp_TimeReceived.Value; m_entityRain.MessageType = CEnumHelper.UIStrToMesssageType(cmb_DataType.Text); m_entityRain.ChannelType = CEnumHelper.UIStrToChannelType(cmb_ChannelType.Text); //m_entityRain.PeriodRain = number_PeriodRain.Value; //m_entityRain.DayRain = number_DayRain.Value; m_entityRain.TotalRain = number_TotalRain.Value; m_entityRain.BState = 1;//默认是正常的 } if (chk_Water.CheckState == CheckState.Checked) { // 新建水位记录 m_entityWater = new CEntityWater(); m_entityWater.StationID = m_currentStation.StationID; m_entityWater.TimeCollect = dtp_CollectTime.Value; m_entityWater.TimeRecieved = dtp_TimeReceived.Value; m_entityWater.MessageType = CEnumHelper.UIStrToMesssageType(cmb_DataType.Text); m_entityWater.ChannelType = CEnumHelper.UIStrToChannelType(cmb_ChannelType.Text); m_entityWater.WaterStage = number_WaterStage.Value; m_entityWater.WaterFlow = number_WaterFlow.Value; m_entityWater.state = 1; } if (chk_Voltage.CheckState == CheckState.Checked) { // 新建电压记录 m_entityVoltage = new CEntityVoltage(); m_entityVoltage.StationID = m_currentStation.StationID; m_entityVoltage.TimeCollect = dtp_CollectTime.Value; m_entityVoltage.TimeRecieved = dtp_TimeReceived.Value; m_entityVoltage.MessageType = CEnumHelper.UIStrToMesssageType(cmb_DataType.Text); m_entityVoltage.ChannelType = CEnumHelper.UIStrToChannelType(cmb_ChannelType.Text); m_entityVoltage.Voltage = number_Voltage.Value; m_entityVoltage.state = 1; } }
// 添加电压记录 public void AddWater(CEntityWater entity) { m_listAddedWater.Add(entity); }
private void AssertWaterData(CEntityWater water, ref ERTDDataState rtdState, bool bNotityWarning = true) { // 判断水量信息是否合法,写入系统信息或者告警信息 CEntityStation station = CDBDataMgr.GetInstance().GetStationById(water.StationID); StringBuilder errinfo = new StringBuilder(); // 判断是否超过最大值 rtdState = ERTDDataState.ENormal; if (station.DWaterMax.HasValue) { if (water.WaterStage > station.DWaterMax) { errinfo.AppendFormat("水位 {0} 超过最大值 {1} 站点编号:{2}", water.WaterStage.ToString("0.00"), station.DWaterMax.Value.ToString("0.00"), water.StationID); rtdState = ERTDDataState.EError; } } // 判断是否低于最小值 if (station.DWaterMin.HasValue) { if (water.WaterStage < station.DWaterMin) { errinfo.AppendFormat("水位 {0} 低于最小值 {1} 站点编号:{2}", water.WaterStage.ToString("0.00"), station.DWaterMin.Value.ToString("0.00"), water.StationID); rtdState = ERTDDataState.EError; } } // 判断是否超过允许变化值,暂时还未考虑好 if (station.DWaterChange.HasValue && station.LastWaterStage.HasValue) { Decimal change = water.WaterStage - station.LastWaterStage.Value; if (change > station.DWaterChange) { errinfo.AppendFormat("水位变化 {0} 超过允许值{1} 站点编号:{2}", change.ToString("0.00"), station.DWaterChange.Value.ToString("0.00"), water.StationID); rtdState = ERTDDataState.EError; } } // 更新水位值,便于计算水位变化 station.LastWaterStage = water.WaterStage; // 通知其它页面 if (!errinfo.ToString().Equals("")) { if (bNotityWarning) { CSystemInfoMgr.Instance.AddInfo(errinfo.ToString(), water.TimeCollect, ETextMsgState.EError); CWarningInfoMgr.Instance.AddInfo(errinfo.ToString(), water.TimeCollect, EWarningInfoCodeType.EWater, station.StationID); if (flag == 0) { flag = 1; ////MessageBoxForm mbForm = new MessageBoxForm(); ////mbForm.StartPosition = FormStartPosition.CenterParent; ////mbForm.Text = "水位报警"; ////mbForm.label3.Text = water.TimeCollect.ToString(); ////mbForm.label1.Text = errinfo.ToString(); ////mbForm.label2.Text = "是否关闭报警声音?"; ////mbForm.TopMost = true; ////mbForm.ShowDialog(); string info = water.TimeCollect.ToString() + "\r\n" + "\r\n" + errinfo.ToString() + "\r\n" + "\r\n" + "是否关闭报警声音?" + "\r\n"; Thread t = new Thread(new ParameterizedThreadStart(MessageShow)); t.Start(info); } } } }
public void Import(CBatchStruct batch, DateTime DStartTime, DateTime DEndTime, bool isUpdate = false) { DateTime? lastTime = null; ERTDDataState tmpRTDWaterDataState = ERTDDataState.ENormal; ////gm 1024 $60091K02031610220800084505230800084505 //string rawString = rawData; //string startTime = rawString.Substring(11, 10); //string endTime = rawString.Substring(27, 6); //string strYear = 20 + startTime.Substring(0, 2); //string strMonth = startTime.Substring(2, 2); //string strStartDay = startTime.Substring(4, 2); //string strStartHour = startTime.Substring(6, 2); //string strStartMinute = startTime.Substring(8, 2); //string strEndDay = endTime.Substring(0, 2); //string strEndHour = endTime.Substring(2, 2); //string strEndMinute = endTime.Substring(4, 2); ////DateTime DStartTime = new DateTime(int.Parse(strYear), int.Parse(strMonth), int.Parse(strStartDay), int.Parse(strStartHour), int.Parse(strStartMinute), 0); ////DateTime DEndTime = new DateTime(int.Parse(strYear), int.Parse(strMonth), int.Parse(strEndDay), int.Parse(strEndHour), int.Parse(strEndMinute), 0); List <CTimeAndData> datas = batch.Datas; string stationid = batch.StationID; EStationType type = batch.StationType; CEntityStation station = m_proxyStation.QueryById(stationid); // if (type == EStationType.ERainFall) if (type == EStationType.ERiverWater) // if (true) { for (int i = 0; i < datas.Count; i++) { if (lastTime == datas[i].Time) { lastTime = datas[i].Time; continue; } lastTime = datas[i].Time; int status = 1; DateTime dt = datas[i].Time; string data = datas[i].Data.ToString(); int RawtotalRain = int.Parse(data.Substring(0, 4)); Nullable <Decimal> RawrainAccuracy = decimal.Parse((data.Substring(4, 2))); Nullable <Decimal> rainAccuracy = RawrainAccuracy / 10; Nullable <Decimal> totalRain = RawtotalRain * rainAccuracy; CEntityRain LastSharpMes = new CEntityRain(); CEntityRain LastDayMes = new CEntityRain(); //如果是第一条数据,则通过数据库获取上一条数据 if (i == 0) { Nullable <Decimal> lastTotalRain = null, lastDayTotalRain = null, lastSharpClockTotalRain = null; Nullable <DateTime> lastDayTime = null; Nullable <DateTime> lastClockSharpTime = null; Nullable <DateTime> lastDataTime = null; Nullable <Decimal> lastPeriodRain = null; Nullable <EChannelType> lastChannelType = null; Nullable <EMessageType> lastMessageType = null; LastSharpMes = m_proxyRain.GetLastSharpRain(stationid, dt); LastDayMes = m_proxyRain.GetLastDayRain(stationid, dt); lastTotalRain = m_proxyRain.GetLastRain(stationid, dt).TotalRain; lastSharpClockTotalRain = LastSharpMes.TotalRain; lastDayTotalRain = LastDayMes.TotalRain; lastClockSharpTime = LastSharpMes.TimeCollect; lastDayTime = LastDayMes.TimeCollect; //改动 // 查询成功 station.LastTotalRain = lastTotalRain; station.LastDayTotalRain = lastDayTotalRain; station.LastPeriodRain = lastPeriodRain; if (lastDataTime != null && lastDataTime.HasValue) { station.LastDataTime = lastDataTime; } if (lastClockSharpTime != null && lastClockSharpTime.HasValue) { station.LastClockSharpTime = lastClockSharpTime; } if (lastDayTime != null && lastDayTime.HasValue) { station.LastDayTime = lastDayTime; } if (lastChannelType != null && lastChannelType.HasValue) { station.LastChannelType = lastChannelType; } if (lastMessageType != null && lastMessageType.HasValue) { station.LastMessageType = lastMessageType; } //int year = dt.Year; //int month = dt.Month; //int day = dt.Day; //DateTime tmp1 = new DateTime(year, month, day, 8, 0, 0); //DateTime tmp2 = tmp1.Subtract(new TimeSpan(24, 0, 0)); //station.LastDayTime = tmp2; //lastSharpClockTotalRain = m_proxyRain.GetLastClockSharpTotalRain(stationid, dt); //lastDayTotalRain = m_proxyRain.GetLastDayTotalRain(stationid, tmp2); station.LastTotalRain = lastTotalRain; station.LastClockSharpTotalRain = lastSharpClockTotalRain; station.LastClockSharpTime = lastClockSharpTime; station.LastDayTotalRain = lastDayTotalRain; station.LastDayTime = lastDayTime; } CEntityRain rain = new CEntityRain(); rain.StationID = stationid; rain.TimeCollect = dt; rain.TotalRain = totalRain; // rain.DifferneceRain = CalDifferenceRain(rainAccuracy, RawtotalRain, station.LastTotalRain, station.DRainChange, ref status); if ((dt.Minute + dt.Second) == 0) { //rain.PeriodRain = CalPeriodRain(rainAccuracy, RawtotalRain, dt, station.LastClockSharpTotalRain); rain.PeriodRain = CalPeriodRain_2(rainAccuracy, RawtotalRain, dt, station.LastClockSharpTotalRain, station.LastClockSharpTime, station.LastTotalRain); station.LastClockSharpTotalRain = totalRain; station.LastClockSharpTime = dt; } if (dt.Hour == 8) { //rain.DayRain = CalDayRain(rainAccuracy, RawtotalRain, dt, station.LastDayTime, station.LastDayTotalRain); rain.DayRain = CalDayRain_2(rainAccuracy, RawtotalRain, dt, station.LastDayTotalRain, station.LastDayTime); station.LastDayTotalRain = totalRain; station.LastDayTime = dt; } rain.DifferneceRain = CalDifferenceRain_1(rainAccuracy, RawtotalRain, station.LastTotalRain, station.DRainChange, ref status); station.LastTotalRain = totalRain; // 待检测 rain.ChannelType = EChannelType.GPRS; rain.MessageType = EMessageType.Batch; rain.TimeRecieved = DateTime.Now; if (status == 1) { rain.BState = 1; } else { rain.BState = 0; } rainResults.Add(rain); } List <CEntityRain> listInsert = new List <CEntityRain>(); List <CEntityRain> listUpdate = new List <CEntityRain>(); List <DateTime> listDateTime = m_proxyRain.getExistsTime(stationid, DStartTime, DEndTime); for (int i = 0; i < rainResults.Count; i++) { if (listDateTime.Contains(rainResults[i].TimeCollect)) { listUpdate.Add(rainResults[i]); } else { listInsert.Add(rainResults[i]); } } m_proxyRain.AddNewRows(listInsert); //写入数据库 m_proxyRain.UpdateRows(listUpdate); //更新 //m_proxyRain.AddOrUpdate(rainResults); } //操作water表 // if (type == EStationType.ERiverWater) if (type == EStationType.ERainFall) { for (int i = 0; i < datas.Count; i++) { decimal data = 0; DateTime dt = datas[i].Time; try { string strData = datas[i].Data.Trim(); //decimal data = int.Parse(datas[i].Data) / 100; data = decimal.Parse(strData) / 100; } #pragma warning disable CS0168 // 声明了变量“e”,但从未使用过 catch (Exception e) #pragma warning restore CS0168 // 声明了变量“e”,但从未使用过 { break; } //操作water表 CEntityWater water = new CEntityWater(); water.StationID = station.StationID; water.TimeCollect = dt; water.TimeRecieved = DateTime.Now; if (station.DWaterBase.HasValue) { // 减去水位基值 water.WaterStage = data + station.DWaterBase.Value; } else { water.WaterStage = data; } water.WaterFlow = CDBDataMgr.GetInstance().GetWaterFlowByWaterStageAndStation(stationid, data); //此处 waterflow需要计算的 water.ChannelType = EChannelType.GPRS; water.MessageType = EMessageType.Batch; AssertWaterData(water, ref tmpRTDWaterDataState); //if (tmpRTDWaterDataState == ERTDDataState.ENormal) //{ // water.state = 1; //} //if (tmpRTDWaterDataState == ERTDDataState.EError) //{ // water.state = 0; //} //if (tmpRTDWaterDataState == ERTDDataState.EWarning) //{ // water.state = 2; //} waterResults.Add(water); } List <CEntityWater> listInsert = new List <CEntityWater>(); List <CEntityWater> listUpdate = new List <CEntityWater>(); List <DateTime> listDateTime = m_proxyWater.getExistsTime(stationid, DStartTime, DEndTime); for (int i = 0; i < waterResults.Count; i++) { if (listDateTime.Contains(waterResults[i].TimeCollect)) { listUpdate.Add(waterResults[i]); } else { listInsert.Add(waterResults[i]); } } // m_proxyWater.AddNewRows(listInsert); //写入数据库 m_proxyWater.UpdateRows(listUpdate); //更新数据库 //m_proxyWater.AddOrUpdate(waterResults); } }