Eyemargin.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?php
  2. namespace app\common\model;
  3. use think\Model;
  4. /**
  5. * 模型
  6. */
  7. class Eyemargin extends Model
  8. {
  9. // 定义时间戳字段名
  10. protected $createTime = 'createtime';
  11. /**
  12. * 获取携带标签的列表
  13. */
  14. public static function getDistanceList($user_lng,$user_lat,$field,$where,$user_id) {
  15. $results = \app\common\model\Eyemargin::alias("a")
  16. ->field($field)
  17. ->join("hx_user u","a.user_id = u.id")
  18. ->where($where)
  19. ->order("a.weight desc,a.createtime desc")
  20. ->select();
  21. if($results) foreach($results as $k => $v) {
  22. // 计算距离
  23. $results[$k]['distance'] = self::getDistance($v['lng'],$v['lat'],$user_lng,$user_lat);
  24. // $results[$k]['distance_txt'] = $results[$k]['distance'] > 15 ? $v['city_name'].'·'.$v['district_name']:"距离:".$results[$k]['distance'].'km';
  25. $results[$k]['distance_txt'] = self::getDistanceTxt($v['lng'],$v['lat'],$user_lng,$user_lat,$v['city_name'],$v['district_name']);
  26. $results[$k]['right_info'] = self::getIsView($v['user_id'],$user_id);
  27. $v['cover'] || $results[$k]['cover'] = $_SERVER["REQUEST_SCHEME"]."://".$_SERVER["HTTP_HOST"].'/assets/img/video_cover.jpeg';
  28. $results[$k]['file_name'] = $v['eye_type'] == 1 ? self::getFileUniq($v['video']) : "";
  29. }
  30. $distance = array_column($results,'distance');
  31. array_multisort($distance,SORT_ASC,$results);
  32. // 距离筛选
  33. return $results;
  34. }
  35. /**
  36. * 获取视频唯一识别码
  37. */
  38. public static function getFileUniq($file) {
  39. if(!$file) return false;
  40. $file_arr = explode('/',$file);
  41. end($file_arr);
  42. $file_name = $file_arr[key($file_arr)];
  43. $file_name_arr = explode(".",$file_name);
  44. if(!isset($file_name_arr[0])) return false;
  45. return $file_name_arr[0];
  46. }
  47. /**
  48. * 计算两点地理坐标之间的距离描述
  49. */
  50. public static function getDistanceTxt($longitude1, $latitude1, $longitude2, $latitude2,$city_name,$district_name){
  51. $distance = self::getDistance($longitude1, $latitude1, $longitude2, $latitude2, 1, 0);
  52. if($distance >= 15000) {
  53. $txt = -1;
  54. } elseif($distance >= 1000) {
  55. $distance = $distance / 1000;
  56. $txt = '距离:'.$distance."km";
  57. } else {
  58. $txt = '距离:'.$distance."米";
  59. }
  60. $txt = $txt == -1 ? $city_name.'·'.$district_name:$txt;
  61. return $txt;
  62. }
  63. /**
  64. * 获取是否眼缘/关注量/邀请
  65. */
  66. public static function getIsView($fate_user_id,$user_id) {
  67. $res = [];
  68. // 获取当前用户被关注数量
  69. $res['like_count'] = \app\common\model\UserLike::where(["user_id"=>$fate_user_id])->count();
  70. // 获取是否已有眼缘
  71. $is_fate = \app\common\model\UserFate::where(["user_id"=>$user_id,"fate_user_id"=>$fate_user_id])->find();
  72. $res['is_fate'] = $is_fate?1:0;
  73. // 获取是否关注
  74. $is_like = \app\common\model\UserLike::where(["fans_id"=>$user_id,"user_id"=>$fate_user_id])->find();
  75. $res['is_like'] = $is_like?1:0;
  76. // 获取是否显示分享
  77. $res['is_share'] = config("site.invite")?1:0;
  78. return $res;
  79. }
  80. /**
  81. * 计算两点地理坐标之间的距离
  82. * @param Decimal $longitude1 起点经度
  83. * @param Decimal $latitude1 起点纬度
  84. * @param Decimal $longitude2 终点经度
  85. * @param Decimal $latitude2 终点纬度
  86. * @param Int $unit 单位 1:米 2:公里
  87. * @param Int $decimal 精度 保留小数位数
  88. * @return Decimal
  89. */
  90. public static function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=1){
  91. if(!$longitude1 || !$latitude1 || !$longitude2 || !$latitude2) return 1000000;
  92. if($longitude1 <= 0 || $latitude1 <= 0 || $longitude2 <= 0 || $latitude2 <= 0) return 1000000;
  93. $EARTH_RADIUS = 6370.996; // 地球半径系数
  94. $PI = 3.1415926;
  95. $radLat1 = $latitude1 * $PI / 180.0;
  96. $radLat2 = $latitude2 * $PI / 180.0;
  97. $radLng1 = $longitude1 * $PI / 180.0;
  98. $radLng2 = $longitude2 * $PI /180.0;
  99. $a = $radLat1 - $radLat2;
  100. $b = $radLng1 - $radLng2;
  101. $distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
  102. $distance = $distance * $EARTH_RADIUS * 1000;
  103. if($unit==2){
  104. $distance = $distance / 1000;
  105. }
  106. return round($distance, $decimal);
  107. }
  108. /**
  109. * 三数组合并
  110. */
  111. public static function arrayMerge($b,$c,$d) {
  112. $bcd = [];
  113. if($b && $c && $d){
  114. $eb = array_merge($b,$c);
  115. $bcd = array_merge($eb,$d);
  116. } elseif($b && $c) {
  117. $bcd = array_merge($b,$c);
  118. } elseif($b && $d) {
  119. $bcd = array_merge($b,$d);
  120. } elseif($c && $d) {
  121. $bcd = array_merge($c,$d);
  122. } else {
  123. if($b) {
  124. $bcd = $b;
  125. }
  126. if($c) {
  127. $bcd = $c;
  128. }
  129. if($d) {
  130. $bcd = $d;
  131. }
  132. }
  133. return self::second_array_unique_bykey($bcd,'id');
  134. }
  135. /**
  136. * 二维数组去重复
  137. * @param $arr
  138. * @param $key
  139. * @return mixed
  140. */
  141. public static function second_array_unique_bykey($arr, $key) {
  142. $tmp_arr = array();
  143. foreach ($arr as $k => $v) {
  144. if (in_array($v[$key], $tmp_arr)) { //搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true
  145. unset($arr[$k]); //销毁一个变量 如果$tmp_arr中已存在相同的值就删除该值
  146. } else {
  147. $tmp_arr[$k] = $v[$key]; //将不同的值放在该数组中保存
  148. }
  149. }
  150. return array_values($arr);
  151. }
  152. }