| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057 | <?phpnamespace app\common\model;use app\common\util\AppMsg;use app\hander\HelpHander;use think\Db;use think\Exception;class Todo extends Base{    public $table = 'todo';    public function formatTodo($v){        $v['order_type'] = '';        $v['order_type_matter'] = '';        $v['address_title'] = '';        $v['repair_priority'] = '';        if($v['work_type_mode']==1){            $typeInfo =  (new \app\common\model\OrderType())                ->getTypeByOrderId($v['order_id']);            $v['order_type'] = isset($typeInfo['title'])?$typeInfo['title']:'';            $v['order_type_matter'] = isset($typeInfo['child_title'])?$typeInfo['child_title']:'';            $v['address_title'] = isset($typeInfo['address_title'])?$typeInfo['address_title']:'';            $v['repair_priority'] = isset($typeInfo['repair_priority'])?$typeInfo['repair_priority']:'';            $v['bx_sign'] = Db::name('todo')->where('id',$v['id'])->value('sign');        }        $v['work_type_mode_text'] = $this->getTableField('work_type_mode', ['id'=>$v['work_type_mode']], 'name');        $v['real_name'] = $this->getTableField('user',['id'=>$v['create_user_id']],'real_name');        $v['pause_cost'] = '';        if(!empty($v['pause_time']) && !empty($v['pause_end']) && $v['todo_mode']==3){             if(!empty($v['confirm_time'])){                 $v['time_cost'] = $this->getM1($v['done_time'],$v['confirm_time'],$v['pause_end'],$v['pause_time']);             }else{                 $v['time_cost'] = '';             }            $v['pause_cost'] = $this->getM($v['pause_time'],$v['pause_end']);        }else{            $v['time_cost'] = $v['todo_mode']==3 && !empty($v['confirm_time'])?$this->getM($v['done_time'],$v['confirm_time']):'';        }        $pDep = '';        $depInfo = Db::name('dep')            ->where('id',$v['dep_id'])            ->find();        if($depInfo){            $pDep = Db::name('dep_cate')                ->where('id',$depInfo['cate_id'])                ->value('title');        }        $v['dep_cate_name'] = $pDep;        $v['source_type_text'] =$v['from']>0? isset(model('Orders')->source_type[$v['from']])?model('Orders')->source_type[$v['from']]:'':$this->getTableField('work_type_mode', ['id' => $v['work_type_mode']], 'name');        $v['dispatch_time'] = $this->getM($v['to_create_time'],$v['create_time']);        $v['jiedan_time'] = !empty($v['confirm_time'])?$this->getM($v['confirm_time'],$v['to_create_time']):'';        $orderInfo = Db::name('orders')            ->where('id',$v['order_id'])            ->find();        $v['dep'] = $this->getTableField('dep', ['id'=>$orderInfo['dep_id']], 'title');        $v['order_info'] = model('orders')->formatOrder($orderInfo,1);        if($v['work_type_mode']==3){            $oc = Db::name('order_convey')                ->where('order_id',$v['order_id'])                ->find();            $oc['type_name']=$v['type_name'] = isset($oc['type'])?$this->getTableField('convey_cate',['id'=>$oc['type']],'title'):"";            $oc['start_name']=$v['start_name'] = isset($oc['start'])?$this->getTableField('address',['id'=>$oc['start']],'title'):"";            $oc['end_name'] =$v['end_name'] =isset($oc['end'])?$this->getTableField('address',['id'=>$oc['end']],'title'):'';            $oc['device_name']= $v['device_name'] = isset($oc['device_id'])?$this->getTableField('convey_device',['id'=>$oc['device_id']],'title'):'';            $v['xq_time'] = isset($oc['xq_time'])?$oc['xq_time']:'';            $v['ywc_time'] = isset($oc['ywc_time'])?$oc['ywc_time']:"";            $v['oc'] = $oc;            $v['ocp'] = [];            $cate =  isset($oc['type'])?$this->getTableField('convey_cate',['id'=>$oc['type']],'cate'):'';            if($cate==1){                $ocp = Db::name('order_convey_patient')                    ->where('order_id',$v['order_id'])                    ->find();                $v['ocp'] = $ocp;            }        }        $pauseList = [];        if($v['todo_mode']==2 && $v['pause']==1){            $ll = Db::name('todo_puase')                ->where('todo_id',$v['id'])                ->select();            foreach ($ll as $pp=>$dd) {                $pauseList[$pp]['content'] = $dd['reason'];                $pauseList[$pp]['timestamp'] = $dd['create_time'];                $pauseList[$pp]['color'] ='#0bbd87';            }        }        $v['pauseList'] = $pauseList;        return $v;    }    public function newFormatTodo($v){        $v['order_type'] = '';        $v['order_type_matter'] = '';        $v['address_title'] = '';        $v['repair_priority'] = '';        if($v['work_type_mode']==1){            $typeInfo =  (new \app\common\model\OrderType())                ->getTypeByOrderId($v['order_id']);            $v['order_type'] = isset($typeInfo['title'])?$typeInfo['title']:'';            $v['order_type_matter'] = isset($typeInfo['child_title'])?$typeInfo['child_title']:'';            $v['address_title'] = isset($typeInfo['address_title'])?$typeInfo['address_title']:'';            $v['repair_priority'] = isset($typeInfo['repair_priority'])?$typeInfo['repair_priority']:'';            $v['bx_sign'] = Db::name('todo')->where('id',$v['id'])->value('sign');        }        $v['work_type_mode_text'] = $this->getTableField('work_type_mode', ['id'=>$v['work_type_mode']], 'name');        $v['real_name'] = $this->getTableField('user',['id'=>$v['create_user_id']],'real_name');        $v['pause_cost'] = '';        if(!empty($v['pause_time']) && !empty($v['pause_end']) && $v['todo_mode']==3){            if(!empty($v['confirm_time'])){                $v['time_cost'] = $this->getM1($v['done_time'],$v['confirm_time'],$v['pause_end'],$v['pause_time']);            }else{                $v['time_cost'] = '';            }            $v['pause_cost'] = $this->getM($v['pause_time'],$v['pause_end']);        }else{            $v['time_cost'] = $v['todo_mode']==3 && !empty($v['confirm_time'])?$this->getM($v['done_time'],$v['confirm_time']):'';        }        $pDep = '';        $depInfo = Db::name('dep')            ->where('id',$v['dep_id'])            ->find();        if($depInfo){            $pDep = Db::name('dep_cate')                ->where('id',$depInfo['cate_id'])                ->value('title');        }        $v['dep_cate_name'] = $pDep;        $v['source_type_text'] =$v['from']>0? isset(model('Orders')->source_type[$v['from']])?model('Orders')->source_type[$v['from']]:'':$this->getTableField('work_type_mode', ['id' => $v['work_type_mode']], 'name');        $v['dispatch_time'] = $this->getM($v['to_create_time'],$v['create_time']);        $v['jiedan_time'] = !empty($v['confirm_time'])?$this->getM($v['confirm_time'],$v['to_create_time']):'';        $orderInfo = Db::name('orders')            ->where('id',$v['order_id'])            ->find();        $v['dep'] = $this->getTableField('dep', ['id'=>$orderInfo['dep_id']], 'title');        if($v['work_type_mode']==3){            $oc = Db::name('order_convey')                ->where('order_id',$v['order_id'])                ->find();            $oc['type_name']=$v['type_name'] = isset($oc['type'])?$this->getTableField('convey_cate',['id'=>$oc['type']],'title'):"";            $oc['start_name']=$v['start_name'] = isset($oc['start'])?$this->getTableField('address',['id'=>$oc['start']],'title'):"";            $oc['end_name'] =$v['end_name'] =isset($oc['end'])?$this->getTableField('address',['id'=>$oc['end']],'title'):'';            $oc['device_name']= $v['device_name'] = isset($oc['device_id'])?$this->getTableField('convey_device',['id'=>$oc['device_id']],'title'):'';            $v['xq_time'] = isset($oc['xq_time'])?$oc['xq_time']:'';            $v['ywc_time'] = isset($oc['ywc_time'])?$oc['ywc_time']:"";            $v['oc'] = $oc;            $v['ocp'] = [];            $cate =  isset($oc['type'])?$this->getTableField('convey_cate',['id'=>$oc['type']],'cate'):'';            if($cate==1){                $ocp = Db::name('order_convey_patient')                    ->where('order_id',$v['order_id'])                    ->find();                $v['ocp'] = $ocp;            }        }//        $pauseList = [];//        if($v['todo_mode']==2 && $v['pause']==1){//            $ll = Db::name('todo_puase')//                ->where('todo_id',$v['id'])//                ->select();//            foreach ($ll as $pp=>$dd) {//                $pauseList[$pp]['content'] = $dd['reason'];//                $pauseList[$pp]['timestamp'] = $dd['create_time'];//                $pauseList[$pp]['color'] ='#0bbd87';//            }//        }//        $v['pauseList'] = $pauseList;        return $v;    }    public function apiFormatTodo($v){        $v['work_type_mode_text'] = $this->getTableField('work_type_mode', ['id'=>$v['work_type_mode']], 'name');        $v['todo_mode_text'] = $this->getTableField('todo_mode', ['id'=>$v['todo_mode']], 'out_content');        $v['real_name'] = $this->getTableField('user',['id'=>$v['to_user_id']],'real_name');        $v['time_cost'] = $v['todo_mode']==3 && !empty($v['confirm_time'])?$this->getM($v['done_time'],$v['confirm_time']):'';        $v['confirm_time'] = $v['confirm_time']?$v['confirm_time']:"";        $v['done_time'] = $v['done_time']?$v['done_time']:"";        $orderInfo = Db::name('orders')            ->where('id',$v['order_id'])            ->find();        $v['dep'] = $this->getTableField('dep', ['id'=>$orderInfo['dep_id']], 'title');        return $v;    }    public function getM($do,$cof){        $diff = strtotime($do) - strtotime($cof);        $days = floor(($diff )/ (60*60*24));        $hours = floor(($diff - $days*60*60*24)  / (60*60));        $minutes = floor(($diff - $days*60*60*24  - $hours*60*60)/ 60);        $seconds = floor(($diff - $days*60*60*24  - $hours*60*60 - $minutes*60));        if ($diff < 60) {            $time_cost = $seconds."秒";        } else if ($diff >= 60 && $diff < 60*60) {            $time_cost = $minutes."分钟".$seconds."秒";        } else if ($diff >= 60*60 && $diff < 60*60*24) {            $time_cost = $hours."小时".$minutes."分钟".$seconds."秒";        } else {            $time_cost = $days."天".$hours."小时".$minutes."分钟".$seconds."秒";        }        return $time_cost;    }    public function getM1($do,$cof,$e,$a){        $diff = strtotime($do) - strtotime($cof);        $aa = strtotime($e) - strtotime($a);        $diff = $diff-$aa;        $days = floor(($diff )/ (60*60*24));        $hours = floor(($diff - $days*60*60*24)  / (60*60));        $minutes = floor(($diff - $days*60*60*24  - $hours*60*60)/ 60);        $seconds = floor(($diff - $days*60*60*24  - $hours*60*60 - $minutes*60));        if ($diff < 60) {            $time_cost = $seconds."秒";        } else if ($diff >= 60 && $diff < 60*60) {            $time_cost = $minutes."分钟".$seconds."秒";        } else if ($diff >= 60*60 && $diff < 60*60*24) {            $time_cost = $hours."小时".$minutes."分钟".$seconds."秒";        } else {            $time_cost = $days."天".$hours."小时".$minutes."分钟".$seconds."秒";        }        return $time_cost;    }    // 检查工单状态变化后续的操作    public function checkToDo($orderId,$todoId,$todoMode){        $list = Db::name('todo')            ->where('todo_mode','in',array(1,2,4))            ->where('order_id',$orderId)            ->where('id','<>',$todoId)            ->where('del',0)            ->field('todo_mode')            ->select();        $todoInfo = Db::name('todo')            ->where('id',$todoId)            ->find();        Db::name('task')            ->where('bus_id', $todoId)            ->where('user_id', $todoInfo['to_user_id'])            ->where('type', 1)            ->delete();        if($list){            return true; //不需要修改        }        if($todoMode == 3){ // 完成            $res = Db::name('orders')                ->where('id',$orderId)->update([                'order_mode' => 5,                'finish_time' => date('Y-m-d H:i:s')            ]);            if(!$res){                return false;            }            $this->finishTodoPush($orderId,$todoId);            return true;        }else if ($todoMode==5){//无法完成            $check = Db::name('todo')                ->where('todo_mode',3)                ->where('order_id',$orderId)                ->where('id','<>',$todoId)                ->field('todo_mode')                ->find();            if($check){                $res = Db::name('orders')                    ->where('id',$orderId)->update([                        'order_mode' => 5,                        'finish_time' => date('Y-m-d H:i:s')                    ]);                if($res){                    $this->finishTodoPush($orderId,$todoId);                    return true;                }                return false;            }else{                $res = Db::name('orders')                    ->where('id',$orderId)                    ->update(['order_mode'=>7,'update_time'=>getTime()]);                if($res){                    return true;                }                return false;            }        } else { //取消            $res = Db::name('orders')                ->where('id',$orderId)->update([                'order_mode' =>3,            ]);            return $res?true:false;        }    }    public function finishTodoPush($orderId,$todoId){        $todoInfo = Db::name('todo')            ->where('id',$todoId)            ->find();        // 投诉完成推送        model('Complain')->pushCreateUser($orderId,0);        // 是病人运送订单且需要收费时需要生成,缴费单        // 检查运送收费开发是否开启        $ysoff = model('Config')->getConfig('org_ys_switch',$todoInfo['org_id']);        $money1 = model('Config')->getConfig('org_ys_init_money',$todoInfo['org_id']);        $money2 = model('Config')->getConfig('org_ys_lj_money',$todoInfo['org_id']);        $money1 = $money1?$money1:0;        $money2 = $money2?$money2:0;        if($ysoff){            // 检查订单是不是病人运送            $convey = Db::name('order_convey')                ->alias('a')                ->join('convey_cate b','a.type = b.id')                ->where('a.order_id',$orderId)                ->where('b.cate',1)                ->field('a.*')                ->find();            if($convey){                $count = Db::name('order_convey_end')->where('order_convey_id',$convey['id'])->count();                $money = round($money1 + $count*$money2,2);                if($money > 0){                    $ret = Db::name('order_convey_pay')->insert([                        'sn' => get_unique_id('YS'),                        'org_id' => $todoInfo['org_id'],                        'order_id' => $convey['order_id'],                        'order_convey_id' => $convey['id'],                        'money' => $money,                        'status' => 0,                        'create_time' => date('Y-m-d H:i:s'),                        'type' => 0                    ]);                    if(!$ret){                        return false;                    }                }            }        }    }    public function cancel($id,$reason){        $info = $this->where('id',$id)->find();        if (!$info) {            $this->error='工单不存在';            return false;        }        if (!in_array($info['todo_mode'], array(1, 2, 4))) {            $this->error='此状态不能取消工单';            return false;        }        $this->startTrans();        try {            if ($info['todo_mode'] == 1 || $info['todo_mode'] == 2) {                $mode = 6;            } else {                $mode = 7;            }            $ret = $this->where('id', $id)->update(['todo_mode'=>$mode,'cancel_reason'=>$reason]);            if (!$ret) {                exception('工单状态修改失败');            }            $ret = $this->checktodo($info['order_id'],$id,6);            if(!$ret){                exception('订单修改失败');            }            $this->commit();            return true;        } catch (Exception $e) {            $this->rollback();            $this->error=$e->getMessage();            return false;        }    }    public function finish($id){        $info = $this->where('id',$id)->find();        if (!$info) {            $this->error='工单不存在';            return false;        }        if (!in_array($info['todo_mode'], array(1, 2))) {            $this->error='此状态不能完成工单';            return false;        }        $this->startTrans();        try {            $curTime = date('Y-m-d H:i:s');            $cfTime = $info['confirm_time'];            $sData = array(                'todo_mode' => 3,                'done_time' => $curTime,            );            if($info['todo_mode'] == 1){                $cfTime = $sData['confirm_time'] = $info['create_time'];            }            $wc_time = time() - strtotime($cfTime);            $sData['wc_time'] = $cfTime?$wc_time:0;            $ret = $this->where('id',$id)->update($sData);            if(!$ret){                 exception('操作失败');            }            $ret = $this->checktodo($info['order_id'],$info['id'],3);            if(!$ret){                exception('订单修改失败');            }            $this->commit();            return true;        } catch (Exception $e) {            $this->rollback();            $this->error=$e->getMessage();            return false;        }    }    //后台重新分配    public function send($id,$userId,$data){        $info = Db::name('todo_view')->where('id',$id)->find();        if(!$info||$info['org_id']!=$data['org_id']){            $this->error='订单不存在';            return false;        }        if(!in_array($info['todo_mode'],array(4))){            $this->error='此状态不能重新下发任务';            return false;        }        if($info['order_mode'] != 4){            $this->error='订单已完成不能重新下发任务';            return false;        }        if(!isset($data['to_user_id'])||empty($data['to_user_id'])){            $this->error='请选择执行人';            return false;        }        $send_user_num = (new Orders())->sendUserNum($info['work_type_mode'],$data['org_id']);        $users = explode(',', $data['to_user_id']);        if($send_user_num==1 && count($users) >1){            $this->error = '执行人只能选择单人';            return false;        }        $to_user_id = array_unique($users);        $todo = array();        $this->startTrans();        try{            //todo::订单状态暂时不做修改            //取消驳回的订单            $res = $this                ->where('id',$id)->update(['todo_mode'=>7]);            if(!$res){                 exception('订单状态更改失败');            }            $todoData = [                'order_id' => $info['order_id'],                'todo_content' => $data['todo_content'],                'create_user_id' => $userId,                'org_id' => $data['org_id'],                'create_time' => getTime(),                'todo_mode' => 1,                'work_type_mode' => $info['work_type_mode'],                'create_yyyy' => date('Y'),                'create_yyyymm' => date('Ym'),                'create_yyyymmdd' => date('Ymd'),            ];            $taskData=[                'org_id'=>$data['org_id'],                'type'=>1,                'start_time'=>getTime(),                'create_time'=>getTime(),            ];            $pusharr =[];            $sns = [];            foreach ($to_user_id as $k => $v) {                if(empty($v)){                    continue;                }                $todoData['to_user_id'] = $v;                $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));                while (true){                    if(in_array($todoData['sn'],$sns)){                        $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));                    }else{                        $sns[] = $todoData['sn'];                        break;                    }                }                $res = Db::name('todo')                    ->insertGetId($todoData);                if (!$res){                    \exception('执行人:'.$v.'派单失败');                }                $taskData['user_id'] = $v;                $taskData['bus_id'] = $res;                $res = Db::name('task')                    ->insert($taskData);                if (!$res){                    \exception('执行人:'.$v.'任务保存失败');                }                $pusharr[] = [                    'user_id'=>$v,                    'todo_id'=>$res                ];            }            $res = Db::name('orders')->where('id',$info['order_id'])                ->update(['order_mode'=>4,'send_time'=>getTime()]);            if (!$res){                \exception('订单更新失败');            }            if($info['work_type_mode']==1){//报修订单                $rData = [];                if(isset($data['type_id']) && !empty($data['type_id'])){                    $rData['type_id'] = $data['type_id'];                }                if(isset($data['address_id']) && !empty($data['address_id'])){                    $rData['address_id'] = $data['address_id'];                }                if(!empty($rData)){                    $rData['order_id'] = $info['order_id'];                    Db::name('order_repair')                        ->where('order_id',$info['order_id'])->delete();                    $res = Db::name('order_repair')                        ->insert($rData);                    if(!$res){                        \exception('保存维修扩展失败');                    }                }            }            $this->commit();            if($pusharr){                foreach ($pusharr as $k=>$v){                    // 极光推送                    send_jpush([$v['user_id']],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$v['todo_id']]);                }            }            return true;        }catch (Exception $e){            $this->rollback();            $this->error=$e->getMessage();            return false;        }    }    //api 工单列表    public function lists($page,$size,$userId,$orgId,$type){        $offset = ($page-1)*$size;        if($type==1){//已完成            $map[] = ['org_id','=',$orgId];            $map[] = ['del','=',0];            $map[] = ['to_user_id','=',$userId];            $map[] = ['todo_mode','=',3];            $list = $this->where($map)                ->limit($offset,$size)                ->order('id','desc')                ->select();            $list = $list?$list->toArray():[];        }else if ($type==2){//已评价            $list = Db::name('todo')                ->alias('a')                ->join('orders b','b.id=a.order_id','left')                ->where('a.to_user_id',$userId)                ->where('a.del',0)                ->where('b.del',0)                ->where('a.org_id',$orgId)                ->where('b.order_mode',6)                ->field('a.*')                ->order('a.id','desc')                ->limit($offset,$size)                ->select();        }else if ($type==0){//所有            $list = Db::name('todo')                ->alias('a')                ->join('orders b','b.id=a.order_id','left')                ->where('a.to_user_id',$userId)                ->where('a.del',0)                ->where('b.del',0)                ->where('a.org_id',$orgId)                ->where(function ($query){                    $query->where('a.todo_mode', 3)->whereor('b.order_mode', 6);                })                ->field('a.*')                ->order('a.id','desc')                ->limit($offset,$size)                ->select();        }        $n = [];        foreach ($list as $k=>$v){            $a= $this->apiFormatTodo($v);            $n[] = formatArray(                [                    'id',                    'confirm_time',                    'done_time',                    'work_type_mode',                    'sn'                ]                , $a);        }        return $n;    }    //api工单详情    public function apiDetail($todoId){        $info = Db::name('todo_view')->where('id',$todoId)            ->find();        if(empty($info)){            HelpHander::error('工单信息不存在');        }        $order = Db::name('orders')            ->where('id',$info['order_id'])            ->find();        $orderInfo = (new Orders())->apiFormatOrder($order,1,$todoId);        if($order['work_type_mode'] == 3){            // 地点路径            $conveyends = Db::name('order_convey_end')                ->alias('a')                ->join('address b','b.id = a.addr')                ->where('a.order_id',$order['id'])                ->order('a.id asc')                ->field('a.id,a.addr,b.title,a.scan,a.create_time,a.update_time')                ->select();            $orderInfo['ends'] = $conveyends?$conveyends:[];            $payinfo = [                'is_pay' => 0,                'id' => 0,                'url' => '',                'money' => 0,                'remark' => '',                'type' => 1,                'pay_time' => '',            ];            // 是否需要支付            $pay = Db::name('order_convey_pay')->where('order_id',$order['id'])->find();            if($pay){                $payinfo['is_pay'] = $pay['status'] == 0?0:1;                $payinfo['url'] = url('h5/Index/pay',['id'=>$pay['id']],false,true);                $payinfo['money'] = round($pay['money'],2);                $payinfo['remark'] = $pay['remark'];                $payinfo['pay_time'] = $pay['pay_time']?$pay['pay_time']:'';                $payinfo['id'] = $pay['id'];            }            $orderInfo['pay'] = $payinfo;        }        return $orderInfo;    }    //处理驳回订单    public function createNtbo($todoId,$toUserIdArray,$todoContent,$userId,$typeId,$addressId){        $todo=$this            ->where('id',$todoId)->find();        if(!$todo || $todo['del'] == 1){            $this->error = '工单不存在';            return false;        }        if($todo['todo_mode'] != 4){            $this->error = '无权限分配订单';            return false;        }        if(!isset($toUserIdArray)||empty($toUserIdArray)){            $this->error='请选择执行人';            return false;        }        $send_user_num = (new Orders())->sendUserNum($todo['work_type_mode'],$todo['org_id']);        $users = explode(',', $toUserIdArray);        if($send_user_num==1 && count($users) >1){            $this->error = '执行人只能选择单人';            return false;        }        $to_user_id = array_unique($users);        $this->startTrans();        try{            $res = $this                ->where('id',$todoId)->update(['todo_mode'=>7]);            if(!$res){                \exception('订单状态更改失败');            }            if($todo['work_type_mode']==1){//报修订单                $rData = [];                if(!empty($typeId) && $typeId>0 ){                    $rData['type_id'] =$typeId;                }                if(!empty($addressId) && $addressId>0){                    $rData['address_id'] = $addressId;                }                if(!empty($rData)){                    $rData['order_id'] = $todo['order_id'];                    Db::name('order_repair')                        ->where('order_id',$todo['order_id'])->delete();                    $res = Db::name('order_repair')                        ->insert($rData);                    if(!$res){                        \exception('保存维修扩展失败');                    }                }            }            $todoData = [                'order_id' => $todo['order_id'],                'todo_content' => $todoContent,                'create_user_id' => $userId,                'org_id' => $todo['org_id'],                'create_time' => getTime(),                'todo_mode' => 1,                'work_type_mode' => $todo['work_type_mode'],                'create_yyyy' => date('Y'),                'create_yyyymm' => date('Ym'),                'create_yyyymmdd' => date('Ymd'),            ];            $taskData=[                'org_id'=>$todo['org_id'],                'type'=>1,                'start_time'=>getTime(),                'create_time'=>getTime(),            ];            $sns = [];            foreach ($to_user_id as $k => $v) {                if(empty($v)){                    continue;                }                $todoData['to_user_id'] = $v;                $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));                while (true){                    if(in_array($todoData['sn'],$sns)){                        $todoData['sn'] = get_unique_sn(get_config('sn_prefix'));                    }else{                        $sns[] = $todoData['sn'];                        break;                    }                }                $res = Db::name('todo')                    ->insertGetId($todoData);                if (!$res){                    \exception('执行人:'.$v.'派单失败');                }                $taskData['user_id'] = $v;                $taskData['bus_id'] = $res;                $res = Db::name('task')                    ->insert($taskData);                if (!$res){                    \exception('执行人:'.$v.'任务保存失败');                }                // 极光推送                send_jpush([$v],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$res]);            }            $this->commit();            return true;        }catch (Exception $e){            $this->rollback();            return false;        }    }    //修改工单状态 4 驳回 5客观原因    public function updateState($todoId,$todoMode,$nodoReason,$userId,$rejectVoice){        $todo = $this            ->where('id',$todoId)            ->where('del',0)            ->find();        if(!$todo){            $this->error = '工单不存在';            return false;        }        if($todoMode == 4){ // 驳回            if($todo['todo_mode']!==1){                $this->error = '当前状态不能驳回';                return false;            }            $this->startTrans();            try{                $ret = $this                    ->where('id',$todoId)                    ->update(['todo_mode'=>$todoMode,                        'nodo_reason'=>$nodoReason,                        'reject_voice'=>$rejectVoice,                        'reject_time' => date('Y-m-d H:i:s')]);                if(!$ret){                    \exception('操作失败');                }                Db::name('task')                    ->where('org_id',$todo['org_id'])                    ->where('user_id',$userId)                    ->where('type',1)                    ->where('bus_id',$todoId)                    ->delete();                $this->commit();            }catch (Exception $e){                $this->rollback();                $this->error = $e->getMessage();                return false;            }        }else if($todoMode == 2){            if($todo['todo_mode']!==1){                $this->error = '当前状态不能领取';                return false;            }            $XY_TIME = time() - strtotime($todo['create_time']);            $ret = $this->where('id',$todoId)->update([                'todo_mode'=>$todoMode,                'confirm_time' => date('Y-m-d H:i:s'),                'xy_time' => $XY_TIME            ]);//            $todoIds = Db::name('todo')//                ->where('id','<>',$todoId)//                ->where('order_id','=',$todo['order_id'])//                ->column('id');//            if(!empty($todoIds)){//                $r = Db::name('todo')//                    ->where('id','in',$todoIds)//                    ->delete();//                Db::name('task')//                    ->where('bus_id', 'in', $todoIds)//                    ->where('type', 1)//                    ->delete();//                if(!$r){//                    $this->error = '操作失败';//                    return false;//                }//            }            if(!$ret){                $this->error = '操作失败';                return false;            }        }else if($todoMode == 6){ // 取消驳回工单            $this->startTrans();            try{                $ret = $this                    ->where('id',$todoId)                    ->update(['todo_mode'=>$todoMode,                        'cancel_reason' => $nodoReason]);                if(!$ret){                  \exception('订单错误失败');                }                $ret = $this->checkToDo($todo['order_id'],$todoId,$todoMode);                if(!$ret){                     \exception('订单修改失败');                }                Db::name('task')                    ->where('org_id',$todo['org_id'])                    ->where('user_id',$userId)                    ->where('type',1)                    ->where('bus_id',$todoId)                    ->delete();                $this->commit();            }catch (Exception $e){                $this->rollback();                $this->error = $e->getMessage();                return false;            }        }        return true;    }    // 工人完成提交任务/无法完成    public function finishTodo($todoId,$todoMode,$content,$userId,$images,$consItems,$sign){        $todo = $this            ->where('id',$todoId)            ->where('del',0)->find();        if(!$todo){            $this->error = '工单不存在';            return false;        }        if($todo['to_user_id'] != $userId || $todo['todo_mode'] != 2){            $this->error = '无权限操作';            return false;        }        if($todo['work_type_mode']== 1 && $todo['todo_mode'] == 2 && $todo['pause'] == 1){            $this->error = '工单正在挂起,无法完成';            return false;        }        if($todo['work_type_mode']==1 && $todoMode==3){           $off =(new Config())->getConfig('org_sign',$todo['org_id']);           if($off==1 && empty($sign)){               $this->error = '请上传签名';               return false;           }        }        $this->startTrans();        try{            if($todo['pause'] == 2){                $ct = strtotime($todo['confirm_time']);                $pst = strtotime($todo['pause_time']);                $pet = strtotime($todo['pause_end']);                $WC_TIME = ($pst - $ct) + time()-$pet;            }else{                $WC_TIME = time() - strtotime($todo['confirm_time']);            }            $curTime = date('Y-m-d H:i:s');            $ret = $this                ->where('id',$todoId)->update([                'nodo_reason' => $content,                'images' => $images,                'todo_mode' => $todoMode,                'done_time' => $curTime,                'wc_time' => $WC_TIME,                'sign' => $sign            ]);            if(!$ret){               \exception('工单修改失败');            }            if($todoMode == 3 && $consItems){ // 工单完成且有耗材               $consItems = json_decode($consItems,true);               $mate = [                   'todo_id'=>$todoId,                   'order_id'=>$todo['order_id'],                   'org_id'=>$todo['org_id'],                   'user_id'=>$userId,                   'create_time'=>getTime()               ];               $todo_mate_id = Db::name('todo_mate')                   ->insertGetId($mate);               if(!$todo_mate_id){                   \exception('订单使用物品记录失败');               }               $items = [];               foreach ($consItems as $k=>$v){                   $itemInfo = Db::name('mate_goods')                       ->where('id',$v['itemsId'])                       ->find();                   if($itemInfo['nums'] < $v['total']){                       \exception($itemInfo['title'].' 库存不足');                   }                   $items[] = [                       'todo_mate_id'=>$todo_mate_id,                       'items_id'=>$v['itemsId'],                       'total'=>$v['total'],                       'create_time'=>getTime(),                       'user_id'=>$userId,                       'money'=>$itemInfo['price'],                       'total_money'=>$itemInfo['price']*$v['total'],                   ];                   $res = Db::name('mate_goods')                       ->where('id',$v['itemsId'])                       ->setDec('nums',$v['total']);                   if(!$res){                       \exception($itemInfo['title'].' 数量修改失败');                   }               }               $res = Db::name('todo_mate_item')                   ->insertAll($items);                if(!$res){                    \exception('物品使用记录失败');                }            }            $ret = $this->checkToDo($todo['order_id'],$todoId,$todoMode);            Db::name('task')                ->where('bus_id', '=', $todoId)                ->where('type', 1)                ->delete();            if(!$ret){             \exception('订单修改失败');            }            $this->commit();        }catch (Exception $e){            $this->error = $e->getMessage();            $this->rollback();            return false;        }        return true;    }    //获取物品列表    public function getMateGoods($orgId,$userId,$title,$page,$size){        $map[] = ['org_id','=',$orgId];        $map[] = ['enable','=',1];        $map[] = ['del','=',0];        if($title){            $map[] = ['title','like','%'.$title.'%'];        }        $offset = ($page-1)*$size;        $list = (new MateGoods())->getList($offset,$size,$map,'id desc');        $a = [];        foreach ($list as $k=>$v){            $user_cons = Db::name('user_cons')                ->where('user_id',$userId)                ->where('goods_id',$v['id'])                ->find();            $v['is_fav'] = $user_cons?1:0;            $a[] = formatArray([                'id','price','nums','title','spec','is_fav'            ],$v);        }        return $a;    }    //收藏/取消收藏    public function favGoods($userId,$type,$goodsId){        if($type==0){            $res = Db::name('user_cons')                ->where('goods_id',$goodsId)                ->where('user_id',$userId)                ->delete();        }else{            if(Db::name('user_cons')                ->where('goods_id',$goodsId)                ->where('user_id',$userId)->find()){                HelpHander::error('该物品已收藏');            }            $res = Db::name('user_cons')                ->insertGetId([                    'goods_id'=>$goodsId,                    'user_id'=>$userId,                ]);        }        return $res;    }    //收藏物品列表    public function favList($userId,$title){        if($title){            $map[] = ['b.title','like','%'.$title.'%'];        }        $map[] = ['a.user_id','=',$userId];        $map[] = ['b.enable','=',1];        $map[] = ['b.del','=',0];        $list = Db::name('user_cons')            ->alias('a')            ->join('mate_goods b','a.goods_id = b.id')            ->where($map)            ->order('a.id desc')            ->field('b.*')            ->select();        $a = [];        foreach ($list as $k=>$v){            $a[] = formatArray([                'id','price','nums','title','spec',            ],$v);        }        return $a;    }}
 |