<?php

namespace app\api\controller\v1;
use app\api\controller\Base;
use app\common\model\Config;
use app\hander\HelpHander;
use think\App;
use think\Db;
use think\Exception;
use think\exception\Handle;

class Orders extends Base {
    public function __construct(App $app = null) {
        parent::__construct($app);
        $this->model = new \app\common\model\Orders();
    }
    public function lists() {
        $page = input('page', 1);
        $size = input('size', 10);
        $type = input('curOrderMode', 0);
        $list = $this->model->lists($page, $size, $type, $this->userId, $this->orgId);
        HelpHander::success($list);
    }
    public function detail() {
        $orderId = input('orderId', 0);
        $info = $this->model->detail($orderId);
        HelpHander::success($info);
    }
    //获取部门
    public function getDep() {
        $list = model('dep')->getList($this->orgId);
        HelpHander::success($list);
    }
    //发起订单
    public function add() {
        $json = [
            'user_id'=>$this->userId,
            'org_id'=>$this->orgId,
            'dep_id'=>input('depId/d',0),
            'images'=>input('images',''),
            'videos'=>input('videos',''),
            'voices'=>input('voices',''),
            'content'=>input('content',''),
            'work_type_mode'=>input('workTypeMode/d',1),
            'source_type'=>input('sourceType/d',1),
            'type_id'=>input('typeId/d',0),
            'address_id'=>input('addressId/d',0),
            'start'=>input('start',''),
            'end'=>input('end',''),
            'xq_time'=>input('xqTime',''),
            'ywc_time'=>input('ywcTime',''),
            'type'=>input('type',''),
            'device_id'=>input('deviceId',''),
            'priority'=>input('priority',''),
            'bed_number'=>input('bedNumber',''),
            'ba_number'=>input('baNumber',''),
            'p_name'=>input('pName',''),
            'gender'=>input('gender',''),
            'back'=>input('back',''),
            'name'=>input('name',''),
            'phone'=>input('phone',''),
            'isSpontaneous'=>input('isSpontaneous',0),
            'repair_priority'=>input('repairPriority',2),

        ];
        $res = $this->model->addSave($json);
        if (!$res) {
            HelpHander::error($this->model->getError());
        }
        HelpHander::success('操作成功');
    }
    //调度发单
    public function dispatchAdd() {
        $json = [
            'user_id'=>$this->userId,
            'org_id'=>$this->orgId,
            'dep_id'=>input('depId/d',0),
            'images'=>input('images',''),
            'videos'=>input('videos',''),
            'voices'=>input('voices',''),
            'content'=>input('content',''),
            'work_type_mode'=>input('workTypeMode/d',1),
            'userType'=>input('userType/d',0),
            'to_user_id'=>input('toUserId',''),
            'to_roles_id'=>input('toRolesId/d',0),
            'type_id'=>input('typeId/d',0),
            'address_id'=>input('addressId/d',0),
            'source_type'=>input('sourceType/d',1),
            'todo_content'=>input('todoContent',''),
            'start'=>input('start',''),
            'end'=>input('end',''),
            'xq_time'=>input('xqTime',''),
            'ywc_time'=>input('ywcTime',''),
            'type'=>input('type',''),
            'device_id'=>input('deviceId',''),
            'priority'=>input('priority',''),
            'bed_number'=>input('bedNumber',''),
            'ba_number'=>input('baNumber',''),
            'p_name'=>input('pName',''),
            'gender'=>input('gender',''),
            'back'=>input('back',''),
            'name'=>input('name',''),
            'phone'=>input('phone',''),
            'daily_record_id'=>input('dailyRecordId/d',0), // 品质整改,日常工作记录id
            'repair_priority'=>input('repairPriority',1),
            'quality_type'=>input('qualityType/d',0),
            'quality_cate'=>input('qualityCate/d',0),
            'informer_user'=>input('informerUser/d',0),

        ];
        $res = $this->model->addSave($json, 1);
        if (!$res) {
            HelpHander::error($this->model->getError());
        }
        HelpHander::success('操作成功');
    }
    //分配订单
    public function send(){
        $json = [
            'org_id'=>$this->orgId,
            'id'=>input('id/d',0),
            'userType'=>input('userType/d',0),
            'to_user_id'=>input('toUserId',''),
            'to_roles_id'=>input('toRolesId/d',0),
            'type_id'=>input('typeId/d',0),
            'address_id'=>input('addressId/d',0),
            'todo_content'=>input('todoContent',''),
            'work_type_mode'=>input('workTypeMode/d',-1),
            'ba_number'=>input('baNumber','','trim'),
            'back'=>input('back/d',0),
            'bed_number'=>input('bedNumber','','trim'),
            'device_id'=>input('deviceId/d',0),
            'start'=>input('start/d',0),
            'end'=>input('end/d',0),
            'gender'=>input('gender/d',0),
            'name'=>input('name','','trim'),
            'phone'=>input('phone','','trim'),
            'p_name'=>input('pName','','trim'),
            'priority'=>input('priority/d',0),
            'type'=>input('type/d',0),
            'xq_time'=>input('xqTime','','trim'),
            'ywc_time'=>input('ywcTime','','trim'),
            'repair_priority'=>input('repairPriority','','trim'),

        ];
        $res = model('orders')->send($json['id'],$this->userId,$json);
        if(!$res){
            HelpHander::error(model('orders')->getError());
        }
        HelpHander::success('操作成功');
    }
    //转单分配订单
    public function zdSend(){
        $json = [
            'org_id'=>$this->orgId,
            'id'=>input('id/d',0),
            'type_id'=>input('typeId/d',0),
            'address_id'=>input('addressId/d',0),
            'todo_content'=>input('todoContent',''),
            'work_type_mode'=>input('workTypeMode/d',-1),
            'ba_number'=>input('baNumber','','trim'),
            'back'=>input('back/d',0),
            'bed_number'=>input('bedNumber','','trim'),
            'device_id'=>input('deviceId/d',0),
            'start'=>input('start/d',0),
            'end'=>input('end/d',0),
            'gender'=>input('gender/d',0),
            'name'=>input('name','','trim'),
            'phone'=>input('phone','','trim'),
            'p_name'=>input('pName','','trim'),
            'priority'=>input('priority/d',0),
            'type'=>input('type/d',0),
            'xq_time'=>input('xqTime','','trim'),
            'ywc_time'=>input('ywcTime','','trim'),
            'repair_priority'=>input('repairPriority','','trim'),
        ];
        $res = model('orders')->zd_send($json['id'],$json);
        if(!$res){
            HelpHander::error(model('orders')->getError());
        }
        HelpHander::success('操作成功');
    }
    //任务栏工单列表
    public function queryOrderList() {
        $page = input('page', 1);
        $size = input('size', 10);
        $offset = ($page-1)*$size;
        $task = Db::name('task')
            ->where('user_id', $this->userId)
            ->where('org_id', $this->orgId)
            ->where('type', 1)
            ->limit($offset,$size)
            ->order(['priority'=>'desc','id'=>'desc'])
            ->select();
        $workType = [
            1 => '报修工单',
            2 => '保洁工单',
            3 => '运送工单',
            4 => '应急工单',
            15 => '品质整改',
            0 => '一键呼叫',
        ];
        $patrolStatus = [
            0 => '未执行',
            1 => '执行中',
            2 => '已完成',
            3 => '未完成',
            5 => '中断',
        ];
        $list = [];
        foreach ($task as $k => $value) {
            if ($value['type'] == 1) {//工单
                $todoInfo = Db::name('todo')
                    ->where('id', $value['bus_id'])
                    ->where('del',0)
                    ->find();
                if (!empty($todoInfo)) {
                    $data['sn'] = $todoInfo['sn'];
                    $data['title'] = $workType[$todoInfo['work_type_mode']];
                    $data['realName'] = Db::name('user')
                        ->where('id', $todoInfo['create_user_id'])
                        ->value('real_name');
                    $data['create_time'] = $todoInfo['create_time'];
                    $data['status_txt'] = Db::name('todo_mode')
                        ->where('id', $todoInfo['todo_mode'])
                        ->value('out_content');
                    $data['start_time'] = "";
                    $data['end_time'] = "";
                    $data['type'] = 1;
                    $data['bus_id'] = $value['bus_id'];
                    $orderInfo = Db::name('orders')
                        ->where('id',$todoInfo['order_id'])
                        ->find();
                    if($orderInfo['from'] > 0){
                        $from = '';
                        if($orderInfo['from'] == 1){
                            $from = '一键呼叫';
                        }else if($orderInfo['from'] == 2){
                            $from = '隐患预警';
                        }else if($orderInfo['from'] == 3){
                            $from = '投诉';
                        }
                        $data['title'] = $data['title'].'('.$from.')';
                    }
                    $data['patrol_mode'] = 0;
                    $data['status'] = $todoInfo['todo_mode'];
                    $data['work_type_mode'] = $orderInfo['work_type_mode'];

                    if($data['work_type_mode'] == 1 && $todoInfo['todo_mode'] == 2 && $todoInfo['pause'] == 1){ //维修,检查是否挂起
                        $data['status_txt'] = '已挂起';
                    }

                    $data['addressTitle'] = "";
                    $data['typeName'] = "";
                    $data['content'] = $orderInfo['content']?$orderInfo['content']:'';
                    $data['startName'] = "";
                    $data['endName'] = "";
                    if($orderInfo['work_type_mode']==1){
                        $typeInfo = (new \app\common\model\OrderType())
                            ->getTypeByOrderId($orderInfo['id']);
                        if($typeInfo){
                            $order_type = $typeInfo && isset($typeInfo['title']) ? $typeInfo['title'] : '';
                            $order_type_matter = $typeInfo && isset($typeInfo['child_title']) ? $typeInfo['child_title'] : '';
                            $data['typeName'] = $order_type.'/'.$order_type_matter;
                            $data['addressTitle'] = $typeInfo ? $typeInfo['address_title'] : '';
                        }
                    }
                    if($orderInfo['work_type_mode']==3){
                        $oc = Db::name('order_convey')
                            ->where('order_id', $orderInfo['id'])
                            ->find();
                        if($oc){
                            $start_name = Db::name('address')->where('id',$oc['start'])
                                ->value('title');
                            $end_name = Db::name('address')->where('id',$oc['end'])
                                ->value('title');
                            $data['startName'] = $start_name?$start_name:"";
                            $data['endName'] = $end_name?$end_name:"";
                        }
                    }
                    $data['priority'] = $value['priority'];
                    $list[] = $data;
                }
            } elseif($value['type'] == 2) {//巡更巡检
                $patrolInfo = Db::name('patrol_task')
                    ->where('id', $value['bus_id'])
                    ->find();
                if (!empty($patrolInfo)) {
                    $title = Db::name('patrol_mode')
                        ->where('id', $patrolInfo['patrol_mode'])
                        ->value('name');
                    $data['title']  = $patrolInfo['title']?$title.'-'.$patrolInfo['title']:$title;
                    $data['realName'] = "";
                    $data['create_time'] = $patrolInfo['create_time'];
                    $data['status_txt'] = $patrolStatus[$patrolInfo['status']];
                    $data['start_time'] = $patrolInfo['start_time'];
                    $data['end_time'] = $patrolInfo['end_time'];
                    $data['bus_id'] = $value['bus_id'];
                    $data['type'] = 2;
                    $data['work_type_mode'] = 0;
                    $data['patrol_mode'] = $patrolInfo['patrol_mode'];
                    $data['status'] = $patrolInfo['status'];

                    $data['addressTitle'] = "";
                    $data['typeName'] = "";
                    $data['content'] = '';
                    $data['startName'] = "";
                    $data['endName'] = "";
                    $data['priority'] = $value['priority'];

                    $list[] = $data;
                }
            }elseif ($value['type'] == 3){ // 日常工作
                $dailyInfo = Db::name('daily_task')
                    ->where('id', $value['bus_id'])
                    ->find();
                if (!empty($dailyInfo)) {
                    $data['title'] = '日常工作';
                    $data['realName'] = "";
                    $data['create_time'] = $dailyInfo['create_time'];
                    $data['status_txt'] = $patrolStatus[$dailyInfo['status']];
                    $data['start_time'] = $dailyInfo['start_time'];
                    $data['end_time'] = $dailyInfo['end_time'];
                    $data['bus_id'] = $value['bus_id'];
                    $data['type'] = 3;
                    $data['work_type_mode'] = 0;
                    $data['patrol_mode'] = 0;
                    $data['status'] = $dailyInfo['status'];
                    $data['addressTitle'] = "";
                    $data['typeName'] = "";
                    $data['content'] = '';
                    $data['startName'] = "";
                    $data['endName'] = "";
                    $data['priority'] = $value['priority'];

                    $list[] = $data;
                }
            }elseif ($value['type'] == 4){ // 设备台账
                $deviceInfo = Db::name('device_task')
                    ->where('id', $value['bus_id'])
                    ->find();
                if (!empty($deviceInfo)) {
                    $data['title'] = $deviceInfo['title']? '设备维保'.'-'.$deviceInfo['title']:'设备维保';
                    $data['realName'] = "";
                    $data['create_time'] = $deviceInfo['create_time'];
                    $data['status_txt'] = $patrolStatus[$deviceInfo['status']];
                    $data['start_time'] = $deviceInfo['start_time'];
                    $data['end_time'] = $deviceInfo['end_time'];
                    $data['bus_id'] = $value['bus_id'];
                    $data['type'] = 4;
                    $data['work_type_mode'] = 0;
                    $data['patrol_mode'] = 0;
                    $data['status'] = $deviceInfo['status'];
                    $data['addressTitle'] = "";
                    $data['typeName'] = "";
                    $data['content'] = '';
                    $data['startName'] = "";
                    $data['endName'] = "";
                    $data['priority'] = $value['priority'];

                    $list[] = $data;
                }
            }
        }
        $orgGrabOrder = getOrgGrabOrder($this->userId,$this->orgId);
        $r = [
            'list' => $list,
            'count' => count($list),
            'org_grab_order'=>$orgGrabOrder?(int)$orgGrabOrder:0
        ];
        HelpHander::success($r);
    }

