'投诉', 1=>'一键呼叫', 2=>'隐患', ]; public function addSave($info){ $data=[ 'org_id'=>$info['orgId'], 'dep_id'=>$info['depId'], 'create_user_id'=>$info['createUserId'], 'content'=>$info['content'], 'hide'=>$info['hide'], 'images'=>isset($info['images'])?$info['images']:'', 'voices'=>isset($info['voices'])?$info['voices']:'', 'videos'=>isset($info['videos'])?$info['videos']:'', 'create_time'=>getTime(), 'create_yyyy'=>date('Y'), 'create_yyyymm'=>date('Ym'), 'create_yyyymmdd'=>date('Ymd'), 'name'=>isset($info['name'])?$info['name']:'', 'phone'=>isset($info['phone']) ? $info['phone'] :'', ]; if(!$data['content'] && !$data['voices'] && !$data['videos']){ $this->error = '请填写信息'; return false; } $ret = $this->insert($data); return $ret; } public function lists($page,$size,$orgId,$userId){ $list = Db::name($this->table) ->field('id,content,create_time,status,order_id') ->where([ 'del'=>0, 'org_id'=>$orgId, 'create_user_id'=>$userId, ]) ->order('id','desc') ->page($page,$size) ->select(); foreach ($list as $k=>$v){ $list[$k]['status_text'] = $this->formatStatus($v['status'],$v['order_id'],$v['id']); } return $list; } public function alllists($page,$size,$type,$orgId){ $hour = (new Config())->getConfig('org_complain_hour',$orgId); if($hour > 0 && $type == 1){ $endTime = date('Y-m-d H:i:s',time() - $hour*60*60); $map[] = ['create_time','<',$endTime]; $map[] = ['status','=',0]; } $map[] = ['org_id','=',$orgId]; $map[] = ['del','=',0]; $list = Db::name($this->table) ->where($map) ->field('id,content,create_time,status,order_id') ->order('id','desc') ->page($page,$size) ->select(); foreach ($list as $k=>$v){ $list[$k]['status_text'] = $this->formatStatus($v['status'],$v['order_id'],$v['id']); } return $list; } public function formatStatus($status,$orderId,$id){ $statusTxt = ''; if($status == 0){ $statusTxt = '待处理'; }else if($status == 1){ if($orderId > 0){ $info = Db::name('complain') ->where('id',$id) ->find(); if($info['to_from']==0){ $order = Db::name('orders')->where('id',$orderId)->find(); if(in_array($order['order_mode'],[3,5,6])){ $statusTxt = '已处理'; }else{ $statusTxt = '处理中(已转单)'; } }elseif ($info['to_from']==1){ $statusTxt = '已处理(已转单)'; } }else{ $statusTxt = '已处理'; } }else if ($status==2){ $statusTxt = '已评价'; } return $statusTxt; } public function detail($id){ $info = $this ->field('content,create_time,images,voices,videos,create_user_id,org_id,dep_id,note,summary,order_id,status,hide,id,to_from') ->where('id',$id) ->find() ->toArray(); $info['status_text'] = $this->formatStatus($info['status'],$info['order_id'],$info['id']); if($info['order_id'] > 0 && $info['to_from']==0){ $info['work_type_mode'] = Db::name('orders')->where('id',$info['order_id'])->value('work_type_mode'); }else{ $info['work_type_mode'] = 99; } $info['depName'] = Db::name('dep')->where('id',$info['dep_id'])->value('title'); if($info['hide'] == 1){ $info['realName'] = '匿名'; $info['mobile'] = ''; }else{ $user=Db::name('user') ->field('real_name,mobile') ->where('id',$info['create_user_id']) ->find(); if(!$user) { $info['realName'] = ''; $info['mobile'] = ''; } $info['realName']=$user['real_name']; $info['mobile']=$user['mobile']; } $comment = Db::name('comment') ->alias('c') ->join('user u','u.id = c.user_id') ->where('c.from_id',$id) ->where('c.type',16) ->field('c.id,c.score,c.content,c.create_time,u.real_name,u.head_image') ->order('c.id desc') ->select(); $info['comment'] = $comment?$comment:[]; return $info?$info:''; } //派单 public function send($id, $userId, $data) { $complain = Db::name($this->table)->where('id', $id)->where('del',0)->find(); $odata['dep_id'] = $complain['dep_id']; $odata['content'] = $complain['content']; $odata['images'] = $complain['images']; $odata['videos'] = $complain['videos']; $odata['voices'] = $complain['videos']; $odata['source_type'] = 2; $odata['from'] = 3; $odata['user_id'] = $complain['create_user_id']; $odata['order_mode'] = 4; $odata['work_type_mode'] = $data['work_type_mode']; $odata['create_time'] = date('Y-m-d H:i:s'); $odata['send_time'] = date('Y-m-d H:i:s'); $odata['create_yyyy'] = date('Y'); $odata['create_yyyymm'] = date('Ym'); $odata['create_yyyymmdd'] = date('Ymd'); $odata['is_deal'] = 0; $odata['org_id'] = $data['org_id']; $odata['sn'] = get_unique_sn(get_config('sn_prefix')); if($complain['status'] == 1){ $this->error = '该状态不能转单'; return false; } $data['userType'] = isset($data['userType']) ? $data['userType'] : 0; if(!isset($data['work_type_mode']) || $data['work_type_mode'] <0){ $this->error = '请选择转单类型'; return false; } $config = Db::name('config') ->where('name','web_order_transfer_type') ->value('value'); if(empty($config)){ $workType = []; }else{ $workType = explode('|',$config); } if(!in_array($data['work_type_mode'],$workType)){ $this->error = '当前类型不能进行转单'; return false; } if($data['userType']==0){ $data['to_user_id'] = !isset($data['to_user_id'])?$data['to_user_id'.$data['work_type_mode']]:$data['to_user_id']; }else{ $data['to_roles_id'] =!isset($data['to_roles_id'])? $data['to_roles_id'.$data['work_type_mode']]:$data['to_roles_id']; } if ($data['work_type_mode'] == 3) { $result = validate('OrdersConvey')->check($data, []); if (true !== $result) { $this->error = validate('OrdersConvey')->getError(); return false; } } $pusharr = []; // 需要推送给工人 $pushdis = []; // 需要推送给二级调度 if ($data['userType'] == 0) { if (!isset($data['to_user_id']) || empty($data['to_user_id'])) { $this->error = '请选择执行人'; return false; } if ($data['work_type_mode'] == 1) { if (!isset($data['type_id']) || empty($data['type_id'])) { $this->error = '请选择报修事项'; return false; } } } else { if(two_dispatch_off($data['org_id'])!=1){ $this->error = '二级调度开关未开启'; return false; } if (!isset($data['to_roles_id']) || empty($data['to_roles_id'])) { $this->error = '请选择二级调度'; return false; } } $cl_remark = $data['cl_remark']; unset($data['cl_remark']); $this->startTrans(); try { $orderId = Db::name('orders')->insertGetId($odata); if(!$orderId){ \exception('派单失败'); } $order = Db::name('orders')->where('id',$orderId)->find(); $saveComplain = Db::name('complain')->where('id',$id)->update(['order_id'=>$orderId,'note'=>$cl_remark,'status'=>1,'update_time'=>getTime()]); if(!$saveComplain){ \exception('投诉更新失败'); } if(!$order){ $this->error = '派单失败'; return false; } if ($data['userType'] == 0) { $send_user_num = model('Orders')->sendUserNum($data['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); $todoData = [ 'order_id' => $orderId, 'todo_content' => $data['todo_content'], 'create_user_id' => $order['user_id'], 'org_id' => $data['org_id'], 'create_time' => getTime(), 'todo_mode' => 1, 'work_type_mode' => $data['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(), ]; if($order['work_type_mode']==1){ $orderRepair = Db::name('order_repair') ->where('order_id',$orderId) ->find(); $taskData['priority'] = !empty($orderRepair) && $orderRepair['repair_priority']==3?1:0; }else if ($order['work_type_mode']==3){ $order_convey = Db::name('order_convey') ->where('order_id',$orderId) ->find(); $taskData['priority'] = !empty($order_convey) && $order_convey['priority']==3?2:0; } $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 . '派单失败'); } $pusharr[] = [ 'user_id' => $v, 'todo_id' => $res ]; $taskData['user_id'] = $v; $taskData['bus_id'] = $res; $res = Db::name('task') ->insert($taskData); if (!$res) { \exception('执行人:' . $v . '任务保存失败'); } } if($complain['order_id'] > 0){ if($order['from']==3 && $order['is_deal']==0){ $rr = ['order_mode' => 4, 'work_type_mode'=>$data['work_type_mode'],'send_time' => getTime()]; }else{ $rr = ['order_mode' => 4, 'send_time' => getTime()]; } $res = Db::name('orders')->where('id', $orderId) ->update($rr); if (!$res) { \exception('订单更新失败'); } } } else { $pRolesId = explode(',',$data['to_roles_id']); $pp = []; foreach ($pRolesId as $k=>$v){ $logData = [ 'user_id' => $userId, 'to_user_id' =>0, 'create_time' => getTime(), 'content' => isset($data['todo_content']) ? $data['todo_content'] : '', 'order_id' => $orderId, 'roles_id' => $v ]; $pp[] = $logData; } $pushdis = Db::name('user_roles') ->where('roles_id','in',$pRolesId) ->column('user_id'); $res = Db::name('dispatch_log') ->insertAll($pp); if (!$res) { \exception('派发失败'); } if($order['from']==3 && $order['is_deal']==0){ $rrs = ['is_deal' => 1, 'work_type_mode'=>$data['work_type_mode']]; }else{ $rrs = ['is_deal' => 1]; } $res = Db::name('orders')->where('id', $orderId) ->update($rrs); if (!$res) { \exception('订单更新失败'); } } if ($order['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)) { $old = Db::name('order_repair') ->where('order_id', $orderId) ->find(); if ($old) { $rData['update_time'] = getTime(); $res = Db::name('order_repair') ->where('order_id', $orderId) ->update($rData); } else { $rData['order_id'] = $orderId; $res = Db::name('order_repair') ->insert($rData); } if (!$res) { \exception('保存维修扩展失败'); } } }else{ $old = Db::name('order_repair') ->where('order_id', $orderId) ->find(); if ($old) { $res = Db::name('order_repair') ->where('order_id', $orderId) ->delete(); if (!$res) { \exception('删除维修扩展失败'); } } } if($order['from'] == 3 && $order['is_deal']==0){//一键呼叫 转单运送 if ($data['work_type_mode'] == 3) { if (!$data['start'] || !$data['end']) { $this->error = '取件与送达地点不能为空'; return false; } if ($data['start'] == $data['end']) { $this->error = '取件与送达地点不能是同一地点'; return false; } if (!$data['xq_time'] || !$data['ywc_time']) { $this->error = '应完成时间应和需求时间不能为空'; return false; } if ($data['xq_time'] >= $data['ywc_time']) { $this->error = '应完成时间应大于需求时间'; return false; } if (strtotime($data['xq_time']) < time() - 10 * 60) { $this->error = '需求时间已过时'; return false; } if (!$data['type']) { $this->error = '运送类型不能为空'; return false; } if(!$data['name']){ $this->error = '联系人不能为空'; return false; } if(!$data['phone']){ $this->error = '联系人电话不能为空'; return false; } $ysData = array( 'order_id' => $orderId, 'type' => $data['type'], 'start' => $data['start'], 'end' => $data['end'], 'xq_time' => $data['xq_time'], 'ywc_time' => $data['ywc_time'], 'name' => $data['name'], 'phone' => $data['phone'], 'device_id' => isset($data['device_id']) ? (int)$data['device_id'] : 0, 'priority' => empty($data['priority']) ? 0 : $data['priority'] ); $check = Db::name('order_convey') ->where('order_id',$orderId) ->find(); if($check){ Db::name('order_convey') ->where('order_id',$orderId) ->update($ysData); }else{ $oCid = Db::name('order_convey') ->insertGetId($ysData); if (!$oCid) { exception('运送信息保存失败'); } } $conveyCate = Db::name('convey_cate') ->where('id', $data['type']) ->find(); if ($conveyCate['cate'] == 1) { $patient = [ 'order_id' => $orderId, 'bed_number' => isset($data['bed_number']) ? $data['bed_number'] : '', 'name' => isset($data['p_name']) ? $data['p_name'] : '', 'ba_number' => isset($data['ba_number']) ? $data['ba_number'] : '', 'gender' => isset($data['gender']) && !empty($data['gender']) ? $data['gender'] : 0, 'back' => isset($data['back']) && !empty($data['back']) ? $data['back'] : 0, ]; $cp = Db::name('order_convey_patient') ->where('order_id',$orderId) ->find(); if($cp){ Db::name('order_convey_patient') ->where('order_id',$orderId) ->update($patient); }else{ $ocPid = Db::name('order_convey_patient') ->insertGetId($patient); if (!$ocPid) { exception('保存运送病人扩展失败'); } } } }else{ Db::name('order_convey') ->where('order_id',$orderId) ->delete(); Db::name('order_convey_patient') ->where('order_id',$orderId) ->delete(); } } $this->commit(); if($pusharr){ foreach ($pusharr as $k=>$v){ // 极光推送 send_jpush([$v['user_id']],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$v['todo_id']]); } } if($pushdis){ foreach ($pushdis as $k=>$v){ // 极光推送 send_jpush([$v],AppMsg::PUSH_WORKER_ORDER_SEND,'',['id'=>$order['id']]); } } // 极光推送 send_jpush([$order['user_id']],AppMsg::PUSH_USER_ORDER_SEND,'',['id'=>$order['id']]); return true; } catch (Exception $e) { $this->rollback(); $this->error = $e->getMessage(); return false; } } //转单 public function zd_send($id, $data,$userId) { $complain = Db::name($this->table)->where('id', $id)->where('del',0)->find(); if($complain['order_id'] > 0){ $this->error = '该投诉已转单,'; return false; } if($data['work_type_mode']==99){ $odata['org_id'] = $data['org_id']; $odata['dep_id'] = $complain['dep_id']; $odata['content'] = $complain['content']; $odata['images'] = $complain['images']; $odata['videos'] = $complain['videos']; $odata['voices'] = $complain['videos']; $odata['from'] = 2; $odata['create_user_id'] = $complain['create_user_id']; $odata['create_time'] = date('Y-m-d H:i:s'); $odata['create_yyyy'] = date('Y'); $odata['create_yyyymm'] = date('Ym'); $odata['create_yyyymmdd'] = date('Ymd'); $this->startTrans(); try { $orderId = Db::name('hiddendanger')->insertGetId($odata); if (!$orderId) { \exception('隐患订单创建失败'); } $res = $this->where('id',$complain['id']) ->update(['status'=>1,'update_time'=>getTime(), 'hand_user_id'=>$userId,'to_from'=>1,'bus_type'=>2,'order_id'=>$orderId]); if (!$res) { \exception('投诉订单更新失败'); } $this->commit(); return true; }catch (Exception $e) { $this->rollback(); $this->error = $e->getMessage(); return false; } }else{ $odata['dep_id'] = $complain['dep_id']; $odata['content'] = $complain['content']; $odata['images'] = $complain['images']; $odata['videos'] = $complain['videos']; $odata['voices'] = $complain['videos']; $odata['source_type'] = $data['work_type_mode']==0?4:2; $odata['from'] = 3; $odata['user_id'] = $complain['create_user_id']; $odata['order_mode'] = 1; $odata['work_type_mode'] = $data['work_type_mode']; $odata['create_time'] = date('Y-m-d H:i:s'); $odata['send_time'] = date('Y-m-d H:i:s'); $odata['create_yyyy'] = date('Y'); $odata['create_yyyymm'] = date('Ym'); $odata['create_yyyymmdd'] = date('Ymd'); $odata['is_deal'] = 0; $odata['org_id'] = $data['org_id']; $odata['sn'] = get_unique_sn(get_config('sn_prefix')); if($complain['status'] == 1){ $this->error = '该状态不能转单'; return false; } if(!isset($data['work_type_mode']) || $data['work_type_mode'] <0){ $this->error = '请选择转单类型'; return false; } $config = Db::name('config') ->where('name','web_order_transfer_type') ->value('value'); if(empty($config)){ $workType = []; }else{ $workType = explode('|',$config); } if(!in_array($data['work_type_mode'],$workType)){ $this->error = '当前类型不能进行转单'; return false; } if ($data['work_type_mode'] == 3) { $result = validate('OrdersConvey')->check($data, []); if (true !== $result) { $this->error = validate('OrdersConvey')->getError(); return false; } } if ($data['work_type_mode'] == 1) { if (!isset($data['type_id']) || empty($data['type_id'])) { $this->error = '请选择报修事项'; return false; } } $cl_remark = $data['cl_remark']; unset($data['cl_remark']); $this->startTrans(); try { $orderId = Db::name('orders')->insertGetId($odata); if (!$orderId) { \exception('订单更新失败'); } $order = Db::name('orders')->where('id',$orderId)->find(); $saveComplain = Db::name('complain')->where('id',$id)->update(['order_id'=>$orderId,'bus_type'=>1,'note'=>$cl_remark,'status'=>1,'update_time'=>getTime()]); if(!$saveComplain){ \exception('投诉更新失败'); } if($order['work_type_mode'] == 3){ // $score = empty($data['score'])?0:floatval($data['score']); // Db::name('order_convey')->where('order_id',$orderId)->update(['score'=>$score]); } if ($order['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)) { $old = Db::name('order_repair') ->where('order_id', $orderId) ->find(); if ($old) { $rData['update_time'] = getTime(); $res = Db::name('order_repair') ->where('order_id', $orderId) ->update($rData); } else { $rData['order_id'] = $orderId; $res = Db::name('order_repair') ->insert($rData); } if (!$res) { \exception('保存维修扩展失败'); } } }else{ $old = Db::name('order_repair') ->where('order_id', $orderId) ->find(); if ($old) { $res = Db::name('order_repair') ->where('order_id', $orderId) ->delete(); if (!$res) { \exception('删除维修扩展失败'); } } } if ($data['work_type_mode'] == 3) { if (!$data['start'] || !$data['end']) { $this->error = '取件与送达地点不能为空'; return false; } if ($data['start'] == $data['end']) { $this->error = '取件与送达地点不能是同一地点'; return false; } if (!$data['xq_time'] || !$data['ywc_time']) { $this->error = '应完成时间应和需求时间不能为空'; return false; } if ($data['xq_time'] >= $data['ywc_time']) { $this->error = '应完成时间应大于需求时间'; return false; } if (strtotime($data['xq_time']) < time() - 10 * 60) { $this->error = '需求时间已过时'; return false; } if (!$data['type']) { $this->error = '运送类型不能为空'; return false; } // if(!$data['name']){ // $this->error = '联系人不能为空'; // return false; // } // if(!$data['phone']){ // $this->error = '联系人电话不能为空'; // return false; // } $score = empty($data['score'])?0:floatval($data['score']); $ysData = array( 'order_id' => $orderId, 'type' => $data['type'], 'start' => $data['start'], 'end' => $data['end'], 'xq_time' => $data['xq_time'], 'ywc_time' => $data['ywc_time'], 'name' => $data['name'], 'phone' => $data['phone'], 'score' => $score, 'device_id' => isset($data['device_id']) ? (int)$data['device_id'] : 0, 'priority' => empty($data['priority']) ? 0 : $data['priority'] ); $check = Db::name('order_convey') ->where('order_id',$orderId) ->find(); if($check){ Db::name('order_convey') ->where('order_id',$orderId) ->update($ysData); }else{ $oCid = Db::name('order_convey') ->insertGetId($ysData); if (!$oCid) { exception('运送信息保存失败'); } } $conveyCate = Db::name('convey_cate') ->where('id', $data['type']) ->find(); if ($conveyCate['cate'] == 1) { $patient = [ 'order_id' => $orderId, 'bed_number' => isset($data['bed_number']) ? $data['bed_number'] : '', 'name' => isset($data['p_name']) ? $data['p_name'] : '', 'ba_number' => isset($data['ba_number']) ? $data['ba_number'] : '', 'gender' => isset($data['gender']) && !empty($data['gender']) ? $data['gender'] : 0, 'back' => isset($data['back']) && !empty($data['back']) ? $data['back'] : 0, ]; $cp = Db::name('order_convey_patient') ->where('order_id',$orderId) ->find(); if($cp){ Db::name('order_convey_patient') ->where('order_id',$orderId) ->update($patient); }else{ $ocPid = Db::name('order_convey_patient') ->insertGetId($patient); if (!$ocPid) { exception('保存运送病人扩展失败'); } } } }else{ Db::name('order_convey') ->where('order_id',$orderId) ->delete(); Db::name('order_convey_patient') ->where('order_id',$orderId) ->delete(); } $this->commit(); return true; } catch (Exception $e) { $this->rollback(); $this->error = $e->getMessage(); return false; } } } // 投诉已处理推送给投诉人 public function pushCreateUser($orderId,$userId=0){ if($orderId > 0){ $info = Db::name('complain')->where('order_id',$orderId)->where('del',0)->find(); if($info){ send_jpush([$info['create_user_id']],AppMsg::PUSH_COMPLAIN_FINISH); } }else{ if($userId > 0){ send_jpush([$userId],AppMsg::PUSH_COMPLAIN_FINISH); } } } }