feat(queue): 添加渠道余额监控预警功能

- 新增 ChannelBalanceMonitor 类实现渠道余额监控
- 在 MerchantBalanceMonitor 中增加余额恢复提醒功能
- 添加 WxWorkBot 类用于发送微信工作台消息- 在 Test 控制器中整合渠道余额监控逻辑
- 更新 sys.php 添加新的渠道余额监控命令
This commit is contained in:
mzeros 2025-01-06 13:08:15 +08:00
parent b45d188232
commit 21e4c1e37a
5 changed files with 317 additions and 62 deletions

View File

@ -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'];
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'];
}
}
}
$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->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']);
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);
$errorMsgs =$RobotService->send_markdown($errorMsg,$key);
}
var_dump($errorMsgs);
}

View 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();
}
}
}

View File

@ -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}查询处理");
}

View File

@ -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);
});

View 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);
}
}