    //抢单列表
    public function queryGrabOrders(){
        $page = input('page', 1);
        $size = input('size', 10);
        $list = $this->model->queryGrabOrders($page,$size,$this->userId,$this->orgId);
        HelpHander::success($list);
    }

    // 抢单
    public function grabOrders(){
        $orderId = input('orderId');
        $orderType = input('orderType/d',0);
        $addressId = input('addressId/d',0);

        $order = Db::name('orders')
            ->where('id',$orderId)
            ->where('org_id',$this->orgId)
            ->find();
        if($order['work_type_mode']==1 && empty($orderType)){
            HelpHander::error('报修事项不能为空');

        }
        if(!$order || $order['del'] == 1){
            HelpHander::error('订单不存在');
        }
        if($order['order_mode'] != 1){
            HelpHander::error('订单已被处理');
        }
        $off = (new Config())->getConfig('org_grab_order'.$order['work_type_mode'],$this->orgId);
        if($off !=1){
            HelpHander::error('抢单模式未开启');
        }
        $ret = $this->model->grabOrdersEdit($order,$this->userId,$orderType,$addressId);
        if(!$ret){
            HelpHander::error($this->model->getError());
        }
        HelpHander::success([],'操作成功');

    }

    // 扫标本
    public function scanSample(){
        $orderId = input('orderId/d',0);
        $barcode = input('barcode');
        $addrId = input('addrId/d',0);
        if(!$barcode ){
            HelpHander::error('未传标本码');
        }
        if(!$orderId&&!$addrId){
            HelpHander::error('参数错误');
        }

        if($orderId > 0){
            $orderConvey = Db::name('order_convey')
                ->where('order_id',$orderId)
                ->find();
            $addrId = $orderConvey['start'];
        }
        $res =  Db::name('order_convey_lis')
            ->where('org_id',$this->orgId)
            ->where('order_id',$orderId)
            ->where('barcode',$barcode)
            ->where('user_id',$this->userId)
            ->where('addr_id',$addrId)
           ->find();
        Db::startTrans();
        try{
            if($res){
               $res =  Db::name('order_convey_lis')
                    ->where('id',$res['id'])->update([
                    'create_time' => date('Y-m-d H:i:s')
                ]);
            }else{
                $res = Db::name('order_convey_lis')
                    ->insert([
                    'order_id' => $orderId,
                    'barcode' => $barcode,
                    'user_id' => $this->userId,
                    'create_time' => date('Y-m-d H:i:s'),
                    'org_id' => $this->orgId,
                    'addr_id' => $addrId
                ]);
            }

            if(!$res){
                exception('操作失败');
            }
            Db::commit();
            HelpHander::success([],'操作成功');
        }catch (Exception $e){
            Db::rollback();
            HelpHander::error($e->getMessage());
        }
    }
    //用户订单列表
    public function queryUserOrdersByMode(){
        $page = input('page', 1);
        $size = input('size', 10);
        $mode = input('mode', 0);
        $type = input('type', 0);
        $ret=$this->model->userOrdersByMode($page,$size,$this->userId,$mode,$type,$this->orgId);
        HelpHander::success($ret);
    }
    //用户取消订单
    public function updateOrderModeByUser(){
        $orderId = input('orderId', 0);
        $reason = input('reason', '','trim');
        $ret=$this->model->cancel($orderId,$this->userId,1,$reason);
        $ret?HelpHander::success([],'操作成功'):HelpHander::error($this->model->getError());
    }
    //调度取消订单
    public function updateOrderModeByDispatch(){
        $orderId = input('orderId', 0);
        $reason = input('reason', '');
        if(!$reason){
            HelpHander::error('请填写取消原因');
        }
        $ret=$this->model->cancel($orderId,$this->userId,2,$reason);
        $ret?HelpHander::success([],'操作成功'):HelpHander::error($this->model->getError());
    }
    //调度完成订单
    public function finishOrder(){
        $orderId = input('orderId', 0);
        $ret=$this->model->finish($orderId);
        $ret?HelpHander::success([],'操作成功'):HelpHander::error($this->model->getError());
    }
    //所有订单
    public function queryAllOrder(){
        $page = input('page', 1);
        $size = input('size', 10);
        $workTypeMode = input('workTypeMode/d',-1);
        $currOrderMode = input('currOrderMode');
        $beginTime = input('beginTime');
        $endTime = input('endTime');
        $list = $this->model->queryAllOrder($this->orgId,$page,$size,$workTypeMode,$currOrderMode,$beginTime,$endTime);
        HelpHander::success($list);
    }

