Files
huangjingfen/pro_v3.5.1/app/services/community/CommunityServices.php

897 lines
35 KiB
PHP
Raw Normal View History

2026-03-07 22:29:07 +08:00
<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2026 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\services\community;
use app\dao\community\CommunityDao;
use app\services\BaseServices;
use app\services\product\product\StoreProductServices;
use app\services\product\category\StoreProductCategoryServices;
use app\services\user\UserBillServices;
use app\services\user\UserServices;
use app\services\wechat\WechatUserServices;
use crmeb\services\FormBuilder as Form;
use crmeb\services\wechat\MiniProgram;
use think\annotation\Inject;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\Route as Url;
/**
* 社区
* Class CommunityServices
* @package app\services\community
* @mixin CommunityDao
*/
class CommunityServices extends BaseServices
{
/**
* 移动端社区内容需要默认值
* @var array
*/
protected array $videoDefault = [
'isMore' => false,
'state' => "pause",
'playIng' => false,
'isShowimage' => false,
'isShowProgressBarTime' => false,
'isplay' => true
];
/**
* @var CommunityDao
*/
#[Inject]
protected CommunityDao $dao;
/**
* 获取话题信息(获取不到抛出异常)
* @param int $id
* @param string $field
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getCommunityInfo(int $id, string $field = '*')
{
$videoInfo = $this->dao->getOne(['id' => $id], $field);
if (!$videoInfo) {
throw new ValidateException('获取社区内容信息失败');
}
return $videoInfo->toArray();
}
/**
* 获取社区内容详情
* @param int $id
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getInfo(int $id)
{
$info = $this->dao->get($id);
if (!$info) {
throw new ValidateException('社区内容不存在');
}
$info = $info->toArray();
$site_name = sys_config('site_name');
$site_image = sys_config('wap_login_logo');
$info['author'] = $site_name;
$info['author_image'] = $site_image;
if ($info['type'] == 2) {//用户
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$userInfo = $userServices->getUserCacheInfo((int)$info['relation_id']);
$info['author'] = $userInfo['nickname'] ?? '';
$info['author_image'] = $userInfo['avatar'] ?? '';
}
$topic = [];
if ($info['topic_id']) {
$info['topic_id'] = is_string($info['topic_id']) ? explode(',', $info['topic_id']) : $info['topic_id'];
/** @var CommunityTopicServices $communityTopicServices */
$communityTopicServices = app()->make(CommunityTopicServices::class);
$topic = $communityTopicServices->getColumn([['id', 'in', $info['topic_id']]], 'id,name');
}
$info['topic'] = $topic;
$productInfo = [];
if ($info['product_id']) {
$info['product_id'] = is_string($info['product_id']) ? explode(',', $info['product_id']) : $info['product_id'];
/** @var StoreProductServices $productServices */
$productServices = app()->make(StoreProductServices::class);
$product_where = ['is_del' => 0, 'is_show' => 1, 'is_verify' => 1];
$productInfo = $productServices->getSearchList($product_where + ['ids' => $info['product_id']], 0, 0, ['id', 'type', 'product_type', 'price', 'image', 'store_name', 'cate_id', 'sales', 'stock'], '', []);
if ($productInfo) {
$cateIds = implode(',', array_column($productInfo, 'cate_id'));
/** @var StoreProductCategoryServices $categoryService */
$categoryService = app()->make(StoreProductCategoryServices::class);
$cateList = $categoryService->getCateParentAndChildName($cateIds);
foreach ($productInfo as $key => &$item) {
$item['cate_name'] = '';
if (isset($item['cate_id']) && $item['cate_id']) {
$cate_ids = explode(',', $item['cate_id']);
$cate_name = $categoryService->getCateName($cate_ids, $cateList);
if ($cate_name) {
$item['cate_name'] = is_array($cate_name) ? implode(',', $cate_name) : '';
}
}
}
}
}
$info['productInfo'] = $productInfo;
return $info;
}
/**
* 社区顶部header
* @param array $where
* @return array[]
* @throws \think\db\exception\DbException
*/
public function getHeader(array $where = [])
{
if (isset($where['store_id']) && $where['store_id']) {
$where['type'] = 1;
$where['relation_id'] = $where['store_id'];
unset($where['store_id']);
}
//已发布
$onPublish = $this->dao->count(['is_verify' => 1] + $where);
//待审核
$unVerify = $this->dao->count(['is_verify' => 0] + $where);
//审核未通过
$verifyFail = $this->dao->count(['is_verify' => -1] + $where);
//强制下架
$remove = $this->dao->count(['is_verify' => -2] + $where);
return [
['is_verify' => 1, 'name' => '已发布', 'count' => $onPublish],
['is_verify' => 0, 'name' => '待审核', 'count' => $unVerify],
['is_verify' => -1, 'name' => '审核未通过', 'count' => $verifyFail],
['is_verify' => -2, 'name' => '强制下架', 'count' => $remove],
];
}
/**
* 社区内容列表
* @param $where
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getList(array $where, array $with = [], string $order = '', int $uid = 0)
{
[$page, $limit] = $this->getPageValue();
$list = $this->dao->getList($where, '*', $page, $limit, $with, $order);
$count = $this->dao->count($where);
$site_name = sys_config('site_name');
$site_image = sys_config('wap_login_logo');
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$communityTopicServices = app()->make(CommunityTopicServices::class);
$topicList = array_column($list, 'topic');
$topIds = [];
foreach ($topicList as $topic) {
foreach ($topic as $item) {
if (!isset($topIds[$item['right_id']])) {
$topIds[$item['right_id']] = $item['right_id'];
}
}
}
$_topicList = $communityTopicServices->getColumn(['id' => $topIds], 'name', 'id', true);
foreach ($list as &$item) {
$topicName = array_filter(array_map(function ($v) use ($_topicList) {
return $_topicList[$v['right_id']] ?? null;
}, $item['topic']));
$item['topicName'] = implode(',', $topicName);
$item['author'] = $site_name;
$item['author_image'] = $site_image;
if ($item['type'] == 2) {//用户
$userInfo = $userServices->getUserCacheInfo((int)$item['relation_id']);
$item['author'] = $userInfo['nickname'] ?? '';
$item['author_image'] = $userInfo['avatar'] ?? '';
}
}
return compact('list', 'count');
}
/**
* 移动端列表
* @param array $where
* @param $uid
* @return array
* @throws \ReflectionException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* User: liusl
* DateTime: 2024/8/13 11:46
*/
public function getApiList(array $where, $uid = 0, $order = 'add_time desc')
{
[$page, $limit] = $this->getPageValue();
$order_by_id = [];
if (isset($where['start_id']) && $where['start_id']) {
$start_id = $where['start_id'];
unset($where['start_id']);
$order_by_id = array_merge([(int)$start_id], $this->dao->getIdColumn(array_merge(['notId' => $start_id], $where), 'id', $limit));
}
$list = $this->dao->search($where)
->with(
[
'product' => function ($product) {
$product->with(['product']);
},
'topic' => function ($topic) {
$topic->with(['topic']);
}
]
)->when(true, function ($query) use ($order_by_id, $order) {
if ($order_by_id) {
$query->whereIn('id', $order_by_id)->orderRaw('FIELD(id,' . implode(',', $order_by_id) . ')');
} else {
$query->order($order);
}
})
->page($page, $limit)->select()->toArray();
/** @var CommunityCacheServices $communityCacheServices */
$communityCacheServices = app()->make(CommunityCacheServices::class);
/** @var CommunityUserServices $communityUserServices */
$communityUserServices = app()->make(CommunityUserServices::class);
foreach ($list as &$item) {
$item['time_text'] = timeConverter(strtotime($item['add_time']));
$userFormat = $communityUserServices->getUserFormat($item['type'], $item['relation_id']);
$item['author'] = $userFormat['author'];
$item['author_image'] = $userFormat['author_image'];
if ($item['product']) {
$productList = [];
$productIds = [];
foreach ($item['product'] as $pro) {
if (isset($pro['product']) && $pro['product']) {
$productIds[] = $pro['product']['id'];
$productList[] = $pro['product'];
}
}
$productCount = count($productList);
$item['product'] = $productList;
$item['product_id'] = $productIds;
$item['productCount'] = $productCount;
}
if ($item['topic']) {
$topicList = [];
foreach ($item['topic'] as $top) {
if (isset($top['topic']) && $top['topic']) {
$topicList[] = $top['topic'];
}
}
$item['topic'] = $topicList;
}
if ($uid) {
//是否是自己
$item['is_self'] = $uid == $item['relation_id'] ? 1 : 0;
//是否点赞
$item['is_like'] = $communityCacheServices->checkUserLike($item['id'], $uid);
//是否关注
$item['is_follow'] = $communityCacheServices->checkUserLike($item['relation_id'], $uid, CommunityCacheServices::COMMUNITY_INTEREST);
}
}
return $list;
}
/**
* 移动端详情
* @param $id
* @param int $uid
* @return array
* @throws \ReflectionException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* User: liusl
* DateTime: 2024/8/13 11:34
*/
public function getDetail(int $id, int $uid = 0, $is_admin = false)
{
/** @var CommunityUserServices $communityUserServices */
$communityUserServices = app()->make(CommunityUserServices::class);
/** @var CommunityCacheServices $communityCacheServices */
$communityCacheServices = app()->make(CommunityCacheServices::class);
$where = [
'id' => $id,
'is_del' => 0
];
$info = $this->dao->search($where)
->with(
[
'product' => function ($product) {
$product->with(['product']);
},
'topic' => function ($topic) {
$topic->with(['topic']);
}
]
)->find();
if (!$info) {
throw new ValidateException('数据不存在');
}
if (($info['is_verify'] != 1 || $info['status'] != 1) && $uid != $info['relation_id'] && !$is_admin) {
throw new ValidateException('数据不存在');
}
$info = $info->toArray();
$userFormat = $communityUserServices->getUserFormat($info['type'], $info['relation_id']);
$info['author'] = $userFormat['author'];
$info['author_image'] = $userFormat['author_image'];
$info['is_self'] = $uid == $info['relation_id'] ? 1 : 0;
if ($info['product']) {
$productList = [];
$productIds = [];
foreach ($info['product'] as $pro) {
if (isset($pro['product']) && $pro['product']) {
$productIds[] = $pro['product']['id'];
$productList[] = $pro['product'];
}
}
$productCount = count($productList);
$info['product'] = $productList;
$info['product_id'] = $productIds;
$info['productCount'] = $productCount;
}
if ($is_admin) {
$communityRelevanceServices = app()->make(CommunityRelevanceServices::class);
$communityTopicServices = app()->make(CommunityTopicServices::class);
$topicIds = $communityRelevanceServices->search(['left_id' => $id, 'type' => CommunityRelevanceServices::TYPE_COMMUNITY_TOPIC])->column('right_id');
$info['topic'] = count($topicIds) ? $communityTopicServices->search(['id' => $topicIds])->field('id,name')->select()->toArray() : [];
} else {
if ($info['topic']) {
$topicList = [];
foreach ($info['topic'] as $top) {
if (isset($top['topic']) && $top['topic']) {
$topicList[] = $top['topic'];
}
}
$info['topic'] = $topicList;
}
}
$info['is_like'] = $info['is_follow'] = 0;
if ($uid) {
//是否点赞
$info['is_like'] = $communityCacheServices->checkUserLike($info['id'], $uid);
//是否关注
$info['is_follow'] = $communityCacheServices->checkUserLike($info['relation_id'], $uid, CommunityCacheServices::COMMUNITY_INTEREST);
}
$this->setBrowse($id, $uid);
return $info;
}
/**
* 增加浏览量
*
* 该方法用于增加特定内容的浏览量,并记录用户的浏览行为。它首先检查是否存在指定的内容,
* 如果内容存在,则增加其浏览量。同时,通过调用缓存服务检查用户是否已经浏览过该内容,
* 如果没有,则记录用户的浏览行为,并通过相关服务创建一条浏览相关的记录。
*
* @param int $id 内容ID标识要增加浏览量的内容。
* @param int $uid 用户ID标识正在浏览内容的用户。
*
* @return bool 总是返回true表示操作成功。
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function setBrowse(int $id, int $uid = 0): bool
{
// 获取内容信息
$info = $this->dao->get($id);
if (!$info) return true;
$info->play_num = $info->play_num + 1;
$info->save();
if (!$uid) return true;
// 浏览记录
/** @var CommunityCacheServices $communityCacheServices */
$communityCacheServices = app()->make(CommunityCacheServices::class);
/** @var CommunityRelevanceServices $communityRelevanceServices */
$communityRelevanceServices = app()->make(CommunityRelevanceServices::class);
// 检查用户是否已经浏览过该内容
if (!$communityCacheServices->checkUserLike($id, $uid, CommunityCacheServices::COMMUNITY_BROWSE)) {
// 如果用户未浏览过,记录用户的浏览行为
$communityCacheServices->setLike($id, $uid, 1, CommunityCacheServices::COMMUNITY_BROWSE);
// 创建一条浏览相关的记录
$communityRelevanceServices->create($uid, $id, CommunityRelevanceServices::TYPE_COMMUNITY_BROWSE, true);
}
return true;
}
/**
* 设置推荐指数表单
* @param int $id
* @return mixed
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function setStarForm(int $id)
{
$info = [];
if ($id) {
$info = $this->getCommunityInfo($id);
}
$field[] = Form::rate('star', '推荐指数:', $info['star'] ?? 1)->allowHalf(false);
return create_form('推荐指数', $field, Url::buildUrl('/community/community/star/' . $id), 'POST');
}
/**
* 商品审核表单
* @param int $id
* @param int $is_verify
* @return mixed
*/
public function verifyForm(int $id, int $is_verify = 1)
{
$f = [];
if ($is_verify == 1) {
$f[] = Form::radio('is_verify', '审核状态:', 1)->options([['value' => 1, 'label' => '通过'], ['value' => -1, 'label' => '拒绝']])->appendControl(-1, [
Form::textarea('refusal', '拒绝原因:')->required('请输入拒绝原因')]);
} else {
$f[] = Form::hidden('is_verify', '-2');
$f[] = Form::textarea('refusal', '下架原因:')->required('请输入下架原因');
}
return create_form($is_verify == 1 ? '内容审核' : '强制下架', $f, Url::buildUrl('/community/community/set_verify/' . $id), 'post');
}
/**
* 添加
* @param array $data
* @param bool $is_admin
* @return void
* User: liusl
* DateTime: 2024/8/7 15:17
*/
public function saveData(array $data, int $id = 0, bool $is_admin = false)
{
$data['type'] = $is_admin ? 0 : 2;
$extractedData = [
'topic_id' => $data['topic_id'],
'topic_name' => $data['topic_name'] ?? [],
'product_id' => $data['product_id']
];
unset($data['topic_id'], $data['product_id']);
//敏感词
// MiniProgram::msgSecCheck($data['title'] . $data['content']);
$id = $this->transaction(function () use ($data, $id, $extractedData) {
if ($id) {
$data['refusal'] = '';
$res = $this->dao->update($id, $data);
$this->extractedDelete($id);
} else {
$data['add_time'] = time();
$res = $this->dao->save($data);
if ($data['is_verify'] == 1) {
/** @var CommunityCacheServices $communityCacheServices */
$communityCacheServices = app()->make(CommunityCacheServices::class);
$communityCacheServices->setCommunityNewest($data['relation_id'], $res->id);
}
}
/** @var CommunityUserServices $communityUserServices */
$communityUserServices = app()->make(CommunityUserServices::class);
if (!$communityUserServices->get(['type' => 0, 'relation_id' => 0])) {
$communityUserServices->save(['type' => 0, 'relation_id' => 0, 'add_time' => time()]);
}
$id = $id ?: $res->id;
$this->extractedFormat($id, $extractedData);
return $id;
});
event('community.operate', [$id, 1]);
return true;
}
/**
* 添加关联
* @param $id
* @param $data
* @return void
* User: liusl
* DateTime: 2024/8/7 16:24
*/
public function extractedFormat($id, $data)
{
/** @var CommunityRelevanceServices $relevanceServices */
$relevanceServices = app()->make(CommunityRelevanceServices::class);
$communityTopicServices = app()->make(CommunityTopicServices::class);
$save = [];
if (count($data['topic_name']) > 0) {
foreach ($data['topic_name'] as $v) {
$topicInfo = $communityTopicServices->get(['name' => $v]);
$topicId = $topicInfo ? $topicInfo['id'] : $communityTopicServices->save([
'name' => $v,
'type' => 2,
'is_del' => -1,
'add_time' => time()
])->id;
$save[] = [
'left_id' => $id,
'right_id' => $topicId,
'type' => CommunityRelevanceServices::TYPE_COMMUNITY_TOPIC
];
}
}
if (count($data['topic_id']) > 0) {
foreach ($data['topic_id'] as $v) {
$save[] = [
'left_id' => $id,
'right_id' => $v,
'type' => CommunityRelevanceServices::TYPE_COMMUNITY_TOPIC
];
}
}
if (count($data['product_id']) > 0) {
foreach ($data['product_id'] as $v) {
$save[] = [
'left_id' => $id,
'right_id' => $v,
'type' => CommunityRelevanceServices::TYPE_COMMUNITY_PRODUCT
];
}
}
if (count($save) > 0) {
$relevanceServices->saveAll($save);
}
}
/**
* 删除关联
* @param $id
* @return void
* User: liusl
* DateTime: 2024/8/7 16:24
*/
public function extractedDelete($id)
{
/** @var CommunityRelevanceServices $relevanceServices */
$relevanceServices = app()->make(CommunityRelevanceServices::class);
$rel_types = [CommunityRelevanceServices::TYPE_COMMUNITY_TOPIC, CommunityRelevanceServices::TYPE_COMMUNITY_PRODUCT];
$relevanceServices->batchDelete($id, $rel_types);
}
/**
* 点赞取消点赞
* @param array $info
* @param int $uid
* @param int $status
* @return void
* User: liusl
* DateTime: 2024/8/13 14:45
*/
public function setCommunityLike(array $info, int $uid, int $status)
{
/** @var CommunityRelevanceServices $communityRelevanceServices */
$communityRelevanceServices = app()->make(CommunityRelevanceServices::class);
//是否存在点赞
$check = $communityRelevanceServices->checkHas($uid, $info['id'], CommunityRelevanceServices::TYPE_COMMUNITY_LIKE);
if ($status) {
if ($check) throw new ValidateException('您已经点过赞了~');
$communityRelevanceServices->create($uid, $info['id'], CommunityRelevanceServices::TYPE_COMMUNITY_LIKE, true);
} else {
if (!$check) throw new ValidateException('您还未赞过哦~');
$communityRelevanceServices->destory($uid, $info['id'], CommunityRelevanceServices::TYPE_COMMUNITY_LIKE);
}
event('community.like', [$info, $uid, 1, $status]);
}
/**
* 点赞列表/商品种草秀
* @param int $uid
* @return array
* @throws \ReflectionException
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* User: liusl
* DateTime: 2024/8/24 15:58
*/
public function getJoinCommunityList(array $where = [], int $uid = 0, string $condition = 'right_id', int $limit = 0, string $order = 'r.id DESC')
{
/** @var CommunityRelevanceServices $communityRelevanceServices */
$communityRelevanceServices = app()->make(CommunityRelevanceServices::class);
/** @var CommunityUserServices $communityUserServices */
$communityUserServices = app()->make(CommunityUserServices::class);
/** @var CommunityCacheServices $communityCacheServices */
$communityCacheServices = app()->make(CommunityCacheServices::class);
if (!$limit) {
[$page, $limit] = $this->getPageValue();
}
$list = $communityRelevanceServices->joinCommunityList($where, $page ?? 0, $limit, $condition, $order);
$count = $communityRelevanceServices->joinCommunity($where, $condition)->count();
foreach ($list as &$item) {
if (!($item['c_id'] ?? '')) continue;
$userFormat = $communityUserServices->getUserFormat($item['c_type'], $item['relation_id']);
$item['author'] = $userFormat['author'];
$item['author_image'] = $userFormat['author_image'];
$item['slider_image'] = $item['slider_image'] ? json_decode($item['slider_image'], true) : [];
$item['id'] = $item['c_id'];
$item['is_like'] = $communityCacheServices->checkUserLike($item['id'], $uid);
unset($item['c_id'], $item['left_id'], $item['right_id'], $item['type']);
}
unset($item);
return compact('list', 'count');
}
/**
* 分享
* @param $id
* @param $uid
* @return true
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* User: liusl
* DateTime: 2024/8/28 14:10
*/
public function communityShare($id)
{
$info = $this->dao->get(['id' => $id, 'is_del' => 0]);
if (!$info) throw new ValidateException('帖子不存在');
$info->share_num++;
$info->save();
return true;
}
/**
* 帖子删除
* @param $id
* @param $uid
* @param bool $is_admin
* @return void
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* User: liusl
* DateTime: 2024/8/28 14:23
*/
public function communityDelete(int $id, int $uid = 0, bool $is_admin = false)
{
$info = $this->dao->get(['id' => $id, 'is_del' => 0]);
if (!$info) throw new ValidateException('帖子不存在');
if (!$is_admin && $info['relation_id'] != $uid) throw new ValidateException('您没有权限删除该帖子');
$info->is_del = 1;
$info->save();
event('community.delete', [$id]);
//帖子操作事件
event('community.operate', [$id]);
}
/**
* 删除后续事件
* @param $id
* @return void
* User: liusl
* DateTime: 2024/8/28 14:24
* @throws \ReflectionException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function deleteFollow($id)
{
/** @var CommunityUserServices $communityUserServices */
$communityUserServices = app()->make(CommunityUserServices::class);
/** @var CommunityCommentServices $communityCommentServices */
$communityCommentServices = app()->make(CommunityCommentServices::class);
/** @var CommunityRelevanceServices $relevanceServices */
$relevanceServices = app()->make(CommunityRelevanceServices::class);
/** @var CommunityCacheServices $communityCacheServices */
$communityCacheServices = app()->make(CommunityCacheServices::class);
$info = $this->dao->get($id);
if (!$info) return;
//帖子评论删除
$communityCommentServices->update(['community_id' => $id], ['is_del' => 1]);
//关联表处理
$rel_types = [
CommunityRelevanceServices::TYPE_COMMUNITY_TOPIC,
CommunityRelevanceServices::TYPE_COMMUNITY_PRODUCT,
CommunityRelevanceServices::TYPE_COMMUNITY_LIKE,
CommunityRelevanceServices::TYPE_COMMUNITY_BROWSE
];
$relevanceServices->batchDelete($id, $rel_types);
//缓存删除
$communityCacheServices->deleteKey($id);
}
/**
* 话题帖子统计缓存
* @param $id
* @return mixed
* User: liusl
* DateTime: 2024/11/11 17:45
*/
public function topicCount(int $id)
{
return $this->dao->cacheTag()->remember(CommunityCacheServices::COMMUNITY_TOPIC_COUNT . $id, function () use ($id) {
return $this->getTopicCount($id);
}, 60 * 60 * 24);
}
/**
* 话题帖子统计
* @param $id
* @return int
* @throws DbException
* User: liusl
* DateTime: 2024/11/11 17:45
*/
public function getTopicCount(int $id)
{
/** @var CommunityRelevanceServices $communityRelevanceServices */
$communityRelevanceServices = app()->make(CommunityRelevanceServices::class);
return $communityRelevanceServices->joinCommunity(['topic_id' => $id], 'left_id')->count();
}
/**
* 话题帖子统计数据矫正
* @param $id
* @return true
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws \ReflectionException
* User: liusl
* DateTime: 2024/11/11 17:57
*/
public function syncTopicNum(int $id)
{
/** @var CommunityRelevanceServices $communityRelevanceServices */
$communityRelevanceServices = app()->make(CommunityRelevanceServices::class);
$list = $communityRelevanceServices->search(['left_id' => $id, 'type' => CommunityRelevanceServices::TYPE_COMMUNITY_TOPIC])->select()->toArray();
foreach ($list as $item) {
$count = $this->getTopicCount($item['right_id']);
$this->dao->cacheTag()->set(CommunityCacheServices::COMMUNITY_TOPIC_COUNT . $item['right_id'], $count);
}
return true;
}
/**
* 发帖审核后奖励积分经验
* @param $id //帖子id
* @return true
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws \ReflectionException
* User: liusl
* DateTime: 2024/12/3 下午2:56
*/
public function giveIncome($id)
{
$info = $this->dao->get($id);
// 经验开关
$communityExp = sys_config('community_exp');
// 积分开关
$communityIntegral = sys_config('community_integral');
// 检查是否启用了经验或积分系统,以及帖子是否审核
if (!$communityExp && !$communityIntegral || !$info || $info['is_verify'] != 1 || !$info['relation_id']) {
return true;
}
// 获取经验限制和每次增加的数量配置
$expRestrict = sys_config('community_exp_restrict');
$expNum = sys_config('community_exp_num');
// 获取积分限制和每次增加的数量配置
$integralNum = sys_config('community_integral_num');
$integralRestrict = sys_config('community_integral_restrict');
// 查询用户当天获得的经验和积分记录
$timestamp = strtotime($info['add_time']);
$startTime = strtotime('today', $timestamp);
$endTime = strtotime('tomorrow', $timestamp);
$userBillServices = app()->make(UserBillServices::class);
$billList = $userBillServices->search(['uid' => $info['relation_id'], 'type' => ['community_add_exp', 'community_add_integral']])
->whereBetween('obtain_time', [$startTime, $endTime])
->field('type,number')
->select()
->toArray();
$maxExpRestrict = $maxIntegralRestrict = 0;
foreach ($billList as $item) {
if ($item['type'] == 'community_add_exp') {
$maxExpRestrict += $item['number'];
} else {
$maxIntegralRestrict += $item['number'];
}
}
$userServices = app()->make(UserServices::class);
$userInfo = $userServices->get($info['relation_id']);
$updateData = [];
// 检查是否需要增加经验,经验开启,且用户今天没有超过限制,有赠送经验,且帖子没有被记录过
if ($communityExp && ($expRestrict == 0 || ($expRestrict > $maxExpRestrict && $expNum && !$userBillServices->get(['type' => 'community_add_exp', 'link_id' => $id])))) {
$updateData['exp'] = bcadd((string)$userInfo['exp'], (string)$expNum, 0);
$userBillServices->income('community_add_exp', $info['relation_id'], (int)$expNum, $updateData['exp'], $id, $timestamp);
}
// 检查是否需要增加积分,积分开启,且用户今天没有超过限制,有赠送积分,且帖子没有被记录过
if ($communityIntegral && ($integralNum != 0 || ($integralRestrict > $maxIntegralRestrict && $integralNum && !$userBillServices->get(['type' => 'community_add_integral', 'link_id' => $id])))) {
$updateData['integral'] = bcadd((string)$userInfo['integral'], (string)$integralNum, 0);
$userBillServices->income('community_add_integral', $info['relation_id'], (int)$integralNum, $updateData['integral'], $id, $timestamp);
}
// 如果有更新数据,则更新用户信息
if (!empty($updateData)) {
$userServices->update($userInfo['uid'], $updateData);
}
return true;
}
/**
* AI批量生成社区内容
* @param array $data AI生成的数据
* @return bool
*/
public function saveAllAiCommunity($data)
{
try {
foreach ($data as $item) {
$saveData = [
'content_type' => 1,
'title' => $item['title'],
'content' => $item['content'],
'image' => 'https://pro.crmeb.net/uploads/thumb_water/0e41012b7d7df9404ca456df1c7625c6.png',
'video_url' => '',
'slider_image' => json_encode(['https://pro.crmeb.net/uploads/thumb_water/0e41012b7d7df9404ca456df1c7625c6.png']),
'topic_id' => [],
'topic_name' => [$item['topic_name']],
'product_id' => [],
'status' => 0,
'is_recommend' => 1,
'star' => 1,
'sort' => 0,
'relation_id' => 0,
'is_verify' => 1,
'verify_time' => time(),
];
$this->saveData($saveData, 0, true);
}
} catch (\Throwable $e) {
}
return true;
}
}