CinemaSchedCommand.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. namespace app\command;
  3. use app\common\model\user\User;
  4. use app\common\repositories\movie\CinemaRepository;
  5. use app\common\repositories\movie\CinemaSchedRepository;
  6. use app\common\repositories\movie\FilmRepository;
  7. use app\common\repositories\movie\MovieRepository;
  8. use crmeb\services\ApiResponseService;
  9. use think\console\Command;
  10. use think\console\Input;
  11. use think\console\Output;
  12. use think\facade\Db;
  13. class CinemaSchedCommand extends Command
  14. {
  15. private $page = 1;
  16. private $limit = 1000000;
  17. protected function configure()
  18. {
  19. // 指令配置
  20. $this->setName('cinema_film_sched')->setDescription('电影-影院场次列表');
  21. }
  22. protected function execute(Input $input, Output $output)
  23. {
  24. $date = strtotime(date('Y-m-d'));
  25. try {
  26. /** @var CinemaRepository $cinema */
  27. $cinema = app()->make(CinemaRepository::class);
  28. // 获取影院列表
  29. $result = $cinema->getLocalCinema($this->page, $this->limit, '', '', [], [], 0);
  30. $cinema_sign_list = $cinemainfo = [];
  31. foreach ($result['cinema_list'] as $subKey => $cinema) {
  32. $cinema_sign_list[] = $cinema['cinema_sign'];
  33. $cinemainfo[$cinema['cinema_sign']] = $cinema;
  34. }
  35. /** @var FilmRepository $filmRepository */
  36. $filmRepository = app()->make(FilmRepository::class);
  37. // 获取{2个月内}已上映影片列表
  38. $filmResult = $filmRepository->getFilmByStartEndDate($this->page, $this->limit, strtotime('-2 month', $date), $date);
  39. if ($filmResult && $cinema_sign_list) {
  40. foreach ($filmResult as $key => $film) {
  41. // 获取排片影院
  42. // $scheduledCinema = Db::name('movie_cinema_sched')
  43. // ->where('film_sign', $film['film_sign'])->where('show_date', '>=', $date)
  44. // ->whereIn('cinema_sign', $cinema_sign_list)
  45. // ->field('film_sign,cinema_sign')->group('cinema_sign')->select();
  46. // $diffUnscheduledCinema = !empty($scheduledCinema) ?
  47. // array_diff($cinema_sign_list, array_column($scheduledCinema->toArray(), 'cinema_sign', 'cinema_sign')) : $cinema_sign_list;
  48. // $this->batchInsertUnscheduledCinema($film, $cinemainfo, $diffUnscheduledCinema);
  49. $diffUnscheduledCinema = [];
  50. // 获取是否存在未排片影院记录 @todo 影院未排片,不请求第三方接口获取排片场次
  51. $unscheduledCinema = Db::name('movie_cinema_unsched')->where('film_sign', $film['film_sign'])->whereIn('cinema_sign', $cinema_sign_list)
  52. ->field('film_sign,cinema_sign')->select();
  53. // 从总的影院、未排片影院中取出差异数据,得到排片影院
  54. $diffScheduledCinema = !empty($unscheduledCinema) ? array_diff($cinema_sign_list, array_column($unscheduledCinema->toArray(), 'cinema_sign')) : $cinema_sign_list;
  55. // 将{影片和排片影院}调用第三方获取排片场次
  56. foreach ($diffScheduledCinema as $cinemaKey => $cinemaSignValue) {
  57. $res = $this->doCinemaSched($film, $cinemainfo[$cinemaSignValue]);
  58. if (!$res) {
  59. $diffUnscheduledCinema[] = $cinemaSignValue;
  60. }
  61. }
  62. // 未排片影院批量插入
  63. if ($diffUnscheduledCinema) $this->batchInsertUnscheduledCinema($film, $cinemainfo, $diffUnscheduledCinema);
  64. }
  65. }
  66. } catch (\Exception $exception) {
  67. var_dump($exception->getMessage(), $exception->getFile(), $exception->getLine());
  68. }
  69. }
  70. /**
  71. * 批量插入未排片影院
  72. *
  73. * @param $film
  74. * @param $cinemainfo
  75. * @param $diffUnscheduledCinema
  76. * @return void
  77. */
  78. private function batchInsertUnscheduledCinema($film, $cinemainfo, $diffUnscheduledCinema)
  79. {
  80. $data = [];
  81. foreach ($diffUnscheduledCinema as $key => $value) {
  82. $data[] = [
  83. 'film_sign' => $film['film_sign'],
  84. 'film_name' => $film['film_name'],
  85. 'cinema_sign' => $cinemainfo[$value]['cinema_sign'],
  86. 'cinema_name' => $cinemainfo[$value]['cinema_name'],
  87. 'create_time' => time()
  88. ];
  89. }
  90. if ($data) Db::name('movie_cinema_unsched')->insertAll($data);
  91. }
  92. /**
  93. * 电影-获取影院场次列表
  94. *
  95. * @param $film
  96. * @param $cinema
  97. * @return array|mixed|string
  98. * @throws \think\db\exception\DbException
  99. */
  100. private function doCinemaSched($film, $cinema)
  101. {
  102. /** @var MovieRepository $cinema_filmRepository */
  103. $cinema_filmRepository = app()->make(MovieRepository::class);
  104. // 获取排片场次
  105. $cinema_sched = $cinema_filmRepository->getCinemaSched($film['film_sign'], $cinema['cinema_sign']);
  106. if (!empty($cinema_sched)) {
  107. // 写入排片场次数据
  108. $this->createCinemaSched($cinema_sched, $cinema);
  109. }
  110. return $cinema_sched;
  111. }
  112. /**
  113. * 写入排片场次数据
  114. *
  115. * @param $list
  116. * @param $cinema
  117. * @return void
  118. * @throws \think\db\exception\DbException
  119. */
  120. private function createCinemaSched($list, $cinema)
  121. {
  122. foreach ($list as $key => $sched) {
  123. foreach ($sched as $subKey => $value) {
  124. $params = [
  125. 'relation_id' => $value['relation_id'],
  126. 'sched_sign' => $value['sched_sign'],
  127. 'film_sign' => $value['film_sign'],
  128. 'film_name' => $value['film_name'],
  129. 'show_date' => strtotime(date('Y') . '-' . $value['show_date']),
  130. 'show_time' => trim($value['show_time']),
  131. 'cinema_sign' => $cinema['cinema_sign'],
  132. 'cinema_name' => $cinema['cinema_name'],
  133. 'address' => $cinema['address'],
  134. 'longitude' => $cinema['longitude'],
  135. 'latitude' => $cinema['latitude'],
  136. 'hall_sign' => $value['hall_sign'],
  137. 'hall_name' => $value['hall_name'],
  138. 'stop_sell_time' => strtotime($value['stop_sell_time']),
  139. 'price' => $value['price'], // 销售价
  140. 'cost_price' => $value['cost_price'], // 原价
  141. 'channel_price' => json_encode($value['channel_price'], JSON_FORCE_OBJECT)
  142. ];
  143. $where = [
  144. 'relation_id' => $value['relation_id'], 'sched_sign' => $value['sched_sign'], 'film_sign' => $value['film_sign'], 'cinema_sign' => $params['cinema_sign']
  145. ];
  146. $model = Db::name('movie_cinema_sched')->where($where)->find();
  147. if (empty($model)) {
  148. $params['create_time'] = time();
  149. Db::name('movie_cinema_sched')->insert($params);
  150. } else {
  151. $params['update_time'] = time();
  152. Db::name('movie_cinema_sched')->where('id', $model['id'])->update($params);
  153. }
  154. }
  155. }
  156. }
  157. }