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); } }