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.
		
		
		
		
		
			
		
			
				
					
					
						
							165 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							165 lines
						
					
					
						
							4.9 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\DistributionPriceServiceInterface;
							 | 
						|
								use App\Service\v3\Interfaces\LocationServiceInterface;
							 | 
						|
								use App\Service\v3\Interfaces\ShopCartServiceInterface;
							 | 
						|
								use App\Service\v3\Interfaces\UserAddressServiceInterface;
							 | 
						|
								use App\Service\v3\SfExpress;
							 | 
						|
								/** @var Inject 注解使用 */
							 | 
						|
								use Hyperf\Di\Annotation\Inject;
							 | 
						|
								
							 | 
						|
								class UserAddressService implements UserAddressServiceInterface
							 | 
						|
								{
							 | 
						|
								    /**
							 | 
						|
								     * @Inject
							 | 
						|
								     * @var LocationServiceInterface
							 | 
						|
								     */
							 | 
						|
								    protected $locationService;
							 | 
						|
								
							 | 
						|
									/**
							 | 
						|
									 * @Inject
							 | 
						|
									 * @var ShopCartServiceInterface
							 | 
						|
									 */
							 | 
						|
									protected $shopCartService;
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @Inject
							 | 
						|
								     * @var DistributionPriceServiceInterface
							 | 
						|
								     */
							 | 
						|
								    protected $distributionPriceService;
							 | 
						|
								
							 | 
						|
								    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],
							 | 
						|
								            ])->update(['is_default' => 0]);
							 | 
						|
								        $userAddress = UserAddress::query()->find($userAddressId);
							 | 
						|
								        $userAddress->is_default = 1;
							 | 
						|
								        return $userAddress->save();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function get($userAddressId)
							 | 
						|
								    {
							 | 
						|
								        $address['address'] = UserAddress::query()->find($userAddressId);
							 | 
						|
								        $address['tags'] = $this->getTags();
							 | 
						|
								
							 | 
						|
								        return $address;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getList($userId)
							 | 
						|
								    {
							 | 
						|
								        return UserAddress::query()->where('user_id',$userId)->get();
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
									/**
							 | 
						|
									 * @param $userAddressId
							 | 
						|
									 * @param $marketId
							 | 
						|
									 * @param string $shopCartIds
							 | 
						|
									 * @param string $deliveryTimeNote
							 | 
						|
									 * @return array
							 | 
						|
									 */
							 | 
						|
									public function getAddressAndDistributionPrice($userAddressId, $marketId, string $shopCartIds, string $deliveryTimeNote)
							 | 
						|
									{
							 | 
						|
								        $address = $this->get($userAddressId);
							 | 
						|
								        $market = Market::find($marketId);
							 | 
						|
								        if(empty($address['address']->lng) || empty($address['address']->lat) || empty($market->lng) || empty($market->lat)){
							 | 
						|
								            throw new ErrorCodeException(ErrorCode::LOCATION_USER_ADDRESS);
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $distance = $this->locationService->getDistanceByTencent($market->lng,$market->lat,$address['address']->lng,$address['address']->lat);
							 | 
						|
								
							 | 
						|
										$storeList = $this->shopCartService->getGoodsByShopcartId($shopCartIds);
							 | 
						|
										$weight = 0;
							 | 
						|
										foreach ($storeList as $item) {
							 | 
						|
											foreach ($item['shopping_cart'] as $v) {
							 | 
						|
												$weight += $v['goods']['weight'] * $v['num'];
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
								
							 | 
						|
										$sfParams = [
							 | 
						|
											'user_lng' => $address['address']['lng'],
							 | 
						|
											'user_lat' => $address['address']['lat'],
							 | 
						|
											'user_address' => $address['address']['address'],
							 | 
						|
											'weight' => $weight,
							 | 
						|
											'shop' => [
							 | 
						|
												'shop_name' => $market->name,
							 | 
						|
												'shop_phone' => $market->tel,
							 | 
						|
												'shop_address' => $market->address,
							 | 
						|
												'shop_lng' => $market->lng,
							 | 
						|
												'shop_lat' => $market->lat,
							 | 
						|
											],
							 | 
						|
										];
							 | 
						|
								
							 | 
						|
										# 预约单处理
							 | 
						|
										$sfParams = array_merge($sfParams, SfExpress::getInstance()->deliveryTimeNote2expectTime($deliveryTimeNote));
							 | 
						|
								
							 | 
						|
										$distributionPrice = SfExpress::getInstance()->getDeliveryCost($sfParams);
							 | 
						|
										$originalPrice = SfExpress::getInstance()->getOriginDeliveryCost($distributionPrice);
							 | 
						|
								
							 | 
						|
										if($distance >= 1000){
							 | 
						|
								            $distance_text = '距您收货地址 ' . bcdiv($distance,1000,2) . 'km';
							 | 
						|
								        }else{
							 | 
						|
								            $distance_text = '距您收货地址 ' . $distance . 'm';
							 | 
						|
								        }
							 | 
						|
								        /**
							 | 
						|
								         * distributionPrice 配送费
							 | 
						|
								         * originalPrice 配送费原价
							 | 
						|
								         * style 前端输出样式
							 | 
						|
								         */
							 | 
						|
								        $res['address'] = $address;
							 | 
						|
								        $res['delivery_distance'] = $distance;
							 | 
						|
								        $res['distribution_price'] = $distributionPrice;
							 | 
						|
								        $res['original_price'] = $originalPrice;
							 | 
						|
								        $res['style'] = 'strike';
							 | 
						|
								        // $res['distribution_text'] = '¥ '.$distributionPrice .'(' .$distance_text .')';
							 | 
						|
								        $res['distribution_text'] = $distance_text;
							 | 
						|
								        $res['distribution_price_text'] = '¥ '.$distributionPrice;
							 | 
						|
								        $res['original_price_text'] = $originalPrice > $distributionPrice ? '¥ '.$originalPrice : '';
							 | 
						|
								        return $res;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    public function getTags()
							 | 
						|
								    {
							 | 
						|
								        return [
							 | 
						|
								            ['id' => 1, 'name' => '家'],
							 | 
						|
								            ['id' => 2, 'name' => '父母家'],
							 | 
						|
								            ['id' => 3, 'name' => '岳父母家'],
							 | 
						|
								            ['id' => 4, 'name' => '公司'],
							 | 
						|
								            ['id' => 5, 'name' => '朋友家'],
							 | 
						|
								        ];
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								}
							 |