Просмотр исходного кода

Merge branch 'fix/#251' into 'develop'

增加保存时进行映射功能

See merge request o2oa/o2oa!1174
o2null 5 лет назад
Родитель
Сommit
590e083ad9

+ 35 - 24
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ProcessPlatform.java

@@ -2,6 +2,7 @@ package com.x.base.core.project.config;
 
 import java.io.File;
 
+import org.apache.commons.collections4.Get;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -44,6 +45,8 @@ public class ProcessPlatform extends ConfigObject {
 
 	public final static Boolean DEFAULT_DELETEAPPLICATIONINUSE = false;
 
+	public final static Boolean DEFAULT_UPDATEDATAPROJECTIONENABLE = false;
+
 	public static ProcessPlatform defaultInstance() {
 		return new ProcessPlatform();
 	}
@@ -58,6 +61,7 @@ public class ProcessPlatform extends ConfigObject {
 		this.docToWordDefaultFileName = DEFAULT_DOCTOWORDDEFAULTFILENAME;
 		this.docToWordDefaultSite = DEFAULT_DOCTOWORDDEFAULTSITE;
 		this.executorCount = DEFAULT_EXECUTORCOUNT;
+		this.updateDataProjectionEnable = DEFAULT_UPDATEDATAPROJECTIONENABLE;
 		this.urge = new Urge();
 		this.expire = new Expire();
 		this.touchDelay = new TouchDelay();
@@ -68,30 +72,6 @@ public class ProcessPlatform extends ConfigObject {
 
 	}
 
-	@FieldDescribe("维护身份,当工作发生意外错误,无法找到对应的处理人情况下,先尝试将工作分配给创建身份,如果创建身份也不可获取,那么分配给指定人员,默认情况下这个值为空.")
-	private String maintenanceIdentity;
-
-	@FieldDescribe("表单历史版本保留数量,0为不保留.")
-	private Integer formVersionCount;
-
-	@FieldDescribe("流程历史版本保留数量,0为不保留.")
-	private Integer processVersionCount;
-
-	@FieldDescribe("脚本历史版本保留数量,0为不保留.")
-	private Integer scriptVersionCount;
-
-	@FieldDescribe("HTML版式公文转换成Word文件方式,local,cloud.")
-	private String docToWordType;
-
-	@FieldDescribe("HTML版式公文转换成Word文件缺省文件名.")
-	private String docToWordDefaultFileName;
-
-	@FieldDescribe("HTML版式公文转换成Word文件缺省site.")
-	private String docToWordDefaultSite;
-
-	@FieldDescribe("执行器数量")
-	private Integer executorCount;
-
 	public Integer getExecutorCount() {
 		return ((null == executorCount) || (executorCount < 1)) ? DEFAULT_EXECUTORCOUNT : this.executorCount;
 	}
@@ -121,6 +101,37 @@ public class ProcessPlatform extends ConfigObject {
 		return StringUtils.isEmpty(docToWordDefaultSite) ? DEFAULT_DOCTOWORDDEFAULTSITE : docToWordDefaultSite;
 	}
 
+	public Boolean getUpdateDataProjectionEnable() {
+		return BooleanUtils.isTrue(this.updateDataProjectionEnable);
+	}
+
+	@FieldDescribe("维护身份,当工作发生意外错误,无法找到对应的处理人情况下,先尝试将工作分配给创建身份,如果创建身份也不可获取,那么分配给指定人员,默认情况下这个值为空.")
+	private String maintenanceIdentity;
+
+	@FieldDescribe("表单历史版本保留数量,0为不保留.")
+	private Integer formVersionCount;
+
+	@FieldDescribe("流程历史版本保留数量,0为不保留.")
+	private Integer processVersionCount;
+
+	@FieldDescribe("脚本历史版本保留数量,0为不保留.")
+	private Integer scriptVersionCount;
+
+	@FieldDescribe("HTML版式公文转换成Word文件方式,local,cloud.")
+	private String docToWordType;
+
+	@FieldDescribe("HTML版式公文转换成Word文件缺省文件名.")
+	private String docToWordDefaultFileName;
+
+	@FieldDescribe("HTML版式公文转换成Word文件缺省site.")
+	private String docToWordDefaultSite;
+
+	@FieldDescribe("执行器数量")
+	private Integer executorCount;
+
+	@FieldDescribe("更新data数据是否执行映射.")
+	private boolean updateDataProjectionEnable;
+
 	@FieldDescribe("催办任务设置,发现即将过期时发送提醒消息.")
 	private Urge urge;
 

+ 148 - 8
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/BaseAction.java

@@ -1,19 +1,24 @@
 package com.x.processplatform.service.processing.jaxrs.data;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.math.NumberUtils;
-
 import com.google.gson.Gson;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.google.gson.reflect.TypeToken;
+import com.x.base.core.entity.JpaObject;
 import com.x.base.core.entity.dataitem.DataItemConverter;
 import com.x.base.core.entity.dataitem.ItemCategory;
 import com.x.base.core.entity.dataitem.ItemType;
+import com.x.base.core.project.annotation.ActionLogger;
+import com.x.base.core.project.config.Config;
 import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.ListTools;
 import com.x.processplatform.core.entity.content.Attachment;
 import com.x.processplatform.core.entity.content.Data;
 import com.x.processplatform.core.entity.content.Data.DataWork;
@@ -24,11 +29,20 @@ import com.x.processplatform.core.entity.content.Task;
 import com.x.processplatform.core.entity.content.TaskCompleted;
 import com.x.processplatform.core.entity.content.Work;
 import com.x.processplatform.core.entity.content.WorkCompleted;
+import com.x.processplatform.core.entity.element.Process;
+import com.x.processplatform.core.entity.element.Projection;
+import com.x.processplatform.core.entity.element.util.ProjectionFactory;
 import com.x.processplatform.service.processing.Business;
 import com.x.query.core.entity.Item;
 
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+
 abstract class BaseAction extends StandardJaxrsAction {
 
+	@ActionLogger
+	private static Logger logger = LoggerFactory.getLogger(BaseAction.class);
+
 	protected Gson gson = XGsonBuilder.instance();
 
 	JsonElement getData(Business business, String job, String... paths) throws Exception {
@@ -150,6 +164,14 @@ abstract class BaseAction extends StandardJaxrsAction {
 			// 标记数据已经被修改
 			business.entityManagerContainer().beginTransaction(Work.class);
 			work.setDataChanged(true);
+			if (BooleanUtils.isTrue(Config.processPlatform().getUpdateDataProjectionEnable())) {
+				business.entityManagerContainer().beginTransaction(Task.class);
+				business.entityManagerContainer().beginTransaction(TaskCompleted.class);
+				business.entityManagerContainer().beginTransaction(Read.class);
+				business.entityManagerContainer().beginTransaction(ReadCompleted.class);
+				business.entityManagerContainer().beginTransaction(Review.class);
+				projection(business, work, XGsonBuilder.convert(jsonObject, Data.class));
+			}
 			// 基于前面的原因,这里进行单独提交
 			business.entityManagerContainer().commit();
 		}
@@ -181,6 +203,15 @@ abstract class BaseAction extends StandardJaxrsAction {
 				this.fill(_o, workCompleted);
 				business.entityManagerContainer().persist(_o);
 			}
+			if (BooleanUtils.isTrue(Config.processPlatform().getUpdateDataProjectionEnable())) {
+				business.entityManagerContainer().beginTransaction(WorkCompleted.class);
+				business.entityManagerContainer().beginTransaction(Task.class);
+				business.entityManagerContainer().beginTransaction(TaskCompleted.class);
+				business.entityManagerContainer().beginTransaction(Read.class);
+				business.entityManagerContainer().beginTransaction(ReadCompleted.class);
+				business.entityManagerContainer().beginTransaction(Review.class);
+				projection(business, workCompleted, XGsonBuilder.convert(jsonObject, Data.class));
+			}
 			// 基于前面的原因,这里进行单独提交
 			business.entityManagerContainer().commit();
 
@@ -208,7 +239,7 @@ abstract class BaseAction extends StandardJaxrsAction {
 		Item parent = business.item().getWithJobWithPath(work.getJob(), parentPaths[0], parentPaths[1], parentPaths[2],
 				parentPaths[3], parentPaths[4], parentPaths[5], parentPaths[6], parentPaths[7]);
 		if (null == parent) {
-			throw new Exception("parent not existed.");
+			throw new ExceptionParentNotExist(paths);
 		}
 		Item cursor = business.item().getWithJobWithPath(work.getJob(), cursorPaths[0], cursorPaths[1], cursorPaths[2],
 				cursorPaths[3], cursorPaths[4], cursorPaths[5], cursorPaths[6], cursorPaths[7]);
@@ -236,20 +267,26 @@ abstract class BaseAction extends StandardJaxrsAction {
 				business.entityManagerContainer().persist(o);
 			}
 		} else {
-			throw new Exception("unexpected post data with work" + work + ".path:" + StringUtils.join(paths, ".")
-					+ "json:" + jsonElement);
+			throw new ExceptionUnexpectedData(work.getId(), paths, jsonElement);
 		}
 		// 标记数据已经被修改
 		business.entityManagerContainer().beginTransaction(Work.class);
 		work.setDataChanged(true);
+		if (BooleanUtils.isTrue(Config.processPlatform().getUpdateDataProjectionEnable())) {
+			business.entityManagerContainer().beginTransaction(Task.class);
+			business.entityManagerContainer().beginTransaction(TaskCompleted.class);
+			business.entityManagerContainer().beginTransaction(Read.class);
+			business.entityManagerContainer().beginTransaction(ReadCompleted.class);
+			business.entityManagerContainer().beginTransaction(Review.class);
+			projection(business, work, XGsonBuilder.convert(jsonElement, Data.class));
+		}
 		business.entityManagerContainer().commit();
 	}
 
 	void deleteData(Business business, Work work, String... paths) throws Exception {
 		List<Item> exists = business.item().listWithJobWithPath(work.getJob(), paths);
 		if (exists.isEmpty()) {
-			throw new Exception(
-					"data{job:" + work.getJob() + "} on path:" + StringUtils.join(paths, ".") + " is not existed.");
+			throw new ExceptionDataNotExist(work.getJob(), paths);
 		}
 		business.entityManagerContainer().beginTransaction(Item.class);
 		for (Item o : exists) {
@@ -287,4 +324,107 @@ abstract class BaseAction extends StandardJaxrsAction {
 				Attachment.job_FIELDNAME, job);
 	}
 
+	private void projection(Business business, Work work, Data data) throws Exception {
+		Process process = business.element().get(work.getProcess(), Process.class);
+		if (null != process) {
+			List<Projection> list = this.listProjection(process);
+			if (ListTools.isNotEmpty(list)) {
+				ProjectionFactory.projectionWork(list, data, work);
+				business.entityManagerContainer().listEqualAndNotEqual(Work.class, Work.job_FIELDNAME, work.getJob(),
+						JpaObject.id_FIELDNAME, work.getId()).forEach(o -> {
+							try {
+								ProjectionFactory.projectionWork(list, data, o);
+							} catch (Exception e) {
+								logger.error(e);
+							}
+						});
+				projectionTask(business, work.getJob(), data, list);
+				projectionTaskCompleted(business, work.getJob(), data, list);
+				projectionRead(business, work.getJob(), data, list);
+				projectionReadCompleted(business, work.getJob(), data, list);
+				projectionReview(business, work.getJob(), data, list);
+			}
+		}
+	}
+
+	private void projection(Business business, WorkCompleted workCompleted, Data data) throws Exception {
+		Process process = business.element().get(workCompleted.getProcess(), Process.class);
+
+		if (null != process) {
+			List<Projection> list = this.listProjection(process);
+
+			if (ListTools.isNotEmpty(list)) {
+				ProjectionFactory.projectionWorkCompleted(list, data, workCompleted);
+				projectionTaskCompleted(business, workCompleted.getJob(), data, list);
+				projectionRead(business, workCompleted.getJob(), data, list);
+				projectionReadCompleted(business, workCompleted.getJob(), data, list);
+				projectionReview(business, workCompleted.getJob(), data, list);
+			}
+		}
+	}
+
+	private void projectionTask(Business business, String job, Data data, List<Projection> list) throws Exception {
+		business.entityManagerContainer().listEqual(Task.class, Task.job_FIELDNAME, job).forEach(o -> {
+			try {
+				ProjectionFactory.projectionTask(list, data, o);
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private void projectionTaskCompleted(Business business, String job, Data data, List<Projection> list)
+			throws Exception {
+		business.entityManagerContainer().listEqual(TaskCompleted.class, TaskCompleted.job_FIELDNAME, job)
+				.forEach(o -> {
+					try {
+						ProjectionFactory.projectionTaskCompleted(list, data, o);
+					} catch (Exception e) {
+						logger.error(e);
+					}
+				});
+	}
+
+	private void projectionRead(Business business, String job, Data data, List<Projection> list) throws Exception {
+		business.entityManagerContainer().listEqual(Read.class, Read.job_FIELDNAME, job).forEach(o -> {
+			try {
+				ProjectionFactory.projectionRead(list, data, o);
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	private void projectionReadCompleted(Business business, String job, Data data, List<Projection> list)
+			throws Exception {
+		business.entityManagerContainer().listEqual(ReadCompleted.class, ReadCompleted.job_FIELDNAME, job)
+				.forEach(o -> {
+					try {
+						ProjectionFactory.projectionReadCompleted(list, data, o);
+					} catch (Exception e) {
+						logger.error(e);
+					}
+				});
+	}
+
+	private void projectionReview(Business business, String job, Data data, List<Projection> list) throws Exception {
+		business.entityManagerContainer().listEqual(Review.class, Review.job_FIELDNAME, job).forEach(o -> {
+			try {
+				ProjectionFactory.projectionReview(list, data, o);
+			} catch (Exception e) {
+				logger.error(e);
+			}
+		});
+	}
+
+	public List<Projection> listProjection(Process process) {
+		List<Projection> list = new ArrayList<>();
+		String text = process.getProjection();
+		if (XGsonBuilder.isJsonArray(text)) {
+			list = XGsonBuilder.instance().fromJson(text, new TypeToken<List<Projection>>() {
+			}.getType());
+		}
+		return list;
+	}
+
 }

+ 14 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ExceptionDataNotExist.java

@@ -0,0 +1,14 @@
+package com.x.processplatform.service.processing.jaxrs.data;
+
+import com.x.base.core.project.exception.PromptException;
+
+import org.apache.commons.lang3.StringUtils;
+
+class ExceptionDataNotExist extends PromptException {
+
+	private static final long serialVersionUID = -665095222445791960L;
+
+	ExceptionDataNotExist(String job, String[] paths) {
+		super("data not exist job: {}, path: {}.", job, StringUtils.join(paths, "."));
+	}
+}

+ 17 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ExceptionParentNotExist.java

@@ -0,0 +1,17 @@
+package com.x.processplatform.service.processing.jaxrs.data;
+
+import java.util.Objects;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.exception.PromptException;
+
+import org.apache.commons.lang3.StringUtils;
+
+class ExceptionParentNotExist extends PromptException {
+
+	private static final long serialVersionUID = -665095222445791960L;
+
+	ExceptionParentNotExist(String[] paths) {
+		super("parent not exist: {}.", StringUtils.join(paths, "."));
+	}
+}

+ 18 - 0
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ExceptionUnexpectedData.java

@@ -0,0 +1,18 @@
+package com.x.processplatform.service.processing.jaxrs.data;
+
+import java.util.Objects;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.project.exception.PromptException;
+
+import org.apache.commons.lang3.StringUtils;
+
+class ExceptionUnexpectedData extends PromptException {
+
+	private static final long serialVersionUID = -665095222445791960L;
+
+	ExceptionUnexpectedData(String work, String[] paths, JsonElement jsonElement) {
+		super("unexpected post data with work :{}, path :{}, json :{}.", work, StringUtils.join(paths, "."),
+				Objects.toString(jsonElement, ""));
+	}
+}