feat(queue): 添加渠道余额监控预警功能
- 新增 ChannelBalanceMonitor 类实现渠道余额监控 - 在 MerchantBalanceMonitor 中增加余额恢复提醒功能 - 添加 WxWorkBot 类用于发送微信工作台消息- 在 Test 控制器中整合渠道余额监控逻辑 - 更新 sys.php 添加新的渠道余额监控命令
This commit is contained in:
parent
b45d188232
commit
21e4c1e37a
@ -38,6 +38,7 @@ use app\order\service\Kami91OrderService;
|
||||
use app\order\service\OrderService as OrderBase;
|
||||
use app\robot\controller\api\Qqbot;
|
||||
use app\robot\controller\WeChatBot as WeChatBotC;
|
||||
use app\robot\controller\WxWorkBot;
|
||||
use app\setting\service\BlackCardService;
|
||||
use app\setting\service\StatService;
|
||||
use dever\Log;
|
||||
@ -1056,17 +1057,24 @@ class Test extends Core
|
||||
|
||||
public function execute()
|
||||
{
|
||||
ini_set('memory_limit', '1024M');
|
||||
$this->redis();
|
||||
$merchantService = MerchantService::instance();
|
||||
$RobotService = new WeChatBotC($this->app);
|
||||
|
||||
$merchantsList = $merchantService->db()->where(['merchant_type'=>1,'status'=>1])->whereLike('other_param','%Monitor_Balance_status%')->select()->toArray();
|
||||
$merchantsList_num = count($merchantsList);
|
||||
$channelService = ChannelService::instance();
|
||||
$RobotService = new WxWorkBot($this->app);
|
||||
$channelList = $channelService->db()->where(['status'=>1])->whereLike('other_data','%Monitor_Balance_status%')->select()->toArray();
|
||||
|
||||
$channelList_num = count($channelList);
|
||||
$count_sum = 0;
|
||||
|
||||
$day = date('Y-m-d', strtotime('-1 day'));
|
||||
|
||||
foreach($merchantsList as $merchants) {
|
||||
$other_param = json_decode($merchants['other_param'],true);
|
||||
$tip_info=[];
|
||||
$key = '41b42bd4-c9f9-4617-9531-0a358dd97a82';
|
||||
|
||||
|
||||
foreach($channelList as $channel) {
|
||||
$other_param = json_decode($channel['other_data'],true);
|
||||
if(!$other_param){
|
||||
continue;
|
||||
}
|
||||
@ -1074,77 +1082,60 @@ class Test extends Core
|
||||
if(!$Monitor_Balance){
|
||||
continue;
|
||||
}
|
||||
$roomid = $other_param['QYWX_roomid'];
|
||||
$sender = $other_param['QYWX_sender'];
|
||||
|
||||
|
||||
|
||||
$count_sum ++;
|
||||
try{
|
||||
$account_data = $channelService->call('account', $channel['id'], $day);
|
||||
|
||||
if (is_array($account_data) && isset($account_data['account'])) {
|
||||
$balance = $account_data['account'];
|
||||
if( $balance <= $Monitor_Balance){
|
||||
|
||||
$count_sum ++;
|
||||
$this->redis->set('Check_channel_account-'.$channel['id'],1);
|
||||
$tip_info[] = $channel['name']."<font color=\"comment\">余额不足,只剩下</font>:<font color=\"info\">".$balance."</font>";
|
||||
|
||||
|
||||
if($merchants['account_surplus'] <= $Monitor_Balance){
|
||||
$Monitor_Balance_TOP = $other_param['Monitor_Balance_TOP'] ?? null;
|
||||
if($Monitor_Balance_TOP && $balance <= $Monitor_Balance_TOP){
|
||||
if(!$this->redis->get('Check_channel_account_TOP-'.$channel['id'])){
|
||||
$count_sum ++;
|
||||
$this->redis->set('Check_channel_account_TOP-'.$channel['id'],1);
|
||||
$tip_info[] = $channel['name']."<font color=\"comment\">余额不足,只剩下</font>:<font color=\"info\">".$balance."</font>";
|
||||
|
||||
#进入预警流程
|
||||
#设置redis,根据mid设置redis,
|
||||
if(!$this->redis->get('Check_merchant_account-'.$merchants['id'])){
|
||||
$AllContacts = $RobotService->get_all_contacts();
|
||||
$Contacts_array = json_decode($AllContacts,true);
|
||||
$acc = $Contacts_array['data']['contacts'];
|
||||
$ac = '';
|
||||
foreach ($acc as $k=>$v){
|
||||
if($v['wxid'] == $sender){
|
||||
$ac = $v['name'];
|
||||
}
|
||||
}
|
||||
$this->redis->set('Check_merchant_account-'.$merchants['id'],1);
|
||||
$RobotService->send_text('余额预警: 您的账户现在只剩下'.$Monitor_Balance.'元,请及时充值, @'.$ac,$roomid,$sender);
|
||||
}
|
||||
if($merchants['account_surplus'] <= 500){
|
||||
if(!$this->redis->get('Check_merchant_account-TOP-'.$merchants['id'])){
|
||||
if(isset($ac)){
|
||||
$AllContacts = $RobotService->get_all_contacts();
|
||||
$Contacts_array = json_decode($AllContacts,true);
|
||||
$acc = $Contacts_array['data']['contacts'];
|
||||
$ac = '';
|
||||
foreach ($acc as $k=>$v){
|
||||
if($v['wxid'] == $sender){
|
||||
$ac = $v['name'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if($this->redis->get('Check_channel_account-'.$channel['id'])){
|
||||
$count_sum ++;
|
||||
|
||||
$this->redis->set('Check_merchant_account-TOP-'.$merchants['id'],1);
|
||||
$RobotService->send_text('余额预警: 您的账户现在只剩下'.$Monitor_Balance.'元,已经严重不足,请关注账户, @'.$ac,$roomid,$sender);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if($this->redis->get('Check_merchant_account-'.$merchants['id'])){
|
||||
$AllContacts = $RobotService->get_all_contacts();
|
||||
$Contacts_array = json_decode($AllContacts,true);
|
||||
$acc = $Contacts_array['data']['contacts'];
|
||||
$ac = '';
|
||||
foreach ($acc as $k=>$v){
|
||||
if($v['wxid'] == $sender){
|
||||
$ac = $v['name'];
|
||||
$this->redis->delete('Check_channel_account-'.$channel['id']);
|
||||
$tip_info[] = $channel['name']."<font color=\"comment\">余额已经恢复,现在余额为</font>:<font color=\"info\">".$balance."</font>";
|
||||
}
|
||||
if($this->redis->get('Check_channel_account_TOP-'.$channel['id'])){
|
||||
$this->redis->delete('Check_channel_account_TOP-'.$channel['id']);
|
||||
}
|
||||
|
||||
}
|
||||
$this->redis->del('Check_merchant_account-'.$merchants['id']);
|
||||
$RobotService->send_text('余额预警: 您的账户已经恢复正常,现在余额为'.$merchants['account_surplus'].'元,请关注账户, @'.$ac,$roomid,$sender);
|
||||
}
|
||||
if($this->redis->get('Check_merchant_account-TOP-'.$merchants['id'])){
|
||||
$this->redis->del('Check_merchant_account-TOP-'.$merchants['id']);
|
||||
|
||||
}
|
||||
}catch (\Exception $e){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(!empty($tip_info)){
|
||||
$errorMsg = "渠道余额监控预警<font color=\"warning\">".$count_sum ."列</font>,请相关同事注意。\n
|
||||
>";
|
||||
$errorMsg .= implode(">", $tip_info);
|
||||
$errorMsgs =$RobotService->send_markdown($errorMsg,$key);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var_dump($errorMsgs);
|
||||
|
||||
}
|
||||
|
||||
|
131
app/queue/command/monitor/ChannelBalanceMonitor.php
Normal file
131
app/queue/command/monitor/ChannelBalanceMonitor.php
Normal file
@ -0,0 +1,131 @@
|
||||
<?php
|
||||
|
||||
namespace app\queue\command\monitor;
|
||||
|
||||
use app\channel\service\ChannelService;
|
||||
use app\gateway\service\RedisService;
|
||||
use app\robot\controller\WxWorkBot;
|
||||
use think\admin\Command;
|
||||
use think\console\Input;
|
||||
use think\console\Output;
|
||||
|
||||
/**
|
||||
* 渠道余额监控预警
|
||||
* Class ChannelBalanceMonitor
|
||||
* @package app\data\command
|
||||
*/
|
||||
class ChannelBalanceMonitor extends Command
|
||||
{
|
||||
protected $redis = false;
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this->setName('xQueue:ChannelBalanceMonitor')->setDescription('[ 监控系统 ] 渠道余额监控预警');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Input $input
|
||||
* @param Output $output
|
||||
* @throws \think\admin\Exception
|
||||
*/
|
||||
protected function execute(Input $input, Output $output)
|
||||
{
|
||||
ini_set('memory_limit', '1024M');
|
||||
$this->redis();
|
||||
|
||||
$channelService = ChannelService::instance();
|
||||
$RobotService = new WxWorkBot($this->app);
|
||||
$channelList = $channelService->db()->where(['status'=>1])->whereLike('other_data','%Monitor_Balance_status%')->select()->toArray();
|
||||
if(!$channelList) $this->setQueueSuccess("未找到支持监控余额的渠道");
|
||||
|
||||
$channelList_num = count($channelList);
|
||||
$count_sum = 0;
|
||||
|
||||
$day = date('Y-m-d', strtotime('-1 day'));
|
||||
|
||||
$tip_info=[];
|
||||
$key = '41b42bd4-c9f9-4617-9531-0a358dd97a82';
|
||||
|
||||
|
||||
foreach($channelList as $channel) {
|
||||
$other_param = json_decode($channel['other_data'],true);
|
||||
if(!$other_param){
|
||||
continue;
|
||||
}
|
||||
$Monitor_Balance = $other_param['Monitor_Balance'] ?? null;
|
||||
if(!$Monitor_Balance){
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
try{
|
||||
$account_data = $channelService->call('account', $channel['id'], $day);
|
||||
|
||||
if (is_array($account_data) && isset($account_data['account'])) {
|
||||
$balance = $account_data['account'];
|
||||
if( $balance <= $Monitor_Balance){
|
||||
|
||||
if(!$this->redis->get('Check_channel_account-'.$channel['id'])){
|
||||
$count_sum ++;
|
||||
$this->redis->set('Check_channel_account-'.$channel['id'],1);
|
||||
$tip_info[] = $channel['name']."<font color=\"comment\">余额不足,只剩下</font>:<font color=\"info\">".$balance."</font>";
|
||||
|
||||
}
|
||||
$Monitor_Balance_TOP = $other_param['Monitor_Balance_TOP'] ?? null;
|
||||
if($Monitor_Balance_TOP && $balance <= $Monitor_Balance_TOP){
|
||||
if(!$this->redis->get('Check_channel_account_TOP-'.$channel['id'])){
|
||||
$count_sum ++;
|
||||
$this->redis->set('Check_channel_account_TOP-'.$channel['id'],1);
|
||||
$tip_info[] = $channel['name']."<font color=\"comment\">余额不足,只剩下</font>:<font color=\"info\">".$balance."</font>";
|
||||
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if($this->redis->get('Check_channel_account-'.$channel['id'])){
|
||||
$count_sum ++;
|
||||
|
||||
$this->redis->delete('Check_channel_account-'.$channel['id']);
|
||||
$tip_info[] = $channel['name']."<font color=\"comment\">余额已经恢复,现在余额为</font>:<font color=\"info\">".$balance."</font>";
|
||||
}
|
||||
if($this->redis->get('Check_channel_account_TOP-'.$channel['id'])){
|
||||
$this->redis->delete('Check_channel_account_TOP-'.$channel['id']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}catch (\Exception $e){
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(!empty($tip_info)){
|
||||
$errorMsg = "渠道余额监控预警<font color=\"warning\">".$count_sum ."列</font>,请相关同事注意。\n
|
||||
>";
|
||||
$errorMsg .= implode(">", $tip_info);
|
||||
$RobotService->send_markdown($errorMsg,$key);
|
||||
|
||||
}
|
||||
|
||||
|
||||
$this->setQueueSuccess("共处理 {$channelList_num} 个渠道, 完成{$count_sum} 个查询处理!");
|
||||
|
||||
|
||||
}
|
||||
|
||||
protected function redis()
|
||||
{
|
||||
if (!$this->redis) {
|
||||
$this->redis = RedisService::getInstance();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -58,7 +58,7 @@ class MerchantBalanceMonitor extends Command
|
||||
|
||||
|
||||
|
||||
$count_sum ++;
|
||||
|
||||
|
||||
|
||||
if($merchants['account_surplus'] <= $Monitor_Balance){
|
||||
@ -66,6 +66,7 @@ class MerchantBalanceMonitor extends Command
|
||||
#进入预警流程
|
||||
#设置redis,根据mid设置redis,
|
||||
if(!$this->redis->get('Check_merchant_account-'.$merchants['id'])){
|
||||
$count_sum ++;
|
||||
$AllContacts = $RobotService->get_all_contacts();
|
||||
$Contacts_array = json_decode($AllContacts,true);
|
||||
$acc = $Contacts_array['data']['contacts'];
|
||||
@ -81,6 +82,7 @@ class MerchantBalanceMonitor extends Command
|
||||
}
|
||||
if($merchants['account_surplus'] <= 500){
|
||||
if(!$this->redis->get('Check_merchant_account-TOP-'.$merchants['id'])){
|
||||
$count_sum ++;
|
||||
if(!isset($ac)){
|
||||
$AllContacts = $RobotService->get_all_contacts();
|
||||
$Contacts_array = json_decode($AllContacts,true);
|
||||
@ -100,6 +102,7 @@ class MerchantBalanceMonitor extends Command
|
||||
}
|
||||
}else{
|
||||
if($this->redis->get('Check_merchant_account-'.$merchants['id'])){
|
||||
$count_sum ++;
|
||||
$AllContacts = $RobotService->get_all_contacts();
|
||||
$Contacts_array = json_decode($AllContacts,true);
|
||||
$acc = $Contacts_array['data']['contacts'];
|
||||
@ -109,18 +112,19 @@ class MerchantBalanceMonitor extends Command
|
||||
$ac = $v['name'];
|
||||
}
|
||||
}
|
||||
$this->redis->del('Check_merchant_account-'.$merchants['id']);
|
||||
$this->redis->delete('Check_merchant_account-'.$merchants['id']);
|
||||
$RobotService->send_text('余额预警: 您的账户已经恢复正常,现在余额为'.$merchants['account_surplus'].'元,请关注账户, @'.$ac,$roomid,$sender);
|
||||
}
|
||||
if($this->redis->get('Check_merchant_account-TOP-'.$merchants['id'])){
|
||||
$this->redis->del('Check_merchant_account-TOP-'.$merchants['id']);
|
||||
$count_sum ++;
|
||||
$this->redis->delete('Check_merchant_account-TOP-'.$merchants['id']);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->setQueueSuccess("共处理 {$merchantsList_num} 个商家, 完成{$count_sum} 个订单查询新状态更新!");
|
||||
$this->setQueueSuccess("共处理 {$merchantsList_num} 个商家, 完成{$count_sum} 个查询处理!");
|
||||
|
||||
|
||||
}
|
||||
|
@ -34,6 +34,7 @@ if ($app->request->isCli()) {
|
||||
$console->addCommand(\app\queue\command\taobao\TaobaoFailOrderSecondNotify::class);
|
||||
#监控
|
||||
$console->addCommand(\app\queue\command\monitor\MerchantBalanceMonitor::class);
|
||||
$console->addCommand(\app\queue\command\monitor\ChannelBalanceMonitor::class);
|
||||
|
||||
|
||||
});
|
||||
|
128
app/robot/controller/WxWorkBot.php
Normal file
128
app/robot/controller/WxWorkBot.php
Normal file
@ -0,0 +1,128 @@
|
||||
<?php
|
||||
|
||||
namespace app\robot\controller;
|
||||
|
||||
|
||||
use app\gateway\service\CurlService;
|
||||
use think\admin\Controller;
|
||||
|
||||
|
||||
#微信机器人 #
|
||||
class WxWorkBot extends Controller
|
||||
{
|
||||
protected array $status_map=array(
|
||||
-1=>'暂无订单',
|
||||
-2=>'暂无卡密',
|
||||
1=>'成功'
|
||||
);
|
||||
|
||||
protected string $host = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send';
|
||||
|
||||
|
||||
public function initialize(): void
|
||||
{
|
||||
#47609e509f946ecbfdba27f16db341c4
|
||||
|
||||
parent::initialize();
|
||||
|
||||
#获取wechat信息
|
||||
$this->key='47609e509f946ecbfdba27f16db341c4';
|
||||
}
|
||||
|
||||
#发送文本
|
||||
public function send_text($content,$key = false,$receiver = false)
|
||||
{
|
||||
$text = [
|
||||
'content' =>$content,
|
||||
|
||||
];
|
||||
|
||||
if($receiver){
|
||||
$text['mentioned_mobile_list'] = $receiver;
|
||||
}
|
||||
$request = [
|
||||
'msgtype'=>'text',
|
||||
'text'=>$text
|
||||
];
|
||||
|
||||
$url = $this->host.'?key='.$this->key;
|
||||
if($key){
|
||||
$url = $this->host.'?key='.$key;
|
||||
}
|
||||
|
||||
return $this->curl('post', $url,$request,true);
|
||||
|
||||
}
|
||||
|
||||
#发送markdown
|
||||
|
||||
public function send_markdown($content,$key = false)
|
||||
{
|
||||
$markdown = [
|
||||
'content' =>$content,
|
||||
|
||||
];
|
||||
|
||||
|
||||
$request = [
|
||||
'msgtype'=>'markdown',
|
||||
'markdown'=>$markdown
|
||||
];
|
||||
$url = $this->host.'?key='.$this->key;
|
||||
if($key){
|
||||
$url = $this->host.'?key='.$key;
|
||||
}
|
||||
// var_dump($request);die;
|
||||
|
||||
return $this->send_post($url,$request,'POST');
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function send_post($notify_url, $post_data, $type): mixed
|
||||
{
|
||||
$postdate = json_encode($post_data);
|
||||
|
||||
// $postdate = http_build_query($post_data);
|
||||
|
||||
$options = array(
|
||||
'http' => array(
|
||||
'method' => $type,
|
||||
'header' => 'Content-type:application/json',
|
||||
'content' => $postdate,
|
||||
'timeout' => 15 * 60 // 超时时间(单位:s)
|
||||
)
|
||||
);
|
||||
$context = stream_context_create($options);
|
||||
return file_get_contents($notify_url, false, $context);
|
||||
}
|
||||
|
||||
protected function curl($method, $url, $param = array(), $json = false, $header = false):mixed
|
||||
{
|
||||
if ($param) {
|
||||
$log['type'] = 'request';
|
||||
$log['url'] = $url;
|
||||
$log['param'] = $param;
|
||||
$this->log($log);
|
||||
}
|
||||
|
||||
$curl = CurlService::getInstance($url, $param, $method, $json, $header);
|
||||
$curl->setTimeOut(3600);
|
||||
return $curl->result();
|
||||
}
|
||||
|
||||
protected static function log($data, $type = 'request'):void
|
||||
{
|
||||
\dever\Log::write('WxWork', $type, $data);
|
||||
// \dever\Log::write('jingdong', $type, $data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user