Sfoglia il codice sorgente

客服消息的后台管理操作

liuzejian 1 anno fa
parent
commit
e0dda78f0f

+ 19 - 0
modules/Common/Repository/Options/CommonParams.php

@@ -3,6 +3,7 @@
 namespace Modules\Common\Repository\Options;
 
 use Catch\Enums\Status as StatusEnum;
+use Modules\WechatPlatform\Services\WechatPlatformConstService;
 
 class CommonParams implements OptionInterface
 {
@@ -25,6 +26,24 @@ class CommonParams implements OptionInterface
              * 首页列表类型
              */
             'firstPageListType' => $commonConfig['firstPageListType'],
+            /**
+             * 微信公众号运营
+             */
+            'wechatPlatform' => [
+                'kfMessageType' => $this->_turn(WechatPlatformConstService::KF_MESSAGE_TYPE_MAPPER),
+                'kfMessageStatus' => $this->_turn(WechatPlatformConstService::KF_MESSAGE_STATUS_MAPPER),
+            ]
         ];
     }
+
+    private function _turn($arr) {
+        $result = [];
+        foreach ($arr as $key => $val) {
+            $result[] = [
+                'label' => $val,
+                'value' => $key
+            ];
+        }
+        return $result;
+    }
 }

+ 206 - 0
modules/WechatPlatform/Http/KFMessageController.php

