Test.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\logic\BscApi;
  4. use app\common\logic\MyBscApi;
  5. use app\common\logic\TeamRewards;
  6. use app\common\model\LedgerPowerChangeModel;
  7. use app\common\model\LedgerSmhChangeModel;
  8. use app\common\model\LedgerUsdtChangeModel;
  9. use app\common\model\OfflineRechargeRecordModel;
  10. use app\common\model\OfflineWithdrawRecordModel;
  11. use app\common\model\ParametersModel;
  12. use app\common\model\UserModel;
  13. use app\common\model\UserPathModel;
  14. use app\common\model\LedgerWalletModel;
  15. use fast\Action;
  16. use fast\Asset;
  17. use fast\Http;
  18. use fast\RechargeStatus;
  19. use think\Db;
  20. use think\Log;
  21. use think\Model;
  22. class Test
  23. {
  24. public function copy_user()
  25. {
  26. //从主表复制到备份表
  27. //$user_list = Db::query("SELECT * FROM `user` where id in (SELECT user_id from user_path where parent_id = 100098) or id = 100098");
  28. $user_list = Db::name('user')
  29. ->fetchSql(false)
  30. ->field('u.*,p.distance')
  31. ->alias('u')
  32. ->join('user_path p', 'u.id = p.user_id')
  33. //->where('p.parent_id', 100098)
  34. ->where('p.parent_id', 100115)
  35. ->select();
  36. $i = 0;
  37. foreach ($user_list as $user){
  38. $is = Db::table('user_1')
  39. ->insert($user);
  40. $i++;
  41. }
  42. halt($i);
  43. $user_list = Db::name('user_1')
  44. ->whereNull('address')
  45. ->select();
  46. $i = 0;
  47. foreach ($user_list as $user){
  48. $parent_info = (new UserModel())
  49. ->where('id', $user['parent_id'])
  50. ->find();
  51. if(!empty($parent_info)){
  52. $is = Db::table('user_1')
  53. ->where('id', $user['id'])
  54. ->update([
  55. 'parent_address' => $parent_info['address']
  56. ]);
  57. $i++;
  58. }
  59. }
  60. halt($i);
  61. // //从备份表中除掉不要的数据
  62. // $user_list = Db::query("SELECT * FROM `user_1` where id in (SELECT user_id from user_path where parent_id = 100277) or id = 100277");
  63. // $i = 0;
  64. // foreach ($user_list as $user){
  65. // $is = Db::table('user_1')
  66. // ->where('id', $user['id'])
  67. // ->delete();
  68. // $i++;
  69. // }
  70. // halt($i);
  71. //从备份表中根据上级ID,更新每个用户的上级钱包地址和钱包地址
  72. $user_list = Db::table('user_1')
  73. ->select();
  74. $i = 0;
  75. $is = Db::table('ledger_wallet_1')
  76. ->where('user_id', '>', 0)
  77. ->update([
  78. 'address' => null
  79. ]);
  80. $parent_arr[100115] = '0xc3e8f8179fad209304ada21708acdcf3834c448c';
  81. foreach ($user_list as $user){
  82. $parent_arr[$user['id']] = $user['address'];
  83. }
  84. foreach ($user_list as $user){
  85. $is = Db::table('ledger_wallet_1')
  86. ->where('user_id', $user['id'])
  87. ->update([
  88. 'address' => $user['address']
  89. ]);
  90. if(isset($parent_arr[$user['id']])){
  91. $is = Db::table('user_1')
  92. ->where('id', $user['id'])
  93. ->update([
  94. 'parent_address' => $parent_arr[$user['parent_id']]
  95. ]);
  96. $i++;
  97. }else{
  98. dump($user['id'] . '--无上级');
  99. }
  100. }
  101. halt($i);
  102. }
  103. /*
  104. * 更新上级
  105. */
  106. public function change_parent()
  107. {
  108. //1.从主表复制到备份表,需手动插入上级信息
  109. // dump('从主表复制到备份表');
  110. // $user_list = Db::name('user')
  111. // ->fetchSql(false)
  112. // ->field('u.*,p.distance')
  113. // ->alias('u')
  114. // ->join('user_path p', 'u.id = p.user_id')
  115. // ->where('p.parent_id', 101985)
  116. // //->where('u.id','>', 103931)
  117. // ->select();
  118. //
  119. // $i = 0;
  120. // foreach ($user_list as $user){
  121. // $is = Db::table('user_1')
  122. // ->insert($user);
  123. // $i++;
  124. // }
  125. // halt($i);
  126. //*2.更新备份表上级地址
  127. // dump('更新上级地址');
  128. // $user_list = Db::name('user_1')
  129. // ->whereNull('parent_address')
  130. // ->select();
  131. // $i = 0;
  132. // foreach ($user_list as $user){
  133. // $parent_info = (new UserModel())
  134. // ->where('id', $user['parent_id'])
  135. // ->find();
  136. // if(!empty($parent_info)){
  137. // $is = Db::table('user_1')
  138. // ->where('id', $user['id'])
  139. // ->update([
  140. // 'parent_address' => $parent_info['address']
  141. // ]);
  142. // $i++;
  143. // }
  144. // }
  145. // halt($i);
  146. //3.更新主表会员上级
  147. dump('重建网体');
  148. $user_list = Db::table('user_1')
  149. ->order('distance')
  150. ->select();
  151. $i = 0;
  152. foreach ($user_list as $user){
  153. $parent_info = (new UserModel())
  154. ->where('address', $user['parent_address'])
  155. ->find();
  156. if(!empty($parent_info)){
  157. $is = Db::table('user')
  158. ->where('id', $user['id'])
  159. ->update([
  160. 'parent_id' => $parent_info['id']
  161. ]);
  162. //删除网体
  163. (new UserPathModel())
  164. ->where('user_id', $user['id'])
  165. ->delete();
  166. // 创建网体
  167. (new UserPathModel())->createPath($user['id'], $parent_info['id']);
  168. $i++;
  169. } else{
  170. dump($user['id'] . '--无上级');
  171. }
  172. }
  173. halt($i);
  174. }
  175. /*
  176. * 更新上级
  177. *
  178. * 更改给定ID的上级,并把它的直推一并更改
  179. */
  180. public function resetParent()
  181. {
  182. //3.更新主表会员上级
  183. dump('重建网体');
  184. $parent_id = 100100;
  185. $user_id = 101134;
  186. $user = (new UserModel())
  187. ->fetchSql(false)
  188. ->where('id', $user_id)
  189. ->update([
  190. 'parent_id' => $parent_id
  191. ]);
  192. dump($user, true, '更新状态');
  193. //删除网体
  194. (new UserPathModel())
  195. ->where('user_id', $user_id)
  196. ->delete();
  197. // 创建网体
  198. (new UserPathModel())->createPath($user_id, $parent_id);
  199. $user_list = (new UserModel())
  200. ->where('parent_id', $user_id)
  201. ->select();
  202. $i = 0;
  203. foreach ($user_list as $user){
  204. //删除网体
  205. (new UserPathModel())
  206. ->where('user_id', $user['id'])
  207. ->delete();
  208. // 创建网体
  209. (new UserPathModel())->createPath($user['id'], $user['parent_id']);
  210. $i++;
  211. }
  212. halt($i);
  213. }
  214. /**
  215. 导入数据表生成 sql
  216. CREATE TABLE dao_ru AS SELECT
  217. u.id,
  218. u.parent_id,
  219. u.address,
  220. u.team_power,
  221. u.team_num,
  222. w.power,
  223. w.rental_power,
  224. w.usdt
  225. FROM
  226. `user` u
  227. LEFT JOIN ledger_wallet w ON u.id = w.user_id
  228. WHERE
  229. id IN ( SELECT user_id FROM `user_path` WHERE parent_id = 1012 )
  230. OR id = 1012
  231. ORDER BY
  232. id
  233. */
  234. public function daoru()
  235. {
  236. die;
  237. $daoru_list = Db::table('user_base')
  238. //->where('is_dao', 1)
  239. ->select();
  240. $i = 0;
  241. $j = 0;
  242. //重建钱包
  243. foreach ($daoru_list as $key => $info) {
  244. $user = (new UserModel())->getByAddress($info['address']);
  245. if (!empty($user)) { // 已存在
  246. // 更新总算力和账变
  247. (new LedgerWalletModel)->changeWalletAccount($user['id'], Asset::POWER, $info['power'], Action::Reversal, 0);
  248. // 更新自己(有效会员时间)和所有上级的信息(有效直推人数和团队总算力)
  249. (new UserModel())->updateForRental($user['id'], $info['power']);
  250. $j++;
  251. continue;
  252. }
  253. }
  254. //重建用户
  255. // foreach ($daoru_list as $key => $info) {
  256. //
  257. // $parent_user = (new UserModel())->getByAddress($info['parent_address']);
  258. // if(empty($parent_user)){
  259. // dump('没有上级');
  260. // dump($info);
  261. // continue;
  262. // }
  263. //
  264. // $user = (new UserModel())->getByAddress($info['address']);
  265. // if (!empty($user)) { // 已存在
  266. // dump($info['id'] . ' - ' . $info['address'] . ' - 已存在');
  267. //
  268. // $is = Db::table('user')
  269. // ->where('id', $user['id'])
  270. // ->update([
  271. // 'parent_id' => $parent_user['id']
  272. // ]);
  273. // $j++;
  274. // continue;
  275. // }
  276. //
  277. // unset($info['id']);
  278. // unset($info['parent_address']);
  279. // unset($info['is_dao']);
  280. // $info['parent_id'] = $parent_user['id'];
  281. // // 创建用户
  282. // $newUserID = (new UserModel())->insertGetId($info);
  283. // // 创建钱包
  284. // (new LedgerWalletModel())->insertGetId([
  285. // 'user_id' => $newUserID,
  286. // ]);
  287. //
  288. // // 创建网体
  289. // (new UserPathModel())->createPath($newUserID, $parent_user['id']);
  290. //
  291. // $i++;
  292. //
  293. // }
  294. dump($i);
  295. dump($j);
  296. }
  297. public function updaetWallet()
  298. {
  299. $daoru_list = Db::table('ledger_wallet_1')
  300. ->whereNotNull('address')
  301. ->select();
  302. $i = 0;
  303. foreach ($daoru_list as $key => $info) {
  304. dump($info);
  305. $user = (new UserModel())->getByAddress($info['address']);
  306. if (empty($user)) {
  307. dump($info['user_id'] . ' - ' . $info['address'] . ' - 不存在');
  308. continue;
  309. }
  310. unset($info['user_id']);
  311. unset($info['address']);
  312. //更新钱包
  313. $is_up = (new LedgerWalletModel())
  314. ->where('user_id', $user['id'])
  315. ->update($info);
  316. dump($user['id'] . '更新' . $is_up);
  317. $i++;
  318. }
  319. dump($i);
  320. }
  321. /**
  322. * 手段向某会员报单算力
  323. * @return void
  324. * @throws \think\db\exception\DataNotFoundException
  325. * @throws \think\db\exception\ModelNotFoundException
  326. * @throws \think\exception\DbException
  327. */
  328. public function updateOrder()
  329. {
  330. //算力租赁订单处理
  331. // 查询兑换比例
  332. $usdtToPower = (new ParametersModel)->getValue('usdtToPowerRate');
  333. $usdtToPowerFloat = floatval($usdtToPower);
  334. if (is_null($usdtToPower) || $usdtToPowerFloat <= 0) {
  335. return '获取USDT兑换算力的比例失败';
  336. }
  337. $orderInfo = (new OfflineRechargeRecordModel())
  338. ->where('id', 4)
  339. ->find();
  340. if(empty($orderInfo)){
  341. halt('订单信息不存在');
  342. }
  343. $uid = $orderInfo['user_id'];
  344. $fee = $orderInfo['amount'];
  345. $power = bcmul($fee, $usdtToPowerFloat, 6); // 该用户兑得的算力
  346. // 启动事务
  347. Db::startTrans();
  348. try {
  349. // 更新总算力和账变
  350. (new LedgerWalletModel)->changeWalletAccount($uid, Asset::POWER, $power, Action::PowerRentalPower, $orderInfo['id']);
  351. // 更新服务器算力,不账变
  352. (new LedgerWalletModel)->changeWalletOnly($uid, Asset::RENTAL_POWER, $power);
  353. // 更新自己(有效会员时间)和所有上级的信息(有效直推人数和团队总算力)
  354. (new UserModel())->updateForRental($uid, $power);
  355. // 发放直推USDT收益
  356. (new LedgerWalletModel)->sendUsdtProfit($uid, $fee);
  357. // 发放直推算力收益
  358. (new LedgerWalletModel)->sendDirectProfit($uid, $power);
  359. // 发代数收益
  360. (new LedgerWalletModel)->sendGenerateProfit($uid, $fee);
  361. // 发放见点奖
  362. (new LedgerWalletModel)->sendRegBonus($uid, $fee);
  363. // 更新购买(充值)记录
  364. (new OfflineRechargeRecordModel())->updateOrderStatus($orderInfo['id'], RechargeStatus::StatusAuthSuccess, 0, $power);
  365. // 提交事务
  366. Db::commit();
  367. } catch (Exception $e) {
  368. // 回滚事务
  369. Db::rollback();
  370. return $e->getMessage();
  371. }
  372. }
  373. //重算团队业绩和直推人数
  374. public function reset_team()
  375. {
  376. set_time_limit(0);
  377. //先清空
  378. $update = Db::table('user')
  379. ->where('id', '>', 0)
  380. ->update([
  381. 'team_power' => 0,
  382. 'team_num' => 0,
  383. 'direct_num' => 0
  384. ]);
  385. $up_power = Db::table('ledger_wallet')
  386. ->field('u.id')
  387. ->alias('w')
  388. ->join('user u', 'w.user_id = u.id')
  389. ->where('u.effective_time','>',0)
  390. ->where('w.rental_power', 0)
  391. ->select();
  392. foreach ($up_power as $item){
  393. $update = Db::table('ledger_wallet')
  394. ->where('user_id', $item['id'])
  395. ->update([
  396. 'rental_power' => 0.01
  397. ]);
  398. }
  399. $power_list = Db::table('ledger_wallet')
  400. ->where('rental_power', '>', 0)
  401. ->select();
  402. $info_list = 0;
  403. $bad_list = [];
  404. foreach ($power_list as $key => $info) {
  405. dump('正在处理ID:' . $info['user_id']);
  406. $parent_ids = (new UserPathModel())
  407. ->where('user_id',$info['user_id'])
  408. ->order('distance')
  409. ->select();
  410. foreach ($parent_ids as $item) {
  411. $data = [
  412. 'team_power' => Db::raw('team_power + ' . $info['rental_power']),
  413. 'team_num' => Db::raw('team_num + 1'),
  414. ];
  415. if ($item['distance'] == 1) {
  416. $data['direct_num'] = Db::raw('direct_num+1');
  417. }
  418. $update = Db::table('user')
  419. ->where('id', $item['parent_id'])
  420. ->update($data);
  421. if (!$update) {
  422. $bad_list[] = $info;
  423. } else {
  424. $info_list++;
  425. }
  426. }
  427. }
  428. dump('成功数量');
  429. dump($info_list);
  430. dump('失败数量');
  431. dump($bad_list);
  432. }
  433. //累加新增团队业绩
  434. public function addTeamPower()
  435. {
  436. set_time_limit(0);
  437. $uid = 100702;
  438. $num = 1429;
  439. $parentIDs = (new UserPathModel())->getAllParentIDs($uid);
  440. $parentIDs[] = $uid;
  441. dump($parentIDs, true, 'ID列表');
  442. $update = (new UserModel())
  443. ->where('id', 'in', $parentIDs)
  444. ->update([
  445. 'team_power' => Db::raw('team_power + ' . $num)
  446. ]);
  447. dump($update, true, '影响行数');
  448. }
  449. public function resetUserPath()
  450. {
  451. $ratio = 0.05;//直推奖励
  452. $info_list = (new OfflineRechargeRecordModel())
  453. ->where('status', OfflineRechargeRecordModel::StatusFail)
  454. ->order('id', 'ASC')
  455. ->select();
  456. dump('本次数据共有:' . count($info_list));
  457. foreach ($info_list as $info) {
  458. $user = (new UserModel())->get($info['user_id']);
  459. if (empty($user) || $user['parent_id'] == 0) {
  460. continue;
  461. }
  462. $check = (new LedgerUsdtChangeModel())
  463. ->where('user_id', $user['parent_id'])
  464. ->where('action', Action::UsdtShareBonus)
  465. ->where('from_id', $info['user_id'])
  466. ->count();
  467. if($check == 0){
  468. (new LedgerWalletModel())->changeWalletAccount($user['parent_id'], Asset::USDT, $info['amount'] * $ratio, Action::UsdtShareBonus, $info['user_id']);
  469. dump('订单ID:' . $info['id'] . '处理成功,奖金:' . $info['amount'] * $ratio);
  470. }else{
  471. dump('订单ID:' . $info['id'] . '处理失败,奖金已存在');
  472. }
  473. }
  474. }
  475. /**
  476. * 补发直推奖
  477. * @return void
  478. */
  479. public function resetShareBonus()
  480. {
  481. $users = (new UserModel())->order('id', 'ASC')->select();
  482. foreach ($users as $v) {
  483. (new UserPathModel())->createPath($v['id'], $v['parent_id']);
  484. }
  485. }
  486. /**
  487. * @return string
  488. *
  489. * 返回结果
  490. * {
  491. "status": "1",
  492. "message": "OK",
  493. "result": {
  494. "status": "1"
  495. }
  496. }
  497. */
  498. public function getStatusByHaxh()
  499. {
  500. $url = "https://api.bscscan.com/api?module=transaction&action=gettxreceiptstatus&txhash=0x30f4190a8237c7744a0981a2895728bab93acf4cb78b03c192ed5ac387405c54&apikey=VTCKIP346DCRWB6JNS4KDANUJJEQN9VAKW";
  501. $body = Http::get($url);
  502. if (empty($body)) {
  503. return "api返回内容为空";
  504. }
  505. dump($body);
  506. // 转成数组
  507. $rsArr = json_decode($body, true);
  508. dump($rsArr);
  509. if (empty($rsArr) || !is_array($rsArr)) {
  510. return "状态api返回数据异常";
  511. }
  512. if ($rsArr['status'] != '1') {
  513. return '状态api返回status不为1,错误信息:' . $rsArr['message'];
  514. }
  515. if ($rsArr['result']['status'] != 1) {
  516. return '状态api返回result中的status不为1,错误信息:' . $rsArr['message'];
  517. }
  518. }
  519. public function AllocateEtc()
  520. {
  521. $url = "https://www.binance.com/api/v1/klines?symbol=ETCUSDT&limit=1&interval=3m";
  522. $body = Http::get($url);
  523. if (empty($body)) {
  524. return "api返回内容为空";
  525. }
  526. dump($body);
  527. // 转成数组
  528. $rsArr = json_decode($body, true);
  529. dump($rsArr[0][2]);
  530. $body = Http::get($url);
  531. if (empty($body)) {
  532. return "api返回内容为空";
  533. }
  534. dump($body);
  535. // 转成数组
  536. $rsArr = json_decode($body, true);
  537. dump($rsArr);
  538. if (empty($rsArr) || !is_array($rsArr)) {
  539. return "状态api返回数据异常";
  540. }
  541. if ($rsArr['status'] != '1') {
  542. return '状态api返回status不为1,错误信息:' . $rsArr['message'];
  543. }
  544. if ($rsArr['result']['status'] != 1) {
  545. return '状态api返回result中的status不为1,错误信息:' . $rsArr['message'];
  546. }
  547. }
  548. public function debug()
  549. {
  550. $num =rand(9000,10000);
  551. dump($num/10000/1000);
  552. $body = (new MyBscApi())->getInfoByTransactionHash('0xc3fc59faa9a1a9ff4fa1516b7df10570876a87993c397f6cd33ce3446641b5b0');
  553. dump($body);
  554. }
  555. }