Files
pkAssistant/src/main/java/vvpkassistant/pk/service/PKServiceImpl.java

204 lines
8.2 KiB
Java
Raw Normal View History

2025-08-04 14:10:04 +08:00
package vvpkassistant.pk.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
2025-08-04 14:31:38 +08:00
import vvpkassistant.CoinRecords.CoinRecords;
import vvpkassistant.CoinRecords.CoinRecordsDao;
2025-08-04 14:10:04 +08:00
import vvpkassistant.Data.ResponseData;
import vvpkassistant.Data.ResponseInfo;
import vvpkassistant.Tools.VVTools;
2025-08-04 14:31:38 +08:00
import vvpkassistant.User.mapper.UserDao;
import vvpkassistant.User.model.UserModel;
2025-08-04 14:10:04 +08:00
import vvpkassistant.common.ErrorCode;
2025-08-04 14:31:38 +08:00
import vvpkassistant.config.FunctionConfigHolder;
2025-08-04 14:10:04 +08:00
import vvpkassistant.exception.BusinessException;
import vvpkassistant.pk.mapper.PkInfoDao;
2025-08-04 14:31:38 +08:00
import vvpkassistant.pk.mapper.PkRecordDao;
2025-08-04 14:10:04 +08:00
import vvpkassistant.pk.model.PkInfoModel;
2025-08-04 14:31:38 +08:00
import vvpkassistant.pk.model.PkRecord;
2025-08-04 14:10:04 +08:00
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;
2025-08-04 14:31:38 +08:00
@Resource
private PkRecordDao pkRecordDao;
@Resource
private CoinRecordsDao coinRecordsDao;
@Resource
private UserDao userDao;
2025-08-04 14:10:04 +08:00
@Override
2025-08-04 14:31:38 +08:00
public PkInfoModel addPkAddData(PkInfoModel pkModel) {
2025-08-04 14:10:04 +08:00
// 初始可邀请状态为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()) {
2025-08-04 14:31:38 +08:00
throw new BusinessException(ErrorCode.SYSTEM_ERROR, "该主播当日已有pk信息");
2025-08-04 14:10:04 +08:00
}
if (pkInfoDao.insert(pkModel) == 1) {
return pkModel;
2025-08-04 14:31:38 +08:00
} 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;
2025-08-04 14:10:04 +08:00
}else
throw new BusinessException(ErrorCode.SYSTEM_ERROR);
}
2025-08-04 14:44:45 +08:00
@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;
}
2025-08-04 14:10:04 +08:00
}