diff --git a/app/command/ApplySmsTemp.php b/app/command/ApplySmsTemp.php index 5d3324f..d3f18e7 100644 --- a/app/command/ApplySmsTemp.php +++ b/app/command/ApplySmsTemp.php @@ -44,8 +44,10 @@ class ApplySmsTemp extends Command // p(replace_json_keys($a, json_encode($templateContent_arr, 256), [])); // $t_str = replace_placeholder_keys($str, $templateContent_arr); // p($templateContent_arr, $t_str); - - +// $stortime = strtotime('2025-10-16 19:03:00'); +// \support\Redis::setEx('expired:sms:9995', $stortime - time(), 1); +// Log::info('定时发送,已存入redis'); +// p(123123); $host = RabbitMqConfig::$host; $port = RabbitMqConfig::$port; $user = RabbitMqConfig::$user; diff --git a/app/process/ExpiredRedis.php b/app/process/ExpiredRedis.php new file mode 100644 index 0000000..5044e52 --- /dev/null +++ b/app/process/ExpiredRedis.php @@ -0,0 +1,42 @@ +auth($resis_pwd); + + // 选择数据库(默认0) + $redis->select(0); + + // 设置读取超时(-1表示不超时) + $redis->setOption(\Redis::OPT_READ_TIMEOUT, -1); + + // 订阅键过期事件频道 + // __keyevent@0__:expired 表示监听0号数据库的键过期事件 + $redis->psubscribe(['__keyevent@0__:expired'], function ($pattern, $channel, $key) use($redis){ + // 这里可以添加你的业务逻辑 + // 例如根据键名前缀处理不同业务 + $str = 'expired:sms:'; + if (strpos($key, $str) === 0) { + Log::info ("替换之前: " . $key); + $id = str_replace($str, '', $key); + Log::info ("替换过的ID: " . $id); + // 发给队列 + Redis::send('send.mark.sms', '1,' . $id); + Log::info ("处理订单过期: {$id}\n{}"); + } + }); + } +} \ No newline at end of file diff --git a/app/queue/redis/SendMarkSms.php b/app/queue/redis/SendMarkSms.php index 58c4672..848fe55 100644 --- a/app/queue/redis/SendMarkSms.php +++ b/app/queue/redis/SendMarkSms.php @@ -7,6 +7,7 @@ use app\model\AlibabaSms; use app\model\ShopInfo; use ba\Exception; use support\Log; +use support\Redis; use support\think\Db; use Webman\RedisQueue\Consumer; @@ -36,81 +37,83 @@ class SendMarkSms implements Consumer // $record = Db::table('sms_push_event')->where(['id' => $sms_push_event_id, 'push_type' => 2])->find(); $record = Db::table('sms_push_event')->where(['id' => $sms_push_event_id])->find(); if($record) { - // 查询是否是定时发送 - if($record['send_type'] == 2) { - - } - - // 待发送 - if($record['status'] == 0) { - Log::info('待发送'); - // 范围用户 - if($record['user_type'] == 2) { - Log::info('范围用户'); - $k_user_params = Db::table('sms_push_event_user')->where(['event_id' => $record['id']])->find(); - if($k_user_params) { - $user_list = ShopInfo::getUserList($k_user_params); - if(!$user_list) { - return false; - } - }else { - Log::info('范围用户查找出错'); - return false; - } - }elseif ($record['user_type'] == 1) { - Log::info('全部用户'); - // 全部用户 - $user_list = Db::table('tb_shop_user')->whereNotNull('phone')->field('id,phone,nick_name')->select(); - $user_list = ShopInfo::evnuserlist($user_list); - } - $y_temp = Db::table('sms_shop_template')->where(['id' => $record['push_event_id']])->find(); - Log::info('用户列表' . json_encode($user_list)); - if($user_list && $y_temp) { - foreach ($user_list as $k => $v) { - // 检测余额 - $shop_money = Db::table('sms_shop_money')->where(['shop_id' => $record['shop_id']])->find(); - if($shop_money) { - // 余额计算 - if($shop_money['money'] > config('cons.sms_price')) { - $templateParam = replace_json_keys($record['json'], $y_temp['content_json'], $v); - $data = [ - 'templateCode' => $y_temp['template_code'], - 'templateParam' => $templateParam, - 'phoneNumbers' => $v['phone'], - 'signName' => config('cons.sms_sign'), - ]; - $res = AlibabaSms::main($data); - Db::table('sms_push_event')->where(['id' => $record['id']])->update([ - 'status' => '1', - 'update_time' => date('Y-m-d H:i:s'), - 'send_time' => date('Y-m-d H:i:s'), - ]); - if($res['Code'] == 'OK') { - Db::table('sms_push_event_record')->insert([ - 'shop_id' => $record['shop_id'], - 'event_id' => $record['id'], - 'user_id' => $v['user_id'], - 'user_phone' => $v['phone'], - 'biz_id' => $res['BizId'], - 'send_time' => date('Y-m-d H:i:s'), - 'create_time' => date('Y-m-d H:i:s'), - 'status' => 1, - ]); - Db::commit(); - } - }else { - Log::info('商户【' . $record['shop_id'] . '】余额不足'); + if($record['send_type'] == 2 && $record['send_time'] > date('Y-m-d H:i:s')) { + // 推给redis + $stortime = strtotime($record['send_time']); + Redis::setEx('expired:sms:'.$record['id'], $stortime - time(), 1); + Log::info('定时发送,已存入redis'); + }else { + // 待发送 + if($record['status'] == 0) { + Log::info('待发送'); + // 范围用户 + if($record['user_type'] == 2) { + Log::info('范围用户'); + $k_user_params = Db::table('sms_push_event_user')->where(['event_id' => $record['id']])->find(); + if($k_user_params) { + $user_list = ShopInfo::getUserList($k_user_params); + if(!$user_list) { return false; } }else { - Log::info('商户【' . $record['shop_id'] . '】余额为空'); - return false; + Log::info('范围用户查找出错'); + return false; } - sleep(1); + }elseif ($record['user_type'] == 1) { + Log::info('全部用户'); + // 全部用户 + $user_list = Db::table('tb_shop_user')->whereNotNull('phone')->field('id,phone,nick_name')->select(); + $user_list = ShopInfo::evnuserlist($user_list); + } + $y_temp = Db::table('sms_shop_template')->where(['id' => $record['push_event_id']])->find(); + Log::info('用户列表' . json_encode($user_list)); + if($user_list && $y_temp) { + foreach ($user_list as $k => $v) { + // 检测余额 + $shop_money = Db::table('sms_shop_money')->where(['shop_id' => $record['shop_id']])->find(); + if($shop_money) { + // 余额计算 + if($shop_money['money'] > config('cons.sms_price')) { + $templateParam = replace_json_keys($record['json'], $y_temp['content_json'], $v); + $data = [ + 'templateCode' => $y_temp['template_code'], + 'templateParam' => $templateParam, + 'phoneNumbers' => $v['phone'], + 'signName' => config('cons.sms_sign'), + ]; + $res = AlibabaSms::main($data); + Db::table('sms_push_event')->where(['id' => $record['id']])->update([ + 'status' => '1', + 'update_time' => date('Y-m-d H:i:s'), + 'send_time' => date('Y-m-d H:i:s'), + ]); + if($res['Code'] == 'OK') { + Db::table('sms_push_event_record')->insert([ + 'shop_id' => $record['shop_id'], + 'event_id' => $record['id'], + 'user_id' => $v['user_id'], + 'user_phone' => $v['phone'], + 'biz_id' => $res['BizId'], + 'send_time' => date('Y-m-d H:i:s'), + 'create_time' => date('Y-m-d H:i:s'), + 'status' => 1, + ]); + Db::commit(); + } + }else { + Log::info('商户【' . $record['shop_id'] . '】余额不足'); + return false; + } + }else { + Log::info('商户【' . $record['shop_id'] . '】余额为空'); + return false; + } + sleep(1); + } + }else { + Log::info('【发送营销短信】无目标用户---》' . $record['user_id']); } - }else { - Log::info('【发送营销短信】无目标用户---》' . $record['user_id']); } } }else { diff --git a/config/process.php b/config/process.php index b3f4d9f..9fb71ab 100644 --- a/config/process.php +++ b/config/process.php @@ -61,7 +61,7 @@ return [ ] ] ], -// 'MessagePushTask' => [ -// 'handler' => MessagePushTask::class, -// ] + 'ExpiredRedis' => [ + 'handler' => \app\process\ExpiredRedis::class, + ] ]; diff --git a/extend/workermans/model/Base.php b/extend/workermans/model/Base.php index d02bd4f..9cf0ebc 100644 --- a/extend/workermans/model/Base.php +++ b/extend/workermans/model/Base.php @@ -242,7 +242,7 @@ class Base extends Model print_r('redis保存client_id---->' . $client_id . "\r\n"); print_r('redis保存值---->' . $data . "\r\n"); print_r('redis保存时间---->' . self::REDIS_TIME . "\r\n"); - $res = Redis::set($client_id, $data, self::REDIS_TIME); + $res = Redis::setex($client_id, self::REDIS_TIME, $data); print_r('redis保存结果---->' . $res . "\r\n"); } @@ -293,7 +293,7 @@ class Base extends Model print_r('推送了-----' . "\r\n"); // 推送以后新增推送次数 $msg_info_arr['send_num'] += 1; - Redis::set($client_id, json_encode($msg_info_arr), self::REDIS_TIME); + Redis::setex($client_id, self::REDIS_TIME, json_encode($msg_info_arr), ); return true; } } @@ -342,7 +342,7 @@ class Base extends Model if(empty($msg_info_arr)) { Redis::del($uid); }else { - Redis::set($uid, json_encode($msg_info_arr), self::REDIS_TIME); + Redis::setex($uid, self::REDIS_TIME, json_encode($msg_info_arr), ); } return true; } @@ -372,7 +372,7 @@ class Base extends Model $s_arr = array_values(array_intersect($client_id_arr, $redis_client_list)); $result[$type] = $s_arr; } - Redis::set($redis_name, json_encode($result), 60 * 60 * 24); + Redis::setex($redis_name, 60 * 60 * 24, json_encode($result)); } } } @@ -762,7 +762,7 @@ class Base extends Model } } if(isset($result_arr)) { - Redis::set($redis_name, json_encode($result_arr), 60 * 60 * 24); + Redis::setex($redis_name, 60 * 60 * 24, json_encode($result_arr)); } if(!$type) { Redis::del($client_id); diff --git a/extend/workermans/model/Cashier.php b/extend/workermans/model/Cashier.php index 56f4650..795fa1b 100644 --- a/extend/workermans/model/Cashier.php +++ b/extend/workermans/model/Cashier.php @@ -85,7 +85,7 @@ class Cashier extends Base self::add_log_file('----离线后推送收银机订单打印无回执--' .date('Y-m-d H:i:s'). '--->' . $arr_json, 'cashier'); $arr_n[] = $arr; } - Redis::set($uid, json_encode($arr_n), self::REDIS_TIME); + Redis::setex($uid,self::REDIS_TIME, json_encode($arr_n)); } break; // 新增