<?php
namespace app\modules\logic\services;
use app\modules\common\Helper;
use app\modules\logic\model\OrderModel;
use app\modules\logic\model\OrderCommentModel;
use app\modules\logic\model\PayLogModel;
use app\modules\logic\model\OrderInfoModel;
use app\modules\logic\model\UsersShopInfoModel;
use app\modules\logic\model\UsersModel;
use app\modules\logic\model\SysBasePriceSetModel;
use app\modules\logic\model\SysCarmodelPriceSetModel;
use app\modules\logic\services\AssignService;
use app\modules\logic\services\TechService;
use app\modules\logic\services\AccountService;
use app\modules\third\payment\Wxpay;
use app\modules\third\payment\H5pay;
use app\modules\sys\log\ImLog;
use app\modules\logic\services\CouponService;
use Yii;
use yii\db\Query;
/**
 * 订单公用服务
 */
class OrderService {
	/**
	 * [getOrderDetail 获取订单详情-管理后台]
	 * @author JOHN.W
	 * @version [1.0]
	 * @return  [type]          [description]
	 */
	public static function getOrderDetail($order_id = 0){
		if(empty($order_id)) return [];
		$Order = new OrderModel();
		$OrderInfo = new OrderInfoModel();
		$main = $Order->getWidgetRow(['order_id'=>$order_id]);
		$info = $OrderInfo->getWidgetRow(['order_id'=>$order_id]);
		$ret = [
			'main'=>!empty($main)?$main:[],
			'info'=>!empty($info)?$info:[],
		];
		return $ret;
	}
	/**
	 * /
	 * @return [type] [获取订单详情-门店APP]
	 */
	public static function getOrMoreDtl($order_id = 0){
		$data = self::getOrderDetail($order_id);
		//$OrderInfo = new OrderInfoModel();
		//$orderinfo_row = $OrderInfo->getWidgetRow(['cols'=>['shop_tel','carmodel_id','pro_extra'],'order_id'=>$order_id]);
		//获取
        $base = [
        	'plate_no'=>$data['info']['plate_no'],
        	'carmodel_id'=>Helper::getCarModelName($data['info']['carmodel_id']),
        	'pro_extra'=>Helper::getProExtraNameById($data['info']['pro_extra']),
        ];
        //获取下单人信息
        $Users = new UsersModel();
        $sp_user_row = $Users->getWidgetRow(['cols'=>['realname','mobile','longitude','latitude'],'user_id'=>$data['main']['sp_user_id']]);
        if($data['main']['shop_user_id']!=$data['main']['sp_user_id']){
        	$shop_user_row = $Users->getWidgetRow(['cols'=>['realname','mobile','longitude','latitude'],'user_id'=>$data['main']['shop_user_id']]);
        }
        //获取门店名称和电话
        $UsersShopInfo = new UsersShopInfoModel();
        $shop_row = $UsersShopInfo->getWidgetRow(['cols'=>['name','tel','address'],'user_id'=>$data['main']['shop_user_id']]);
        //获取技师信息
        if(!empty($data['main']['re_user_id'])){
        	$tech_row = TechService::getTechInfoByDetail($data['main']['re_user_id']);
        }
        
        //获取支付信息
        $PayLog = new PayLogModel();
        $pay_row = $PayLog->getWidgetRow(['cols'=>['pay_money','offer_money'],'order_id'=>$order_id]);
        $order_info = [
        	'nid'=>$data['main']['nid'],
        	'sp_time'=>!empty($data['main']['sp_time'])?date("Y-m-d H:i:s",$data['main']['sp_time']):'-',//下单时间
        	'fore_time'=>!empty($data['main']['fore_time'])?date("Y-m-d H:i:s",$data['main']['fore_time']):'-',//预计施工时间
        	'realname'=>isset($sp_user_row['realname'])?$sp_user_row['realname']:'-',//发起人姓名
        	'mobile'=>isset($sp_user_row['mobile'])?$sp_user_row['mobile']:'-',//发起人电话
        	'shop_name'=>isset($shop_row['name'])?$shop_row['name']:'-',//门店名称
        	'shop_address'=>isset($shop_row['address'])?$shop_row['address']:'-',//门店地址
        	'shop_phone'=>isset($shop_row['tel'])?$shop_row['tel']:'-',//门店电话
        	'zd_shop_tel'=>isset($data['info']['shop_tel'])?$data['info']['shop_tel']:'-',//指定联系人
        	'shop_longitude'=>isset($shop_user_row['longitude'])?$shop_user_row['longitude']:$sp_user_row['longitude'],//门店经度
        	'shop_latitude'=>isset($shop_user_row['latitude'])?$shop_user_row['latitude']:$sp_user_row['latitude']//门店纬度
        ];
        $cons_info = [
        	're_time'=>!empty($data['main']['re_time'])?date("Y-m-d H:i:s",$data['main']['re_time']):'-',//接单时间
        	'reach_time'=>!empty($data['main']['reach_time'])?date("Y-m-d H:i:s",$data['main']['reach_time']):'-',//到达时间
        	'star_work_time'=>!empty($data['main']['star_work_time'])?date("Y-m-d H:i:s",$data['main']['star_work_time']):'-',//开始施工时间
        	'comp_time'=>!empty($data['main']['comp_time'])?date("Y-m-d H:i:s",$data['main']['comp_time']):'-',//技师完工时间
        	'confirm_time'=>!empty($data['main']['confirm_time'])?date("Y-m-d H:i:s",$data['main']['confirm_time']):'-',//门店确认时间
        	'work_total'=>!empty($data['main']['star_work_time']) && !empty($data['main']['comp_time'])?($data['main']['comp_time']-$data['main']['star_work_time'])/60:'-'
        ];
        $tech_info = [
        	'name'=>isset($tech_row['realname'])?$tech_row['realname']:'-',
        	'mobile'=>isset($tech_row['mobile'])?Helper::partHide('mobile',$tech_row['mobile']):'-',
        	'level'=>isset($tech_row['level_show'])?$tech_row['level_show']:'-',
        	'star_level'=>isset($tech_row['star_level'])?$tech_row['star_level']:'-',
        ];
        $pay_info = [
        	'total_price'=>isset($data['main']['price'])?$data['main']['price']:'-',
        	'offer_money'=>isset($pay_row['offer_money'])?$pay_row['offer_money']:'-',
        	'pay_money'=>isset($pay_row['pay_money'])?$pay_row['pay_money']:'-',
        ];
        //结算明细
        $settle_info = [
        	'work_income'=>'-',//工时费
        	'activity_income'=>'-',//活动补贴
        	'safe_fee'=>'-',//保险代扣
        	'reach_fee'=>'-',//到店超时扣费
        	'cons_fee'=>'-',//超时扣费
        	'actual_income'=>'-',//实际收入
        ];
        $OrderCommen = new OrderCommentModel();
        //评论数据
        $comment_info = $OrderCommen->getWidgetRow(['cols'=>['comment_text','extra'],'order_id'=>$order_id]);
        if(!empty($comment_info)){
        	$comment_info['extra'] = json_decode($comment_info['extra'],true);
        }
        $ret =[
        	'base'=>$base,
        	'order_info'=>$order_info,
        	'cons_info'=>$cons_info,
        	'tech_info'=>$tech_info,
        	'pay_info'=>$pay_info,
        	'settle_info'=>$settle_info,
        	'complex_info'=>$data['main'],
        	'comment_info'=>!empty($comment_info)?$comment_info:[],
        ];
        return $ret;
	}
	/**
	 * [ctOrder 创建订单]
	 * @version [1.0]
	 * @return  [type]          [description]
	 */
	public static function ctOrder($param = []){
		$Order = new OrderModel();
		$pro_arr = self::calcuPrice($param['pro_extra']);
		//计算优惠金额
		$couMoney = 0;
		if(!empty($param['cid'])){
			$cid_arr = explode(",",$param['cid']);
			if(!empty($cid_arr) && is_array($cid_arr)){
				foreach ($cid_arr as $value) {
					$cmoney = CouponService::getCouPrice($value);
					$couMoney = $couMoney+$cmoney;
				}
			}
		}
		$in_order = [
			'sp_user_id'=>$param['user_id'],
			'nid'=>Helper::getOrderNid("ORD"),
			'sp_time'=>time(),
			'type'=>$param['type'],
			'shop_user_id'=>$param['shop_user_id'],
			'old_type'=>$param['type'],
			'fore_time'=>time()+1800,//30分钟内到达
			'price'=>$pro_arr['price'],
			'cou_money'=>$couMoney,
			'tech_price'=>$pro_arr['tech_price'],
		];
		if(($in_order['price']-$in_order['cou_money'])<0) return false;//优惠金额超过订单金额;
		$in_order['fore_time']  = ($param['type']==2)?strtotime($param['fore_time']):$in_order['fore_time'];
		$order_id = $Order->saveUs($in_order);
		if(!empty($order_id)){
			$OrderInfo = new OrderInfoModel();
			$in_order_info = Helper::elements(['plate_no','carmodel_id','car_tel','shop_tel','pro_extra'],$param,'');
			$in_order_info['order_id'] = $order_id;
			$OrderInfo->saveUs($in_order_info);
			//优惠券使用
			if(!empty($param['cid'])){
				$cid_arr = explode(",",$param['cid']);
				if(!empty($cid_arr) && is_array($cid_arr)){
					foreach ($cid_arr as $value) {
						CouponService::useCou(['id'=>$value,'is_used'=>1,'use_order_id'=>$order_id,'use_uid'=>$param['user_id']]);
					}
				}
			}
			
		}
		return $order_id;
	}
	/**
	 * [calcuPrice 计算订单金额-车型和产品单价共同计算价格]
	 * @version [1.0]
	 * @param   [type]          $user_id   [description]
	 * @param   [type]          $other ['carmodel_id','shop_user_id']
	 * @return  [type]                     [description]
	 */
	public static function calcuPrice($pro_extra = '',$other = []){
		$pro_ids = explode(',', $pro_extra);
		$SysBasePriceSet = new SysBasePriceSetModel();
		$price_rows = $SysBasePriceSet->find()->where(['in','id',$pro_ids])->sum('price');
		$tech_price_rows = $SysBasePriceSet->find()->where(['in','id',$pro_ids])->sum('tech_price');
		$cons_time_rows = $SysBasePriceSet->find()->where(['in','id',$pro_ids])->sum('cons_time');
		//车型影响价格配置
		/*if(!empty($other)){
			$SysCarmodelPriceSet = new SysCarmodelPriceSetModel();
			$shop_user_id = $other['shop_user_id'];
			$carmodel_id = $other['carmodel_id'];
			$area_row = Helper::getAreaByUid($shop_user_id);
			$where = [
				'cols'=>['price_up','cons_time_up'],
				'carmodel_id'=>$carmodel_id,
				'is_del'=>0
			];
			$where_c = $where ;
			$where_a = $where ;
			if(!empty($area_row['city_id'])){
				$where_c['city_id']  = $area_row['city_id'];
				$rows_city = $SysCarmodelPriceSet->getWidgetRow($where_c);
			}
			if(!empty($area_row['area_id'])){
				$where_a['area_id']  = $area_row['area_id'];
				$rows_area = $SysCarmodelPriceSet->getWidgetRow($where_a);
			}
			
			$res_up = isset($rows_area) && !empty($rows_area)?$rows_area:$rows_city;
			if(!empty($res_up)){
				$price_up = $price_rows*($res_up['price_up']/100);
				$price_rows+=$price_up;		
			}
		}*/
		//return round($price_rows,2);
		return ['price'=>round($price_rows,2),'tech_price'=>round($tech_price_rows,2),'cons_time'=>$cons_time_rows];
		
	}
	/*支付成功修改订单状态*/
	public static function upOrderPaySuc($order_id = 0){
		$Order = new OrderModel();
		return $Order->saveUs(['status'=>1,'pay_time'=>time()],$order_id);
	}
	/**
	 * [cancelOrder 取消订单]
	 * @param  integer $order_id [description]
	 * @return [type]            [description]
	 */
	public static function cancelOrder($order_id = 0){
		$Order = new OrderModel();
		//订单状态不为待接单并且，技师还为接单的情况下不允许取消
		$row = $Order->getWidgetRow(['cols'=>['status','re_time','re_user_id'],'order_id'=>$order_id]);
		if(empty($row) || !in_array($row['status'], [0,1,2])){
			return false;
		}
		//执行具体取消逻辑
		/*更新订单状态*/
		$res = $Order->saveUs(['status'=>'7'],$order_id);
		if($res){
			$PayLog = new PayLogModel();
			//退回相应资金
			$payinfo = $PayLog->getWidgetRow(['cols'=>['id','pay_money','order_id','pay_way','nid','user_id','transaction_id'],'order_id'=>$order_id,'order_type'=>1]);
			if($payinfo){
				/*无责取消获取付款方式分别退费*/
					switch ($payinfo['pay_way']) {
						case '1':
							$version = '1.0';
							$pay = new H5pay($version);
							$refund_data = [
								'transaction_id' => $payinfo['transaction_id'],
								'out_trade_no' => $payinfo['nid'],
								'out_refund_no' => Helper::getOrderNid('CLO'),
								'money' => $payinfo['pay_money']
							];
							$result = $pay->refund($refund_data);
							ImLog::instance('wx_refunds_order.log')->Log(json_encode($result));
							$refund = false;
							if ($result['result_code'] == 'SUCCESS') {
								$refund = true;
							} else {
								$refund = false;
							}
							break;
						case '2':
							$data = [
							'user_id'=>$payinfo['user_id'],
							'nid'=>$payinfo['nid'],
							'money'=> $payinfo['pay_money'],
							'money_type'=>'gold',
							'op_type'=>'cance_order',
							'remark'=>'取消订单退费'
							];
							$refund = AccountService::addAccountLog($data);
							break;
						case '3':
							$data = [
								'user_id'=>$payinfo['user_id'],
								'nid'=>$payinfo['nid'],
								'money'=>$payinfo['pay_money'],
								'money_type'=>'money',
								'op_type'=>'cance_order',
								'remark'=>'取消订单退费'
							];
							$refund = AccountService::addAccountLog($data);
							break;	
						default :
							$refund = false;
					}
				//释放技师接单
				if(!empty($row['re_user_id'])){
					AssignService::unlockRece($row['re_user_id']);
				}
				/*有责取消*/
				/*if($row['re_time']>0 && $row['status']==2 && (time()-$row['re_time'])>600){
						$data = [
							'user_id'=>$payinfo['user_id'],
							'nid'=>$payinfo['nid'],
							'money'=> round($payinfo['pay_money']*0.967,2),
							'money_type'=>'gold',
							'op_type'=>'cance_order',
							'remark'=>'有责取消订单退费'
						];
						$refund = AccountService::addAccountLog($data);
						//释放技师接单
						if(!empty($row['re_user_id'])){
							AssignService::unlockRece($row['re_user_id']);
						}
				}else{
					
				}*/
				//退款成功
				if($refund){
					$PayLog->saveUs(['status'=>'3'],$payinfo['id']);
				}

			}
			//取消订单退回优惠券
			CouponService::backCou($order_id);
		}
		return true;
	}
	/**
	 * [finishOrder 门店确认完成]
	 * @param  integer $order_id [description]
	 * @return [type]            [description]
	 */
	public static function finishOrder($order_id = 0){
		$Order = new OrderModel();
		//订单状态为3施工中，并且及时已经点击完成施工
		$row = $Order->getWidgetRow(['cols'=>['status','comp_time','re_user_id'],'order_id'=>$order_id]);
		//清除返工次数缓存
		$redis = $redis = Yii::$app->redis;
		$key_time = "aber:rework-time".$order_id;
		if($redis->exists($key_time)){
			$redis->del($key_time);
		}
		AssignService::unlockRece($row['re_user_id']);
		//清除返工次数缓存结束
		if(empty($row) || $row['status']!=3 || empty($row['comp_time'])){
			return false;
		}
		return $Order->saveUs(['status'=>'4','confirm_time'=>time()],$order_id);
	}
	/**
	 * [finishOrder 删除订单]
	 * @param  integer $order_id [description]
	 * @return [type]            [description]
	 */
	public static function delOrder($order_id = 0){
		$Order = new OrderModel();
		//订单状态为3施工中，并且及时已经点击完成施工
		$row = $Order->getWidgetRow(['cols'=>['status','comp_time'],'order_id'=>$order_id]);
		if(empty($row) || $row['status']!=7){
			return false;
		}
		return $Order->saveUs(['is_del'=>'1'],$order_id);
	}
	/**
	 * [aberOrder 提交异常订单]
	 * @param  integer $order_id [description]
	 * @return [type]            [description]
	 */
	public static function aberOrder($param = []){
		if(!isset($param['type']) || !isset($param['order_id'])) return false;
		$Order = new OrderModel();
		$row = $Order->getWidgetRow(['cols'=>['status','abn_status','nid'],'order_id'=>$param['order_id']]);
		//状态为待施工和施工中方可发起异常
		if(empty($row) || !in_array($row['status'], ['2','3']) || $row['abn_status']!=0){
			return false;
		}
		$redis = Yii::$app->redis;
		$key_redis = "aber:pause".$param['order_id'];
		switch ($param['type']) {
			case '1':
			case '2':
				$ret = $Order->saveUs(['abn_status'=>$param['type'],'remark'=>$param['remark']],$param['order_id']);
				break;
			case '3':
				//写入redis--校验是否发起了施工异常
				if($redis->exists($key_redis)){
					$ret = false;
				}else{
					$param['nid'] = $row['nid'];
					$ret = $redis->set($key_redis, json_encode($param));
				}
				break;			
			default:
				$ret = false;
		}
		return $ret;
	}
	/**
	 * [affOrderPause 技师确认暂停施工]
	 * @param  array  $param [description]
	 * @return [type]        [description]
	 */
	public static function affOrderPause($param = [])
	{
		$redis = Yii::$app->redis;
		$key_redis = "aber:pause".$param['order_id'];
		if(!$redis->exists($key_redis)){
			return false;
		}
		$data = json_decode($redis->get($key_redis),true);
		//逻辑-拒绝暂停施工,订单变为待派单状态 确认暂停施工，技师恢复可接单状态，订单状态变为暂停施工
		$Order = new OrderModel();
		switch ($param['type']) {
			case '1':
				//保存数据
				$ret = $Order->saveUs(['abn_status'=>3,'remark'=>$data['remark']],$param['order_id']);
				//技师恢复可以接单状态
				AssignService::unlockRece($param['user_id']);
				$redis->del($key_redis);
				break;
			case '2':
				//拒绝/订单变为异常订单状态
				$ret = $Order->saveUs(['abn_status'=>1,'remark'=>$data['remark'],'next_cons_time'=>$data['next_cons_time'],'re_user_id'=>0],$param['order_id']);
				AssignService::unlockRece($param['user_id']);
				$redis->del($key_redis);
				break;
			default:
				$ret = false;
		}
		return $ret;
	}
	/**
	 * [affOrderRework 返工确认]
	 * @param  array  $param [description]
	 * @return [type]        [description]
	 */
	public static function affOrderRework($param = [])
	{
		$redis = Yii::$app->redis;
		$key_redis = "aber:rework".$param['order_id'];
		$key_time = "aber:rework-time".$param['order_id'];
		if(!$redis->exists($key_redis)){
			return false;
		}
		$data = json_decode($redis->get($key_redis),true);
		//逻辑-确认返工，状态重新到施工中，技师确认完工时间清零，拒绝范围，状态直接未异常订单1。技师不解开接单锁定，等等后台处理
		$Order = new OrderModel();
		switch ($param['type']) {
			case '1':
				//保存数据
				$ret = $Order->saveUs(['status'=>3,'comp_time'=>0,'is_rework'=>1],$param['order_id']);
				$redis->del($key_redis);
				break;
			case '2':
				//拒绝/订单变为异常订单状态
				$ret = $Order->saveUs(['abn_status'=>1,'remark'=>$data['remark'].':'.$param['remark']],$param['order_id']);
				$redis->del($key_redis);
				$redis->del($key_time);
				break;
			default:
				$ret = false;
		}
		return $ret;
	}
	/**
	 * [rwOrder 发起返工]
	 * @param  array  $param [description]
	 * @return [type]        [description]
	 */
	public static function rwOrder($param = []){
		$Order = new OrderModel();
		$row = $Order->getWidgetRow(['cols'=>['status','comp_time','confirm_time'],'order_id'=>$param['order_id']]);
		//状态为待施工和施工中方可发起异常
		if(empty($row) || !in_array($row['status'], ['3']) || empty($row['comp_time']) || !empty($row['confirm_time'])){
			return false;
		}
		$redis = Yii::$app->redis;
		$key_redis = "aber:rework".$param['order_id'];
		$key_time = "aber:rework-time".$param['order_id'];
		if($redis->exists($key_redis)){
			return true;
		}else{
			 $ret = $redis->set($key_redis, json_encode($param));
		}
		if($redis->incr($key_time)>1){
			$redis->del($key_time);
			return $Order->saveUs(['abn_status'=>1],$param['order_id']);
		}
		return $ret;
	}
	/**
	 * [checkOrNotice 检查是否有订单通知-用于通知暂停施工 和 返工]
	 * @param  integer $order_id [description]
	 * @return [type]            [description]
	 */
	public static function checkOrNotice($order_id = 0){
		if(empty($order_id)) return false;
		$redis = Yii::$app->redis;
		$key_rework_redis = "aber:rework".$order_id;
		$key_pause_redis = "aber:pause".$order_id;
		if($redis->exists($key_pause_redis)){
			return ['type'=>1,'data'=>json_decode($redis->get($key_pause_redis),true)];
		}
		if($redis->exists($key_rework_redis)){
			return ['type'=>2,'data'=>json_decode($redis->get($key_rework_redis),true)];
		}
		return false;
	}
	/**
	 * [commentOr 评论订单]
	 * @param  array           $param [description]
	 * @return [type]                 [description]
	 */
	public static function commentOr($param = []){
		if(!isset($param['order_id'])) return false;
		$Order = new OrderModel();
		$row = $Order->getWidgetRow(['cols'=>['status','abn_status','re_user_id'],'order_id'=>$param['order_id']]);
		//待评论状态方可评论
		if(empty($row) || !in_array($row['status'], ['4']) || $row['abn_status']!=0){
			return false;
		}
		$OrderComment = new OrderCommentModel();
		//计算评论分
		$extra = json_decode($param['extra'],true);
		$fen = array_sum($extra);
		$data = [
			'order_id'=>$param['order_id'],
			'comment_user_id'=>$param['user_id'],
			'tech_user_id'=>$row['re_user_id'],
			'type'=>($fen>=12)?'good':'bad',
			'extra'=>$param['extra'],
			'comment_text'=>$param['comment_text'],
			'created'=>time()
		];
		$res = $OrderComment->saveUs($data);
		return $Order->saveUs(['status'=>5],$param['order_id']);
	}
}