<?php
/**
 * 订单管理控制器
 */
namespace app\modules\engineer\v1\controllers;
use app\modules\common\Helper;
use app\modules\common\Verify;
use app\modules\logic\services\UserService;
use app\modules\logic\services\OrderService;
use app\modules\logic\services\CommonService;
use app\modules\logic\services\TechService;
use app\modules\logic\model\OrderModel;
use app\modules\logic\model\SysBasePriceSetModel;
use app\modules\logic\model\UsersTechApproveModel;
use Yii;
use yii\web\Controller;

class OrderController extends MiddleController {
	/**
	 * 返回
	 * @param $code
	 * @param string $info
	 * @param string $controller
	 * @param string $total
	 */
	protected function response($code, $info = '', $total = '', $controller = 'order') {
		return parent::response($code, $info, $total, $controller);
	}
	/**
	 * [actionGetordersta 获取订单状态显示]
	 * @apiDoc
	 * @api     v1/order/getordersta
	 * @group   order
	 * @name    获取订单状态菜单
	 * @desc    订单管理-状态下拉
	 * @method  POST
	 * @author JOHN.W
	 * @version [1.0]
	 * @return  json
		{
		"code": "000000",
		"msg": "获取成功",
		"info": {
		"all": "全部",
		"0": "待付款",
		"1": "待接单",
		"2": "待施工",
		"3": "施工中",
		"4": "待评论",
		"5": "已完成",
		"6": "异常订单"
		}
		}
	 */
	public function actionGetordersta(){
		$data = Helper::getOrderSta(0,true);
		return $this->response('deal_succ', '获取成功', $data);
	}
	/**
	 * [actionList 订单列表]
	 * @apiDoc
	 * @api     v1/order/list
	 * @group   order
	 * @name    我的订单列表
	 * @desc    技师APP-订单列表
	 * @method  POST
	 * @param currentPage string 当前页 noreq 1
	 * @param pageSize string 每页条数 noreq 15
	 * @author JOHN.W
	 * @version [1.0]
	 * @return  json
		{
		    "code": "000000",
		    "msg": "获取成功",
		    "info": [
		        {
		            "order_id": "1",
		            "status": "0",
		            "abn_status": "0",
		            "sp_time": "2019-09-13 23:34:26",
		            "fore_time": "1970-01-01 08:00:00",
		            "price": "18.00",
		            "type": "1",
		            "shop_user_id": "2",
		            "plate_no": "川A12356",
		            "pro_extra": "1",
		            "carmodel_id": "2",
		            "shop_tel": "18980647855",
		            "type_show": "实时单",
		            "pro_extra_show": {
		                "show_name": [
		                    "美容-保养"
		                ],
		                "total": 1
		            },
		            "carmodel_id_show": "SUV",
		            "shop_info": {
		                "name": "众合汽修",
		                "address": "成都市新光路99号"
		            },
		            "status_show": "待付款"
		        }
		    ]
		}
	 */
	public function actionList(){
		if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
		$_where = "";
		$_where .= " and p1.re_user_id = ".$this->user_id." and status in(2,3) and abn_status=0";
        $currentPage = 1;
        $pageSize = 15;
        if (isset($this->para['currentPage']) && !empty($this->para['currentPage']) && is_numeric($this->para['currentPage'])) {
            $currentPage = $this->para['currentPage'];
        }
        if (isset($this->para['pageSize']) && !empty($this->para['pageSize']) && is_numeric($this->para['pageSize'])) {
            $pageSize = $this->para['pageSize'];
        }

        $limit_start = ($currentPage - 1) * $pageSize;
        $_limit = " limit " . $limit_start . " , " . $pageSize;
        $_order = " order by p1.order_id desc";
        /*数据库链接*/
        $conn = Yii::$app->db;
        //记录总数
        $select = "p1.*,p2.plate_no,p2.pro_extra,p2.carmodel_id,p2.shop_tel";
        //当前记录
        $sql = "select ".$select." from {{%order}} as p1 left join {{%order_info}} as p2  on p1.order_id=p2.order_id where 1 " . $_where . $_order . $_limit;
        $cmd = $conn->createCommand($sql);
        $data = $cmd->queryAll();
        foreach ($data as &$value) {
        	$value['type_show']= Helper::getOrderTypeNameApp($value['type']);
        	$value['pro_extra_show']= Helper::getProExtraNameById($value['pro_extra'],true);
        	$value['carmodel_id_show']= Helper::getCarModelName($value['carmodel_id']);
        	$value['sp_time'] = date("Y-m-d H:i:s",$value['sp_time']);
            $value['price'] = $value['tech_price'];
        	$value['shop_info'] = CommonService::getShopAddress($value['shop_user_id']);
        	$value['fore_time'] = date("Y-m-d H:i:s",$value['fore_time']);
        	if($value['abn_status']>0){
        		$value['status_show'] = '异常订单';
        	}else{
        		$value['status_show'] = Helper::getOrderSta($value['status']);
        	}
        	//判断是否有返工/暂停施工类的订单
            $notice = OrderService::checkOrNotice($value['order_id']);
            if($notice){
                if(isset($notice['type']) && $notice['type']==1){
                    return $this->response('order_notice', '暂停施工通知', $notice['data']); 
                }else{
                    return $this->response('order_rework', '返工确认通知', $notice['data']); 
                }
               
            }
        }
 		$conn->close();
 		return $this->response('deal_succ', '获取成功', $data);
	}
    /**
     * [actionPauseaff 暂停确认]
     * @apiDoc
     * @api     v1/order/pauseaff
     * @group   order
     * @name    暂停确认
     * @desc    技师APP-暂停施工确认
     * @method  POST
     * @param  order_id int 订单ID req
     * @param  type int 确认类型【1,确认2,拒绝】 req
     * @author JOHN.W
     * @version [1.0]
     * @return  json
        {
        "code": "000000",
        "msg": "操作成功",
        "info": ""
        }
     * */
    public function actionPauseaff(){
        if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
        if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        if(empty($this->para['type']) || !in_array($this->para['type'], ['1','2']))
        {
            return $this->response('para_miss', '确认类型不正确');
        }
        $param = [
            'user_id'=>$this->user_id,
            'order_id'=>$this->para['order_id'],
            'type'=>$this->para['type']
        ];
        $res = OrderService::affOrderPause($param);
        if($res){
            return $this->response('deal_succ', '操作成功');
        }else{
            return $this->response('deal_false', '操作失败');
        }
    }
    /**
     * [actionReworkaff 返工确认]
     * @apiDoc
     * @api     v1/order/reworkaff
     * @group   order
     * @name    返工确认
     * @desc    技师APP-返工确认
     * @method  POST
     * @param  order_id int 订单ID req
     * @param  type int 确认类型【1,确认2,拒绝】 req
     * @param  remark string 拒绝理由 noreq
     * @author JOHN.W
     * @version [1.0]
     * @return  json
        {
        "code": "000000",
        "msg": "操作成功",
        "info": ""
        }
     * */
    public function actionReworkaff(){
        if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
        if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        if(empty($this->para['type']) || !in_array($this->para['type'], ['1','2']))
        {
            return $this->response('para_miss', '确认类型不正确');
        }
        $param = [
            'user_id'=>$this->user_id,
            'order_id'=>$this->para['order_id'],
            'remark'=>isset($this->para['remark'])?$this->para['remark']:'',
            'type'=>$this->para['type']
        ];
        $res = OrderService::affOrderRework($param);
        if($res){
            return $this->response('deal_succ', '操作成功');
        }else{
            return $this->response('deal_false', '操作失败');
        }         
    }
	/**
	 * [actionDetail 订单详情]
	 * @apiDoc
	 * @api     v1/order/detail
	 * @group   order
	 * @name    订单详情
	 * @desc    门店APP-订单详情-未完成
	 * @method  POST
	 * @param  order_id int 订单ID req
	 * @author JOHN.W
	 * @version [1.0]
	 * @return  json
		 {
		"code": "000000",
		"msg": "获取成功",
		"info": {
		    "base": {
		        "plate_no": "川A12356",
		        "carmodel_id": "SUV",
		        "pro_extra": "美容-保养"
		    },
		    "order_info": {
		        "nid": "201909132334265050535098426",
		        "sp_time": "1568388866",
		        "fore_time": "0",
		        "realname": "2",
		        "moblie": "",
		        "shop_name": "",
		        "shop_phone": "",
                "shop_address": "成都市xxx",//门店地址
		        "zd_shop_man": "",
		        "zd_shop_tel": "",
		        "sg_type": ""
		    },
		    "cons_info": {
		        "re_time": "0",
		        "reach_time": "0",
		        "star_work_time": "0",
		        "comp_time": "0",
		        "confirm_time": "0",
		        "work_total": "",
		        "order_delay": ""
		    },
		    "tech_info": {
		        "name": "",
		        "mobile": "",
		        "level": "",
		        "star_level": ""
		    },
		    "pay_info": {
		        "price_total": "",
		        "offer": "",
		        "total": ""
		    }
		}
		}
	 */
	public function actionDetail(){
		if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
        if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        $order_id = $this->para['order_id'];
        $data = OrderService::getOrMoreDtl($order_id);
        
        return $this->response('deal_succ', '获取成功', $data);
	}
	/**
     * [actionReorderlist 待抢预约单列表]
     * @apiDoc
     * @api     v1/order/reorderlist
     * @group   order
     * @name    待抢预约单列表
     * @desc    技师APP-待抢预约单列表
     * @method  POST
     * @param currentPage string 当前页 noreq 1
     * @param pageSize string 每页条数 noreq 15
     * @param longitude string 用户经度  noreq
     * @param latitude string 用户纬度  noreq
     * @author JOHN.W
     * @version [1.0]
     * @return  json
        {
        "code": "000000",
        "msg": "获取成功",
        "info": [
        {
        "order_id": "2",
        "fore_time": "1970-01-01 08:00:00",
        "price": "18.00",
        "shop_user_id": "2",
        "pro_extra": "1",
        "carmodel_id": "2",
        "pro_extra_show": {
            "show_name": [
                "美容-保养"
            ],
            "total": 1
        },
        "carmodel_id_show": "SUV",
        "distance": "5km"
        }
        ]
        }
     */
    public function actionReorderlist(){
        if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
        $_where = " and p1.type = 2 and p1.status = 1 and p1.re_user_id = 0";
        $currentPage = 1;
        $pageSize = 15;
        if (isset($this->para['currentPage']) && !empty($this->para['currentPage']) && is_numeric($this->para['currentPage'])) {
            $currentPage = $this->para['currentPage'];
        }
        if (isset($this->para['pageSize']) && !empty($this->para['pageSize']) && is_numeric($this->para['pageSize'])) {
            $pageSize = $this->para['pageSize'];
        }

        $limit_start = ($currentPage - 1) * $pageSize;
        $_limit = " limit " . $limit_start . " , " . $pageSize;
        $_order = " order by p1.order_id desc";
        /*数据库链接*/
        $conn = Yii::$app->db;
        //记录总数
        $select = "p1.order_id,p1.fore_time,p1.price,p1.tech_price,p1.shop_user_id,p2.pro_extra,p2.carmodel_id";
        //当前记录
        $sql = "select ".$select." from {{%order}} as p1 left join {{%order_info}} as p2  on p1.order_id=p2.order_id where 1 " . $_where . $_order . $_limit;
        $cmd = $conn->createCommand($sql);
        $data = $cmd->queryAll();
        $longitude = empty($this->para['longitude']) ? 0 : $this->para['longitude'];
        $latitude = empty($this->para['latitude']) ? 0 : $this->para['latitude'];
        //判断产品
        foreach ($data as $key=>&$value) {
            if($this->isCarCkShow($value['pro_extra'],$this->user_id)){
                unset($data[$key]);
                continue;
            }
            $value['pro_extra_show']= Helper::getProExtraNameById($value['pro_extra']);
            $value['carmodel_id_show']= Helper::getCarModelName($value['carmodel_id']);
            $value['fore_time'] = date("Y-m-d H:i:s",$value['fore_time']);
            $value['price'] = $value['tech_price'];
            $value['distance'] = CommonService::getShopDistance($value['shop_user_id'],$longitude,$latitude);
        }
        $data = array_values($data);
        $conn->close();
        return $this->response('deal_succ', '获取成功', $data);
    }
    //判断是否是汽车审核业务
    public function isCarCkShow($pro_extra = '',$user_id = 0){
        if(empty($pro_extra) || empty($user_id)){
            return false;
        }
        $pro_arr = explode(',', $pro_extra);
        $SysBasePriceSet = new SysBasePriceSetModel();
        //获取业务ID 项目ID
        $rows = $SysBasePriceSet->getWidgetRows(['cols'=>['yw_id','pro_id'],'in'=>['id'=>$pro_arr]]);
        $yw_arr = array_column($rows, 'yw_id');
        //判断是汽车年审业务
        if(in_array('14', $yw_arr)){
            $UsersTechApprove = new UsersTechApproveModel();
            $user_yw = $UsersTechApprove->getWidgetRow(['cols'=>['yw_id','level_id'],'user_id'=>$user_id]);
            if(empty($user_yw)){
                return true;
            }else{
                //判断是否授权
                return ($user_yw['yw_id']==14)?false:true;
            }
        }
        return false;
    }
    /**
     * [actionGraborder 确定抢单]
     * @apiDoc
     * @api     v1/order/graborder
     * @group   order
     * @name    确定抢单
     * @desc    技师APP-待抢预约单-确定抢单
     * @method  POST
     * @param order_id int 订单ID req
     * @author JOHN.W
     * @version [1.0]
     * @return  json
       {
        "code": "000000",
        "msg": "抢单成功",
        "info": ''
        }  	
     */
    public function actionGraborder(){
    	if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
         if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        //查询订单状态是否可抢
        $order_id = $this->para['order_id'];
        $Order = new OrderModel();
        $res = $Order->getWidgetRow(['cols'=>['status','re_user_id'],'order_id'=>$order_id]);
        if(empty($res) || $res['status']!=1 || $res['re_user_id']!=0){
        	 return $this->response('deal_false',"订单已被抢");
        }
        //执行抢单操作
        $result = $Order->saveUs(['re_user_id'=>$this->user_id,'re_time'=>time(),'status'=>2],$order_id);
        if($result){
        	return $this->response('deal_succ', '抢单成功');
        }else{
        	return $this->response('deal_false', '抢单失败');
        }
    }
    /**
     * [actionReachshop 到达门店]
     * @apiDoc
     * @api     v1/order/reachshop
     * @group   order
     * @name    到达门店
     * @desc    技师APP-我的订单-到达门店
     * @method  POST
     * @param order_id int 订单ID req
     * @author JOHN.W
     * @version [1.0]
     * @return  json
       {
        "code": "000000",
        "msg": "操作成功",
        "info": ''
        }  	
     */
    public function actionReachshop(){
    	if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
         if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        $order_id = $this->para['order_id'];
        $Order = new OrderModel();
        $res = $Order->getWidgetRow(['cols'=>['reach_time'],'order_id'=>$order_id]);
        if(empty($res) || $res['reach_time']!=0){
        	 return $this->response('deal_false',"操作失败");
        }
        //执行开始施工
        $result = $Order->saveUs(['reach_time'=>time()],$order_id);
        if($result){
        	return $this->response('deal_succ', '操作成功');
        }else{
        	return $this->response('deal_false', '操作失败');
        }
    }
    /**
     * [actionStartcons 开始施工]
     * @apiDoc
     * @api     v1/order/startcons
     * @group   order
     * @name    开始施工
     * @desc    技师APP-我的订单-开始施工
     * @method  POST
     * @param order_id int 订单ID req
     * @author JOHN.W
     * @version [1.0]
     * @return  json
       {
        "code": "000000",
        "msg": "操作成功",
        "info": ''
        }  	
     */
    public function actionStartcons(){
    	if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
         if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        $order_id = $this->para['order_id'];
        $Order = new OrderModel();
        $res = $Order->getWidgetRow(['cols'=>['status','star_work_time'],'order_id'=>$order_id]);
        if(empty($res) || $res['status']!=2 || $res['star_work_time']!=0){
        	 return $this->response('deal_false',"操作失败");
        }
        //执行开始施工
        $result = $Order->saveUs(['star_work_time'=>time(),'status'=>3],$order_id);
        if($result){
        	return $this->response('deal_succ', '操作成功');
        }else{
        	return $this->response('deal_false', '操作失败');
        }
    }
	/**
     * [actionEndcons 完成施工]
     * @apiDoc
     * @api     v1/order/endcons
     * @group   order
     * @name    完成施工
     * @desc    技师APP-我的订单列表-完成施工
     * @method  POST
     * @param order_id int 订单ID req
     * @author JOHN.W
     * @version [1.0]
     * @return  json
       {
        "code": "000000",
        "msg": "操作成功",
        "info": ''
        }  	
     */
    public function actionEndcons(){
    	if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
         if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        $order_id = $this->para['order_id'];
        $Order = new OrderModel();
        $res = $Order->getWidgetRow(['cols'=>['status','comp_time'],'order_id'=>$order_id]);
        if(empty($res) || $res['status']!=3 || $res['comp_time']!=0){
        	 return $this->response('deal_false',"操作失败");
        }
        //执行开始施工
        $result = $Order->saveUs(['comp_time'=>time()],$order_id);
        if($result){
        	return $this->response('deal_succ', '操作成功');
        }else{
        	return $this->response('deal_false', '操作失败');
        }
    }
    /**
     * [actionAberrant 提交异常]
     * @apiDoc
     * @api     v1/order/aberrant
     * @group   order
     * @name    提交异常
     * @desc    门店APP-订单列表-提交异常
     * @method  POST
     * @param  order_id int 订单ID req
     * @param  type int 异常类型【1普通异常，2施工异常】 req
     * @param  remark string 异常说明 req
     * @author JOHN.W
     * @version [1.0]
     * @return  json
        {
        "code": "000000",
        "msg": "操作成功",
        "info": ""
        }
     * */
    public function actionAberrant(){
        if (empty($this->user_id)) {
            return $this->response('para_miss_user', '未能识别用户标志');
        }
        if (empty($this->para['order_id']) || !is_numeric($this->para['order_id'])) {
            return $this->response('para_miss', '订单ID不能为空');
        }
        return $this->response('para_miss', '暂未开放...');
        if(empty($this->para['type']) || !in_array($this->para['type'], ['1','2']))
        {
            return $this->response('para_miss', '异常类型不正确');
        }
        $param = Helper::elements(['order_id','remark','type'],$this->para,'');
        $res = OrderService::aberOrder($param);
        if($res){
            return $this->response('deal_succ', '操作成功');
        }else{
            return $this->response('deal_false', '操作失败');
        }
    }
}