ソースを参照

增加入库异常数据处理

yinyujing 2 年 前
コミット
ca0977ef52
共有2 個のファイルを変更した195 個の追加66 個の削除を含む
  1. 4 0
      NB_IOT_TCP_HP_SOCKET/App.config
  2. 191 66
      NB_IOT_TCP_HP_SOCKET/WWKJUtil/ProtocolAnalysisTools.cs

+ 4 - 0
NB_IOT_TCP_HP_SOCKET/App.config

@@ -39,6 +39,10 @@
     <add key="DataColumnHis" value="NetCumulativeFlow|净累计流量,PositiveCumulativeFlow|正累计流量,NegativeCumulativeFlow|负累计流量,InstantaneousFlow|瞬时流量,Pressure|压力,BatteryVoltageValue|电池电压,signalQuality|信号质量" />
     <!-- 上报抄表数据对应的数据库字段(水表表MeterAssessmentBase) -->
     <add key="DataColumnMeter" value="NetCumulativeFlow|净累计流量,PositiveCumulativeFlow|正累计流量,NegativeCumulativeFlow|负累计流量,InstantaneousFlow|瞬时流量,Pressure|压力,BatteryVoltageValue|电池电压,signalQuality|信号质量" />
+    <!-- 上报抄表数据净累计流量字段 -->
+    <add key="NetCumulativeFlow" value="净累计流量" />
+    <!-- 极大值 时间范围参数 单位分钟-->
+    <add key="BigNumberTimeScopeParam" value="30" />
   </appSettings>
   <startup>
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />

+ 191 - 66
NB_IOT_TCP_HP_SOCKET/WWKJUtil/ProtocolAnalysisTools.cs

