package com.fdkankan.jp.xspace.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fdkankan.common.constant.RecStatus;
import com.fdkankan.fyun.face.FYunFileServiceInterface;
import com.fdkankan.jp.xspace.common.PageInfo;
import com.fdkankan.jp.xspace.common.Result;
import com.fdkankan.jp.xspace.common.ResultCode;
import com.fdkankan.jp.xspace.common.constant.OSSPathConstant;
import com.fdkankan.jp.xspace.common.exception.BusinessException;
import com.fdkankan.jp.xspace.common.rabbitmq.RabbitmqConstant;
import com.fdkankan.jp.xspace.common.rabbitmq.dto.SceneXspaceMqDTO;
import com.fdkankan.jp.xspace.dto.XspacePageDTO;
import com.fdkankan.jp.xspace.entity.ScenePlus;
import com.fdkankan.jp.xspace.entity.SceneXspace;
import com.fdkankan.jp.xspace.entity.User;
import com.fdkankan.jp.xspace.mapper.ISceneXspaceMapper;
import com.fdkankan.jp.xspace.service.IScenePlusService;
import com.fdkankan.jp.xspace.service.ISceneXspaceService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fdkankan.jp.xspace.service.IUserRoleService;
import com.fdkankan.jp.xspace.service.IUserService;
import com.fdkankan.jp.xspace.common.util.UniqueStringGenerator;
import com.fdkankan.jp.xspace.vo.XspaceVO;
import com.fdkankan.rabbitmq.util.RabbitMqProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
*
* xspace同步表 服务实现类
*
*
* @author
* @since 2024-07-22
*/
@RefreshScope
@Service
public class SceneXspaceServiceImpl extends ServiceImpl implements ISceneXspaceService {
@Value("${webSiteFormat}")
private String webSiteFormat;
@Autowired
private IUserRoleService userRoleService;
@Autowired
private IUserService userService;
@Autowired
private IScenePlusService scenePlusService;
@Autowired
private RabbitMqProducer mqProducer;
@Resource
private FYunFileServiceInterface fYunFileService;
@Override
public PageInfo pageXspace(XspacePageDTO param, User user) {
Set roleIds = userRoleService.getByUser(user);
if(!roleIds.contains(5L)){//平台管理员可以看到所有
if(roleIds.contains(6L)){//公司管理员可以看到同一公司下所有
param.setCompanyId(user.getCompanyId());
}else{//普通员工只能看到自己的
param.setUserId(user.getId());
}
}
Page xspaceVOPage = this.baseMapper.pageXspace(new Page(param.getPageNum(), param.getPageSize()), param);
xspaceVOPage.getRecords().stream().forEach(v->{
v.setWebSite(String.format(webSiteFormat, v.getNum(), v.getSerial()));
});
return PageInfo.PageInfo(xspaceVOPage);
}
@Override
public Result delete(List ids, User user) {
List sceneXspaces = this.listByIds(ids);
if(CollUtil.isEmpty(sceneXspaces)){
return Result.success();
}
//校验数据
Set userIds = sceneXspaces.stream().map(x -> x.getUserId()).collect(Collectors.toSet());
Set roleIds = userRoleService.getByUser(user);
boolean notPermission = false;
if(!roleIds.contains(5L)){//平台管理员可以看到所有
if(roleIds.contains(6L)){//公司管理员可以看到同一公司下所有
List users = userService.listByIds(userIds);
notPermission = users.stream().anyMatch(u -> !u.getCompanyId().equals(user.getCompanyId()));
}else{//普通员工只能删除自己的
notPermission = userIds.stream().anyMatch(id -> !id.equals(user.getId()));
}
}
if(notPermission){
return Result.failure(ResultCode.NOT_PERMISSION);
}
sceneXspaces.stream().forEach(x->{
x.setUpdater(user.getId());
x.setRecStatus(RecStatus.DISABLE.code());
this.updateById(x);
this.removeById(x.getId());
String xspaceSceneKey = String.format(OSSPathConstant.XSPACE_SCENE_FORMAT, x.getNum(), x.getSerial());
fYunFileService.deleteFolder(xspaceSceneKey);
});
return Result.success();
}
@Override
public Result sync(List nums, User user) {
// List canSyncList = nums;//实际需要同步的场景集合
// if(CollUtil.isNotEmpty(syncList)){
// List doneNumsList = syncList.stream().map(v -> v.getNum()).collect(Collectors.toList());
// canSyncList = nums.stream().filter(v->!doneNumsList.contains(v)).collect(Collectors.toList());
// }
// if(CollUtil.isEmpty(canSyncList)){
// return Result.success();
// }
List scenePlusList = scenePlusService.list(new LambdaQueryWrapper().in(ScenePlus::getNum, nums));//.eq(ScenePlus::getUserId, user.getId());
if(CollUtil.isEmpty(scenePlusList)){
return Result.success();
}
//过滤掉已同步的场景,防止前端传参错误
List syncList = this.list(new LambdaQueryWrapper().in(SceneXspace::getNum, nums));
if(CollUtil.isNotEmpty(syncList)){
Set doneSet = syncList.stream().map(v -> v.getNum() + "-" + v.getUserId()).collect(Collectors.toSet());
scenePlusList = scenePlusList.stream().filter(v -> {
String userId = v.getUserId() == null ? "" : String.valueOf(v.getUserId());
return !doneSet.contains(v.getNum() + "-" + userId);
}).collect(Collectors.toList());
}
//平台管理员:能查看全部场景数据并且支持同步全部得数据 (平台管理员同步后的场景还是归属于之前这个场景的归属者)
//公司管理员:仅能看到自己的场景并且同步自己的场景数据
//公司员工:仅能看到自己的场景并且同步自己的场景数据
Set roleIds = userRoleService.getByUser(user);
if(!roleIds.contains(5L)){
List notPermisionNums = scenePlusList.stream().filter(p->!p.getUserId().equals(user.getId())).map(p->p.getNum()).collect(Collectors.toList());
if(CollUtil.isNotEmpty(notPermisionNums)){
throw new BusinessException(ResultCode.NOT_PERMISSION.code(), JSON.toJSONString(notPermisionNums));
}
}
List sceneXspaceList = scenePlusList.stream().map(p -> {
SceneXspace sceneXspace = new SceneXspace();
sceneXspace.setNum(p.getNum());
sceneXspace.setUserId(p.getUserId());
sceneXspace.setSerial(UniqueStringGenerator.getUniqueString());
sceneXspace.setCreator(user.getId());
return sceneXspace;
}).collect(Collectors.toList());
this.saveBatch(sceneXspaceList);
sceneXspaceList.stream().forEach(v->{
mqProducer.sendByWorkQueue(RabbitmqConstant.QUEUE_PACK_XSPACE, v);
});
return Result.success();
}
@Override
public SceneXspace getByNumAndUserId(String num, long userId) {
return this.getOne(new LambdaQueryWrapper().eq(SceneXspace::getNum, num).eq(SceneXspace::getUserId, userId));
}
}