SeckillActivityJob.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. namespace app\jobs\storeSync;
  3. use app\models\Goods;
  4. use app\models\SeckillActivity;
  5. use app\models\SeckillActivityGoods;
  6. use app\models\StoreSyncExtLog;
  7. use yii\base\BaseObject;
  8. use yii\queue\JobInterface;
  9. class SeckillActivityJob extends BaseObject implements JobInterface
  10. {
  11. public array $activity_id;
  12. public array $to_store_id;
  13. public int $from_store_id;
  14. public function execute($queue)
  15. {
  16. // TODO: Implement execute() method.
  17. $from_store_id = $this->from_store_id;
  18. $to_store_id = $this->to_store_id;
  19. $activity_id = $this->activity_id;
  20. foreach ($to_store_id as $store_id_item) {
  21. //同步活动
  22. $cacheActivity = $this->doCopySeckill($from_store_id, $store_id_item, $activity_id);
  23. //同步产品
  24. $cache = $this->doCopySeckillGoods($from_store_id, $store_id_item, $cacheActivity);
  25. }
  26. }
  27. public function doCopySeckill($from_store_id, $to_store_id, $activity_id) {
  28. try {
  29. $list = SeckillActivity::find()
  30. ->where([
  31. 'store_id' => $from_store_id,
  32. 'id' => $activity_id
  33. ])->orderBy(['id' => SORT_ASC])->all();
  34. $cache = [];
  35. foreach ($list as $value) {
  36. $id = $value['id'];
  37. $attr = $value->attributes;
  38. //判断是否为当前商城同步过此商品
  39. $storeSyncExtLog = StoreSyncExtLog::findOne([
  40. 'from_store_id' => $from_store_id,
  41. 'to_store_id' => $to_store_id,
  42. 'type' => StoreSyncExtLog::TYPE_SECKILL,
  43. 'from_id' => $id
  44. ]);
  45. unset($attr['id']);
  46. $attr['store_id'] = $to_store_id;
  47. $model = SeckillActivity::findOne($storeSyncExtLog->to_id ?? 0) ?: new SeckillActivity();
  48. $model->setAttributes($attr, false);
  49. $model->is_delete = $attr['is_delete'];
  50. $model->save();
  51. (new StoreSyncExtLog())::handleData($from_store_id, $to_store_id, $id, $model->id, StoreSyncExtLog::TYPE_SECKILL);
  52. $cache[$id] = $model->id;
  53. }
  54. return $cache;
  55. } catch(\Exception $e) {
  56. return [
  57. 'code' => 1,
  58. 'msg' => $e->getMessage()
  59. ];
  60. }
  61. }
  62. public function doCopySeckillGoods($from_store_id, $to_store_id, $cacheActivity) {
  63. try {
  64. $old_activity_id = array_keys($cacheActivity);
  65. $list = SeckillActivityGoods::find()
  66. ->where([
  67. 'store_id' => $from_store_id,
  68. 'activity_id' => $old_activity_id
  69. ])->orderBy(['id' => SORT_ASC])->all();
  70. $cache = [];
  71. foreach ($list as $value) {
  72. $id = $value['id'];
  73. $attr = $value->attributes;
  74. $storeSyncExtLog = StoreSyncExtLog::findOne([
  75. 'from_store_id' => $from_store_id,
  76. 'to_store_id' => $to_store_id,
  77. 'type' => StoreSyncExtLog::TYPE_PRODUCT,
  78. 'from_id' => $attr['goods_id']
  79. ]);
  80. if ($storeSyncExtLog && !$storeSyncExtLog->to_id) {
  81. continue;
  82. }
  83. unset($attr['id']);
  84. $attr['store_id'] = $to_store_id;
  85. $attr['activity_id'] = $cacheActivity[$attr['activity_id']];
  86. $attr['goods_id'] = $storeSyncExtLog->to_id;
  87. $attr['sale_num'] = 0;
  88. $agattr = json_decode($value['attr'], true);
  89. $goodsNew = Goods::findOne($attr['goods_id']);
  90. $gattrNew = json_decode($goodsNew['attr'], true);
  91. $agattrNew = [];
  92. foreach($agattr as $k => $item){
  93. $attrNames = array_column($item['attr_list'], 'attr_name');
  94. // var_dump($attrNames);
  95. if ($gattrNew) {
  96. foreach($gattrNew as $v){
  97. $attrNamesNew = array_column($v['attr_list'], 'attr_name');
  98. // var_dump($attrNamesNew);
  99. if($attrNames === $attrNamesNew){
  100. // var_dump('$attrNames == $attrNamesNew');
  101. $item['attr_list'] = $v['attr_list'];
  102. }
  103. }
  104. }
  105. $agattrNew[] = $item;
  106. }
  107. $attr['attr'] = json_encode($agattrNew, JSON_UNESCAPED_UNICODE);
  108. //判断是否为当前商城同步过此商品
  109. $storeSyncExtLog = StoreSyncExtLog::findOne([
  110. 'from_store_id' => $from_store_id,
  111. 'to_store_id' => $to_store_id,
  112. 'type' => StoreSyncExtLog::TYPE_SECKILL_GOODS,
  113. 'from_id' => $id
  114. ]);
  115. $model = SeckillActivityGoods::findOne($storeSyncExtLog->to_id ?? 0) ?: new SeckillActivityGoods();
  116. $model->setAttributes($attr, false);
  117. $model->is_delete = $attr['is_delete'];
  118. $model->save();
  119. $cache[$id] = $model->id;
  120. (new StoreSyncExtLog())::handleData($from_store_id, $to_store_id, $id, $model->id, StoreSyncExtLog::TYPE_SECKILL_GOODS);
  121. }
  122. return $cache;
  123. } catch(\Exception $e) {
  124. return [
  125. 'code' => 1,
  126. 'msg' => $e->getMessage()
  127. ];
  128. }
  129. }
  130. /** 同步秒杀 end */
  131. }