MiningMachine.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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) {
  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. })->toArray();
  48. return compact('count', 'data');
  49. }
  50. public static function buyMachine($id, $uid, $num)
  51. {
  52. $info = self::valid()->where('id', $id)->find();
  53. // if (bcmod($num, $info['step'], 2) > 0) return self::setErrorInfo('算力值错误');
  54. if ($num < $info['step']) return self::setErrorInfo('垓矿机单次购买算力不小于' . $info['step']);
  55. if (!$info) {
  56. return self::setErrorInfo('矿机已下架或不存在');
  57. }
  58. if ($info['stock'] < $num) {
  59. return self::setErrorInfo('矿机不足');
  60. }
  61. $money_type = init_money_type();
  62. $user_money = UserMoney::initialUserMoney($uid, $info['cost_money_type']);
  63. $user_money_stand = UserMoney::initialUserMoney($uid, $info['get_money_type']);
  64. if ($info['cost_money_type'] == $info['get_money_type']) {
  65. $cost_money = bcadd($info['cost_money'], $info['stand_money'], 8);
  66. $stand_money = 0;
  67. } else {
  68. $cost_money = $info['cost_money'];
  69. $stand_money = $info['stand_money'];
  70. }
  71. $cost_money = bcmul($cost_money, $num);
  72. $stand_money = bcmul($stand_money, $num);
  73. $info['cost_money'] = bcmul($info['cost_money'], $num);
  74. $info['stand_money'] = bcmul($info['stand_money'], $num);
  75. if ($user_money['money'] < $cost_money) {
  76. return self::setErrorInfo('购买矿机所需的' . $money_type[$info['cost_money_type']] . '不足');
  77. }
  78. if ($user_money_stand['money'] < $stand_money) {
  79. return self::setErrorInfo('部署矿机需质押的' . $money_type[$info['stand_money_type']] . '(包含GAS)不足');
  80. }
  81. BaseModel::beginTrans();
  82. try {
  83. $res1 = UserMoney::expendMoney($uid, $info['cost_money_type'], $cost_money, 'buy_machine', '购买矿机', '购买矿机' . $info['name'] . '*' . $num);
  84. $res2 = true;
  85. if ($stand_money > 0)
  86. $res2 = UserMoney::expendMoney($uid, $info['stand_money_type'], $stand_money, 'buy_machine_stand', '部署矿机质押', '部署矿机' . $info['name'] . '*' . $num . ',' . '质押(包含GAS费)');
  87. if ($res1 && $res2) {
  88. $res = UserMiningMachine::create([
  89. 'uid' => $uid,
  90. 'mid' => $id,
  91. 'day_get' => $info['day_get'],
  92. 'get_money_type' => $info['get_money_type'],
  93. 'cost_money' => $info['cost_money'],
  94. 'cost_money_type' => $info['cost_money_type'],
  95. 'stand_money' => $info['stand_money'],
  96. 'add_time' => time(),
  97. 'pay_time' => time(),
  98. 'paid' => 1,
  99. 'num' => $num,
  100. '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)),
  101. 'mining_start_time' => bcadd(time(), bcmul($info['stand_time'], 3600 * 24)),
  102. 'second_step_start_time' => bcadd(bcadd(time(), bcmul($info['first_step_time'], 3600 * 24)), bcmul($info['stand_time'], 3600 * 24)),
  103. 'third_step_start_time' => bcadd(bcadd(time(), bcmul($info['first_step_time'] + $info['second_step_time'], 3600 * 24)), bcmul($info['stand_time'], 3600 * 24)),
  104. ]);
  105. if ($res) $res = $res && self::sendRecommendAward($res) && self::bcDec($id, 'stock', $num);
  106. if (!$res) {
  107. return BaseModel::setErrorInfo('购买失败', true);
  108. }
  109. } else {
  110. return BaseModel::setErrorInfo('支付失败', true);
  111. }
  112. BaseModel::commitTrans();
  113. return true;
  114. } catch (Exception $e) {
  115. return BaseModel::setErrorInfo($e->getMessage(), true);
  116. }
  117. }
  118. public static function sendRecommendAward($order)
  119. {
  120. $user = User::getUserInfo($order['uid']);
  121. $spread = User::getUserInfo($user['spread_uid']);
  122. if (!$spread) return true;
  123. $num = $order['cost_money'];
  124. $money_type = $order['cost_money_type'];
  125. $ratio = UserLevel::getUserLevelInfo(UserLevel::getUserLevel($spread['uid']), 'recommend_award_ratio');
  126. $res = true;
  127. $brokerage = bcmul($num, bcdiv($ratio, 100, 4), 8);
  128. if ($brokerage > 0) {
  129. $res = $res && UserMoney::incomeMoney($spread['uid'], $money_type, $brokerage, 'buy_machine_spread_brokerage', '推荐购买矿机', '下级用户' . $user['nickname'] . '(' . $user['uid'] . ')' . '购买矿机' . $order['num'] . 'T,支付' . $order['cost_money'] . $order['cost_money_type'] . '获得推荐奖');
  130. }
  131. return $res;
  132. }
  133. }