UserCoinController.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <?php
  2. namespace app\api\controller\coin;
  3. use app\models\coin\UserCoinTransfer;
  4. use app\models\redis\UserHash;
  5. use app\models\store\StoreOrderCartInfo;
  6. use app\models\system\DictCoin;
  7. use app\models\user\UserCoin;
  8. use app\Request;
  9. use crmeb\services\{UtilService, JsonService};
  10. use think\facade\Config;
  11. class UserCoinController {
  12. public function status(Request $request) {
  13. }
  14. /**
  15. * 启动
  16. */
  17. public function boot(Request $request) {
  18. $uid = $request->uid();
  19. // 是否开启活动
  20. $symbol = Config::get('app.mining_symbo');
  21. if (!$symbol) {
  22. return app('json')->fail('本活动未开启');
  23. }
  24. // 是否已经开启
  25. $mining = UserHash::mining_get($uid);
  26. if ($mining) {
  27. if (isset($mining['progress']) && $mining['progress'] > 0.0) {
  28. return app('json')->fail('已启动');
  29. }
  30. }
  31. // 是否有订单
  32. $orderId = StoreOrderCartInfo::getMiningOrderId($uid);
  33. if (!$orderId) {
  34. return app('json')->fail('下单后可启动');
  35. }
  36. // 标记订单
  37. if (!StoreOrderCartInfo::setMining($orderId)) {
  38. return app('json')->fail('执行失败');
  39. }
  40. // 开启
  41. $secs_unit = Config::get('app.mining_sec_unit');
  42. $reward_unit = Config::get('app.mining_num_per_unit');
  43. $progress = floatval(bcdiv($reward_unit, $secs_unit, 8));
  44. $icon = DictCoin::getIcon($symbol);
  45. $balance = UserCoin::where('uid', $uid)->where('symbol', $symbol)->value('balance') ?? 0.0;
  46. $suc = UserHash::mining_set($uid, [
  47. 'symbol'=> $symbol,
  48. 'icon' => $icon,
  49. 'price' => 0,
  50. 'progress' => $progress,
  51. 'total' => $balance,
  52. 'ts' => time(),
  53. 'order_id' => $orderId,
  54. ]);
  55. if ($suc != 0 && $suc != 1) {
  56. StoreOrderCartInfo::setMining($orderId, 0);
  57. return app('json')->fail('未成功执行');
  58. }
  59. return app('json')->successful([
  60. "symbol" => $symbol,
  61. 'icon' => $icon,
  62. 'price' => 0,
  63. 'step' => $progress,
  64. 'progress' => $progress,
  65. 'total' => $balance,
  66. ]);
  67. }
  68. /**
  69. * 请求转账记录
  70. */
  71. public function history(Request $request) {
  72. [$page, $limit] = UtilService::getMore([
  73. ['page', 1],
  74. ['limit', 20],
  75. ], $request, true);
  76. $uid = $request->uid();
  77. $rows = UserCoinTransfer::getUserTransferred($uid, $page, $limit);
  78. return app('json')->successful($rows);
  79. }
  80. /*
  81. * 更新钱包地址
  82. */
  83. public function updateAddr(Request $request) {
  84. list($symbol, $addr) = UtilService::postMore([
  85. ['symbol', ''],
  86. ['addr', ''],
  87. ], $request, true);
  88. if (!$symbol || !$addr) {
  89. return app('json')->fail('参数不可为空');
  90. }
  91. if (!DictCoin::where('symbol', $symbol)->select()->toArray()) {
  92. return app('json')->fail('未找到目标');
  93. }
  94. $uid = $request->uid();
  95. $suc = UserCoin::upsertAddr($uid, $symbol, $addr);
  96. if (!$suc) {
  97. return app('json')->fail('执行失败');
  98. }
  99. return app('json')->successful();
  100. }
  101. /*
  102. * 提现
  103. */
  104. public function transfer(Request $request) {
  105. list($symbol, $amount) = UtilService::postMore([
  106. ['symbol', ''],
  107. ['amount', 0.0]
  108. ], $request, true);
  109. if(!$symbol) {
  110. return app('json')->fail('参数不可为空');
  111. }
  112. $meta = DictCoin::where('symbol', $symbol)->find();
  113. if (!$meta) {
  114. return app('json')->fail('未找到目标');
  115. }
  116. $meta = $meta->toArray();
  117. if ($amount < $meta['min_withdrawal']){
  118. return app('json')->fail('未达到最低限额');
  119. }
  120. $uid = $request->uid();
  121. $userCoin = UserCoin::where(['uid'=>$uid, 'symbol'=>$symbol])->find();
  122. if (!$userCoin) {
  123. return app('json')->fail('不适用的用户');
  124. }
  125. $userCoin = $userCoin->toArray();
  126. if(!$userCoin['addr']) {
  127. return app('json')->fail('地址未设置');
  128. }
  129. if ($userCoin['balance'] < $amount) {
  130. return app('json')->fail('余额不足');
  131. }
  132. $transferred = UserCoinTransfer::hasTransferred($uid, $symbol, $userCoin['addr']);
  133. if (!$transferred) {
  134. return app('json')->fail('首次操作需联系客服进行');
  135. }
  136. // transfer
  137. UserCoin::beginTrans();
  138. $left = bcsub($userCoin['balance'], $amount, 8);
  139. $res1 = UserCoin::where(['uid'=>$uid, 'symbol'=>$symbol])->update(['balance'=>$left]);
  140. $res2 = UserCoinTransfer::withdrawal($uid, $symbol, $userCoin['addr'], $amount);
  141. $ok = $res1 && $res2;
  142. UserCoin::checkTrans($ok);
  143. if (!$ok) {
  144. return app('json')->fail('执行失败');
  145. }
  146. return app('json')->successful('成功,已开始审核');
  147. }
  148. }