package com.ruoyi.goods.service.biz;
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.date.DatePattern;
|
import cn.hutool.core.date.DateUtil;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.ruoyi.common.core.exception.ServiceException;
|
import com.ruoyi.common.core.utils.DateUtils;
|
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.common.redis.service.RedisService;
|
import com.ruoyi.common.security.utils.SecurityUtils;
|
import com.ruoyi.goods.domain.dto.XiaoeLiveDto;
|
import com.ruoyi.goods.domain.dto.XiaoeLiveQueryDto;
|
import com.ruoyi.goods.domain.pojo.live.XiaoeLiveAppointment;
|
import com.ruoyi.goods.domain.pojo.live.XiaoeLiveRecord;
|
import com.ruoyi.goods.domain.vo.XiaoeLiveDetailVOV2;
|
import com.ruoyi.goods.domain.vo.XiaoeLiveVo;
|
import com.ruoyi.goods.domain.vo.XiaoeLiveVoV2;
|
import com.ruoyi.goods.service.live.IXiaoeLiveAppointmentService;
|
import com.ruoyi.goods.service.live.IXiaoeLiveRecordService;
|
import com.ruoyi.goods.utils.XiaoeUtils;
|
import com.ruoyi.system.api.constant.DelayTaskEnum;
|
import com.ruoyi.system.api.domain.poji.config.DelayTask;
|
import com.ruoyi.system.api.domain.poji.shop.Shop;
|
import com.ruoyi.system.api.domain.poji.sys.SysUser;
|
import com.ruoyi.system.api.domain.vo.ShopRelUserVo;
|
import com.ruoyi.system.api.service.RemoteConfigService;
|
import com.ruoyi.system.api.service.RemoteShopService;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
|
import java.util.*;
|
import java.util.concurrent.TimeUnit;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author mitao
|
* @date 2025/1/9
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class XiaoeLiveService {
|
private final IXiaoeLiveRecordService xiaoeLiveRecordService;
|
private final XiaoeUtils xiaoeUtils;
|
private final IXiaoeLiveAppointmentService xiaoeLiveAppointmentService;
|
private final RedisService redisService;
|
private final RemoteConfigService remoteConfigService;
|
private final RemoteShopService remoteShopService;
|
|
|
/**
|
* 直播首页分页列表
|
*
|
* @param dto
|
* @return
|
*/
|
public Page<XiaoeLiveVoV2> getLivePage(XiaoeLiveQueryDto dto) {
|
//当前登录用户id
|
Long userId = SecurityUtils.getUserId();
|
dto.setTags(Arrays.asList(20275808, 20275805, 20275707, 20249173, 2406002));
|
Page<XiaoeLiveVoV2> livePageList = xiaoeUtils.getLivePageListV2(dto);
|
if (CollectionUtil.isEmpty(livePageList.getRecords())) {
|
return new Page<>();
|
}
|
//已预约的记录
|
List<XiaoeLiveAppointment> appointments = xiaoeLiveAppointmentService.lambdaQuery()
|
.gt(XiaoeLiveAppointment::getAliveStartAt, DateUtils.getNowDate()).eq(XiaoeLiveAppointment::getUserId, userId).list();
|
Map<String, XiaoeLiveAppointment> appointmentMap = appointments.stream().collect(Collectors.toMap(XiaoeLiveAppointment::getLiveId, appointment -> appointment));
|
// 处理直播数据
|
List<XiaoeLiveVoV2> filteredRecords = livePageList.getRecords().stream()
|
.filter(item -> !item.getAliveState().equals(2)) // 过滤直播状态为已结束的记录
|
.peek(item -> {
|
// 查找对应的预约记录
|
XiaoeLiveAppointment appointment = appointmentMap.get(item.getId());
|
|
// 如果预约记录存在且直播状态为未开始,则设置状态为已预约
|
if (item.getAliveState().equals(0) && appointment != null) {
|
item.setAppointmentState(1); // 设置为已预约
|
}
|
})
|
.sorted(Comparator.comparing(XiaoeLiveVoV2::getAliveState).reversed()) // 按照直播状态排序
|
.collect(Collectors.toList());
|
//根据直播类型过滤平台和店铺直播
|
if (Objects.nonNull(dto.getLiveType())) {
|
List<XiaoeLiveRecord> liveRecordList = xiaoeLiveRecordService.lambdaQuery().eq(XiaoeLiveRecord::getType, dto.getLiveType()).list();
|
if (CollUtil.isEmpty(liveRecordList)) {
|
return new Page<>();
|
}
|
List<String> liveIdList = liveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toList());
|
filteredRecords = filteredRecords.stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList());
|
}
|
|
livePageList.setRecords(filteredRecords);
|
return livePageList;
|
}
|
|
/**
|
* 直播详情
|
* @param id
|
* @return
|
*/
|
public XiaoeLiveDetailVOV2 getLiveDetail(String id) {
|
return xiaoeUtils.getLiveDetailV2(id);
|
}
|
/**
|
* 预约直播
|
* @param id
|
* @return
|
*/
|
public Boolean appointment(String id) {
|
//当前登录用户
|
SysUser sysUser = SecurityUtils.getSysUser();
|
Long userId = sysUser.getUserId();
|
//查询预约记录
|
Integer count = xiaoeLiveAppointmentService.lambdaQuery().eq(XiaoeLiveAppointment::getLiveId, id).gt(XiaoeLiveAppointment::getAliveStartAt, DateUtils.getNowDate()).eq(XiaoeLiveAppointment::getUserId, userId).count();
|
if (count > 0) {
|
throw new ServiceException("您已预约过该直播,请勿重复预约");
|
}
|
XiaoeLiveVo liveDetail = xiaoeUtils.getLiveDetail(id);
|
if (Objects.isNull(liveDetail)) {
|
throw new ServiceException("直播不存在");
|
}
|
XiaoeLiveAppointment xiaoeLiveAppointment = new XiaoeLiveAppointment();
|
xiaoeLiveAppointment.setLiveId(id);
|
xiaoeLiveAppointment.setUserId(userId);
|
Date aliveStartAt = DateUtil.parse(liveDetail.getAliveStartAt(), DatePattern.NORM_DATETIME_PATTERN);
|
xiaoeLiveAppointment.setAliveStartAt(aliveStartAt);
|
xiaoeLiveAppointment.setCreateTime(DateUtils.getNowDate());
|
xiaoeLiveAppointment.setTitle(liveDetail.getTitle());
|
xiaoeLiveAppointmentService.save(xiaoeLiveAppointment);
|
/// 若为C端用户向 redis 添加预约记录
|
if (sysUser.getUserType().equals("03")) {
|
// 获取当前时间
|
Date nowTime = new Date();
|
|
// 计算直播开始时间与当前时间的差值
|
long startTimeDifference = aliveStartAt.getTime() - nowTime.getTime();
|
startTimeDifference = Math.max(startTimeDifference, 3000L); // 确保差值至少为3秒
|
|
// 获取延时任务
|
DelayTask startDelayTask = remoteConfigService.getDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId()).getData();
|
// 创建或者更新延时任务
|
if (startDelayTask == null || !startDelayTask.getEndTime().equals(aliveStartAt)) {
|
// 删除旧的延时任务及缓存
|
if (startDelayTask != null) {
|
remoteConfigService.deleteDelayTask(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
|
redisService.deleteObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
|
}
|
// 设置新的延时任务
|
redisService.setCacheObject(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId(), aliveStartAt, startTimeDifference, TimeUnit.MILLISECONDS);
|
startDelayTask = new DelayTask();
|
startDelayTask.setDelFlag(0);
|
startDelayTask.setCreateTime(new Date());
|
startDelayTask.setEndTime(aliveStartAt);
|
startDelayTask.setRedisKey(DelayTaskEnum.LIVE_APPOINTMENT_TASK.getCode() + "-" + xiaoeLiveAppointment.getId());
|
|
// 添加新的延时任务
|
remoteConfigService.addDelayTask(startDelayTask);
|
}
|
}
|
return true;
|
}
|
|
/**
|
* 我的直播
|
*
|
* @param dto
|
* @return
|
*/
|
public Page<XiaoeLiveVoV2> getMineLivePage(XiaoeLiveQueryDto dto) {
|
Long userId = SecurityUtils.getUserId();
|
Page<XiaoeLiveVoV2> page = new Page<>();
|
ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(userId).getData();
|
if (Objects.isNull(shopRelUserVo)) {
|
return page;
|
}
|
List<XiaoeLiveRecord> xiaoeLiveRecordList = xiaoeLiveRecordService.getListByShopId(shopRelUserVo.getShopId());
|
if (CollectionUtil.isEmpty(xiaoeLiveRecordList)) {
|
return page;
|
}
|
|
dto.setTags(Arrays.asList(20275808, 20275805, 20275707, 20249173, 2406002));
|
Page<XiaoeLiveVoV2> livePageList = xiaoeUtils.getLivePageListV2(dto);
|
if (CollectionUtil.isEmpty(livePageList.getRecords())) {
|
return page;
|
}
|
//当前商家创建的直播
|
Set<String> liveIdSet = xiaoeLiveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toSet());
|
//过滤数据
|
List<XiaoeLiveVoV2> filteredRecords = livePageList.getRecords().stream()
|
.filter(item -> liveIdSet.contains(item.getId()) && !item.getAliveState().equals(2))
|
// 按照直播状态排序
|
.sorted(Comparator.comparing(XiaoeLiveVoV2::getAliveState).reversed()).collect(Collectors.toList());
|
livePageList.setRecords(filteredRecords);
|
return livePageList;
|
}
|
|
/**
|
* 获取当前店铺讲师id列表
|
* @return
|
*/
|
public List<String> getShopXiaoeUserIdList() {
|
Long userId = SecurityUtils.getUserId();
|
//获取用户所属店铺
|
ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(userId).getData();
|
if (Objects.isNull(shopRelUserVo)) {
|
throw new ServiceException("当前用户未关联店铺,请先关联店铺");
|
}
|
//查询店铺信息
|
Shop shop = remoteShopService.getShop(shopRelUserVo.getShopId()).getData();
|
if (Objects.isNull(shop)) {
|
throw new ServiceException("店铺不存在");
|
}
|
if (StringUtils.isBlank(shop.getXiaoeUserId())) {
|
throw new ServiceException("创建失败,请联系平台添加讲师。");
|
}
|
return Arrays.asList(shop.getXiaoeUserId().split(","));
|
}
|
/**
|
* 创建直播
|
* @param dto
|
* @param type 创建类型 1:平台 2:经销商
|
* @return
|
*/
|
public void create(XiaoeLiveDto dto,Integer type) {
|
if (dto.getPaymentType().equals(3) && StringUtils.isBlank(dto.getResourcePassword())){
|
throw new ServiceException("密码不能为空");
|
}
|
if (type.equals(2)) {
|
//获取当前登录用户
|
Long userId = SecurityUtils.getUserId();
|
//获取用户所属店铺
|
ShopRelUserVo shopRelUserVo = remoteShopService.getShopByUserId(userId).getData();
|
if (Objects.isNull(shopRelUserVo)) {
|
throw new ServiceException("当前用户未关联店铺,请先关联店铺");
|
}
|
//查询店铺信息
|
Shop shop = remoteShopService.getShop(shopRelUserVo.getShopId()).getData();
|
if (Objects.isNull(shop)) {
|
throw new ServiceException("店铺不存在");
|
}
|
String liveId = xiaoeUtils.addLive(dto);
|
if (StringUtils.isBlank(liveId)) {
|
throw new ServiceException("创建直播失败,请联系平台管理员");
|
}
|
Long shopId = shop.getShopId();
|
String shopName = shop.getShopName();
|
//添加直播创建记录
|
xiaoeLiveRecordService.add(shopId, type, shopName, liveId);
|
} else {
|
String liveId = xiaoeUtils.addLive(dto);
|
if (StringUtils.isBlank(liveId)) {
|
throw new ServiceException("创建直播失败,请联系平台管理员");
|
}
|
//添加直播创建记录
|
xiaoeLiveRecordService.add(null, type, "鸿瑞堂", liveId);
|
}
|
}
|
|
/**
|
* 编辑直播
|
* @param dto
|
*/
|
public Boolean edit(XiaoeLiveDto dto) {
|
if (StringUtils.isBlank(dto.getId())) {
|
throw new ServiceException("直播id不能为空");
|
}
|
return xiaoeUtils.editLive(dto);
|
}
|
|
/**
|
* 管理后台直播分页列表
|
*
|
* @param dto
|
* @return
|
*/
|
public Page<XiaoeLiveVoV2> getMgtLivePage(XiaoeLiveQueryDto dto) {
|
dto.setTags(Arrays.asList(20275808, 20275805, 20275707, 20249173, 2406002));
|
Page<XiaoeLiveVoV2> livePageList = xiaoeUtils.getLivePageListV2(dto);
|
Long shopId = dto.getShopId();
|
if (Objects.nonNull(shopId)) {
|
List<XiaoeLiveRecord> xiaoeLiveRecords = xiaoeLiveRecordService.getListByShopId(shopId);
|
if (CollUtil.isEmpty(xiaoeLiveRecords)) {
|
return new Page<>();
|
}
|
List<String> liveIdList = xiaoeLiveRecords.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toList());
|
List<XiaoeLiveVoV2> filteredList = livePageList.getRecords().stream().filter(item -> liveIdList.contains(item.getId())).collect(Collectors.toList());
|
livePageList.setRecords(filteredList);
|
}
|
List<XiaoeLiveRecord> shopRecordList = xiaoeLiveRecordService.lambdaQuery().eq(XiaoeLiveRecord::getType, 2).list();
|
Map<String, String> shopNameMap = shopRecordList.stream().collect(Collectors.toMap(XiaoeLiveRecord::getLiveId, XiaoeLiveRecord::getShopName));
|
livePageList.setRecords(livePageList.getRecords().stream().peek(item -> {
|
String name = shopNameMap.get(item.getId());
|
if (StringUtils.isNotBlank(name)) {
|
item.setShopName(name);
|
}
|
}).collect(Collectors.toList()));
|
return livePageList;
|
}
|
|
/**
|
* 删除直播
|
* @param id
|
*/
|
public void deleteLive(String id) {
|
Boolean flag = xiaoeUtils.deleteLive(id);
|
if (flag) {
|
//删除直播添加记录
|
xiaoeLiveRecordService.lambdaUpdate().eq(XiaoeLiveRecord::getLiveId, id).remove();
|
}
|
}
|
|
/**
|
* 员工端直播列表
|
*
|
* @param dto
|
* @return
|
*/
|
public Page<XiaoeLiveVoV2> getStaffLivePage(XiaoeLiveQueryDto dto) {
|
Page<XiaoeLiveVoV2> page = new Page<>();
|
List<XiaoeLiveRecord> xiaoeLiveRecordList = xiaoeLiveRecordService.getMgtRecord();
|
if (CollectionUtil.isEmpty(xiaoeLiveRecordList)) {
|
return page;
|
}
|
dto.setTags(Arrays.asList(20275808, 20275805, 20275707, 20249173, 2406002));
|
Page<XiaoeLiveVoV2> livePageList = xiaoeUtils.getLivePageListV2(dto);
|
if (CollectionUtil.isEmpty(livePageList.getRecords())) {
|
return page;
|
}
|
//筛选平台创建的直播
|
Set<String> liveIdSet = xiaoeLiveRecordList.stream().map(XiaoeLiveRecord::getLiveId).collect(Collectors.toSet());
|
//过滤数据
|
List<XiaoeLiveVoV2> filteredRecords = livePageList.getRecords().stream().filter(item -> liveIdSet.contains(item.getId()) && !item.getAliveState().equals(2)).collect(Collectors.toList());
|
livePageList.setRecords(filteredRecords);
|
return livePageList;
|
}
|
}
|