    // 工人添加下一站地址
    public function addConveyEnd(){
        $orderId = input('orderId/d',0);
        $addrId = input('addrId/d',0);

        $ret = $this->model->addConveyEnd($this->orgId,$orderId,$addrId);
        if(!$ret){
            HelpHander::error($this->model->getError());
        }
        HelpHander::success([],'成功');
    }

    // 支付运送病人
    public function pay(){
        $id = input('id/d',0);
        $remark = input('remark','','trim');
        $info = Db::name('order_convey_pay')->where('id',$id)->find();
        if(!$info){
            HelpHander::error('订单不存在');
        }
        if($info['status'] == 1){
            HelpHander::error('订单已支付');
        }
        $res = Db::name('order_convey_pay')->where('id',$id)->update([
            'type' => 1,
            'status' => 1,
            'remark' => $remark,
            'pay_time' => date('Y-m-d H:i:s')
        ]);
        if($res){
            HelpHander::success([],'操作成功');
        }else{
            HelpHander::error('操作失败');
        }
    }

    // 扫途径地点
    public function sweepCode(){
        $code = input('code');
        $id = input('id/d',0);
        $ret = model('Orders')->sweepCode($code,$id);
        if(!$ret){
            HelpHander::error(model('Orders')->getError());
        }
        HelpHander::success([],'操作成功');
    }
    //获取可转单类型
    public function orderTransferType(){
        $user = Db::name('user')->where('id',$this->userId)->find();
        $config = model('Config')->getConfig('web_order_transfer_type');
        $modes = $config?explode('|',$config):[];
        if($user['type'] != 1){ // 不是总公司人员
            $roles = Db::name('user_roles')
                ->alias('a')
                ->join('roles b','b.id = a.roles_id')
                ->where('a.user_id',$this->userId)
                ->value('work_type_mode');
            if($roles){
                $modes = explode(',',$roles);
            }
        }
        $map[] = ['type','=',1];
        if($modes){
            $map[] = ['id','in',$modes];
        }else{
            $map[] = ['id','=',-1];
        }
        $workType = Db::name('work_type_mode')
            ->where($map)
            ->field('id,name as title')
            ->select();
        HelpHander::success($workType?$workType:[]);

    }
    //获取待处理已完成已评价订单数量
    public function getOrdersCount(){

        $map[] = ['user_id','=',$this->userId];
        $map[] = ['org_id','=',$this->orgId];
        $map[] = ['del','=',0];
        $a1 = Db::name('orders')
            ->where($map)
            ->where('order_mode',1)
            ->count();
        $dcl = $a1?$a1:0;
        $a2 = Db::name('orders')
            ->where($map)
            ->where('order_mode',5)
            ->count();
        $ywc = $a2?$a2:0;
        $a3 = Db::name('orders')
            ->where($map)
            ->where('order_mode',6)
            ->count();
        $ypj = $a3?$a3:0;
        $data = [
            'dcl'=>$dcl,
            'ywc'=>$ywc,
            'ypj'=>$ypj,
        ];
        HelpHander::success($data);


    }
    //被驳回的数量
    public function rejectCount(){
        $map[] = ['org_id', '=', $this->orgId];
        $map[] = ['del', '=', 0];

        $map2[] = ['todo_mode', '=', 4];

        $auth = get_dispatch_auth($this->userId);
        if (empty($auth)) {
            $map[] = ['work_type_mode', '=', -1];
        }
        else {
            $map[] = ['work_type_mode', 'in', $auth];
        }
        $org_two_dispatch = (new Config())->getConfig('org_two_dispatch',$this->orgId);
        if($org_two_dispatch==0){//二级调度开关关闭

        }else{
            if (check_two_dispatch($this->userId) == 1) {//二级调度角色
                $roles_id = Db::name('user_roles')
                    ->where('user_id',$this->userId)
                    ->value('roles_id');
                $ids = Db::name('dispatch_log')
                    ->where('roles_id', $roles_id)
                    ->whereOr('to_user_id', $this->userId)
                    ->column('order_id');

                  if (empty($ids)) {
                      $map2[] = ['order_id', '=', -1];
                  }else {
                      $map2[] = ['order_id', 'in', $ids];
                  }

            }

        }
        $count = Db::name('todo_view')
            ->where($map)
            ->where($map2)
            ->count();

        HelpHander::success($count);

    }
    //优先级
    public function repair_priority(){
        $a = [
            ['id'=>1,'title'=>"可延缓的"],
            ['id'=>2,'title'=>"普通"],
            ['id'=>3,'title'=>"紧急"],
        ];
        HelpHander::success($a);

    }
    public function userQualityLists() {
        $page = input('page', 1);
        $size = input('size', 10);
        $list = $this->model->userQualityLists($page, $size, $this->userId, $this->orgId);
        HelpHander::success($list);
    }
    public function informerQualityLists() {
        $page = input('page', 1);
        $size = input('size', 10);
        $list = $this->model->informerQualityLists($page, $size, $this->userId, $this->orgId);
        HelpHander::success($list);
    }

