Spot.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. namespace App\Http\Controllers\Api\Museum;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\DB;
  6. use App\Servers\Wenlv\MuseumServer;
  7. use App\Models\Api\Museum\Spot as SpotModel;
  8. use App\Models\Api\Museum\SpotTmp as SpotTmpModel;
  9. use App\Models\Manager\Citys as CitysModel;
  10. use App\Servers\Tenxunyun\TextTranslate;
  11. class Spot extends Controller
  12. {
  13. /**
  14. * 采集博物馆列表数据
  15. * @author 唐远望
  16. * @version 1.0
  17. * @date 2026-04-02
  18. */
  19. public function collect_data(SpotTmpModel $SpotTmpModel)
  20. {
  21. $MuseumServer = new MuseumServer();
  22. $page_data = $MuseumServer->getMuseumPageData();
  23. $pages = $page_data['pages'];
  24. if ($pages > 0) {
  25. for ($page = 1; $page < $pages; $page++) {
  26. //查询是否存在第一页数据
  27. $page_data = $SpotTmpModel->where(['page' => $page])->first();
  28. if ($page_data) {
  29. $museum_list = json_decode($page_data->data, true);
  30. $this->add_museum($museum_list);
  31. continue;
  32. }
  33. $list_data = $MuseumServer->getMuseumList($page);
  34. $list = isset($list_data['rows']['records']) ? $list_data['rows']['records'] : '';
  35. if (!$list) continue;
  36. $SpotTmpModel->insert(['page' => $page, 'data' => json_encode($list)]);
  37. }
  38. }
  39. // 加载模板
  40. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => '']);
  41. }
  42. /**
  43. * 添加博物馆数据到数据库
  44. * @author 唐远望
  45. * @version 1.0
  46. * @date 2026-04-02
  47. */
  48. public function add_museum($list)
  49. {
  50. $SpotModel = new SpotModel();
  51. $CitysModel = new CitysModel();
  52. $museum_type_config = [
  53. '文化文物系统国有博物馆' => '1',
  54. '其他行业国有博物馆' => '2',
  55. '非国有博物馆' => '3',
  56. ];
  57. foreach ($list as $key => $value) {
  58. $province_name = isset($value['NB_S_NAME']) ? $value['NB_S_NAME'] : '';
  59. $city_name = isset($value['NB_SS_NAME']) ? $value['NB_SS_NAME'] : '';
  60. $district_name = isset($value['NB_X_NAME']) ? $value['NB_X_NAME'] : '';
  61. //特殊地区1级移除市
  62. if ($province_name && in_array($province_name, ['北京市', '天津市', '上海市', '重庆市'])) {
  63. //移除市这个字符
  64. $province_name = trim(str_replace('市', '', $province_name));
  65. } else if ($province_name && in_array($province_name, ['北京', '天津', '上海', '重庆'])) {
  66. } else if ($province_name && in_array($province_name, ['内蒙古', '广西', '西藏', '新疆', '宁夏'])) {
  67. switch ($province_name) {
  68. case '内蒙古':
  69. $province_name = '内蒙古自治区';
  70. break;
  71. case '广西':
  72. $province_name = '广西壮族自治区';
  73. break;
  74. case '西藏':
  75. $province_name = '西藏自治区';
  76. break;
  77. case '新疆':
  78. $province_name = '新疆维吾尔自治区';
  79. break;
  80. case '宁夏':
  81. $province_name = '宁夏回族自治区';
  82. break;
  83. }
  84. } else if ($province_name && in_array($province_name, ['内蒙古自治区', '广西壮族自治区', '西藏自治区', '新疆维吾尔自治区', '宁夏回族自治区'])) {
  85. } else if (strpos($province_name, '省') === false) {
  86. //是否存在市省,如果不存在则补全
  87. if (strpos($province_name, '省') === false) {
  88. $province_name = $province_name . '省';
  89. }
  90. }
  91. $province_id = '0';
  92. if ($province_name != '') {
  93. $province_info = $CitysModel->where([['name', 'like', "%$province_name%"], ['level', '=', '1']])->first();
  94. $province_id = $province_info ? $province_info->id : '0';
  95. }
  96. $city_id = '0';
  97. if ($city_name != '') {
  98. $city_info = $CitysModel->where([['name', 'like', "%$city_name%"], ['level', '=', '2']])->first();
  99. $city_name = $city_info ? $city_info->name : '';
  100. $city_id = $city_info ? $city_info->id : '0';
  101. }
  102. $district_id = '0';
  103. if ($district_name) {
  104. $district_info = $CitysModel->where([['name', 'like', "%$district_name%"], ['level', '=', '3']])->first();
  105. $district_name = $district_info ? $district_info->name : '';
  106. $district_id = $district_info ? $district_info->id : '0';
  107. }
  108. $insert_data['museum_type_id'] = isset($museum_type_config[$value['NB_BWGXZ_NAME']]) ? $museum_type_config[$value['NB_BWGXZ_NAME']] : '0';
  109. $insert_data['museum_level'] = isset($value['NB_ZLDJ_NAME']) ? $value['NB_ZLDJ_NAME'] : '';
  110. $insert_data['is_open'] = '0';
  111. $insert_data['name'] = isset($value['NB_BWGMC']) ? $value['NB_BWGMC'] : '';
  112. $insert_data['intro'] = isset($value['NB_BWGJJ']) ? trim($value['NB_BWGJJ']) : '';
  113. $insert_data['province_name'] = $province_name;
  114. $insert_data['province_id'] = $province_id;
  115. $insert_data['city_name'] = $city_name;
  116. $insert_data['city_id'] = $city_id;
  117. $insert_data['district_name'] = $district_name;
  118. $insert_data['district_id'] = $district_id;
  119. $insert_data['district_name'] = '';
  120. $insert_data['insert_time'] = time();
  121. //查询是否存在博物馆
  122. $museum_info = $SpotModel->where(['name' => $insert_data['name'], 'province_name' => $insert_data['province_name']])->first();
  123. if (!$museum_info) {
  124. $SpotModel->insert($insert_data);
  125. }
  126. }
  127. }
  128. /**
  129. * 获取附近博物馆列表数据
  130. * @author 唐远望
  131. * @version 1.0
  132. * @date 2026-04-02
  133. */
  134. public function nearby_list(Request $request, SpotModel $SpotModel, TextTranslate $TextTranslate)
  135. {
  136. $longitude = $request->input('longitude', '');
  137. $latitude = $request->input('latitude', '');
  138. $page = $request->input('page', 1);
  139. $limit = $request->input('limit', 10);
  140. $query = $SpotModel->query()->where('status', 0);
  141. $field = ['id', 'name', 'museum_type_id', 'museum_level', 'is_open', 'intro', 'longitude', 'latitude', 'province_name', 'city_name', 'district_name'];
  142. $latlot_feild = ["DB::raw('(6371 * ACOS(COS(RADIANS(' . $latitude . ')) * COS(RADIANS(latitude)) * COS(RADIANS(longitude) - RADIANS(' . $longitude . ')) + SIN(RADIANS(' . $latitude . ')) * SIN(RADIANS(latitude)))) AS distance')"];
  143. if (is_numeric($longitude) && $longitude > 0 && is_numeric($latitude) && $latitude > 0) {
  144. $field = array_merge($field, $latlot_feild);
  145. $query->select($field)->orderBy('distance', 'asc');
  146. } else {
  147. $query->select($field);
  148. }
  149. $data = $query->paginate($limit, ['*'], 'page', $page);
  150. if (!empty($data['data'])) {
  151. foreach ($$data['data'] as $key => $value) {
  152. $data['data'][$key]['distance'] = isset($value['distance']) ? $value['distance'] : '0';
  153. }
  154. }
  155. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $data]);
  156. }
  157. /**
  158. * 翻译博物馆数据
  159. * @author 唐远望
  160. * @version 1.0
  161. * @date 2025-12-04
  162. * @param Request $request
  163. */
  164. public function translate(SpotModel $SpotModel, TextTranslate $TextTranslate)
  165. {
  166. $result = $SpotModel->where([['status', '=', 0], ['level', '<', 3]])->get()->toarray();
  167. if (!empty($result)) {
  168. foreach ($result as $key => $value) {
  169. //增加睡眠时间,防止请求过快被腾讯云接口拒绝
  170. usleep(1000);
  171. $result = $TextTranslate->translateText($value['name'], 'zh', 'en');
  172. if ($result['success']) {
  173. $target_text = $result['target_text'] ?? '';
  174. //更新本地数据为英文
  175. $SpotModel->where(['id' => $value['id']])->update(['name' => $target_text]);
  176. }
  177. }
  178. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  179. }
  180. }
  181. }