提交 ed55bad9 编写于 作者: R Ray

增加after事件可以保存data

上级 69fb78d9
package com.x.processplatform.service.processing;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
......@@ -52,12 +51,12 @@ public class WorkDataHelper {
public WorkDataHelper(EntityManagerContainer emc, WorkCompleted workCompleted) throws Exception {
if ((null == emc) || (null == workCompleted)) {
throw new Exception("create instance error.");
throw new IllegalStateException("create instance error.");
}
this.job = workCompleted.getJob();
this.distributeFactor = workCompleted.getDistributeFactor();
if (StringUtils.isEmpty(this.job)) {
throw new Exception("can not create DataHelper job is empty.");
throw new IllegalStateException("can not create DataHelper job is empty.");
}
this.emc = emc;
this.converter = new DataItemConverter<>(Item.class);
......@@ -76,7 +75,7 @@ public class WorkDataHelper {
return em.createQuery(cq.where(p)).getResultList();
}
public Data get() throws Exception {
public Data get() throws ExceptionDataConvert {
try {
if (this.items.isEmpty()) {
return new Data();
......@@ -95,28 +94,9 @@ public class WorkDataHelper {
}
public boolean update(JsonElement jsonElement) throws Exception {
if (jsonElement.isJsonNull()) {
// 如果是空数据就不更新,避免数据被清空
return false;
}
if (jsonElement.isJsonPrimitive()) {
// 如果是空数据就不更新,避免数据被清空 */
if (skipUpdate(jsonElement)) {
return false;
}
if (jsonElement.isJsonObject()) {
if (jsonElement.getAsJsonObject().size() == 0) {
// throw new Exception("can not update data object size ==0.");
/** 如果是空数据就不更新,避免数据被清空 */
return false;
}
}
if (jsonElement.isJsonArray()) {
if (jsonElement.getAsJsonArray().size() == 0) {
// throw new Exception("can not update data array size ==0.");
/** 如果是空数据就不更新,避免数据被清空 */
return false;
}
}
List<Item> currents = converter.disassemble(jsonElement);
List<Item> removes = converter.subtract(items, currents);
List<Item> adds = converter.subtract(currents, items);
......@@ -136,8 +116,7 @@ public class WorkDataHelper {
emc.persist(o);
}
}
List<Item> list = new ArrayList<>();
list = converter.subtract(items, removes);
List<Item> list = converter.subtract(items, removes);
list.addAll(adds);
converter.sort(list);
items = list;
......@@ -147,6 +126,23 @@ public class WorkDataHelper {
}
}
private boolean skipUpdate(JsonElement jsonElement) {
if (jsonElement.isJsonNull()) {
// 如果是空数据就不更新,避免数据被清空
return true;
}
if (jsonElement.isJsonPrimitive()) {
// 如果是空数据就不更新,避免数据被清空
return true;
}
if (jsonElement.isJsonObject() && (jsonElement.getAsJsonObject().size() == 0)) {
// 如果是空数据就不更新,避免数据被清空
return true;
}
// 如果是空数据就不更新,避免数据被清空
return (jsonElement.isJsonArray() && (jsonElement.getAsJsonArray().size() == 0));
}
public boolean update(Data data) throws Exception {
JsonElement jsonElement = gson.toJsonTree(data);
return this.update(jsonElement);
......@@ -161,7 +157,7 @@ public class WorkDataHelper {
}
}
public void fill(Item o) throws Exception {
public void fill(Item o) {
o.setDistributeFactor(this.distributeFactor);
o.setBundle(this.job);
o.setItemCategory(ItemCategory.pp);
......
......@@ -44,7 +44,7 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
public String arrive(String workId, ProcessingConfigurator processingConfigurator,
ProcessingAttributes processingAttributes) {
/* 返回值,如果返回值不为空,将继续循环 */
// 返回值,如果返回值不为空,将继续循环
try {
Work work = this.entityManagerContainer().find(workId, Work.class);
if (null == work) {
......@@ -62,90 +62,78 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
}
AeiObjects aeiObjects = new AeiObjects(this.business(), work, activity, processingConfigurator,
processingAttributes);
/* 清空可能的Manual活动预期人员 */
this.arrive_cleanManualTaskIdentityList(aeiObjects);
/* 清空可能的Manual活动授权信息 */
this.arrive_cleanManualEmpowerMap(aeiObjects);
// /* 将强制路由标记进行修改 */
// work.setForceRouteArriveCurrentActivity(false);
// if (BooleanUtils.isTrue(work.getForceRoute())) {
// work.setForceRoute(false);
// work.setForceRouteArriveCurrentActivity(true);
// }
/* 计算是否经过人工节点 */
this.arrive_updateWorkThroughManual(aeiObjects);
/* 清空BeforeExecuted活动执行一次事件 */
// 清空可能的Manual活动预期人员
this.arriveCleanManualTaskIdentityList(aeiObjects);
// 清空可能的Manual活动授权信息
this.arriveCleanManualEmpowerMap(aeiObjects);
// 计算是否经过人工节点
this.arriveUpdateWorkThroughManual(aeiObjects);
// 清空BeforeExecuted活动执行一次事件
work.setBeforeExecuted(false);
aeiObjects.getUpdateWorks().add(work);
this.callBeforeArriveScript(aeiObjects);
this.arriveActivity(aeiObjects);
/* 创建待阅和参阅 */
// 创建待阅和参阅
aeiObjects.getCreateReads().addAll(this.concreteRead(aeiObjects));
aeiObjects.getCreateReviews().addAll(this.concreteReview(aeiObjects));
/*
* 主方法,进行业务运行
*/
// 主方法,进行业务运行
work = this.arriveProcessing(aeiObjects);
/*
* 主方法结束
*/
// 主方法结束
if (null == work) {
throw new Exception("arrvie return empty, work{id:" + workId + "}.");
throw new IllegalStateException("arrvie return empty, work{id:" + workId + "}.");
}
if (null != aeiObjects.getProcess()) {
if (StringUtils.equalsIgnoreCase(aeiObjects.getProcess().getSerialActivity(),
aeiObjects.getActivity().getId())
&& (!StringUtils.equals(aeiObjects.getProcess().getSerialPhase(),
Process.SERIALPHASE_INQUIRE))) {
if (StringUtils.isEmpty(work.getSerial())) {
SerialBuilder serialBuilder = new SerialBuilder(ThisApplication.context(),
this.entityManagerContainer(), work.getProcess(), work.getId());
String serial = serialBuilder.concrete(aeiObjects);
work.setSerial(serial);
}
}
if ((null != aeiObjects.getProcess())
&& StringUtils.equalsIgnoreCase(aeiObjects.getProcess().getSerialActivity(),
aeiObjects.getActivity().getId())
&& (!StringUtils.equals(aeiObjects.getProcess().getSerialPhase(), Process.SERIALPHASE_INQUIRE))
&& StringUtils.isEmpty(work.getSerial())) {
SerialBuilder serialBuilder = new SerialBuilder(ThisApplication.context(),
this.entityManagerContainer(), work.getProcess(), work.getId());
String serial = serialBuilder.concrete(aeiObjects);
work.setSerial(serial);
}
aeiObjects.commit();
this.arriveCommitted(aeiObjects);
/* 运行AfterArriveScript时间 */
// 运行AfterArriveScript时间
this.callAfterArriveScript(aeiObjects);
return work.getId();
} catch (Exception e) {
} catch (
Exception e) {
LOGGER.error(e);
return null;
}
}
private void arrive_cleanManualTaskIdentityList(AeiObjects aeiObjects) throws Exception {
aeiObjects.getWork().setManualTaskIdentityList(new ArrayList<String>());
private void arriveCleanManualTaskIdentityList(AeiObjects aeiObjects) {
aeiObjects.getWork().setManualTaskIdentityList(new ArrayList<>());
}
private void arrive_cleanManualEmpowerMap(AeiObjects aeiObjects) throws Exception {
aeiObjects.getWork().getProperties().setManualEmpowerMap(new LinkedHashMap<String, String>());
private void arriveCleanManualEmpowerMap(AeiObjects aeiObjects) {
aeiObjects.getWork().getProperties().setManualEmpowerMap(new LinkedHashMap<>());
}
private void arrive_updateWorkThroughManual(AeiObjects aeiObjects) throws Exception {
boolean value = aeiObjects.getWorkLogs().stream().filter(o -> {
return Objects.equals(ActivityType.manual, o.getArrivedActivityType())
&& BooleanUtils.isTrue(o.getConnected());
}).count() > 0;
private void arriveUpdateWorkThroughManual(AeiObjects aeiObjects) throws Exception {
boolean value = aeiObjects.getWorkLogs().stream()
.filter(o -> Objects.equals(ActivityType.manual, o.getArrivedActivityType())
&& BooleanUtils.isTrue(o.getConnected()))
.count() > 0;
aeiObjects.getWork().setWorkThroughManual(value);
}
private void callBeforeArriveScript(AeiObjects aeiObjects) throws Exception {
if (aeiObjects.getActivityProcessingConfigurator().getCallBeforeArriveScript()) {
if (this.hasBeforeArriveScript(aeiObjects.getProcess(), aeiObjects.getActivity())) {
CompiledScript cs = null;
if (this.hasBeforeArriveScript(aeiObjects.getProcess())) {
cs = aeiObjects.business().element().getCompiledScript(aeiObjects.getApplication().getId(),
aeiObjects.getProcess(), Business.EVENT_BEFOREARRIVE);
JsonScriptingExecutor.eval(cs, aeiObjects.scriptContext());
}
if (this.hasBeforeArriveScript(aeiObjects.getActivity())) {
cs = aeiObjects.business().element().getCompiledScript(aeiObjects.getApplication().getId(),
aeiObjects.getActivity(), Business.EVENT_BEFOREARRIVE);
JsonScriptingExecutor.eval(cs, aeiObjects.scriptContext());
}
if (BooleanUtils.isTrue(aeiObjects.getActivityProcessingConfigurator().getCallBeforeArriveScript())
&& this.hasBeforeArriveScript(aeiObjects.getProcess(), aeiObjects.getActivity())) {
CompiledScript cs = null;
if (this.hasBeforeArriveScript(aeiObjects.getProcess())) {
cs = aeiObjects.business().element().getCompiledScript(aeiObjects.getApplication().getId(),
aeiObjects.getProcess(), Business.EVENT_BEFOREARRIVE);
JsonScriptingExecutor.eval(cs, aeiObjects.scriptContext());
}
if (this.hasBeforeArriveScript(aeiObjects.getActivity())) {
cs = aeiObjects.business().element().getCompiledScript(aeiObjects.getApplication().getId(),
aeiObjects.getActivity(), Business.EVENT_BEFOREARRIVE);
JsonScriptingExecutor.eval(cs, aeiObjects.scriptContext());
}
}
}
......@@ -197,11 +185,6 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
if (null == work) {
throw new ExceptionWorkNotExist(workId);
}
// if (BooleanUtils.isTrue(work.getForceRoute())) {
// /** 如果是调度那么跳过运行 */
// results.add(work.getId());
// return results;
// }
ActivityType activityType = work.getActivityType();
if (null == activityType) {
throw new ExceptionEmptyActivityType(work.getTitle(), work.getId(), work.getActivityType());
......@@ -215,13 +198,13 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
AeiObjects aeiObjects = new AeiObjects(this.business(), work, activity, processingConfigurator,
processingAttributes);
aeiObjects.getUpdateWorks().add(work);
/* 如果是调度路由,需要重新设置froceRoute */
// 如果是调度路由,需要重新设置froceRoute
if (BooleanUtils.isNotTrue(work.getBeforeExecuted())) {
/* 仅执行一次BeforeExecuteScript中的代码 */
// 仅执行一次BeforeExecuteScript中的代码
this.callBeforeExecuteScript(aeiObjects);
work.setBeforeExecuted(true);
}
/* 运行业务方法 */
// 运行业务方法
List<Work> works = this.executeProcessing(aeiObjects);
if (ListTools.isNotEmpty(works)) {
......@@ -235,6 +218,9 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
if (ListTools.isNotEmpty(works)) {
/** 已经有返回的work将要离开当前环节,执行AfterExecuteScript中的代码 */
this.callAfterExecuteScript(aeiObjects);
if (aeiObjects.commitData()) {
aeiObjects.entityManagerContainer().commit();
}
}
} catch (Exception e) {
LOGGER.error(e);
......@@ -297,11 +283,6 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
AeiObjects aeiObjects = new AeiObjects(this.business(), work, activity, processingConfigurator,
processingAttributes);
aeiObjects.getUpdateWorks().add(work);
// if (BooleanUtils.isTrue(work.getForceRoute())) {
// /** 如果是调度那么跳过运行 */
// results.add(work.getId());
// return results;
// }
/* 运行查询路由前脚本 */
this.callBeforeInquireScript(aeiObjects);
/*
......@@ -313,7 +294,7 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
*/
aeiObjects.addSelectRoutes(selectRoutes);
if ((null == selectRoutes) || selectRoutes.isEmpty()) {
throw new Exception("inquire return empty routes");
throw new IllegalStateException("inquire return empty routes");
}
List<Work> works = new ArrayList<>();
/** 运行查询路由后脚本 */
......@@ -322,28 +303,26 @@ public abstract class AbstractProcessor extends AbstractBaseProcessor {
work.setDestinationRoute(selectRoutes.get(0).getId());
work.setDestinationRouteName(selectRoutes.get(0).getName());
works.add(work);
// }
for (Work o : works) {
results.add(o.getId());
}
if (null != aeiObjects.getProcess()) {
if (StringUtils.equalsIgnoreCase(aeiObjects.getProcess().getSerialActivity(),
aeiObjects.getActivity().getId())
&& (StringUtils.equals(aeiObjects.getProcess().getSerialPhase(),
Process.SERIALPHASE_INQUIRE))) {
if (StringUtils.isEmpty(work.getSerial())) {
SerialBuilder serialBuilder = new SerialBuilder(ThisApplication.context(),
this.entityManagerContainer(), work.getProcess(), work.getId());
String serial = serialBuilder.concrete(aeiObjects);
work.setSerial(serial);
}
}
if ((null != aeiObjects.getProcess())
&& StringUtils.equalsIgnoreCase(aeiObjects.getProcess().getSerialActivity(),
aeiObjects.getActivity().getId())
&& (StringUtils.equals(aeiObjects.getProcess().getSerialPhase(), Process.SERIALPHASE_INQUIRE))
&& StringUtils.isEmpty(work.getSerial())) {
SerialBuilder serialBuilder = new SerialBuilder(ThisApplication.context(),
this.entityManagerContainer(), work.getProcess(), work.getId());
String serial = serialBuilder.concrete(aeiObjects);
work.setSerial(serial);
}
aeiObjects.commit();
this.inquireCommitted(aeiObjects);
/** 运行 AfterInquireScript事件 */
// 运行 AfterInquireScript事件
this.callAfterInquireScript(aeiObjects);
} catch (Exception e) {
} catch (
Exception e) {
LOGGER.error(e);
}
return results;
......
......@@ -1321,7 +1321,13 @@ public class AeiObjects extends GsonPropertyObject {
}
}
private void commitData() throws Exception {
/**
* 更新data对象,这个方法会在流程executingCommitted之后再次调用,实现可以在after事件中修改数据.
*
* @return 是否有Item发生了更新
* @throws Exception
*/
public boolean commitData() throws Exception {
List<Attachment> os = ListUtils.subtract(this.getAttachments(), this.getDeleteAttachments());
os = ListUtils.sum(os, this.getCreateAttachments());
Data dataToUpdate = this.getData().removeWork().removeAttachmentList().setAttachmentList(os);
......@@ -1330,7 +1336,7 @@ public class AeiObjects extends GsonPropertyObject {
} else {
dataToUpdate.setWork(this.getWork());
}
this.getWorkDataHelper().update(dataToUpdate);
return this.getWorkDataHelper().update(dataToUpdate);
}
private void commitDynamicEntity() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册