@@ -622,6 +622,7 @@ namespace NB_IOT_TCP_HP_SOCKET.WWKJUtil
         /// <param name="list"></param>
         public static void SaveRecordNew(List<HistoryRecord> list)
         {
+            string NetCumulativeFlowCol = ConfigurationManager.AppSettings["NetCumulativeFlow"];
             // 上报抄表数据对应的数据库字段(历史记录表MeterAssessment_***)
             string dataColumnHis = ConfigurationManager.AppSettings["DataColumnHis"];
             string[] dataColumnHisArr = dataColumnHis.Split(',');
@@ -648,53 +649,148 @@ namespace NB_IOT_TCP_HP_SOCKET.WWKJUtil
                     // 判断同一抄表时间的历史记录是否存在
                     if (!CheckRecordExsitNew(tablename, record2.RecordTime))
                     {
-                        StringBuilder strSql = new StringBuilder();
-                        strSql.Append(" insert into ").Append(tablename).Append(" ( GetDateTime,createTime");
                         List<CommData> dataList = record2.DataList;
-                        StringBuilder cellValue = new StringBuilder();
-                        foreach (KeyValuePair<string, string> kvp in cols) 
+                        StringBuilder strSql = new StringBuilder();
+                        strSql.Append("SELECT * FROM MeterAssessmentBase where MeterAssessmentId = ").Append(meterId);
+                        DataTable dataTable = DBHelper.ExecuteDataTable(strSql.ToString(), CommandType.Text, null);
+                        strSql.Clear();
+                        // 水表状态未挂起,或者不是贸易表
+                        if (dataTable.Rows[0]["isHangup"].ToString() == "0" || dataTable.Rows[0]["IsKaoHe"].ToString() != "1")
                         {
-                            CommData commData = dataList.Find(e => e.Name == kvp.Value);
-                            if (commData != null) 
+                            bool isHangUp = false;
+                            // 贸易表
+                            if (dataTable.Rows[0]["IsKaoHe"].ToString() == "1") 
                             {
-                                strSql.Append(",").Append(kvp.Key);
-                                if ((((commData.Value == null) || (commData.Value == "")) || ((commData.Value == "未知") || (commData.Value == "--"))) || (commData.Value == "非数字"))
+                                CommData commData = dataList.Find(e => e.Name == NetCumulativeFlowCol);
+                                decimal thisMeterNum = Convert.ToDecimal(commData.Value);
+                                // 判断本期小于上期
+                                if (Convert.ToDecimal(dataTable.Rows[0]["NetCumulativeFlow"]) <= thisMeterNum)
+                                {
+
+                                    //判断每日用水量 的阀值
+                                    if (!CompareBigNumber(tablename, record2.RecordTime, thisMeterNum, Convert.ToDecimal(dataTable.Rows[0]["threshold"])))
+                                    {
+                                        isHangUp = true;
+                                        // InsertAlarmRecord(m, "2019", "用日水量突增");
+                                    }
+
+                                }
+                                else //异常挂起
                                 {
-                                    cellValue.Append(",0");
+                                    isHangUp = true;
+                                    // InsertAlarmRecord(m, "2018", "本期小于上期");
                                 }
-                                else
+                            }
+                            if (!isHangUp)
+                            {
+                                strSql.Append(" insert into ").Append(tablename).Append(" ( GetDateTime,createTime");
+                                StringBuilder cellValue = new StringBuilder();
+                                foreach (KeyValuePair<string, string> kvp in cols)
                                 {
-                                    if (commData.Tag == null || "".Equals(commData.Tag) || "BIT".Equals(commData.Tag.ToUpper()))
+                                    CommData commData = dataList.Find(e => e.Name == kvp.Value);
+                                    if (commData != null)
                                     {
-                                        cellValue.Append(",'").Append(commData.Value).Append("'");
+                                        strSql.Append(",").Append(kvp.Key);
+                                        if ((((commData.Value == null) || (commData.Value == "")) || ((commData.Value == "未知") || (commData.Value == "--"))) || (commData.Value == "非数字"))
+                                        {
+                                            cellValue.Append(",0");
+                                        }
+                                        else
+                                        {
+                                            if (commData.Tag == null || "".Equals(commData.Tag) || "BIT".Equals(commData.Tag.ToUpper()))
+                                            {
+                                                cellValue.Append(",'").Append(commData.Value).Append("'");
+                                            }
+                                            else
+                                            {
+                                                cellValue.Append(",").Append(commData.Value);
+                                            }
+                                        }
                                     }
-                                    else
+                                }
+                                strSql.Append(") values ('").Append(record2.RecordTime.ToString()).Append("',GETDATE()").Append(cellValue.ToString()).Append(")");
+
+                                int rs = DBHelper.Query(strSql.ToString());
+                                if (rs > 0 && Convert.ToDateTime(record2.RecordTime.ToString()) >= Convert.ToDateTime(dataTable.Rows[0]["GetDateTime"])) 
+                                {
+                                    UpdateDeviceLastDataNew(meterId, record2);
+                                }
+                            }
+                            else 
+                            {
+                                // 水表挂起,插入临时表
+                                strSql.Append(" insert into MeterAssessmentTableNameTemplate (meterId,GetDateTime,createTime");
+                                StringBuilder cellValue = new StringBuilder();
+                                foreach (KeyValuePair<string, string> kvp in cols)
+                                {
+                                    CommData commData = dataList.Find(e => e.Name == kvp.Value);
+                                    if (commData != null)
                                     {
-                                        cellValue.Append(",").Append(commData.Value);
+                                        strSql.Append(",").Append(kvp.Key);
+                                        if ((((commData.Value == null) || (commData.Value == "")) || ((commData.Value == "未知") || (commData.Value == "--"))) || (commData.Value == "非数字"))
+                                        {
+                                            cellValue.Append(",0");
+                                        }
+                                        else
+                                        {
+                                            if (commData.Tag == null || "".Equals(commData.Tag) || "BIT".Equals(commData.Tag.ToUpper()))
+                                            {
+                                                cellValue.Append(",'").Append(commData.Value).Append("'");
+                                            }
+                                            else
+                                            {
+                                                cellValue.Append(",").Append(commData.Value);
+                                            }
+                                        }
                                     }
                                 }
-                            }
-                        }
-                        strSql.Append(") values ('").Append(record2.RecordTime.ToString()).Append("',GETDATE()").Append(cellValue.ToString()).Append(")");
+                                strSql.Append(") values (").Append(meterId).Append(",'").Append(record2.RecordTime.ToString()).Append("',GETDATE()").Append(cellValue.ToString()).Append(")");
 
-                        int rs = DBHelper.Query(strSql.ToString());
+                                int rs = DBHelper.Query(strSql.ToString());
 
-                        if (rs > 0)
-                        {
-                            if (lastData.ContainsKey(meterId))
-                            {
-                                HistoryRecord historyRecord = lastData[meterId];
-                                if (record2.RecordTime >= historyRecord.RecordTime)
+                                if (rs > 0)
                                 {
-                                    lastData[meterId] = record2;
+                                    strSql.Clear();
+                                    strSql.Append("UPDATE MeterAssessmentBase SET isHangup = 1 WHERE MeterAssessmentId = ").Append(meterId);
+                                    // 更新水表未挂起状态
+                                    DBHelper.Query(strSql.ToString());
                                 }
                             }
-                            else
+                        }
+                        else 
+                        {
+                            // 水表挂起,插入临时表
+                            strSql.Append(" insert into MeterAssessmentTableNameTemplate (meterId,GetDateTime,createTime");
+                            StringBuilder cellValue = new StringBuilder();
+                            foreach (KeyValuePair<string, string> kvp in cols)
                             {
-                                lastData[meterId] = record2;
+                                CommData commData = dataList.Find(e => e.Name == kvp.Value);
+                                if (commData != null)
+                                {
+                                    strSql.Append(",").Append(kvp.Key);
+                                    if ((((commData.Value == null) || (commData.Value == "")) || ((commData.Value == "未知") || (commData.Value == "--"))) || (commData.Value == "非数字"))
+                                    {
+                                        cellValue.Append(",0");
+                                    }
+                                    else
+                                    {
+                                        if (commData.Tag == null || "".Equals(commData.Tag) || "BIT".Equals(commData.Tag.ToUpper()))
+                                        {
+                                            cellValue.Append(",'").Append(commData.Value).Append("'");
+                                        }
+                                        else
+                                        {
+                                            cellValue.Append(",").Append(commData.Value);
+                                        }
+                                    }
+                                }
                             }
+                            strSql.Append(") values (").Append(meterId).Append(",'").Append(record2.RecordTime.ToString()).Append("',GETDATE()").Append(cellValue.ToString()).Append(")");
+
+                            int rs = DBHelper.Query(strSql.ToString());
                         }
                     }
+
                 }
                 catch (Exception ex)
                 {
@@ -703,19 +799,55 @@ namespace NB_IOT_TCP_HP_SOCKET.WWKJUtil
                 }
             }
 