    //巡更巡视..一键呼叫发送给自己转成报修单;
    public function addBxOrders(){
        $data = [
            'user_id'=>$this->userId,
            'org_id'=>$this->orgId,
            'dep_id'=>input('depId/d',0),
            'images'=>input('images',''),
            'videos'=>input('videos',''),
            'voices'=>input('voices',''),
            'content'=>input('content',''),
            'work_type_mode'=>input('workTypeMode/d',1),
            'source_type'=>input('sourceType/d',4),
            'type_id'=>input('typeId',0),
            'address_id'=>input('addressId',0),
            'repair_priority'=>input('repairPriority',0),
        ];
        $res = model('Orders')->addBxOrders($data);
        if (!$res) {
            HelpHander::error(model('Orders')->getError());
        }
        HelpHander::success([],'操作成功');

    }


    public function withdraw(){
        $id = input('id');

        $info = Db::name('orders')
            ->where('id',$id)
            ->where('del',0)
            ->where('order_mode',4)
            ->find();
        if(!$info){
            HelpHander::error('参数错误');
        }

        $saveOrder = Db::name('orders')
            ->where('id',$id)
            ->update(['order_mode'=>1,'withdraw_time'=>getTime()]);

        Db::name('todo')->where('order_id',$id)->update(['del'=>1]);

        $todoIds = Db::name('todo')
            ->where('order_id',$id)
            ->where('todo_mode',1)
            ->column('id');

         Db::name('task')
            ->where('type',1)
            ->whereIn('bus_id',$todoIds)
            ->delete();

        if(!$saveOrder){
            HelpHander::error('操作失败');
        }

        HelpHander::success('操作成功');

    }

}