wzq hace 5 años
padre
commit
eabcca6b25

+ 88 - 0
app/Console/Commands/AddNoticeRule.php

@@ -0,0 +1,88 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\NoticeRule;
+use App\Service\RabbitMqUtil;
+use App\Traits\PostTrait;
+use Illuminate\Console\Command;
+use Illuminate\Database\QueryException;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use PhpAmqpLib\Connection\AMQPStreamConnection;
+
+class AddNoticeRule extends Command
+{
+    use PostTrait;
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'notice:add';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '添加发送通知';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct(NoticeRule $noticeRule, RabbitMqUtil $rabbitMqUtil)
+    {
+        parent::__construct();
+        $this->noticeRule = $noticeRule;
+        $this->rabbitMqUtil = $rabbitMqUtil;
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $this->line("开始添加发送通知");
+
+        $this->noticeRule
+            ->where('notice_type', 0)
+            ->where('notice_status', 0)
+            ->where('send_time', '<', Carbon::now()->toDateTimeString())
+            ->whereNotNUll('send_time')
+            ->chunk(100, function($notices){
+                foreach($notices as $notice){
+                    DB::beginTransaction();
+                    try{
+                        $notice->notice_status = 1;
+                        $noticeUsers = json_decode($notice->notice_users, true);
+                        if(isset($noticeUsers['category']) && $noticeUsers['category']){
+                            $uids = $this->getCategoryUids(json_encode($noticeUsers['category']));
+                            Log::debug('uids'.json_encode($uids));
+                            if(!$uids){
+                                DB::rollBack();
+                                Log::error('获取关注分类用户失败:');
+                            }
+                            $noticeUsers['category_uids'] = $uids;
+                            $notice->notice_users = json_encode($noticeUsers);
+                        }
+                        $notice->save();
+                        DB::commit();
+                        $this->rabbitMqUtil->push('add_notice_rule', $notice);
+                        Log::info('添加发送通知成功:'.$notice->id);
+                    }catch (QueryException $exception){
+                        DB::rollBack();
+                        Log::error('添加发送通知失败:'.$exception->getMessage());
+                    }
+                }
+            });
+
+        $this->line("添加发送消息结束");
+
+    }
+}

+ 102 - 0
app/Console/Commands/UpdateNoticeRule.php

@@ -0,0 +1,102 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Repositories\NoticeRuleRepository;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Log;
+use PhpAmqpLib\Connection\AMQPStreamConnection;
+
+class UpdateNoticeRule extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'notice:update_status';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '更新规则通知状态';
+
+    protected $channel;
+    protected $connection;
+
+    protected $queue = 'update_status_notice_rule';
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct(NoticeRuleRepository $noticeRuleRepository)
+    {
+        parent::__construct();
+        $this->noticeRuleRepository = $noticeRuleRepository;
+        $this->connection = $this->getConnection();
+        $this->channel = $this->connection->channel();
+        $this->channel->exchange_declare($this->queue, 'fanout', false, true, false);
+    }
+
+    public function getConnection()
+    {
+        $conn = false;
+        if ($this->connection) {
+            return $this->connection;
+        }
+        for ($i = 0; $i < 3; $i++) {
+            $connection = $this->createConn();
+            if ($connection) {
+                $conn = $connection;
+                break;
+            }
+            Log::info("create amqp conn retry=" . $i);
+        }
+        return $conn;
+    }
+
+    public function createConn()
+    {
+        try {
+            $connection = new AMQPStreamConnection(env('MQ_HOST'), env('MQ_PORT'), env('MQ_USERNAME'), env('MQ_PWD'), env('MQ_VHOST'));
+        } catch (\Exception $exception) {
+            Log::info("AMQP connection Error" . $exception->getMessage());
+            $connection = false;
+        }
+        return $connection;
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        Log::info('发送消息结果');
+        $queue_name = $this->queue;
+        $this->channel->queue_declare($queue_name, false, true, false, false);
+        $this->channel->queue_bind($queue_name, $this->queue);
+        $callback = function ($msg) {
+            Log::info($msg->body);
+            $data = \GuzzleHttp\json_decode($msg->body, true);
+            $this->line('收到数据' . $msg->body);
+            $res = $this->noticeRuleRepository->updateStatus($data);
+            if($res){
+                $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
+            }
+        };
+        $this->channel->basic_consume($queue_name, '', false, false, false, false, $callback);
+
+        while (count($this->channel->callbacks)) {
+            $this->channel->wait();
+        }
+        $this->channel->close();
+        $this->connection->close();
+
+
+    }
+}

