CrontabLogic.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | saiadmin [ saiadmin快速开发框架 ]
  4. // +----------------------------------------------------------------------
  5. // | Author: sai <1430792918@qq.com>
  6. // +----------------------------------------------------------------------
  7. namespace plugin\saiadmin\app\logic\tool;
  8. use GuzzleHttp\Client;
  9. use GuzzleHttp\Exception\GuzzleException;
  10. use plugin\saiadmin\app\model\tool\Crontab;
  11. use plugin\saiadmin\app\model\tool\CrontabLog;
  12. use plugin\saiadmin\basic\BaseLogic;
  13. use plugin\saiadmin\exception\ApiException;
  14. /**
  15. * 定时任务逻辑层
  16. */
  17. class CrontabLogic extends BaseLogic
  18. {
  19. /**
  20. * 构造函数
  21. */
  22. public function __construct()
  23. {
  24. $this->model = new Crontab();
  25. }
  26. /**
  27. * 添加任务
  28. */
  29. public function add($data): mixed
  30. {
  31. $second = $data['second'];
  32. $minute = $data['minute'];
  33. $hour = $data['hour'];
  34. $week = $data['week'];
  35. $day = $data['day'];
  36. $month = $data['month'];
  37. // 规则处理
  38. $rule = match ($data['task_style']) {
  39. 1 => "0 {$minute} {$hour} * * *",
  40. 2 => "0 {$minute} * * * *",
  41. 3 => "0 {$minute} */{$hour} * * *",
  42. 4 => "0 */{$minute} * * * *",
  43. 5 => "*/{$second} * * * * *",
  44. 6 => "0 {$minute} {$hour} * * {$week}",
  45. 7 => "0 {$minute} {$hour} {$day} * *",
  46. 8 => "0 {$minute} {$hour} {$day} {$month} *",
  47. default => throw new ApiException("任务类型异常"),
  48. };
  49. // 定时任务模型新增
  50. $model = Crontab::create([
  51. 'name' => $data['name'],
  52. 'type' => $data['type'],
  53. 'task_style' => $data['task_style'],
  54. 'rule' => $rule,
  55. 'target' => $data['target'],
  56. 'parameter' => $data['parameter'],
  57. 'status' => $data['status'],
  58. 'remark' => $data['remark'],
  59. ]);
  60. return $model->getKey();
  61. }
  62. /**
  63. * 修改任务
  64. */
  65. public function edit($id, $data): mixed
  66. {
  67. $second = $data['second'];
  68. $minute = $data['minute'];
  69. $hour = $data['hour'];
  70. $week = $data['week'];
  71. $day = $data['day'];
  72. $month = $data['month'];
  73. // 规则处理
  74. $rule = match ($data['task_style']) {
  75. 1 => "0 {$minute} {$hour} * * *",
  76. 2 => "0 {$minute} * * * *",
  77. 3 => "0 {$minute} */{$hour} * * *",
  78. 4 => "0 */{$minute} * * * *",
  79. 5 => "*/{$second} * * * * *",
  80. 6 => "0 {$minute} {$hour} * * {$week}",
  81. 7 => "0 {$minute} {$hour} {$day} * *",
  82. 8 => "0 {$minute} {$hour} {$day} {$month} *",
  83. default => throw new ApiException("任务类型异常"),
  84. };
  85. // 查询任务数据
  86. $model = $this->model->findOrEmpty($id);
  87. if ($model->isEmpty()) {
  88. throw new ApiException('数据不存在');
  89. }
  90. // 修改任务数据
  91. return $model->save([
  92. 'name' => $data['name'],
  93. 'type' => $data['type'],
  94. 'task_style' => $data['task_style'],
  95. 'rule' => $rule,
  96. 'target' => $data['target'],
  97. 'parameter' => $data['parameter'],
  98. 'status' => $data['status'],
  99. 'remark' => $data['remark'],
  100. ]);
  101. }
  102. /**
  103. * 执行定时任务
  104. * @param $id
  105. * @return bool
  106. */
  107. public function run($id): bool
  108. {
  109. $info = $this->find($id);
  110. $data['crontab_id'] = $info->id;
  111. $data['name'] = $info->name;
  112. $data['target'] = $info->target;
  113. $data['parameter'] = $info->parameter;
  114. switch ($info->type) {
  115. // case 1:
  116. // // URL任务GET
  117. // $httpClient = new Client([
  118. // 'timeout' => 5,
  119. // 'verify' => false,
  120. // ]);
  121. // try {
  122. // $httpClient->request('GET', $info->target);
  123. // $data['status'] = 1;
  124. // CrontabLog::create($data);
  125. // return true;
  126. // } catch (GuzzleException $e) {
  127. // $data['status'] = 2;
  128. // $data['exception_info'] = $e->getMessage();
  129. // CrontabLog::create($data);
  130. // return false;
  131. // }
  132. // case 2:
  133. // // URL任务POST
  134. // $httpClient = new Client([
  135. // 'timeout' => 5,
  136. // 'verify' => false,
  137. // ]);
  138. // try {
  139. // $res = $httpClient->request('POST', $info->target, [
  140. // 'form_params' => json_decode($info->parameter ?? '',true)
  141. // ]);
  142. // $data['status'] = 1;
  143. // $data['exception_info'] = $res->getBody();
  144. // CrontabLog::create($data);
  145. // return true;
  146. // } catch (GuzzleException $e) {
  147. // $data['status'] = 2;
  148. // $data['exception_info'] = $e->getMessage();
  149. // CrontabLog::create($data);
  150. // return false;
  151. // }
  152. case 3:
  153. // 类任务
  154. $class_name = $info->target;
  155. $method_name = 'run';
  156. $class = new $class_name;
  157. if (method_exists($class, $method_name)) {
  158. $return = $class->$method_name($info->parameter);
  159. $data['status'] = 1;
  160. $data['exception_info'] = $return;
  161. CrontabLog::create($data);
  162. return true;
  163. } else {
  164. $data['status'] = 2;
  165. $data['exception_info'] = '类:'.$class_name.',方法:run,未找到';
  166. CrontabLog::create($data);
  167. return false;
  168. }
  169. default:
  170. return false;
  171. }
  172. }
  173. }