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 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 dayStartAndEndTimestamp = VVTools.getDayStartAndEndTimestamp(pkTime); Long start = dayStartAndEndTimestamp.get("start"); Long end = dayStartAndEndTimestamp.get("end"); // 查询主播在当天是否有发布过pk信息 List 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 getPKList(Map map) { Integer page = (Integer) map.get("page"); Integer size = (Integer) map.get("size"); Map condition = (Map) map.get("condition"); Map todayTimeStampMap = VVTools.startAndEndTimeStampForToday(); Long start = VVTools.currentTimeStamp(); Long end = todayTimeStampMap.get("end"); List 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 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 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; } } }