@@ -0,0 +1,206 @@
+<?php
+
+namespace Modules\WechatPlatform\Http;
+
+use Catch\Base\CatchController;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Modules\WechatPlatform\Services\WechatPlatformConstService;
+
+class KFMessageController extends CatchController
+{
+    use ValidatesRequests;
+    /**
+     * 客服消息列表
+     * @param Request $request
+     */
+    public function list(Request $request) {
+        $name = $request->input('name');
+        $messageType = $request->input('messageType');
+        $status = $request->input('status');
+        $sendAtStart = $request->input('send_at_start');
+        $sendAtEnd = $request->input('send_at_end');
+        $gzhid = $request->input('gzh_id');
+        $result = DB::table('wechat_kf_messages')
+            ->where([
+                ['is_enable' , '=', 1],
+                ['user_id', '=', $this->getLoginUserId()]
+            ])->when($name, function ($query, $name){
+                return $query->where('name', 'like', '%'. $name. '%');
+            })->when($messageType, function ($query, $messageType){
+                return $query->where('message_type', $messageType);
+            })->when($status, function ($query, $status){
+                return $query->where('status', $status);
+            })->when($sendAtStart, function ($query, $sendAtStart){
+                return $query->where('start_at', '>=', $sendAtStart);
+            })->when($sendAtEnd, function ($query, $sendAtEnd){
+                return $query->where('start_at', '<=', $sendAtEnd . ' 23:59:59');
+            })->when($gzhid, function ($query, $gzhid){
+                return $query->where('gzh_ids', 'like', '%#'. $gzhid . '#%');
+            })->orderBy('id', 'desc')
+            ->paginate($request->input('limit', 20));
+        $gzhIds = $gzhs = collect();
+        $result->pluck('gzh_ids')->every(function ($item) use ($gzhIds){
+            $gzhIds->merge(explode('#', trim($item, '#')));
+        });
+
+        if($gzhIds->isNotEmpty()) {
+            $gzhs = DB::table('wechat_authorization_infos')
+                ->whereIn('id', $gzhIds)
+                ->select('id', 'nick_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] ?? '';
+        }
+
+        return $result;
+    }
+
+    private function strGzhId($gzh_ids, $gzhs) {
+        $gzh_names = collect();
+        foreach (explode('#', trim($gzh_ids, '#')) as $gzh_id) {
+            $gzh_names->push($gzhs->get($gzh_id)->nick_name ?? 'ID:'. $gzh_id);
+        }
+
+        return $gzh_names->unique()->join(', ');
+    }
+
+    /**
+     * 新增
+     * @param Request $request
+     */
+    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', 'send_at' => 'required|date_format:Y-m-d H:i:s',
+        ]);
+        $now = date('Y-m-d H:i:s');
+        DB::table('wechat_kf_messages')
+            ->insert([
+                'name' => $request->input('name'),
+                'message_type' => $request->input('message_type'),
+                'message_content' => \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
+                'u_type' => $request->input('user_type'),
+                'uc_unique_key' => $request->input('user_classify_unique_key'),
+                'send_at' => $request->input('send_at'),
+                'status' => WechatPlatformConstService::KF_MESSAGE_STATUS_PRE_SEND,
+                'user_id' => $this->getLoginUserId(),
+                'created_at' => $now,
+                'updated_at' => $now,
+            ]);
+
+        return 'ok';
+    }
+
+    /**
+     * 修改客服消息内容
+     * @param Request $request
+     */
+    public function updateContent(Request $request) {
+        $this->validate($request, [
+            'id' => 'required',
+        ]);
+        $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([
+                'name' => $request->input('name'),
+                'message_type' => $request->input('message_type'),
+                'message_content' =>  \json_encode($request->input('message_content'), JSON_UNESCAPED_UNICODE),
+                'u_type' => $request->input('user_type'),
+                'uc_unique_key' => $request->input('user_classify_unique_key'),
+                'send_at' => $request->input('send_at'),
+                'updated_at' => $now,
+            ]);
+
+        return 'ok';
+    }
+
+    /**
+     * 修改配置的公众号
+     * @param Request $request
+     */
+    public function updateGZH(Request $request){
+        $this->validate($request, [
+            '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,
+            ]);
+
+        return 'ok';
+    }
+
+    /**
+     * 停止发送
+     * @param Request $request
+     */
+    public function stop(Request $request) {
+        $this->validate($request, [
+            'id' => 'required'
+        ]);
+        $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([
+                'status' => WechatPlatformConstService::KF_MESSAGE_STATUS_STOP,
+                'updated_at' => $now,
+            ]);
+
+        return 'ok';
+    }
+
+    /**
+     * 删除
+     * @param Request $request
+     */
+    public function delete(Request $request){
+        $this->validate($request, [
+            'id' => 'required'
+        ]);
+        $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_SENDING],
+                ['is_enabled', '=', 1],
+            ])->update([
+                'is_enabled' => 0,
+                'updated_at' => $now,
+            ]);
+        DB::table('wechat_kf_message_send_records')
+            ->where([
+                ['message_id', '=', $request->input('id')],
+                ['is_enabled', '=', 1]
+            ])->update([
+                'is_enabled' => 0,
+                'updated_at' => $now,
+            ]);
+        return 'ok';
+    }
+
+}

+ 36 - 0
modules/WechatPlatform/Services/WechatPlatformConstService.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace Modules\WechatPlatform\Services;
+
+class WechatPlatformConstService
+{
+    /**
+     * 客服消息状态:待发送
+     */
+    public const KF_MESSAGE_STATUS_PRE_SEND=1;
+    /**
+     * 客服消息状态:发送中
+     */
+    public const KF_MESSAGE_STATUS_SENDING=2;
+    /**
+     * 客服消息状态:发送完成
+     */
+    public const KF_MESSAGE_STATUS_FINISH=3;
+    /**
+     * 客服消息状态:已停止
+     */
+    public const KF_MESSAGE_STATUS_STOP=4;
+    /**
+     * 客服消息状态-映射表
+     */
+    public const KF_MESSAGE_STATUS_MAPPER = [
+        '1' => '待发送', '2'  => '发送中', '3' => '发送完毕', '4' => '已停止'
+    ];
+
+    /**
+     * 客服消息类型:纯文本
+     */
+    public const KF_MESSAGE_TYPE_MAPPER = [
+        '1' => '纯文本'
+    ];
+}