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();
}
}
}
}