validator; } protected function buildQueryConfig(Request $request, string $scene = 'default'): array { $p = $request->all(); $config = []; $config['model'] = $this->modelClass; switch ($scene) { case 'index': $config['order']['id'] = 'desc'; break; case 'show': $config['where']['id'] = $p['id']; break; case 'store': break; case 'update': $config['where']['id'] = $p['id']; break; case 'destroy': $config['where']['id'] = $p['id']; break; } return $config; } public function serviceDestroy(Request $request) { $config = $this->buildQueryConfig($request, 'destroy'); $deleted = (new MessageNotificationsLogic())->logicDeleteBy($config); return $this->postProcess('Destroy', $deleted); } /** * 添加前置处理 */ public function servicePush(Request $request, $data) { $pushData = [ 'sender_id' => $request->user->uid, 'sender_type' => 'admin', 'title' => $data['title'], 'content' => $data['content'], 'scene' => 1, 'recipient' => $data['recipient'], 'push_method' => 1 ]; $msgId = (new MessageNotificationsService())->pushNotice($pushData); return ['msg_id' => $msgId]; } public function afterServiceList($data) { $data->each(function (&$item) { $temp = explode(',', $item->recipient); $item->recipient_list = User::whereIn('id', $temp)->pluck('name')->toArray(); $item->scene_name = MessageNotifications::SCENE[$item->scene]; $item->push_method_name = MessageNotifications::PUSH_METHOD[$item->push_method]; }); unset($item); return $data; } public function afterServiceShow($data) { $temp = explode(',', $data->recipient); $data->recipient_list = User::whereIn('id', $temp)->pluck('name')->toArray(); $data->scene_name = MessageNotifications::SCENE[$data->scene]; $data->push_method_name = MessageNotifications::PUSH_METHOD[$data->push_method]; return $data; } /** * 创建一条消息 */ public function createMessage(array $data): int { $msgId = Db::table('message_notifications')->insertGetId([ 'msg_no' => generateMsgId(), 'sender_id' => $data['sender_id'], 'sender_type' => $data['sender_type'], 'title' => $data['title'], 'content' => $data['content'], 'scene' => $data['scene'], 'recipient' => $data['recipient'], 'push_method' => $data['push_method'], 'created_at' => time(), ]); return $msgId; } /** * 批量插入用户消息状态 */ public function addUserStatus(int $msgId, array $uids) { $rows = []; foreach ($uids as $uid) { $rows[] = [ 'msg_id' => $msgId, 'uid' => $uid, 'status' => 0, 'read_at' => null ]; } if ($rows) { Db::table('message_user_status')->insert($rows); } } /** * 标记消息已读 */ public function markAsRead(array|string $msgIds, int $uid) { $query = Db::table('message_user_status')->where('uid', $uid)->where('status', 0); if (is_array($msgIds)) { $query->whereIn('msg_id', $msgIds); } return $query->update([ 'status' => 1, 'read_at' => time() ]); } /** * 获取所有用户ID */ public function getAllUserIds(): array { return User::where('status', 1)->pluck('id')->toArray(); } /** * 批量推送消息 */ public function pushNotice(array $data): int { // 数据结构: // $data = [ // 'sender_id' => 0, // 'sender_type' => 'system', // 'title' => '测试消息 - 标题', // 'content' => '测试消息 - 内容', // 'scene' => 1, // 'recipient' => [], // ]; // 写消息 $msgId = $this->createMessage([ 'sender_id' => $data['sender_id'], 'sender_type' => $data['sender_type'], 'title' => $data['title'], 'content' => $data['content'], 'scene' => $data['scene'], 'recipient' => $data['recipient'] ? implode(',', $data['recipient']) : '', 'push_method' => $data['push_method'], ]); // 写用户状态 $uids = count($data['recipient']) > 0 ? $data['recipient'] : $this->getAllUserIds(); $this->addUserStatus($msgId, $uids); // 执行推送 (new \app\common\utils\WsEvents())->pushNotice($msgId, $data['title'], $data['content'], $data['recipient']); return $msgId; } }