ProjectUsedByTenantService.java 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package cn.cslg.pas.service;
  2. import cn.cslg.pas.common.model.vo.ProjectSharedTenantVO;
  3. import cn.cslg.pas.common.model.vo.ProjectUsedByTenantVO;
  4. import cn.cslg.pas.common.model.vo.TenantVo;
  5. import cn.cslg.pas.domain.Project;
  6. import cn.cslg.pas.domain.ProjectPatentLink;
  7. import cn.cslg.pas.domain.ProjectUser;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.google.gson.Gson;
  10. import com.google.gson.reflect.TypeToken;
  11. import lombok.RequiredArgsConstructor;
  12. import lombok.extern.slf4j.Slf4j;
  13. import okhttp3.MediaType;
  14. import okhttp3.OkHttpClient;
  15. import okhttp3.Request;
  16. import okhttp3.RequestBody;
  17. import org.springframework.beans.factory.annotation.Value;
  18. import org.springframework.stereotype.Service;
  19. import java.io.IOException;
  20. import java.lang.reflect.Type;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.Objects;
  25. import java.util.concurrent.TimeUnit;
  26. import java.util.stream.Collectors;
  27. /**
  28. * @Author xiexiang
  29. * @Date 2023/7/28
  30. */
  31. @RequiredArgsConstructor
  32. @Slf4j
  33. @Service
  34. public class ProjectUsedByTenantService {
  35. @Value("${authorUrl}")
  36. private String PCSUrl;
  37. private final ProjectService projectService;
  38. private final ProjectPatentLinkService projectPatentLinkService;
  39. private final ProjectUserService projectUserService;
  40. /**
  41. * 查询租户专题库使用情况
  42. * @return
  43. * @throws IOException
  44. */
  45. public List<ProjectUsedByTenantVO> getProjectUsedByTenant(List<Integer> tenantIds) throws IOException {
  46. List<ProjectUsedByTenantVO> projectUsedByTenantVOS = new ArrayList<>();
  47. //获取租户id和名称的集合
  48. Map<Integer, String> tenantMap = this.getAllTenant(tenantIds);
  49. tenantMap.forEach((key, value)->{
  50. LambdaQueryWrapper<Project> queryWrapper = new LambdaQueryWrapper<>();
  51. queryWrapper.eq(Project::getTenantId,key);
  52. //某一个租户id对应的专题库数量
  53. Long count = projectService.count(queryWrapper);
  54. Integer projectNum = Long.valueOf(count).intValue();
  55. //专题库名称
  56. List<Project> projects = projectService.list(queryWrapper);
  57. if(projects.size() > 0){//租户下有专题库
  58. //专题库id和名称组成map
  59. Map<Integer, String> projectMaps = projects.stream().collect(Collectors.toMap(Project::getId, Project::getName));
  60. //遍历
  61. projectMaps.forEach((key1,value1)->{
  62. LambdaQueryWrapper<ProjectPatentLink> queryWrapper1 = new LambdaQueryWrapper<>();
  63. queryWrapper1.eq(ProjectPatentLink::getProjectId,key1);
  64. Long count1 = projectPatentLinkService.count(queryWrapper1);
  65. Integer patentNum = Long.valueOf(count1).intValue();
  66. ProjectUsedByTenantVO projectUsedByTenantVO = new ProjectUsedByTenantVO();
  67. projectUsedByTenantVO.setTenantName(value);
  68. projectUsedByTenantVO.setProjectNum(projectNum);
  69. projectUsedByTenantVO.setProjectId(key1);
  70. projectUsedByTenantVO.setProjectName(value1);
  71. projectUsedByTenantVO.setPatentNum(patentNum);
  72. projectUsedByTenantVOS.add(projectUsedByTenantVO);
  73. });
  74. } else {//租户下没有专题库
  75. ProjectUsedByTenantVO projectUsedByTenantVO = new ProjectUsedByTenantVO();
  76. projectUsedByTenantVO.setTenantName(value);
  77. projectUsedByTenantVO.setProjectNum(0);
  78. projectUsedByTenantVO.setProjectName(null);
  79. projectUsedByTenantVO.setPatentNum(0);
  80. projectUsedByTenantVOS.add(projectUsedByTenantVO);
  81. }
  82. });
  83. return projectUsedByTenantVOS;
  84. }
  85. /**
  86. * 查询所有租户
  87. * @return
  88. * @throws IOException
  89. */
  90. public Map<Integer, String> getAllTenant(List<Integer> tenantIds) throws IOException {
  91. //调用权限系统查询租户信息接口
  92. String str = this.getTenantFromPCS(tenantIds);
  93. Gson gson = new Gson();
  94. Type listType = new TypeToken<List<TenantVo>>(){}.getType();
  95. List<TenantVo> tenantVos = gson.fromJson(str, listType);
  96. Map<Integer,String> tenantMap = tenantVos.stream().collect(Collectors.toMap(TenantVo::getId, TenantVo::getTenantName));
  97. return tenantMap;
  98. }
  99. /**
  100. * 调用权限系统查询租户接口
  101. * @return
  102. * @throws IOException
  103. */
  104. public String getTenantFromPCS(List<Integer> tenantIds) throws IOException {
  105. String param = new Gson().toJson(tenantIds);
  106. RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
  107. OkHttpClient okHttpClient = new OkHttpClient.Builder()
  108. .connectTimeout(60, TimeUnit.SECONDS)
  109. .writeTimeout(60, TimeUnit.SECONDS)
  110. .readTimeout(60, TimeUnit.SECONDS)
  111. .build();
  112. Request request = new Request.Builder()
  113. .url(PCSUrl + "/permission/api/tenant/getTenantIdAndName")
  114. .post(requestBody)
  115. .build();
  116. return Objects.requireNonNull(okHttpClient.newCall(request).execute().body()).string();
  117. }
  118. /**
  119. * 查询租户被分享的专题库名
  120. * @return
  121. * @throws IOException
  122. */
  123. public List<ProjectSharedTenantVO> projectShared(List<Integer> tenantIds) throws IOException {
  124. List<ProjectSharedTenantVO> projectSharedTenantVOS = new ArrayList<>();
  125. //获取租户id和名称的集合
  126. Map<Integer, String> tenantMap = this.getAllTenant(tenantIds);
  127. //遍历
  128. tenantMap.forEach((key, value)->{
  129. //根据租户id查询分享库中的专题库信息集合
  130. LambdaQueryWrapper<ProjectUser> queryWrapper = new LambdaQueryWrapper<>();
  131. queryWrapper.eq(ProjectUser::getTenantId, key);
  132. List<ProjectUser> projectUsers = projectUserService.list(queryWrapper);
  133. //查询租户使用的专题库集合
  134. LambdaQueryWrapper<Project> queryWrapper1 = new LambdaQueryWrapper<>();
  135. queryWrapper1.eq(Project::getTenantId, key);
  136. // List<Project> oldProjects = projectService.list(queryWrapper1);
  137. //租户使用的专题库ids
  138. List<Integer> oldProjectIds = projectService.list(queryWrapper1).stream().map(Project::getId).collect(Collectors.toList());
  139. //过滤出分享库中 不在租户使用的专题库ids集合 (过滤条件:租户名下使用的专题库ids中不包含分享库中的专题库ids,如果包含则过滤掉)
  140. List<Integer> ids = projectUsers.stream().filter(item -> !oldProjectIds.contains(item.getProjectId())).map(ProjectUser::getProjectId).collect(Collectors.toList());
  141. if(ids.size() > 0) {
  142. LambdaQueryWrapper<Project> queryWrapper2 = new LambdaQueryWrapper<>();
  143. queryWrapper2.in(Project::getId,ids);
  144. List<Project> projects = projectService.list(queryWrapper2);
  145. if(projects.size() > 0) {
  146. //遍历专题库ids,取出专题库名称
  147. for(int i = 0; i < projects.size(); i++){
  148. ProjectSharedTenantVO projectSharedTenantVO = new ProjectSharedTenantVO();
  149. //租户名为value
  150. projectSharedTenantVO.setTenantName(value);
  151. //被分享专题库数量为ids的长度
  152. projectSharedTenantVO.setProjectNum(projects.size());
  153. //专题库名
  154. projectSharedTenantVO.setProjectName(projects.get(i).getName());
  155. projectSharedTenantVOS.add(projectSharedTenantVO);
  156. }
  157. } else {//ids不为0,但是数据库中没有,脏数据容错
  158. ProjectSharedTenantVO projectSharedTenantVO = new ProjectSharedTenantVO();
  159. //租户名为value
  160. projectSharedTenantVO.setTenantName(value);
  161. projectSharedTenantVO.setProjectNum(0);
  162. projectSharedTenantVOS.add(projectSharedTenantVO);
  163. }
  164. } else {//专题库ids为0
  165. ProjectSharedTenantVO projectSharedTenantVO = new ProjectSharedTenantVO();
  166. //租户名为value
  167. projectSharedTenantVO.setTenantName(value);
  168. projectSharedTenantVO.setProjectNum(0);
  169. projectSharedTenantVOS.add(projectSharedTenantVO);
  170. }
  171. });
  172. return projectSharedTenantVOS;
  173. }
  174. }