OrderSyncFailService.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace addons\WangDianTong\common\service;
  3. use addons\WangDianTong\common\models\AddonsWangDianTongOrderSyncFail;
  4. use common\enums\RabbitMqEnum;
  5. use common\enums\StatusEnum;
  6. use yii\helpers\Json;
  7. class OrderSyncFailService
  8. {
  9. public function create(array $data)
  10. {
  11. if (!empty($data['id'])) {
  12. $model = AddonsWangDianTongOrderSyncFail::getOne([
  13. ['id' => $data['id']]
  14. ]);
  15. } else {
  16. $data['data_hash'] = md5("{$data['mall_id']}:{$data['data']}:{$data['consumer_class']}:{$data['consumer_method']}");
  17. $model = AddonsWangDianTongOrderSyncFail::getOne([
  18. ['data_hash' => $data['data_hash']]
  19. ]);
  20. }
  21. if (!empty($model)) {
  22. $model->consumer_num += 1;
  23. $model->last_consumer_at = time();
  24. $model->error_message = $data['error_message'];
  25. $model->save();
  26. } else {
  27. $model = new AddonsWangDianTongOrderSyncFail();
  28. if ($model->load($data, '')) {
  29. $model->save();
  30. }
  31. }
  32. }
  33. /**
  34. * 补偿成功
  35. * @param int $id
  36. * @return void
  37. */
  38. public function finish(int $id)
  39. {
  40. if ($id > 0) {
  41. $model = AddonsWangDianTongOrderSyncFail::getOne([
  42. ['id' => $id]
  43. ]);
  44. if (!empty($model)) {
  45. $model->status = StatusEnum::DELETE;
  46. $model->consumer_num += 1;
  47. $model->last_consumer_at = time();
  48. $model->save();
  49. }
  50. }
  51. }
  52. /**
  53. * 失败补偿
  54. * @return void
  55. * @throws \Exception
  56. */
  57. public function compensate()
  58. {
  59. foreach (AddonsWangDianTongOrderSyncFail::find()->where(['status' => StatusEnum::ENABLED])->andWhere(['<', 'consumer_num', 11])->each() as $each) {
  60. $data = Json::decode($each->data);
  61. $data['compensate_id'] = $each->id;
  62. try {
  63. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE,
  64. $data, $each->consumer_class, $each->consumer_method);
  65. } catch (\Exception $e) {
  66. var_dump($e->getMessage(), $e->getFile(), $e->getLine());
  67. }
  68. }
  69. }
  70. }