代码优化
This commit is contained in:
@@ -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() : '--'
|
||||
}))
|
||||
|
||||
@@ -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
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -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')
|
||||
|
||||
97
Server/application/store/controller/TrafficPackage.php
Normal file
97
Server/application/store/controller/TrafficPackage.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
namespace app\store\controller;
|
||||
|
||||
use app\store\model\TrafficPackage as TrafficPackageModel;
|
||||
use think\Controller;
|
||||
|
||||
class TrafficPackage extends Controller
|
||||
{
|
||||
/**
|
||||
* 获取流量套餐列表
|
||||
*/
|
||||
public function getList()
|
||||
{
|
||||
$model = new TrafficPackageModel;
|
||||
|
||||
// 获取列表数据
|
||||
$list = $model->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, '获取成功');
|
||||
}
|
||||
|
||||
}
|
||||
37
Server/application/store/model/TrafficPackage.php
Normal file
37
Server/application/store/model/TrafficPackage.php
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
namespace app\store\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class TrafficPackage extends Model
|
||||
{
|
||||
protected $name = 'traffic_package';
|
||||
|
||||
// 自动转换特权文本为数组
|
||||
public function getPrivilegesAttr($value)
|
||||
{
|
||||
return empty($value) ? [] : explode("\n", $value);
|
||||
}
|
||||
|
||||
// 计算折扣
|
||||
public function getDiscountAttr($value, $data)
|
||||
{
|
||||
if (empty($data['originalPrice']) || $data['originalPrice'] == 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
// 原价和售价相同时返回原价
|
||||
if ($data['originalPrice'] == $data['price']) {
|
||||
return '原价';
|
||||
}
|
||||
|
||||
$discount = round(($data['price'] / $data['originalPrice']) * 100);
|
||||
return $discount . '折';
|
||||
}
|
||||
|
||||
// 计算总流量
|
||||
public function getTotalTrafficAttr($value, $data)
|
||||
{
|
||||
return $data['monthlyTraffic'] * $data['duration'];
|
||||
}
|
||||
}
|
||||
15
Server/application/store/model/TrafficPackageOrder.php
Normal file
15
Server/application/store/model/TrafficPackageOrder.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
namespace app\store\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class TrafficPackageOrder extends Model
|
||||
{
|
||||
|
||||
// 自动转换时间为时间戳
|
||||
protected $type = [
|
||||
'createTime' => 'timestamp',
|
||||
'updateTime' => 'timestamp',
|
||||
'expireTime' => 'timestamp',
|
||||
];
|
||||
}
|
||||
14
Server/application/store/model/TrafficUsageLog.php
Normal file
14
Server/application/store/model/TrafficUsageLog.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
namespace app\store\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class TrafficUsageLog extends Model
|
||||
{
|
||||
|
||||
// 自动转换时间为时间戳
|
||||
protected $type = [
|
||||
'createTime' => 'timestamp',
|
||||
'updateTime' => 'timestamp',
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user