UploadTaskService.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package cn.cslg.pas.service.upLoadPatent;
  2. import cn.cslg.pas.common.model.PersonnelVO;
  3. import cn.cslg.pas.common.model.dto.TaskAddNewDTO;
  4. import cn.cslg.pas.common.model.dto.UploadFileDTO;
  5. import cn.cslg.pas.common.model.outApi.PatentStarListDto;
  6. import cn.cslg.pas.common.utils.*;
  7. import cn.cslg.pas.common.utils.SecurityUtils.LoginUtils;
  8. import cn.cslg.pas.domain.Patent;
  9. import cn.cslg.pas.domain.Project;
  10. import cn.cslg.pas.domain.SerachBiblioData;
  11. import cn.cslg.pas.domain.WebLoginConfig;
  12. import cn.cslg.pas.domain.asso.TaskCondition;
  13. import cn.cslg.pas.service.PatentService;
  14. import cn.cslg.pas.service.ProjectService;
  15. import cn.cslg.pas.service.TaskService;
  16. import cn.cslg.pas.service.WebLoginConfigService;
  17. import cn.cslg.pas.service.asso.TaskConditionService;
  18. import cn.cslg.pas.service.outApi.PatentStarApiService;
  19. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  20. import lombok.RequiredArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.springframework.context.annotation.Lazy;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.web.multipart.MultipartFile;
  25. import java.io.IOException;
  26. import java.util.Arrays;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.function.Function;
  30. /**
  31. * 导入专利任务的业务层
  32. *
  33. * @Author 李仁杰
  34. * 导入任务类
  35. */
  36. @Slf4j
  37. @Service
  38. @RequiredArgsConstructor(onConstructor_ = {@Lazy})
  39. public class UploadTaskService {
  40. private final FileUtils fileUtils;
  41. private final TaskService taskService;
  42. private final PantentQueueService pantentQueueService;
  43. private final TaskConditionService taskConditionService;
  44. private final ExcutePatentDataEpo excutePatentDataEpo;
  45. private final CacheUtils cacheUtils;
  46. private final LoginUtils loginUtils;
  47. private final WebLoginConfigService webLoginConfigService;
  48. private final PatentStarApiService patentStarApiService;
  49. private final ProjectService projectService;
  50. private final PatentService patentService;
  51. /**
  52. * 新增Excel导入任务
  53. *
  54. * @param file Excel文件
  55. * @param json 前台参数(与专题库关联信息、自定义字段、文件夹等)
  56. */
  57. public void addExcelTask(MultipartFile file, String json) throws IOException {
  58. //将包含多件专利的Excel文件上传至本地,并返回文件对象fileDTO
  59. UploadFileDTO fileDTO = fileUtils.uploadFile(file);
  60. //获得文件路径(绝对路径)
  61. String filePath = fileUtils.getPath(fileDTO.getPath());
  62. //检查文件合法性并获取专利总数量
  63. Integer total = ReadExcelUtils.textExcel(filePath);
  64. //新增任务(专利导入导出任务表)
  65. Integer taskId = taskService.addTask2(fileDTO, total, json);
  66. //任务存入生产者任务队列并唤醒生产者线程
  67. pantentQueueService.taskQueueAddTask(Arrays.asList(taskId));
  68. pantentQueueService.awakeTasktch();
  69. }
  70. /**
  71. * 新增Epo网站导入任务
  72. *
  73. * @param taskAddNewDTO 前台参数(检索信息conditions、专题库id、下载字段configCells等)
  74. */
  75. public TaskCondition addEpoTask(TaskAddNewDTO taskAddNewDTO) throws IOException {
  76. Integer webId = taskAddNewDTO.getConfigId();
  77. PersonnelVO personnelVO = cacheUtils.getLoginUserPersonnel(loginUtils.getId());
  78. //根据网站id获得配置
  79. WebLoginConfig webLoginConfig = webLoginConfigService.getLoginConfig(webId, personnelVO.getTenantId());
  80. if (webLoginConfig == null) {
  81. ThrowException.throwXiaoShiException("未配置网站登录信息");
  82. }
  83. //检查任务合法性(检查当前检索式能否检索出专利)
  84. //根据检索式conditions检索一件专利著录信息
  85. SerachBiblioData serachBiblioData = excutePatentDataEpo.getSerachBiblioData(taskAddNewDTO.getConditions(), 1, 1);
  86. if (serachBiblioData == null || serachBiblioData.getTotals() == 0) {
  87. ThrowException.throwXiaoShiException("根据检索信息未检索到相关专利,请尝试更换检索信息");
  88. }
  89. //任务与任务条件关联表新增数据
  90. TaskCondition taskCondition = new TaskCondition();
  91. taskCondition
  92. .setTaskType(taskAddNewDTO.getTaskType())
  93. .setConditions(taskAddNewDTO.getConditions())
  94. .setCrons(taskAddNewDTO.getCrons())
  95. .setConfigId(taskAddNewDTO.getConfigId())
  96. .setTaskName(taskAddNewDTO.getTaskName())
  97. .setTotal(serachBiblioData.getTotals());
  98. List<String> cells = taskAddNewDTO.getConfigCells();
  99. if (cells == null) {
  100. taskCondition.setConfigCells("");
  101. } else {
  102. taskCondition.setConfigCells(String.join(",", cells));
  103. }
  104. taskConditionService.save(taskCondition);
  105. //任务表新增任务
  106. Integer taskId = taskService.addTask3(taskAddNewDTO, serachBiblioData.getTotals(), taskCondition);
  107. //任务与任务条件关联表更新数据
  108. taskCondition.setTaskId(taskId);
  109. taskConditionService.updateById(taskCondition);
  110. //任务存入生产者任务队列并唤醒生产者线程
  111. pantentQueueService.taskQueueAddTask(Arrays.asList(taskId));
  112. pantentQueueService.awakeTasktch();
  113. return taskCondition;
  114. }
  115. /**
  116. * 新增专利之星导入任务
  117. *
  118. * @param taskAddNewDTO 前台参数(检索信息conditions、专题库id、下载字段configCells等)
  119. */
  120. public TaskCondition addPatentStarTask(TaskAddNewDTO taskAddNewDTO) throws IOException {
  121. log.info("开始处理【新增专利之星下载接口导入专利】的业务,参数为:{}", taskAddNewDTO);
  122. //检查任务合法性1(判断要导入的专题库或报告是否存在)
  123. if (taskAddNewDTO.getProjectId() != null) {
  124. Project project = projectService.getById(taskAddNewDTO.getProjectId());
  125. if (project == null) {
  126. ThrowException.throwXiaoShiException("该专题库已不存在,请尝试刷新页面");
  127. }
  128. }
  129. if (taskAddNewDTO.getReportId() != null) {
  130. //查询报告是否存在,若不存在则抛出异常信息 "该报告已不存在,请尝试刷新页面"
  131. }
  132. //检查任务合法性2(根据网站配置id和登陆人所属租户id,看是否有网站导入任务的权限)
  133. Integer webId = taskAddNewDTO.getConfigId();
  134. PersonnelVO personnelVO = cacheUtils.getLoginUserPersonnel(loginUtils.getId()); //获取登陆人信息
  135. WebLoginConfig webLoginConfig = webLoginConfigService.getLoginConfig(webId, personnelVO.getTenantId()); //根据网站id获得配置
  136. if (webLoginConfig == null) {
  137. ThrowException.throwXiaoShiException("未配置网站登录信息");
  138. }
  139. //检查任务合法性3(根据检索式信息调用一般检索接口,看是否能检索出专利)
  140. PatentStarListDto patentStarListDto = new PatentStarListDto()
  141. .setCurrentQuery(taskAddNewDTO.getConditions())
  142. .setOrderBy(taskAddNewDTO.getOrderBy())
  143. .setOrderByType(taskAddNewDTO.getOrderByType())
  144. .setPageNum(1)
  145. .setRowCount(10)
  146. .setDBType(taskAddNewDTO.getDBType());
  147. Map<String, Object> resultMap = patentStarApiService.patentStarSearchApi(patentStarListDto);
  148. if (resultMap == null || (Integer) resultMap.get("total") == 0) {
  149. ThrowException.throwXiaoShiException("未检索到相关专利,请尝试更改检索式或检索条件信息");
  150. }
  151. //获取专利总数量
  152. Integer total;
  153. if (taskAddNewDTO.getEndNumber() != 0) {
  154. total = taskAddNewDTO.getEndNumber() - taskAddNewDTO.getStartNumber() + 1;
  155. if (taskAddNewDTO.getIsDeletePatentNos() != null) {
  156. total = total - taskAddNewDTO.getIsDeletePatentNos().size();
  157. }
  158. if (taskAddNewDTO.getIsAddPatentNos() != null) {
  159. total = total + taskAddNewDTO.getIsAddPatentNos().size();
  160. }
  161. } else {
  162. total = taskAddNewDTO.getIsAddPatentNos().size();
  163. }
  164. //新增任务与任务条件关联表("asso_osTask_qrtzTask")数据
  165. TaskCondition taskCondition = new TaskCondition();
  166. taskCondition
  167. .setTaskName(taskAddNewDTO.getTaskName())
  168. .setTaskType(taskAddNewDTO.getTaskType())
  169. .setTaskType2(taskAddNewDTO.getTaskType2())
  170. .setConditions(taskAddNewDTO.getConditions())
  171. .setCrons(taskAddNewDTO.getCrons())
  172. .setConfigId(taskAddNewDTO.getConfigId())
  173. .setTaskName(taskAddNewDTO.getTaskName())
  174. .setTotal(total)
  175. .setOrderBy(taskAddNewDTO.getOrderBy())
  176. .setOrderByType(taskAddNewDTO.getOrderByType())
  177. .setDBType(taskAddNewDTO.getDBType())
  178. .setStartNumber(taskAddNewDTO.getStartNumber())
  179. .setEndNumber(taskAddNewDTO.getEndNumber());
  180. if (taskAddNewDTO.getIsAddPatentNos() != null && taskAddNewDTO.getIsAddPatentNos().size() > 0) {
  181. taskCondition.setIsAddPatentNos(StringUtils.join(taskAddNewDTO.getIsAddPatentNos(), ","));
  182. }
  183. if (taskAddNewDTO.getIsDeletePatentNos() != null && taskAddNewDTO.getIsDeletePatentNos().size() > 0) {
  184. taskCondition.setIsDeletePatentNos(StringUtils.join(taskAddNewDTO.getIsDeletePatentNos(), ","));
  185. }
  186. List<String> cells = taskAddNewDTO.getConfigCells();
  187. if (cells == null) {
  188. taskCondition.setConfigCells("");
  189. } else {
  190. taskCondition.setConfigCells(String.join(",", cells));
  191. }
  192. log.info("任务与任务条件关联表(asso_osTask_qrtzTask)新增数据");
  193. taskConditionService.save(taskCondition);
  194. //任务表新增任务
  195. Integer taskId = taskService.addTask3(taskAddNewDTO, total, taskCondition);
  196. //任务与任务条件关联表(asso_osTask_qrtzTask)更新数据(普通任务)
  197. if (taskAddNewDTO.getTaskType().equals(0)) {
  198. taskCondition.setTaskId(taskId);
  199. taskConditionService.updateById(taskCondition);
  200. }
  201. //任务存入生产者任务队列并唤醒生产者线程
  202. pantentQueueService.taskQueueAddTask(Arrays.asList(taskId));
  203. pantentQueueService.awakeTasktch();
  204. return taskCondition;
  205. }
  206. public String addPatentNoTask(TaskAddNewDTO qrtzTaskAddNewDTO) throws IOException {
  207. //校验参数
  208. if (qrtzTaskAddNewDTO == null || qrtzTaskAddNewDTO.getConditions() == null) {
  209. return Response.error("请输入专利号");
  210. }
  211. String condition = this.setPatentNosToCondition(qrtzTaskAddNewDTO.getConditions());
  212. if(condition==null){
  213. return Response.success("所有专利都已存在");
  214. }
  215. qrtzTaskAddNewDTO.setConditions(condition);
  216. TaskCondition assoOsTaskQrtzTask = new TaskCondition();
  217. //新增欧专局网站导入任务
  218. if (qrtzTaskAddNewDTO.getTaskType2().equals(3)) {
  219. assoOsTaskQrtzTask = this.addEpoTask(qrtzTaskAddNewDTO);
  220. //新增专利之星网站导入任务
  221. } else if (qrtzTaskAddNewDTO.getTaskType2().equals(4)) {
  222. assoOsTaskQrtzTask = this.addPatentStarTask(qrtzTaskAddNewDTO);
  223. }
  224. return Response.success("添加任务完成");
  225. }
  226. public String setPatentNosToCondition(String patentNosStr) {
  227. String[] patentNo = patentNosStr.split("[,|,]");
  228. List<String> patentNos = Arrays.asList(patentNo);
  229. //根据专利号从本数据库中查找专利
  230. LambdaQueryWrapper<Patent> queryWrapper = new LambdaQueryWrapper<>();
  231. queryWrapper.in(Patent::getPatentNo,patentNos);
  232. Function<Object, String> f = (o -> o.toString());
  233. List<String> dbPatentNos = patentService.listObjs(queryWrapper, f);
  234. //获得本系统不包含的专利
  235. patentNos.removeAll(dbPatentNos);
  236. if(patentNos.size()==0){
  237. return null;
  238. }
  239. //将本系统不包含的专利拼接成条件
  240. String patentNoCondition =StringUtils.join(patentNos," OR ");
  241. StringBuilder stringBuilder =new StringBuilder();
  242. stringBuilder.append("(PN=(")
  243. .append(patentNoCondition)
  244. .append(")")
  245. .append("OR GN=(")
  246. .append(patentNoCondition)
  247. .append("))");
  248. String conditions =stringBuilder.toString();
  249. return conditions;
  250. }
  251. }