Example #1
0
 public function doWebqunsend()
 {
     global $_W, $_GPC;
     checklogin();
     $message = $_GPC['message'];
     if (!empty($message)) {
         $groupid = $_GPC['gid'] ? $_GPC['gid'] : 0;
         $page = intval($_GPC['page']);
         $page = empty($page) ? 0 : $page;
         $imgcode = $_GPC['imgcode'];
         $pagesize = intval($_GPC['pagesize']);
         $pagesize = empty($pagesize) ? 10 : $pagesize;
         //查出48小时内活动过的用户
         $towday = TIMESTAMP - 2 * 86400;
         $alist = pdo_fetchall("SELECT * FROM " . tablename('stat_msg_history') . " WHERE weid = '{$_W['weid']}'  AND  createtime>'{$towday}' GROUP BY from_user  ORDER BY createtime DESC ");
         //增加判断未匹配用户组
         if ($groupid == -1) {
             //不选择分组
             $userlist = pdo_fetchall("SELECT from_user FROM " . tablename('fans') . " WHERE weid = '{$_W['weid']}'  ORDER BY id DESC  LIMIT " . $page . ',' . $pagesize);
             $userlist = array_intersect_assoc($alist, $userlist);
             //$total= pdo_fetchcolumn("SELECT COUNT(*) FROM " . tablename('fans') . " WHERE weid = '{$_W['weid']}' ");
             $total = count($userlist);
             $pageCount = $total / $pagesize - 1 > 1 ? $total / $pagesize - 1 : 1;
             //print_r('total'.$total.'pageCount'.$pageCount);exit;
         } else {
             //按分组发送
             $userlist = pdo_fetchall("SELECT from_user FROM " . tablename('fans') . " WHERE weid = '{$_W['weid']}' AND groupid='{$groupid}' ORDER BY id DESC  LIMIT " . $page . ',' . $pagesize);
             //$total= pdo_fetchcolumn("SELECT COUNT(*) FROM " . tablename('fans') . " WHERE weid = '{$_W['weid']}' AND groupid='{$groupid}'");
             $userlist = array_intersect_assoc($alist, $userlist);
             $pageCount = $total / $pagesize - 1 > 1 ? $total / $pagesize - 1 : 1;
         }
         $tj = '';
         if ($page >= 0 && $pageCount >= $page) {
             if ($groupid == -1) {
                 //高级接口
                 $ms['type'] = 'text';
                 $ms['content'] = $message;
                 foreach ($userlist as $uid) {
                     $reinfo = gjjk_send($ms, $uid);
                     $info = json_decode($reinfo['content'], true);
                     $ts = account_weixin_code($info['errcode']);
                     if ($info['errcode']) {
                         $tj .= '发送给' . $uid['from_user'] . '出错码:' . $info['errcode'] . '错误:' . $ts . '<br />';
                     } else {
                         $tj .= '发送给' . $uid['from_user'] . '成功<br />';
                     }
                 }
             } else {
                 //高级接口
                 $ms['type'] = 'text';
                 $ms['content'] = $message;
                 foreach ($userlist as $uid) {
                     $reinfo = gjjk_send($ms, $uid);
                     $info = json_decode($reinfo['content'], true);
                     $ts = account_weixin_code($info['errcode']);
                     if ($info['errcode']) {
                         $tj .= '发送给' . $uid['from_user'] . '出错码:' . $info['errcode'] . '错误:' . $ts . '<br />';
                     } else {
                         $tj .= '发送给' . $uid['from_user'] . '成功<br />';
                     }
                 }
             }
             if ($pageCount == $page) {
                 message($tj . '本次群发任务结束!', create_url('site/module/qunchat', array('name' => 'kf')), 'success');
             } else {
                 message($tj . '请勿关闭浏览器还在群发中...!', create_url('site/module/qunsend/', array('name' => 'kf')) . '&page=' . ($page + 1) . '&message=' . $message . '&pagesize=' . $pagesize . '&gid=' . $groupid, 'success');
             }
         } else {
             message('参数错误!', create_url('site/module/qunchat', array('name' => 'kf')), 'error');
         }
     } else {
         message('需要发送的内容不能为空!', create_url('site/module/qunchat', array('name' => 'kf')), 'error');
     }
 }
 public function respond()
 {
     global $_W;
     $rid = $this->rule;
     $sql = "SELECT * FROM " . tablename('kf') . " WHERE `rid`=:rid LIMIT 1";
     $row = pdo_fetch($sql, array(':rid' => $rid));
     $message = $this->message;
     $key = $message['content'];
     $lastmessage = TIMESTAMP;
     $user = pdo_fetch("SELECT id,nickname,from_user FROM " . tablename('fans') . " WHERE from_user ='******'from']}'  LIMIT 1");
     $zt = pdo_fetch("SELECT * FROM " . tablename('kf_kflog') . " WHERE oid='{$this->message['from']}' AND weid='{$_W['weid']}' LIMIT 1");
     //搜索自动应答设置
     $kfwenda = pdo_fetchall("SELECT id,name,displayorder,description FROM " . tablename('article_category') . " WHERE parentid ='{$row['cateid']}' AND weid='{$_W['weid']}'");
     //$kfwenda=0;//暂时设定不用自动应答
     //增加查询是否是客服,方便后面设置上下文时长
     $kfuid = pdo_fetch("SELECT uid,formoid,oid FROM " . tablename('kf_kfuser') . " WHERE weid = '{$_W['weid']}' AND oid='{$this->message['from']}'   LIMIT 1 ");
     if ((!$kfwenda || $row['cateid'] == 0) && ($key != '人工' || $key != '客服管理')) {
         //无自动应答,自动开始上下文锁定.
         $kfwenda = 0;
         $this->beginContext($row['timeout']);
         //END
     }
     if (!$this->inContext) {
         //人工服务开始前
         $tips = $this->kfbefore($kfuid['uid'], $user, $kfwenda, $row['wechattype'], $row['timeout']);
         //print_r($tips);exit;
         if (is_array($tips)) {
             return $this->respNews($tips);
         } else {
             return $this->respText($tips);
         }
     } else {
         //开始上下文会话
         $kfu = pdo_fetch("SELECT * FROM " . tablename('kf_kfuser') . " WHERE uid='{$user['id']}' AND  weid = '{$_W['weid']}'   LIMIT 1 ");
         if ($key == '客服管理') {
             //print_r($kfu);pdo_debug();exit;
             if ($kfu) {
                 $_SESSION['kfid'] = $kfu['uid'];
                 $_SESSION['kfzt'] = 1;
                 //设置客服状态,1:空闲,2:锁定,0:离线,但不对外(空OID)发送消息
                 if ($kfu['formoid']) {
                     pdo_update('kf_kfuser', array('kfzt' => 2), array('uid' => $_SESSION['kfid']));
                     $workid = pdo_fetch("SELECT workid FROM " . tablename('kf_work') . " WHERE oid='{$kfu['formoid']}' AND  weid = '{$_W['weid']}' ORDER BY ctime DESC  LIMIT 1 ");
                     $_SESSION['workid'] = $workid['workid'];
                 } else {
                     pdo_update('kf_kfuser', array('kfzt' => 1, 'formoid' => 0), array('uid' => $_SESSION['kfid']));
                 }
                 //增加客服在线状态
                 if ($row['wechattype']) {
                     $data = array('uid' => $user['id'], 'oid' => $this->message['from'], 'wxusr' => $user['nickname'], 'lastmessage' => $lastmessage, 'type' => 'kf', 'weid' => $_W['weid']);
                 } else {
                     $data = array('uid' => $user['fakeid'], 'oid' => $this->message['from'], 'wxusr' => $user['nickname'], 'lastmessage' => $lastmessage, 'type' => 'kf', 'weid' => $_W['weid']);
                 }
                 /*客户人员就不放入在线用户了
                           		 //下面执行插入用户在线状态数据。
                 		
                 		if(!$zt){
                 			pdo_insert('fans_status', $data);
                 		}
                 		else
                 		{
                 			$joinuid=$data['uid'];
                 			unset($data['uid']);
                 			pdo_update('fans_status', $data,array('uid'=>$joinuid));
                 		}
                 		$onlineuser=pdo_fetchall("SELECT uid FROM ".tablename('fans_status')." WHERE  WEID='{$_W['weid']}' AND type='kf' ");
                 		cache_write('kf:'.$_W['weid'], $onlineuser);
                 		//客服在线状态增加完成
                 		*/
                 return $this->respText('亲爱的' . $user['nickname'] . '您已经进入客服管理平台,请保持在线,等待用户发送消息过来。若已经下班,请输入:[下线]退出客服管理');
             } else {
                 //pdo_debug();exit;
                 return $this->respText('亲爱的' . $user['nickname'] . '您不是客服人员,不能进行此操作!');
             }
         }
         if ($key == '再见' && $_SESSION['kfid'] && $kfuid) {
             //更新客服的状态为在线非锁定(当然暂时只有高级号才有这操作)
             $kfusr = pdo_fetch("SELECT * FROM " . tablename('kf_kfuser') . " WHERE weid = '{$_W['weid']}' AND uid='{$_SESSION['kfid']}'   LIMIT 1 ");
             gjjk_send($message, $kfusr['formoid']);
             pdo_update('kf_kfuser', array('kfzt' => 1, 'formoid' => 0), array('uid' => $_SESSION['kfid']));
             $_SESSION['kfzt'] = 1;
             unset($_SESSION['workid']);
             return $this->respText('亲爱的' . $user['nickname'] . '您已经断开和该用户的对话状态!');
         }
         if ($key == '下线' && $_SESSION['kfid'] && $kfuid) {
             $kfusr = pdo_fetch("SELECT * FROM " . tablename('kf_kfuser') . " WHERE weid = '{$_W['weid']}' AND uid='{$_SESSION['kfid']}'   LIMIT 1 ");
             if ($kfuid) {
                 gjjk_send($message, $kfusr['formoid']);
                 pdo_update('kf_kfuser', array('kfzt' => 0, 'formoid' => 0), array('uid' => $user['id']));
                 $this->endContext();
                 return $this->respText('亲爱的' . $user['nickname'] . '您已经进下线成功。');
             } else {
                 return $this->respText('亲爱的' . $user['nickname'] . '您不是客服人员,不能进行此操作!');
             }
         }
         //END高级帐号的客服管理
         if ($key == '人工' && !$_SESSION['RG']) {
             //$this->beginContext(1200);
             //若无自动应答,或者用户选择了输入人工,则执行下面的操作
             //作了高级认证号权限和非权限号判断来处理用户信息记录
             $_SESSION['RG'] = 1;
             $workid = 'kf' . $_W['weid'] . '_' . random(3) . TIMESTAMP . random(5, 1);
             $_SESSION['workid'] = $workid;
             //查询该用户有没有在日志表中有记录,未用增加,有更新来访次数
             $kflog = pdo_fetch("SELECT * FROM " . tablename('kf_kflog') . " WHERE oid ='{$this->message['from']}' AND weid='{$_W['weid']}' LIMIT 1");
             if ($kflog) {
                 $datalog['num'] = $kflog['num'] + 1;
                 $datalog['lasttime'] = $lastmessage;
                 $datalog['bak'] = '第' . ($kflog['num'] + 1) . '来访';
                 $datalog['status'] = 1;
                 pdo_update('kf_kflog', $datalog, array('oid' => $this->message['from'], 'weid' => $_W['weid']));
             } else {
                 $datalog['oid'] = $this->message['from'];
                 $datalog['num'] = 1;
                 $datalog['cattype'] = 'new';
                 //默认为新客户分类,具体客户类别在模块设置里面设置
                 $datalog['bak'] = '初次来访';
                 $datalog['lasttime'] = $lastmessage;
                 $datalog['weid'] = $_W['weid'];
                 $datalog['status'] = 1;
                 pdo_insert('kf_kflog', $datalog);
             }
             if ($row['wechattype']) {
                 $data = array('uid' => $user['id'], 'oid' => $this->message['from'], 'wxusr' => $user['nickname'], 'lastmessage' => $lastmessage, 'type' => 'kf', 'weid' => $_W['weid']);
             } else {
                 $data = array('uid' => $user['fakeid'], 'oid' => $this->message['from'], 'wxusr' => $user['nickname'], 'lastmessage' => $lastmessage, 'type' => 'kf', 'weid' => $_W['weid']);
             }
             /*原来的用户在线状态取消
                         	//下面执行插入用户在线状态数据。
             		//$zt = pdo_fetch("SELECT uid,lastmessage,type FROM ".tablename('fans_status')." WHERE uid ='{$data['uid']}' AND weid='{$_W['weid']}' LIMIT 1");
             		if(!$zt){
             			pdo_insert('fans_status', $data);
             		}else{
             			$joinuid=$data['uid'];
             			unset($data['uid']);
             			pdo_update('fans_status', $data,array('uid'=>$joinuid));
             		}
             		$onlineuser=pdo_fetchall("SELECT uid FROM ".tablename('fans_status')." WHERE  WEID='{$_W['weid']}' AND type='kf' ");
             		cache_write('kf:'.$_W['weid'], $onlineuser);
             		*/
             //高级帐号才执行此操作
             if ($row['wechattype']) {
                 //查询在线客服
                 $kfuser = pdo_fetchall("SELECT * FROM " . tablename('kf_kfuser') . " WHERE  WEID='{$_W['weid']}' AND kfzt=1 limit 0,30 ");
                 if (!$kfuser) {
                     //无客服时返回:分是客服进入还是非客服进入时回复不同内容
                     if (!empty($kfuid)) {
                         $tips = "\n请发送[ 客服管理 ],进行客服工作.";
                     } else {
                         $tips = "\n对不起暂时没有客服空闲,请等待,\n或者请发送:【退出】,作其他操作。下次再来";
                     }
                     //$_SESSION['kfid']=$user['id'];
                     $workdata = array('workid' => $workid, 'oid' => $this->message['from'], 'kfid' => $kfuid, 'status' => 0, 'weid' => $_W['weid'], 'ctime' => TIMESTAMP);
                 } else {
                     //有客服时回复
                     foreach ($kfuser as $u) {
                         $kf[] = $u['uid'];
                     }
                     // print_r($kf);
                     $kfid = $kf[array_rand($kf)];
                     $tips = ' 工号:' . $kfid . "为您服务,请问有什么需要我帮您的呢?\n\n如果您觉得不需要人工服务,请发送:【退出】";
                     //设定客服状态为锁定服务状态
                     $datakf = array('kfzt' => 2, 'formoid' => $user['from_user']);
                     pdo_update('kf_kfuser', $datakf, array('uid' => $kfid));
                     $_SESSION['kfid'] = $kfid;
                     $message['type'] = 'text';
                     $message['content'] = "用户:" . $user['nickname'] . "请求您人工帮助,快给他打招呼吧\n如果回复内容出现其他系统自动回复,非提示回户用户成功!\n请重新发送:[ 客服 ]  再发送 [ 客服管理 ] \n 就能正常给用户回复内容了。 ";
                     $kfusr = pdo_fetch("SELECT * FROM " . tablename('kf_kfuser') . " WHERE weid = '{$_W['weid']}' AND uid='{$kfid}'   LIMIT 1 ");
                     //print_r($kfuser.'OID:'.$kfusr['oid']);
                     $reinfo = gjjk_send($message, $kfusr['oid']);
                     $workdata = array('workid' => $workid, 'oid' => $this->message['from'], 'kfid' => $kfid, 'status' => 0, 'weid' => $_W['weid'], 'ctime' => TIMESTAMP);
                 }
                 pdo_insert('kf_work', $workdata);
             }
             //END高级权限号操作
             return $this->respText('亲爱的' . $user['nickname'] . $tips);
         }
         if ($key == '退出' || $key == '再见' && !$kfuid) {
             if ($_SESSION['RG']) {
                 $datalog['lasttime'] = TIMESTAMP;
                 $datalog['status'] = 0;
                 $status = pdo_update('kf_kflog', $datalog, array('oid' => $this->message['from']));
             } else {
                 $status = 1;
             }
             if ($status) {
                 //更新客服的状态为在线非锁定(当然暂时只有高级号才有这操作)
                 if ($_SESSION['RG'] && !$kfuid) {
                     //不是客服才执行退出命令
                     pdo_update('kf_kfuser', array('kfzt' => 1, 'formoid' => 0), array('uid' => $_SESSION['kfid']));
                     $kfusr = pdo_fetch("SELECT * FROM " . tablename('kf_kfuser') . " WHERE weid = '{$_W['weid']}' AND uid='{$_SESSION['kfid']}'   LIMIT 1 ");
                     gjjk_send($message, $kfusr['oid']);
                 }
                 $this->endContext();
                 return $this->respText($row['send_tips']);
             } else {
                 //$this->endContext();
                 return $this->respText('退出操作失败,重新发送[退出]');
             }
         }
         //高级帐号才执行此操作
         //以下执行的是进入人工或者客服管理模式后,用户间发送消息处理
         if ($_SESSION['kfid']) {
             $kfusr = pdo_fetch("SELECT * FROM " . tablename('kf_kfuser') . " WHERE weid = '{$_W['weid']}' AND uid='{$_SESSION['kfid']}'   LIMIT 1 ");
             $usr = pdo_fetch("SELECT nickname,id,from_user FROM " . tablename('fans') . " WHERE weid = '{$_W['weid']}' AND from_user='******'formoid']}'   LIMIT 1 ");
             if ($kfusr['uid'] == $user['id']) {
                 //如果发来消息的OID和客服OID相等就为客服人员发送的消息
                 if ($kfusr['formoid']) {
                     if (empty($_SESSION['workid'])) {
                         $workid = pdo_fetch("SELECT workid FROM " . tablename('kf_work') . " WHERE oid='{$kfusr['formoid']}' AND  weid = '{$_W['weid']}' ORDER BY ctime DESC  LIMIT 1 ");
                         $_SESSION['workid'] = $workid['workid'];
                     }
                     $message['content'] = $kfusr['nickname'] . "说:" . $message['content'];
                     $reinfo = gjjk_send($message, $kfusr['formoid']);
                     $ts = '发送给用户:' . $usr['nickname'] . '的消息>';
                     //更新工单状态为受理
                     pdo_update('kf_work', array('status' => 1), array('workid' => $_SESSION['workid']));
                 } else {
                     //如果暂时没有客户咨询,回复
                     $ts = '暂时未有客户咨询,请等待……';
                 }
                 //如果发送成功就插入客服消息状态到历史消息记录
                 $histroy = array('weid' => $_W['weid'], 'module' => $kfusr['nickname'] . '工号' . $kfusr['uid'], 'from_user' => $kfusr['formoid'], 'rid' => intval($this->params['rule']), 'kid' => $this->keyword['id'], 'type' => 'wxlkf', 'createtime' => $this->message['time']);
                 $kfmessage = array('workid' => $_SESSION['workid'], 'oid' => $kfusr['formoid'], 'type' => 'kf', 'messagecat' => $this->message['type'], ctime => $this->message['time'], 'kfid' => $kfusr['uid'], 'weid' => $_W['weid']);
             } else {
                 //用户发送给客服的消息
                 $message['content'] = $user['nickname'] . "说:" . $message['content'];
                 $reinfo = gjjk_send($message, $kfusr['oid']);
                 $ts = '发送给客服:' . $kfusr['uid'] . '的消息>';
                 $kfmessage = array('workid' => $_SESSION['workid'], 'oid' => $this->message['from'], 'type' => 'usr', 'messagecat' => $this->message['type'], ctime => $this->message['time'], 'kfid' => $kfusr['uid'], 'weid' => $_W['weid']);
             }
             //转化消息结口发送消息结果。
             if ($reinfo) {
                 $info = json_decode($reinfo['content'], true);
                 $message2 = account_weixin_code($info['errcode']);
                 $msg = array('ret' => $info['errcode'], 'message' => $message2);
                 if (!$info['errcode']) {
                     //$msg=array('ret'=>0,'message'=>'成功');
                     //转化其他消息类(非文本)型内容
                     switch ($this->message['type']) {
                         case 'image':
                             $content = $this->message['picurl'];
                             break;
                         case 'location':
                             $content = iserializer(array('x' => $this->message['location_x'], 'y' => $this->message['location_y']));
                             break;
                         case 'link':
                             $content = iserializer(array('title' => $this->message['title'], 'description' => $this->message['description'], 'link' => $this->message['link']));
                             break;
                         case 'event':
                             $content = iserializer(array('event' => $this->message['event'], 'key' => $this->message['eventkey']));
                             break;
                         default:
                             $content = $this->message['content'];
                     }
                     $kfmessage['content'] = $content;
                     pdo_insert('kf_statmessage', $kfmessage);
                     //下面为照顾旧版插入客服消息到历史消息记录表。
                     if (!empty($histroy) && is_array($histroy)) {
                         $histroy['message'] = $content;
                         pdo_insert('stat_msg_history', $histroy);
                     }
                 }
             }
             if ($_SESSION['RG'] || $_SESSION['kfzt']) {
                 //用户已经在客服或者人工状态且SESSION未超时回复
                 //print($ts.$msg['message']);
                 return $this->respText($ts . $msg['message']);
             }
             //增加判断超时,执行用户在线信息.
             if (!empty($row['timeout']) && $row['timeout'] > 0 && TIMESTAMP - $zt['lasttime'] >= $row['timeout']) {
                 $this->endContext();
                 $datalog['lasttime'] = TIMESTAMP;
                 $datalog['status'] = 0;
                 $status = pdo_update('kf_kflog', $datalog, array('oid' => $this->message['from']));
                 if ($status) {
                     //更新客服的状态为在线非锁定(当然暂时只有高级号才有这操作)
                     pdo_update('kf_kfuser', array('kfzt' => 1, 'formoid' => 0), array('uid' => $_SESSION['kfid']));
                 }
                 return $this->respText('由于您长时间未操作,请重新发送:客服  重新进入系统!');
             }
             //用户超时
             return $this->respText('请发送[人工]或者[客服管理]后再进行操作');
         }
         //用户在客服或者人工服务状态下操作完成.
         //如果未进入该状态.发送提示为以下操作
         //如果直接输入客服,需要作的应答.
         //print_r($kfwenda);
         $tips2 = $this->kfbefore($kfuid['uid'], $user, $kfwenda, $row['wechattype'], $row['timeout']);
         if (is_array($tips2)) {
             return $this->respNews($tips2);
         } else {
             return $this->respText($tips2);
         }
     }
 }