<?php
namespace app\modules\logic\services;
use app\modules\common\Helper;
use app\modules\logic\model\OrderModel;
use app\modules\logic\model\UsersModel;
use app\modules\logic\model\OrderInfoModel;
use app\modules\logic\model\UsersCouponModel;
use app\modules\logic\model\UsersTechInfoModel;
use app\modules\logic\services\AccountService;
use app\modules\third\sms\Smsvoice;
use Yii;
use yii\db\Query;
/**
 * 派单公用服务
 */
class AssignService {
	public static $rece_key_tech_pre = 'assign:tech:';
	/**
	 * [lockRece 锁定接单]
	 * @param  [type]  $user_id [技师ID]
	 * @param  integer $expire  [锁定接单时间-1为永久]
	 * @return [true]           [description]
	 */
	public static function lockRece($user_id,$expire = 0){
		$redis = Yii::$app->redis;
		$key = self::$rece_key_tech_pre.$user_id;
		if($expire>0){
			$re = $redis->set($key, 1, 'EX',$expire);
		}else{
			$re = $redis->set($key, 1);
		}
		
		return $re;
	}
	/**
	 * [unlockRece 解除锁定]
	 * @param  [type] $user_id [description]
	 * @return [type]          [description]
	 */
	public static function unlockRece($user_id){
		$redis = Yii::$app->redis;
		$key = self::$rece_key_tech_pre.$user_id;
        if ($redis->exists($key)) {
            $redis->del($key);
        }
        return true;
	}
	/**
	 * [checkRece 校验是否能接单]
	 * @return [type] [description]
	 */
	public static function checkRece($user_id){
		$redis = Yii::$app->redis;
		$key = self::$rece_key_tech_pre.$user_id;
        return $redis->exists($key);
	}
	/**
	 * [agOrder 派单服务]
	 * @param  integer $order_id [description]
	 * @return [type]            [description]
	 */
	public static function agOrder($order_id = 0){
		$Order = new OrderModel();
		$row = $Order->getWidgetRow(['cols'=>['shop_user_id','sp_user_id','status','re_user_id'],'order_id'=>$order_id]);
		if($row['status']!=1 || !empty($row['re_user_id'])){
			return false;
		}
		$shop_place = self::getShopPlace($row['shop_user_id']);
		//获取系统接单范围
		$range_arr = Helper::calcScope($shop_place['longitude'],$shop_place['latitude'],self::getRange());
		//搜索该范围内的技师
		$User = new UsersModel();
		$t_were =[
			'type'=>'tech',
			'online_status'=>1,
			'cols'=>['user_id','longitude','latitude'],
			'between'=>[
				'longitude'=>[$range_arr['minLng'],$range_arr['maxLng']],
				'latitude'=>[$range_arr['minLat'],$range_arr['maxLat']]
			]
		];
		$rows = $User->getWidgetRows($t_were);
		//计算门店与技师直接的距离
		foreach ($rows as &$value) {
			//校验技师是否有待施工订单--取redis缓存直接暂时不能接单
			$value['distance'] = Helper::calcDistance($shop_place['latitude'],$shop_place['longitude'],$value['latitude'],$value['longitude']);
		}
		$tech_queue = self::arraySequence($rows,'distance');
		$smsvoice = new Smsvoice();
		foreach ($tech_queue as $key => $value) {
			//锁定的技师不能派单
			if(self::checkRece($value['user_id'])) continue;
			//未认证的技师不能派单
			if(!self::isPassTech($value['user_id'])) continue;
			//开始派单
			$res = $Order->saveUs(['re_user_id'=>$value['user_id'],'assign_time'=>time()],$order_id);
			//派单成功锁定技师接单
			if($res){
				self::orderPushTech($order_id,$value['user_id'],$value['distance']);
				self::lockRece($value['user_id']);
				/*派单发送语音通知*/
				$s_mobile = Helper::getUsernameById($value['user_id']);
				$param = [
					'tp_code'=>'notice',
					'mobile'=>$s_mobile
				];
				$smsvoice->send($param);
				//语音通知结束
			}
			break;
		}
		return true;
	}
	/**
	 * [isPassTech 判断技师是否审核通过]
	 * @name   判断技师是否审核通过
	 * @desc   接口描述
	 * @method POST
	 * @param  integer         $user_id [description]
	 * @return boolean                  [description]
	 */
	public static function isPassTech($user_id = 0){
		if(empty($user_id)) return false;
		$UsersTechInfo = new UsersTechInfoModel();
		$row = $UsersTechInfo->find()->select('verify_status')->where(['user_id'=>$user_id])->asArray()->one();
		if(!empty($row) && $row['verify_status']==1){
			return true;
		}else{
			return false;
		}
	}
	/**
	 * [recycleOrder 回收订单服务]
	 * @param  integer $order_id [description]
	 * @return [type]            [description]
	 */
	public static function recycleOrder($order_id = 0){
		$Order = new OrderModel();
		$row = $Order->getWidgetRow(['cols'=>['shop_user_id','sp_user_id','status','re_user_id','re_time'],'order_id'=>$order_id]);
		if($row['status']!=1 || !empty($row['re_time'])){
			return false;
		}
		$res = $Order->saveUs(['re_user_id'=>0,'assign_time'=>0],$order_id);
		if($res){
			//清除派单痕迹
			$redis = Yii::$app->redis;
	        $redis_key = 'order:tech'.$row['re_user_id'];
	        $redis->del($redis_key);
	        //清除派单痕迹
			self::unlockRece($row['re_user_id']);
			self::lockRece($row['re_user_id'],300);//锁定5分钟
		}
		return true;
	}
	/**
	 * [orderPushTech 推送订单到技师]
	 * @return [type] [description]
	 */
	public static function orderPushTech($order_id = 0,$re_user_id,$distance){
		$OrderInfo = new OrderInfoModel();
		$row = $OrderInfo->getWidgetRow(['cols'=>['pro_extra','order_id','carmodel_id'],'order_id'=>$order_id]);
		$row['pro_extra_show']= Helper::getProExtraNameById($row['pro_extra']);
		$row['carmodel_id_show']= Helper::getCarModelName($row['carmodel_id']);
		$row['distance'] = $distance;
		$row['assign_time'] = date("Y-m-d H:i:s");
		$redis = Yii::$app->redis;
        $redis_key = 'order:tech'.$re_user_id;
        return $redis->set($redis_key, json_encode($row));
	}
	/**
	 * [getShopPlace 获取门店位置]
	 * @param  integer $user_id [description]
	 * @return [type]           [description]
	 */
	public static function getShopPlace($user_id = 0){
		$Users = new UsersModel();
		$row = $Users->getWidgetRow(['cols'=>['longitude','latitude'],'user_id'=>$user_id]);
		return $row; 
	}
	/**
	 * [getRange 派单范围]
	 * @return [type] [description]
	 */
	private static function getRange(){
		//通过配置获取
		return 50000;
	}
	
	/**
	 * [arraySequence 数组排序]
	 * 二维数组按照指定字段进行排序
	 * @param array $array 需要排序的数组
	 * @param string $field 排序的字段
	 * @param string $sort 排序顺序标志 SORT_DESC 降序；SORT_ASC 升序
	 * @return [type]        [description]
	 */
	public static function arraySequence($array, $field, $sort = 'SORT_ASC'){
		$arrSort = [];
		foreach ($array as $uniqid => $row) {
			foreach ($row as $key => $value) {
				$arrSort[$key][$uniqid] = $value;
			}
		}
		array_multisort($arrSort[$field], constant($sort), $array);
		return $array;
	}
}