using System;
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.FromBody;
using InitQ.Abstractions;
using InitQ.Attributes;
using Newtonsoft.Json;
using NLog;
using SqlSugar;
namespace CoreCms.Net.RedisMQ
{
public class CouponDistributionSubscribe : IRedisSubscribe
{
private readonly ICoreCmsUserGradeServices _userGradeServices;
private readonly ICoreCmsUserServices _userServices;
private readonly ICoreCmsCouponServices _coreCmsCouponServices;
private readonly ICoreCmsPromotionServices _coreCmsPromotionServices;
///
/// 构造函数
///
public CouponDistributionSubscribe(ICoreCmsUserGradeServices userGradeServices, ICoreCmsUserServices userServices, ICoreCmsCouponServices coreCmsCouponServices, ICoreCmsPromotionServices coreCmsPromotionServices)
{
_userGradeServices = userGradeServices;
_userServices = userServices;
_coreCmsCouponServices = coreCmsCouponServices;
_coreCmsPromotionServices = coreCmsPromotionServices;
}
///
/// 优惠券发放给用户组队列
///
///
///
[Subscribe(RedisMessageQueueKey.CouponDistributionSubscribe)]
private async Task CouponDistributionQueue(string msg)
{
try
{
var model = JsonConvert.DeserializeObject(msg);
if (model.id == 0)
{
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "优惠券发放给用户组队列", "优惠券获取失败" + msg);
await Task.CompletedTask;
}
var promotion = await _coreCmsPromotionServices.QueryByIdAsync(model.id);
if (promotion == null)
{
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "优惠券发放给用户组队列", "优惠券获取失败" + msg);
await Task.CompletedTask;
}
var userGrade = _userGradeServices.QueryListByClauseAsync(p => p.id == model.userGrade);
if (userGrade == null)
{
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "优惠券发放给用户组队列", "用户等级获取失败" + msg);
await Task.CompletedTask;
}
//获取用户id
var userIds = await _userServices.GetUserIdsByGrade(model.userGrade);
if (userIds.Count > 0)
{
var successCount = 0;
var errorCount = 0;
foreach (var id in userIds)
{
var result = await _coreCmsCouponServices.AddData(id, model.id, promotion);
if (result.status)
{
successCount++;
}
else
{
errorCount++;
}
}
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, $"优惠券发放给用户组队列", $"成功{successCount},失败{errorCount}" + msg);
}
else
{
NLogUtil.WriteAll(NLog.LogLevel.Info, LogType.RedisMessageQueue, "优惠券发放给用户组队列", "用户为空" + msg);
}
}
catch (Exception ex)
{
NLogUtil.WriteAll(NLog.LogLevel.Error, LogType.RedisMessageQueue, "优惠券发放给用户组队列", msg, ex);
throw;
}
await Task.CompletedTask;
}
}
}