Browse Source

Merge branch 'liuzj-1001016-dev' into test

liuzejian 1 năm trước cách đây
mục cha
commit
8ec79a8585

+ 120 - 0
modules/Audience/Http/Controllers/UserGroupController.php

@@ -0,0 +1,120 @@
+<?php
+
+namespace Modules\Audience\Http\Controllers;
+
+use Catch\Base\CatchController;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Modules\Audience\Models\GzhUgMapModel;
+use Modules\Audience\Models\UserGroupModel;
+
+class UserGroupController extends CatchController
+{
+    use ValidatesRequests;
+    /**
+     * 用户分群列表
+     * @param Request $request
+     */
+    public function list(Request $request) {
+        $name = $request->input('name');
+        return DB::table('user_groups')
+            ->when($name, function ($query, $name){
+                return $query->where('name', 'like', '%'.$name.'%');
+            })->where([
+                'uid' => $this->getLoginUserId(),
+                'is_enabled' => 1
+            ])->orderBy('id', 'desc')
+            ->paginate($request->input('limit', 20));
+    }
+
+    /**
+     * 详情
+     * @param Request $request
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function detail(Request $request) {
+        $this->validate($request, ['id' => 'required']);
+        $uid = $this->getLoginUserId();
+        $obj = DB::table('user_groups')
+            ->where([
+                'uid' => $uid, 'is_enabled' => 1,
+                'id' => $request->input('id')
+            ])->first();
+        if($obj) {
+            // ToDo:完善
+            $obj->user_num = '-1';
+            $obj->tags_arr = \json_decode($obj->tags, true);
+            $obj->gzh_names = DB::table('gzh_ug_maps as a')
+                            ->join('wechat_authorization_infos as b', function($query) use ($uid) {
+                                $query->on('a.gzh_id', '=', 'b.id')
+                                    ->where([
+                                        'b.is_enabled' => 1,
+                                        'b.user_id' => $uid
+                                    ]);
+                            })->where([
+                                'a.ug_id' => $request->input('id')
+                ])->select('b.nick_name')->get()->pluck('nick_name')->toArray();
+        }
+
+        return $obj;
+    }
+
+    /**
+     * 添加用户分群
+     * @param Request $request
+     * @return string
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function add(Request $request){
+        $this->validate($request, [
+            'name' => 'required|string|max:64',
+            'gzh_ids' => 'required|array',
+            'tags' => 'required|array',
+            'remark' => 'nullable|string|max:140'
+        ]);
+
+        $model = UserGroupModel::create([
+            'name' => $request->input('name'), 'uid' => $this->getLoginUserId(),
+            'tags' => \json_encode($request->input('tags', []), JSON_UNESCAPED_UNICODE),
+            'remark' => $request->input('remark', '')
+        ]);
+        foreach ($request->input('gzh_ids') as $gzh_id) {
+            GzhUgMapModel::create([
+                'ug_id' => $model->id, 'gzh_id' => $gzh_id
+            ]);
+        }
+
+        return 'ok';
+    }
+
+    /**
+     * 批量删除
+     * @param Request $request
+     * @return string
+     * @throws \Illuminate\Validation\ValidationException
+     */
+    public function delete(Request $request) {
+        $this->validate($request, ['ids' => 'required|array']);
+
+        foreach ($request->input('ids') as $id) {
+            $model = UserGroupModel::where([
+                'uid' => $this->getLoginUserId(), 'id' => $id,
+                'is_enabled' => 1,
+            ])->first();
+            if($model) {
+                $model->is_enabled = 0;
+                $model->save();
+                GzhUgMapModel::where([
+                    'ug_id' => $model->id,
+                    'is_enabled' => 1
+                ])->update([
+                    'is_enabled' => 0
+                ]);
+            }
+        }
+
+
+        return 'ok';
+    }
+}

+ 9 - 0
modules/Audience/Models/GzhUgMapModel.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace Modules\Audience\Models;
+
+class GzhUgMapModel extends \Illuminate\Database\Eloquent\Model
+{
+    protected $table = 'gzh_ug_maps';
+    protected $guarded = [];
+}

+ 9 - 0
modules/Audience/Models/UserGroupModel.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace Modules\Audience\Models;
+
+class UserGroupModel extends \Illuminate\Database\Eloquent\Model
+{
+    protected $table = 'user_groups';
+    protected $guarded = [];
+}

+ 8 - 0
modules/Audience/routes/route.php

@@ -2,6 +2,7 @@
 
 use Illuminate\Support\Facades\Route;
 use Modules\Audience\Http\Controllers\AudienceController;
+use Modules\Audience\Http\Controllers\UserGroupController;
 use Modules\Video\Http\Controllers\EpisodeController;
 use Modules\Video\Http\Controllers\VideoCategoryController;
 use Modules\Video\Http\Controllers\VideoController;
