You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.2 KiB
113 lines
3.2 KiB
<?php
|
|
|
|
|
|
namespace App\Service\v3\Implementations;
|
|
use App\Constants\v3\ErrorCode;
|
|
use App\Exception\ErrorCodeException;
|
|
use App\Model\v3\Market;
|
|
use App\Model\v3\UserAddress;
|
|
use App\Service\v3\Interfaces\LocationServiceInterface;
|
|
use App\Service\v3\Interfaces\UserAddressServiceInterface;
|
|
use Hyperf\Di\Annotation\Inject;
|
|
|
|
class UserAddressService implements UserAddressServiceInterface
|
|
{
|
|
/**
|
|
* @Inject
|
|
* @var LocationServiceInterface
|
|
*/
|
|
protected $locationService;
|
|
|
|
public function do($userAddressId,$user_id,$user_name,$address,$doorplate,$gender,$lat,$lng,$tel,$tags)
|
|
{
|
|
$userAddress = UserAddress::updateOrCreate(['id' => $userAddressId],
|
|
[
|
|
'user_id' => $user_id,
|
|
'user_name' => $user_name,
|
|
'address' => $address,
|
|
'doorplate' => $doorplate,
|
|
'gender' => $gender,
|
|
'lat' => $lat,
|
|
'lng' => $lng,
|
|
'tel' => $tel,
|
|
'tags' => $tags
|
|
]);
|
|
return $userAddress;
|
|
}
|
|
|
|
public function check()
|
|
{
|
|
|
|
}
|
|
|
|
public function undo($userAddressId)
|
|
{
|
|
return UserAddress::destroy($userAddressId);
|
|
}
|
|
|
|
public function setDefault($userId,$userAddressId)
|
|
{
|
|
UserAddress::query()->where([
|
|
['user_id','=',$userId],
|
|
['is_default','=',1],
|
|
])->decrement('is_default');
|
|
$userAddress = UserAddress::query()->find($userAddressId);
|
|
$userAddress->is_default = 1;
|
|
return $userAddress->save();
|
|
}
|
|
|
|
public function get($userAddressId)
|
|
{
|
|
return UserAddress::query()->find($userAddressId);
|
|
}
|
|
|
|
public function getList($userId)
|
|
{
|
|
return UserAddress::query()->where('user_id',$userId)->get();
|
|
}
|
|
|
|
/**
|
|
* @param $userAddressId
|
|
* @param $marketId
|
|
* @return false|float
|
|
*/
|
|
public function getAddressAndDistributionRrice($userAddressId,$marketId)
|
|
{
|
|
$address = $this->get($userAddressId);
|
|
$market = Market::query()->select('lng','lat')->find($marketId);
|
|
$distance = $this->locationService->getDistanceByTencent($address->lng,$address->lat,$market->lng,$market->lat);
|
|
$distributionRrice = $this->calculateDistributionRrice($distance);
|
|
$res['address'] = $address;
|
|
$res['distribution_price'] = $distributionRrice;
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* @param $distance
|
|
* @return false|float
|
|
*/
|
|
function calculateDistributionRrice($distance)
|
|
{
|
|
$km = ceil($distance/1000);
|
|
switch ($km){
|
|
case ($km > 3 && $km < 5) :
|
|
$distributionRrice = bcmul(0.70,($km-3),2);
|
|
break;
|
|
case ($km >= 5 && $km < 7) :
|
|
$distributionRrice = bcmul(1.00,($km-3),2);
|
|
break;
|
|
case ($km >= 7 && $km < 10) :
|
|
$distributionRrice = bcmul(1.50,($km-3),2);
|
|
break;
|
|
case ($km >= 10) :
|
|
$distributionRrice = bcmul(1.50,($km-3),2);
|
|
// throw new ErrorCodeException(ErrorCode::LOCATION_LONG_DISTANCE);
|
|
break;
|
|
default:
|
|
$distributionRrice = 0;
|
|
break;
|
|
}
|
|
$distributionRrice = bcadd($distributionRrice,3.50,2);
|
|
return $distributionRrice;
|
|
}
|
|
}
|