SyncDespositJobController.php 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace console\controllers;
  3. use backend\models\Deposit;
  4. use backend\models\SyncDesposit;
  5. use common\helpers\MtKit;
  6. use Yii;
  7. class SyncDespositJobController extends BaseJobController
  8. {
  9. public function actionRun()
  10. {
  11. if (isset(Yii::$app->params['isAutoSyncDesposit']) && Yii::$app->params['isAutoSyncDesposit'] == 1) {
  12. $isAutoSyncDeposit = true;
  13. } else {
  14. $isAutoSyncDeposit = false;
  15. }
  16. if ($isAutoSyncDeposit == false) {
  17. return;
  18. }
  19. $beginTime = time();
  20. $this->outLog("Job start " . date('Y-m-d H:i:s'));
  21. if ($this->redis->set("crm_service:SyncDespositJob", "1", "EX", "60", "NX") == false) {
  22. $this->outLog("Job start failed, lock exist, exit.");
  23. return;
  24. }
  25. $skipLogins = [];
  26. $maxPk = null;
  27. $limit = 100;
  28. while (true) {
  29. if (time() - $beginTime > 55) {
  30. // 退出脚本
  31. $this->outLog("Time greater than 55 seconds");
  32. break;
  33. }
  34. $query = SyncDesposit::find()->andWhere(['!=','is_sync', 1])->orderBy('id asc')->limit($limit)->asArray();
  35. if ($maxPk != null) {
  36. $this->outLog("$maxPk is Not equal to null.");
  37. $query->andWhere(['>', 'id', $maxPk]);
  38. }
  39. $syncDesposits = $query->all();
  40. if (empty($syncDesposits)) {
  41. $this->outLog("No relevant data was found.");
  42. break;
  43. }
  44. foreach ($syncDesposits as $syncDesposit) {
  45. $maxPk = $syncDesposit['id'];
  46. if (time() - $beginTime > 55) {
  47. // 退出脚本
  48. $this->outLog("Time greater than 55 seconds two");
  49. break;
  50. }
  51. // 每个mt4账户1分钟只入一次金 防止请求频繁
  52. if (isset($skipLogins[$syncDesposit['login']])) {
  53. $tt = $syncDesposit['login'];
  54. $this->outLog("$tt");
  55. $this->outLog("Desposit(id: {$syncDesposit['id']}) mt4 frequently");
  56. continue;
  57. }
  58. $this->outLog("Desposit(id: {$syncDesposit['id']}) Start preparing");
  59. $skipLogins[$syncDesposit['login']] = 1;
  60. $affectRows = SyncDesposit::updateAll(['is_sync' => 2], ['id' => $syncDesposit['id'], 'is_sync' => 0]);
  61. if ($affectRows == 0) {
  62. $this->outLog("Desposit(id: {$syncDesposit['id']}) is_sync update fail({$syncDesposit['is_sync']} => 2), skipped.");
  63. continue;
  64. }
  65. $isSuccess = MtKit::deposit($syncDesposit['login'], $syncDesposit['amount'], $syncDesposit['comment']);
  66. if ($isSuccess == false) {
  67. $this->outLog("Desposit(id: {$syncDesposit['id']}) fail.");
  68. continue;
  69. }
  70. $this->outLog("Desposit(id: {$syncDesposit['id']}) success.");
  71. $affectRows = SyncDesposit::updateAll(['is_sync' => 1], ['id' => $syncDesposit['id']]);
  72. if ($affectRows == 0) {
  73. $this->outLog("Desposit(id: {$syncDesposit['id']}) is_sync update fail({$syncDesposit['is_sync']} => 1).");
  74. }
  75. Deposit::updateAll(['mt4_status' => 1], ['order_sn' => $syncDesposit['memo'], 'type' => 1]);
  76. usleep(50000); // sleep 50ms
  77. }
  78. if (count($syncDesposits) != $limit) {
  79. break;
  80. }
  81. }
  82. $this->outLog("Job end, " . date('Y-m-d H:i:s'));
  83. $this->redis->del("crm_service:SyncDespositJob");
  84. }
  85. }