+ 8 - 0
app/Console/Kernel.php

@@ -3,8 +3,10 @@
 namespace App\Console;
 
 use App\Console\Commands\AddMessageRule;
+use App\Console\Commands\AddNoticeRule;
 use App\Console\Commands\Apollo;
 use App\Console\Commands\UpdateMessageRule;
+use App\Console\Commands\UpdateNoticeRule;
 use Illuminate\Console\Scheduling\Schedule;
 use Laravel\Lumen\Console\Kernel as ConsoleKernel;
 
@@ -17,7 +19,9 @@ class Kernel extends ConsoleKernel
      */
     protected $commands = [
         AddMessageRule::class,
+        AddNoticeRule::class,
         UpdateMessageRule::class,
+        UpdateNoticeRule::class,
         Apollo::class
     ];
 
@@ -34,5 +38,9 @@ class Kernel extends ConsoleKernel
         $schedule->command('message:add')
             ->everyMinute()
             ->withoutOverlapping()->appendOutputTo($path);
+
+        $schedule->command('notice:add')
+            ->everyMinute()
+            ->withoutOverlapping()->appendOutputTo($path);
     }
 }

+ 17 - 0
app/Http/Controllers/ConfigController.php

@@ -128,6 +128,23 @@ class ConfigController extends Controller
                     '2' => '已发送未隐藏',
                     '3' => '已发送并隐藏',
                 ],
+                //通知类型
+                'notice_type' =>[
+                    '1' => '短信',
+                    '0' => 'push',
+                ],
+                //通知用户类型
+                'notice_user_type' =>[
+                    '1' => '条件筛选',
+                    '0' => '全部用户',
+                    '2' => 'uid群发',
+                ],
+                //用户属性
+                'attribute' =>[
+                    '1' => '原始用户',
+                    '0' => '全部用户',
+                    '2' => '正式用户',
+                ],
         ];
     }
 }

+ 15 - 40
app/Http/Controllers/NoticeRuleController.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
 
 use App\Repositories\NoticeRuleRepository;
 use App\Transformers\MessageRuleDetailTransformer;
+use App\Transformers\NoticeRuleDetailTransformer;
 use App\Transformers\NoticeRuleListTransformer;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Validator;
