Spot.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. class Spot extends Controller
  10. {
  11. /**
  12. * 采集博物馆列表数据
  13. * @author 唐远望
  14. * @version 1.0
  15. * @date 2026-04-02
  16. */
  17. public function collect_data(SpotTmpModel $SpotTmpModel)
  18. {
  19. $MuseumServer = new MuseumServer();
  20. $page_data = $MuseumServer->getMuseumPageData();
  21. $pages = $page_data['pages'];
  22. if ($pages > 0) {
  23. for ($page = 1; $page < $pages; $page++) {
  24. //查询是否存在第一页数据
  25. $page_data = $SpotTmpModel->where(['page' => $page])->first();
  26. if ($page_data) {
  27. $museum_list = json_decode($page_data->data, true);
  28. $this->add_museum($museum_list);
  29. continue;
  30. }
  31. $list_data = $MuseumServer->getMuseumList($page);
  32. $list = isset($list_data['rows']['records']) ? $list_data['rows']['records'] : '';
  33. if (!$list) continue;
  34. $SpotTmpModel->insert(['page' => $page, 'data' => json_encode($list)]);
  35. }
  36. }
  37. // 加载模板
  38. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => '']);
  39. }
  40. /**
  41. * 添加博物馆数据到数据库
  42. * @author 唐远望
  43. * @version 1.0
  44. * @date 2026-04-02
  45. */
  46. public function add_museum($list)
  47. {
  48. $SpotModel = new SpotModel();
  49. $museum_type_config = [
  50. '文化文物系统国有博物馆' => '1',
  51. '其他行业国有博物馆' => '2',
  52. '非国有博物馆' => '3',
  53. ];
  54. foreach ($list as $key => $value) {
  55. $insert_data['museum_type_id'] = isset($museum_type_config[$value['NB_BWGXZ_NAME']]) ? $museum_type_config[$value['NB_BWGXZ_NAME']] : '0';
  56. $insert_data['museum_level'] = isset($value['NB_ZLDJ_NAME']) ? $value['NB_ZLDJ_NAME'] : '';
  57. $insert_data['is_open'] = '0';
  58. $insert_data['name'] = isset($value['NB_BWGMC']) ? $value['NB_BWGMC'] : '';
  59. $insert_data['intro'] = isset($value['NB_BWGJJ']) ? $value['NB_BWGJJ'] : '';
  60. $insert_data['province_name'] = isset($value['NB_S_NAME']) ? $value['NB_S_NAME'] : '';
  61. $insert_data['city_name'] = isset($value['NB_X_NAME']) ? $value['NB_X_NAME'] : '';
  62. $insert_data['district_name'] = '';
  63. $insert_data['insert_time'] = time();
  64. //查询是否存在博物馆
  65. $museum_info = $SpotModel->where(['name' => $insert_data['name'], 'province_name' => $insert_data['province_name']])->first();
  66. if (!$museum_info) {
  67. $SpotModel->insert($insert_data);
  68. }
  69. }
  70. }
  71. /**
  72. * 获取附近博物馆列表数据
  73. * @author 唐远望
  74. * @version 1.0
  75. * @date 2026-04-02
  76. */
  77. public function nearby_list(Request $request, SpotModel $SpotModel)
  78. {
  79. $longitude = $request->input('longitude', '');
  80. $latitude = $request->input('latitude', '');
  81. $page = $request->input('page', 1);
  82. $limit = $request->input('limit', 10);
  83. $query = $SpotModel->query()->where('status', 0);
  84. $field = ['id', 'name', 'museum_type_id', 'museum_level', 'is_open', 'intro', 'longitude', 'latitude', 'province_name', 'city_name', 'district_name'];
  85. $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')"];
  86. if (is_numeric($longitude) && $longitude > 0 && is_numeric($latitude) && $latitude > 0) {
  87. $field = array_merge($field, $latlot_feild);
  88. $query->select($field)->orderBy('distance', 'asc');
  89. } else {
  90. $query->select($field);
  91. }
  92. $data = $query->paginate($limit, ['*'], 'page', $page);
  93. if (!empty($data['data'])) {
  94. foreach ($$data['data'] as $key => $value) {
  95. $data['data'][$key]['distance'] = isset($value['distance']) ? $value['distance'] : '0';
  96. }
  97. }
  98. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $data]);
  99. }
  100. }