GrouponAutoOper.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <?php
  2. namespace addons\shopro\job;
  3. use think\queue\Job;
  4. use think\Db;
  5. use think\exception\HttpResponseException;
  6. use app\admin\model\shopro\order\Order;
  7. use app\admin\model\shopro\activity\Groupon;
  8. use addons\shopro\library\activity\traits\Groupon as GrouponTrait;
  9. /**
  10. * 拼团自动操作
  11. */
  12. class GrouponAutoOper extends BaseJob
  13. {
  14. use GrouponTrait;
  15. /**
  16. * 拼团判断,将团结束,
  17. */
  18. public function expire(Job $job, $data)
  19. {
  20. if (check_env('yansongda', false)) {
  21. set_addon_config('epay', ['version' => 'v3'], false);
  22. \think\Hook::listen('epay_config_init');
  23. }
  24. try {
  25. $activity = $data['activity'];
  26. $activity_groupon_id = $data['activity_groupon_id'];
  27. $activityGroupon = Groupon::where('id', $activity_groupon_id)->find();
  28. // 活动正在进行中, 走这里的说明人数 都没满
  29. if ($activityGroupon && $activityGroupon['status'] == 'ing') {
  30. Db::transaction(function () use ($activity, $activityGroupon) {
  31. $rules = $activity['rules'];
  32. // 是否虚拟成团
  33. $is_fictitious = $rules['is_fictitious'] ?? 0;
  34. // 最大虚拟人数 ,不填或者 "" 不限制人数,都允许虚拟成团, 0相当于不允许虚拟成团
  35. $fictitious_num = (!isset($rules['fictitious_num']) || $rules['fictitious_num'] === '') ? 'no-limit' : $rules['fictitious_num'];
  36. // 拼团剩余人数
  37. $surplus_num = $activityGroupon['num'] - $activityGroupon['current_num'];
  38. if ($is_fictitious && ($fictitious_num == 'no-limit' || $fictitious_num >= $surplus_num)) {
  39. // 虚拟成团,如果虚拟用户不够,则自动解散
  40. $this->finishFictitiousGroupon($activity, $activityGroupon);
  41. } else {
  42. // 解散退款
  43. $this->invalidRefundGroupon($activityGroupon);
  44. }
  45. });
  46. }
  47. // 删除 job
  48. $job->delete();
  49. } catch (HttpResponseException $e) {
  50. $data = $e->getResponse()->getData();
  51. $message = $data ? ($data['msg'] ?? '') : $e->getMessage();
  52. format_log_error($e, 'GrouponAutoOper.expire.HttpResponseException', $message);
  53. } catch (\Exception $e) {
  54. // 队列执行失败
  55. format_log_error($e, 'GrouponAutoOper.expire');
  56. }
  57. }
  58. /**
  59. * 拼团判断,提前虚拟成团
  60. */
  61. public function fictitious(Job $job, $data)
  62. {
  63. try {
  64. $activity = $data['activity'];
  65. $activity_groupon_id = $data['activity_groupon_id'];
  66. $activityGroupon = Groupon::where('id', $activity_groupon_id)->find();
  67. // 活动正在进行中, 走这里的说明人数 都没满
  68. if ($activityGroupon && $activityGroupon['status'] == 'ing') {
  69. Db::transaction(function () use ($activity, $activityGroupon) {
  70. $rules = $activity['rules'];
  71. // 是否虚拟成团
  72. $is_fictitious = $rules['is_fictitious'] ?? 0;
  73. // 最大虚拟人数 ,不填或者 "" 不限制人数,都允许虚拟成团, 0相当于不允许虚拟成团
  74. $fictitious_num = (!isset($rules['fictitious_num']) || $rules['fictitious_num'] === '') ? 'no-limit' : $rules['fictitious_num'];
  75. // 拼团剩余人数
  76. $surplus_num = $activityGroupon['num'] - $activityGroupon['current_num'];
  77. if ($is_fictitious && ($fictitious_num == 'no-limit' || $fictitious_num >= $surplus_num)) {
  78. // 虚拟成团,如果不符合成团条件,则不处理
  79. $this->finishFictitiousGroupon($activity, $activityGroupon, false);
  80. }
  81. });
  82. }
  83. // 删除 job
  84. $job->delete();
  85. } catch (HttpResponseException $e) {
  86. $data = $e->getResponse()->getData();
  87. $message = $data ? ($data['msg'] ?? '') : $e->getMessage();
  88. format_log_error($e, 'GrouponAutoOper.fictitious.HttpResponseException', $message);
  89. } catch (\Exception $e) {
  90. // 队列执行失败
  91. format_log_error($e, 'GrouponAutoOper.fictitious');
  92. }
  93. }
  94. }