wzq 5 vuotta sitten
vanhempi
commit
d68f3d22b7

+ 142 - 0
app/Http/Controllers/NoticeRuleController.php

@@ -0,0 +1,142 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Repositories\NoticeRuleRepository;
+use App\Transformers\MessageRuleDetailTransformer;
+use App\Transformers\NoticeRuleListTransformer;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Validation\Rule;
+use League\Fractal\Manager;
+use League\Fractal\Pagination\IlluminatePaginatorAdapter;
+use League\Fractal\Resource\Collection;
+use League\Fractal\Resource\Item;
+
+class NoticeRuleController extends Controller
+{
+    public function __construct(NoticeRuleRepository $noticeRuleRepository)
+    {
+        $this->noticeRuleRepository = $noticeRuleRepository;
+    }
+
+    /**
+     * 消息规则列表
+     */
+    public function index(Request $request)
+    {
+        $productList = $this->noticeRuleRepository->lists($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($productList, new NoticeRuleListTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($productList));
+        $data = $fractal->createData($resource)->toArray();
+        $data['extra'] = [
+            'filters' => [
+                'title',
+                'message_type'
+            ],
+            'columns' => [
+                'id',
+                'title',
+                'message_type',
+                'cover',
+                'updated_at',
+                'sent_count',
+                'open_count',
+                'notice_groups',
+                'message_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')],
+            'action_id' => 'required_if:notice_type,0|integer|min:1',
+            'content' => 'required|string|max:60',
+            'send_time' => 'nullable|date',
+            'attribute' => ['nullable',Rule::in(0, 1, 2)],
+            'category' => 'nullable|array',
+            'category.*' => 'nullable|integer',
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        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'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+
+        $post = $this->noticeRuleRepository->detail($request->all());
+        return $this->response->item($post, new MessageRuleDetailTransformer());
+    }
+
+    /**
+     * 发送消息规则
+     */
+    public function send(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|exists:message_rule'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->noticeRuleRepository->send($request->all());
+    }
+
+    /**
+     * 隐藏消息规则
+     */
+    public function hide(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'id' => 'required|exists:message_rule'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return  $this->noticeRuleRepository->hide($request->all());
+    }
+}

+ 18 - 0
app/Models/NoticeRule.php

@@ -0,0 +1,18 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/9/5
+ * Time: 10:12
+ */
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class NoticeRule extends Model
+{
+    use SoftDeletes;
+    protected $table = 'notice_rule';
+    protected $guarded = [];
+}

+ 294 - 0
app/Repositories/NoticeRuleRepository.php

@@ -0,0 +1,294 @@
+<?php
+
+namespace App\Repositories;
+
+use App\Models\NoticeRule;
+use App\Traits\PostTrait;
+use Illuminate\Database\QueryException;
+use Dingo\Api\Http\Response;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Tymon\JWTAuth\Facades\JWTAuth;
+
+class NoticeRuleRepository
+{
+    use PostTrait;
+    public function __construct(NoticeRule $noticeRule)
+    {
+        $this->noticeRule = $noticeRule;
+    }
+
+    /**
+     * 通知列表
+     */
+    public function lists($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        if(isset($request['title'])){
+            $where[] = ['title', 'like', "%{$request['title']}%"];
+        }
+        if(isset($request['notice_type'])){
+            $where[] = ['notice_type', $request['notice_type']];
+        }
+        return $this->noticeRule
+            ->where($where)
+            ->orderBy('id','desc')
+            ->paginate($perPage);
+    }
+
+    /**
+     * 创建消息规则
+     */
+    public function create($request)
+    {
+        $noticeUsers = [];
+        $post_type = '';
+        if($request['notice_user_type'] == 1){
+            if(!(isset($request['attribute']) && $request['attribute']) && !(isset($request['category']) && $request['category'])){
+                return Response::create([
+                    'message'  => '请选择属性或分类',
+                    'status_code'   => 500
+                ]);
+            }
+            if(isset($request['attribute']) && $request['attribute']){
+                $noticeUsers['attribute'] = $request['attribute'];
+            }
+
+            if(isset($request['category']) && $request['category']){
+                $noticeUsers['category'] = array_unique($request['category']);
+            }
+        }elseif($request['notice_user_type'] == 2){
+            if(!(isset($request['uids']) && $request['uids'])){
+                return Response::create([
+                    'message'  => '请输入用户uid',
+                    'status_code'   => 500
+                ]);
+            }
+            $uids = $noticeGroups = explode('、', $request['uids']);
+            $noticeUsers['uids'] = array_unique($uids);
+        }
+
+        if(isset($request['action_type']) && $request['action_type'] == 'post'){
+            //查看内容的类型
+            $post_type = $this->getPostType($request['action_id']);
+            if(!$post_type){
+                return Response::create([
+                    'message'  => '请输入有效内容id',
+                    'status_code'   => 500
+                ]);
+            }
+        }
+
+        $data = [
+            'notice_type' => $request['notice_type'],
+            'title' => $request['title'],
+            'content' => $request['content'],
+            'notice_user_type' => $request['notice_user_type'],
+            'notice_users' => json_encode($noticeUsers),
+            'action_type' => $request['action_type']??'',
+            'action_id' => $request['action_id']??0,
+            'post_type' => $post_type,
+            'cover' => $request['cover']??'',
+            'notice_status' => 0,
+            'send_time' => isset($request['send_time']) && $request['send_time']? $request['send_time']:null,
+            'send_count' => 0,
+        ];
+
+        DB::beginTransaction();
+        try{
+            $this->noticeRule->create($data);
+
+            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 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']);
+    }
+
+    /**
+     * 发送消息规则
+     */
+    public function send($request)
+    {
+        $message = $this->messageRule->find($request['id']);
+        if(!$message || $message->message_status != 0){
+            return Response::create([
+                'message'  => '只能发送未发送消息',
+                'status_code'   => 500
+            ]);
+        }
+
+        $message->send_time = Carbon::now()->toDateTimeString();
+
+        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 hide($request)
+    {
+        $message = $this->messageRule->find($request['id']);
+        if(!$message || $message->message_status != 2){
+            return Response::create([
+                'message'  => '只能隐藏已发送消息',
+                'status_code'   => 500
+            ]);
+        }
+
+        $message->message_status = 3;
+
+        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 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;
+        }
+    }
+}

+ 29 - 0
app/Transformers/NoticeRuleListTransformer.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Transformers;
+
+use App\Models\NoticeRule;
+use Illuminate\Support\Carbon;
+use League\Fractal\TransformerAbstract;
+
+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;
+//        }
+        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,
+        ];
+    }
+}

