SceneXspaceServiceImpl.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package com.fdkankan.jp.xspace.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  7. import com.fdkankan.common.constant.RecStatus;
  8. import com.fdkankan.fyun.face.FYunFileServiceInterface;
  9. import com.fdkankan.jp.xspace.common.PageInfo;
  10. import com.fdkankan.jp.xspace.common.Result;
  11. import com.fdkankan.jp.xspace.common.ResultCode;
  12. import com.fdkankan.jp.xspace.common.constant.OSSPathConstant;
  13. import com.fdkankan.jp.xspace.common.exception.BusinessException;
  14. import com.fdkankan.jp.xspace.common.rabbitmq.RabbitmqConstant;
  15. import com.fdkankan.jp.xspace.common.rabbitmq.dto.SceneXspaceMqDTO;
  16. import com.fdkankan.jp.xspace.dto.XspacePageDTO;
  17. import com.fdkankan.jp.xspace.entity.ScenePlus;
  18. import com.fdkankan.jp.xspace.entity.SceneXspace;
  19. import com.fdkankan.jp.xspace.entity.User;
  20. import com.fdkankan.jp.xspace.mapper.ISceneXspaceMapper;
  21. import com.fdkankan.jp.xspace.service.IScenePlusService;
  22. import com.fdkankan.jp.xspace.service.ISceneXspaceService;
  23. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  24. import com.fdkankan.jp.xspace.service.IUserRoleService;
  25. import com.fdkankan.jp.xspace.service.IUserService;
  26. import com.fdkankan.jp.xspace.common.util.UniqueStringGenerator;
  27. import com.fdkankan.jp.xspace.vo.XspaceVO;
  28. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.beans.factory.annotation.Value;
  31. import org.springframework.cloud.context.config.annotation.RefreshScope;
  32. import org.springframework.stereotype.Service;
  33. import javax.annotation.Resource;
  34. import java.util.ArrayList;
  35. import java.util.List;
  36. import java.util.Map;
  37. import java.util.Set;
  38. import java.util.stream.Collectors;
  39. /**
  40. * <p>
  41. * xspace同步表 服务实现类
  42. * </p>
  43. *
  44. * @author
  45. * @since 2024-07-22
  46. */
  47. @RefreshScope
  48. @Service
  49. public class SceneXspaceServiceImpl extends ServiceImpl<ISceneXspaceMapper, SceneXspace> implements ISceneXspaceService {
  50. @Value("${webSiteFormat}")
  51. private String webSiteFormat;
  52. @Autowired
  53. private IUserRoleService userRoleService;
  54. @Autowired
  55. private IUserService userService;
  56. @Autowired
  57. private IScenePlusService scenePlusService;
  58. @Autowired
  59. private RabbitMqProducer mqProducer;
  60. @Resource
  61. private FYunFileServiceInterface fYunFileService;
  62. @Override
  63. public PageInfo pageXspace(XspacePageDTO param, User user) {
  64. Set<Long> roleIds = userRoleService.getByUser(user);
  65. if(!roleIds.contains(5L)){//平台管理员可以看到所有
  66. if(roleIds.contains(6L)){//公司管理员可以看到同一公司下所有
  67. param.setCompanyId(user.getCompanyId());
  68. }else{//普通员工只能看到自己的
  69. param.setUserId(user.getId());
  70. }
  71. }
  72. Page<XspaceVO> xspaceVOPage = this.baseMapper.pageXspace(new Page(param.getPageNum(), param.getPageSize()), param);
  73. xspaceVOPage.getRecords().stream().forEach(v->{
  74. v.setWebSite(String.format(webSiteFormat, v.getNum(), v.getSerial()));
  75. });
  76. return PageInfo.PageInfo(xspaceVOPage);
  77. }
  78. @Override
  79. public Result delete(List<Long> ids, User user) {
  80. List<SceneXspace> sceneXspaces = this.listByIds(ids);
  81. if(CollUtil.isEmpty(sceneXspaces)){
  82. return Result.success();
  83. }
  84. //校验数据
  85. Set<Long> userIds = sceneXspaces.stream().map(x -> x.getUserId()).collect(Collectors.toSet());
  86. Set<Long> roleIds = userRoleService.getByUser(user);
  87. boolean notPermission = false;
  88. if(!roleIds.contains(5L)){//平台管理员可以看到所有
  89. if(roleIds.contains(6L)){//公司管理员可以看到同一公司下所有
  90. List<User> users = userService.listByIds(userIds);
  91. notPermission = users.stream().anyMatch(u -> !u.getCompanyId().equals(user.getCompanyId()));
  92. }else{//普通员工只能删除自己的
  93. notPermission = userIds.stream().anyMatch(id -> !id.equals(user.getId()));
  94. }
  95. }
  96. if(notPermission){
  97. return Result.failure(ResultCode.NOT_PERMISSION);
  98. }
  99. sceneXspaces.stream().forEach(x->{
  100. x.setUpdater(user.getId());
  101. x.setRecStatus(RecStatus.DISABLE.code());
  102. this.updateById(x);
  103. this.removeById(x.getId());
  104. String xspaceSceneKey = String.format(OSSPathConstant.XSPACE_SCENE_FORMAT, x.getNum(), x.getSerial());
  105. fYunFileService.deleteFolder(xspaceSceneKey);
  106. });
  107. return Result.success();
  108. }
  109. @Override
  110. public Result sync(List<String> nums, User user) {
  111. // List<String> canSyncList = nums;//实际需要同步的场景集合
  112. // if(CollUtil.isNotEmpty(syncList)){
  113. // List<String> doneNumsList = syncList.stream().map(v -> v.getNum()).collect(Collectors.toList());
  114. // canSyncList = nums.stream().filter(v->!doneNumsList.contains(v)).collect(Collectors.toList());
  115. // }
  116. // if(CollUtil.isEmpty(canSyncList)){
  117. // return Result.success();
  118. // }
  119. List<ScenePlus> scenePlusList = scenePlusService.list(new LambdaQueryWrapper<ScenePlus>().in(ScenePlus::getNum, nums));//.eq(ScenePlus::getUserId, user.getId());
  120. if(CollUtil.isEmpty(scenePlusList)){
  121. return Result.success();
  122. }
  123. //过滤掉已同步的场景,防止前端传参错误
  124. List<SceneXspace> syncList = this.list(new LambdaQueryWrapper<SceneXspace>().in(SceneXspace::getNum, nums));
  125. if(CollUtil.isNotEmpty(syncList)){
  126. Set<String> doneSet = syncList.stream().map(v -> v.getNum() + "-" + v.getUserId()).collect(Collectors.toSet());
  127. scenePlusList = scenePlusList.stream().filter(v -> {
  128. String userId = v.getUserId() == null ? "" : String.valueOf(v.getUserId());
  129. return !doneSet.contains(v.getNum() + "-" + userId);
  130. }).collect(Collectors.toList());
  131. }
  132. //平台管理员:能查看全部场景数据并且支持同步全部得数据 (平台管理员同步后的场景还是归属于之前这个场景的归属者)
  133. //公司管理员:仅能看到自己的场景并且同步自己的场景数据
  134. //公司员工:仅能看到自己的场景并且同步自己的场景数据
  135. Set<Long> roleIds = userRoleService.getByUser(user);
  136. if(!roleIds.contains(5L)){
  137. List<String> notPermisionNums = scenePlusList.stream().filter(p->!p.getUserId().equals(user.getId())).map(p->p.getNum()).collect(Collectors.toList());
  138. if(CollUtil.isNotEmpty(notPermisionNums)){
  139. throw new BusinessException(ResultCode.NOT_PERMISSION.code(), JSON.toJSONString(notPermisionNums));
  140. }
  141. }
  142. List<SceneXspace> sceneXspaceList = scenePlusList.stream().map(p -> {
  143. SceneXspace sceneXspace = new SceneXspace();
  144. sceneXspace.setNum(p.getNum());
  145. sceneXspace.setUserId(p.getUserId());
  146. sceneXspace.setSerial(UniqueStringGenerator.getUniqueString());
  147. sceneXspace.setCreator(user.getId());
  148. return sceneXspace;
  149. }).collect(Collectors.toList());
  150. this.saveBatch(sceneXspaceList);
  151. sceneXspaceList.stream().forEach(v->{
  152. mqProducer.sendByWorkQueue(RabbitmqConstant.QUEUE_PACK_XSPACE, v);
  153. });
  154. return Result.success();
  155. }
  156. @Override
  157. public SceneXspace getByNumAndUserId(String num, long userId) {
  158. return this.getOne(new LambdaQueryWrapper<SceneXspace>().eq(SceneXspace::getNum, num).eq(SceneXspace::getUserId, userId));
  159. }
  160. }