TechnicalCaseService.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package cn.cslg.pas.service.business;
  2. import cn.cslg.pas.common.dto.AddNoveltyProjectDTO;
  3. import cn.cslg.pas.common.dto.AddTechnicalCaseDTO;
  4. import cn.cslg.pas.common.dto.TechnicalCaseIdDTO;
  5. import cn.cslg.pas.common.model.cronModel.Personnel;
  6. import cn.cslg.pas.common.model.cronModel.PersonnelVO;
  7. import cn.cslg.pas.common.model.cronModel.SystemFile;
  8. import cn.cslg.pas.common.utils.CacheUtils;
  9. import cn.cslg.pas.common.utils.LoginUtils;
  10. import cn.cslg.pas.common.vo.EditInventionPointVO;
  11. import cn.cslg.pas.common.vo.QueryInventionPointVO;
  12. import cn.cslg.pas.common.vo.TechnicalCaseVO;
  13. import cn.cslg.pas.domain.BaseEntity;
  14. import cn.cslg.pas.domain.business.*;
  15. import cn.cslg.pas.domain.es.Patent;
  16. import cn.cslg.pas.domain.es.TechnicalCasePatent;
  17. import cn.cslg.pas.exception.XiaoShiException;
  18. import cn.cslg.pas.mapper.AssoTechnicalCaseFileMapper;
  19. import cn.cslg.pas.mapper.ProjectMapper;
  20. import cn.cslg.pas.mapper.TechnicalCaseMapper;
  21. import cn.cslg.pas.service.common.FileManagerService;
  22. import cn.cslg.pas.service.permissions.PermissionService;
  23. import co.elastic.clients.elasticsearch.ElasticsearchClient;
  24. import co.elastic.clients.elasticsearch._types.SortOptions;
  25. import co.elastic.clients.elasticsearch._types.SortOrder;
  26. import co.elastic.clients.elasticsearch._types.query_dsl.IdsQuery;
  27. import co.elastic.clients.elasticsearch._types.query_dsl.Like;
  28. import co.elastic.clients.elasticsearch._types.query_dsl.Query;
  29. import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
  30. import co.elastic.clients.elasticsearch.core.IndexResponse;
  31. import co.elastic.clients.elasticsearch.core.SearchRequest;
  32. import co.elastic.clients.elasticsearch.core.SearchResponse;
  33. import co.elastic.clients.elasticsearch.core.UpdateRequest;
  34. import co.elastic.clients.elasticsearch.core.search.Hit;
  35. import com.alibaba.fastjson.JSONObject;
  36. import com.alibaba.fastjson2.JSON;
  37. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  38. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  39. import lombok.RequiredArgsConstructor;
  40. import lombok.extern.slf4j.Slf4j;
  41. import org.apache.commons.lang3.ObjectUtils;
  42. import org.apache.commons.lang3.StringUtils;
  43. import org.springframework.beans.BeanUtils;
  44. import org.springframework.beans.factory.annotation.Autowired;
  45. import org.springframework.context.annotation.Lazy;
  46. import org.springframework.stereotype.Service;
  47. import org.springframework.transaction.annotation.Propagation;
  48. import org.springframework.transaction.annotation.Transactional;
  49. import org.springframework.util.CollectionUtils;
  50. import java.io.IOException;
  51. import java.util.ArrayList;
  52. import java.util.Date;
  53. import java.util.List;
  54. import java.util.stream.Collectors;
  55. @Service
  56. @Slf4j
  57. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  58. public class TechnicalCaseService extends ServiceImpl<TechnicalCaseMapper, TechnicalCase> {
  59. private final CacheUtils cacheUtils;
  60. private final LoginUtils loginUtils;
  61. private final ElasticsearchClient client;
  62. @Autowired
  63. private FileManagerService fileManagerService;
  64. @Autowired
  65. private PermissionService permissionService;
  66. @Autowired
  67. private AssoTechnicalCaseFileMapper assoTechnicalCaseFileMapper;
  68. @Autowired
  69. private AssoTechnicalCaseFileService assoTechnicalCaseFileService;
  70. @Autowired
  71. private TechnicalCaseMapper technicalCaseMapper;
  72. @Autowired
  73. private ProjectMapper projectMapper;
  74. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  75. public TechnicalCaseIdDTO addOrUpdateTechnicalCase(AddTechnicalCaseDTO vo) throws Exception {
  76. PersonnelVO personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
  77. TechnicalCaseIdDTO caseIdDTO = new TechnicalCaseIdDTO();
  78. if (vo.getTechnicalCaseId() == null) {
  79. if (vo.getProjectId() == null) {
  80. Project project = new Project();
  81. project.setType(4);
  82. project.setCreateId(personnelVO.getId());
  83. project.setTenantId(personnelVO.getTenantId());
  84. project.insert();
  85. vo.setProjectId(project.getId());
  86. NoveltyProject noveltyProject = new NoveltyProject();
  87. noveltyProject.setProjectId(project.getId());
  88. noveltyProject.insert();
  89. }
  90. TechnicalCase technicalCase = new TechnicalCase();
  91. BeanUtils.copyProperties(vo, technicalCase);
  92. technicalCase.insert();
  93. caseIdDTO.setProjectId(vo.getProjectId());
  94. caseIdDTO.setTechnicalCaseId(technicalCase.getId());
  95. //保存es
  96. TechnicalCasePatent casePatent = new TechnicalCasePatent();
  97. casePatent.setProjectId(vo.getProjectId());
  98. casePatent.setInventionPoint(technicalCase.getInventionPoint());
  99. String technicalCasePatentId = this.addTechnicalCasePatent(casePatent);
  100. if (StringUtils.isEmpty(technicalCasePatentId)) {
  101. throw new XiaoShiException("发明点保存Es失败");
  102. }
  103. } else {
  104. TechnicalCase technicalCase = technicalCaseMapper.selectById(vo.getTechnicalCaseId());
  105. BeanUtils.copyProperties(vo, technicalCase);
  106. technicalCase.updateById();
  107. caseIdDTO.setTechnicalCaseId(technicalCase.getId());
  108. caseIdDTO.setProjectId(technicalCase.getProjectId());
  109. //保存es
  110. EditInventionPointVO pointVO = this.selectTechnicalCasePatent(technicalCase.getProjectId());
  111. if (!pointVO.getInventionPoint().equals(vo.getInventionPoint())) {
  112. TechnicalCasePatent casePatent = new TechnicalCasePatent();
  113. // casePatent.setProjectId(vo.getProjectId());
  114. casePatent.setInventionPoint(vo.getInventionPoint());
  115. Integer count = this.updateTechnicalCasePatent(casePatent, pointVO.getPatentId());
  116. if (count > 0) {
  117. throw new XiaoShiException("发明点更新Es失败");
  118. }
  119. }
  120. }
  121. List<AssoTechnicalCaseFile> technicalCaseFiles = assoTechnicalCaseFileMapper.selectList(new LambdaQueryWrapper<AssoTechnicalCaseFile>()
  122. .eq(AssoTechnicalCaseFile::getTechnicalCaseId, caseIdDTO.getTechnicalCaseId()));
  123. if (!CollectionUtils.isEmpty(technicalCaseFiles)) {
  124. List<Integer> collect = technicalCaseFiles.stream().map(BaseEntity::getId).collect(Collectors.toList());
  125. assoTechnicalCaseFileMapper.deleteBatchIds(collect);
  126. }
  127. //添加技术方案和图片关联
  128. List<AssoTechnicalCaseFile> assoTechnicalCaseFiles = new ArrayList<>();
  129. List<String> fileGuids = vo.getFileGuids();
  130. if (!CollectionUtils.isEmpty(fileGuids)) {
  131. for (String fileGuid : fileGuids) {
  132. AssoTechnicalCaseFile assoTechnicalCaseFile = new AssoTechnicalCaseFile();
  133. assoTechnicalCaseFile.setTechnicalCaseId(caseIdDTO.getTechnicalCaseId());
  134. assoTechnicalCaseFile.setFileGuid(fileGuid);
  135. assoTechnicalCaseFile.setCreateId(personnelVO.getId());
  136. assoTechnicalCaseFiles.add(assoTechnicalCaseFile);
  137. }
  138. if (!CollectionUtils.isEmpty(assoTechnicalCaseFiles)) {
  139. assoTechnicalCaseFileService.saveBatch(assoTechnicalCaseFiles);
  140. }
  141. }
  142. return caseIdDTO;
  143. }
  144. public TechnicalCaseVO queryTechnicalCase(TechnicalCaseIdDTO vo) {
  145. TechnicalCase technicalCase = this.getOne(new LambdaQueryWrapper<TechnicalCase>()
  146. .eq(TechnicalCase::getProjectId, vo.getProjectId()));
  147. TechnicalCaseVO technicalCaseVO = new TechnicalCaseVO();
  148. BeanUtils.copyProperties(technicalCase, technicalCaseVO);
  149. technicalCaseVO.setTechnicalCaseId(technicalCase.getId());
  150. List<AssoTechnicalCaseFile> assoTechnicalCaseFiles = assoTechnicalCaseFileMapper.selectList(new LambdaQueryWrapper<AssoTechnicalCaseFile>()
  151. .eq(AssoTechnicalCaseFile::getTechnicalCaseId, technicalCase.getId()));
  152. if (!CollectionUtils.isEmpty(assoTechnicalCaseFiles)) {
  153. List<String> guids = assoTechnicalCaseFiles.stream().map(AssoTechnicalCaseFile::getFileGuid).collect(Collectors.toList());
  154. String res = null;
  155. try {
  156. res = fileManagerService.getSystemFileFromFMS(guids);
  157. } catch (IOException e) {
  158. e.printStackTrace();
  159. }
  160. if (StringUtils.isNotEmpty(res)) {
  161. List<SystemFile> systemFiles = JSON.parseArray(res, SystemFile.class);
  162. technicalCaseVO.setSystemFileList(systemFiles);
  163. }
  164. }
  165. return technicalCaseVO;
  166. }
  167. public void deleteTechnicalCase(TechnicalCaseIdDTO vo) {
  168. LambdaQueryWrapper<AssoTechnicalCaseFile> deleteFileWrapper = new LambdaQueryWrapper<>();
  169. deleteFileWrapper.eq(AssoTechnicalCaseFile::getTechnicalCaseId, vo.getTechnicalCaseId());
  170. assoTechnicalCaseFileService.remove(deleteFileWrapper);
  171. this.removeById(vo.getTechnicalCaseId());
  172. }
  173. public List<QueryInventionPointVO> querySimilarInventionPoint(String content) throws IOException {
  174. SearchRequest.Builder builder = new SearchRequest.Builder();
  175. //设置查询索引
  176. builder.index("technical_case_patent");
  177. Like likeContent = Like.of(i -> i.text(content));
  178. Query query = QueryBuilders.moreLikeThis(i -> i.fields("invention_point").like(likeContent)
  179. .minTermFreq(1).maxQueryTerms(12));
  180. builder.query(query);
  181. // builder.from(0).size(200);
  182. //解除最大条数限制
  183. builder.trackTotalHits(i -> i.enabled(true));
  184. SearchResponse<TechnicalCasePatent> response = client.search(builder.build(), TechnicalCasePatent.class);
  185. List<Hit<TechnicalCasePatent>> hits = response.hits().hits();
  186. List<QueryInventionPointVO> inventionPointVOS = new ArrayList<>();
  187. for (Hit<TechnicalCasePatent> hit : hits) {
  188. TechnicalCasePatent casePatent = hit.source();
  189. QueryInventionPointVO inventionPointVO = new QueryInventionPointVO();
  190. inventionPointVO.setProjectId(casePatent.getProjectId());
  191. inventionPointVO.setInventionPoint(casePatent.getInventionPoint());
  192. inventionPointVOS.add(inventionPointVO);
  193. }
  194. List<Personnel> personnels = new ArrayList<>();
  195. if (!CollectionUtils.isEmpty(inventionPointVOS)) {
  196. List<Integer> projectIds = inventionPointVOS.stream().map(QueryInventionPointVO::getProjectId).collect(Collectors.toList());
  197. List<Project> projects = projectMapper.selectBatchIds(projectIds);
  198. List<String> createIds = projects.stream().map(Project::getCreateId).collect(Collectors.toList());
  199. //查询创建人名称
  200. if (!CollectionUtils.isEmpty(createIds)) {
  201. String res = permissionService.getPersonnelByIdsFromPCS(createIds);
  202. JSONObject jsonObject = com.alibaba.fastjson.JSON.parseObject(res);
  203. personnels = JSON.parseArray(jsonObject.getString("data"), Personnel.class);
  204. }
  205. for (QueryInventionPointVO pointVO : inventionPointVOS) {
  206. Project project = projects.stream().filter(i -> i.getId().equals(pointVO.getProjectId())).findFirst().orElse(null);
  207. if (ObjectUtils.isNotEmpty(project)) {
  208. pointVO.setCreateId(project.getCreateId());
  209. pointVO.setCreateTime(project.getCreateTime());
  210. //装载人员信息
  211. Personnel personnel = personnels.stream().filter(item -> item.getId().equals(pointVO.getCreateId())).findFirst().orElse(null);
  212. if (personnel != null) {
  213. pointVO.setCreateName(personnel.getPersonnelName());
  214. }
  215. }
  216. }
  217. }
  218. return inventionPointVOS;
  219. }
  220. //查询TechnicalCasePatent
  221. public EditInventionPointVO selectTechnicalCasePatent(Integer projectId) throws Exception {
  222. EditInventionPointVO pointVO = new EditInventionPointVO();
  223. SearchRequest.Builder builder = new SearchRequest.Builder();
  224. //设置查询索引
  225. builder.index("technical_case_patent");
  226. Query query = QueryBuilders.term(i -> i.field("project_id").value(projectId));
  227. builder.query(query);
  228. SearchResponse<TechnicalCasePatent> response = client.search(builder.build(), TechnicalCasePatent.class);
  229. List<Hit<TechnicalCasePatent>> hits = response.hits().hits();
  230. for (Hit<TechnicalCasePatent> hit : hits) {
  231. pointVO.setPatentId(hit.id());
  232. TechnicalCasePatent patent = hit.source();
  233. pointVO.setProjectId(patent.getProjectId());
  234. pointVO.setInventionPoint(patent.getInventionPoint());
  235. break;
  236. }
  237. return pointVO;
  238. }
  239. //添加TechnicalCasePatent
  240. public String addTechnicalCasePatent(TechnicalCasePatent casePatent) throws Exception {
  241. IndexResponse indexResponse = client.index(i -> i
  242. .index("technical_case_patent")
  243. //传入user对象
  244. .document(casePatent)
  245. );
  246. return indexResponse.id();
  247. }
  248. //更新TechnicalCasePatent
  249. public Integer updateTechnicalCasePatent(TechnicalCasePatent patent, String id) {
  250. UpdateRequest<TechnicalCasePatent, TechnicalCasePatent> req;
  251. req = UpdateRequest.of(
  252. b -> b.index("technical_case_patent").id(id)
  253. .doc(patent));
  254. try {
  255. client.update(req, TechnicalCasePatent.class);
  256. return 1;
  257. } catch (IOException e) {
  258. return -1;
  259. }
  260. }
  261. }