+ 82 - 0
database/migrations/2019_09_05_094541_create_table_notice_rule.php

@@ -0,0 +1,82 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateTableNoticeRule extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('notice_rule', function (Blueprint $table) {
+            $table->bigIncrements('id');
+
+            $table->string('title', 32)
+                ->default('')
+                ->comment('标题');
+
+            $table->string('content', 500)
+                ->default('')
+                ->comment('内容');
+
+            $table->tinyInteger('notice_status')
+                ->default(0)
+                ->comment('通知状态:0:未发送,1发送中,2已发送');
+
+            $table->tinyInteger('notice_type')
+                ->default(0)
+                ->comment('通知类型:0push,1短信');
+
+            $table->tinyInteger('notice_user_type')
+                ->default(0)
+                ->comment('通知用户类型:0全部,1条件筛选,2ID群发');
+
+            $table->json('notice_users')
+                ->nullable()
+                ->comment('通知用户:attribute,category,ids');
+
+            $table->string('action_type', 16)
+                ->default('')
+                ->comment('跳转内容');
+
+            $table->integer('action_id')
+                ->default(0)
+                ->comment('跳转id');
+
+            $table->string('post_type', 16)
+                ->default('')
+                ->comment('内容类型');
+
+            $table->string('cover', 255)
+                ->default('')
+                ->comment('封面图');
+
+            $table->integer('send_count')
+                ->default(0)
+                ->comment('发送数量');
+
+            $table->dateTime('send_time')
+                ->nullable()
+                ->comment('发送时间');
+
+            $table->softDeletes();
+
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('notice_rule');
+    }
+}

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

@@ -109,6 +109,10 @@ return [
         'cover' => '封面图',
         'send_time' => '发送时间',
         'activity_time' => '活动时间',
+        'notice_type' => '通知类型',
+        'notice_user_type' => '通知用户类型',
+        'action_type' => '跳转内容',
+        'action_id' => '跳转id',
     ],
 
 ];

+ 5 - 0
routes/api.php

@@ -77,6 +77,11 @@ $api->version('v1', [
         //创建版本号
         $api->post('upgrade', 'UpgradeController@create');
 
+        //通知规则列表
+        $api->get('notice', 'NoticeRuleController@index');
+        //添加通知规则
+        $api->post('notice', 'NoticeRuleController@create');
+
 
     });
     //配置文件