using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TRS.Export.BLL;
using TRS.Export.Common;
using TRS.Export.Entity;
using TRS.Export.FrameEntity.Constants;
using TRS.Export.FrameEntity.Enums;
using TRS.Export.FrameProvider;
using TRS.Export.Param.Bases;
using TRS.Export.Scheduler.Interfaces;
using TRS.Export.Business;
using TRS.Export.Service.API;
using Newtonsoft.Json;
namespace TRS.Export.Scheduler.Schedulers.Pushs
{
public class PushsTaobaoApiSourceScheduler : IScheduler
{
private readonly string PCS_API = ConfigurationManager.AppSettings["PCSReceiveAPI"];
private readonly string TWX_API = ConfigurationManager.AppSettings["TaoBaoOrderAPI"];
private readonly string PCS_RECEIVE_CODES = ConfigurationManager.AppSettings["PCSReceiveCodes"];
private readonly string TWX_REJECT_CODES = ConfigurationManager.AppSettings["TWXRejectCodes"];
private readonly string PCS_RECEIVE_OPEN = ConfigurationManager.AppSettings["PCSReceiveOpen"];
private readonly string TWX_RECEIVE_OPEN = ConfigurationManager.AppSettings["TWXReceiveOpen"];
private readonly TaoBaoAPISourceBLL m_objSourceBLL = new TaoBaoAPISourceBLL();
private readonly TaoBaoAPISource_SucessBLL m_objSourceSucessBLL = new TaoBaoAPISource_SucessBLL();
private readonly string PATH = @"D:Beyond.TWX.JobApp.LogPushsTaobaoApiSource";
string ExceptionTel = ConfigurationManager.AppSettings["ExceptionTelNumbers"];
public int SleepInterval { get; set; }
public string[] Args { get; set; }
public PushsTaobaoApiSourceScheduler()
{
SleepInterval = 2000;
}
public void Execute()
{
if (Args == null || Args.Length == 0)
{
Console.WriteLine("参数不能为空!");
return;
}
string threadName = string.Format("报文解析后台Job-{0}", "后缀");
string[] arrays = Args[0].Split('/');
while (true)
{
List<Task> tasks = new List<Task>();
foreach (var value in arrays)
{
tasks.Add(Task.Factory.StartNew(() =>
{
ExecuteTask(value);
}));
}
Task.WaitAll(tasks.ToArray());
Console.WriteLine("当前线程:[{0}],等待{1}秒后继续...{2}", threadName, SleepInterval / 1000, DateTime.Now);
Thread.Sleep(SleepInterval);
}
}
public void ExecuteTask(string suffix)
{
string threadName = string.Format("报文解析后台Job-{0}", suffix);
Console.WriteLine("当前线程:[{0}]{1}秒后继续...{2}", threadName, 0 / 1000, DateTime.Now);
var where = new WhereHelper<TaoBaoAPISource>(a => a.DoWith.In(0, 2, 3) && a.ActionTime < 4 && a.ID.Right(suffix.Split(',')));
List<TaoBaoAPISource> list = m_objSourceBLL.Select(where, 100);
foreach (var item in list)
{
ExecuteTask(item);
}
}
public void ExecuteTask(TaoBaoAPISource source)
{
try
{
Task<ResponseParam> task_pcs = Task.Factory.StartNew<ResponseParam>(() => { return ExecuteTaskPcs(source); });
Task<ResponseParam> task_twx = Task.Factory.StartNew<ResponseParam>(() => { return ExecuteTaskTwx(source); });
Task.WaitAll(task_pcs, task_twx);
if (!task_pcs.Result.success && task_pcs.Result.msg_code == "PCS" || !task_twx.Result.success && task_twx.Result.msg_code == "TWX")
{
if (task_pcs.Result.success)
{
source.DoWith = 2;
}
if (task_twx.Result.success)
{
source.DoWith = 3;
}
ExecuteDoWith(source);
Console.WriteLine("编号:{0}分发失败,开始重新尝试!", source.ID);
}
else
{
ExecuteBackup(source);
Console.WriteLine("编号:{0}分发成功,已经备份数据!", source.ID);
}
}
catch (Exception ex)
{
if (ex != null)
{
//日志记录异常
LogHelper.Info(ex.Message + "
" + ex.Source + "
" + ex.StackTrace, PATH);
//发送短信
SendMessageParam param = new SendMessageParam()
{
Destination = "中国",
Mobile = String.IsNullOrEmpty(ExceptionTel) ? "13728938720" : ExceptionTel,
Message = "分发job出现异常"
};
string req_content = JsonConvert.SerializeObject(param);
ResponseParam response = new SendMessageAPI().Send(req_content);
}
}
}
#region 分发报文调用PCS接口
public ResponseParam ExecuteTaskPcs(TaoBaoAPISource source)
{
Stopwatch watch = new Stopwatch();
watch.Start();
ResponseParam resonse = new ResponseParam();
if (source.DoWith == 2)
{
resonse.success = true;
resonse.msg_code = "PCS";
resonse.msg = string.Format("编号:{0}分发PCS系统成功,不能重复分发!", source.ID);
Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, 0, "", DateTime.Now);
return resonse;
}
string urlDecode = source.ApiContent.UrlDecode();
string[] pcs_codes = PCS_RECEIVE_CODES.Split('|');
foreach (var code in pcs_codes)
{
if (urlDecode.IndexOf(code) > -1)
{
resonse.success = true;
break;
}
}
if (!resonse.success)
{
resonse.msg_code = "TWX";
resonse.msg = string.Format("编号:{0}不是PCS系统订单!", source.ID);
}
else
{
resonse.msg_code = "PCS";
string result = new HttpHelper().Execute(PCS_API, source.ApiContent);
if (!result.IsNullOrEmpty())
{
resonse.msg = string.Format("编号:{0}分发PCS系统成功", source.ID);
resonse.success = result.IndexOf("true") > -1;
}
else
{
resonse.msg = string.Format("编号:{0}分发PCS系统失败", source.ID);
resonse.success = false;
}
}
watch.Stop();
Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, watch.ElapsedMilliseconds / 1000.00, "", DateTime.Now);
return resonse;
}
#endregion
#region 分发报文到TWX接口
public ResponseParam ExecuteTaskTwx(TaoBaoAPISource source)
{
Stopwatch watch = new Stopwatch();
watch.Start();
ResponseParam resonse = new ResponseParam();
if (source.DoWith == 3)
{
resonse.success = true;
resonse.msg_code = "TWX";
resonse.msg = string.Format("编号:{0}分发TWX系统成功,不能重复分发!", source.ID);
Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, 0, "", DateTime.Now);
return resonse;
}
string urlDecode = source.ApiContent.UrlDecode();
string[] twx_codes = TWX_REJECT_CODES.Split('|');
foreach (var code in twx_codes)
{
if (urlDecode.IndexOf(code) > -1)
{
resonse.success = true;
break;
}
}
if (resonse.success)
{
resonse.success = false;
resonse.msg_code = "PCS";
resonse.msg = string.Format("编号:{0}不是TWX系统订单!", source.ID);
}
else
{
resonse.msg_code = "TWX";
string result = new HttpHelper().Execute(TWX_API, source.ApiContent);
if (!result.IsNullOrEmpty())
{
resonse.msg = string.Format("编号:{0}分发TWX系统成功", source.ID);
resonse.success = result.IndexOf("true") > -1;
}
else
{
resonse.msg = string.Format("编号:{0}分发TWX系统失败", source.ID);
resonse.success = false;
}
}
watch.Stop();
Console.WriteLine("{0}!耗时:{1} {2} {3}", resonse.msg, watch.ElapsedMilliseconds / 1000.00, "", DateTime.Now);
return resonse;
}
#endregion
public ResponseParam ExecuteBackup(TaoBaoAPISource source)
{
ResponseParam response = new ResponseParam();
string content = source.ApiContent.UrlDecode();
string tradeOrderId = StringHelper.GetValueByCutStr(ref content, "<tradeOrderId>", "</tradeOrderId>", false);
if (string.IsNullOrEmpty(tradeOrderId))
{
tradeOrderId = StringHelper.GetValueByCutStr(ref content, "<logisticsOrderCode>", "</logisticsOrderCode>", false);
}
string columns = "ID,ApiContent,CreateTime,FinishTime,TradeOrderID";
string values = "@ID,@ApiContent,@CreateTime,@FinishTime,@TradeOrderID";
string strTableName = string.Format("TaoBaoAPISource_Sucess_Log{0}", DateTime.Today.ToString("yyMM"));
string commandText = string.Format(SqlConstants.SQL_INSERT_FORMAT, strTableName, columns, values);
string connectionString = ConfigurationManager.AppSettings["SqlServer0"];
var param = new { ID = source.ID, ApiContent = source.ApiContent, CreateTime = source.CreateTime, FinishTime = DateTime.Now, TradeOrderID = (tradeOrderId ?? "").Trim() };
int effect = DapperSqlHelper.Execute(commandText, param, connectionString);
response.success = effect > 0;
if (response.success)
{
m_objSourceBLL.Delete(source);
}
return response;
}
public void ExecuteDoWith(TaoBaoAPISource source)
{
TaoBaoAPISource update = new TaoBaoAPISource();
update.ID = source.ID;
update.DoWith = source.DoWith;
if (source.DoWith != 0)
{
update.ActionTime = source.ActionTime + 1;
}
m_objSourceBLL.Update(update);
}
}
}