@@ -12,5 +13,12 @@ Route::prefix('audienceManage')->group(function () {
     Route::prefix('audience')->group(function(){
         Route::get('detail', [AudienceController::class, 'detail'])->middleware('roleCheck:optimizer');
     });
+
+    Route::prefix('userGroup')->middleware('roleCheck:optimizer')->group(function(){
+        Route::get('list', [UserGroupController::class, 'list']);
+        Route::get('detail', [UserGroupController::class, 'detail']);
+        Route::post('add', [UserGroupController::class, 'add']);
+        Route::post('delete', [UserGroupController::class, 'delete']);
+    });
 });
 

+ 2 - 0
modules/Common/Errors/Errors.php

@@ -39,4 +39,6 @@ class Errors
     public const  OPENPLATFORM_OPTIMIZER_INFO_ERROR= [5000602, '优化师信息有误'];
     public const  WECHAT_CHECK_RECORD_NOT_EXISTS = [500305, '微信提审记录不存在'];
     public const  CALLBACK_CHARGE_MONEY_MAP_ERROR = [500107, '金额项配置不合规'];
+
+    public const OPENPLATFORM_UG_MAP_GZH_NOT_EXIST = [500603, '公众号没有配置对应用户分群'];
 }

+ 45 - 19
modules/WechatPlatform/Http/Controllers/KFMessageController.php

@@ -7,6 +7,9 @@ use Catch\Base\CatchController;
 use Illuminate\Foundation\Validation\ValidatesRequests;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\DB;
+use Modules\Common\Errors\Errors;
+use Modules\Common\Exceptions\CommonBusinessException;
+use Modules\WechatPlatform\Models\WechatKfMessageModel;
 use Modules\WechatPlatform\Services\WechatPlatformConstService;
 
 class KFMessageController extends CatchController
@@ -18,7 +21,7 @@ class KFMessageController extends CatchController
      */
     public function list(Request $request) {
         $name = $request->input('name');
-        $messageType = $request->input('messageType');
+        $messageType = $request->input('message_type');
         $status = $request->input('status');
         $sendAtStart = $request->input('send_at_start');
         $sendAtEnd = $request->input('send_at_end');
@@ -41,7 +44,7 @@ class KFMessageController extends CatchController
                 return $query->where('gzh_ids', 'like', '%#'. $gzhid . '#%');
             })->orderBy('id', 'desc')
             ->paginate($request->input('limit', 20));
-        $gzhIds = $gzhs = collect();
+        $gzhIds = $gzhs = $ugs =  collect();
         $result->pluck('gzh_ids')->every(function ($item) use ($gzhIds){
             $gzhIds->merge(explode('#', trim($item, '#')));
         });
@@ -53,13 +56,18 @@ class KFMessageController extends CatchController
                 ->get()->keyBy('id');
         }
 
+        $ugIds = $result->pluck('ug_id')->diff([0]);
+        if($ugIds->isNotEmpty()) {
+            $ugs = DB::table('user_groups')->whereIn('id', $ugIds)
+                ->select('id', 'name')->get()->keyBy('id');
+        }
+
         foreach ($result as $item) {
             $item->gzh_names = $this->strGzhId($item->gzh_ids, $gzhs);
             $item->status_str = WechatPlatformConstService::KF_MESSAGE_STATUS_MAPPER[$item->status] ?? '';
             $item->message_content_arr = \json_decode($item->message_content, true);
             $item->message_type = WechatPlatformConstService::KF_MESSAGE_TYPE_MAPPER[$item->message_type] ?? '';
-            // todo:完善
-            $item->uc_str = '';
+            $item->ug_str = $ugs->get($item->ug_id)->name ?? '';
         }
 
         return $result;
@@ -84,7 +92,7 @@ class KFMessageController extends CatchController
     public function add(Request $request) {
         $this->validate($request, [
             'name' => 'required', 'message_type' => 'required|in:1', 'message_content' => 'required|array',
-            'u_type' => 'required|in:1,2', 'uc_unique_key' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
+            'u_type' => 'required|in:1,2', 'ug_id' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
         ]);
         $now = date('Y-m-d H:i:s');
         DB::table('wechat_kf_messages')
@@ -93,7 +101,7 @@ class KFMessageController extends CatchController
                 'message_type' => $request->input('message_type'),
                 'message_content' => \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
                 'u_type' => $request->input('u_type', 1),
-                'uc_unique_key' => $request->input('uc_unique_key', ''),
+                'ug_id' => $request->input('ug_id', 0),
                 'send_at' => $request->input('send_at'),
                 'status' => WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND,
                 'user_id' => $this->getLoginUserId(),
@@ -112,7 +120,7 @@ class KFMessageController extends CatchController
         $this->validate($request, [
             'id' => 'required',
             'name' => 'required', 'message_type' => 'required|in:1', 'message_content' => 'required|array',
-            'u_type' => 'required|in:1,2', 'uc_unique_key' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
+            'u_type' => 'required|in:1,2', 'ug_id' => 'required_if:u_type,2', 'send_at' => 'required|date_format:Y-m-d H:i:s',
         ]);
         $now = date('Y-m-d H:i:s');
         DB::table('wechat_kf_messages')
@@ -126,7 +134,7 @@ class KFMessageController extends CatchController
                 'message_type' => $request->input('message_type'),
                 'message_content' =>  \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
                 'u_type' => $request->input('u_type', '1'),
-                'uc_unique_key' => $request->input('uc_unique_key', ''),
+                'ug_id' => $request->input('ug_id', 0),
                 'send_at' => $request->input('send_at'),
                 'updated_at' => $now,
             ]);