-            // 更新最后状态信息
-            foreach (KeyValuePair<string, HistoryRecord> kvp in lastData)
+        }
+
+        /// <summary>
+        /// 判断,每日用水量是否超过阀值
+        /// </summary>
+        /// <param name="tableName">历史记录表名称</param>
+        /// <param name="getDataTime">抄表时间</param>
+        /// <param name="thisMeterNum">抄表净累计</param>
+        /// <param name="threshold">阈值</param>
+        /// <returns></returns>
+        public static bool CompareBigNumber(string tableName, DateTime getDataTime, decimal thisMeterNum, decimal threshold)
+        {
+            DateTime preTime, curTime;
+            int time = 30;
+            string timeIntStr = ConfigurationManager.AppSettings["BigNumberTimeScopeParam"];
+            string sql = "";
+            Object obj = new Object();
+            decimal meterNum = 0, dayUsedWater = 0;
+
+            if (!string.IsNullOrEmpty(timeIntStr))
             {
-                try
-                {
-                    UpdateDeviceLastDataNew(kvp);
-                }
-                catch (Exception ex)
-                {
-                    LogUtil.WriteLog(ex.Message + ">>>" + ex.StackTrace);
-                    continue;
-                }
+                time = Convert.ToInt32(timeIntStr);
+            }
+            preTime = getDataTime.AddDays(-1).AddMinutes(0 - time);
+            curTime = getDataTime.AddDays(-1).AddMinutes(time);
+
+            sql = "SELECT AVG(NetCumulativeFlow) AS NetCumulativeFlow FROM " + tableName + " WHERE GetDateTime between  '" + preTime + "' AND '" + curTime + "'"; // 获取 24小时之前的 表码
+
+            obj = DBHelper.ExecuteScalar(sql, CommandType.Text, null);
+            if (obj == null || obj == DBNull.Value)
+            {
+                return true;
+            }
+            else
+            {
+                meterNum = Convert.ToDecimal(obj);
+            }
+            dayUsedWater = thisMeterNum - meterNum;
+
+
+            if (threshold >= dayUsedWater || threshold == 0)// 阀值 跟日用水量比较
+            {
+                return true;
+            }
+            else
+            {
+                return false;
             }
+
         }
 
         /// <summary>
