Spot.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. <?php
  2. namespace App\Http\Controllers\Api\Museum;
  3. use App\Http\Controllers\Api\Api;
  4. use Illuminate\Support\Facades\DB;
  5. use App\Servers\Wenlv\MuseumServer;
  6. use App\Models\Api\Museum\Spot as SpotModel;
  7. use App\Models\Api\Museum\SpotTmp as SpotTmpModel;
  8. use App\Models\Manager\Citys as CitysModel;
  9. use App\Servers\Tenxunyun\TextTranslate;
  10. use App\Models\Api\Museum\SpotLikes as SpotLikesModel;
  11. use App\Models\Api\Museum\SpotHates as SpotHatesModel;
  12. use App\Http\Requests\Api\Museum\Spot as Request;
  13. use League\CommonMark\Extension\Embed\EmbedParser;
  14. /**
  15. * 博物馆数据接口
  16. * @author 唐远望
  17. * @version 1.0
  18. * @date 2026-04-02
  19. */
  20. class Spot extends Api
  21. {
  22. /**
  23. * 采集博物馆列表数据
  24. * @author 唐远望
  25. * @version 1.0
  26. * @date 2026-04-02
  27. */
  28. public function collect_data(SpotTmpModel $SpotTmpModel)
  29. {
  30. $MuseumServer = new MuseumServer();
  31. $page_data = $MuseumServer->getMuseumPageData();
  32. $pages = $page_data['pages'];
  33. if ($pages > 0) {
  34. for ($page = 1; $page < $pages; $page++) {
  35. //查询是否存在第一页数据
  36. $page_data = $SpotTmpModel->where(['page' => $page])->first();
  37. if ($page_data) {
  38. $museum_list = json_decode($page_data->data, true);
  39. $this->add_museum($museum_list);
  40. continue;
  41. }
  42. $list_data = $MuseumServer->getMuseumList($page);
  43. $list = isset($list_data['rows']['records']) ? $list_data['rows']['records'] : '';
  44. if (!$list) continue;
  45. $SpotTmpModel->insert(['page' => $page, 'data' => json_encode($list)]);
  46. }
  47. }
  48. // 加载模板
  49. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => '']);
  50. }
  51. /**
  52. * 添加博物馆数据到数据库
  53. * @author 唐远望
  54. * @version 1.0
  55. * @date 2026-04-02
  56. */
  57. public function add_museum($list)
  58. {
  59. $SpotModel = new SpotModel();
  60. $CitysModel = new CitysModel();
  61. $museum_type_config = [
  62. '文化文物系统国有博物馆' => '1',
  63. '其他行业国有博物馆' => '2',
  64. '非国有博物馆' => '3',
  65. ];
  66. foreach ($list as $key => $value) {
  67. $province_name = isset($value['NB_S_NAME']) ? $value['NB_S_NAME'] : '';
  68. $city_name = isset($value['NB_SS_NAME']) ? $value['NB_SS_NAME'] : '';
  69. $district_name = isset($value['NB_X_NAME']) ? $value['NB_X_NAME'] : '';
  70. //特殊地区1级移除市
  71. if ($province_name && in_array($province_name, ['北京市', '天津市', '上海市', '重庆市'])) {
  72. //移除市这个字符
  73. $province_name = trim(str_replace('市', '', $province_name));
  74. } else if ($province_name && in_array($province_name, ['北京', '天津', '上海', '重庆'])) {
  75. } else if ($province_name && in_array($province_name, ['内蒙古', '广西', '西藏', '新疆', '宁夏'])) {
  76. switch ($province_name) {
  77. case '内蒙古':
  78. $province_name = '内蒙古自治区';
  79. break;
  80. case '广西':
  81. $province_name = '广西壮族自治区';
  82. break;
  83. case '西藏':
  84. $province_name = '西藏自治区';
  85. break;
  86. case '新疆':
  87. $province_name = '新疆维吾尔自治区';
  88. break;
  89. case '宁夏':
  90. $province_name = '宁夏回族自治区';
  91. break;
  92. }
  93. } else if ($province_name && in_array($province_name, ['内蒙古自治区', '广西壮族自治区', '西藏自治区', '新疆维吾尔自治区', '宁夏回族自治区'])) {
  94. } else if (strpos($province_name, '省') === false) {
  95. //是否存在市省,如果不存在则补全
  96. if (strpos($province_name, '省') === false) {
  97. $province_name = $province_name . '省';
  98. }
  99. }
  100. $province_id = '0';
  101. if ($province_name != '') {
  102. $province_info = $CitysModel->where([['name', 'like', "%$province_name%"], ['level', '=', '1']])->first();
  103. $province_id = $province_info ? $province_info->id : '0';
  104. }
  105. $city_id = '0';
  106. if ($city_name != '') {
  107. $city_info = $CitysModel->where([['name', 'like', "%$city_name%"], ['level', '=', '2']])->first();
  108. $city_name = $city_info ? $city_info->name : '';
  109. $city_id = $city_info ? $city_info->id : '0';
  110. }
  111. $district_id = '0';
  112. if ($district_name) {
  113. $district_info = $CitysModel->where([['name', 'like', "%$district_name%"], ['level', '=', '3']])->first();
  114. $district_name = $district_info ? $district_info->name : '';
  115. $district_id = $district_info ? $district_info->id : '0';
  116. }
  117. $insert_data['museum_type_id'] = isset($museum_type_config[$value['NB_BWGXZ_NAME']]) ? $museum_type_config[$value['NB_BWGXZ_NAME']] : '0';
  118. $insert_data['museum_level'] = isset($value['NB_ZLDJ_NAME']) ? $value['NB_ZLDJ_NAME'] : '';
  119. $insert_data['is_open'] = '0';
  120. $insert_data['name'] = isset($value['NB_BWGMC']) ? $value['NB_BWGMC'] : '';
  121. $insert_data['intro'] = isset($value['NB_BWGJJ']) ? trim($value['NB_BWGJJ']) : '';
  122. $insert_data['province_name'] = $province_name;
  123. $insert_data['province_id'] = $province_id;
  124. $insert_data['city_name'] = $city_name;
  125. $insert_data['city_id'] = $city_id;
  126. $insert_data['district_name'] = $district_name;
  127. $insert_data['district_id'] = $district_id;
  128. $insert_data['district_name'] = '';
  129. $insert_data['insert_time'] = time();
  130. //查询是否存在博物馆
  131. $museum_info = $SpotModel->where(['name' => $insert_data['name'], 'province_name' => $insert_data['province_name']])->first();
  132. if (!$museum_info) {
  133. $SpotModel->insert($insert_data);
  134. }
  135. }
  136. }
  137. /**
  138. * 获取附近博物馆列表数据
  139. * @author 唐远望
  140. * @version 1.0
  141. * @date 2026-04-02
  142. */
  143. public function nearby_list(Request $request, SpotModel $SpotModel, TextTranslate $TextTranslate)
  144. {
  145. $longitude = $request->input('longitude', '');
  146. $latitude = $request->input('latitude', '');
  147. $page = $request->input('page', 1);
  148. $limit = $request->input('limit', 10);
  149. $query = $SpotModel->query()->where('status', 0);
  150. $field = ['id', 'name', 'museum_type_id', 'museum_level', 'is_open', 'intro', 'longitude', 'latitude', 'province_name', 'city_name', 'district_name'];
  151. $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')"];
  152. if (is_numeric($longitude) && $longitude > 0 && is_numeric($latitude) && $latitude > 0) {
  153. $field = array_merge($field, $latlot_feild);
  154. $query->select($field)->orderBy('distance', 'asc');
  155. } else {
  156. $query->select($field);
  157. }
  158. $data = $query->paginate($limit, ['*'], 'page', $page);
  159. if (!empty($data['data'])) {
  160. foreach ($$data['data'] as $key => $value) {
  161. $data['data'][$key]['distance'] = isset($value['distance']) ? $value['distance'] : '0';
  162. }
  163. }
  164. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $data]);
  165. }
  166. /**
  167. * 翻译博物馆数据
  168. * @author 唐远望
  169. * @version 1.0
  170. * @date 2025-12-04
  171. * @param Request $request
  172. */
  173. public function translate(SpotModel $SpotModel, TextTranslate $TextTranslate)
  174. {
  175. $result = $SpotModel->where([['status', '=', 0], ['level', '<', 3]])->get()->toarray();
  176. if (!empty($result)) {
  177. foreach ($result as $key => $value) {
  178. //增加睡眠时间,防止请求过快被腾讯云接口拒绝
  179. usleep(1000);
  180. $result = $TextTranslate->translateText($value['name'], 'zh', 'en');
  181. if ($result['success']) {
  182. $target_text = $result['target_text'] ?? '';
  183. //更新本地数据为英文
  184. $SpotModel->where(['id' => $value['id']])->update(['name' => $target_text]);
  185. }
  186. }
  187. return json_send(['code' => 'success', 'msg' => '获取成功', 'data' => $result]);
  188. }
  189. }
  190. /**
  191. * 博物馆点赞
  192. * @author 唐远望
  193. * @version 1.0
  194. * @date 2026-04-09
  195. */
  196. public function set_like(Request $request, SpotModel $SpotModel, SpotLikesModel $SpotLikesModel)
  197. {
  198. // 验证参数
  199. $request->scene('set_like')->validate();
  200. $user_info = $this->checkLogin();
  201. $uid = $user_info['uid'];
  202. // 接收数据
  203. $id = request('id', 0);
  204. $museum_spot = $SpotModel->where('id', $id)->first();
  205. if (!$museum_spot) {
  206. return json_send(['code' => 'error', 'msg' => '记录不存在']);
  207. }
  208. //查询点赞记录
  209. $like_log = $SpotLikesModel->where('museum_spot_id', $id)->where('userid', $uid)->first();
  210. if (!empty($like_log)) {
  211. return json_send(['code' => 'success', 'msg' => '操作成功']);
  212. }
  213. DB::beginTransaction();
  214. try {
  215. //添加点赞记录
  216. $insert_data = [
  217. 'museum_spot_id' => $id,
  218. 'userid' => $uid,
  219. 'insert_time' => time(),
  220. ];
  221. $like_id = $SpotLikesModel->insertGetId($insert_data);
  222. //更新博物馆点赞数量
  223. $SpotModel->where('id', $id)->increment('like_count');
  224. DB::commit();
  225. return json_send(['code' => 'success', 'msg' => '操作成功']);
  226. // 成功处理...
  227. } catch (\Exception $e) {
  228. DB::rollBack();
  229. // 错误处理...
  230. return json_send(['code' => 'error', 'msg' => '操作失败', 'data' => $e->getMessage()]);
  231. }
  232. }
  233. /**
  234. * 博物馆取消点赞
  235. * @author 唐远望
  236. * @version 1.0
  237. * @date 2026-04-09
  238. */
  239. public function cancel_like(Request $request, SpotModel $SpotModel, SpotLikesModel $SpotLikesModel)
  240. {
  241. // 验证参数
  242. $request->scene('cancel_like')->validate();
  243. $user_info = $this->checkLogin();
  244. $uid = $user_info['uid'];
  245. // 接收数据
  246. $id = request('id', 0);
  247. // 执行修改
  248. $museum_spot = $SpotModel->where('id', $id)->first();
  249. if (!$museum_spot) {
  250. return json_send(['code' => 'error', 'msg' => '记录不存在']);
  251. }
  252. //查询点赞记录
  253. $like_log = $SpotLikesModel->where('museum_spot_id', $id)->where('userid', $uid)->first();
  254. if (empty($like_log)) {
  255. return json_send(['code' => 'success', 'msg' => '操作成功']);
  256. }
  257. DB::beginTransaction();
  258. try {
  259. //删除点赞记录
  260. $SpotLikesModel->where('museum_spot_id', $museum_spot->id)->where('userid', $uid)->delete();
  261. //更新博物馆点赞数量
  262. $SpotModel->where('id', $id)->decrement('like_count');
  263. DB::commit();
  264. return json_send(['code' => 'success', 'msg' => '操作成功2']);
  265. // 成功处理...
  266. } catch (\Exception $e) {
  267. DB::rollBack();
  268. // 错误处理...
  269. return json_send(['code' => 'error', 'msg' => '操作失败']);
  270. }
  271. }
  272. /**
  273. * 博物馆踩
  274. * @author 唐远望
  275. * @version 1.0
  276. * @date 2026-04-09
  277. */
  278. public function set_hate(Request $request, SpotModel $SpotModel, SpotHatesModel $SpotHatesModel)
  279. {
  280. // 验证参数
  281. $request->scene('set_hate')->validate();
  282. $user_info = $this->checkLogin();
  283. $uid = $user_info['uid'];
  284. // 接收数据
  285. $id = request('id', 0);
  286. $museum_spot = $SpotModel->where('id', $id)->first();
  287. if (!$museum_spot) {
  288. return json_send(['code' => 'error', 'msg' => '记录不存在']);
  289. }
  290. //查询点赞记录
  291. $hate_log = $SpotHatesModel->where('museum_spot_id', $id)->where('userid', $uid)->first();
  292. if (!empty($hate_log)) {
  293. return json_send(['code' => 'success', 'msg' => '操作成功']);
  294. }
  295. DB::beginTransaction();
  296. try {
  297. //添加踩记录
  298. $insert_data = [
  299. 'museum_spot_id' => $id,
  300. 'userid' => $uid,
  301. 'insert_time' => time(),
  302. ];
  303. $like_id = $SpotHatesModel->insertGetId($insert_data);
  304. //更新博物馆踩数量
  305. $SpotModel->where('id', $id)->increment('hate_count');
  306. DB::commit();
  307. return json_send(['code' => 'success', 'msg' => '操作成功']);
  308. // 成功处理...
  309. } catch (\Exception $e) {
  310. DB::rollBack();
  311. // 错误处理...
  312. return json_send(['code' => 'error', 'msg' => '操作失败']);
  313. }
  314. }
  315. /**
  316. * 博物馆取消踩
  317. * @author 唐远望
  318. * @version 1.0
  319. * @date 2026-04-09
  320. */
  321. public function cancel_hate(Request $request, SpotModel $SpotModel, SpotHatesModel $SpotHatesModel)
  322. {
  323. // 验证参数
  324. $request->scene('cancel_hate')->validate();
  325. $user_info = $this->checkLogin();
  326. $uid = $user_info['uid'];
  327. // 接收数据
  328. $id = request('id', 0);
  329. // 执行修改
  330. $museum_spot = $SpotModel->where('id', $id)->first();
  331. if (!$museum_spot) {
  332. return json_send(['code' => 'error', 'msg' => '记录不存在']);
  333. }
  334. //查询踩记录
  335. $hate_log = $SpotHatesModel->where('museum_spot_id', $id)->where('userid', $uid)->first();
  336. if (empty($hate_log)) {
  337. return json_send(['code' => 'success', 'msg' => '操作成功']);
  338. }
  339. DB::beginTransaction();
  340. try {
  341. //删除踩记录
  342. $SpotHatesModel->where('id', $hate_log->id)->delete();
  343. //更新博物馆踩数量
  344. $SpotModel->where('id', $id)->decrement('hate_count');
  345. DB::commit();
  346. return json_send(['code' => 'success', 'msg' => '操作成功']);
  347. // 成功处理...
  348. } catch (\Exception $e) {
  349. DB::rollBack();
  350. // 错误处理...
  351. return json_send(['code' => 'error', 'msg' => '操作失败']);
  352. }
  353. }
  354. }