Bläddra i källkod

Merge branch 'v0.2' into develop

duqinya 5 år sedan
förälder
incheckning
fa0fc12664

+ 80 - 0
app/Console/Commands/AddMessageRule.php

@@ -0,0 +1,80 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/13
+ * Time: 9:13
+ */
+
+namespace App\Console\Commands;
+
+use App\Models\MessageRule;
+use App\Service\RabbitMqUtil;
+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 AddMessageRule extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'message:add';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '添加发送消息';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct(MessageRule $messageRule, RabbitMqUtil $rabbitMqUtil)
+    {
+        parent::__construct();
+        $this->messageRule = $messageRule;
+        $this->rabbitMqUtil = $rabbitMqUtil;
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $this->line("开始添加发送消息");
+
+        $this->messageRule
+            ->where('message_status', 0)
+            ->where('send_time', '<', Carbon::now()->toDateTimeString())
+            ->whereNotNUll('send_time')
+            ->chunk(100, function($messages){
+                foreach($messages as $message){
+                    DB::beginTransaction();
+                    try{
+                        $this->rabbitMqUtil->push('add_message_rule', $message);
+                        $message->message_status = 1;
+                        $message->save();
+                        DB::commit();
+                        Log::info('添加发送消息成功:'.$message->id);
+                    }catch (QueryException $exception){
+                        DB::rollBack();
+                        Log::error('添加发送消息:'.$exception->getMessage());
+                    }
+                }
+            });
+
+        $this->line("添加发送消息结束");
+
+    }
+}

+ 108 - 0
app/Console/Commands/UpdateMessageRule.php

@@ -0,0 +1,108 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/13
+ * Time: 18:07
+ */
+
+namespace App\Console\Commands;
+
+use App\Repositories\MessageRuleRepository;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Log;
+use PhpAmqpLib\Connection\AMQPStreamConnection;
+
+class UpdateMessageRule extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'message:update_status';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '更新规则消息状态';
+
+    protected $channel;
+    protected $connection;
+
+    protected $queue = 'update_status_message_rule';
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct(MessageRuleRepository $messageRuleRepository)
+    {
+        parent::__construct();
+        $this->messageRuleRepository = $messageRuleRepository;
+        $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->messageRuleRepository->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();
+
+
+    }
+}

+ 9 - 1
app/Console/Kernel.php

@@ -2,7 +2,9 @@
 
 namespace App\Console;
 
+use App\Console\Commands\AddMessageRule;
 use App\Console\Commands\Apollo;
+use App\Console\Commands\UpdateMessageRule;
 use Illuminate\Console\Scheduling\Schedule;
 use Laravel\Lumen\Console\Kernel as ConsoleKernel;
 
@@ -14,6 +16,8 @@ class Kernel extends ConsoleKernel
      * @var array
      */
     protected $commands = [
+        AddMessageRule::class,
+        UpdateMessageRule::class,
         Apollo::class
     ];
 
@@ -25,6 +29,10 @@ class Kernel extends ConsoleKernel
      */
     protected function schedule(Schedule $schedule)
     {
-        //
+        $path = storage_path('logs/'.date('Y-m-d').'-schedule.log');
+
+        $schedule->command('message:add')
+            ->everyMinute()
+            ->withoutOverlapping()->appendOutputTo($path);
     }
 }

+ 0 - 2
app/Http/Controllers/ConfigCityManagementController.php

@@ -3,12 +3,10 @@ namespace App\Http\Controllers;
 use App\Repositories\ConfigCityManagementRepository;
 use App\Transformers\CityTransformer;
 use Illuminate\Http\Request;
-use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Validator;
 use League\Fractal\Pagination\IlluminatePaginatorAdapter;
 use League\Fractal\Resource\Collection;
 use League\Fractal\Manager;