@@ -882,7 +1014,7 @@ namespace NB_IOT_TCP_HP_SOCKET.WWKJUtil
         /// <param name="deviceId"></param>
         /// <param name="recDate"></param>
         /// <param name="dataList"></param>
-        private static void UpdateDeviceLastDataNew(KeyValuePair<string, HistoryRecord> kvp)
+        private static void UpdateDeviceLastDataNew(string meterId, HistoryRecord historyRecord)
         {
             // 上报抄表数据对应的数据库字段(水表表MeterAssessmentBase)
             string dataColumnMeter = ConfigurationManager.AppSettings["DataColumnMeter"];
@@ -894,51 +1026,44 @@ namespace NB_IOT_TCP_HP_SOCKET.WWKJUtil
                 string[] dataColumnArr = dataColumn.Split('|');
                 cols[dataColumnArr[0]] = dataColumnArr[1];
             }
-            string meterId = kvp.Key;
-            string recDate = kvp.Value.RecordTime.ToString();
-            List<CommData> dataList = kvp.Value.DataList;
-            string dataSource = kvp.Value.DataSource;
+            string recDate = historyRecord.RecordTime.ToString();
+            List<CommData> dataList = historyRecord.DataList;
+            string dataSource = historyRecord.DataSource;
             StringBuilder strSql = new StringBuilder();
-            strSql.Append("SELECT * FROM MeterAssessmentBase where MeterAssessmentId = ").Append(meterId);
-            DataTable dataTable = DBHelper.ExecuteDataTable(strSql.ToString(), CommandType.Text, null);
-            strSql.Clear();
             StringBuilder valueStr = new StringBuilder();
 
-            if ((dataList == null) || (dataList.Count == 0))
+            if (dataList == null || dataList.Count == 0)
             {
                 return;
             }
 
-            if (Convert.ToDateTime(recDate) >= Convert.ToDateTime(dataTable.Rows[0]["GetDateTime"]))
-            {
-                strSql.Append("update MeterAssessmentBase set GetDateTime = '").Append(recDate).Append("'");
+            strSql.Append("update MeterAssessmentBase set GetDateTime = '").Append(recDate).Append("'");
 
-                foreach (KeyValuePair<string, string> kvpTmp in cols)
+            foreach (KeyValuePair<string, string> kvpTmp in cols)
+            {
+                CommData commData = dataList.Find(e => e.Name == kvpTmp.Value);
+                if (commData != null)
                 {
-                    CommData commData = dataList.Find(e => e.Name == kvpTmp.Value);
-                    if (commData != null)
+                    if ((((commData.Value == null) || (commData.Value == "")) || ((commData.Value == "未知") || (commData.Value == "--"))) || (commData.Value == "非数字"))
                     {
-                        if ((((commData.Value == null) || (commData.Value == "")) || ((commData.Value == "未知") || (commData.Value == "--"))) || (commData.Value == "非数字"))
+                        strSql.Append(",[").Append(kvpTmp.Key).Append("]='0'");
+                    }
+                    else
+                    {
+                        if (commData.Tag == null || "".Equals(commData.Tag) || "BIT".Equals(commData.Tag.ToUpper()))
                         {
-                            strSql.Append(",[").Append(kvpTmp.Key).Append("]='0'");
+                            strSql.Append(",[").Append(kvpTmp.Key).Append("]='").Append(commData.Value).Append("'");
                         }
                         else
                         {
-                            if (commData.Tag == null || "".Equals(commData.Tag) || "BIT".Equals(commData.Tag.ToUpper()))
-                            {
-                                strSql.Append(",[").Append(kvpTmp.Key).Append("]='").Append(commData.Value).Append("'");
-                            }
-                            else
-                            {
-                                strSql.Append(",[").Append(kvpTmp.Key).Append("]=").Append(commData.Value).Append("");
-                            }
+                            strSql.Append(",[").Append(kvpTmp.Key).Append("]=").Append(commData.Value).Append("");
                         }
                     }
                 }
-
-                strSql.Append(" where MeterAssessmentId = ").Append(meterId);
-                DBHelper.Query(strSql.ToString());
             }
+
+            strSql.Append(" where MeterAssessmentId = ").Append(meterId);
+            DBHelper.Query(strSql.ToString());
         }
 
         /// <summary>