AirdropLogic.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace app\common\logic;
  3. use app\common\model\Config;
  4. use app\common\model\ProductOrder;
  5. use app\common\model\UserAirdrop;
  6. use app\api\logic\WelfareLoginc;
  7. use app\common\model\ProductPopular;
  8. use app\common\model\UserModel;
  9. use app\common\model\UserPathModel;
  10. use app\common\model\UserWelfare;
  11. use fast\Action;
  12. use fast\Asset;
  13. use fast\MembershipLevel;
  14. use think\Cache;
  15. use think\Db;
  16. use think\Log;
  17. use think\Model;
  18. use think\console\Output;
  19. use fast\Http;
  20. /**
  21. * 空投奖励发放逻辑
  22. * 定时任务,定时发放,每天一次,一般在凌晨12一过开始
  23. */
  24. class AirdropLogic
  25. {
  26. /**
  27. * 奖励名称及类型ID
  28. * @var array
  29. */
  30. private array $rewards_type = [
  31. 1 => '空投奖励',
  32. ];
  33. /**
  34. * 空投发放
  35. */
  36. public function setAirdropRewards()
  37. {
  38. //查找会员资产列表
  39. $info_list = UserAirdrop::where('type_id', UserAirdrop::TypeRwa)->where('status', UserAirdrop::Normal)->find();
  40. if(empty($info_list)){
  41. (new Output())->writeln("本次没有空投发放数据:");
  42. return false;
  43. }
  44. // 获取指定产品的热门信息
  45. $result = ProductPopular::getPopularByTime($info_list['product_id'], 'zh', $info_list->start_time);
  46. // 检查库存是否足够
  47. if(!$result || $info_list->total_num > $result->stock) {
  48. // 如果库存不足,输出信息并返回false
  49. (new Output())->writeln("本次执行库存不足:");
  50. return false;
  51. }
  52. // 更新用户福利信息
  53. WelfareLoginc::setUserExRwaNum(
  54. $info_list['rwa_num'],
  55. $info_list['product_id'], $info_list['rwa_product_id'],
  56. $result->is_area, $result->id, $result->price,
  57. $info_list['rwa_mod'],
  58. $info_list['num']
  59. );
  60. // 更新信息列表的状态和备注
  61. $info_list->status = UserAirdrop::Stop;
  62. $info_list->remark = '总发放'.$info_list->total_num.'套';
  63. // 保存更新后的信息列表
  64. return $info_list->save();
  65. }
  66. /**
  67. * 超级福利发放层级奖励
  68. *
  69. * 分享 3 个拿 10 层,分享 10 个拿 31 层
  70. */
  71. public function setParentRewards()
  72. {
  73. //
  74. $info = UserAirdrop::where('type_id', UserAirdrop::TypeSuperWeal)
  75. ->where('user_id', '>', 0)
  76. ->where('status', UserAirdrop::Normal)
  77. ->find();
  78. if(empty($info)){
  79. (new Output())->writeln("本次没有层级奖励数据:");
  80. return false;
  81. }
  82. $user_welfare = UserWelfare::getIsWelfare();
  83. if(empty($user_welfare)){
  84. (new Output())->writeln("空投参数未配置:");
  85. return false;
  86. }
  87. if($user_welfare['is_super'] == 0){
  88. (new Output())->writeln("超级福利未开启:");
  89. return false;
  90. }
  91. $num = $user_welfare['parent_rate'];
  92. if(!($num > 0)){
  93. (new Output())->writeln("上级发放比例配置有误:" . $num);
  94. return false;
  95. }
  96. $user_info = UserModel::where('id', $info['user_id'])->find();
  97. if($user_info->address_level == 0){
  98. (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '会员未领超级福利');
  99. return false;
  100. }
  101. if($user_info->parent_id == 0){
  102. (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '会员无上级');
  103. return false;
  104. }
  105. $parents_info = UserPathModel::where('p.user_id', $info['user_id'])
  106. ->alias('p')
  107. ->join('user u', 'u.id = p.parent_id', 'left')
  108. ->field('u.id, u.address_level, u.direct_super,u.parent_id, p.distance')
  109. ->where('u.address_level', '>',0)
  110. ->order('p.distance asc')
  111. ->select();
  112. if(empty($parents_info)){
  113. (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '所有上级无超级福利');
  114. }
  115. $level = 0;
  116. $send_user_ids = [];//需要发放的会员ID列表
  117. //分享 3 个拿 10 层,分享 10 个拿 31 层
  118. foreach ($parents_info as $parent){
  119. if($parent['direct_super'] >= 3 && $parent['distance'] <= 10){
  120. $send_user_ids[] = $parent['id'];
  121. }else if($parent['direct_super'] >= 10 && $parent['distance'] <= 31){
  122. $send_user_ids[] = $parent['id'];
  123. }
  124. }
  125. if(empty($send_user_ids)){
  126. (new UserAirdrop)->updateDate($info['id'], UserAirdrop::Stop, '所有上级都未满足发放条件');
  127. return false;
  128. }
  129. // 获取指定产品的热门信息
  130. $result = ProductPopular::getPopularByTime($user_welfare['super_product_id'], 'zh', $info->create_time);
  131. $stock = $result->stock - $result->num - $result->init_num;
  132. // 检查库存是否足够
  133. if(!$result || count($send_user_ids) > $stock) {
  134. // 如果库存不足,输出信息并返回false
  135. (new Output())->writeln("本次执行库存不足:应发发".count($send_user_ids) * $num."套,库存:" . $stock);
  136. return false;
  137. }
  138. foreach ($send_user_ids as $user_id){
  139. $rs = WelfareLoginc::setUserProductOrder($num, $result['is_area'], $info['user_id'], $result['price'], $result['product_id'], $user_id, ProductOrder::Airdrop);
  140. if($rs && $result['price'] >= config('min_rwa_price')){
  141. (new UserModel())->updateForRwaNum($user_id, UserModel::getByParentId($user_id), $num, '+');
  142. }
  143. }
  144. // 更新信息列表的状态和备注
  145. $info->status = UserAirdrop::Stop;
  146. $info->remark = '共'.count($send_user_ids).'人,总发放'.count($send_user_ids) * $num.'套';
  147. // 保存更新后的信息列表
  148. return $info->save();
  149. }
  150. /**
  151. * 获取可用日期
  152. * @var array
  153. */
  154. protected function getExeDate($type_id = 1)
  155. {
  156. $today = date('Y-m-d',strtotime("-1day"));//当前时间减一天为最后一次可用时间
  157. $dateInfo = DB::table('timed_task_log')
  158. ->where('type_id' ,$type_id)
  159. ->where('status', 1)
  160. ->order('date_time', 'desc')
  161. ->find();
  162. if(empty($dateInfo)){//首次
  163. return $today;
  164. }
  165. $new_date = date('Y-m-d',strtotime("+1day",strtotime($dateInfo['date_time'])));//最后一次发放日期+1天为本次执行时间
  166. if($new_date > $today){//超过今天
  167. return "";
  168. }
  169. return $new_date;
  170. }
  171. }