using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.YiLianYun;
using CoreCms.Net.Utility.Helper;
using Flurl.Http;
using InitQ.Abstractions;
using InitQ.Attributes;
using Newtonsoft.Json;
namespace CoreCms.Net.RedisMQ
{
public class OrderPrintSubscribe : IRedisSubscribe
{
private readonly ICoreCmsOrderItemServices _orderItemServices;
private readonly ICoreCmsAreaServices _areaServices;
private readonly ICoreCmsPrinterServices _coreCmsPrinterServices;
public OrderPrintSubscribe(ICoreCmsOrderItemServices orderItemServices, ICoreCmsAreaServices areaServices, ICoreCmsPrinterServices coreCmsPrinterServices)
{
_orderItemServices = orderItemServices;
_areaServices = areaServices;
_coreCmsPrinterServices = coreCmsPrinterServices;
}
///
/// 订单打印队列
///
///
///
[Subscribe(RedisMessageQueueKey.OrderPrint)]
private async Task OrderPrint(string msg)
{
try
{
var order = JsonConvert.DeserializeObject(msg);
if (order == null)
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "订单获取失败");
return;
}
CoreCmsPrinter model = null;
if (order.storeId > 0)
{
model = await _coreCmsPrinterServices.QueryByClauseAsync(p => p.storeId == order.storeId && p.isOpen == true, true, true);
}
model ??= await _coreCmsPrinterServices.QueryByClauseAsync(p => p.isDefault == true && p.isOpen == true, true, true);
if (model == null)
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "打印机获取失败");
return;
}
var isNeedToken = false;
if (string.IsNullOrEmpty(model.accessToken) || model.expiressEndTime == null)
{
isNeedToken = true;
}
else
{
//判断是否过期
var dt = DateTime.Now;
if (dt >= model.expiressEndTime)
{
var ts = dt - Convert.ToDateTime(model.expiressEndTime);
if (ts.Days > 35)
{
isNeedToken = true;
}
else
{
RefreshYiLianYunToken refreshToken = new RefreshYiLianYunToken
{
client_id = model.clientId,
grant_type = "client_credentials",
timestamp = CommonHelper.GetDateTimeStamp(DateTime.Now),
scope = "all",
id = Guid.NewGuid().ToString()
};
refreshToken.sign = CommonHelper.Md5For32((refreshToken.client_id + refreshToken.timestamp + model.clientSecret).ToLowerInvariant()).ToLowerInvariant();
var resultData = await YiLianYunConfig.AuthUrl.PostJsonAsync(refreshToken).ReceiveJson();
//将获取到的数据存入数据库
if (resultData.error == "0")
{
model.accessToken = resultData.body.access_token;
model.refreshToken = resultData.body.refresh_token;
model.expiresIn = resultData.body.expires_in;
model.expiressEndTime = DateTime.Now.AddSeconds(resultData.body.expires_in);
await _coreCmsPrinterServices.UpdateAsync(
p => new CoreCmsPrinter()
{
accessToken = resultData.body.access_token,
refreshToken = resultData.body.refresh_token,
expiresIn = resultData.body.expires_in,
expiressEndTime = model.expiressEndTime,
parameters = JsonConvert.SerializeObject(resultData.body)
}, p => p.clientId == model.clientId && p.clientSecret == model.clientSecret, true);
}
else
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "刷新AccessToken:" + resultData.error_description);
return;
}
}
}
}
if (isNeedToken)
{
var getToken = new YiLianYunParam
{
client_id = model.clientId,
grant_type = "client_credentials",
timestamp = CommonHelper.GetDateTimeStamp(DateTime.Now),
scope = "all",
id = Guid.NewGuid().ToString()
};
getToken.sign = CommonHelper.Md5For32((getToken.client_id + getToken.timestamp + model.clientSecret).ToLowerInvariant()).ToLowerInvariant();
var resultData = await YiLianYunConfig.AuthUrl.PostJsonAsync(getToken).ReceiveJson();
//将获取到的数据存入数据库
if (resultData.error == "0")
{
model.accessToken = resultData.body.access_token;
model.refreshToken = resultData.body.refresh_token;
model.expiresIn = resultData.body.expires_in;
model.expiressEndTime = DateTime.Now.AddSeconds(resultData.body.expires_in);
await _coreCmsPrinterServices.UpdateAsync(
p => new CoreCmsPrinter()
{
accessToken = resultData.body.access_token,
refreshToken = resultData.body.refresh_token,
expiresIn = resultData.body.expires_in,
expiressEndTime = model.expiressEndTime,
parameters = JsonConvert.SerializeObject(resultData.body)
}, p => p.clientId == model.clientId && p.clientSecret == model.clientSecret, true);
}
else
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "获取AccessToken:" + resultData.error_description);
return;
}
}
//获取打印机是否在线
var statusParam = new GetPrintStatusParam
{
client_id = model.clientId,
access_token = model.accessToken,
machine_code = model.machineCode,
timestamp = CommonHelper.GetDateTimeStamp(DateTime.Now),
id = Guid.NewGuid().ToString()
};
statusParam.sign = CommonHelper.Md5For32((statusParam.client_id + statusParam.timestamp + model.clientSecret).ToLowerInvariant()).ToLowerInvariant();
var getPrintStatusResult = await YiLianYunConfig.GetPrintStatusUrl.PostJsonAsync(statusParam).ReceiveJson();
if (getPrintStatusResult.error != "0")
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "获取打印机在线状态:" + getPrintStatusResult.error_description);
return;
}
else
{
switch (getPrintStatusResult.body.state)
{
case "0":
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "获取打印机在线状态:机器未在线");
return;
case "2":
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "机器缺纸");
return;
}
var payStr = EnumHelper.GetEnumDescriptionByKey(order.paymentCode);
var items = await _orderItemServices.QueryListByClauseAsync(p => p.orderId == order.orderId);
var areas = await _areaServices.GetAreaFullName(order.shipAreaId);
order.shipAreaName = areas.status ? areas.data + "" : "";
var receiptType = order.receiptType switch
{
(int)GlobalEnumVars.OrderReceiptType.IntraCityService => "同城配送",
(int)GlobalEnumVars.OrderReceiptType.Logistics => "物流快递",
(int)GlobalEnumVars.OrderReceiptType.SelfDelivery => "门店自提",
_ => string.Empty
};
var printStr = new StringBuilder();
printStr.Append("--" + receiptType + "订单--\r");
printStr.Append("................................\r");
printStr.Append("--" + payStr + "--\r");
printStr.Append("下单时间:" + order.createTime.ToString("yyyy-MM-dd HH:mm:ss") + "\r");
printStr.Append("订单编号:" + order.orderId + "\r");
printStr.Append("**************商品**************\r");
printStr.Append("--购买明细--\r");
if (items != null && items.Any())
{
foreach (var item in items)
{
printStr.Append(item.name + "*" + item.nums + "\r");
}
}
//printStr.Append("--其他消费--\r");
//printStr.Append("餐盒 1 2\r");
printStr.Append("................................\r");
printStr.Append("积分抵扣:¥" + order.pointMoney + "\r");
printStr.Append("订单优惠:¥" + order.orderDiscountAmount + "\r");
printStr.Append("商品优惠:¥" + order.goodsDiscountAmount + "\r");
printStr.Append("优惠券:¥" + order.couponDiscountAmount + "\r");
printStr.Append("总价:¥" + order.orderAmount + "\r");
printStr.Append("*******************************\r");
printStr.Append("区域:" + order.shipAreaName + "\r");
printStr.Append("地址:" + order.shipAddress + "\r");
printStr.Append("联系:" + order.shipName + " " + order.shipMobile + "\r");
printStr.Append("***************完结*************\r");
//小票打印
WordPrintRespone wordPrintRespone = new WordPrintRespone
{
client_id = model.clientId,
access_token = model.accessToken,
machine_code = model.machineCode,
content = printStr.ToString(),
origin_id = order.orderId,
timestamp = CommonHelper.GetDateTimeStamp(DateTime.Now)
};
wordPrintRespone.sign = CommonHelper
.Md5For32((wordPrintRespone.client_id + wordPrintRespone.timestamp + model.clientSecret)
.ToLowerInvariant()).ToLowerInvariant();
wordPrintRespone.id = Guid.NewGuid().ToString();
//打印文本:缺少参数!请检查参数信息!!或更改下请求头:Content-Type:application/x-www-form-urlencoded
var resultData = await YiLianYunConfig.PrintTextUrl
.WithHeader("Content-Type", "application/x-www-form-urlencoded")
.PostUrlEncodedAsync(wordPrintRespone).ReceiveJson();
//当token返回失败时
if (resultData.error != "0")
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "打印文本:" + resultData.error_description);
}
else
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "订单打印队列", "打印文本:打印成功");
}
}
}
catch (Exception ex)
{
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "订单打印队列", msg, ex);
}
await Task.CompletedTask;
}
}
}