-use Illuminate\Validation\Rule;
 /**
  * Created by PhpStorm.
  * User: qinyaer

+ 0 - 3
app/Http/Controllers/ConfigPickupGroupController.php

@@ -1,12 +1,9 @@
 <?php
 namespace App\Http\Controllers;
-use App\Models\ConfigPickupGroup;
 use App\Repositories\ConfigPickupGroupRepository;
 use Illuminate\Http\Request;
-use App\Http\ApiHelper;
 use Illuminate\Support\Facades\Validator;
 use App\Transformers\PickupGroupTransformer;
-//use Illuminate\Support\Facades\Validator;
 use League\Fractal\Resource\Collection;
 use League\Fractal\Manager;
 use League\Fractal\Pagination\IlluminatePaginatorAdapter;

+ 0 - 1
app/Http/Controllers/ConfigProvinceController.php

@@ -1,6 +1,5 @@
 <?php
 namespace App\Http\Controllers;
-use App\Models\ConfigProvince;
 use App\Repositories\ConfigProvinceRepository;
 use App\Transformers\ProvinceTransformer;
 use Illuminate\Http\Request;

+ 8 - 6
app/Http/Controllers/MessageRuleController.php

@@ -66,9 +66,10 @@ class MessageRuleController extends Controller
             'title' => 'required|string|max:20',
             'notice_groups' => 'required|string|max:31',
             'message_type' => ['required',Rule::in('star', 'system')],
-            'message_show_type' => ['required',Rule::in('only_show', 'user', 'post', 'activity', 'topic')],
-            'activity_url' => 'required_unless:message_show_type,only_show|string|max:64',
-            'cover' => 'required|url',
+            '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',
         ]);
@@ -88,9 +89,10 @@ class MessageRuleController extends Controller
             'title' => 'required|string|max:20',
             'notice_groups' => 'required|string|max:31',
             'message_type' => ['required',Rule::in('star', 'system')],
-            'message_show_type' => ['required',Rule::in('only_show', 'user', 'post', 'activity', 'topic')],
-            'activity_url' => 'required_unless:message_show_type,only_show|string|max:64',
-            'cover' => 'required|url',
+            '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',
         ]);

+ 46 - 8
app/Repositories/MessageRuleRepository.php

@@ -66,11 +66,12 @@ class MessageRuleRepository
 
         $data = [
             'title' => $request['title'],
+            'content' => isset($request['content']) && $request['message_type'] == 'system'? $request['content']:'',
             'notice_groups' => $noticeGroups,
             'message_type' => $request['message_type'],
-            'message_show_type' => $request['message_show_type'],
-            'activity_url' => $request['activity_url']??'',
-            'cover' => $request['cover'],
+            'message_show_type' => isset($request['message_show_type']) && $request['message_type'] == 'star'? $request['message_show_type']:'',
+            'activity_url' => isset($request['activity_url']) && $request['message_type'] == 'star'? $request['activity_url']:'',
+            'cover' => $request['message_type'] == 'star'? $request['cover']:'',
             'message_status' => 0,
             'send_time' => isset($request['send_time']) && $request['send_time']? $request['send_time']:null,
             'activity_time' => $request['activity_time']??'',
@@ -125,11 +126,19 @@ class MessageRuleRepository
         $message->title = $request['title'];
         $message->notice_groups = $noticeGroups;
         $message->message_type = $request['message_type'];
-        $message->message_show_type = $request['message_show_type'];
-        $message->cover = $request['cover'];
 
-        if($request['activity_url']){
-            $message->notice_groups = $request['activity_url'];
+        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']){
@@ -139,7 +148,7 @@ class MessageRuleRepository
             }
 
         }
-        if($request['activity_time']){
+        if(isset($request['activity_time'])){
             $message->activity_time = $request['activity_time'];
         }
 
@@ -234,4 +243,33 @@ class MessageRuleRepository
             ]);
         }
     }
+
+    /**
+     * 更新消息规则
+     */
+    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']);
+            return false;
+        }
+
+        $message->message_status = 2;
+        $message->sent_count = $data['num'];
+
+        DB::beginTransaction();
+        try{
+            $message->save();
+
+            DB::commit();
+            return true;
+
+        }catch (QueryException $exception){
+            DB::rollBack();
+            Log::error('更新消息规则状态:'.$data['id'].$exception->getMessage());
+            return false;
+        }
+    }
 }

+ 87 - 0
app/Service/RabbitMqUtil.php

@@ -0,0 +1,87 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: edz
+ * Date: 2019-04-30
+ * Time: 17:22
+ */
+namespace App\Service;
+
+use PhpAmqpLib\Connection\AMQPStreamConnection;
+use PhpAmqpLib\Message\AMQPMessage;
+
+class RabbitMqUtil
+{
+    protected $connection;
+    protected $queue;
+    protected $channel;
+    public function __construct()
+    {
+        $this->connection = $this->getConnection();
+        $this->channel = $this->connection->channel();
+    }
+
+    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;
+    }
+
+    /**
+     * 生产消息-分布式任务模式(Work queues)
+     * @param $queue
+     * @param $data
+     */
+    public function push($queue,$data){
+        $this->channel->queue_declare($queue, false, true, false, false);
+        $msg = new AMQPMessage(
+            \GuzzleHttp\json_encode($data),
+            array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)
+        );
+        return $this->channel->basic_publish($msg, '', $queue);
+    }
+
+    /**
+     * 生产消息-发布订阅模式(Publish/Subscribe)
+     *
+     * @param $queue
+     * @param $data
+     */
+    public function publish($queue,$data){
+        $this->channel->exchange_declare($queue, 'fanout', false, true, false);
+        $msg = new AMQPMessage(
+            \GuzzleHttp\json_encode($data),
+            array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)
+        );
+        return $this->channel->basic_publish($msg, $queue);
+    }
+
+    public function __destruct()
+    {
+        // TODO: Implement __destruct() method.
+        $this->channel->close();
+        $this->connection->close();
+    }
+}

+ 1 - 0
app/Transformers/MessageRuleDetailTransformer.php

@@ -19,6 +19,7 @@ class MessageRuleDetailTransformer extends TransformerAbstract
         return [
             'id' => $messageRule['id'],
             'title' => $messageRule['title'],
+            'content' => $messageRule['content'],
             'message_type' => $messageRule['message_type'],
             'cover' => $messageRule['cover'],
             'send_time' => $messageRule['send_time'] ? Carbon::parse($messageRule['send_time'])->toDateTimeString():'',

+ 1 - 0
composer.json

@@ -16,6 +16,7 @@
         "tymon/jwt-auth": "1.0.0-rc.4.1",
         "multilinguals/apollo-client": "^0.1.2",
         "vlucas/phpdotenv": "^3.3",
+        "php-amqplib/php-amqplib": "^2.9",
         "guzzlehttp/guzzle": "^6.3"
     },
     "require-dev": {

+ 35 - 0
database/migrations/2019_06_12_095415_add_content_to_table_message_rule.php

@@ -0,0 +1,35 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class AddContentToTableMessageRule extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('message_rule', function (Blueprint $table) {
+            $table->string('content', 500)
+                ->default('')
+                ->after('title')
+                ->comment('文字说明');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('message_rule', function (Blueprint $table) {
+            //
+        });
+    }
+}

+ 1 - 0
resources/lang/zh-CN/validation.php

@@ -101,6 +101,7 @@ return [
 
     'attributes' => [
         'title' => '标题',
+        'content' => '内容',
         'notice_groups' => '通知群体',
         'message_type' => '消息类型',
         'message_show_type' => '展示类型',