|
@@ -3,6 +3,7 @@ package cn.cslg.pas.service.upLoadPatent;
|
|
import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
|
|
import cn.cslg.pas.common.model.vo.ProjectImportPatentVO;
|
|
import cn.cslg.pas.common.model.vo.UploadParamsVO;
|
|
import cn.cslg.pas.common.model.vo.UploadParamsVO;
|
|
import cn.cslg.pas.common.model.vo.UploadSettingVO;
|
|
import cn.cslg.pas.common.model.vo.UploadSettingVO;
|
|
|
|
+import cn.cslg.pas.common.utils.DateUtils;
|
|
import cn.cslg.pas.common.utils.FileUtils;
|
|
import cn.cslg.pas.common.utils.FileUtils;
|
|
import cn.cslg.pas.common.utils.JsonUtils;
|
|
import cn.cslg.pas.common.utils.JsonUtils;
|
|
import cn.cslg.pas.common.utils.ReadExcelUtils;
|
|
import cn.cslg.pas.common.utils.ReadExcelUtils;
|
|
@@ -35,24 +36,32 @@ public class PantentQueueService {
|
|
private final FileUtils fileUtils;
|
|
private final FileUtils fileUtils;
|
|
private final MessageService messageService;
|
|
private final MessageService messageService;
|
|
private final TaskService taskService;
|
|
private final TaskService taskService;
|
|
- private Queue<QueueData> patentImageZhuluQueue = new LinkedList<>();
|
|
|
|
- private Queue<QueueData> patentRightInstructionTextQueue = new LinkedList<>();
|
|
|
|
|
|
+ private Queue<QueueData> patentImageQueue = new LinkedList<>();
|
|
|
|
+ private Queue<QueueData> patentZhuluQueue = new LinkedList<>();
|
|
|
|
+ private Queue<QueueData> patentRightQueue = new LinkedList<>();
|
|
|
|
+ private Queue<QueueData> patentInstructionTextQueue = new LinkedList<>();
|
|
private Queue<QueueData> patentAssoQueue = new LinkedList<>();
|
|
private Queue<QueueData> patentAssoQueue = new LinkedList<>();
|
|
private List<Integer> taskQueueList = new ArrayList<>();
|
|
private List<Integer> taskQueueList = new ArrayList<>();
|
|
private Boolean flag = false;
|
|
private Boolean flag = false;
|
|
private Lock taskLock = new ReentrantLock();
|
|
private Lock taskLock = new ReentrantLock();
|
|
- private Lock patentImageZhuluLock = new ReentrantLock();
|
|
|
|
- private Lock patentRightInstructionTextLock = new ReentrantLock();
|
|
|
|
|
|
+ private Lock patentImageLock = new ReentrantLock();
|
|
|
|
+ private Lock patentZhuluLock = new ReentrantLock();
|
|
|
|
+ private Lock patentRightLock = new ReentrantLock();
|
|
|
|
+ private Lock patentInstructionTextLock = new ReentrantLock();
|
|
private Lock patentAssoLock = new ReentrantLock();
|
|
private Lock patentAssoLock = new ReentrantLock();
|
|
Condition taskCondition = taskLock.newCondition();
|
|
Condition taskCondition = taskLock.newCondition();
|
|
- private Condition patentImageZhuluCondition = patentImageZhuluLock.newCondition();
|
|
|
|
- private Condition patentRightInstructionTextCondition = patentRightInstructionTextLock.newCondition();
|
|
|
|
|
|
+ private Condition patentImageCondition = patentImageLock.newCondition();
|
|
|
|
+ private Condition patentZhuluCondition = patentZhuluLock.newCondition();
|
|
|
|
+ private Condition patentRightCondition = patentRightLock.newCondition();
|
|
|
|
+ private Condition patentInstructionTextCondition = patentInstructionTextLock.newCondition();
|
|
private Condition patentAssoCondition = patentAssoLock.newCondition();
|
|
private Condition patentAssoCondition = patentAssoLock.newCondition();
|
|
private HashMap<Integer, Integer> patentIdMap = new HashMap<>();
|
|
private HashMap<Integer, Integer> patentIdMap = new HashMap<>();
|
|
private Task task = null;
|
|
private Task task = null;
|
|
private Integer patentFinishNum = 0;
|
|
private Integer patentFinishNum = 0;
|
|
|
|
|
|
- //将专利信息存入队列
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 生产者:从任务队列取出任务解析成专利实体类,分配给三个消费者队列
|
|
|
|
+ */
|
|
public void addPatnetToQueue() {
|
|
public void addPatnetToQueue() {
|
|
try {
|
|
try {
|
|
while (true) {
|
|
while (true) {
|
|
@@ -61,10 +70,13 @@ public class PantentQueueService {
|
|
taskLock.lock();
|
|
taskLock.lock();
|
|
taskCondition.await();
|
|
taskCondition.await();
|
|
}
|
|
}
|
|
- //1.从taskQueueList中取出第一个task,并将其从taskQueueList中删除
|
|
|
|
|
|
+ //1.从taskQueueList中取出第一个task,将其状态改为进行中,并将其从任务队列taskQueueList中删除
|
|
task = taskService.getById(taskQueueList.get(0));
|
|
task = taskService.getById(taskQueueList.get(0));
|
|
|
|
+ task.setStatus(1);
|
|
|
|
+ taskService.updateById(task);
|
|
taskQueueList.remove(0);
|
|
taskQueueList.remove(0);
|
|
- //从任务数据中取出文件路径、总条数、成功条数、前台参数json
|
|
|
|
|
|
+
|
|
|
|
+ //从任务中取出文件路径、总条数、成功条数、前台参数json
|
|
String filePath = task.getUrl(); //相对路径
|
|
String filePath = task.getUrl(); //相对路径
|
|
filePath = fileUtils.getPath(filePath); //绝对路径
|
|
filePath = fileUtils.getPath(filePath); //绝对路径
|
|
Integer total = task.getTotal();
|
|
Integer total = task.getTotal();
|
|
@@ -84,118 +96,182 @@ public class PantentQueueService {
|
|
UploadParamsVO uploadParamsVO = excuteDataToVOService.fileToPatentVO(patentData, jsonData);
|
|
UploadParamsVO uploadParamsVO = excuteDataToVOService.fileToPatentVO(patentData, jsonData);
|
|
//保存专利基础数据(专利表"os_patent")
|
|
//保存专利基础数据(专利表"os_patent")
|
|
uploadPatentBatchService.getOneOrInsertOne(uploadParamsVO);
|
|
uploadPatentBatchService.getOneOrInsertOne(uploadParamsVO);
|
|
- //专利分别加入三个消费者队列
|
|
|
|
|
|
+
|
|
|
|
+ //专利分别加入5个消费者队列
|
|
QueueData queueData = new QueueData()
|
|
QueueData queueData = new QueueData()
|
|
.setUploadParamsVO(uploadParamsVO)
|
|
.setUploadParamsVO(uploadParamsVO)
|
|
.setProjectImportPatentVO(projectImportPatentVO);
|
|
.setProjectImportPatentVO(projectImportPatentVO);
|
|
- patentImageZhuluQueue.add(queueData);
|
|
|
|
- patentRightInstructionTextQueue.add(queueData);
|
|
|
|
|
|
+ patentImageQueue.add(queueData);
|
|
|
|
+ patentZhuluQueue.add(queueData);
|
|
|
|
+ patentRightQueue.add(queueData);
|
|
|
|
+ patentInstructionTextQueue.add(queueData);
|
|
patentAssoQueue.add(queueData);
|
|
patentAssoQueue.add(queueData);
|
|
- //通知消费者线程(三个消费者:保存摘要附图和著录、保存说明书和权要、保存专题库关联专利数据)
|
|
|
|
- //保存摘要附图和著录消费者
|
|
|
|
- //patentImageZhuluLatch.countDown();
|
|
|
|
- patentImageZhuluLock.lock();
|
|
|
|
- patentImageZhuluCondition.signalAll();
|
|
|
|
- patentImageZhuluLock.unlock();
|
|
|
|
- //保存说明书和权要消费者
|
|
|
|
- //patentRightInstructionTextLatch.countDown();
|
|
|
|
- patentRightInstructionTextLock.lock();
|
|
|
|
- patentRightInstructionTextCondition.signalAll();
|
|
|
|
- patentRightInstructionTextLock.unlock();
|
|
|
|
- //保存专题库关联专利数据消费者
|
|
|
|
- //patentAssoLatch.countDown();
|
|
|
|
|
|
+
|
|
|
|
+ //通知消费者线程(5个消费者:摘要附图、著录项目、权利要求文本、说明书文本、与专利关联数据)
|
|
|
|
+ //消费者1摘要附图
|
|
|
|
+ patentImageLock.lock();
|
|
|
|
+ patentImageCondition.signalAll();
|
|
|
|
+ patentImageLock.unlock();
|
|
|
|
+ //消费者2著录项目
|
|
|
|
+ patentZhuluLock.lock();
|
|
|
|
+ patentZhuluCondition.signalAll();
|
|
|
|
+ patentZhuluLock.unlock();
|
|
|
|
+ //消费者3权利要求文本
|
|
|
|
+ patentRightLock.lock();
|
|
|
|
+ patentRightCondition.signalAll();
|
|
|
|
+ patentRightLock.unlock();
|
|
|
|
+ //消费者4说明书文本
|
|
|
|
+ patentInstructionTextLock.lock();
|
|
|
|
+ patentInstructionTextCondition.signalAll();
|
|
|
|
+ patentInstructionTextLock.unlock();
|
|
|
|
+ //消费者5与专利关联数据
|
|
patentAssoLock.lock();
|
|
patentAssoLock.lock();
|
|
patentAssoCondition.signalAll();
|
|
patentAssoCondition.signalAll();
|
|
patentAssoLock.unlock();
|
|
patentAssoLock.unlock();
|
|
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- //任务表更新数据
|
|
|
|
- task.setStatus(2);
|
|
|
|
- taskService.updateById(task);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
- //修改任务状态为失败
|
|
|
|
|
|
+ //任务表更新状态为失败
|
|
task.setStatus(3);
|
|
task.setStatus(3);
|
|
|
|
+ task.setEndTime(DateUtils.getDateTime());
|
|
taskService.updateById(task);
|
|
taskService.updateById(task);
|
|
- } finally {
|
|
|
|
}
|
|
}
|
|
flag = true;
|
|
flag = true;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 将专利信息从队列取出,摘要附图和著录项目入库
|
|
|
|
|
|
+ * 消费者1:将专利从队列取出,摘要附图入库
|
|
*/
|
|
*/
|
|
- public void pushPatentImageZhuluToDB() throws InterruptedException, IOException {
|
|
|
|
- try {
|
|
|
|
- while (true) {
|
|
|
|
- if (patentImageZhuluQueue.isEmpty()) {
|
|
|
|
|
|
+ public void pushPatentImageToDB() throws InterruptedException, IOException {
|
|
|
|
+ while (true) {
|
|
|
|
+ try {
|
|
|
|
+ if (patentImageQueue.isEmpty()) {
|
|
if (flag) {
|
|
if (flag) {
|
|
- System.out.println("所有专利的摘要附图和著录项目全部完成,退出循环");
|
|
|
|
|
|
+ System.out.println("摘要附图全部完成,退出循环");
|
|
return;
|
|
return;
|
|
} else {
|
|
} else {
|
|
- patentImageZhuluLock.lock();
|
|
|
|
- patentImageZhuluCondition.await();
|
|
|
|
- patentImageZhuluLock.unlock();
|
|
|
|
|
|
+ patentImageLock.lock();
|
|
|
|
+ patentImageCondition.await();
|
|
|
|
+ patentImageLock.unlock();
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- QueueData queueData = patentImageZhuluQueue.remove();
|
|
|
|
|
|
+ QueueData queueData = patentImageQueue.remove();
|
|
//摘要附图入库
|
|
//摘要附图入库
|
|
uploadPatentToDBService.uploadPatentImage(queueData.getUploadParamsVO());
|
|
uploadPatentToDBService.uploadPatentImage(queueData.getUploadParamsVO());
|
|
|
|
+ //Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
|
+ sendMessage(queueData, patentIdMap.get(0), task);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 消费者2:将专利从队列取出,著录项目入库
|
|
|
|
+ */
|
|
|
|
+ public void pushPatentZhuLuToDB() throws InterruptedException, IOException {
|
|
|
|
+ while (true) {
|
|
|
|
+ try {
|
|
|
|
+ if (patentZhuluQueue.isEmpty()) {
|
|
|
|
+ if (flag) {
|
|
|
|
+ System.out.println("著录项目全部完成,退出循环");
|
|
|
|
+ return;
|
|
|
|
+ } else {
|
|
|
|
+ patentZhuluLock.lock();
|
|
|
|
+ patentZhuluCondition.await();
|
|
|
|
+ patentZhuluLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ QueueData queueData = patentZhuluQueue.remove();
|
|
//著录项目入库
|
|
//著录项目入库
|
|
uploadPatentToDBService.uploadPatentZhulu(queueData.getUploadParamsVO());
|
|
uploadPatentToDBService.uploadPatentZhulu(queueData.getUploadParamsVO());
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
sendMessage(queueData, patentIdMap.get(0), task);
|
|
sendMessage(queueData, patentIdMap.get(0), task);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
- } finally {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 将专利信息从队列取出,说明书和权要入库
|
|
|
|
|
|
+ * 消费者3:将专利从队列取出,权利要求文本入库
|
|
*/
|
|
*/
|
|
- public void pushPatentRightInstructionTextToDB() throws InterruptedException, IOException {
|
|
|
|
- try {
|
|
|
|
- while (true) {
|
|
|
|
- if (patentRightInstructionTextQueue.isEmpty()) {
|
|
|
|
|
|
+ public void pushPatentRightToDB() throws InterruptedException, IOException {
|
|
|
|
+ while (true) {
|
|
|
|
+ try {
|
|
|
|
+ if (patentRightQueue.isEmpty()) {
|
|
if (flag) {
|
|
if (flag) {
|
|
- System.out.println("所有专利的说明书和权要全部完成,退出循环");
|
|
|
|
|
|
+ System.out.println("权利要求全部完成,退出循环");
|
|
return;
|
|
return;
|
|
} else {
|
|
} else {
|
|
- patentRightInstructionTextLock.lock();
|
|
|
|
- patentRightInstructionTextCondition.await();
|
|
|
|
- patentRightInstructionTextLock.unlock();
|
|
|
|
|
|
+ patentRightLock.lock();
|
|
|
|
+ patentRightCondition.await();
|
|
|
|
+ patentRightLock.unlock();
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- QueueData queueData = patentRightInstructionTextQueue.remove();
|
|
|
|
- //说明书入库
|
|
|
|
- uploadPatentToDBService.uploadPatentInstructionText(queueData.getUploadParamsVO());
|
|
|
|
- //权要入库
|
|
|
|
|
|
+ QueueData queueData = patentRightQueue.remove();
|
|
|
|
+ //权要文本入库
|
|
uploadPatentToDBService.uploadPatentRight(queueData.getUploadParamsVO());
|
|
uploadPatentToDBService.uploadPatentRight(queueData.getUploadParamsVO());
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
sendMessage(queueData, patentIdMap.get(0), task);
|
|
sendMessage(queueData, patentIdMap.get(0), task);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
- } finally {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 将专利信息从队列取出,与专利关联的数据入库
|
|
|
|
|
|
+ * 消费者4:将专利从队列取出,说明书文本入库
|
|
|
|
+ */
|
|
|
|
+ public void pushPatentInstructionTextToDB() throws InterruptedException, IOException {
|
|
|
|
+ while (true) {
|
|
|
|
+ try {
|
|
|
|
+ if (patentInstructionTextQueue.isEmpty()) {
|
|
|
|
+ if (flag) {
|
|
|
|
+ System.out.println("说明书文本全部完成,退出循环");
|
|
|
|
+ return;
|
|
|
|
+ } else {
|
|
|
|
+ patentInstructionTextLock.lock();
|
|
|
|
+ patentInstructionTextCondition.await();
|
|
|
|
+ patentInstructionTextLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ QueueData queueData = patentInstructionTextQueue.remove();
|
|
|
|
+ //说明书文本入库
|
|
|
|
+ uploadPatentToDBService.uploadPatentInstructionText(queueData.getUploadParamsVO());
|
|
|
|
+ //Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
|
|
+ sendMessage(queueData, patentIdMap.get(0), task);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 消费者5:将专利从队列取出,与专利关联数据入库
|
|
*/
|
|
*/
|
|
public void pushPatentAssoToDB() throws InterruptedException, IOException {
|
|
public void pushPatentAssoToDB() throws InterruptedException, IOException {
|
|
- try {
|
|
|
|
- while (true) {
|
|
|
|
|
|
+ while (true) {
|
|
|
|
+ try {
|
|
if (patentAssoQueue.isEmpty()) {
|
|
if (patentAssoQueue.isEmpty()) {
|
|
if (flag) {
|
|
if (flag) {
|
|
- System.out.println("所有专利的与专利关联的数据全部完成,退出循环");
|
|
|
|
|
|
+ System.out.println("与专利关联的数据全部完成,退出循环");
|
|
return;
|
|
return;
|
|
} else {
|
|
} else {
|
|
patentAssoLock.lock();
|
|
patentAssoLock.lock();
|
|
@@ -213,35 +289,40 @@ public class PantentQueueService {
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
//Websocket发送message:通过WebSocket 在每一次循环结束后 向前端发送完成进度
|
|
sendMessage(queueData, patentIdMap.get(0), task);
|
|
sendMessage(queueData, patentIdMap.get(0), task);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
- } finally {
|
|
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public void sendMessage(QueueData queueData, Integer total, Task task) {
|
|
public void sendMessage(QueueData queueData, Integer total, Task task) {
|
|
//每完成一个专利,通过计算,发送进度
|
|
//每完成一个专利,通过计算,发送进度
|
|
- synchronized ("啊啊啊") {
|
|
|
|
|
|
+ synchronized ("此为同步锁") {
|
|
Integer currentPatentId = queueData.getUploadParamsVO().getPatent().getId();
|
|
Integer currentPatentId = queueData.getUploadParamsVO().getPatent().getId();
|
|
Integer num = patentIdMap.get(currentPatentId);
|
|
Integer num = patentIdMap.get(currentPatentId);
|
|
if (num == null) {
|
|
if (num == null) {
|
|
patentIdMap.put(currentPatentId, 1);
|
|
patentIdMap.put(currentPatentId, 1);
|
|
- } else if (num == 1) {
|
|
|
|
- patentIdMap.put(currentPatentId, 2);
|
|
|
|
|
|
+ } else if (num < 4) {
|
|
|
|
+ patentIdMap.put(currentPatentId, ++num);
|
|
} else {
|
|
} else {
|
|
//num达到3了就从patentIdMap中删除
|
|
//num达到3了就从patentIdMap中删除
|
|
patentIdMap.remove(currentPatentId);
|
|
patentIdMap.remove(currentPatentId);
|
|
|
|
+ patentFinishNum++;
|
|
long percentage = Math.round((patentFinishNum + 1D) / total * 100D);
|
|
long percentage = Math.round((patentFinishNum + 1D) / total * 100D);
|
|
|
|
+ //当全部完成时
|
|
if (patentFinishNum.equals(total)) {
|
|
if (patentFinishNum.equals(total)) {
|
|
percentage = 100L;
|
|
percentage = 100L;
|
|
|
|
+ //任务表更新状态为成功
|
|
|
|
+ task.setStatus(2);
|
|
|
|
+ task.setEndTime(DateUtils.getDateTime());
|
|
|
|
+ taskService.updateById(task);
|
|
|
|
+ System.out.println("结束时间:" + new Date());
|
|
}
|
|
}
|
|
- patentFinishNum++;
|
|
|
|
messageService.sendWebsocketMessage(task, total, patentFinishNum, percentage);
|
|
messageService.sendWebsocketMessage(task, total, patentFinishNum, percentage);
|
|
-
|
|
|
|
-//任务表更新数据 ↓
|
|
|
|
- //成功条数
|
|
|
|
|
|
+ //任务表更新数据
|
|
task.setSuccessNum(patentFinishNum);
|
|
task.setSuccessNum(patentFinishNum);
|
|
- //失败条数
|
|
|
|
task.setDefaultNum(total - task.getSuccessNum());
|
|
task.setDefaultNum(total - task.getSuccessNum());
|
|
taskService.updateById(task);
|
|
taskService.updateById(task);
|
|
}
|
|
}
|