UploadTaskService.java 13 KB

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