RepositoryExtension.GrowTask.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using JiaZhiQuan.Common.Models.CacheModel;
  2. using static JiaZhiQuan.Common.UserGrow;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. using System;
  6. using Wicture.DbRESTFul.Cache;
  7. using Wicture.DbRESTFul.Infrastructure.Repository;
  8. using Wicture.DbRESTFul;
  9. using JiaZhiQuan.Common.Messaging;
  10. using Microsoft.VisualBasic;
  11. using static JiaZhiQuan.Common.Models.GrowModel.GrowthRepositoryModel;
  12. using JiaZhiQuan.Common.Models.PO;
  13. using NPOI.XWPF.UserModel;
  14. using CSRedis;
  15. namespace JiaZhiQuan.Common {
  16. public static partial class RepositoryExtension {
  17. /// <summary>
  18. /// 首次完善资料至100%
  19. /// </summary>
  20. /// <returns></returns>
  21. private static async Task CompleteSelfDataTask(DbRESTFulRepository repository, long userId, DateTime completeTime) {
  22. //插入并更新
  23. OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, completeSelfDataTime = completeTime, now = DateTime.Now };
  24. await repository.QuerySingleOrDefaultAsync<dynamic>(@$" insert into n_user_grow_once_task_log
  25. (userId,completeSelfDataTime,createAt,updateAt) values(@userId,@completeSelfDataTime,@now,@now)
  26. ON DUPLICATE KEY UPDATE completeSelfDataTime= @completeSelfDataTime,updateAt=@now ", onceTaskLog);
  27. }
  28. /// <summary>
  29. /// 首次完成实名认证
  30. /// </summary>
  31. /// <returns></returns>
  32. private static async Task RealNameAuth(DbRESTFulRepository repository, long userId, DateTime completeTime) {
  33. OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, realNameAuthTime = completeTime, now = DateTime.Now };
  34. await repository.QuerySingleOrDefaultAsync<dynamic>(@$" insert into n_user_grow_once_task_log
  35. (userId,realNameAuthTime,createAt,updateAt) values(@userId,@realNameAuthTime,@now,@now)
  36. ON DUPLICATE KEY UPDATE realNameAuthTime= @realNameAuthTime,updateAt=@now ", onceTaskLog);
  37. }
  38. /// <summary>
  39. /// 首次通过创作者认证或优质创作者认证
  40. /// </summary>
  41. /// <returns></returns>
  42. private static async Task AuthorAuth(DbRESTFulRepository repository, long userId, DateTime completeTime) {
  43. OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, authorAuthTime = completeTime, now = DateTime.Now };
  44. await repository.QuerySingleOrDefaultAsync<dynamic>(@$" insert into n_user_grow_once_task_log
  45. (userId,authorAuthTime,createAt,updateAt) values(@userId,@authorAuthTime,@now,@now)
  46. ON DUPLICATE KEY UPDATE authorAuthTime= @authorAuthTime,updateAt=@now ", onceTaskLog);
  47. }
  48. /// <summary>
  49. /// 申请提现一次
  50. /// </summary>
  51. /// <returns></returns>
  52. private static async Task Withdrawal(DbRESTFulRepository repository, long userId, DateTime completeTime) {
  53. string objStr = "withdrawalTime";
  54. //插入并更新,看看这种写法有没有问题。
  55. OnceTaskLog onceTaskLog = new OnceTaskLog() { userId = userId, withdrawalTime = completeTime, now = DateTime.Now };
  56. await repository.QuerySingleOrDefaultAsync<dynamic>(@$" insert into n_user_grow_once_task_log
  57. (userId,{objStr},createAt,updateAt) values(@userId,@{objStr},@now,@now)
  58. ON DUPLICATE KEY UPDATE {objStr}= @{objStr} ,updateAt=@now ", onceTaskLog);
  59. }
  60. public static async Task<TaskCompleteResult> DoOnceTask(this DbRESTFulRepository repository, long userId, Dictionary<string,object> data,
  61. TaskEvent taskEvent, Producer producer, RedisCacheProvider redis) {
  62. using var redisLock = redis.Lock($"{userId}_{(int)taskEvent}",1);
  63. if (redisLock == null) return new TaskCompleteResult { isComplete = false };
  64. if (await repository.OnceTaskCheckComplete(userId, taskEvent)) {
  65. //LoggerManager.Logger.Info($"一次性任务{taskEvent}已完成过,请不要重复完成。");
  66. return new TaskCompleteResult { isComplete=false};
  67. }
  68. DateTime completeTime = ((DateTime?)data?["completeTime"]) ?? DateTime.Now;
  69. //加经验
  70. var taskInfo = await repository.GetTaskInfo(taskEvent);
  71. if (null == taskInfo) return new TaskCompleteResult { isComplete = false };
  72. var res = await UserAddExperience(repository, userId, taskInfo, producer);
  73. if (!res) return new TaskCompleteResult { isComplete = false };
  74. //任务完成
  75. switch (taskEvent) {
  76. case TaskEvent.CompleteSelfData:
  77. await CompleteSelfDataTask(repository, userId, completeTime);
  78. break;
  79. case TaskEvent.RealNameAuth:
  80. await RealNameAuth(repository, userId, completeTime);
  81. break;
  82. case TaskEvent.AuthorAuth:
  83. await AuthorAuth(repository, userId, completeTime);
  84. break;
  85. case TaskEvent.Withdrawal:
  86. await Withdrawal(repository, userId, completeTime);
  87. break;
  88. default: throw new NotSupportedException("只支持一次性任务");
  89. }
  90. return new TaskCompleteResult { isComplete = res, taskImage = taskInfo.taskImage, taskMessage = $"{taskInfo.taskName}完成,+{taskInfo.experience}成长值", };
  91. }
  92. public static async Task<bool> OnceTaskCheckComplete(
  93. this DbRESTFulRepository repository, long userId, TaskEvent taskEvent) {
  94. OnceTaskLog onceTaskLog = await repository.QuerySingleOrDefaultAsync<OnceTaskLog>
  95. (@$"select userId,completeSelfDataTime,realNameAuthTime,authorAuthTime,withdrawalTime
  96. from n_user_grow_once_task_log where userId={userId}");
  97. return taskEvent switch {
  98. TaskEvent.CompleteSelfData => CheckTimeComplete(onceTaskLog?.completeSelfDataTime),
  99. TaskEvent.RealNameAuth => CheckTimeComplete(onceTaskLog?.realNameAuthTime),
  100. TaskEvent.AuthorAuth => CheckTimeComplete(onceTaskLog?.authorAuthTime),
  101. TaskEvent.Withdrawal => CheckTimeComplete(onceTaskLog?.withdrawalTime),
  102. _ => throw new NotSupportedException("只支持一次性任务")
  103. };
  104. }
  105. //公司成立时间
  106. public static readonly DateTime minTime = DateTime.Parse("2020-01-01");
  107. public static bool CheckTimeComplete(DateTime? completeTime) {
  108. return completeTime != null && completeTime > minTime;
  109. }
  110. }
  111. }