UserCoinController.php 5.0 KB

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