海南旅游SAAS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.8 KiB

  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\AgentProduct;
  4. use App\Models\AgentProductSpec;
  5. use App\Models\ProductSpec;
  6. use Illuminate\Bus\Queueable;
  7. use Illuminate\Contracts\Queue\ShouldBeUnique;
  8. use Illuminate\Contracts\Queue\ShouldQueue;
  9. use Illuminate\Foundation\Bus\Dispatchable;
  10. use Illuminate\Queue\InteractsWithQueue;
  11. use Illuminate\Queue\SerializesModels;
  12. class ProductSpecSync implements ShouldQueue
  13. {
  14. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  15. /**
  16. * 任务可尝试的次数
  17. * @var int
  18. */
  19. public $tries = 3;
  20. /**
  21. * 任务失败前允许的最大异常数
  22. * @var int
  23. */
  24. public $maxExceptions = 3;
  25. /**
  26. * Create a new job instance.
  27. *
  28. * @return void
  29. */
  30. public function __construct(private int $product_id)
  31. {
  32. //
  33. }
  34. /**
  35. * Execute the job.
  36. *
  37. * @return void
  38. */
  39. public function handle()
  40. {
  41. //获取当前供应商产品的所有规格
  42. $product_specs = ProductSpec::where('product_id', $this->product_id)->get();
  43. //获取当前供应商产品的所有代理商产品ID
  44. AgentProduct::query()
  45. ->where('product_id', $this->product_id)
  46. ->chunk(5, function ($agent_products) use ($product_specs) {
  47. //当前供应商产品所有规格的ID
  48. $product_spec_ids = $product_specs->pluck('id')->toArray();
  49. //删除供应商已经删除的规格
  50. AgentProductSpec::query()
  51. ->whereIn('agent_product_id', $agent_products->pluck('id')->toArray())
  52. ->whereNotIn('product_spec_id', $product_spec_ids)
  53. ->delete();
  54. //将代理商规格中销售价小于供应商销售价的,将代理商的销售价设置为供应商的销售价
  55. foreach ($product_specs as $spec) {
  56. AgentProductSpec::query()
  57. ->where([['product_spec_id', '=', $spec->id], ['price', '<', $spec->price]])
  58. ->update(['price' => $spec->price]);
  59. }
  60. //供应商新增,但代理商还没有的规格,同步给代理商
  61. foreach ($agent_products as $ap) {
  62. //代理商已有的规格(如果代理商删除过的规格不再同步过来,这里加上withTrashed即可)
  63. $ap_spec_ids = AgentProductSpec::where('agent_product_id', $ap->id)->pluck('product_spec_id')->toArray();
  64. //代理商没有的规格
  65. $agent_no_spec_ids = array_diff($product_spec_ids, $ap_spec_ids);
  66. AgentProductSpec::query()
  67. ->insert(
  68. array_map(function ($v) use ($ap, $product_specs) {
  69. $product_spec = $product_specs->find($v);
  70. return [
  71. 'agent_product_id' => $ap->id,
  72. 'product_spec_id' => $v,
  73. 'name' => '',
  74. 'date' => null,
  75. 'stock' => $product_spec->stock,
  76. 'original_price' => $product_spec->original_price,
  77. 'price' => $product_spec->price,
  78. ];
  79. }, $agent_no_spec_ids)
  80. );
  81. }
  82. });
  83. }
  84. }