Files
cai-server/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CurrentUserManager.java
2024-08-05 16:11:08 +08:00

334 lines
14 KiB
Java

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<UserAlbum> 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<UserAlbum> userAlbums = userAlbumService.listByUserId(userId);
List<UserAlbumAuditVo> 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<Anchor> 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<User> 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;
}
}