675 lines
20 KiB
PHP
675 lines
20 KiB
PHP
<?php
|
||
|
||
namespace app\robot\controller\api;
|
||
set_time_limit(0);
|
||
ini_set('memory_limit', '512M');
|
||
ini_set('default_socket_timeout', -1); //不超时
|
||
use app\channel\service\ChannelService;
|
||
use app\merchant\service\OrderService;
|
||
|
||
use app\merchant\service\MerchantService;
|
||
use app\gateway\service\RedisService;
|
||
|
||
|
||
use app\order\service\Kami91OrderService;
|
||
use app\order\service\OrderService as Order;
|
||
use dever\Log;
|
||
use think\exception\HttpResponseException;
|
||
use think\facade\Db;
|
||
use think\migration\command\migrate\Breakpoint;
|
||
|
||
|
||
class Qqbot extends Core
|
||
{
|
||
# 是否检测数据
|
||
protected bool $check = false;
|
||
protected $redis = false;
|
||
|
||
# 查询接口 一般用于查询数据,同步执行
|
||
|
||
public function upOrderExpireTime()
|
||
{
|
||
$orderService = OrderService::instance();
|
||
|
||
$field = "order_id,param";//需要数据库返回的字段
|
||
|
||
$data = $orderService->db()->field($field)->whereNull('expire_time')->select()->toArray();
|
||
// print_r($data);die;
|
||
if ($data) {
|
||
foreach ($data as $key => $value) {
|
||
$value['param'] = json_decode($value['param'], true);
|
||
if(!isset($value['param']['expireTime'] )){
|
||
continue;
|
||
}
|
||
// $timeout = $value['param']['expireTime'];
|
||
|
||
$timeout = date('Y-m-d H:i:s', intval($value['param']['expireTime'] / 1000));
|
||
$where = array('order_id' => $value['order_id']);
|
||
$data = array('expire_time' => $timeout);
|
||
$orderService->db()->where($where)->update($data);
|
||
// print_r($data);die;
|
||
// array_push($redisData,$orders[$key]['account']);
|
||
}
|
||
}
|
||
|
||
return 'ok';
|
||
}
|
||
|
||
public function timeout_order()
|
||
{
|
||
#发送群聊消息
|
||
$url = 'send_group_msg';
|
||
|
||
#
|
||
$param = array();
|
||
#TODO 从数据库中获取
|
||
$param['group_id'] = '885760890';#群组号
|
||
$needField = ['account'];
|
||
|
||
$atqq = '389839316';#需要艾特的qq
|
||
$time = '6'; #超时拦截时间
|
||
//
|
||
$get_timeout_order = $this->transOrder($time);
|
||
|
||
// $get_timeout_order = $this->transOrder();
|
||
|
||
|
||
if (!$get_timeout_order) {
|
||
// Log::write('robot', 'qqbot', '无');
|
||
// Log::write($key, $name, $content)
|
||
die;
|
||
}
|
||
|
||
|
||
$param['message'] = "[CQ:at,qq=" . $atqq . "] 以下为超过42小时订单 \r " . $get_timeout_order;
|
||
|
||
|
||
$send = $this->send($url, $param);
|
||
|
||
|
||
Log::write('robot', 'qqbot', $send);
|
||
|
||
return $send;
|
||
|
||
|
||
}
|
||
|
||
/**
|
||
*$params:发给的机器人字段数组格式;$type=true判断是否在缓存中,false不判断全部返回
|
||
* */
|
||
public function transOrder($time){
|
||
$this->redis();
|
||
$where=[['status','=',4],['cid','=','2'],['expire_time','<=',date('Y-m-d H:i:s',time()+$time*60*60)]];
|
||
|
||
|
||
$field = "order_id,account";//需要数据库返回的字段
|
||
|
||
|
||
$orders = $this->getNeedOrder($where, $field);
|
||
|
||
$redisData=[];
|
||
if($orders){
|
||
foreach($orders as $key=>$value){
|
||
if(!$this->redis->get('rediskey-'.$orders[$key]['order_id'])){
|
||
array_push($redisData,$orders[$key]['account']);
|
||
$this->redis->set('rediskey-'.$orders[$key]['order_id'],'1',30*60);
|
||
}
|
||
if(!$this->redis->get('rediskey-1H-'.$orders[$key]['order_id']) && $time == '1'){
|
||
array_push($redisData,$orders[$key]['account']);
|
||
$this->redis->set('rediskey-1H-'.$orders[$key]['order_id'],'1',30*60);
|
||
}
|
||
if(!$this->redis->get('rediskey-TOP-'.$orders[$key]['order_id']) && $time == '0.5'){
|
||
array_push($redisData,$orders[$key]['order_id']);
|
||
$this->redis->set('rediskey-TOP-'.$orders[$key]['order_id'],'1',30*60);
|
||
}
|
||
}
|
||
}
|
||
return $redisData ? implode("\n", $redisData) : '';
|
||
}
|
||
|
||
protected function redis()
|
||
{
|
||
if (!$this->redis) {
|
||
$this->redis = RedisService::getInstance();
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @return array|bool
|
||
*/
|
||
public function getNeedOrder($where,$field)
|
||
{
|
||
$orderService = OrderService::instance();
|
||
|
||
$data = $orderService->db()->field($field)->where($where)->select()->toArray();
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
*
|
||
*/
|
||
public function send($url, $param)
|
||
{
|
||
$geturl = 'http://127.0.0.1:7374/' . $url;
|
||
$header['Content-Type'] = 'application/x-www-form-urlencoded';
|
||
return $this->curl('post', $geturl, http_build_query($param), false, $header);
|
||
|
||
}
|
||
// public function timeout_order()
|
||
// {
|
||
// #发送群聊消息
|
||
// $url = 'send_group_msg';
|
||
//
|
||
// #
|
||
// $param = array();
|
||
// $param['group_id'] = '248553382';#群组号
|
||
// $needField = ['account'];
|
||
//
|
||
// $atqq = '389839316';#需要艾特的qq
|
||
// $time = '6'; #超时拦截时间
|
||
//
|
||
// $get_timeout_order = $this->transOrder($time);
|
||
//
|
||
//
|
||
// if(!$get_timeout_order){
|
||
//// Log::write('robot', 'qqbot', '无');
|
||
//// Log::write($key, $name, $content)
|
||
// die;
|
||
// }
|
||
//
|
||
//
|
||
//
|
||
// $param['message'] = "[CQ:at,qq=".$atqq."] 以下为超过42小时订单 \r ".$get_timeout_order;
|
||
//
|
||
//
|
||
// $send = $this->send($url, $param);
|
||
//
|
||
//
|
||
// Log::write('robot', 'qqbot', $send);
|
||
//
|
||
// return $send;
|
||
//
|
||
//
|
||
// }
|
||
|
||
public function timeout_order1()
|
||
{
|
||
#发送群聊消息
|
||
$url = 'send_group_msg';
|
||
|
||
#
|
||
$param = array();
|
||
$param['group_id'] = '248553382';#群组号
|
||
$needField = ['account'];
|
||
|
||
$atqq = '389839316';#需要艾特的qq
|
||
$time = '1'; #超时拦截时间
|
||
$atqq1 = '530979976';#需要艾特的qq1
|
||
|
||
$get_timeout_order = $this->transOrder($time);
|
||
|
||
|
||
if(!$get_timeout_order){
|
||
// Log::write('robot', 'qqbot', '无');
|
||
// Log::write($key, $name, $content)
|
||
die;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
$param['message'] = "[CQ:at,qq=".$atqq."][CQ:at,qq=".$atqq1."] 以下为1小时内超时订单,请第一时间处理 \r ".$get_timeout_order;
|
||
|
||
|
||
$send = $this->send($url, $param);
|
||
|
||
|
||
Log::write('robot', 'qqbot', $send);
|
||
|
||
return $send;
|
||
|
||
|
||
}
|
||
public function timeout_order2()
|
||
{
|
||
#发送群聊消息
|
||
$url = 'send_group_msg';
|
||
|
||
#
|
||
$param = array();
|
||
$param['group_id'] = '248553382';#群组号
|
||
$needField = ['account'];
|
||
|
||
$atqq = '389839316';#需要艾特的qq
|
||
$time = '0.5'; #超时拦截时间
|
||
$atqq1 = '530979976';#需要艾特的qq1
|
||
$atqq2 = '1438565523';#技术核实
|
||
|
||
$get_timeout_order = $this->transOrder($time);
|
||
|
||
// $get_timeout_order ='测试';
|
||
if(!$get_timeout_order){
|
||
// Log::write('robot', 'qqbot', '无');
|
||
// Log::write($key, $name, $content)
|
||
die;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
$param['message'] = "[CQ:at,qq=".$atqq."][CQ:at,qq=".$atqq1."][CQ:at,qq=".$atqq2."] 以下为半小时内超时订单,异常订单,请核实 \r ".$get_timeout_order;
|
||
|
||
|
||
$send = $this->send($url, $param);
|
||
|
||
|
||
Log::write('robot', 'qqbot', $send);
|
||
|
||
|
||
|
||
return $send;
|
||
|
||
|
||
}
|
||
|
||
#回调消息处理
|
||
|
||
public function notify()
|
||
{
|
||
$input = input();
|
||
|
||
|
||
Log::write('robot', 'qqbot', $input);
|
||
var_dump($input);
|
||
die;
|
||
if (isset($input['group_id']) && $input['group_id'] = '300904161' && isset($input['message']['0']['data']['qq']) && $input['message']['0']['qq'] = '3093978570') {
|
||
$sju = $input['message']['1']['data']['text'];
|
||
if (strlen($phone) != 11) {
|
||
return false;
|
||
}
|
||
if (preg_match("/^1[3456789]{1}[0-9]{9}$/", $phone)) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
|
||
|
||
$reply = array(
|
||
'reply' => '已经登记拦截'
|
||
);
|
||
// print_r(json_encode($ksorderfk));exit;
|
||
|
||
throw new HttpResponseException(json($reply));
|
||
|
||
}
|
||
|
||
}
|
||
|
||
#手机状态监控
|
||
public function phoneInfo()
|
||
{
|
||
#发送群聊消息
|
||
$url = 'get_device_battery';
|
||
#
|
||
$param = array();
|
||
$send = $this->send($url, $param);
|
||
$data = json_decode($send, true);
|
||
|
||
if ($data['status'] == 'ok') {
|
||
#更新电池状态
|
||
#TODO
|
||
if ($data['data']['battery'] <= '20') {
|
||
#判断如果电池电量小于20,则发送钉钉机器人提醒。
|
||
|
||
}
|
||
|
||
} else {
|
||
#状态不为ok,发送钉钉机器人预警,并且记录日志
|
||
}
|
||
|
||
return 'ok';
|
||
|
||
}
|
||
|
||
public function msg()
|
||
{
|
||
$input = input();
|
||
// throw new HttpResponseException(json($input));
|
||
// $msg = explode(' ',$input['content']);
|
||
// var_dump($msg);die;
|
||
|
||
// Log::write('robot', 'qqbot_gf', $input);
|
||
$data = [];
|
||
|
||
if(empty($input['group_openid'])){
|
||
$data['code'] = '-1';
|
||
$data['msg'] ='不存在群组';
|
||
throw new HttpResponseException(json($data));
|
||
}
|
||
|
||
Log::write('robot', 'qqbot_gf', $input);
|
||
|
||
// die;
|
||
if($input['group_openid'] != '31E0BF28DE768188138E82A3C9CB8E86'){
|
||
#判断群组是否正确
|
||
$data['code'] = '-2';
|
||
$data['msg'] ='群组错误';
|
||
throw new HttpResponseException(json($data));
|
||
}
|
||
|
||
$msg = explode(' ',$input['content']);
|
||
|
||
Log::write('robot', 'qqbot_gf', $msg);
|
||
|
||
|
||
if(empty($msg)){
|
||
$data['code'] = '-3';
|
||
$data['msg'] ='消息错误';
|
||
throw new HttpResponseException(json($data));
|
||
}
|
||
|
||
if(isset($msg[0]) && $msg[0] == '/申请拦截' ){
|
||
if (preg_match("/^1[3456789]{1}[0-9]{9}$/", $msg[1])) {
|
||
|
||
$where=[['account','=',$msg[1]],['status','=','4']];
|
||
|
||
|
||
$field = "order_id,cid,mid,status";//需要数据库返回的字段
|
||
|
||
|
||
$orderService = OrderService::instance();
|
||
|
||
$orders = $orderService->db()->field($field)->where($where)->select()->toArray();
|
||
$num = '0';
|
||
|
||
|
||
if (!$orders) {
|
||
|
||
$where=['account'=> $msg[1]];
|
||
|
||
$orderdata = $orderService->db()->field($field)->where($where)->find();
|
||
if($orderdata){
|
||
if($orderdata['status'] == '2'){
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] =$msg[1] .'订单状态为充值成功';
|
||
}elseif($orderdata['status'] == '3'){
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] =$msg[1] .'订单状态为充值失败,已经退款';
|
||
}elseif($orderdata['status'] == '1' || $orderdata['status'] == '-5'){
|
||
|
||
$orderService2 = Order::instance();
|
||
$orderService2->setCallback(1, $orderdata['order_id'],'3');
|
||
$data['code'] = '1';
|
||
|
||
$data['content'] =$msg[1] .'拦截成功,已经自动操作退款';
|
||
}
|
||
|
||
}else{
|
||
$data['code'] = '1';
|
||
|
||
$data['content'] =$msg[1] .'未找到需要拦截的订单,请检查手机号码,或者使用查单功能查询是否已处理';
|
||
}
|
||
|
||
|
||
}else{
|
||
$url = 'send_group_msg';
|
||
$this->redis();
|
||
|
||
#发送给对应群聊客服进行拦截处理
|
||
$param = array();
|
||
foreach($orders as $key=>$value){
|
||
$num ++;
|
||
$ljorder = Db::name('merchant_order_lj')->where('order_id','=', $value['order_id'])->find();
|
||
if(!$ljorder){
|
||
$ljdata = [
|
||
'mid' => $value['mid'],
|
||
'cid' => $value['cid'],
|
||
'account' => $msg[1],
|
||
'status' => $value['status'],
|
||
'order_id' => $value['order_id']
|
||
];
|
||
Db::name('merchant_order_lj')->insert($ljdata);
|
||
}
|
||
if(!$this->redis->get('rediskey-lj-'.$orders[$key]['order_id'])){
|
||
|
||
$this->redis->set('rediskey-lj-'.$orders[$key]['order_id'],'1',3*60);
|
||
}
|
||
if($value['cid']==6){
|
||
|
||
$url = 'https://d.reapi.bao111.com/gateway/api.bxtlanjie/order';
|
||
|
||
if(isset($value['order_id']) && $value['order_id']){
|
||
try {
|
||
|
||
#推送到redis队列
|
||
$msg = http_post($url, $value);
|
||
// var_dump($msg);
|
||
// var_dump($msg);
|
||
if($msg != 'ok'){
|
||
Log::write('gateway', 'failorder_d', $value);
|
||
}else{
|
||
$send=['status'=>'ok'] ;
|
||
}
|
||
|
||
|
||
|
||
} catch (\Exception $e) {
|
||
|
||
Log::write('errorTip', 'failorder_d', $e->getMessage());
|
||
}
|
||
}
|
||
|
||
|
||
}else{
|
||
$chanelGroup = $this->getChanelGroup($value['cid'],$value['mid']);
|
||
$param['group_id'] = $chanelGroup['group_id'];#群组号
|
||
|
||
$param['message'] = $chanelGroup['atqq']." 以下为客户申请拦截订单,请及时处理 \r ".$msg[1];
|
||
$send = $this->send($url, $param);
|
||
$send = json_decode($send,true);
|
||
}
|
||
|
||
// $send = json_decode($send,true);
|
||
// var_dump($send);
|
||
|
||
|
||
|
||
}
|
||
|
||
if(isset($send['status']) && $send['status'] == 'ok'){
|
||
#记录redis
|
||
$data['code'] = '1';
|
||
#待处理redis QQLJ_x123s5d45
|
||
#QQLJ_
|
||
$data['content'] =$msg[1] .'共找到'.$num.'个订单状态为处理中,已登记拦截处理并推送至拦截渠道';
|
||
}else{
|
||
#记录redis
|
||
$data['code'] = '1';
|
||
|
||
$data['content'] =$msg[1] .'拦截机器人异常,请联系管理员解决,已登记拦截';
|
||
}
|
||
}
|
||
|
||
|
||
|
||
#up订单记录为拦截处理中
|
||
|
||
|
||
|
||
}else{
|
||
$data['code'] = '1';
|
||
$data['content'] ='手机号格式错误';
|
||
}
|
||
}elseif(isset($msg[0]) && $msg[0] == '/查询' ){
|
||
if (preg_match("/^1[3456789]{1}[0-9]{9}$/", $msg[1])) {
|
||
// $where=['account','=',$msg[1]];
|
||
$ljorder = Db::table('merchant_order_lj')->where('account','=', $msg[1])->findOrEmpty();
|
||
|
||
|
||
// $ljorder = Db::name('merchant_order_lj')->where($where)->find();
|
||
// var_dump($ljorder);die;
|
||
if($ljorder) {
|
||
if ($ljorder['status'] == '2') {
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] = $msg[1] . '订单状态为拦截成功';
|
||
} elseif ($ljorder['status'] == '3') {
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] = $msg[1] . '订单状态为拦截失败';
|
||
} else{
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] = $msg[1] . '订单状态为拦截中,请耐心等待系统拦截';
|
||
}
|
||
}else{
|
||
$field = "order_id,cid,mid,status,create_at";//需要数据库返回的字段
|
||
$orderService = OrderService::instance();
|
||
$where=['account'=> $msg[1]];
|
||
|
||
$orderdata = $orderService->db()->field($field)->where($where)->find();
|
||
if($orderdata){
|
||
if($orderdata['status'] == '2'){
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] =$msg[1] .'订单状态为充值成功';
|
||
}elseif($orderdata['status'] == '3'){
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] =$msg[1] .'订单状态为充值失败,已经退款';
|
||
}else{
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] =$msg[1] .'订单状态为充值处理中,下单时间为'.$orderdata['create_at'].',请耐心等待充值';
|
||
}
|
||
}else{
|
||
$data['code'] = '1';
|
||
#待处理
|
||
$data['content'] =$msg[1] .'手机号未找到对应订单,请核对后查询';
|
||
}
|
||
}
|
||
|
||
}else{
|
||
$data['code'] = '1';
|
||
$data['content'] ='手机号格式错误';
|
||
}
|
||
} else{
|
||
$data['code'] = '-5';
|
||
$data['msg'] ='暂不处理';
|
||
}
|
||
|
||
|
||
throw new HttpResponseException(json($data));
|
||
|
||
|
||
|
||
}
|
||
|
||
public function getChanelGroup($cid,$mid)
|
||
{
|
||
#暂时写死
|
||
$groupInfo = [];
|
||
if($mid == '2'){
|
||
switch ($cid){
|
||
case "9":
|
||
case "10":
|
||
case "11":
|
||
case "12":
|
||
case "2":
|
||
$groupInfo['atqq'] = '[CQ:at,qq=1063177733][CQ:at,qq=1073227223]';
|
||
$groupInfo['group_id'] = '711315002';
|
||
break;
|
||
case "8":
|
||
$groupInfo['atqq'] = '[CQ:at,qq=2722241686][CQ:at,qq=3388495821]';
|
||
$groupInfo['group_id'] = '750803726';
|
||
break;
|
||
case "4":
|
||
$groupInfo['atqq'] = '[CQ:at,qq=3808468183]';
|
||
$groupInfo['group_id'] = '534804625';
|
||
break;
|
||
}
|
||
|
||
|
||
}
|
||
return $groupInfo;
|
||
}
|
||
|
||
public function queryljstatus(){
|
||
|
||
}
|
||
|
||
public function kamierror(){
|
||
$this->redis();
|
||
$kamiserver = Kami91OrderService::instance();
|
||
$where1 = [
|
||
'status' => '3' ,
|
||
// 'cid' => '2'
|
||
// 'product_key' => ['like','%cardbuy%']
|
||
];
|
||
$where[] = [
|
||
|
||
'product_key','like','%cardbuy%'
|
||
];
|
||
$ck[] = [
|
||
'response','like','%限购%'
|
||
];
|
||
$field = "order_id,merchant_order_id,cid";//需要数据库返回的字段
|
||
$orderlist = OrderService::instance()->db()->field($field)->where($where1)->where($where)->where($ck)->order('id asc')->select()->toArray();
|
||
// var_dump($orderlist);die;
|
||
|
||
|
||
|
||
$redisData=[];
|
||
if($orderlist){
|
||
foreach($orderlist as $key=>$value){
|
||
if(!$this->redis->get('rediskey-kami-'.$orderlist[$key]['order_id'])){
|
||
$qudao = ChannelService::instance()->getInfo($value['cid']);
|
||
array_push($redisData,$orderlist[$key]['merchant_order_id']);
|
||
$this->redis->set('rediskey-kami-'.$orderlist[$key]['order_id'],'1',60*60*24);
|
||
}
|
||
}
|
||
}
|
||
$msg = $redisData ? implode("\n", $redisData) : '';
|
||
// var_dump($msg);die;
|
||
$url = 'send_group_msg';
|
||
|
||
#
|
||
$param = array();
|
||
#TODO 从数据库中获取
|
||
$param['group_id'] = '770225115';#群组号
|
||
|
||
|
||
$atqq = '373103766';#需要艾特的qq
|
||
$atqq1 = '785557837';
|
||
|
||
//
|
||
|
||
|
||
// $get_timeout_order = $this->transOrder();
|
||
|
||
|
||
if (!$msg) {
|
||
// Log::write('robot', 'qqbot', '无');
|
||
// Log::write($key, $name, $content)
|
||
die;
|
||
}
|
||
|
||
|
||
$param['message'] = "[CQ:at,qq=" . $atqq . "][CQ:at,qq=" . $atqq1 . "] 众茂卡密出现限购,以下为失败订单,请及时下架 \r " . $msg;
|
||
|
||
|
||
$send = $this->send($url, $param);
|
||
|
||
|
||
Log::write('robot', 'qqbot', $send);
|
||
|
||
return $send;
|
||
|
||
}
|
||
|
||
|
||
} |