RepeatFire.php 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. <?php
  2. /**
  3. * RepeatFire.php UTF-8
  4. * 补单队列消耗
  5. *
  6. * @date : 2020/7/29 10:43
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : chenbingling <cbl@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huoOrderRepeat\job;
  13. use huolib\queue\job\Fire;
  14. use huolib\status\OrderStatus;
  15. use huoOrderRepeat\constant\OrderRepeatConstant;
  16. use huoOrderRepeat\controller\OrderRepeat;
  17. use think\queue\Job;
  18. class RepeatFire extends Fire {
  19. /**
  20. * fire方法是消息队列默认调用的方法
  21. *
  22. * @param Job $job 当前的任务对象
  23. * @param array|mixed $data 发布任务时自定义的数据
  24. */
  25. public function fire(Job $job, $data) {
  26. $_is_job_done = $this->doJob($data);
  27. if ($_is_job_done) {
  28. /* 如果任务执行成功, 记得删除任务 */
  29. $job->delete();
  30. } else {
  31. $_limit_attempts = get_val($data, 'attempts', OrderRepeatConstant::JOB_REPEAT_MAX_CNT);
  32. $_attempts = $job->attempts();
  33. if ($_attempts >= $_limit_attempts) {
  34. /* 任务达到最大次数则删除任务不再执行 */
  35. $job->delete();
  36. } else {
  37. /* 重新发布任务 */
  38. switch ($_attempts) {
  39. case 1:
  40. $_delay = OrderRepeatConstant::JOB_ATTEMPTS_SECOND_TIME;
  41. break;
  42. case 2:
  43. $_delay = OrderRepeatConstant::JOB_ATTEMPTS_THIRD_TIME;
  44. break;
  45. case 3:
  46. $_delay = OrderRepeatConstant::JOB_ATTEMPTS_FOURTH_TIME;
  47. break;
  48. case 4:
  49. $_delay = OrderRepeatConstant::JOB_ATTEMPTS_FIFTH_TIME;
  50. break;
  51. default:
  52. $_delay = OrderRepeatConstant::JOB_ATTEMPTS_ONCE_TIME;
  53. }
  54. // \think\Log::error(['补单尝试次数及时间', $data, time(), $_attempts, $_delay]);
  55. $job->release($_delay); /* $_delay为延迟时间,表示该任务延迟$_delay秒后再执行 */
  56. }
  57. }
  58. }
  59. /**
  60. * 根据消息中的数据进行实际的业务处理
  61. *
  62. * @param array $data 发布任务时自定义的数据
  63. *
  64. * @return bool 任务执行的结果
  65. */
  66. public function doJob($data) {
  67. $_order_id = isset($data['order_id']) ? $data['order_id'] : '';
  68. if (empty($_order_id)) {
  69. /* order_id 为空认为执行成功,否则会重复入队列 */
  70. return true;
  71. }
  72. $_rdata = (new OrderRepeat())->notify($data['order_id']);
  73. $_code = $_rdata['code'];
  74. switch ($_code) {
  75. /* 成功、订单号为空、订单不存在的认为不需要再次执行 */
  76. case OrderStatus::NO_ERROR:
  77. case OrderStatus::ORDER_ID_EMPTY:
  78. case OrderStatus::ORDER_NOT_PAY:
  79. return true;
  80. break;
  81. default:
  82. return false;
  83. }
  84. }
  85. }