1
0

DistributeLeafletsService.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. namespace app\adminapi\service;
  3. use app\common\model\master_worker\MasterWorker;
  4. use app\common\model\master_worker\MasterWorkerRule;
  5. use DateInterval;
  6. use DateTime;
  7. /**
  8. * 分销leaflets服务
  9. */
  10. class DistributeLeafletsService
  11. {
  12. public static function locationIds($lon, $lat,$resType=0,$ids = [])
  13. {
  14. $where = [];
  15. if(!empty($ids)) $where[] = ['id','IN',$ids];
  16. // 查出所有的师傅 -> 计算距离 -> 按距离排序 -> 分页
  17. $allList = MasterWorker::where($where)->select()->toArray();
  18. if(!empty($lon) && !empty($lat)){
  19. $mastersDistances = self::mastersDistance($allList,$lon,$lat);
  20. }else{
  21. $mastersDistances = array_column($allList, 'distance','id');
  22. }
  23. // id => distance
  24. if(empty($resType))
  25. return $mastersDistances;
  26. else
  27. return array_keys($mastersDistances);
  28. }
  29. public static function goodsCategoryIds($goods_category_id)
  30. {
  31. if($goods_category_id){
  32. return MasterWorker::whereFindInSet('category_ids',$goods_category_id)->column('id');
  33. }else{
  34. return MasterWorker::column('id');
  35. }
  36. }
  37. public static function protectionPeriodIds()
  38. {
  39. $ruleInfo = MasterWorkerRule::where('id',1)->findOrEmpty()->toArray();
  40. //$ruleInfo['description']
  41. $createTime = time() - (86400 * ($ruleInfo['description']??0));
  42. return MasterWorker::where([
  43. ['create_time','>=',$createTime],
  44. ['is_disable','=',0],
  45. ['work_status','=',0]
  46. ])->column('id');
  47. }
  48. public static function availableAmountIds()
  49. {
  50. $protectionRuleInfo = MasterWorkerRule::where('id',1)->findOrEmpty()->toArray();
  51. $ruleInfo = MasterWorkerRule::where('id',2)->findOrEmpty()->toArray();
  52. //$protectionRuleInfo['description']
  53. //$ruleInfo['description']
  54. $createTime = time() - (86400 * ($protectionRuleInfo['description']??0));
  55. return MasterWorker::where([
  56. ['create_time','<',$createTime],
  57. ['earnest_money_usable','>=',(float)$ruleInfo['description']??0],
  58. ['is_disable','=',0],
  59. ['work_status','=',0]
  60. ])->column('id');
  61. }
  62. public static function getIntersection($lon, $lat,$goods_category_id)
  63. {
  64. //self::protectionPeriodIds();
  65. //self::availableAmountIds();
  66. $mergeIds = array_merge(self::protectionPeriodIds(),self::availableAmountIds());
  67. //self::locationIds($lon, $lat,1);
  68. //self::goodsCategoryIds($goods_category_id);
  69. $intersectIds = array_intersect(self::locationIds($lon, $lat,1),self::goodsCategoryIds($goods_category_id));
  70. $result=array_intersect($mergeIds,$intersectIds);
  71. return array_values($result);
  72. }
  73. private static function mastersDistance($masters,$customer_lon,$customer_lat,$radius = 0)
  74. {
  75. $masters = array_column($masters, null, 'id');
  76. $nearbyMasters = [];
  77. foreach ($masters as $master) {
  78. $distance = self::haversineDistance($customer_lat, $customer_lon, $master['lat'], $master['lon']);
  79. if ($radius>0) { // 距离小于或等于10公里
  80. ($distance <= $radius) && $nearbyMasters[$master['id']] = $distance;
  81. }else{
  82. $nearbyMasters[$master['id']] = $distance;
  83. }
  84. }
  85. asort($nearbyMasters);
  86. return $nearbyMasters;
  87. }
  88. private static function haversineDistance($lat1, $lon1, $lat2, $lon2) {
  89. $lat1 = deg2rad($lat1);
  90. $lon1 = deg2rad($lon1);
  91. $lat2 = deg2rad($lat2);
  92. $lon2 = deg2rad($lon2);
  93. $dlon = $lon2 - $lon1;
  94. $dlat = $lat2 - $lat1;
  95. $a = sin($dlat / 2)**2 + cos($lat1) * cos($lat2) * sin($dlon / 2)**2;
  96. $c = 2 * asin(sqrt($a));
  97. $r = 6371; // 地球平均半径,单位为公里
  98. $distance = $c * $r;
  99. return $distance;
  100. }
  101. }