更新ppt文件,待阅发送完成后发送成功回执

This commit is contained in:
Mr-wang 2023-07-26 17:51:31 +08:00
parent ac50b06e26
commit 32ccca18a3
3 changed files with 128 additions and 68 deletions

View File

@ -16,6 +16,7 @@ import com.actionsoft.sdk.local.SDK;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.dom4j.Document; import org.dom4j.Document;
import org.dom4j.DocumentException; import org.dom4j.DocumentException;
@ -27,6 +28,7 @@ import org.quartz.JobExecutionException;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -34,6 +36,7 @@ import java.util.concurrent.TimeUnit;
public class CopyJob implements IJob { public class CopyJob implements IJob {
private int sendTotal; private int sendTotal;
@SneakyThrows
@Override @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
@ -135,15 +138,15 @@ public class CopyJob implements IJob {
} }
} }
}*/ }*/
list.add("10036614"); // list.add("10036614");
list.add("10056870"); // list.add("10056870");
new_uid = new_uid.join(",", list); new_uid = new_uid.join(",", sendList);
long startTimes = System.currentTimeMillis(); long startTimes = System.currentTimeMillis();
String[] users = new_uid.split(","); String[] users = new_uid.split(",");
System.out.println("new_uid>>>>>>>>>>>>>>"+users.length); System.out.println("new_uid>>>>>>>>>>>>>>"+users.length);
int length = 1; int length = 100;
int ys = users.length%length; int ys = users.length%length;
/** /**
* 这个是以300人作为一个发送单位去放到list中并发送待阅数据 * 这个是以300人作为一个发送单位去放到list中并发送待阅数据
@ -156,9 +159,9 @@ public class CopyJob implements IJob {
for (int i=0;i<size;i++){ for (int i=0;i<size;i++){
String[] results; String[] results;
results = Arrays.copyOfRange(users, flag, flag+1); results = Arrays.copyOfRange(users, flag, flag+100);
lists.add(results); lists.add(results);
flag = flag+1; flag = flag+100;
} }
/** /**
@ -173,9 +176,9 @@ public class CopyJob implements IJob {
for (int i=0;i<size;i++){ for (int i=0;i<size;i++){
String[] results; String[] results;
results = Arrays.copyOfRange(users, flag, flag+1); results = Arrays.copyOfRange(users, flag, flag+100);
lists.add(results); lists.add(results);
flag = flag+1; flag = flag+100;
} }
String[] redata; String[] redata;
redata = Arrays.copyOfRange(users, flag, flag+ys); redata = Arrays.copyOfRange(users, flag, flag+ys);
@ -209,13 +212,14 @@ public class CopyJob implements IJob {
public void course(List<String[]> list, long startTime, JSONObject jsonObject, ProcessInstance processInstance,ArrayList<String> sendList){ public void course(List<String[]> list, long startTime, JSONObject jsonObject, ProcessInstance processInstance,ArrayList<String> sendList) throws Exception {
final boolean[] flag = {false};
// 创建线程来实现为每100人为一个的线程跑待阅 // 创建线程来实现为每100人为一个的线程跑待阅
CountDownLatch countDownLatch = new CountDownLatch(list.size());
ExecutorService service = Executors.newFixedThreadPool(5); ExecutorService service = Executors.newFixedThreadPool(5);
int m = 0; int m = 0;
for (String[] resrt:list for (String[] resrt:list
) { ) {
int finalM = m;
service.execute(new Runnable() { service.execute(new Runnable() {
@Override @Override
@ -231,6 +235,7 @@ public class CopyJob implements IJob {
}*/ }*/
try { try {
SendOARead(jsonObject, processInstance, userIds,"批量推送"); SendOARead(jsonObject, processInstance, userIds,"批量推送");
countDownLatch.countDown();
} catch (DocumentException e) { } catch (DocumentException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -240,67 +245,68 @@ public class CopyJob implements IJob {
}); });
m++; m++;
} }
countDownLatch.await();
if (countDownLatch.getCount()==0){
try { try {
// 等待所有的任务执行完毕最多等待1小时 // 等待所有的任务执行完毕最多等待1小时
if (service.awaitTermination(12, TimeUnit.HOURS)) {
List<RowMap> List = DBSql.getMaps("SELECT NAME FROM BO_EU_READ_COUNT WHERE PROCESSID = '"
+ processInstance.getId() + "' AND RESULT = '待处理'");
if (List.size() != 0) {
System.err.println(processInstance.getTitle() + "批量推送失败后执行二次推送=======>" + List.size());
for (RowMap rowMap : List) {
try {
ArrayList<String> secondUserList = new ArrayList<String>();
secondUserList.add(rowMap.getString("NAME"));
System.err.println(processInstance.getTitle() + "二次推送账号=======>" + secondUserList);
BO executiveTaskBO=SDK.getBOAPI().query("BO_ACT_EXECUTIVE_TASK").addQuery("TASKID=",processInstance.getId()).addQuery("TASKSTATUS=",2).detail(); List<RowMap> List = DBSql.getMaps("SELECT NAME FROM BO_EU_READ_COUNT WHERE PROCESSID = '"
if(executiveTaskBO!=null){ + processInstance.getId() + "' AND RESULT = '待处理'");
List<BO> recordFailLists = new ArrayList<BO>(); if (List.size() != 0) {
for(RowMap oneuserId:List){ System.err.println(processInstance.getTitle() + "批量推送失败后执行二次推送=======>" + List.size());
BO bo = new BO(); for (RowMap rowMap : List) {
bo.set("TITLE", processInstance.getTitle()); try {
bo.set("NAME", oneuserId.getString("NAME")); ArrayList<String> secondUserList = new ArrayList<String>();
bo.set("TYPE", "批量推送"); secondUserList.add(rowMap.getString("NAME"));
bo.set("RESULT", "待处理"); System.err.println(processInstance.getTitle() + "二次推送账号=======>" + secondUserList);
bo.set("PROCESSID", processInstance.getId());
bo.set("DEPNAME", SDK.getORGAPI().getUser(oneuserId.getString("NAME")).getDepartmentId()); BO executiveTaskBO=SDK.getBOAPI().query("BO_ACT_EXECUTIVE_TASK").addQuery("TASKID=",processInstance.getId()).addQuery("TASKSTATUS=",2).detail();
recordFailLists.add(bo); if(executiveTaskBO!=null){
} List<BO> recordFailLists = new ArrayList<BO>();
SDK.getBOAPI().create("BO_EU_READ_COUNT", recordFailLists, processInstance.getId(), processInstance.getCreateUser()); for(RowMap oneuserId:List){
return; BO bo = new BO();
bo.set("TITLE", processInstance.getTitle());
bo.set("NAME", oneuserId.getString("NAME"));
bo.set("TYPE", "批量推送");
bo.set("RESULT", "待处理");
bo.set("PROCESSID", processInstance.getId());
bo.set("DEPNAME", SDK.getORGAPI().getUser(oneuserId.getString("NAME")).getDepartmentId());
recordFailLists.add(bo);
} }
SDK.getBOAPI().create("BO_EU_READ_COUNT", recordFailLists, processInstance.getId(), processInstance.getCreateUser());
secondSendOARead(jsonObject, processInstance, secondUserList, "单个账号推送"); return;
} catch (Exception e) { // TODO: handle exception
} }
secondSendOARead(jsonObject, processInstance, secondUserList, "单个账号推送");
} catch (Exception e) { // TODO: handle exception
} }
} }
long endTimes = System.currentTimeMillis(); }
// 存入日志
createReadLog(processInstance, jsonObject, sendList, startTime, endTimes); long endTimes = System.currentTimeMillis();
System.err.println(processInstance.getTitle() + "推送OA待阅执行完毕====>" + "用时:" // 存入日志
+ (endTimes - startTime) / 1000 / 60 + "分钟"); createReadLog(processInstance, jsonObject, sendList, startTime, endTimes);
System.err.println(processInstance.getTitle() + "推送OA待阅执行完毕====>" + "用时:"
+ (endTimes - startTime) / 1000 / 60 + "分钟");
//发送消息通知 //发送消息通知
List<BO> readCountBO=SDK.getBOAPI().query("BO_EU_READ_COUNT").addQuery("PROCESSID=",processInstance.getId()).list(); List<BO> readCountBO=SDK.getBOAPI().query("BO_EU_READ_COUNT").addQuery("PROCESSID=",processInstance.getId()).list();
if(readCountBO.size()>0){ if(readCountBO.size()>0){
SDK.getNotificationAPI().sendMessage("admin", "admin", "文件名称:"+processInstance.getTitle()+"文件有失败记录,请及时处理!!!"); SDK.getNotificationAPI().sendMessage("admin", "admin", "文件名称:"+processInstance.getTitle()+"文件有失败记录,请及时处理!!!");
} }
//更新任务状态 //更新任务状态
int r1 = DBSql.update("UPDATE BO_ACT_EXECUTIVE_TASK SET ISTASKEND='2' WHERE TASKID ='" + processInstance.getId() + "'"); int r1 = DBSql.update("UPDATE BO_ACT_EXECUTIVE_TASK SET ISTASKEND='2' WHERE TASKID ='" + processInstance.getId() + "'");
} catch (Exception e) {
} else { System.out.println("等待中断异常");
System.out.println("超过等待时间,部分任务未执行完毕");
} }
} catch (InterruptedException e) { } else {
System.out.println("等待中断异常"); System.out.println("超过等待时间,部分任务未执行完毕");
} }
} }

