From 04ec23b09b07350935a3d5c9727f90346cc2c830 Mon Sep 17 00:00:00 2001 From: wong <106998207@qq.com> Date: Wed, 23 Apr 2025 12:01:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/WechatGroupMemberSelector.tsx | 6 +- .../api/controller/MessageController.php | 64 +++++++++--- .../chatroom/GetChatroomListV1Controller.php | 4 +- .../store/controller/TrafficPackage.php | 97 +++++++++++++++++++ .../store/model/TrafficPackage.php | 37 +++++++ .../store/model/TrafficPackageOrder.php | 15 +++ .../store/model/TrafficUsageLog.php | 14 +++ 7 files changed, 216 insertions(+), 21 deletions(-) create mode 100644 Server/application/store/controller/TrafficPackage.php create mode 100644 Server/application/store/model/TrafficPackage.php create mode 100644 Server/application/store/model/TrafficPackageOrder.php create mode 100644 Server/application/store/model/TrafficUsageLog.php diff --git a/Cunkebao/components/WechatGroupMemberSelector.tsx b/Cunkebao/components/WechatGroupMemberSelector.tsx index 95abd142..9bcb997e 100644 --- a/Cunkebao/components/WechatGroupMemberSelector.tsx +++ b/Cunkebao/components/WechatGroupMemberSelector.tsx @@ -66,9 +66,9 @@ export function WechatGroupMemberSelector({ if (response.code === 200 && response.data) { const membersList = response.data.list.map((item: any) => ({ id: item.id || `member-${Math.random()}`, - nickname: item.name || item.ownerNickname || '未知成员', - wechatId: item.ownerWechatId || '', - avatar: item.ownerAvatar || item.avatar || '/placeholder.svg', + nickname: item.nickname || '未知成员', + wechatId: item.identifier || '', + avatar: item.avatar || '/placeholder.svg', role: item.isOwner ? 'owner' : (item.isAdmin ? 'admin' : 'member'), joinTime: item.createTime ? new Date(item.createTime * 1000).toLocaleString() : '--' })) diff --git a/Server/application/api/controller/MessageController.php b/Server/application/api/controller/MessageController.php index 526d290d..1edfeb92 100644 --- a/Server/application/api/controller/MessageController.php +++ b/Server/application/api/controller/MessageController.php @@ -391,25 +391,26 @@ class MessageController extends BaseController /** * 保存群聊消息记录到数据库 * @param array $item 消息记录数据 + * @return bool 是否保存成功 */ private function saveChatroomMessage($item) { - - // 检查消息是否已存在 - $exists = WechatMessageModel::where('id', $item['id']) ->find(); + $exists = WechatMessageModel::where('id', $item['id'])->find(); // 如果消息已存在,直接返回 if ($exists) { - return; + return true; } // 处理发送者信息 $sender = $item['sender'] ?? []; - // 处理消息内容,提取真正的消息内容 + // 处理消息内容,提取发送者ID和消息内容 $originalContent = $item['content'] ?? ''; - $processedContent = $this->processMessageContent($originalContent); + $processedResult = $this->processMessageContent($originalContent); + $senderId = $processedResult['senderId']; + $processedContent = $processedResult['content']; // 将毫秒时间戳转换为秒级时间戳 $createTime = isset($item['createTime']) ? strtotime($item['createTime']) : null; @@ -422,7 +423,7 @@ class MessageController extends BaseController 'wechatChatroomId' => $item['wechatChatroomId'], // sender信息,添加sender前缀 'senderNickname' => $sender['nickname'] ?? '', - 'senderWechatId' => $sender['wechatId'] ?? '', + 'senderWechatId' => $sender['wechatId'] ?? $senderId, // 使用提取的发送者ID作为备选 'senderIsAdmin' => $sender['isAdmin'] ?? false, 'senderIsDeleted' => $sender['isDeleted'] ?? false, 'senderChatroomNickname' => $sender['chatroomNickname'] ?? '', @@ -449,26 +450,57 @@ class MessageController extends BaseController ]; // 创建新记录 - WechatMessageModel::create($data); + try { + WechatMessageModel::create($data); + return true; + } catch (\Exception $e) { + return false; + } } /** - * 处理消息内容,提取真正的消息内容 - * @param string $content 原始内容 - * @return string 处理后的内容 + * 处理消息内容,提取发送者ID和消息内容 + * @param string $content 原始消息内容 + * @return array 包含senderId和content的数组 */ private function processMessageContent($content) { if (empty($content)) { - return ''; + return [ + 'senderId' => '', + 'content' => '' + ]; } - // 处理普通消息格式:wxid_vr2qafb1vg0d22:\n安德玛儿童 - if (preg_match('/^[^:]+:\n(.+)$/s', $content, $matches)) { - return trim($matches[1]); + // 处理消息格式:wxid_vr2qafb1vg0d22:\n安德玛儿童 + if (preg_match('/^([^:]+):\n(.+)$/s', $content, $matches)) { + $senderId = trim($matches[1]); + $messageContent = trim($matches[2]); + + // 检查消息内容是否为JSON格式 + if (substr($messageContent, 0, 1) === '{' && substr($messageContent, -1) === '}') { + try { + // 尝试解析JSON + $jsonData = json_decode($messageContent, true); + if (json_last_error() == JSON_ERROR_NONE && isset($jsonData['text'])) { + // 如果是合法的JSON且包含text字段,则提取text字段作为内容 + $messageContent = $jsonData['text']; + } + } catch (\Exception $e) { + // JSON解析出错,保持原内容不变 + } + } + + return [ + 'senderId' => $senderId, + 'content' => $messageContent + ]; } // 如果没有匹配到格式,则返回原始内容 - return $content; + return [ + 'senderId' => '', + 'content' => $content + ]; } } \ No newline at end of file diff --git a/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php b/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php index ce7facfe..83e50ee3 100644 --- a/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php +++ b/Server/application/cunkebao/controller/chatroom/GetChatroomListV1Controller.php @@ -82,11 +82,11 @@ class GetChatroomListV1Controller extends BaseController try { $where = []; $where[] = ['m.groupId', '=', $groupId]; - $where[] = ['m.deleteTime', '=', 0]; + $where[] = ['m.deleteTime', '<=', 0]; // 如果有搜索关键词 if (!empty($keyword)) { - $where[] = ['m.nickname|m.identifier', 'like', '%'.$keyword.'%']; + $where[] = ['wa.nickname|m.identifier', 'like', '%'.$keyword.'%']; } $data = Db::name('wechat_group_member') diff --git a/Server/application/store/controller/TrafficPackage.php b/Server/application/store/controller/TrafficPackage.php new file mode 100644 index 00000000..664ce705 --- /dev/null +++ b/Server/application/store/controller/TrafficPackage.php @@ -0,0 +1,97 @@ +field([ + 'id', + 'name', + 'tags', + 'originalPrice', + 'price', + 'monthlyTraffic', + 'duration', + 'privileges', + 'createTime' + ])->select(); + + // 处理数据 + $list = collection($list)->each(function($item) { + // 添加计算字段 + $item['discount'] = $item->discount; // 折扣 + $item['totalTraffic'] = $item->totalTraffic; // 总流量 + // 确保特权是数组格式 + $item['privileges'] = $item->privileges; // 使用模型的获取器处理特权 + // 格式化时间 + $item['createTime'] = date('Y-m-d H:i:s', strtotime($item['createTime'])); + return $item; + }); + return successJson($list,'获取成功'); + } + + + /** + * 获取当前套餐使用情况 + * @return \think\response\Json + */ + public function getUsage() + { + // 获取用户ID,可以从session或token中获取 + $userId = input('userId', 0, 'intval'); + if (empty($userId)) { + return errorJson('请先登录'); + } + + // 获取用户当前生效的套餐订单 + $order = model('TrafficPackageOrder') + ->where('userId', $userId) + ->where('status', 1) // 1表示生效中 + ->where('expireTime', '>', time()) // 未过期 + ->order('expireTime', 'desc') // 取最晚过期的 + ->find(); + + if (empty($order)) { + return errorJson('未找到有效的套餐'); + } + + // 获取套餐详情 + $package = TrafficPackageModel::get($order['packageId']); + if (empty($package)) { + return errorJson('套餐信息不存在'); + } + + // 计算套餐使用情况 + $totalUsers = $package['monthlyTraffic'] * $package['duration']; // 总人数 + $usedUsers = model('TrafficUsageLog') + ->where('orderId', $order['id']) + ->count(); // 已使用人数 + + // 计算剩余有效期(天数) + $remainDays = ceil(($order['expireTime'] - time()) / (60 * 60 * 24)); + $remainDays = max(0, $remainDays); // 确保不会出现负数 + + $data = [ + 'packageName' => $package['name'], // 套餐名称 + 'totalUsers' => $totalUsers, // 总人数 + 'usedUsers' => $usedUsers, // 已使用人数 + 'remainUsers' => $totalUsers - $usedUsers, // 剩余可用人数 + 'remainDays' => $remainDays, // 剩余有效期(天) + 'expireTime' => date('Y-m-d', $order['expireTime']), // 过期时间 + 'usagePercent' => $totalUsers > 0 ? round(($usedUsers / $totalUsers) * 100, 1) : 0, // 使用百分比 + ]; + + return successJson($data, '获取成功'); + } + +} \ No newline at end of file diff --git a/Server/application/store/model/TrafficPackage.php b/Server/application/store/model/TrafficPackage.php new file mode 100644 index 00000000..4fb045b8 --- /dev/null +++ b/Server/application/store/model/TrafficPackage.php @@ -0,0 +1,37 @@ + 'timestamp', + 'updateTime' => 'timestamp', + 'expireTime' => 'timestamp', + ]; +} \ No newline at end of file diff --git a/Server/application/store/model/TrafficUsageLog.php b/Server/application/store/model/TrafficUsageLog.php new file mode 100644 index 00000000..8f5b46b4 --- /dev/null +++ b/Server/application/store/model/TrafficUsageLog.php @@ -0,0 +1,14 @@ + 'timestamp', + 'updateTime' => 'timestamp', + ]; +} \ No newline at end of file