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.

646 lines
26 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
using System.Text;
namespace POSV.Job
{
public class SplitPayUploadJob : 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.Info("营业分账数据上传中,请稍候...");
return;
}
if (!Global.isHaveUpLoadSplitPay)
{
logger.Debug("没有需要上传的营业分账数据,isHaveUpLoadSplitPay=false");
return;
}
UploadSplitPay(10);
}
private List<SplitStorePayEntity> UploadSplitPay(int limit)
{
this.isRunning = true;
var sw = new Stopwatch();
var lists = new List<SplitStorePay>();
var lists2 = new List<SplitStorePayEntity>();
try
{
sw.Start();
using (var db = Global.Instance.OpenDataBase)
{
//主单数据
//lists = db.Query<SplitStorePay>("where syncStatus = 0 and uploadErrors < 3000 order by uploadErrors limit @0;", limit).ToList();
//if (lists.Count <= 0)
//{
// //var ids = string.Join("','", lists.ConvertAll(x => x.Id).ToArray());
// logger.Info("没有需要上传的营业分账数据,isHaveUpLoadSplitPay=false");
// Global.isHaveUpLoadSplitPay = false;
//}
//else
//{
// //StringBuilder sqlBuld = new StringBuilder();
// //sqlBuld.Append("SELECT ssp.* FROM pos_split_store_pay ssp ");
// //sqlBuld.Append("LEFT JOIN pos_order ord ON ssp.busNo=ord.tradeNo ");
// //sqlBuld.Append("WHERE ord.ticketId !='' AND ssp.syncStatus = 0 and ssp.uploadErrors < 3000 order by ssp.uploadErrors limit {0}; ");
// //string sql = string.Format(sqlBuld.ToString(), limit);
// //lists = db.Query<SplitStorePay>(sql).ToList();
// StringBuilder strBil = new StringBuilder();
// strBil.Append("select ord.ticketId as ordTicketId,ord.tableNo,ord.people,ord.workerNo,oi.price as unitPrice,oi.productId as goodid,ssp.* from pos_split_store_pay ssp ");
// strBil.Append("left join pos_order_item oi on oi.id=ssp.orderItemId and oi.productId=ssp.productId ");
// strBil.Append("left join pos_order ord on ord.id=ssp.orderId ");
// strBil.Append("where ord.ticketId !='' and ssp.syncStatus = 0 and ssp.uploadErrors < 3000 order by ssp.uploadErrors limit {0}; ");
// string sql = string.Format(strBil.ToString(), limit);
// lists2 = db.Fetch<SplitStorePayEntity>(sql);
//}
StringBuilder strBil = new StringBuilder();
strBil.Append("select ord.ticketId as ordTicketId,ord.tableNo,ord.people,ord.workerNo,oi.price as unitPrice,oi.productId as goodid,ssp.* from pos_split_store_pay ssp ");
strBil.Append("left join pos_order_item oi on oi.id=ssp.orderItemId and oi.productId=ssp.productId ");
strBil.Append("left join pos_order ord on ord.id=ssp.orderId ");
strBil.Append("where ord.ticketId !='' and ssp.syncStatus = 0 and ssp.uploadErrors < 3000 order by ssp.uploadErrors limit {0}; ");
string sql = string.Format(strBil.ToString(), limit);
lists2 = db.Fetch<SplitStorePayEntity>(sql);
if (lists2.Count <= 0)
{
//var ids = string.Join("','", lists.ConvertAll(x => x.Id).ToArray());
logger.Info("没有需要上传的营业分账数据,isHaveUpLoadSplitPay=false");
Global.isHaveUpLoadSplitPay = false;
}
}
}
catch (Exception ex)
{
logger.Error(ex, "加载未上传营业分账异常");
}
finally
{
if (lists2.Count > 0)
{
//foreach (var splitPay in lists2)
//{
// splitPay.TicketId = splitPay.OrdTicketId;
// ProcessSplitPay(splitPay);
// Thread.Sleep(10);
//}
foreach (var splitPay in lists2)
{
splitPay.TicketId = splitPay.OrdTicketId;
}
ProcessSplitPayLst(lists2);
sw.Stop();
logger.Info("营业分账数据上传<{0}>条数据耗时<{1}>", lists2.Count, sw.ElapsedMilliseconds);
}
this.isRunning = false;
}
return lists2;
}
//组装单条分账数据
private bool ProcessSplitPay(SplitStorePayEntity splitPay)
{
bool isSuccess = true;
try
{
//using (var db = Global.Instance.OpenDataBase)
//{
// var _ticket = db.FirstOrDefault<OrderObject>(string.Format("where tradeNo = '{0}'", splitPay.BusNo));
// if (_ticket != null)
// {
// splitPay.TicketId = _ticket.TicketId;
// }
//}
//if (string.IsNullOrEmpty(splitPay.TicketId))
//{
// isSuccess = false;
//}
var uploadObject = BuilderUploadObject(splitPay);
string jsonString = JsonUtils.Serialize(uploadObject);
var uploadResult = this.Uploading(jsonString);
if (uploadResult.Item1)
{
splitPay.SyncStatus = 1;
//splitPay.TicketId = uploadResult.Item2.Data.TicketId;
splitPay.UploadTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//上传失败
isSuccess = true;
}
else
{
splitPay.SyncStatus = 0;
splitPay.TicketId = string.Empty;
//上传失败
isSuccess = false;
}
splitPay.UploadStatus = uploadResult.Item2.Status;
splitPay.UploadMessage = uploadResult.Item2.Message;
splitPay.UploadErrCode = uploadResult.Item2.ErrCode;
splitPay.UploadErrMessage = uploadResult.Item2.ErrMessage;
}
catch (Exception ex)
{
isSuccess = false;
logger.Error(ex, "营业分账数据上传任务异常");
Global.Instance.BugReport(ex, "营业分账数据上传任务异常");
}
finally
{
if (!isSuccess)
{
splitPay.UploadErrors += 1;
}
lock (Global.Instance.SyncLock)
{
string sql = @"update pos_split_store_pay set syncStatus = {0}, uploadErrors = {1}, ticketId = '{2}', uploadTime = '{3}', uploadStatus = {4}, uploadMessage = '{5}', uploadErrCode = '{6}', uploadErrMessage = '{7}' where id = '{8}';";
//索引损坏根据id更新
//string sql = @"update pos_order set syncStatus = {0}, uploadErrors = {1}, ticketId = '{2}', uploadTime = '{3}', uploadStatus = {4}, uploadMessage = '{5}', uploadErrCode = '{6}', uploadErrMessage = '{7}' where id like '{8}';";
SqliteUtils.Execute(string.Format(sql, splitPay.SyncStatus, splitPay.UploadErrors, splitPay.TicketId, splitPay.UploadTime, splitPay.UploadStatus, splitPay.UploadMessage, splitPay.UploadErrCode, splitPay.UploadErrMessage, splitPay.Id));
}
}
return isSuccess;
}
private bool ProcessSplitPayLst(List<SplitStorePayEntity> list)
{
bool isSuccess = true;
try
{
var uploadObject = BuilderUploadObject(list);
string jsonString = JsonUtils.Serialize(uploadObject);
var uploadResult = this.Uploading(jsonString);
var uploadIds = new List<string>();
if (uploadResult.Item1)
{
var result = uploadResult.Item2;
var _clientIds = result.Data.ClientIds;
if (!string.IsNullOrEmpty(_clientIds))
{
_clientIds = _clientIds.Substring(0, _clientIds.Length - 1);
var str = _clientIds.Replace(",", "','");
uploadIds = _clientIds.Split(',').ToList();
//var sql = $"update pos_split_store_pay set syncStatus=1, uploadErrors = {0} , uploadTime = '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'," +
// $" uploadStatus = {result.Status}, uploadMessage = '{result.Message}', uploadErrCode = '{result.ErrCode}', uploadErrMessage = '{result.ErrMessage}' " +
// $"where id in ('{str}');";
//SqliteUtils.Execute(sql);
foreach (var item in uploadIds)
{
var oldData = list.FirstOrDefault(m => m.Id == item);
var sql = $"update pos_split_store_pay set ticketId = '{oldData.TicketId}', syncStatus=1, uploadErrors = {0} , uploadTime = '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'," +
$" uploadStatus = {result.Status}, uploadMessage = '{result.Message}', uploadErrCode = '{result.ErrCode}', uploadErrMessage = '{result.ErrMessage}' " +
$"where id in ('{str}');";
SqliteUtils.Execute(sql);
}
logger.Info("营业分账LIST数据上传成功已上传Ids:{0}", _clientIds);
}
}
else
{
var result = uploadResult.Item2;
var diff = list.Where(m => !uploadIds.Exists(t => t == m.Id)).ToList();
if (diff != null)
{
var diffIdLst = diff.Select(item => item.Id);
if (diffIdLst.Count() > 0)
{
var diffIds = string.Join(",", diffIdLst);
var diffIdsStr = diffIds.Replace(",", "','");
var sql = $"update pos_split_store_pay set syncStatus=1, uploadErrors = (uploadErrors+1) , uploadTime = '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'," +
$" uploadStatus = {0}, uploadMessage = '{result.Message}', uploadErrCode = '{result.ErrCode}', uploadErrMessage = '{result.ErrMessage}' " +
$"where id in ('{diffIdsStr}');";
SqliteUtils.Execute(sql);
logger.Info("营业分账LIST数据上传失败未上传Ids:{0}", diffIds);
}
}
//上传失败
isSuccess = false;
}
}
catch (Exception ex)
{
isSuccess = false;
logger.Error(ex, "营业分账LIST数据上传任务异常");
Global.Instance.BugReport(ex, "营业分账LIST数据上传任务异常");
}
return isSuccess;
}
private Dictionary<string, object> BuilderUploadObject(SplitStorePayEntity splitPay)
{
try
{
var uploadObject = new Dictionary<string, object>();
////上传订单
//splitPay.isUpLoadTicket = true;
//uploadObject["Id"] = splitPay.Id;
//租户ID
uploadObject["tenantId"] = splitPay.TenantId;
//前台系统ID
uploadObject["clientId"] = splitPay.Id;
//设置ID
if (string.IsNullOrEmpty(splitPay.ProgramId))
{
uploadObject["programId"] = "-1";
}
else
{
uploadObject["programId"] = splitPay.ProgramId;
}
//门店ID
uploadObject["storeId"] = splitPay.StoreId;
//分店ID
uploadObject["splitStoreId"] = splitPay.SplitStoreId;
//门店编号
uploadObject["storeNo"] = splitPay.StoreNo;
//付款单号
uploadObject["payNo"] = splitPay.PayNo;
//销售单号
uploadObject["busNo"] = splitPay.BusNo;
//付款方式编号
uploadObject["payTypeNo"] = splitPay.PayTypeNo;
//付款方式
uploadObject["payType"] = splitPay.PayType;
//实收金额
uploadObject["paid"] = splitPay.Paid;
//找零金额
uploadObject["rchange"] = splitPay.Rchange;
//已收金额
uploadObject["money"] = splitPay.Money;
//溢出金额
uploadObject["overAmount"] = splitPay.OverAmount;
//凭证号
uploadObject["voucherNo"] = splitPay.VoucherNo;
//付款时间
uploadObject["payDate"] = splitPay.PayDate;
//付款卡号
uploadObject["cardNo"] = splitPay.CardNo;
//是否实收
uploadObject["incomeFlag"] = splitPay.IncomeFlag;
//第三方扣费类型
uploadObject["otherRateType"] = splitPay.OtherRateType;
//第三方扣费值
uploadObject["otherRateValue"] = splitPay.OtherRateValue;
//第三方扣费
uploadObject["otherRate"] = splitPay.OtherRate;
//支付客户端类型
uploadObject["payClientType"] = splitPay.PayClientType;
//支付渠道
uploadObject["payChannel"] = splitPay.PayChannel;
//扣率
uploadObject["deductionRate"] = splitPay.DeductionRate;
//扣款
uploadObject["chargeBack"] = splitPay.ChargeBack;
//备注
uploadObject["memo"] = splitPay.Memo;
uploadObject["isInvalid"] = splitPay.IsInvalid;
uploadObject["createUser"] = splitPay.CreateUser;
uploadObject["createDate"] = splitPay.CreateDate;
uploadObject["ticketId"] = splitPay.TicketId;
uploadObject["fromBizUserId"] = splitPay.FromBizUserld;
uploadObject["refundAmount"] = splitPay.RefundAmount;
uploadObject["orderType"] = splitPay.OrderType.ToString();
uploadObject["isRefund"] = splitPay.IsRefund;
uploadObject["tableNo"] = splitPay.TableNo;
uploadObject["people"] = splitPay.People;
uploadObject["workNo"] = splitPay.WorkerNo;
uploadObject["unitPrice"] = splitPay.UnitPrice;
uploadObject["goodid"] = splitPay.ProductId;
uploadObject["number"] = splitPay.Quantity;
uploadObject["rnumber"] = splitPay.RefundQuantity;
uploadObject["fee"] = splitPay.fee * 100;
return uploadObject;
}
catch (Exception ex)
{
logger.Error(ex, "组装营业分账上传数据异常:");
return null;
}
}
private List<Dictionary<string, object>> BuilderUploadObject(List<SplitStorePayEntity> list)
{
try
{
//var newUploadObject = new Dictionary<string, object>();
var newLst = new List<Dictionary<string, object>>();
foreach (var splitPay in list)
{
var uploadObject = new Dictionary<string, object>();
//租户ID
uploadObject["tenantId"] = splitPay.TenantId;
//前台系统ID
uploadObject["clientId"] = splitPay.Id;
//设置ID
if (string.IsNullOrEmpty(splitPay.ProgramId))
{
uploadObject["programId"] = "-1";
}
else
{
uploadObject["programId"] = splitPay.ProgramId;
}
//门店ID
uploadObject["storeId"] = splitPay.StoreId;
//分店ID
uploadObject["splitStoreId"] = splitPay.SplitStoreId;
//门店编号
uploadObject["storeNo"] = splitPay.StoreNo;
//付款单号
uploadObject["payNo"] = splitPay.PayNo;
//销售单号
uploadObject["busNo"] = splitPay.BusNo;
//付款方式编号
uploadObject["payTypeNo"] = splitPay.PayTypeNo;
//付款方式
uploadObject["payType"] = splitPay.PayType;
//实收金额
uploadObject["paid"] = splitPay.Paid;
//找零金额
uploadObject["rchange"] = splitPay.Rchange;
//已收金额
uploadObject["money"] = splitPay.Money;
//溢出金额
uploadObject["overAmount"] = splitPay.OverAmount;
//凭证号
uploadObject["voucherNo"] = splitPay.VoucherNo;
//付款时间
uploadObject["payDate"] = splitPay.PayDate;
//付款卡号
uploadObject["cardNo"] = splitPay.CardNo;
//是否实收
uploadObject["incomeFlag"] = splitPay.IncomeFlag;
//第三方扣费类型
uploadObject["otherRateType"] = splitPay.OtherRateType;
//第三方扣费值
uploadObject["otherRateValue"] = splitPay.OtherRateValue;
//第三方扣费
uploadObject["otherRate"] = splitPay.OtherRate;
//支付客户端类型
uploadObject["payClientType"] = splitPay.PayClientType;
//支付渠道
uploadObject["payChannel"] = splitPay.PayChannel;
//扣率
uploadObject["deductionRate"] = splitPay.DeductionRate;
//扣款
uploadObject["chargeBack"] = splitPay.ChargeBack;
//备注
uploadObject["memo"] = splitPay.Memo;
uploadObject["isInvalid"] = splitPay.IsInvalid;
uploadObject["createUser"] = splitPay.CreateUser;
uploadObject["createDate"] = splitPay.CreateDate;
uploadObject["ticketId"] = splitPay.TicketId;
uploadObject["fromBizUserId"] = splitPay.FromBizUserld;
uploadObject["refundAmount"] = splitPay.RefundAmount;
uploadObject["orderType"] = splitPay.OrderType.ToString();
uploadObject["isRefund"] = splitPay.IsRefund;
uploadObject["tableNo"] = splitPay.TableNo;
uploadObject["people"] = splitPay.People;
uploadObject["workNo"] = splitPay.WorkerNo;
uploadObject["unitPrice"] = splitPay.UnitPrice;
uploadObject["goodid"] = splitPay.ProductId;
uploadObject["number"] = splitPay.Quantity;
uploadObject["rnumber"] = splitPay.RefundQuantity;
uploadObject["fee"] = splitPay.fee * 100;
newLst.Add(uploadObject);
}
//newUploadObject["list"] = newLst;
return newLst;
}
catch (Exception ex)
{
logger.Error(ex, "组装营业分账LIST上传数据异常:");
return null;
}
}
private Tuple<bool, EntityResponse<UploadResult>> Uploading(string jsonString)
{
Tuple<bool, EntityResponse<UploadResult>> result = null;
var isTest = false;
#region 模拟上传操作
if (isTest)
{
logger.Debug("开始构建上传成功模拟数据......");
//构建上传成功模拟数据
var resp2 = new EntityResponse<UploadResult>();
resp2.Status = 1;
resp2.Message = "模拟上传";
resp2.ErrCode = string.Empty;
resp2.ErrMessage = string.Empty;
resp2.Data = new UploadResult
{
TicketId = "11112211",
UploadDate = DateTime.Now
};
logger.Info("模拟上传返回结果:{0}", resp2);
result = new Tuple<bool, EntityResponse<UploadResult>>(false, resp2);
return result;
}
#endregion
try
{
logger.Debug("开始上传营业分账数据......");
OpenApi api = OpenApiUtils.Instance.NextApi(ApiType.Business);
SortedList<string, string> parameters = OpenApiUtils.Instance.NewParameters(api);
parameters.Add("method", "upload.business.splitorder");
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.Error(string.Format("调用接口<upload.business.splitorder>上传出错:{0}", message));
result = new Tuple<bool, EntityResponse<UploadResult>>(false, status);
}
}
else
{
string errorMessage = PaserErrors(response);
logger.Error(string.Format("报文<{0}>解析出错:{1}", response, 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;
}
}
}