You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

297 lines
9.7 KiB
C#

9 months ago
using System;
using System.Collections.Generic;
using FluentScheduler;
using POSV.Entity;
using POSV.HttpApi;
using POSV.HttpResponse;
using POSV.ShoppingCart;
using POSV.Utils;
using System.Linq;
using System.Diagnostics;
using System.Threading;
namespace POSV.Job
{
public class OrderBurdenJob : BaseApi, IJob
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private readonly object _lock = new object();
private bool isRunning = false;
public void Execute()
{
//lock (_lock)
//{
//}
var sw = new Stopwatch();
if (!Global.Instance.IsLogin)
{
logger.Debug("未登录忽略本次上传");
return;
}
if (!Global.Instance.Online)
{
logger.Debug("脱机状态,忽略本次上传");
return;
}
if (!Global.Instance.AllowUpload)
{
logger.Info("正在点单,暂不上传");
return;
}
if (isRunning)
{
logger.Debug("上传中,请稍候...");
return;
}
if (!Global.isHaveBurdenTicket) {
logger.Debug("没有需要上传的耗料数据,isHaveBurdenTicket=false");
return;
}
UploadOrderObject(3);
}
private List<OrderProductBurden> UploadOrderObject(int limit)
{
this.isRunning = true;
var sw = new Stopwatch();
var lists = new List<OrderProductBurden>();
try
{
sw.Start();
using (var db = Global.Instance.OpenDataBase)
{
//主单数据
lists = db.Query<OrderProductBurden>("where uploadStatus = 0 order by uploadErrors limit @0;", limit).ToList();
if (lists.Count <= 0)
{
logger.Debug("没有需要上传的耗料数据,isHaveBurdenTicket=false");
Global.isHaveBurdenTicket = false;
}
}
}
catch (Exception ex)
{
logger.Error(ex, "加载未上传订单异常");
}
finally
{
if (lists.Count > 0)
{
ProcessProductBurden(lists);
sw.Stop();
logger.Info("耗料数据上传<{0}>条数据耗时<{1}>", lists.Count, sw.ElapsedMilliseconds);
}
this.isRunning = false;
}
return lists;
}
private bool ProcessProductBurden(List<OrderProductBurden> orderBurdenList)
{
bool isSuccess = true;
try
{
var uploadObject = BuilderUploadObject(orderBurdenList);
string jsonString = JsonUtils.Serialize(uploadObject);
var uploadResult = this.Uploading(jsonString);
if (uploadResult.Item1)
{
foreach (OrderProductBurden productBurden in orderBurdenList) {
productBurden.UploadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
//上传失败
isSuccess = true;
}
else
{
//上传失败
isSuccess = false;
}
foreach (OrderProductBurden productBurden in orderBurdenList)
{
productBurden.UploadStatus = uploadResult.Item2.Status;
productBurden.UploadMessage = uploadResult.Item2.Message;
productBurden.UploadErrMessage = uploadResult.Item2.ErrMessage;
}
}
catch (Exception ex)
{
isSuccess = false;
logger.Error(ex, "耗料数据上传任务异常");
Global.Instance.BugReport(ex, "耗料数据上传任务异常");
}
finally
{
if (!isSuccess)
{
foreach (OrderProductBurden productBurden in orderBurdenList)
{
productBurden.UploadErrors += 1;
}
}
lock (Global.Instance.SyncLock)
{
foreach (OrderProductBurden productBurden in orderBurdenList)
{
string sql = @"update pos_order_product_burden set uploadStatus = {0}, uploadMessage = '{1}', uploadErrors = {2}, uploadErrMessage = '{3}', uploadTime = '{4}' where id = '{5}';";
SqliteUtils.Execute(string.Format(sql, productBurden.UploadStatus, productBurden.UploadMessage, productBurden.UploadErrors, productBurden.UploadErrMessage, productBurden.UploadTime, productBurden.Id));
}
}
}
return isSuccess;
}
private List<Dictionary<string, object>> BuilderUploadObject(List<OrderProductBurden> orderBurdenList)
{
//耗料数据上传
var ticket_info = new List<Dictionary<string, object>>();
if(orderBurdenList != null)
{
foreach (var burden in orderBurdenList)
{
var p = new Dictionary<string, object>();
//前台系统ID
p["id"] = burden.Id;
//优惠类型
p["tenantId"] = burden.TenantId;
//优惠说明
p["storeId"] = burden.StoreId;
//优惠金额
p["orderId"] = burden.OrderId;
//优惠金额
p["tradeNo"] = burden.TradeNo;
//优惠金额
p["burdenProductId"] = burden.BurdenProductId;
//优惠金额
p["burdenSpecId"] = burden.BurdenSpecId;
//优惠金额
p["salesUnitId"] = burden.SalesUnitId;
//优惠金额
p["salesAmount"] = burden.SalesAmount;
ticket_info.Add(p);
}
}
return ticket_info;
}
private Tuple<bool, EntityResponse<UploadResult>> Uploading(string jsonString)
{
Tuple<bool, EntityResponse<UploadResult>> result = null;
try
{
logger.Debug("开始上传数据......");
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "upload.business.order.burden");
parameters.Add("storeId", Global.Instance.Authc.StoreId);
parameters.Add("jsonString", jsonString);
var ignore = new List<string>();
ignore.Add("jsonString");
parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignore));
string response = HttpClientUtils.PostAsync(api, api.Url, parameters);
logger.Info("上传返回结果:{0}", response);
if (Constant.IsSuccessful(response))
{
var status = JsonUtils.Deserialize<EntityResponse<UploadResult>>(response);
if (status.Status == 1 )
{
logger.Info(status.Message);
result = new Tuple<bool, EntityResponse<UploadResult>>(true, status);
} else if (status.Status == 2) {
logger.Info(status.Message);
result = new Tuple<bool, EntityResponse<UploadResult>>(false, status);
}
else
{
string message = string.Format("<{0}>-{1}-{2}", status.ErrCode, status.ErrMessage, status.Message);
logger.Info(string.Format("上传出错:{0}", message));
result = new Tuple<bool, EntityResponse<UploadResult>>(false, status);
}
}
else
{
string errorMessage = PaserErrors(response);
logger.Info(string.Format("报文解析出错:{0}", errorMessage));
//构建错误信息
var resp = new EntityResponse<UploadResult>();
resp.Status = 0;
resp.Message = errorMessage;
resp.ErrCode = string.Empty;
resp.ErrMessage = string.Empty;
resp.Data = null;
result = new Tuple<bool, EntityResponse<UploadResult>>(false, resp);
}
}
catch (Exception ex)
{
string message = string.Format("上传发生异常");
logger.Error(ex, message);
//构建异常错误
var resp = new EntityResponse<UploadResult>();
resp.Status = 0;
resp.Message = message;
resp.ErrCode = string.Empty;
resp.ErrMessage = string.Empty;
resp.Data = null;
result = new Tuple<bool, EntityResponse<UploadResult>>(false, resp);
}
return result;
}
}
}