package com.ruoyi.cai.manager; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.cai.auth.CaiLoginManager; import com.ruoyi.cai.constant.RedisHttpConstant; import com.ruoyi.cai.domain.*; import com.ruoyi.cai.dto.app.query.AccountAliBankCardRes; import com.ruoyi.cai.dto.app.query.AnchorUpdateReq; import com.ruoyi.cai.dto.app.query.user.UserUpdateAvatarReq; import com.ruoyi.cai.dto.app.query.user.UserUpdateReq; import com.ruoyi.cai.dto.app.vo.AnchorVo; import com.ruoyi.cai.dto.app.vo.CurrentUserInfoVo; import com.ruoyi.cai.dto.app.vo.top.AnchorTopResp; import com.ruoyi.cai.dto.app.vo.user.*; import com.ruoyi.cai.enums.AuditStatusEnum; import com.ruoyi.cai.enums.GenderEnum; import com.ruoyi.cai.enums.SystemConfigEnum; import com.ruoyi.cai.enums.user.UserPictureAuditType; import com.ruoyi.cai.executor.ExecutorConstant; import com.ruoyi.cai.im.ImManager; import com.ruoyi.cai.service.*; import com.ruoyi.cai.util.UserUtil; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.helper.LoginHelper; import com.ruoyi.common.utils.BeanConvertUtil; import com.ruoyi.yunxin.client.ImUserRefClient; import com.ruoyi.yunxin.req.UpdateUinfoReq; import com.ruoyi.yunxin.resp.YxCommonR; import com.ruoyi.yunxin.resp.YxDataR; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; @Component @Slf4j public class CurrentUserManager { @Autowired private UserService userService; @Autowired private AnchorService anchorService; @Autowired private UserCountService userCountService; @Autowired private UserAlbumService userAlbumService; @Autowired private AccountService accountService; @Autowired private AccountBankcardService accountBankcardService; @Autowired private UserPictureAuditService userPictureAuditService; @Autowired private SystemConfigManager systemConfigManager; @Autowired private CitysService citysService; @Autowired private CaiLoginManager loginManager; @Autowired private ImManager imManager; public CurrentUserInfoVo currentInfo() { Long userId = LoginHelper.getUserId(); User user = userService.getById(userId); CurrentUserInfoVo res = BeanConvertUtil.convertTo(user, CurrentUserInfoVo::new); res.setUserId(userId); Anchor anchor = anchorService.getByUserId(userId); res.setOpenVideoStatus(anchor == null ? 1 : anchor.getOpenVideoStatus()); // res.setOrderSwitch(anchor == null ? 2 : anchor.getOrderSwitch()); UserCount userCount = userCountService.getByUserId(userId); res.setUserCount(BeanConvertUtil.convertTo(userCount, UserCountVo::new)); Account account = accountService.getByUserId(userId); res.setUserAccount(BeanConvertUtil.convertTo(account, UserAccountVo::new)); // List userAlbums = userAlbumService.listByUserId(userId); // res.setUserAlbumList(BeanConvertUtil.convertListTo(userAlbums, UserAlbumDTO::new)); return res; } public CurrentUserUpdateInfoVo currentUpdateInfo() { Long userId = LoginHelper.getUserId(); User user = userService.getById(userId); CurrentUserUpdateInfoVo res = BeanConvertUtil.convertTo(user, CurrentUserUpdateInfoVo::new); res.setUserId(user.getId()); UserPictureAudit audit = userPictureAuditService.getOneUserAuditRunningPic(UserPictureAuditType.AVATAR.getCode(), res.getUserId()); CurrentUserUpdateInfoVo.Avatar avatar = new CurrentUserUpdateInfoVo.Avatar(); if(audit == null){ avatar.setAvatar(user.getAvatar()); avatar.setAuditStatus(AuditStatusEnum.SUCCESS.getCode()); } else { avatar.setAvatar(audit.getUrl()); avatar.setAuditStatus(AuditStatusEnum.AUDITING.getCode()); } res.setAuditAvatar(avatar); res.setUserId(userId); Anchor anchor = anchorService.getByUserId(userId); res.setOpenVideoStatus(anchor == null ? 1 : anchor.getOpenVideoStatus()); List userAlbums = userAlbumService.listByUserId(userId); List userAlbumAuditList = new ArrayList<>(); for (UserAlbum userAlbum : userAlbums) { UserAlbumAuditVo userAlbumAudit = new UserAlbumAuditVo(); userAlbumAudit.setId(userAlbum.getId()); userAlbumAudit.setUserId(userAlbum.getUserId()); userAlbumAudit.setUrl(userAlbum.getUrl()); userAlbumAudit.setAuditStatus(userAlbum.getAuditStatus()); userAlbumAuditList.add(userAlbumAudit); } res.setUserAlbumList(userAlbumAuditList); return res; } public UserAccountVo currentAccount(){ Long userId = LoginHelper.getUserId(); Account account = accountService.getByUserId(userId); return BeanConvertUtil.convertTo(account,UserAccountVo::new); } public AnchorVo anchorInfo() { Long userId = LoginHelper.getUserId(); Anchor anchor = anchorService.getByUserId(userId); return BeanConvertUtil.convertTo(anchor,AnchorVo::new); } public boolean anchorUpdate(AnchorUpdateReq anchorUpdate) { anchorUpdate.setUserId(LoginHelper.getUserId()); boolean updateFlag = false; LambdaUpdateWrapper update = Wrappers.lambdaUpdate(Anchor.class).eq(Anchor::getUserId, anchorUpdate.getUserId()); if(anchorUpdate.getPrice() != null){ if(anchorUpdate.getPrice() < 150 || anchorUpdate.getPrice() > 1500){ throw new ServiceException("主播价格不能低于150和高于1500"); } update.set(Anchor::getPrice,anchorUpdate.getPrice()); updateFlag=true; } if(anchorUpdate.getOrderSwitch() != null){ update.set(Anchor::getOrderSwitch,anchorUpdate.getOrderSwitch()); updateFlag=true; } if(anchorUpdate.getOpenVideoStatus() != null){ update.set(Anchor::getOpenVideoStatus,anchorUpdate.getOpenVideoStatus()); updateFlag=true; } if(updateFlag){ return anchorService.update(update); } return true; } public boolean userUpdate(UserUpdateReq res) { res.setUserId(LoginHelper.getUserId()); User user = userService.getById(res.getUserId()); boolean updateFlag = false; boolean updateYunxin = false; UpdateUinfoReq uinfoReq = new UpdateUinfoReq(); uinfoReq.setAccid(res.getUserId()+""); LambdaUpdateWrapper update = Wrappers.lambdaUpdate(User.class).eq(User::getId, res.getUserId()); if(StringUtils.isNotEmpty(res.getNickname())){ update.set(User::getNickname,res.getNickname()); uinfoReq.setName(res.getNickname()); updateFlag=true; updateYunxin=true; } if(res.getBirthday() != null){ update.set(User::getBirthday,res.getBirthday()); update.set(User::getAge, UserUtil.getAge(res.getBirthday())); uinfoReq.setBirth(res.getBirthday().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); updateFlag=true; updateYunxin=true; } String imAvatar = null; Integer imGender = null; if(res.getGender() != null){ GenderEnum genderEnum = GenderEnum.getByCode(res.getGender()); if(genderEnum == null){ throw new ServiceException("性别参数异常"); } if(user.getGender() != 0 && !user.getGender().equals(res.getGender())){ throw new ServiceException("性别确定后,无法二次修改"); } if(!user.getGender().equals(res.getGender())){ update.set(User::getGender,genderEnum.getCode()); update.set(User::getAvatar,genderEnum.getDefaultAvatar()); imAvatar = systemConfigManager.getSystemConfig(SystemConfigEnum.COS_DOMAIN) + genderEnum.getDefaultAvatar(); imGender = genderEnum.getCode(); updateFlag=true; updateYunxin=true; } } if(res.getCityId() != null){ update.set(User::getCityId,res.getCityId()); update.set(User::getCity,citysService.getByCityId(res.getCityId())); updateFlag=true; } /*if(StringUtils.isNotEmpty(res.getAvatar())){ if(!GenderEnum.checkDefaultAvatar(res.getAvatar())){ update.set(User::getAvatar,res.getAvatar()); update.set(User::getAvatarState,1); // uinfoReq.setIcon(res.getAvatar()); // updateYunxin=true; updateFlag=true; } }*/ if(updateFlag){ boolean flag = userService.update(update); if(flag){ userService.checkFinishStatus(res.getUserId()); if(updateYunxin){ imManager.updateImInfo(user.getId(), imAvatar,res.getNickname(), imGender); } } } /*if(res.getInviteId() != null && user.getInviteId() != null){ ExecutorConstant.COMMON_EXECUTOR.execute(() -> loginManager.dealInviteId(user, res.getInviteId(),false)); }*/ return true; } public AccountBankcard aliInfo() { return accountBankcardService.getOne(Wrappers.lambdaQuery(AccountBankcard.class) .eq(AccountBankcard::getUserId, LoginHelper.getUserId()) .last("limit 1")); } public void saveOrUpdateAliInfo(AccountAliBankCardRes res) { AccountBankcard bankcard = new AccountBankcard(); bankcard.setId(res.getId()); if(bankcard.getId() == null){ bankcard.setType(1); bankcard.setBankCode("alipay"); bankcard.setBank("支付宝"); bankcard.setUserId(LoginHelper.getUserId()); } bankcard.setCardName(res.getCardName()); bankcard.setCardAccount(res.getCardAccount()); accountBankcardService.saveOrUpdate(bankcard); } public UserAvatarMinVo updateAvatar(UserUpdateAvatarReq res) { UserPictureAudit audit = userPictureAuditService.getOneUserAuditRunningPic(UserPictureAuditType.AVATAR.getCode(), res.getUserId()); if(audit != null){ throw new ServiceException("头像正在审核中,请审核后修改"); } User user = userService.getById(res.getUserId()); boolean ignoreAudit; if(user.getIsAnchor() == 1){ ignoreAudit = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.ANCHOR_AVATAR_IGNORE_AUDIT); }else{ ignoreAudit = systemConfigManager.getSystemConfigOfBool(SystemConfigEnum.NO_ANCHOR_AVATAR_IGNORE_AUDIT); } UserAvatarMinVo vo = new UserAvatarMinVo(); vo.setAvatar(res.getAvatar()); if(!ignoreAudit){ UserPictureAudit save = new UserPictureAudit(); save.setType(UserPictureAuditType.AVATAR.getCode()); save.setUserId(res.getUserId()); save.setBeforeUrl(user.getAvatar()); save.setUrl(res.getAvatar()); save.setAuditStatus(AuditStatusEnum.AUDITING.getCode()); userPictureAuditService.save(save); vo.setAuditStatus(AuditStatusEnum.AUDITING.getCode()); } else { userService.update(Wrappers.lambdaUpdate(User.class) .eq(User::getId, res.getUserId()) .set(User::getAvatar, res.getAvatar()) .set(User::getAvatarState, 1)); vo.setAuditStatus(AuditStatusEnum.SUCCESS.getCode()); imManager.updateImInfo(res.getUserId(),res.getAvatar(),null,null); try { anchorApplyService.checkAnchorAuto(user.getId()); }catch (Exception e){ log.error("检查是否自动主播失败!",e); } } return vo; } @Autowired private AnchorApplyService anchorApplyService; @Autowired private RedissonClient redissonClient; @Autowired private StringRedisTemplate stringRedisTemplate; public AnchorTopResp top() { Long userId = LoginHelper.getUserId(); String lockKey = LockManager.getAnchorTopLock(userId); RLock lock = redissonClient.getLock(lockKey); if(lock.isLocked()){ throw new ServiceException("操作太频繁"); } long inter = 0; try { lock.lock(3, TimeUnit.SECONDS); String userGreetSendTime = String.format(RedisHttpConstant.ANCHOR_TOP_TIME_REDIS,userId); // 最近一次的发送时间 String lastTime = stringRedisTemplate.opsForValue().get(userGreetSendTime); if(StringUtils.isNotBlank(lastTime)){ inter = systemConfigManager.getSystemConfigOfInt(SystemConfigEnum.ANCHOR_TOP_MIN) * 60; long jiange = DateUtil.currentSeconds() - Long.parseLong(lastTime); // 距离上次发送的间隔 long diff = inter - jiange; if(diff > 0){ AnchorTopResp resp = new AnchorTopResp(); resp.setTopSuccess(false); resp.setNextTopDate(diff); return resp; } } anchorService.update(Wrappers.lambdaUpdate(Anchor.class) .set(Anchor::getTopShowRank, LocalDateTime.now()) .eq(Anchor::getUserId, userId)); stringRedisTemplate.opsForValue().set(userGreetSendTime,DateUtil.currentSeconds()+"",1,TimeUnit.DAYS); }finally { lock.unlock(); } AnchorTopResp resp = new AnchorTopResp(); resp.setTopSuccess(true); resp.setNextTopDate(inter); return resp; } }