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
|
/// <summary>
|
/// 类的状态
|
/// </summary>
|
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; }
|
|
/// <summary>
|
/// 当消息有变化的时候将消息通过事件传输
|
/// </summary>
|
private string ConsoleMessage { get; set; }
|
public event WriteLogHandle WriteLog;
|
public event WriteLogHandle WriteErrorLog;
|
|
#region 线程类Allocation()
|
/// <summary>
|
/// 线程类
|
/// </summary>
|
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)
|
/// <summary>
|
/// 执行调用
|
/// </summary>
|
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<DataSet>(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<string, Type>();
|
foreach (JObject item in propds.Value.Children<JObject>())
|
{
|
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<JObject>())
|
{
|
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();
|
}
|
}
|
|
}
|
}
|