|
@@ -3,10 +3,19 @@ package cn.cslg.pas.service.upLoadPatent;
|
|
|
import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
|
|
|
import cn.cslg.pas.common.model.vo.UploadParamsVO;
|
|
|
import cn.cslg.pas.common.utils.DateUtils;
|
|
|
+import cn.cslg.pas.common.utils.JsonUtils;
|
|
|
+import cn.cslg.pas.common.utils.StringUtils;
|
|
|
+import cn.cslg.pas.domain.PQueueData;
|
|
|
import cn.cslg.pas.domain.QueueData;
|
|
|
import cn.cslg.pas.domain.Task;
|
|
|
+import cn.cslg.pas.domain.asso.AssoOsTaskQrtzTask;
|
|
|
+import cn.cslg.pas.service.OutInterfaceService;
|
|
|
+import cn.cslg.pas.service.PatentInstructionService;
|
|
|
import cn.cslg.pas.service.TaskService;
|
|
|
import cn.cslg.pas.service.UploadPatentBatchService;
|
|
|
+import cn.cslg.pas.service.asso.AssoOsTaskQrtzTaskService;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import lombok.Data;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
@@ -18,94 +27,180 @@ import java.util.concurrent.locks.Lock;
|
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
|
|
/**
|
|
|
- * 将专利信息存入队列或从队列取出
|
|
|
+ * 1.生产者线程生产专利(根据任务类型调用对应工厂方法执行获取专利数据)
|
|
|
+ * 2.装载者线程装载专利(将专利数据装载到专利实体类)
|
|
|
+ * 3.消费者线程消费专利(将专利入库)
|
|
|
*/
|
|
|
@Service
|
|
|
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
|
|
|
public class PantentQueueService {
|
|
|
private final UploadPatentToDBService uploadPatentToDBService;
|
|
|
private final UploadPatentBatchService uploadPatentBatchService;
|
|
|
- private final ExcuteTaskToPatentService excuteTaskToPatentService;
|
|
|
private final MessageService messageService;
|
|
|
private final TaskService taskService;
|
|
|
- private final Queue<QueueData> patentImageQueue = new LinkedList<>();
|
|
|
- private final Queue<QueueData> patentZhuluQueue = new LinkedList<>();
|
|
|
- private final Queue<QueueData> patentRightQueue = new LinkedList<>();
|
|
|
- private final Queue<QueueData> patentInstructionTextQueue = new LinkedList<>();
|
|
|
- private final Queue<QueueData> patentAssoQueue = new LinkedList<>();
|
|
|
+ private final AssoOsTaskQrtzTaskService assoOsTaskQrtzTaskService;
|
|
|
+ private final ExcutePatentDataExcel excutePatentDataExcel;
|
|
|
+ private final ExcutePatentDataEpo excutePatentDataEpo;
|
|
|
+ private final ExcutePatentDataStar excutePatentDataStar;
|
|
|
+ private final PatentInstructionService patentInstructionService;
|
|
|
+ private final OutInterfaceService outInterfaceService;
|
|
|
private final List<Integer> taskQueueList = new ArrayList<>();
|
|
|
- private Boolean flag = false;
|
|
|
+ private final List<PQueueData> setPatentImageQueueList = new ArrayList<>();
|
|
|
+ private final List<PQueueData> setPatentZhuluQueueList = new ArrayList<>();
|
|
|
+ private final List<PQueueData> setPatentRightQueueList = new ArrayList<>();
|
|
|
+ private final List<PQueueData> setPatentInstructionTextQueueList = new ArrayList<>();
|
|
|
+ private final List<PQueueData> setPatentInstructionPDFQueueList = new ArrayList<>();
|
|
|
+ private final List<QueueData> patentImageQueueList = new ArrayList<>();
|
|
|
+ private final List<QueueData> patentZhuluQueueList = new ArrayList<>();
|
|
|
+ private final List<QueueData> patentRightQueueList = new ArrayList<>();
|
|
|
+ private final List<QueueData> patentInstructionTextQueueList = new ArrayList<>();
|
|
|
+ private final List<QueueData> patentInstructionPDFQueueList = new ArrayList<>();
|
|
|
private final Lock taskLock = new ReentrantLock();
|
|
|
+ private final Lock setPatentImageLock = new ReentrantLock();
|
|
|
+ private final Lock setPatentZhuluLock = new ReentrantLock();
|
|
|
+ private final Lock setPatentRightLock = new ReentrantLock();
|
|
|
+ private final Lock setPatentInstructionTextLock = new ReentrantLock();
|
|
|
+ private final Lock setPatentInstructionPDFLock = new ReentrantLock();
|
|
|
private final Lock patentImageLock = new ReentrantLock();
|
|
|
private final Lock patentZhuluLock = new ReentrantLock();
|
|
|
private final Lock patentRightLock = new ReentrantLock();
|
|
|
private final Lock patentInstructionTextLock = new ReentrantLock();
|
|
|
- private final Lock patentAssoLock = new ReentrantLock();
|
|
|
+ private final Lock patentInstructionPDFLock = new ReentrantLock();
|
|
|
private final Condition taskCondition = taskLock.newCondition();
|
|
|
+ private final Condition setPatentImageCondition = setPatentImageLock.newCondition();
|
|
|
+ private final Condition setPatentZhuluCondition = setPatentZhuluLock.newCondition();
|
|
|
+ private final Condition setPatentRightCondition = setPatentRightLock.newCondition();
|
|
|
+ private final Condition setPatentInstructionTextCondition = setPatentInstructionTextLock.newCondition();
|
|
|
+ private final Condition setPatentInstructionPDFCondition = setPatentInstructionPDFLock.newCondition();
|
|
|
private final Condition patentImageCondition = patentImageLock.newCondition();
|
|
|
private final Condition patentZhuluCondition = patentZhuluLock.newCondition();
|
|
|
private final Condition patentRightCondition = patentRightLock.newCondition();
|
|
|
private final Condition patentInstructionTextCondition = patentInstructionTextLock.newCondition();
|
|
|
- private final Condition patentAssoCondition = patentAssoLock.newCondition();
|
|
|
- private final HashMap<Integer, Integer> patentIdMap = new HashMap<>();
|
|
|
- private Task task = null;
|
|
|
- private Integer patentFinishNum = 0;
|
|
|
+ private final Condition patentInstructionPDFCondition = patentInstructionPDFLock.newCondition();
|
|
|
+ private final HashMap<String, Integer> patentIdMap = new HashMap<>();
|
|
|
|
|
|
/**
|
|
|
- * 生产者:从任务队列取出任务解析专利,将专利分配给消费者消费
|
|
|
+ * 生产者:从任务队列取出任务,再调用工厂方法根据任务类型返回对应的生产专利方法的对象将专利分配给消费者
|
|
|
*/
|
|
|
public void addPatnetToQueue() {
|
|
|
- try {
|
|
|
- while (true) {
|
|
|
- //检查任务队列
|
|
|
+ while (true) {
|
|
|
+ Task task = new Task();
|
|
|
+ try {
|
|
|
+ //判断任务队列是否有任务,若没有则线程等待唤醒
|
|
|
if (taskQueueList.size() == 0) {
|
|
|
taskLock.lock();
|
|
|
taskCondition.await();
|
|
|
}
|
|
|
- //1.从taskQueueList中取出第一个task,将其状态改为进行中,并将其从任务队列taskQueueList中删除
|
|
|
- task = taskService.getById(taskQueueList.get(0));
|
|
|
- task.setStatus(1);
|
|
|
+
|
|
|
+ //线程被唤醒后 ↓
|
|
|
+ if (taskQueueList.size() > 0) {
|
|
|
+ //从任务队列中取出第一个task任务,同时将其从任务队列中剔除
|
|
|
+ task = taskService.getById(taskQueueList.remove(0));
|
|
|
+ //判断任务状态,若已不存在或已暂停,则跳过继续取下一个任务
|
|
|
+ if (task == null || task.getStatus() == 4) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ //若是网站导入任务,则将网站导入相关信息存入task对象中(方便生产与消费时使用)
|
|
|
+ if (task.getType().equals(3) || task.getType().equals(4)) {
|
|
|
+ AssoOsTaskQrtzTask assoOsTaskQrtzTask = assoOsTaskQrtzTaskService.getById(task.getQrtzTaskId());
|
|
|
+ List<String> configCells = Arrays.asList(assoOsTaskQrtzTask.getConfigCells().split(","));
|
|
|
+ task.setConfigCellsNum(configCells.size()); //将下载字段数量存入task对象中(为了在后面发送进度时可以根据下载字段的数量来对应消费者数量,从而确定是否完成了一个专利的下载)
|
|
|
+ task.setConfigCells(configCells);
|
|
|
+ task.setOrderBy(assoOsTaskQrtzTask.getOrderBy());
|
|
|
+ task.setOrderByType(assoOsTaskQrtzTask.getOrderByType());
|
|
|
+ task.setDBType(assoOsTaskQrtzTask.getDBType());
|
|
|
+ task.setStartNumber(assoOsTaskQrtzTask.getStartNumber());
|
|
|
+ task.setEndTime(assoOsTaskQrtzTask.getEndNumber());
|
|
|
+ task.setIsAddPatentNos(assoOsTaskQrtzTask.getIsAddPatentNos());
|
|
|
+ task.setIsDeletePatentNos(assoOsTaskQrtzTask.getIsDeletePatentNos());
|
|
|
+ task.setConditions(assoOsTaskQrtzTask.getConditions());
|
|
|
+ }
|
|
|
+
|
|
|
+ //TODO 调用工厂方法,工厂方法会根据任务类型创建并返回对应的生产专利方法的对象
|
|
|
+ IExcutePatentData excutePatentDataObject = createObject(task);
|
|
|
+ if (excutePatentDataObject != null) {
|
|
|
+ //执行方法
|
|
|
+ excutePatentDataObject.startExcute(task);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ //任务表更新状态失败
|
|
|
+ task.setStatus(2);
|
|
|
+ task.setEndTime(DateUtils.getDateTime());
|
|
|
taskService.updateById(task);
|
|
|
- taskQueueList.remove(0);
|
|
|
+ }
|
|
|
|
|
|
- patentIdMap.put(0, task.getTotal());
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- //TODO 调用工厂方法,将任务传入,解析任务类型匹配对应的生产专利方法
|
|
|
- excuteTaskToPatentService.taskToPatentQueue(task);
|
|
|
+ /**
|
|
|
+ * 装载线程1:著录项目
|
|
|
+ */
|
|
|
+ public void setPatentZhuLu() {
|
|
|
+ while (true) {
|
|
|
+ try {
|
|
|
+ if (setPatentZhuluQueueList.size() > 0) {
|
|
|
+ PQueueData pQueueData = setPatentZhuluQueueList.remove(0);
|
|
|
+ Task task = pQueueData.getTask();
|
|
|
+ //专利之星
|
|
|
+ //if (task.getType() == 4) {
|
|
|
+ //excutePatentDataStar.setPatentZhuLu(pQueueData.getStarPatent(), pQueueData.getUploadParamsVO());
|
|
|
+ //}
|
|
|
+ ProjectImportPatentVO projectImportPatentVO = new ProjectImportPatentVO();
|
|
|
+ projectImportPatentVO.setProjectId(task.getProjectId());
|
|
|
+ QueueData queueData = new QueueData()
|
|
|
+ .setTask(task)
|
|
|
+ .setUploadParamsVO(pQueueData.getUploadParamsVO());
|
|
|
+ //装载完成,将其丢入著录消费者队列,并唤醒著录消费者线程
|
|
|
+ patentZhuluQueueList.add(queueData);
|
|
|
+ patentZhuluLock.lock();
|
|
|
+ patentZhuluCondition.signalAll();
|
|
|
+ patentZhuluLock.unlock();
|
|
|
+
|
|
|
+ } else {
|
|
|
+ setPatentZhuluLock.lock();
|
|
|
+ setPatentZhuluCondition.await();
|
|
|
+ setPatentZhuluLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
|
|
|
}
|
|
|
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- //任务表更新状态为失败
|
|
|
- task.setStatus(3);
|
|
|
- task.setEndTime(DateUtils.getDateTime());
|
|
|
- taskService.updateById(task);
|
|
|
}
|
|
|
- flag = true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 消费者1:将专利从队列取出,摘要附图入库
|
|
|
+ * 装载线程2:摘要附图
|
|
|
*/
|
|
|
- public void pushPatentImageToDB() throws InterruptedException, IOException {
|
|
|
+ public void setPatentImage() {
|
|
|
while (true) {
|
|
|
try {
|
|
|
- if (patentImageQueue.isEmpty()) {
|
|
|
- if (flag) {
|
|
|
- System.out.println("摘要附图全部完成,退出循环");
|
|
|
- return;
|
|
|
- } else {
|
|
|
- patentImageLock.lock();
|
|
|
- patentImageCondition.await();
|
|
|
- patentImageLock.unlock();
|
|
|
+ if (setPatentImageQueueList.size() > 0) {
|
|
|
+ PQueueData pQueueData = setPatentImageQueueList.remove(0);
|
|
|
+ Task task = pQueueData.getTask();
|
|
|
+ //专利之星
|
|
|
+ if (task.getType() == 4) {
|
|
|
+ excutePatentDataStar.setPatentPicture(pQueueData.getStarPatent(), pQueueData.getUploadParamsVO());
|
|
|
}
|
|
|
+ QueueData queueData = new QueueData()
|
|
|
+ .setTask(task)
|
|
|
+ .setUploadParamsVO(pQueueData.getUploadParamsVO());
|
|
|
+ //装载完成,将其丢入摘要附图消费者队列,并唤醒摘要附图消费者线程
|
|
|
+ patentImageQueueList.add(queueData);
|
|
|
+ patentImageLock.lock();
|
|
|
+ patentImageCondition.signalAll();
|
|
|
+ patentImageLock.unlock();
|
|
|
+
|
|
|
} else {
|
|
|
- QueueData queueData = patentImageQueue.remove();
|
|
|
- //摘要附图入库
|
|
|
- uploadPatentToDBService.uploadPatentImage(queueData.getUploadParamsVO());
|
|
|
- //Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
- sendMessage(queueData, patentIdMap.get(0), task);
|
|
|
+ setPatentImageLock.lock();
|
|
|
+ setPatentImageCondition.await();
|
|
|
+ setPatentImageLock.unlock();
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
@@ -117,30 +212,182 @@ public class PantentQueueService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 消费者2:将专利从队列取出,著录项目入库
|
|
|
+ * 装载线程3:权要
|
|
|
+ */
|
|
|
+ public void setPatentRight() {
|
|
|
+ while (true) {
|
|
|
+ try {
|
|
|
+ if (setPatentRightQueueList.size() > 0) {
|
|
|
+ PQueueData pQueueData = setPatentRightQueueList.remove(0);
|
|
|
+ Task task = pQueueData.getTask();
|
|
|
+ //专利之星
|
|
|
+ if (task.getType() == 4) {
|
|
|
+ excutePatentDataStar.setPatentClaim(pQueueData.getStarPatent(), pQueueData.getUploadParamsVO());
|
|
|
+ }
|
|
|
+ QueueData queueData = new QueueData()
|
|
|
+ .setTask(task)
|
|
|
+ .setUploadParamsVO(pQueueData.getUploadParamsVO());
|
|
|
+ //装载完成,将其丢入权要消费者队列,并唤醒权要消费者线程
|
|
|
+ patentRightQueueList.add(queueData);
|
|
|
+ patentRightLock.lock();
|
|
|
+ patentRightCondition.signalAll();
|
|
|
+ patentRightLock.unlock();
|
|
|
+
|
|
|
+ } else {
|
|
|
+ setPatentRightLock.lock();
|
|
|
+ setPatentRightCondition.await();
|
|
|
+ setPatentRightLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 装载线程4:说明书文本
|
|
|
+ */
|
|
|
+ public void setPatentInstructionText() {
|
|
|
+ while (true) {
|
|
|
+ try {
|
|
|
+ if (setPatentInstructionTextQueueList.size() > 0) {
|
|
|
+ PQueueData pQueueData = setPatentInstructionTextQueueList.remove(0);
|
|
|
+ Task task = pQueueData.getTask();
|
|
|
+ //专利之星
|
|
|
+ if (task.getType() == 4) {
|
|
|
+ excutePatentDataStar.setPatentInstructionText(pQueueData.getStarPatent(), pQueueData.getUploadParamsVO());
|
|
|
+ }
|
|
|
+ QueueData queueData = new QueueData()
|
|
|
+ .setTask(task)
|
|
|
+ .setUploadParamsVO(pQueueData.getUploadParamsVO());
|
|
|
+ //装载完成,将其丢入说明书文本消费者队列,并唤醒说明书文本消费者线程
|
|
|
+ patentInstructionTextQueueList.add(queueData);
|
|
|
+ patentInstructionTextLock.lock();
|
|
|
+ patentInstructionTextCondition.signalAll();
|
|
|
+ patentInstructionTextLock.unlock();
|
|
|
+
|
|
|
+ } else {
|
|
|
+ setPatentInstructionTextLock.lock();
|
|
|
+ setPatentInstructionTextCondition.await();
|
|
|
+ setPatentInstructionTextLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 装载线程5:说明书pdf
|
|
|
*/
|
|
|
- public void pushPatentZhuLuToDB() throws InterruptedException, IOException {
|
|
|
+ public void setPatentInstructionPDF() {
|
|
|
while (true) {
|
|
|
try {
|
|
|
- if (patentZhuluQueue.isEmpty()) {
|
|
|
- if (flag) {
|
|
|
- System.out.println("著录项目全部完成,退出循环");
|
|
|
- return;
|
|
|
+ if (setPatentInstructionPDFQueueList.size() > 0) {
|
|
|
+ PQueueData pQueueData = setPatentInstructionPDFQueueList.remove(0);
|
|
|
+ Task task = pQueueData.getTask();
|
|
|
+ //专利之星
|
|
|
+ if (task.getType() == 4) {
|
|
|
+ excutePatentDataStar.setPatentInstructionPDF(pQueueData.getStarPatent(), pQueueData.getUploadParamsVO());
|
|
|
+ }
|
|
|
+ QueueData queueData = new QueueData()
|
|
|
+ .setTask(task)
|
|
|
+ .setUploadParamsVO(pQueueData.getUploadParamsVO());
|
|
|
+ //装载完成,将其丢入说明书pdf消费者队列,并唤醒说明书pdf消费者线程
|
|
|
+ patentInstructionPDFQueueList.add(queueData);
|
|
|
+ patentInstructionPDFLock.lock();
|
|
|
+ patentInstructionPDFCondition.signalAll();
|
|
|
+ patentInstructionPDFLock.unlock();
|
|
|
+
|
|
|
+ } else {
|
|
|
+ setPatentInstructionPDFLock.lock();
|
|
|
+ setPatentInstructionPDFCondition.await();
|
|
|
+ setPatentInstructionPDFLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 消费者1:摘要附图入库
|
|
|
+ */
|
|
|
+ public void pushPatentImageToDB() {
|
|
|
+ while (true) {
|
|
|
+ QueueData queueData = new QueueData();
|
|
|
+ try {
|
|
|
+ if (patentImageQueueList.size() > 0) {
|
|
|
+ queueData = patentImageQueueList.remove(0);
|
|
|
+ UploadParamsVO uploadParamsVO = queueData.getUploadParamsVO();
|
|
|
+ //摘要附图入库(两种方式:1.Excel摘要附图方式 2.网站导入摘要附图方式)
|
|
|
+ if (queueData.getTask().getType().equals(1)) {
|
|
|
+ uploadPatentToDBService.uploadPatentImage(uploadParamsVO);
|
|
|
} else {
|
|
|
- patentZhuluLock.lock();
|
|
|
- patentZhuluCondition.await();
|
|
|
- patentZhuluLock.unlock();
|
|
|
+ uploadPatentToDBService.uploadPatentImage2(uploadParamsVO);
|
|
|
}
|
|
|
+ //Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
+ sendMessage(queueData);
|
|
|
} else {
|
|
|
- QueueData queueData = patentZhuluQueue.remove();
|
|
|
+ patentImageLock.lock();
|
|
|
+ patentImageCondition.await();
|
|
|
+ patentImageLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ sendMessage(queueData);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 消费者2:将专利从队列取出,著录项目入库
|
|
|
+ */
|
|
|
+ public void pushPatentZhuLuToDB() {
|
|
|
+ while (true) {
|
|
|
+ QueueData queueData = new QueueData();
|
|
|
+ try {
|
|
|
+ if (patentZhuluQueueList.size() > 0) {
|
|
|
+ queueData = patentZhuluQueueList.remove(0);
|
|
|
//著录项目入库
|
|
|
uploadPatentToDBService.uploadPatentZhulu(queueData.getUploadParamsVO());
|
|
|
+ //判断是与专题库关联还是与报告关联
|
|
|
+ if (queueData.getTask().getProjectId() != null && !queueData.getTask().getProjectId().equals(0)) {
|
|
|
+ //与专题库关联入库
|
|
|
+ uploadPatentToDBService.uploadAssoThemaPat(queueData.getUploadParamsVO(), queueData.getTask().getProjectId());
|
|
|
+ } else if (queueData.getTask().getReportId() != null && !queueData.getTask().getReportId().equals(0)) {
|
|
|
+ //与报告关联入库(调用报告系统接口)
|
|
|
+ outInterfaceService.importAssoReportPatentNo(queueData.getTask().getReportId(), queueData.getUploadParamsVO().getPatent().getPatentNo(), queueData.getUploadParamsVO().getPatent().getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ ProjectImportPatentVO projectImportPatentVO = JsonUtils.jsonToPojo(queueData.getTask().getPramJson(), ProjectImportPatentVO.class);
|
|
|
+ //自定义字段标引与专利关联入库
|
|
|
+ uploadPatentToDBService.uploadAssoFieldPat(queueData.getUploadParamsVO(), projectImportPatentVO);
|
|
|
+ //文件夹与专利关联入库
|
|
|
+ uploadPatentToDBService.uploadAssoPorPat(queueData.getUploadParamsVO(), projectImportPatentVO);
|
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
- sendMessage(queueData, patentIdMap.get(0), task);
|
|
|
+ sendMessage(queueData);
|
|
|
+ } else {
|
|
|
+ patentZhuluLock.lock();
|
|
|
+ patentZhuluCondition.await();
|
|
|
+ patentZhuluLock.unlock();
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
+ sendMessage(queueData);
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -149,28 +396,25 @@ public class PantentQueueService {
|
|
|
/**
|
|
|
* 消费者3:将专利从队列取出,权利要求文本入库
|
|
|
*/
|
|
|
- public void pushPatentRightToDB() throws InterruptedException, IOException {
|
|
|
+ public void pushPatentRightToDB() {
|
|
|
while (true) {
|
|
|
+ QueueData queueData = new QueueData();
|
|
|
try {
|
|
|
- if (patentRightQueue.isEmpty()) {
|
|
|
- if (flag) {
|
|
|
- System.out.println("权利要求全部完成,退出循环");
|
|
|
- return;
|
|
|
- } else {
|
|
|
- patentRightLock.lock();
|
|
|
- patentRightCondition.await();
|
|
|
- patentRightLock.unlock();
|
|
|
- }
|
|
|
- } else {
|
|
|
- QueueData queueData = patentRightQueue.remove();
|
|
|
+ if (patentRightQueueList.size() > 0) {
|
|
|
+ queueData = patentRightQueueList.remove(0);
|
|
|
//权要文本入库
|
|
|
uploadPatentToDBService.uploadPatentRight(queueData.getUploadParamsVO());
|
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
- sendMessage(queueData, patentIdMap.get(0), task);
|
|
|
+ sendMessage(queueData);
|
|
|
+ } else {
|
|
|
+ patentRightLock.lock();
|
|
|
+ patentRightCondition.await();
|
|
|
+ patentRightLock.unlock();
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
+ sendMessage(queueData);
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -179,138 +423,260 @@ public class PantentQueueService {
|
|
|
/**
|
|
|
* 消费者4:将专利从队列取出,说明书文本入库
|
|
|
*/
|
|
|
- public void pushPatentInstructionTextToDB() throws InterruptedException, IOException {
|
|
|
+ public void pushPatentInstructionTextToDB() {
|
|
|
while (true) {
|
|
|
+ QueueData queueData = new QueueData();
|
|
|
try {
|
|
|
- if (patentInstructionTextQueue.isEmpty()) {
|
|
|
- if (flag) {
|
|
|
- System.out.println("说明书文本全部完成,退出循环");
|
|
|
- return;
|
|
|
- } else {
|
|
|
- patentInstructionTextLock.lock();
|
|
|
- patentInstructionTextCondition.await();
|
|
|
- patentInstructionTextLock.unlock();
|
|
|
- }
|
|
|
- } else {
|
|
|
- QueueData queueData = patentInstructionTextQueue.remove();
|
|
|
+ if (patentInstructionTextQueueList.size() > 0) {
|
|
|
+ queueData = patentInstructionTextQueueList.remove(0);
|
|
|
//说明书文本入库
|
|
|
uploadPatentToDBService.uploadPatentInstructionText(queueData.getUploadParamsVO());
|
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
- sendMessage(queueData, patentIdMap.get(0), task);
|
|
|
+ sendMessage(queueData);
|
|
|
+ } else {
|
|
|
+ patentInstructionTextLock.lock();
|
|
|
+ patentInstructionTextCondition.await();
|
|
|
+ patentInstructionTextLock.unlock();
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
+ sendMessage(queueData);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 消费者5:将专利从队列取出,与专利关联数据入库
|
|
|
+ * 消费者5:将专利从队列取出,说明书pdf地址入库
|
|
|
*/
|
|
|
- public void pushPatentAssoToDB() throws InterruptedException, IOException {
|
|
|
+ public void pushPatentInstructionPDFToDB() {
|
|
|
while (true) {
|
|
|
+ QueueData queueData = new QueueData();
|
|
|
try {
|
|
|
- if (patentAssoQueue.isEmpty()) {
|
|
|
- if (flag) {
|
|
|
- System.out.println("与专利关联的数据全部完成,退出循环");
|
|
|
- return;
|
|
|
- } else {
|
|
|
- patentAssoLock.lock();
|
|
|
- patentAssoCondition.await();
|
|
|
- patentAssoLock.unlock();
|
|
|
- }
|
|
|
- } else {
|
|
|
- QueueData queueData = patentAssoQueue.remove();
|
|
|
- //专题库与专利关联入库
|
|
|
- uploadPatentToDBService.uploadAssoThemaPat(queueData.getUploadParamsVO(), queueData.getProjectImportPatentVO());
|
|
|
- //自定义字段标引与专利关联入库
|
|
|
- uploadPatentToDBService.uploadAssoFieldPat(queueData.getUploadParamsVO(), queueData.getProjectImportPatentVO());
|
|
|
- //文件夹与专利关联入库
|
|
|
- uploadPatentToDBService.uploadAssoPorPat(queueData.getUploadParamsVO(), queueData.getProjectImportPatentVO());
|
|
|
+ if (patentInstructionPDFQueueList.size() > 0) {
|
|
|
+ queueData = patentInstructionPDFQueueList.remove(0);
|
|
|
+ //说明书pdf入库
|
|
|
+ patentInstructionService.edit(queueData.getUploadParamsVO().getPatent().getPatentNo(), queueData.getUploadParamsVO().getFileDTO());
|
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
- sendMessage(queueData, patentIdMap.get(0), task);
|
|
|
+ sendMessage(queueData);
|
|
|
+ } else {
|
|
|
+ patentInstructionPDFLock.lock();
|
|
|
+ patentInstructionPDFCondition.await();
|
|
|
+ patentInstructionPDFLock.unlock();
|
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
+ sendMessage(queueData);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void sendMessage(QueueData queueData, Integer total, Task task) {
|
|
|
- //每完成一个专利,通过计算,发送进度
|
|
|
+ /**
|
|
|
+ * 当一个消费者消费完其负责的专利部分,修改成功条数,计算发送进度
|
|
|
+ *
|
|
|
+ * @param queueData 任务专利队列对象
|
|
|
+ */
|
|
|
+ public void sendMessage(QueueData queueData) {
|
|
|
+ //每完成一个专利(根据计算该任务该专利的所有消费者都完成时),发送进度
|
|
|
synchronized ("此为同步锁") {
|
|
|
- Integer currentPatentId = queueData.getUploadParamsVO().getPatent().getId();
|
|
|
- Integer num = patentIdMap.get(currentPatentId);
|
|
|
+ //当前进行的任务
|
|
|
+ Task task = queueData.getTask();
|
|
|
+ //当前进行的任务的专利总数量
|
|
|
+ Integer total = task.getTotal();
|
|
|
+
|
|
|
+ //将任务id + "|" + 专利id,拼接成专利的标识(作为当前某一个消费者消费完的这个专利的数量标识)
|
|
|
+ String currentPatent = task.getId() + "|" + queueData.getUploadParamsVO().getPatent().getId();
|
|
|
+ Integer num = patentIdMap.get(currentPatent);
|
|
|
+ int needNum = 4; //临界默认设为4(即Excel导入任务默认使用5个消费者)
|
|
|
+ if (task.getType().equals(3) || task.getType().equals(4)) { //若是网站导入任务,则临界默认设为下载字段类型数量 - 1
|
|
|
+ needNum = task.getConfigCellsNum() - 1;
|
|
|
+ }
|
|
|
if (num == null) {
|
|
|
- patentIdMap.put(currentPatentId, 1);
|
|
|
- } else if (num < 4) {
|
|
|
- patentIdMap.put(currentPatentId, ++num);
|
|
|
+ patentIdMap.put(currentPatent, 1);
|
|
|
+ } else if (num < needNum) {
|
|
|
+ patentIdMap.put(currentPatent, ++num);
|
|
|
} else {
|
|
|
- //num达到3了就从patentIdMap中删除
|
|
|
- patentIdMap.remove(currentPatentId);
|
|
|
- patentFinishNum++;
|
|
|
- long percentage = Math.round((patentFinishNum + 1D) / total * 100D);
|
|
|
+ /*
|
|
|
+ 1)若是看当前任务,表示当前这个任务这个专利的4个消费者全都消费结束,即当前这个任务的这个专利已完成
|
|
|
+ 2)若是看下一个任务,表示下一个任务的著录项目消费者终于第一次进来了(即表示上一个任务最慢的著录项目消费者也结束了即上一个任务完成了),就将这下一个任务的状态改为 1进行中
|
|
|
+ */
|
|
|
+ if (task.getStatus() == 0) {
|
|
|
+ task.setStatus(1);
|
|
|
+ task.setStartTime(DateUtils.getDateTime());
|
|
|
+ taskService.updateById(task);
|
|
|
+ }
|
|
|
+ patentIdMap.remove(currentPatent);
|
|
|
+ long percentage = Math.round((task.getSuccessNum() + 1D) / total * 100D);
|
|
|
+ //任务表更新数据(这里只更新成功条数和失败条数,注意不能更新状态等其他信息)
|
|
|
+ task.setSuccessNum(task.getSuccessNum() + 1);
|
|
|
+ task.setDefaultNum(total - task.getSuccessNum());
|
|
|
+ Task updateTask = new Task();
|
|
|
+ updateTask.setId(task.getId());
|
|
|
+ updateTask.setSuccessNum(task.getSuccessNum());
|
|
|
+ updateTask.setDefaultNum(total - task.getSuccessNum());
|
|
|
+ taskService.updateById(updateTask);
|
|
|
+
|
|
|
//当全部完成时
|
|
|
- if (patentFinishNum.equals(total)) {
|
|
|
+ if (task.getSuccessNum().equals(total)) {
|
|
|
percentage = 100L;
|
|
|
- //任务表更新状态为成功
|
|
|
+ //设置任务状态为成功
|
|
|
task.setStatus(2);
|
|
|
+ //设置任务结束时间为当前时间
|
|
|
+ task.setEndTime(DateUtils.getDateTime());
|
|
|
taskService.updateById(task);
|
|
|
}
|
|
|
- messageService.sendWebsocketMessage(task, total, patentFinishNum, percentage);
|
|
|
- //任务表更新数据
|
|
|
- task.setSuccessNum(patentFinishNum);
|
|
|
- task.setDefaultNum(total - task.getSuccessNum());
|
|
|
- taskService.updateById(task);
|
|
|
+
|
|
|
+ messageService.sendWebsocketMessage(task, total, task.getSuccessNum(), percentage);
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void patentToQueue(UploadParamsVO uploadParamsVO, ProjectImportPatentVO projectImportPatentVO) {
|
|
|
+ /**
|
|
|
+ * 数据丢入摘要附图生产队列并唤醒装载摘要附图线程
|
|
|
+ *
|
|
|
+ * @param pQueueData 装载生产队列实体类
|
|
|
+ */
|
|
|
+ public void imageToPQueue(PQueueData pQueueData) {
|
|
|
+ setPatentImageQueueList.add(pQueueData);
|
|
|
+ setPatentImageLock.lock();
|
|
|
+ setPatentImageCondition.signalAll();
|
|
|
+ setPatentImageLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 数据丢入著录项目生产队列并唤醒装载著录项目线程
|
|
|
+ *
|
|
|
+ * @param pQueueData 装载生产队列实体类
|
|
|
+ */
|
|
|
+ public void zhuluToPQueue(PQueueData pQueueData) {
|
|
|
+ setPatentZhuluQueueList.add(pQueueData);
|
|
|
+ setPatentZhuluLock.lock();
|
|
|
+ setPatentZhuluCondition.signalAll();
|
|
|
+ setPatentZhuluLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 数据丢入权要生产队列并唤醒装载权要线程
|
|
|
+ *
|
|
|
+ * @param pQueueData 装载生产队列实体类
|
|
|
+ */
|
|
|
+ public void rightToPQueue(PQueueData pQueueData) {
|
|
|
+ setPatentRightQueueList.add(pQueueData);
|
|
|
+ setPatentRightLock.lock();
|
|
|
+ setPatentRightCondition.signalAll();
|
|
|
+ setPatentRightLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 数据丢入说明书文本生产队列并唤醒装载说明书文本线程
|
|
|
+ *
|
|
|
+ * @param pQueueData 装载生产队列实体类
|
|
|
+ */
|
|
|
+ public void instructionTextToPQueue(PQueueData pQueueData) {
|
|
|
+ setPatentInstructionTextQueueList.add(pQueueData);
|
|
|
+ setPatentInstructionTextLock.lock();
|
|
|
+ setPatentInstructionTextCondition.signalAll();
|
|
|
+ setPatentInstructionTextLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 数据丢入说明书pdf生产队列并唤醒装载说明书pdf线程
|
|
|
+ *
|
|
|
+ * @param pQueueData 装载生产队列实体类
|
|
|
+ */
|
|
|
+ public void instructionPDFToPQueue(PQueueData pQueueData) {
|
|
|
+ setPatentInstructionPDFQueueList.add(pQueueData);
|
|
|
+ setPatentInstructionPDFLock.lock();
|
|
|
+ setPatentInstructionPDFCondition.signalAll();
|
|
|
+ setPatentInstructionPDFLock.unlock();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 专利丢入5个消费者队列,并唤醒5个消费者线程
|
|
|
+ *
|
|
|
+ * @param task 任务对象
|
|
|
+ * @param uploadParamsVO 专利实体类对象
|
|
|
+ */
|
|
|
+ public void patentToQueue(Task task, UploadParamsVO uploadParamsVO) {
|
|
|
//保存专利基础数据(专利表"os_patent")
|
|
|
uploadPatentBatchService.getOneOrInsertOne(uploadParamsVO);
|
|
|
|
|
|
- //专利分别加入5个消费者队列
|
|
|
+
|
|
|
QueueData queueData = new QueueData()
|
|
|
- .setUploadParamsVO(uploadParamsVO)
|
|
|
- .setProjectImportPatentVO(projectImportPatentVO);
|
|
|
- patentImageQueue.add(queueData);
|
|
|
- patentZhuluQueue.add(queueData);
|
|
|
- patentRightQueue.add(queueData);
|
|
|
- patentInstructionTextQueue.add(queueData);
|
|
|
- patentAssoQueue.add(queueData);
|
|
|
-
|
|
|
- //通知消费者线程(5个消费者:摘要附图、著录项目、权利要求文本、说明书文本、与专利关联数据)
|
|
|
- //消费者1摘要附图
|
|
|
+ .setTask(task)
|
|
|
+ .setUploadParamsVO(uploadParamsVO);
|
|
|
+
|
|
|
+ //专利分别加入5个消费者队列
|
|
|
+ patentImageQueueList.add(queueData);
|
|
|
+ patentZhuluQueueList.add(queueData);
|
|
|
+ patentRightQueueList.add(queueData);
|
|
|
+ patentInstructionTextQueueList.add(queueData);
|
|
|
+ patentInstructionPDFQueueList.add(queueData);
|
|
|
+
|
|
|
+ //通知消费者线程(5个消费者:摘要附图、著录项目、权利要求文本、说明书文本、说明书pdf)
|
|
|
+ //1.摘要附图
|
|
|
patentImageLock.lock();
|
|
|
patentImageCondition.signalAll();
|
|
|
patentImageLock.unlock();
|
|
|
- //消费者2著录项目
|
|
|
+ //2.著录项目
|
|
|
patentZhuluLock.lock();
|
|
|
patentZhuluCondition.signalAll();
|
|
|
patentZhuluLock.unlock();
|
|
|
- //消费者3权利要求文本
|
|
|
+ //3.权利要求文本
|
|
|
patentRightLock.lock();
|
|
|
patentRightCondition.signalAll();
|
|
|
patentRightLock.unlock();
|
|
|
- //消费者4说明书文本
|
|
|
+ //4.说明书文本
|
|
|
patentInstructionTextLock.lock();
|
|
|
patentInstructionTextCondition.signalAll();
|
|
|
patentInstructionTextLock.unlock();
|
|
|
- //消费者5与专利关联数据
|
|
|
- patentAssoLock.lock();
|
|
|
- patentAssoCondition.signalAll();
|
|
|
- patentAssoLock.unlock();
|
|
|
+ //5.说明书pdf
|
|
|
+ patentInstructionPDFLock.lock();
|
|
|
+ patentInstructionPDFCondition.signalAll();
|
|
|
+ patentInstructionPDFLock.unlock();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- public void queueAddTask(List<Integer> taskQueueList) {
|
|
|
+ /**
|
|
|
+ * 生产者任务队列新增任务ids
|
|
|
+ *
|
|
|
+ * @param taskQueueList 生产者任务队列
|
|
|
+ */
|
|
|
+ public void taskQueueAddTask(List<Integer> taskQueueList) {
|
|
|
this.taskQueueList.addAll(taskQueueList);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 消费者专利队列剔除指定任务的所有专利
|
|
|
+ *
|
|
|
+ * @param taskId 任务id
|
|
|
+ */
|
|
|
+ public void consumerQueueDeleteTasks(Integer taskId) {
|
|
|
+ //任务暂停时清除4个消费者专利队列中该任务的专利
|
|
|
+ this.patentImageQueueList.removeIf(queueData -> queueData.getTask().getId().equals(taskId));
|
|
|
+ this.patentZhuluQueueList.removeIf(queueData -> queueData.getTask().getId().equals(taskId));
|
|
|
+ this.patentRightQueueList.removeIf(queueData -> queueData.getTask().getId().equals(taskId));
|
|
|
+ this.patentInstructionTextQueueList.removeIf(queueData -> queueData.getTask().getId().equals(taskId));
|
|
|
+ this.patentInstructionPDFQueueList.removeIf(queueData -> queueData.getTask().getId().equals(taskId));
|
|
|
+ //任务暂停时清除 patentIdMap(任务id + "|" + 专利id,拼接而成的专利的数量标识(作为当前某一个消费者消费完的这个专利的数量标识))中该任务的专利的数量标识
|
|
|
+ Iterator<String> iterator = this.patentIdMap.keySet().iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ String key = iterator.next();
|
|
|
+ if (key.contains(taskId + "")) {
|
|
|
+ iterator.remove();
|
|
|
+ this.patentIdMap.remove(key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 唤醒生产者线程
|
|
|
+ */
|
|
|
public void awakeTasktch() {
|
|
|
taskLock.lock();
|
|
|
taskCondition.signalAll();
|
|
@@ -318,4 +684,26 @@ public class PantentQueueService {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 工厂方法,根据任务类型返回对应的生产专利数据的对象
|
|
|
+ *
|
|
|
+ * @param task 任务
|
|
|
+ * @return 返回获取专利数据的对象
|
|
|
+ */
|
|
|
+ private IExcutePatentData createObject(Task task) {
|
|
|
+ //根据任务的类型创建并返回对应的解析获取专利数据的对象
|
|
|
+ switch (task.getType()) {
|
|
|
+ case 1: //Excel导入专利
|
|
|
+ return excutePatentDataExcel;
|
|
|
+ case 3: //欧专局网站导入
|
|
|
+ return excutePatentDataEpo;
|
|
|
+ case 4: //专利之星网站导入
|
|
|
+ return excutePatentDataStar;
|
|
|
+ default:
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|