WelfareLoginc.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace app\api\logic;
  3. use app\api\controller\Product;
  4. use app\common\model\ProductArea;
  5. use app\common\controller\Api;
  6. use app\common\model\UserWelfare;
  7. use app\common\model\ProductPopular;
  8. use app\common\model\ProductOrder;
  9. use app\common\model\UserModel;
  10. use think\Db;
  11. use think\Log;
  12. use Exception;
  13. /**
  14. * 空投福利
  15. */
  16. class WelfareLoginc
  17. {
  18. /** 添加新人福利
  19. * @param int $uid 用户id
  20. * @param array $productId 产品ID
  21. * @param int $num 数量
  22. * @param int $lan 语言
  23. */
  24. public static function setUserWelfareLos($uid, int $productId, $num, $tim, $lan, $typeId)
  25. {
  26. $result = ProductPopular::getPopularByTime($productId, $lan, $tim);
  27. if(!$result || $num > ($result->stock-$result->init_num - $result->num)) throw new Exception(__('库存不足'));
  28. //添加产品
  29. self::setUserProductOrder($num, $result->is_area, $result->id, $result->price, $productId, $uid, $typeId);
  30. return ['start_time'=>$tim, 'name'=>$result->name, 'num'=>$num, 'price'=>$result->price];
  31. }
  32. /*
  33. 这个条件是
  34. 向持有选定产品超过指定数量的用户空投指定数量/或比例/的指定产品,
  35. 比如
  36. 向持有A茶超过10套的用户,空投2套B茶
  37. 向持有A茶超过10套的用户,空投持有 数量X20%套B茶,数量取整
  38. */
  39. /** $mod 0指定数量 1比
  40. * 获取用户Rwa数量
  41. */
  42. public static function getUserRwaProductNum(int $productId, int $rwa_num, $mod, $num): int
  43. {
  44. //读取当日新增数据
  45. $list = ProductOrder::where('product_id', $productId)->where('status', ProductOrder::Paid)->where('popular_price', '>', config('min_rwa_price'))
  46. ->field('user_id,sum(num) as total_num')
  47. ->group('user_id')
  48. ->field('user_id,count(num) as total_num')
  49. ->group('user_id')
  50. ->having('total_num>='.$rwa_num)->select();
  51. if(empty($list)) return 0;
  52. $total = 0; //总数量
  53. if($mod == 1 && $num > 0){
  54. $num = bcdiv($num, 100, 2);
  55. foreach ($list as $item) {
  56. $total += bcmul($item->total_num, $num);
  57. }
  58. }else{
  59. $total = count($list) * $num;
  60. }
  61. return $total;
  62. }
  63. /**
  64. * 向达到一定持有量的用户空投产品
  65. * @param int $rwa_num //数量
  66. * @param $productId //产品ID
  67. * @param $rwaProductId //Rwa产品ID
  68. * @param $isArea
  69. * @param $orderId
  70. * @param $price
  71. * @param $mod
  72. * @param $num
  73. * @return int
  74. */
  75. public static function setUserExRwaNum(int $rwa_num, $productId, $rwaProductId, $isArea, $orderId, $price, $mod, $num): int
  76. {
  77. $total = 0; //总数量
  78. // 使用bcdiv函数进行高精度除法运算,$num除以100,保留两位小数
  79. $div = bcdiv($num, 100, 2);
  80. $list = ProductOrder::where('status', ProductOrder::Paid)
  81. ->where('product_id', $rwaProductId)
  82. ->where('popular_price', '>', config('min_rwa_price'))
  83. ->group('user_id')->having('total_num>='.$rwa_num)
  84. ->field('id,user_id,count(num) as total_num')
  85. ->select();
  86. $user = new UserModel();
  87. foreach($list as $order){
  88. //根据$mod的值决定是否需要对用户的rwa_num进行乘以$div的运算
  89. $num = ($mod == 1)? bcmul($order->total_num, $div): $num;
  90. // 尝试为用户设置产品订单,如果成功,则更新用户的rwa_num
  91. if(!empty(self::setUserProductOrder($num, $isArea, $orderId, $price, $productId, $order->user_id, ProductOrder::Airdrop))){
  92. // 调用静态方法更新用户的rwa_num,增加$num的值
  93. $user::updateForRwaNum($order->user_id, $user::getByParentId($order->user_id), $num, '+');
  94. }
  95. }
  96. return $total;
  97. }
  98. /**
  99. * 设置用户产品订单
  100. * 该方法根据是否需要区域信息来设置用户的订单信息如果没有指定区域,则调用setPopularNoAreaOrder方法,
  101. * 否则,首先查询产品关联的区域ID,然后调用setPopularAreaOrder方法设置订单信息
  102. * @param int $num 订单数量
  103. * @param bool $isArea 是否需要区域信息
  104. * @param mixed $orderId 订单ID
  105. * @param float $price 产品价格
  106. * @param int $productId 产品ID
  107. * @param int $uid 用户ID
  108. * @param int $typeId 订单类型ID
  109. * @return mixed 返回订单设置结果
  110. */
  111. public static function setUserProductOrder(int $num, $isArea, $orderId, $price, $productId, $uid, $typeId)
  112. {
  113. // 判断是否需要区域信息
  114. if(empty($isArea)){
  115. // 不需要区域信息,调用相应的方法设置订单
  116. $result = ProductOrder::setPopularNoAreaOrder($num, $orderId, $price, $productId, $uid, $typeId);
  117. }else{
  118. // 需要区域信息,首先查询符合条件的区域ID
  119. $areaArr = ProductArea::where('product_id', $productId)->where('status', ProductArea::Normal)->orderRaw('id desc')->limit($num)->column('id');
  120. // 使用查询到的区域ID调用相应的方法设置订单
  121. $result = ProductOrder::setPopularAreaOrder($areaArr, $orderId, $price, $productId, $uid, $typeId);
  122. }
  123. // 返回订单设置结果
  124. return $result;
  125. }
  126. }