@@ -21,7 +22,7 @@ class NoticeRuleController extends Controller
     }
 
     /**
-     * 消息规则列表
+     * 通知规则列表
      */
     public function index(Request $request)
     {
@@ -33,30 +34,26 @@ class NoticeRuleController extends Controller
         $data['extra'] = [
             'filters' => [
                 'title',
-                'message_type'
             ],
             'columns' => [
                 'id',
                 'title',
-                'message_type',
                 'cover',
                 'updated_at',
-                'sent_count',
-                'open_count',
-                'notice_groups',
-                'message_status'
+                'send_count',
+                'notice_user_type',
+                'notice_status'
             ]
         ];
         return $data;
     }
 
     /**
-     * 创建消息规则
+     * 创建通知规则
      */
     public function create(Request $request)
     {
         $validator = Validator::make($request->all(), [
-            'notice_type' => ['required',Rule::in(0, 1)],
             'title' => 'required|string|max:30',
             'notice_user_type' => ['required',Rule::in(0, 1, 2)],
             'action_type' => ['required_if:notice_type,0',Rule::in('post', 'recommend', 'star', 'activity', 'product')],
@@ -73,52 +70,30 @@ class NoticeRuleController extends Controller
         return  $this->noticeRuleRepository->create($request->all());
     }
 
-    /**
-     * 编辑消息规则
-     */
-    public function update(Request $request)
-    {
-        $validator = Validator::make($request->all(), [
-            'id' => 'required|exists:message_rule',
-            'title' => 'required|string|max:20',
-            'notice_groups' => 'required|string|max:31',
-            'message_type' => ['required',Rule::in('star', 'system')],
-            'message_show_type' => ['required_if:message_type,star',Rule::in('only_show', 'user', 'post', 'activity', 'topic')],
-            'activity_url' => 'required_if:message_show_type,user,post,activity,topic|string|max:64',
-            'content' => 'required_if:message_type,system|string|max:200',
-            'cover' => 'required_if:message_type,star|url',
-            'send_time' => 'nullable|date',
-            'activity_time' => 'nullable|string|max:24',
-        ]);
-        if ($validator->fails()) {
-            return $this->response->error($validator->errors()->first(), 500);
-        }
-        return  $this->noticeRuleRepository->update($request->all());
-    }
 
     /**
-     * 消息规则详情
+     * 通知规则详情
      */
     public function detail(Request $request)
     {
         $validator = Validator::make($request->all(), [
-            'id' => 'required|exists:message_rule'
+            'id' => 'required|exists:notice_rule'
         ]);
         if ($validator->fails()) {
             return $this->response->error($validator->errors()->first(), 500);
         }
 
         $post = $this->noticeRuleRepository->detail($request->all());
-        return $this->response->item($post, new MessageRuleDetailTransformer());
+        return $this->response->item($post, new NoticeRuleDetailTransformer());
     }
 
     /**
-     * 发送消息规则
+     * 发送通知规则
      */
     public function send(Request $request)
     {
         $validator = Validator::make($request->all(), [
-            'id' => 'required|exists:message_rule'
+            'id' => 'required|exists:notice_rule'
         ]);
         if ($validator->fails()) {
             return $this->response->error($validator->errors()->first(), 500);
@@ -127,16 +102,16 @@ class NoticeRuleController extends Controller
     }
 
     /**
-     * 隐藏消息规则
+     * 删除通知
      */
-    public function hide(Request $request)
+    public function delete(Request $request)
     {
         $validator = Validator::make($request->all(), [
-            'id' => 'required|exists:message_rule'
+            'id' => 'required|exists:notice_rule'
         ]);
         if ($validator->fails()) {
             return $this->response->error($validator->errors()->first(), 500);
         }
-        return  $this->noticeRuleRepository->hide($request->all());
+        return  $this->noticeRuleRepository->delete($request->all());
     }
 }

+ 29 - 105
app/Repositories/NoticeRuleRepository.php

@@ -31,9 +31,7 @@ class NoticeRuleRepository
         if(isset($request['title'])){
             $where[] = ['title', 'like', "%{$request['title']}%"];
         }
-        if(isset($request['notice_type'])){
-            $where[] = ['notice_type', $request['notice_type']];
-        }
+        $where[] = ['notice_type', 0];
         return $this->noticeRule
             ->where($where)
             ->orderBy('id','desc')
@@ -41,7 +39,7 @@ class NoticeRuleRepository
     }
 
     /**
-     * 创建消息规则
+     * 创建通知规则
      */
     public function create($request)
     {
@@ -84,7 +82,7 @@ class NoticeRuleRepository
         }
 
         $data = [
-            'notice_type' => $request['notice_type'],
+            'notice_type' => 0,
             'title' => $request['title'],
             'content' => $request['content'],
             'notice_user_type' => $request['notice_user_type'],
@@ -117,111 +115,38 @@ class NoticeRuleRepository
     }
 
     /**
-     * 编辑消息规则
-     */
-    public function update($request)
-    {
-        $message = $this->messageRule->find($request['id']);
-        if(!$message || $message->message_status != 0){
-            return Response::create([
-                'message'  => '只能编辑未发送消息',
-                'status_code'   => 500
-            ]);
-        }
-        $noticeGroups = explode(',', $request['notice_groups']);
-
-        if(in_array(0, $noticeGroups)){
-            $noticeGroups = 0;
-        } else {
-            if(array_diff($noticeGroups, [1,2])){
-                return Response::create([
-                    'message'  => '通知群体参数有误',
-                    'status_code'   => 500
-                ]);
-            }
-            $noticeGroups = implode(',', array_unique($noticeGroups));
-        }
-
-        $message->title = $request['title'];
-        $message->notice_groups = $noticeGroups;
-        $message->message_type = $request['message_type'];
-
-        if(isset($request['cover'])){
-            $message->cover = $request['cover'];
-        }
-
-        if(isset($request['activity_url'])){
-            $message->activity_url = $request['activity_url'];
-        }
-        if(isset($request['message_show_type'])){
-            $message->message_show_type = $request['message_show_type'];
-        }
-        if(isset($request['content'])){
-            $message->content = $request['content'];
-        }
-        if(isset($request['send_time'])){
-            if($request['send_time']){
-                $message->send_time = $request['send_time'];
-            }else{
-                $message->send_time = null;
-            }
-
-        }
-        if(isset($request['activity_time'])){
-            $message->activity_time = $request['activity_time'];
-        }
-
-        DB::beginTransaction();
-        try{
-            $message->save();
-
-            DB::commit();
-            return Response::create();
-
-        }catch (QueryException $exception){
-            DB::rollBack();
-            Log::debug('编辑消息规则:'.$exception->getMessage());
-            return Response::create([
-                'message'  => '编辑失败,请重试',
-                'error' => $exception->getMessage(),
-                'status_code'   => 500
-            ]);
-        }
-    }
-
-    /**
-     * 消息规则详情
+     * 通知规则详情
      */
     public function detail($request)
     {
-        return $this->messageRule->find($request['id']);
+        return $this->noticeRule->find($request['id']);
     }
 
     /**
-     * 发送消息规则
+     * 发送通知规则
      */
     public function send($request)
     {
-        $message = $this->messageRule->find($request['id']);
-        if(!$message || $message->message_status != 0){
+        $notice = $this->noticeRule->find($request['id']);
+        if(!$notice || $notice->notice_status != 0){
             return Response::create([
-                'message'  => '只能发送未发送消息',
+                'message'  => '只能发送未发送通知',
                 'status_code'   => 500
             ]);
         }
 
-        $message->send_time = Carbon::now()->toDateTimeString();
+        $notice->send_time = Carbon::now()->toDateTimeString();
 
         DB::beginTransaction();
         try{
-            $message->save();
+            $notice->save();
 
             DB::commit();
             return Response::create();
 
         }catch (QueryException $exception){
             DB::rollBack();
-            Log::debug('发送消息规则:'.$exception->getMessage());
+            Log::debug('发送通知规则失败:'.$exception->getMessage());
             return Response::create([
                 'message'  => '发送失败,请重试',
                 'error' => $exception->getMessage(),
@@ -231,32 +156,31 @@ class NoticeRuleRepository
     }
 
     /**
-     * 隐藏消息规则
+     * 删除通知
      */
-    public function hide($request)
+    public function delete($request)
     {
-        $message = $this->messageRule->find($request['id']);
-        if(!$message || $message->message_status != 2){
+        $notice = $this->noticeRule->find($request['id']);
+        if(!$notice || $notice->notice_status != 0){
             return Response::create([
-                'message'  => '只能隐藏已发送消息',
+                'message'  => '只能删除未发送通知',
                 'status_code'   => 500
             ]);
         }
 
-        $message->message_status = 3;
 
         DB::beginTransaction();
         try{
-            $message->save();
+            $notice->delete();
 
             DB::commit();
             return Response::create();
 
         }catch (QueryException $exception){
             DB::rollBack();
-            Log::debug('隐藏消息规则:'.$exception->getMessage());
+            Log::debug('删除通知规则失败:'.$exception->getMessage());
             return Response::create([
-                'message'  => '隐藏失败,请重试',
+                'message'  => '删除失败,请重试',
                 'error' => $exception->getMessage(),
                 'status_code'   => 500
             ]);
@@ -264,30 +188,30 @@ class NoticeRuleRepository
     }
 
     /**
-     * 更新消息规则
+     * 更新通知规则
      */
     public function updateStatus($data)
     {
-        Log::debug('更新消息规则收到数据:'.json_encode($data));
-        $message = $this->messageRule->find($data['id']);
-        if(!$message || $message->message_status != 1){
-            Log::error('更新消息规则状态失败:'.$data['id']);
+        Log::debug('更新通知规则收到数据:'.json_encode($data));
+        $notice = $this->noticeRule->find($data['id']);
+        if(!$notice || $notice->notice_status != 1){
+            Log::error('更新通知规则状态失败:'.$data['id']);
             return false;
         }
 
-        $message->message_status = 2;
-        $message->sent_count = $data['num'];
+        $notice->notice_status = 2;
+        $notice->send_count = $data['num'];
 
         DB::beginTransaction();
         try{
-            $message->save();
+            $notice->save();
 
             DB::commit();
             return true;
 
         }catch (QueryException $exception){
             DB::rollBack();
-            Log::error('更新消息规则状态:'.$data['id'].$exception->getMessage());
+            Log::error('更新通知规则状态:'.$data['id'].$exception->getMessage());
             return false;
         }
     }

+ 13 - 0
app/Traits/PostTrait.php

@@ -23,4 +23,17 @@ trait PostTrait
         }
 
     }
+
+    public function getCategoryUids($category) {
+        try {
+            $url = config("customer.manage_service_url").'/community/post/getCategoryUids';
+            $array = [
+                'json' => ['category' => $category], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array, 'get');
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
 }

+ 37 - 0
app/Transformers/NoticeRuleDetailTransformer.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Transformers;
+
+use App\Models\NoticeRule;
+use Illuminate\Support\Carbon;
+use League\Fractal\TransformerAbstract;
+
+class NoticeRuleDetailTransformer extends TransformerAbstract
+{
+    public function transform(NoticeRule $noticeRule)
+    {
+        $noticeStatus = $noticeRule['notice_status'];
+        if($noticeStatus == 0 && $noticeRule['send_time'] && $noticeRule['send_time'] <= Carbon::now()->toDateTimeString()){
+            $noticeStatus = 1;
+        }
+        $noticeUsers = json_decode($noticeRule['notice_users'], true);
+        $attribute = $noticeUsers['attribute']??0;
+        $category = $noticeUsers['category']??[];
+        $uids = '';
+        if($noticeUsers['uids']){
+            $uids = implode('、', $noticeUsers['uids']);
+        }
+        return [
+            'id' => $noticeRule['id'],
+            'title' => $noticeRule['title'],
+            'cover' => $noticeRule['cover'],
+            'updated_at' => Carbon::parse($noticeRule['updated_at'])->toDateTimeString(),
+            'send_count' => $noticeRule['send_count'],
+            'notice_user_type' => $noticeRule['notice_user_type'],
+            'notice_status' => $noticeStatus,
+            'attribute' => $attribute,
+            'category' => $category,
+            'uids' => $uids,
+        ];
+    }
+}

+ 10 - 12
app/Transformers/NoticeRuleListTransformer.php

@@ -10,20 +10,18 @@ class NoticeRuleListTransformer extends TransformerAbstract
 {
     public function transform(NoticeRule $noticeRule)
     {
-//        $messageStatus = $noticeRule['notice_status'];
-//        if($messageStatus == 0 && $noticeRule['send_time'] && $noticeRule['send_time'] <= Carbon::now()->toDateTimeString()){
-//            $messageStatus = 1;
-//        }
+        $noticeStatus = $noticeRule['notice_status'];
+        if($noticeStatus == 0 && $noticeRule['send_time'] && $noticeRule['send_time'] <= Carbon::now()->toDateTimeString()){
+            $noticeStatus = 1;
+        }
         return [
             'id' => $noticeRule['id'],
-//            'title' => $messageRule['title'],
-//            'message_type' => $messageRule['message_type'],
-//            'cover' => $messageRule['cover'],
-//            'updated_at' => Carbon::parse($messageRule['updated_at'])->toDateTimeString(),
-//            'sent_count' => $messageRule['sent_count'],
-//            'open_count' => $messageRule['open_count'],
-//            'notice_groups' => $messageRule['notice_groups'],
-//            'message_status' => $messageStatus,
+            'title' => $noticeRule['title'],
+            'cover' => $noticeRule['cover'],
+            'updated_at' => Carbon::parse($noticeRule['updated_at'])->toDateTimeString(),
+            'send_count' => $noticeRule['send_count'],
+            'notice_user_type' => $noticeRule['notice_user_type'],
+            'notice_status' => $noticeStatus,
         ];
     }
 }

+ 6 - 0
routes/api.php

@@ -81,6 +81,12 @@ $api->version('v1', [
         $api->get('notice', 'NoticeRuleController@index');
         //添加通知规则
         $api->post('notice', 'NoticeRuleController@create');
+        //删除通知规则
+        $api->delete('notice', 'NoticeRuleController@delete');
+        //发送通知规则
+        $api->put('notice/send', 'NoticeRuleController@send');
+        //通知规则详情
+        $api->get('notice/detail', 'NoticeRuleController@detail');
 
 
     });