| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- <?php
- namespace app\adminapi\service;
- use app\common\model\master_worker\MasterWorker;
- use app\common\model\master_worker\MasterWorkerRule;
- use DateInterval;
- use DateTime;
- /**
- * 分销leaflets服务
- */
- class DistributeLeafletsService
- {
- public static function locationIds($lon, $lat,$resType=0,$ids = [])
- {
- $where = [];
- if(!empty($ids)) $where[] = ['id','IN',$ids];
- // 查出所有的师傅 -> 计算距离 -> 按距离排序 -> 分页
- $allList = MasterWorker::where($where)->select()->toArray();
- if(!empty($lon) && !empty($lat)){
- $mastersDistances = self::mastersDistance($allList,$lon,$lat);
- }else{
- $mastersDistances = array_column($allList, 'distance','id');
- }
- // id => distance
- if(empty($resType))
- return $mastersDistances;
- else
- return array_keys($mastersDistances);
- }
- public static function goodsCategoryIds($goods_category_id)
- {
- if($goods_category_id){
- return MasterWorker::whereFindInSet('category_ids',$goods_category_id)->column('id');
- }else{
- return MasterWorker::column('id');
- }
- }
- public static function protectionPeriodIds()
- {
- $ruleInfo = MasterWorkerRule::where('id',1)->findOrEmpty()->toArray();
- //$ruleInfo['description']
- $createTime = time() - (86400 * ($ruleInfo['description']??0));
- return MasterWorker::where([
- ['create_time','>=',$createTime],
- ['is_disable','=',0],
- ['work_status','=',0]
- ])->column('id');
- }
- public static function availableAmountIds()
- {
- $protectionRuleInfo = MasterWorkerRule::where('id',1)->findOrEmpty()->toArray();
- $ruleInfo = MasterWorkerRule::where('id',2)->findOrEmpty()->toArray();
- //$protectionRuleInfo['description']
- //$ruleInfo['description']
- $createTime = time() - (86400 * ($protectionRuleInfo['description']??0));
- return MasterWorker::where([
- ['create_time','<',$createTime],
- ['earnest_money_usable','>=',(float)$ruleInfo['description']??0],
- ['is_disable','=',0],
- ['work_status','=',0]
- ])->column('id');
- }
- public static function getIntersection($lon, $lat,$goods_category_id)
- {
- //self::protectionPeriodIds();
- //self::availableAmountIds();
- $mergeIds = array_merge(self::protectionPeriodIds(),self::availableAmountIds());
- //self::locationIds($lon, $lat,1);
- //self::goodsCategoryIds($goods_category_id);
- $intersectIds = array_intersect(self::locationIds($lon, $lat,1),self::goodsCategoryIds($goods_category_id));
- $result=array_intersect($mergeIds,$intersectIds);
- return array_values($result);
- }
- private static function mastersDistance($masters,$customer_lon,$customer_lat,$radius = 0)
- {
- $masters = array_column($masters, null, 'id');
- $nearbyMasters = [];
- foreach ($masters as $master) {
- $distance = self::haversineDistance($customer_lat, $customer_lon, $master['lat'], $master['lon']);
- if ($radius>0) { // 距离小于或等于10公里
- ($distance <= $radius) && $nearbyMasters[$master['id']] = $distance;
- }else{
- $nearbyMasters[$master['id']] = $distance;
- }
- }
- asort($nearbyMasters);
- return $nearbyMasters;
- }
- private static function haversineDistance($lat1, $lon1, $lat2, $lon2) {
- $lat1 = deg2rad($lat1);
- $lon1 = deg2rad($lon1);
- $lat2 = deg2rad($lat2);
- $lon2 = deg2rad($lon2);
- $dlon = $lon2 - $lon1;
- $dlat = $lat2 - $lat1;
- $a = sin($dlat / 2)**2 + cos($lat1) * cos($lat2) * sin($dlon / 2)**2;
- $c = 2 * asin(sqrt($a));
- $r = 6371; // 地球平均半径,单位为公里
- $distance = $c * $r;
- return $distance;
- }
- }
|