using JiaZhiQuan.Common.Models.CacheModel;
using static JiaZhiQuan.Common.UserGrow;
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
using Wicture.DbRESTFul.Cache;
using Wicture.DbRESTFul.Infrastructure.Repository;
using Wicture.DbRESTFul;
using JiaZhiQuan.Common.Messaging;
using Microsoft.VisualBasic;
using static JiaZhiQuan.Common.Models.GrowModel.GrowthRepositoryModel;
using JiaZhiQuan.Common.Models.PO;
using NPOI.XWPF.UserModel;
using CSRedis;
namespace JiaZhiQuan.Common
{
public static partial class RepositoryExtension
{
///
/// 首次完善资料至100%
///
///
private static async Task CompleteSelfDataTask(DbRESTFulRepository repository, long userId, DateTime completeTime)
{
//插入并更新
OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, completeSelfDataTime = completeTime, now = DateTime.Now };
await repository.QuerySingleOrDefaultAsync(@$" insert into n_user_grow_once_task_log
(userId,completeSelfDataTime,createAt,updateAt) values(@userId,@completeSelfDataTime,@now,@now)
ON DUPLICATE KEY UPDATE completeSelfDataTime= @completeSelfDataTime,updateAt=@now ", onceTaskLog);
}
///
/// 首次完成实名认证
///
///
private static async Task RealNameAuth(DbRESTFulRepository repository, long userId, DateTime completeTime)
{
OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, realNameAuthTime = completeTime, now = DateTime.Now };
await repository.QuerySingleOrDefaultAsync(@$" insert into n_user_grow_once_task_log
(userId,realNameAuthTime,createAt,updateAt) values(@userId,@realNameAuthTime,@now,@now)
ON DUPLICATE KEY UPDATE realNameAuthTime= @realNameAuthTime,updateAt=@now ", onceTaskLog);
}
///
/// 首次通过创作者认证或优质创作者认证
///
///
private static async Task AuthorAuth(DbRESTFulRepository repository, long userId, DateTime completeTime)
{
OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, authorAuthTime = completeTime, now = DateTime.Now };
await repository.QuerySingleOrDefaultAsync(@$" insert into n_user_grow_once_task_log
(userId,authorAuthTime,createAt,updateAt) values(@userId,@authorAuthTime,@now,@now)
ON DUPLICATE KEY UPDATE authorAuthTime= @authorAuthTime,updateAt=@now ", onceTaskLog);
}
///
/// 申请提现一次
///
///
private static async Task Withdrawal(DbRESTFulRepository repository, long userId, DateTime completeTime)
{
string objStr = "withdrawalTime";
//插入并更新,看看这种写法有没有问题。
OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, withdrawalTime = completeTime, now = DateTime.Now };
await repository.QuerySingleOrDefaultAsync(@$" insert into n_user_grow_once_task_log
(userId,{objStr},createAt,updateAt) values(@userId,@{objStr},@now,@now)
ON DUPLICATE KEY UPDATE {objStr}= @{objStr} ,updateAt=@now ", onceTaskLog);
}
public static async Task DoOnceTask(this DbRESTFulRepository repository, long userId, Dictionary data,
TaskEvent taskEvent, Producer producer, RedisCacheProvider redis)
{
using var redisLock = redis.Lock($"{userId}_{(int)taskEvent}", 1);
if (redisLock == null) return new TaskCompleteResult { isComplete = false };
if (await repository.OnceTaskCheckComplete(userId, taskEvent))
{
//LoggerManager.Logger.Info($"一次性任务{taskEvent}已完成过,请不要重复完成。");
return new TaskCompleteResult { isComplete = false };
}
DateTime completeTime = ((DateTime?)data?["completeTime"]) ?? DateTime.Now;
//加经验
var taskInfo = await repository.GetTaskInfo(taskEvent);
if (null == taskInfo) return new TaskCompleteResult { isComplete = false };
var res = await UserAddExperience(repository, userId, taskInfo, producer);
if (!res) return new TaskCompleteResult { isComplete = false };
//任务完成
switch (taskEvent)
{
case TaskEvent.CompleteSelfData:
await CompleteSelfDataTask(repository, userId, completeTime);
break;
case TaskEvent.RealNameAuth:
await RealNameAuth(repository, userId, completeTime);
break;
case TaskEvent.AuthorAuth:
await AuthorAuth(repository, userId, completeTime);
break;
case TaskEvent.Withdrawal:
await Withdrawal(repository, userId, completeTime);
break;
default: throw new NotSupportedException("只支持一次性任务");
}
return new TaskCompleteResult { isComplete = res, taskImage = taskInfo.taskImage, taskMessage = $"{taskInfo.taskName}完成,+{taskInfo.experience}成长值", };
}
public static async Task OnceTaskCheckComplete(
this DbRESTFulRepository repository, long userId, TaskEvent taskEvent)
{
OnceTaskLog onceTaskLog = await repository.QuerySingleOrDefaultAsync
(@$"select userId,completeSelfDataTime,realNameAuthTime,authorAuthTime,withdrawalTime
from n_user_grow_once_task_log where userId={userId}");
return taskEvent switch
{
TaskEvent.CompleteSelfData => CheckTimeComplete(onceTaskLog?.completeSelfDataTime),
TaskEvent.RealNameAuth => CheckTimeComplete(onceTaskLog?.realNameAuthTime),
TaskEvent.AuthorAuth => CheckTimeComplete(onceTaskLog?.authorAuthTime),
TaskEvent.Withdrawal => CheckTimeComplete(onceTaskLog?.withdrawalTime),
_ => throw new NotSupportedException("只支持一次性任务")
};
}
//公司成立时间
public static readonly DateTime minTime = DateTime.Parse("2020-01-01");
public static bool CheckTimeComplete(DateTime? completeTime)
{
return completeTime != null && completeTime > minTime;
}
}
}