2024-09-29 15:43:18 +08:00

675 lines
20 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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;
}
}