MiningMachine.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace app\models\mining;
  3. use app\models\user\User;
  4. use app\models\user\UserLevel;
  5. use app\models\user\UserMoney;
  6. use crmeb\basic\BaseModel;
  7. use crmeb\traits\ModelTrait;
  8. use think\db\Query;
  9. use think\Exception;
  10. class MiningMachine extends BaseModel
  11. {
  12. /**
  13. * 数据表主键
  14. * @var string
  15. */
  16. protected $pk = 'id';
  17. /**
  18. * 模型名称
  19. * @var string
  20. */
  21. protected $name = 'mining_machine';
  22. use ModelTrait;
  23. /**
  24. * @return MiningMachine
  25. */
  26. public static function valid()
  27. {
  28. return self::where('is_del', 0);
  29. }
  30. /**
  31. * @param int $page
  32. * @param int $limit
  33. * @param array $where
  34. * @return array
  35. */
  36. public static function getList(int $page = 1, int $limit = 10, array $where = []): array
  37. {
  38. $money_type = init_money_type();
  39. $model = self::valid();
  40. if (isset($where['get_money_type']) && $where['get_money_type'] != '') $model = $model->where('get_money_type', $where['get_money_type']);
  41. if (isset($where['type']) && $where['type'] != '') $model = $model->where('type', $where['type']);
  42. $count = $model->count();
  43. $data = $model->order('id', 'desc')->page($page, $limit)->select()->each(function ($item) use ($money_type, $where) {
  44. $item['_day_get'] = $item['day_get'] . $money_type[$item['get_money_type']] . '/T';
  45. $item['_cost_money'] = $item['cost_money'] . $money_type[$item['cost_money_type']];
  46. $item['_stand_money'] = $item['stand_money'] . $money_type[$item['get_money_type']];
  47. $item['tags'] = explode(',', $item['tags']);
  48. $item['award_ratio'] = 0;
  49. //$item['service'] = explode(',', $item['tags']);
  50. if (isset($where['uid']) && $where['uid']) {
  51. $item['award_ratio'] = UserMiningRatio::where('uid', $where['uid'])->where('mid', $item['id'])->value('ratio');
  52. $item['service_ratio'] = UserMiningService::where('uid', $where['uid'])->where('mid', $item['id'])->value('ratio') ?: $item['service_ratio'];
  53. }
  54. })->toArray();
  55. return compact('count', 'data');
  56. }
  57. public static function buyMachine($id, $uid, $num)
  58. {
  59. $info = self::valid()->where('id', $id)->find();
  60. // if (bcmod($num, $info['step'], 2) > 0) return self::setErrorInfo('算力值错误');
  61. if ($num < $info['step']) return self::setErrorInfo('垓矿机单次购买算力不小于' . $info['step']);
  62. if (!$info) {
  63. return self::setErrorInfo('矿机已下架或不存在');
  64. }
  65. if ($info['stock'] < $num) {
  66. return self::setErrorInfo('矿机不足');
  67. }
  68. $money_type = init_money_type();
  69. $user_money = UserMoney::initialUserMoney($uid, $info['cost_money_type']);
  70. $user_money_stand = UserMoney::initialUserMoney($uid, $info['get_money_type']);
  71. if ($info['cost_money_type'] == $info['get_money_type']) {
  72. $cost_money = bcadd($info['cost_money'], $info['stand_money'], 8);
  73. $stand_money = 0;
  74. } else {
  75. $cost_money = $info['cost_money'];
  76. $stand_money = $info['stand_money'];
  77. }
  78. $cost_money = bcmul($cost_money, $num);
  79. $stand_money = bcmul($stand_money, $num);
  80. $info['cost_money'] = bcmul($info['cost_money'], $num);
  81. $info['stand_money'] = bcmul($info['stand_money'], $num);
  82. if ($user_money['money'] < $cost_money) {
  83. return self::setErrorInfo('购买矿机所需的' . $money_type[$info['cost_money_type']] . '不足');
  84. }
  85. if ($user_money_stand['money'] < $stand_money) {
  86. return self::setErrorInfo('部署矿机需质押的' . $money_type[$info['stand_money_type']] . '(包含GAS)不足');
  87. }
  88. BaseModel::beginTrans();
  89. try {
  90. $res1 = UserMoney::expendMoney($uid, $info['cost_money_type'], $cost_money, 'buy_machine', '购买矿机', '购买矿机' . $info['name'] . '*' . $num);
  91. $res2 = true;
  92. if ($stand_money > 0)
  93. $res2 = UserMoney::expendMoney($uid, $info['stand_money_type'], $stand_money, 'buy_machine_stand', '部署矿机质押', '部署矿机' . $info['name'] . '*' . $num . ',' . '质押(包含GAS费)');
  94. if ($res1 && $res2) {
  95. $res = UserMiningMachine::create([
  96. 'uid' => $uid,
  97. 'mid' => $id,
  98. 'day_get' => $info['day_get'],
  99. 'get_money_type' => $info['get_money_type'],
  100. 'cost_money' => $info['cost_money'],
  101. 'cost_money_type' => $info['cost_money_type'],
  102. 'stand_money' => $info['stand_money'],
  103. 'add_time' => time(),
  104. 'pay_time' => time(),
  105. 'paid' => 1,
  106. 'num' => $num,
  107. 'mining_end_time' => bcadd(bcadd(time(), bcmul($info['first_step_time'] + $info['third_step_time'] + $info['second_step_time'], 3600 * 24)), bcmul($info['stand_time'], 3600 * 24)),
  108. 'mining_start_time' => bcadd(time(), bcmul($info['stand_time'], 3600 * 24)),
  109. 'second_step_start_time' => bcadd(bcadd(time(), bcmul($info['first_step_time'], 3600 * 24)), bcmul($info['stand_time'], 3600 * 24)),
  110. 'third_step_start_time' => bcadd(bcadd(time(), bcmul($info['first_step_time'] + $info['second_step_time'], 3600 * 24)), bcmul($info['stand_time'], 3600 * 24)),
  111. ]);
  112. if ($res) $res = $res && self::sendRecommendAward($res) && self::bcDec($id, 'stock', $num);
  113. if (!$res) {
  114. return BaseModel::setErrorInfo('购买失败', true);
  115. }
  116. } else {
  117. return BaseModel::setErrorInfo('支付失败', true);
  118. }
  119. $uper = User::getUserInfo($uid);
  120. while ($uper) {
  121. UserLevel::setLevelComplete($uper['uid']);
  122. $uper = User::getUserInfo($uper['spread_uid']);
  123. }
  124. BaseModel::commitTrans();
  125. return true;
  126. } catch (Exception $e) {
  127. return BaseModel::setErrorInfo($e->getMessage(), true);
  128. }
  129. }
  130. public static function sendRecommendAward($order)
  131. {
  132. $user = User::getUserInfo($order['uid']);
  133. $spread = User::getUserInfo($user['spread_uid']);
  134. if (!$spread) return true;
  135. $num = $order['cost_money'];
  136. $money_type = $order['cost_money_type'];
  137. $send = 0;
  138. $res = true;
  139. while ($spread) {
  140. $ratio = UserLevel::getUserLevelInfo(UserLevel::getUserLevel($spread['uid']), 'recommend_award_ratio');
  141. $brokerage = bcmul($num, bcdiv($ratio, 100, 4), 8);
  142. if ($brokerage > $send) {
  143. $res = $res && UserMoney::incomeMoney($spread['uid'], $money_type, bcsub($brokerage, $send, 8), 'buy_machine_spread_brokerage', '推荐佣金', '下级用户' . $user['nickname'] . '(' . $user['uid'] . ')' . '购买矿机' . $order['num'] . 'T,支付' . $order['cost_money'] . $order['cost_money_type'] . '获得推荐奖');
  144. $send = $brokerage;
  145. }
  146. $spread = User::getUserInfo($spread['spread_uid']);
  147. }
  148. return $res;
  149. }
  150. }