LiveService.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. namespace addons\WechatMini\services\live;
  3. use addons\WechatMini\common\enums\live\LiveStatusEnum;
  4. use addons\WechatMini\common\models\live\GoodsMap;
  5. use addons\WechatMini\common\models\live\Live;
  6. use common\components\Service;
  7. use common\enums\StatusEnum;
  8. use common\helpers\ArrayHelper;
  9. use Yii;
  10. use yii\web\UnprocessableEntityHttpException;
  11. /**
  12. * Class LiveService
  13. * @package addons\WechatMini\services\live
  14. * @author jianyan74 <751393839@qq.com>
  15. */
  16. class LiveService extends Service
  17. {
  18. /**
  19. * @param $room_ids
  20. * @return array|\yii\db\ActiveRecord[]
  21. */
  22. public function findByCustom()
  23. {
  24. $data = Live::find()
  25. ->where(['status' => StatusEnum::ENABLED])
  26. ->andFilterWhere(['merchant_id' => $this->getMerchantId()])
  27. ->andWhere(['in', 'live_status' , [LiveStatusEnum::UNDERWAY, LiveStatusEnum::NOT_STARTED, LiveStatusEnum::END]])
  28. ->andFilterWhere(['is_recommend' => StatusEnum::ENABLED])
  29. ->asArray()
  30. ->one();
  31. if (empty($data)) {
  32. return [];
  33. }
  34. // 修改状态为直播中
  35. if (
  36. LiveStatusEnum::NOT_STARTED == $data['live_status'] &&
  37. time() >= $data['start_time'] &&
  38. time() <= $data['end_time']
  39. ) {
  40. $data['live_status'] = LiveStatusEnum::UNDERWAY;
  41. Live::updateAll(['live_status' => LiveStatusEnum::UNDERWAY], ['id' => $data['id']]);
  42. }
  43. // 修改状态为已结束
  44. if (
  45. LiveStatusEnum::UNDERWAY == $data['live_status'] &&
  46. time() > $data['end_time']
  47. ) {
  48. $data['live_status'] = LiveStatusEnum::END;
  49. Live::updateAll(['live_status' => LiveStatusEnum::END], ['id' => $data['id']]);
  50. }
  51. if (empty($data)) {
  52. if (!YII_DEBUG) {
  53. return [];
  54. }
  55. $data = new Live();
  56. $data = $data->loadDefaultValues();
  57. }
  58. return ArrayHelper::toArray($data);
  59. }
  60. /**
  61. * 同步房间
  62. *
  63. * @param $offset
  64. * @param $count
  65. * @return array|bool
  66. * @throws \EasyWeChat\Kernel\Exceptions\HttpException
  67. * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
  68. * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
  69. * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException
  70. * @throws \Psr\SimpleCache\InvalidArgumentException
  71. */
  72. public function sync($offset, $count)
  73. {
  74. $lists = Yii::$app->wechat->miniProgram->broadcast->getRooms($offset, $count);
  75. if (empty($lists)) {
  76. return true;
  77. }
  78. $total = $lists['total'];
  79. // 房间列表
  80. $roomInfo = $lists['room_info'];
  81. $goods = [];
  82. foreach ($roomInfo as $vo) {
  83. if (empty($live = $this->findRoomId($vo['roomid']))) {
  84. $live = new Live();
  85. $live = $live->loadDefaultValues();
  86. }
  87. $live->attributes = $vo;
  88. $coverImg = Yii::$app->services->extendUpload->downloadByUrl($live->cover_img);
  89. $live->cover_img = $coverImg['url'] ?? '';
  90. $shareImg = Yii::$app->services->extendUpload->downloadByUrl($live->share_img);
  91. $live->share_img = $shareImg['url'] ?? '';
  92. $feedsImg = Yii::$app->services->extendUpload->downloadByUrl($live->feeds_img);
  93. $live->feeds_img = $feedsImg['url'] ?? '';
  94. $live->share_path = Yii::$app->wechat->miniProgram->broadcast->getShareQrcode(['roomId' => $live->roomid]);
  95. // 获取推流地址
  96. if (empty($live->push_addr)) {
  97. $pushUrl = Yii::$app->wechat->miniProgram->broadcast->getPushUrl(['roomId' => $live->roomid]);
  98. $live->push_addr = $pushUrl['pushAddr'] ?? '';
  99. }
  100. $live->status = StatusEnum::ENABLED;
  101. // 已结束同步回放
  102. if ($live->live_status == LiveStatusEnum::END) {
  103. $playback = Yii::$app->wechat->miniProgram->broadcast->getPlaybacks($live->roomid, 0, 100);
  104. $live->playback = $playback['live_replay'] ?? '';
  105. }
  106. if (!$live->save()) {
  107. throw new UnprocessableEntityHttpException($this->getError($live));
  108. }
  109. $rows = [];
  110. $field = ['merchant_id', 'store_id', 'roomid', 'goods_id', 'status', 'created_at', 'updated_at'];
  111. // 插入产品
  112. foreach ($vo['goods'] as $value) {
  113. $rows[] = [
  114. 'merchant_id' => Yii::$app->services->merchant->getNotNullId(),
  115. 'store_id' => 0,
  116. 'roomid' => $live->roomid,
  117. 'goods_id' => $value['goods_id'],
  118. 'status' => StatusEnum::ENABLED,
  119. 'created_at' => time(),
  120. 'updated_at' => time()
  121. ];
  122. }
  123. // 批量插入关联
  124. !empty($rows) && Yii::$app->db->createCommand()->batchInsert(GoodsMap::tableName(), $field, $rows)->execute();
  125. $goods = array_merge($goods, $vo['goods']);
  126. }
  127. // 同步进库
  128. Yii::$app->wechatMiniService->liveGoods->syncByRoom($goods);
  129. if ($total - ($offset + $count) > 0) {
  130. return [
  131. 'offset' => ($offset + $count),
  132. 'count' => $count
  133. ];
  134. }
  135. return true;
  136. }
  137. /**
  138. * @param $room_id
  139. * @return array|\yii\db\ActiveRecord|null
  140. */
  141. public function findRoomId($room_id)
  142. {
  143. return Live::find()
  144. ->where(['roomid' => $room_id])
  145. ->andFilterWhere(['merchant_id' => $this->getMerchantId()])
  146. ->with(['goodsMap'])
  147. ->one();
  148. }
  149. /**
  150. * @param $room_ids
  151. * @return array|\yii\db\ActiveRecord[]
  152. */
  153. public function findRoomIds($room_ids)
  154. {
  155. return Live::find()
  156. ->where(['in', 'roomid', $room_ids])
  157. ->andFilterWhere(['merchant_id' => $this->getMerchantId()])
  158. ->with(['goods'])
  159. ->all();
  160. }
  161. /**
  162. * 进行中
  163. *
  164. * @return array|\yii\db\ActiveRecord|null
  165. */
  166. public function underway()
  167. {
  168. return Live::find()
  169. ->where(['status' => StatusEnum::ENABLED])
  170. ->andWhere(['in', 'live_status' , [LiveStatusEnum::UNDERWAY]])
  171. ->andFilterWhere(['merchant_id' => $this->getMerchantId()])
  172. ->one();
  173. }
  174. }
粤ICP备19079148号