View File

@ -13,6 +13,7 @@ import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -540,16 +541,15 @@ public class ProcessEndAfterEvent_new extends ExecuteListener implements Execute
* @param jsonObject * @param jsonObject
* @param processExecutionContext * @param processExecutionContext
*/ */
public void course(List<String[]> list,long startTime,JSONObject jsonObject,ProcessExecutionContext processExecutionContext,ArrayList<String> sendList){ public void course(List<String[]> list,long startTime,JSONObject jsonObject,ProcessExecutionContext processExecutionContext,ArrayList<String> sendList) throws InterruptedException {
// 创建线程来实现为每100人为一个的线程跑待阅 // 创建线程来实现为每100人为一个的线程跑待阅
ProcessInstance instanceById = processExecutionContext.getProcessInstance(); ProcessInstance instanceById = processExecutionContext.getProcessInstance();
final boolean[] flag = {false}; CountDownLatch countDownLatch = new CountDownLatch(list.size());
ExecutorService service = Executors.newFixedThreadPool(5); ExecutorService service = Executors.newFixedThreadPool(5);
int m = 0; int m = 0;
for (String[] resrt:list for (String[] resrt:list
) { ) {
int finalM = m; int finalM = m;
final boolean[] filnaflag = {flag[0]};
service.execute(new Runnable() { service.execute(new Runnable() {
@Override @Override
@ -559,9 +559,8 @@ public class ProcessEndAfterEvent_new extends ExecuteListener implements Execute
userIds = StringUtils.join(resrt, ","); userIds = StringUtils.join(resrt, ",");
System.out.println("userIDs>>>>>>>>>>>>>>>"+userIds); System.out.println("userIDs>>>>>>>>>>>>>>>"+userIds);
try { try {
filnaflag[0] = false;
SendOARead(jsonObject, processExecutionContext.getProcessInstance(), userIds,"批量推送"); SendOARead(jsonObject, processExecutionContext.getProcessInstance(), userIds,"批量推送");
flag[0] = true; countDownLatch.countDown();
} catch (DocumentException e) { } catch (DocumentException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -570,8 +569,8 @@ public class ProcessEndAfterEvent_new extends ExecuteListener implements Execute
}); });
m++; m++;
} }
countDownLatch.await();
if (service.isTerminated()){ if (countDownLatch.getCount()==0){
try { try {
// 等待所有的任务执行完毕最多等待1小时 // 等待所有的任务执行完毕最多等待1小时
@ -633,6 +632,7 @@ public class ProcessEndAfterEvent_new extends ExecuteListener implements Execute
} else { } else {
System.out.println("超过等待时间,部分任务未执行完毕"); System.out.println("超过等待时间,部分任务未执行完毕");
} }
} }
/** /**

View File

@ -34,6 +34,9 @@ import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException; import org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException;
import org.apache.poi.poifs.filesystem.OfficeXmlFileException; import org.apache.poi.poifs.filesystem.OfficeXmlFileException;
import org.apache.poi.sl.usermodel.Shape;
import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.sl.usermodel.TableCell;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Color; import org.apache.poi.ss.usermodel.Color;
@ -420,7 +423,7 @@ public class UpFileExcelAndPptController {
String[] fileNames ={dcContext.getFilePath(),dcContext_old.getFilePath()} ; String[] fileNames ={dcContext.getFilePath(),dcContext_old.getFilePath()} ;
String mergedFileName = dcContext.getPath()+"dc.pptx"; String mergedFileName = dcContext.getPath()+"dc.pptx";
if (name.endsWith(".pptx")){ if (name.endsWith(".pptx")||name.endsWith(".ppt")){
try (FileOutputStream outputStream = new FileOutputStream(mergedFileName)) { try (FileOutputStream outputStream = new FileOutputStream(mergedFileName)) {
XMLSlideShow mergedSlideShow = new XMLSlideShow(); XMLSlideShow mergedSlideShow = new XMLSlideShow();
@ -599,8 +602,6 @@ public class UpFileExcelAndPptController {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
}else {
} }
} }
} }
@ -612,6 +613,35 @@ public class UpFileExcelAndPptController {
private static void copyConditionalFormatting(HSLFSlide sourceSlide, HSLFSlide targetSlide) {
List<HSLFShape> shapes = sourceSlide.getShapes();
for (HSLFShape shape : shapes) {
if (shape instanceof HSLFTextShape) {
HSLFTextShape textShape = (HSLFTextShape) shape;
HSLFTextShape newShape = targetSlide.createTextBox();
newShape.setText(textShape.getText());
newShape.setTextPlaceholder(textShape.getTextPlaceholder());
} else {
targetSlide.addShape(shape);
}
}
}
private static HSLFTextShape getMatchingTextShape(HSLFSlide slide, HSLFTextShape sourceShape) {
List<HSLFShape> shapes = slide.getShapes();
for (HSLFShape shape : shapes) {
if (shape instanceof HSLFTextShape) {
HSLFTextShape textShape = (HSLFTextShape) shape;
if (textShape.getTextParagraphs().size() == sourceShape.getTextParagraphs().size()) {
return textShape;
}
}
}
return null;
}
// 更新幻灯片ID列表 // 更新幻灯片ID列表
// 更新幻灯片ID列表 // 更新幻灯片ID列表
// 移动幻灯片位置 // 移动幻灯片位置
@ -663,6 +693,30 @@ public class UpFileExcelAndPptController {
} }
} }
private static void copyImages(HSLFSlide sourceSlide, HSLFSlide targetSlide) {
for (HSLFShape shape : sourceSlide.getShapes()) {
if (shape instanceof HSLFPictureShape) {
HSLFPictureShape pictureShape = (HSLFPictureShape) shape;
HSLFPictureData pictureData = pictureShape.getPictureData();
try {
byte[] pictureBytes = pictureData.getData();
String pictureType = pictureData.getContentType();
HSLFPictureData pictureIndex = targetSlide.getSlideShow().addPicture(pictureBytes, pictureData.getType());
HSLFPictureShape newPictureShape = targetSlide.createPicture(pictureIndex);
newPictureShape.setAnchor(pictureShape.getAnchor());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/** /**
*获取修订记录 *获取修订记录
* @param repositoryModel * @param repositoryModel