MovieCityAreaCommand.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. namespace app\command;
  3. use app\common\repositories\movie\MovieRepository;
  4. use crmeb\services\ApiResponseService;
  5. use think\console\Command;
  6. use think\console\Input;
  7. use think\console\Output;
  8. use think\facade\Db;
  9. class MovieCityAreaCommand extends Command
  10. {
  11. protected function configure()
  12. {
  13. // 指令配置
  14. $this->setName('movie-city-area')->setDescription('电影-城市列表');
  15. }
  16. protected function execute(Input $input, Output $output)
  17. {
  18. // 城市列表
  19. $this->doMovieCity();
  20. // 城区列表
  21. $this->doMovieCityArea();
  22. }
  23. /**
  24. * 电影-城市-分区列表
  25. * @return void
  26. * @throws \think\db\exception\DataNotFoundException
  27. * @throws \think\db\exception\DbException
  28. * @throws \think\db\exception\ModelNotFoundException
  29. */
  30. private function doMovieCity()
  31. {
  32. $page = 1;
  33. $limit = 100;
  34. /** @var MovieRepository $movieRepository */
  35. $movieRepository = app()->make(MovieRepository::class);
  36. $movieCityLists = $movieRepository->getMovieCity($page, $limit);
  37. if (isset($movieCityLists['code']) && ($movieCityLists['code'] == ApiResponseService::DEFAULT_SUCCESS_CODE)) {
  38. $this->createMovieCity($movieCityLists['data']['list']);
  39. $data = $movieCityLists['data'];
  40. $totalPages = $data['paging']['pages'] ?? 0;
  41. for ($index = ($page + 1); $index <= $totalPages; $index++) {
  42. $movieCityLists = $movieRepository->getMovieCity($index, $limit);
  43. if (isset($movieCityLists['code']) && ($movieCityLists['code'] == ApiResponseService::DEFAULT_SUCCESS_CODE)) {
  44. $this->createMovieCity($movieCityLists['data']['list']);
  45. }
  46. }
  47. }
  48. }
  49. /**
  50. * 电影-城市列表
  51. *
  52. * @param $list
  53. * @return void
  54. * @throws \think\db\exception\DataNotFoundException
  55. * @throws \think\db\exception\DbException
  56. * @throws \think\db\exception\ModelNotFoundException
  57. */
  58. private function createMovieCity($list)
  59. {
  60. $city_signList = array_column($list, 'city_sign');
  61. $localCityLists = Db::name('movie_city')->whereIn('city_sign', $city_signList)->field('id,city_sign,city_name')->select();
  62. $localCityLists = !empty($localCityLists) ? array_reduce($localCityLists->toArray(), function ($carry, $item) {
  63. $carry[$item['city_sign']] = ['id' => $item['id'], 'city_sign' => $item['city_sign'], 'city_name' => $item['city_name']];
  64. return $carry;
  65. }, []) : [];
  66. foreach ($list as $key => $value) {
  67. $params = [
  68. 'city_sign' => $value['city_sign'],
  69. 'city_name' => $value['city_name'],
  70. 'initial' => $value['initial'],
  71. ];
  72. if (!isset($localCityLists[$value['city_sign']])) {
  73. $params['create_time'] = time();
  74. Db::name('movie_city')->insert($params);
  75. } else {
  76. if (md5($value['city_sign'] . $value['city_name']) != md5($localCityLists[$value['city_sign']]['city_name'])) {
  77. $params['update_time'] = time();
  78. Db::name('movie_city')->where('id', $localCityLists[$value['city_sign']]['id'])->update($params);
  79. }
  80. }
  81. }
  82. }
  83. /**
  84. * 电影-城市分区列表
  85. *
  86. * @return void
  87. * @throws \think\db\exception\DataNotFoundException
  88. * @throws \think\db\exception\DbException
  89. * @throws \think\db\exception\ModelNotFoundException
  90. */
  91. private function doMovieCityArea()
  92. {
  93. /** @var MovieRepository $movieRepository */
  94. $movieRepository = app()->make(MovieRepository::class);
  95. $localCityLists = Db::name('movie_city')->field('id,city_sign,city_name')->select();
  96. foreach ($localCityLists as $key => $value) {
  97. $movieAreaLists = $movieRepository->getMovieArea($value['city_sign']);
  98. if (isset($movieAreaLists['code']) && ($movieAreaLists['code'] == ApiResponseService::DEFAULT_SUCCESS_CODE) && !empty($movieAreaLists['data']['list'])) {
  99. foreach ($movieAreaLists['data']['list'] as $maKey => $maValue) {
  100. $params = [
  101. 'parent_id' => $value['id'],
  102. 'city_sign' => $value['city_sign'],
  103. 'city_name' => $value['city_name'],
  104. 'area_code' => $maValue['area_code'],
  105. 'area_name' => $maValue['area_name']
  106. ];
  107. $city_area = Db::name('movie_city_area')->where(['parent_id' => $value['id'], 'city_sign' => $value['city_sign'], 'area_code' => $maValue['area_code']])->find();
  108. if (empty($city_area)) {
  109. $params['create_time'] = time();
  110. Db::name('movie_city_area')->insert($params);
  111. } else {
  112. if (md5($maValue['area_code'] . $maValue['area_name']) != md5($city_area['area_code'] . $city_area['area_name'])) {
  113. $params['update_time'] = time();
  114. Db::name('movie_city_area')->where('id', $city_area['id'])->update($params);
  115. }
  116. }
  117. }
  118. sleep(1);
  119. }
  120. }
  121. }
  122. }