Eyemargin.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. if ($v['eye_type'] == 2) {
  30. $album = explode(',', $v['album']);
  31. foreach ($album as &$vv) {
  32. $vv = $vv . config('oss.img_watermark');
  33. }
  34. $results[$k]['album'] = join('|', $album);
  35. }
  36. }
  37. $distance = array_column($results,'distance');
  38. array_multisort($distance,SORT_ASC,$results);
  39. // 距离筛选
  40. return $results;
  41. }
  42. /**
  43. * 获取视频唯一识别码
  44. */
  45. public static function getFileUniq($file) {
  46. if(!$file) return false;
  47. $file_arr = explode('/',$file);
  48. end($file_arr);
  49. $file_name = $file_arr[key($file_arr)];
  50. $file_name_arr = explode(".",$file_name);
  51. if(!isset($file_name_arr[0])) return false;
  52. return $file_name_arr[0];
  53. }
  54. /**
  55. * 计算两点地理坐标之间的距离描述
  56. */
  57. public static function getDistanceTxt($longitude1, $latitude1, $longitude2, $latitude2,$city_name,$district_name){
  58. $distance = self::getDistance($longitude1, $latitude1, $longitude2, $latitude2, 1, 0);
  59. if($distance >= 15000) {
  60. $txt = -1;
  61. } elseif($distance >= 1000) {
  62. $distance = $distance / 1000;
  63. $txt = '距离:'.$distance."km";
  64. } else {
  65. $txt = '距离:'.$distance."米";
  66. }
  67. $txt = $txt == -1 ? $city_name.'·'.$district_name:$txt;
  68. return $txt;
  69. }
  70. /**
  71. * 获取是否眼缘/关注量/邀请
  72. */
  73. public static function getIsView($fate_user_id,$user_id) {
  74. $res = [];
  75. // 获取当前用户被关注数量
  76. $res['like_count'] = \app\common\model\UserLike::where(["user_id"=>$fate_user_id])->count();
  77. // 获取是否已有眼缘
  78. $is_fate = \app\common\model\UserFate::where(["user_id"=>$user_id,"fate_user_id"=>$fate_user_id])->find();
  79. $res['is_fate'] = $is_fate?1:0;
  80. // 获取是否关注
  81. $is_like = \app\common\model\UserLike::where(["fans_id"=>$user_id,"user_id"=>$fate_user_id])->find();
  82. $res['is_like'] = $is_like?1:0;
  83. // 获取是否显示分享
  84. $res['is_share'] = config("site.invite")?1:0;
  85. return $res;
  86. }
  87. /**
  88. * 计算两点地理坐标之间的距离
  89. * @param Decimal $longitude1 起点经度
  90. * @param Decimal $latitude1 起点纬度
  91. * @param Decimal $longitude2 终点经度
  92. * @param Decimal $latitude2 终点纬度
  93. * @param Int $unit 单位 1:米 2:公里
  94. * @param Int $decimal 精度 保留小数位数
  95. * @return Decimal
  96. */
  97. public static function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=1){
  98. if(!$longitude1 || !$latitude1 || !$longitude2 || !$latitude2) return 1000000;
  99. if($longitude1 <= 0 || $latitude1 <= 0 || $longitude2 <= 0 || $latitude2 <= 0) return 1000000;
  100. $EARTH_RADIUS = 6370.996; // 地球半径系数
  101. $PI = 3.1415926;
  102. $radLat1 = $latitude1 * $PI / 180.0;
  103. $radLat2 = $latitude2 * $PI / 180.0;
  104. $radLng1 = $longitude1 * $PI / 180.0;
  105. $radLng2 = $longitude2 * $PI /180.0;
  106. $a = $radLat1 - $radLat2;
  107. $b = $radLng1 - $radLng2;
  108. $distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
  109. $distance = $distance * $EARTH_RADIUS * 1000;
  110. if($unit==2){
  111. $distance = $distance / 1000;
  112. }
  113. return round($distance, $decimal);
  114. }
  115. /**
  116. * 三数组合并
  117. */
  118. public static function arrayMerge($b,$c,$d) {
  119. $bcd = [];
  120. if($b && $c && $d){
  121. $eb = array_merge($b,$c);
  122. $bcd = array_merge($eb,$d);
  123. } elseif($b && $c) {
  124. $bcd = array_merge($b,$c);
  125. } elseif($b && $d) {
  126. $bcd = array_merge($b,$d);
  127. } elseif($c && $d) {
  128. $bcd = array_merge($c,$d);
  129. } else {
  130. if($b) {
  131. $bcd = $b;
  132. }
  133. if($c) {
  134. $bcd = $c;
  135. }
  136. if($d) {
  137. $bcd = $d;
  138. }
  139. }
  140. return self::second_array_unique_bykey($bcd,'id');
  141. }
  142. /**
  143. * 二维数组去重复
  144. * @param $arr
  145. * @param $key
  146. * @return mixed
  147. */
  148. public static function second_array_unique_bykey($arr, $key) {
  149. $tmp_arr = array();
  150. foreach ($arr as $k => $v) {
  151. if (in_array($v[$key], $tmp_arr)) { //搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true
  152. unset($arr[$k]); //销毁一个变量 如果$tmp_arr中已存在相同的值就删除该值
  153. } else {
  154. $tmp_arr[$k] = $v[$key]; //将不同的值放在该数组中保存
  155. }
  156. }
  157. return array_values($arr);
  158. }
  159. }