using ARW.Common;
using ARW.Model.Models.Business.SubscribeTasks;
using ARW.Model.System;
using ARW.Service.Business.IBusinessService.Marketing.CouponManage.Coupons;
using ARW.Service.Business.IBusinessService.Marketing.CouponManage.CustomerCoupons;
using ARW.Service.Business.IBusinessService.SubscribeTasks;
using ARW.Service.System.IService;
using Infrastructure;
using Infrastructure.Attribute;
using Infrastructure.WeChat.SubScribe;
using Quartz;
using Senparc.CO2NET.Extensions;
using Senparc.Weixin.Entities.TemplateMessage;
using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp.WxAppJson;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SystemTime = System.SystemTime;
namespace ARW.Tasks.TaskScheduler.Business
{
///
/// 优惠券过期任务
///
[AppService(ServiceType = typeof(CouponTask_Job), ServiceLifetime = LifeTime.Scoped)]
public class CouponTask_Job : JobBase, IJob
{
private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private readonly ISysTasksLogService SysTasksLogService;
private readonly ISysTasksQzService SysTasksQzService;
private readonly ISubscribeTaskService _SubscribeTaskService;
private readonly ICouponService _CouponService;
private readonly ICustomerCouponService _CustomerCouponService;
public CouponTask_Job(ISysTasksLogService sysTasksLogService, ISysTasksQzService sysTasksQzService, ISubscribeTaskService subscribeTaskService, ICouponService couponService, ICustomerCouponService customerCouponService)
{
SysTasksLogService = sysTasksLogService;
SysTasksQzService = sysTasksQzService;
_SubscribeTaskService = subscribeTaskService;
_CouponService = couponService;
_CustomerCouponService = customerCouponService;
}
public async Task Execute(IJobExecutionContext context)
{
var message = await Run();
var logModel = await ExecuteJob(context, async () => await Run(), message);
await RecordTaskLog(context, logModel);
}
public async Task Run()
{
await Task.Delay(1);
//TODO 业务逻辑
var waiCancelList = await _CustomerCouponService.GetListAsync(s => s.CustomerCouponIsExpired == 1 && s.CustomerCouponIsUsed == 1 && s.IsDelete == false);
if (waiCancelList.Count > 0)
{
var taskList = new List();
foreach (var item in waiCancelList)
{
try
{
// 判断类型
var coupon = await _CouponService.GetFirstAsync(s => s.CouponGuid == item.CouponGuid);
if(coupon != null)
{
// 领券后生效
if (coupon.CouponExpireType == 1)
{
var endTime = item.Create_time.AddDays(coupon.CouponEffectiveDays);
if (endTime < DateTime.Now)
{
item.CustomerCouponIsExpired = 2;
await _CustomerCouponService.UpdateAsync(item);
}
}
// 固定时间
if (coupon.CouponExpireType == 2)
{
var endTime = coupon.CouponFixedEndTime;
if (endTime < DateTime.Now)
{
item.CustomerCouponIsExpired = 2;
await _CustomerCouponService.UpdateAsync(item);
}
}
}
}
catch (Exception ex)
{
return ex.ToString();
}
}
return taskList.ToJson().ToString();
}
else
{
return "没有需要执行的任务";
}
//return "执行成功!";
#region 公众号模板消息信息 -- DPBMARK MP
//可选参数(需要和公众号模板消息匹配):
//var templateData = new
//{
// first = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem("预约健身开始提醒"),
// keyword1 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem("测试门店"),
// keyword2 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem("佛山市顺德区xxx健身"),
// keyword3 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem(SystemTime.Now.ToString("yyyy年MM月dd日 HH:mm")),
// keyword4 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem("1小时"),
// keyword5 = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem("还有1个小时开始健身,请熟知!"),
// remark = new Senparc.Weixin.MP.AdvancedAPIs.TemplateMessage.TemplateDataItem("您的 OpenId:" + openId),
//};
#endregion DPBMARK_END
//System.Console.WriteLine("job test");
}
///
/// 记录到日志
///
///
///
public async Task RecordTaskLog(IJobExecutionContext context, SysTasksLog logModel)
{
//可以直接获取 JobDetail 的值
IJobDetail job = context.JobDetail;
logModel.InvokeTarget = job.JobType.FullName;
logModel = await SysTasksLogService.AddTaskLog(job.Key.Name, logModel);
//成功后执行次数+1
if (logModel.Status == "0")
{
await SysTasksQzService.UpdateAsync(f => new SysTasksQz()
{
RunTimes = f.RunTimes + 1,
LastRunTime = DateTime.Now
}, f => f.ID.ToString() == job.Key.Name);
}
logger.Info($"执行任务【{job.Key.Name}|{logModel.JobName}】结果={logModel.JobMessage}");
}
}
}