675 lines
20 KiB
PHP
Raw Normal View History

2024-09-29 15:43:18 +08:00
<?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;
}
}