Files
pkAssistant/src/main/java/vvpkassistant/pk/service/PKServiceImpl.java
2025-08-04 15:03:53 +08:00

244 lines
10 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package vvpkassistant.pk.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import vvpkassistant.CoinRecords.CoinRecords;
import vvpkassistant.CoinRecords.CoinRecordsDao;
import vvpkassistant.Data.ResponseData;
import vvpkassistant.Data.ResponseInfo;
import vvpkassistant.Tools.VVTools;
import vvpkassistant.User.mapper.UserDao;
import vvpkassistant.User.model.UserModel;
import vvpkassistant.common.ErrorCode;
import vvpkassistant.config.FunctionConfigHolder;
import vvpkassistant.exception.BusinessException;
import vvpkassistant.pk.mapper.PkInfoDao;
import vvpkassistant.pk.mapper.PkRecordDao;
import vvpkassistant.pk.model.PkInfoModel;
import vvpkassistant.pk.model.PkRecord;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/*
* @author: ziin
* @date: 2025/8/4 13:54
*/
@Service
public class PKServiceImpl extends ServiceImpl<PkInfoDao, PkInfoModel> implements PKService {
@Resource
private PkInfoDao pkInfoDao;
@Resource
private PkRecordDao pkRecordDao;
@Resource
private CoinRecordsDao coinRecordsDao;
@Resource
private UserDao userDao;
@Override
public PkInfoModel addPkAddData(PkInfoModel pkModel) {
// 初始可邀请状态为0
pkModel.setInviteStatus(0);
pkModel.setPinExpireTime(0);
// 获取主播id
String anchorId = pkModel.getAnchorId();
// 查询当天是否存在该主播发布的pk信息。
Integer pkTime = pkModel.getPkTime();
// 根据设置的pk时间。查询出当天的开始时间和结束时间
Map<String, Long> dayStartAndEndTimestamp = VVTools.getDayStartAndEndTimestamp(pkTime);
Long start = dayStartAndEndTimestamp.get("start");
Long end = dayStartAndEndTimestamp.get("end");
// 查询主播在当天是否有发布过pk信息
List<PkInfoModel> pkInfoModels = pkInfoDao.selectDataWithAnchorIdAndTime(anchorId, start, end);
// 判断该主播在当日是否已发布过pk信息
if (!pkInfoModels.isEmpty()) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "该主播当日已有pk信息");
}
if (pkInfoDao.insert(pkModel) == 1) {
return pkModel;
} else
throw new BusinessException(ErrorCode.SYSTEM_ERROR);
}
@Override
public Boolean updatePkStatus(PkRecord recordModel) {
if (recordModel.getPkStatus() == 1) {
// 查询出记录信息
PkRecord pkRecordById = pkRecordDao.singleRecord(recordModel.getId());
// 更新可邀请状态
PkInfoModel pkInfoModelA = pkInfoDao.selectById(pkRecordById.getPkIdA());
pkInfoModelA.setInviteStatus(1);
PkInfoModel pkInfoModelB = pkInfoDao.selectById(pkRecordById.getPkIdB());
pkInfoModelB.setInviteStatus(1);
pkInfoDao.updateById(pkInfoModelA);
pkInfoDao.updateById(pkInfoModelB);
// 如果有置顶的状态。需要取消置顶
if (pkInfoModelA.getPinExpireTime() > VVTools.currentTimeStamp()) {
long hour = VVTools.calculateHoursFloor(pkInfoModelA.getPinExpireTime(), VVTools.currentTimeStamp());
int coin = Integer.parseInt(FunctionConfigHolder.getValue("置顶扣除积分"));
int totalCoin = (int) (coin * hour);
// 插入记录
CoinRecords coinRecords = new CoinRecords("成功预约pk自动取消置顶", pkInfoModelA.getSenderId(), totalCoin, (int) VVTools.currentTimeStamp(), 1);
coinRecordsDao.insert(coinRecords);
// 更新积分
UserModel userModel = userDao.selectById(pkRecordById.getUserIdA());
Integer points = userModel.getPoints();
userModel.setPoints(points + totalCoin);
}
if (pkInfoModelB.getPinExpireTime() > VVTools.currentTimeStamp()) {
long hour = VVTools.calculateHoursFloor(pkInfoModelB.getPinExpireTime(), VVTools.currentTimeStamp());
int coin = Integer.parseInt(FunctionConfigHolder.getValue("置顶扣除积分"));
int totalCoin = (int) (coin * hour);
// 插入记录
CoinRecords coinRecords = new CoinRecords("成功预约pk自动取消置顶", pkInfoModelB.getSenderId(), totalCoin, (int) VVTools.currentTimeStamp(), 1);
coinRecordsDao.insert(coinRecords);
// 更新积分
UserModel userModel = userDao.selectById(pkRecordById.getUserIdB());
Integer points = userModel.getPoints();
userModel.setPoints(points + totalCoin);
}
}
// 更新pk邀请记录
if (pkRecordDao.updateById(recordModel) == 1) {
return true;
} else {
throw new BusinessException(ErrorCode.SYSTEM_ERROR);
}
}
@Override
public PkRecord createPKRecord(PkRecord record) {
// 如果这两个邀约直播之间存在未处理的邀请记录。那就不允许继续发送pk邀请
String anchorIdA = record.getAnchorIdA();
String anchorIdB = record.getAnchorIdB();
Integer dataCount = pkRecordDao.getPendingInvitations(anchorIdA, anchorIdB);
if (dataCount > 0) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "已存在一条未处理的pk申请不能重复发送");
}
record.setPkStatus(0);
if (pkRecordDao.insert(record) == 1 ){
return record;
}else
throw new BusinessException(ErrorCode.SYSTEM_ERROR);
}
@Override
public List<PkInfoModel> getPKList(Map<String, Object> map) {
Integer page = (Integer) map.get("page");
Integer size = (Integer) map.get("size");
Map<String,Object> condition = (Map<String, Object>) map.get("condition");
Map<String, Long> todayTimeStampMap = VVTools.startAndEndTimeStampForToday();
Long start = VVTools.currentTimeStamp();
Long end = todayTimeStampMap.get("end");
List<PkInfoModel> pkModels = pkInfoDao.selectPkInfoByCondition(page * size, size, condition, start, end);
long currentTimeStamp = VVTools.currentTimeStamp();
//如果传了用户id
if (map.containsKey("userId")) {
Long begin = VVTools.currentTimeStamp();
Integer userId = Integer.valueOf(map.get("userId").toString());
// 查询出当前用户大于等于今天的已接受邀请的pk数据
List<PkRecord> pkRecords = pkRecordDao.fetchDataFromTodayWithUserId(userId, begin);
// 遍历查询出的数据。如果文章的id相同。就显示完整的主播名称
for (PkInfoModel pkModel : pkModels) {
pkModel.setDisPlayId(pkModel.getAnchorId());
// 设置是否为置顶
pkModel.setIsPin(pkModel.getPinExpireTime() > currentTimeStamp);
// 如果文章的发布者不是当前登录主播。
if (pkModel.getSenderId().intValue() != userId) {
boolean showId = false;
// 查找是否和当前登录的账号有pk关系。
for (PkRecord pkRecord : pkRecords) {
// 如果当前用户是邀请pk的并且对方已接受pk也可以看到主播id
if (pkRecord.getUserIdB().intValue() == userId &&
pkRecord.getPkIdA().intValue() == pkModel.getId().intValue() &&
pkRecord.getPkStatus() == 1) {
showId = true;
break;
}
}
// 条件不满足则隐藏主播id'
if (!showId) {
pkModel.setDisPlayId(VVTools.replaceChar(pkModel.getAnchorId(), '*'));
}
}
}
}else{
for (PkInfoModel pkModel : pkModels) {
// 设置是否为置顶
pkModel.setIsPin(pkModel.getPinExpireTime() > currentTimeStamp);
pkModel.setDisPlayId(VVTools.replaceChar(pkModel.getAnchorId(), '*'));
}
}
return pkModels;
}
@Override
public PkInfoModel pkInfoDetail(Map<String, Integer> map) {
Integer id = map.get("id");
Integer userId = map.get("userId");
Integer from = map.get("from"); // 1 首页 2 聊天
PkInfoModel pkInfoModel = pkInfoDao.selectById(id);
if (pkInfoModel == null) {
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "该信息不存在");
}
if (from == 1) {
if (pkInfoModel.getPkTime() > VVTools.currentTimeStamp()) {
// 判断是否是自己发布的数据 如果不是就隐藏主播id
if (pkInfoModel.getSenderId().equals(userId)) {
pkInfoModel.setDisPlayId(pkInfoModel.getAnchorId());
} else {
// 查询是否存在未完成的pk记录
Integer isHave = pkInfoDao.checkIfUnfinishedPKExistsWithAnchor(userId, pkInfoModel.getAnchorId());
if (isHave > 0) {
pkInfoModel.setDisPlayId(pkInfoModel.getAnchorId());
} else {
pkInfoModel.setDisPlayId(VVTools.replaceChar(pkInfoModel.getAnchorId(), '*'));
}
}
return pkInfoModel;
} else {
throw new BusinessException(ErrorCode.SYSTEM_ERROR,"当前信息已无效");
}
} else {
Integer isHave = pkInfoDao.checkIfUnfinishedPKExistsWithAnchor(userId, pkInfoModel.getAnchorId());
if (isHave > 0) {
pkInfoModel.setDisPlayId(pkInfoModel.getAnchorId());
} else {
pkInfoModel.setDisPlayId(VVTools.replaceChar(pkInfoModel.getAnchorId(), '*'));
}
return pkInfoModel;
}
}
}