using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; namespace DataexchangeServer { public delegate void WriteLogHandle(string msg); #region 类的状态 enum State /// /// 类的状态 /// public enum State { Alive, //激活 Finish,//完成 Sleep //睡眠 } #endregion public class Allocation { public State state { get; set; } public string Name { get; set; } public string ID { get; set; } public string task_id { get; set; } public DataTable tbQueue; private SQLHelper _sqlHelper; private DataSet dsTemp = new DataSet(); public DateTime strStartTime { get; set; } /// /// 当消息有变化的时候将消息通过事件传输 /// private string ConsoleMessage { get; set; } public event WriteLogHandle WriteLog; public event WriteLogHandle WriteErrorLog; #region 线程类Allocation() /// /// 线程类 /// public Allocation() { string conn = ConfigurationManager.ConnectionStrings["conn"].ConnectionString; conn = SecurityHelper.Decrypt(conn); _sqlHelper = new SQLHelper(conn); //_sqlHelper = //new SQLHelper( // Encoding.Default.GetString( // Convert.FromBase64String(ConfigurationManager.ConnectionStrings["conn"].ConnectionString))); tbQueue = new DataTable(); string SqlStr = string.Format(@"Select top 0 * from SYSDEC (nolock) where 1<>1"); tbQueue = _sqlHelper.ExecuteDataTable(SqlStr); tbQueue.TableName = "SYSDEC"; tbQueue.PrimaryKey = new[] { tbQueue.Columns["task_id"] }; state = State.Sleep; } #endregion #region 执行调用void Execute(object obj) /// /// 执行调用 /// public void Execute(object obj) { string data = ""; string taskId = ""; string docType = ""; //string inputXml = ""; string operatype = ""; string msg = ""; string data_inserted = ""; string flag = "0"; //lock (ID) ; try { state = State.Alive; DataRow[] rowArray = tbQueue.Select("", "create_time"); if (rowArray.Length == 0) return; AE_MES_ERP Client = new AE_MES_ERP(); foreach (DataRow row in rowArray) { if (object.Equals(null, row["data_inserted"])) { row["msg"] = "插入的数据为空,请检查程序!"; row["states"] = "FAIL"; row["retry_times"] = Convert.ToInt16(row["retry_times"].ToString() == "" ? "0" : row["retry_times"].ToString()) + 15; row["execute_time"] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); continue; } taskId = row["task_id"].ToString(); data = row["data"].ToString(); docType = row["task_name"].ToString(); data_inserted = row["data_inserted"].ToString(); operatype = row["operatype"].ToString(); ConsoleMessage = string.Format("线程:{0},{1}执行内容:{2} 推送Data:{3} 执行时间:{4}", Name, row["creator"].ToString(), row["descript"].ToString(), row["data"].ToString(), System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); if (WriteLog != null) { WriteLog(ConsoleMessage); } //DataTable tbTemp = JSONHelper.JsonToDataTable(data_inserted); if ((!docType.Contains("TB_MESTOERP")&& (!docType.Contains("XKY")))) { if (operatype!="DELETE") { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.Converters.Add(new ReadAheadDataSetConverter()); dsTemp = JsonConvert.DeserializeObject(data_inserted, settings); // dsTemp = JsonConvert.DeserializeObject(data_inserted, typeof(DataSet)) as DataSet; if (dsTemp == null || dsTemp.Tables.Count == 0) { row["msg"] = "接口存在无效字符"; row["states"] = "FAIL"; row["retry_times"] = Convert.ToInt16(row["retry_times"].ToString() == "" ? "0" : row["retry_times"].ToString()) + 15; row["execute_time"] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); continue; } } else { operatype = data; } } //dsTemp.Tables.Clear(); //dsTemp.Tables.Add(tbTemp); //inputXml = dsTemp.GetXml(); msg = ""; //Thread.Sleep(3000); //DataexchangeServer.IMS.WebServiceClient Client = new DataexchangeServer.IMS.WebServiceClient(); if (Client.ErpToMesData(docType, dsTemp, operatype, row, ref msg,ref flag, taskId) == true) { if (flag=="0") { row["msg"] = msg; row["states"] = "FAIL"; row["retry_times"] = Convert.ToInt16(row["retry_times"].ToString() == "" ? "0" : row["retry_times"].ToString()) + 1; row["execute_time"] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if (WriteErrorLog != null) { WriteErrorLog(msg); } } else { row["msg"] = msg; row["remark"] = "OK"; row["states"] = "SUCCESS"; row["execute_time"] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } } else { row["msg"] = msg; row["states"] = "FAIL"; row["retry_times"] = Convert.ToInt16(row["retry_times"].ToString() == "" ? "0" : row["retry_times"].ToString()) + 1; row["execute_time"] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); if (WriteErrorLog != null) { WriteErrorLog(msg); } } } _sqlHelper.SaveDataToDB(tbQueue); tbQueue.AcceptChanges(); } catch (Exception ex) { //state = State.Finish; //throw (ex); //MessageBox.Show("当前错误信息如下:" + ex); ConsoleMessage = string.Format(@"task_id:{0},{1}异常信息:" + ex.Message, taskId, DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss")); bool result = JSONHelper.WriteToFile(ConsoleMessage); ConsoleMessage = string.Format(@"Save {0},ID:{1} 出现异常信息,请在运行目录下查看。\log\", result, data); if (WriteErrorLog != null) { WriteErrorLog(ConsoleMessage); } } finally { state = State.Finish; } if (tbQueue.Rows.Count > 0) { ConsoleMessage = string.Format("线程:{0}任务结束。时间:{1}", Name, System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ")); if (WriteLog != null) { WriteLog(ConsoleMessage); } //state = State.Finish; } } #endregion public class ReadAheadDataSetConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(DataSet); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject jObject = JObject.Load(reader); return BuildDataSet(jObject); } private DataSet BuildDataSet(JObject jObject) { DataSet dsResult = new DataSet(); foreach (JProperty propds in jObject.Properties()) { DataTable table = new DataTable(propds.Name); var dataTypes = new Dictionary(); foreach (JObject item in propds.Value.Children()) { foreach (JProperty prop in item.Properties()) { Type currentType = GetDataType(prop.Value.Type); if (currentType != null) { Type previousType; if (!dataTypes.TryGetValue(prop.Name, out previousType) || (previousType == typeof(long) && currentType == typeof(decimal))) { dataTypes[prop.Name] = currentType; } else if (previousType == typeof(decimal) && currentType == typeof(long)) { dataTypes[prop.Name] = previousType; } else if (previousType != currentType) { dataTypes[prop.Name] = typeof(string); } } } } foreach (var kvp in dataTypes) { table.Columns.Add(kvp.Key, kvp.Value); } foreach (JObject itemdr in propds.Value.Children()) { DataRow row = table.NewRow(); foreach (JProperty prop in itemdr.Properties()) { if (prop.Value.Type != JTokenType.Null) { Type dataType = dataTypes[prop.Name]; row[prop.Name] = prop.Value.ToObject(dataType); } } table.Rows.Add(row); } dsResult.Tables.Add(table); } return dsResult; } private Type GetDataType(JTokenType tokenType) { switch (tokenType) { case JTokenType.Null: return null; case JTokenType.String: return typeof(string); case JTokenType.Integer: return typeof(long); case JTokenType.Float: return typeof(decimal); case JTokenType.Boolean: return typeof(bool); case JTokenType.Date: return typeof(DateTime); case JTokenType.TimeSpan: return typeof(TimeSpan); case JTokenType.Guid: return typeof(Guid); case JTokenType.Bytes: return typeof(byte[]); case JTokenType.Array: case JTokenType.Object: throw new JsonException("This converter does not support complex types"); default: return typeof(string); } } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } } }