RepositoryExtension.GrowTask.cs 6.7 KB

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