@@ -143,17 +151,35 @@ class KFMessageController extends CatchController
             'id' => 'required',
             'gzh_ids' => 'required|array'
         ]);
-        $now = date('Y-m-d H:i:s');
-        DB::table('wechat_kf_messages')
-            ->where([
-                ['id', '=', $request->input('id')],
-                ['user_id', '=', $this->getLoginUserId()],
-                ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
-                ['is_enabled', '=', 1],
-            ])->update([
-                'gzh_ids' => sprintf('#%s#', join('#', array_unique($request->input('gzh_ids')))),
-                'updated_at' => $now,
-            ]);
+
+        $message  = WechatKfMessageModel::where([
+            ['id', '=', $request->input('id')],
+            ['user_id', '=', $this->getLoginUserId()],
+            ['status', '=', WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND],
+            ['is_enabled', '=', 1],
+        ])->first();
+        if(!$message) {
+            $allGzhIds = $request->input('gzh_ids');
+            if(2 == $message->u_type) {
+                $configGzhIds = DB::table('gzh_ug_maps')
+                    ->where([
+                        ['is_enabled', '=', 1],
+                        ['ug_id', '=', $message->id]
+                    ])->select('gzh_id')->get()->pluck('gzh_id');
+
+                if(collect($allGzhIds)->diff($configGzhIds)->isNotEmpty()) {
+                    $gzhNames = DB::table('wechat_authorization_infos')
+                        ->whereIn('id', collect($allGzhIds)->diff($configGzhIds)->unique())
+                        ->select( 'nick_name')
+                        ->get()->pluck('nick_name')->join(', ');
+                    CommonBusinessException::throwError([
+                        Errors::OPENPLATFORM_UG_MAP_GZH_NOT_EXIST[0], $gzhNames. ' 等公众号没有配置对应用户分群'
+                    ]);
+                }
+            }
+            $message->gzh_ids = sprintf('#%s#', join('#', array_unique($request->input('gzh_ids'))));
+            $message->save();
+        }
 
         return 'ok';
     }

+ 9 - 0
modules/WechatPlatform/Models/WechatKfMessageModel.php

@@ -0,0 +1,9 @@
+<?php
+
+namespace Modules\WechatPlatform\Models;
+
+class WechatKfMessageModel extends \Illuminate\Database\Eloquent\Model
+{
+    protected $table = 'wechat_kf_messages';
+    protected $guarded = [];
+}

+ 56 - 0
tests/Audience/Http/Controllers/UserGroupControllerTest.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace Tests\Audience\Http\Controllers;
+
+use Modules\Audience\Http\Controllers\UserGroupController;
+use PHPUnit\Framework\TestCase;
+use Tests\UsedTestCase;
+
+class UserGroupControllerTest extends UsedTestCase
+{
+
+    public function testAdd()
+    {
+        $res = $this->withHeaders([
+            'Authorization' => 'Bearer '. $this->token,
+        ])->json('post','http://localhost/api/audienceManage/userGroup/add', [
+            'name' => uniqid('liuzj-test-'),
+            'gzh_ids' => [6,8],
+            'tags' => [
+                'attention_hour' => '0-6',
+                'in_48_hour' => 1,
+                'interact_hour' => '0-6',
+            ],
+            'remark' => uniqid('', true)
+        ]);
+        $this->dumpJson($res);
+    }
+    public function testDetail()
+    {
+        $res = $this->withHeaders([
+            'Authorization' => 'Bearer '. $this->token,
+        ])->json('get','http://localhost/api/audienceManage/userGroup/detail', [
+            'id' => 1
+        ]);
+        $this->dumpJson($res);
+    }
+    public function testlist()
+    {
+        $res = $this->withHeaders([
+            'Authorization' => 'Bearer '. $this->token,
+        ])->json('get','http://localhost/api/audienceManage/userGroup/list', [
+            'name' => '207'
+        ]);
+        $this->dumpJson($res);
+    }
+    public function testDelete()
+    {
+        $res = $this->withHeaders([
+            'Authorization' => 'Bearer '. $this->token,
+        ])->json('get','http://localhost/api/audienceManage/userGroup/delete', [
+            'id' => 1
+        ]);
+        $this->dumpJson($res);
+    }
+
+}