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

修改为统一的业务逻辑

o2null 5 лет назад
Родитель
Сommit
f6500f2ab7

+ 23 - 12
o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/data/ActionUpdateWithWorkCompleted.java

@@ -11,14 +11,17 @@ import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.annotation.ActionLogger;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.executor.ProcessPlatformExecutorFactory;
+import com.x.base.core.project.gson.XGsonBuilder;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
 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.Work;
 import com.x.processplatform.core.entity.content.WorkCompleted;
 import com.x.processplatform.service.processing.Business;
+import com.x.processplatform.service.processing.jaxrs.data.ActionUpdateWithWork.Wo;
 
 class ActionUpdateWithWorkCompleted extends BaseAction {
 
@@ -31,6 +34,11 @@ class ActionUpdateWithWorkCompleted extends BaseAction {
 		Wo wo = new Wo();
 		String executorSeed = null;
 
+		// 防止提交空数据清空data
+		if (null == jsonElement || (!jsonElement.isJsonObject())) {
+			throw new ExceptionNotJsonObject();
+		}
+
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			WorkCompleted workCompleted = emc.fetch(id, WorkCompleted.class,
 					ListTools.toList(WorkCompleted.job_FIELDNAME));
@@ -40,16 +48,11 @@ class ActionUpdateWithWorkCompleted extends BaseAction {
 			executorSeed = workCompleted.getJob();
 		}
 
-		Callable<String> callable = new Callable<String>() {
-			public String call() throws Exception {
+		Callable<ActionResult<Wo>> callable = new Callable<ActionResult<Wo>>() {
+			public ActionResult<Wo> call() throws Exception {
+				ActionResult<Wo> result = new ActionResult<>();
+				Wo wo = new Wo();
 				try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-					/** 防止提交空数据清空data */
-					if (null == jsonElement || (!jsonElement.isJsonObject())) {
-						throw new ExceptionNotJsonObject();
-					}
-					if (jsonElement.getAsJsonObject().entrySet().isEmpty()) {
-						throw new ExceptionEmptyData();
-					}
 					Business business = new Business(emc);
 					WorkCompleted workCompleted = emc.find(id, WorkCompleted.class);
 					if (null == workCompleted) {
@@ -58,11 +61,19 @@ class ActionUpdateWithWorkCompleted extends BaseAction {
 					if (BooleanUtils.isTrue(workCompleted.getMerged())) {
 						throw new ExceptionModifyMerged(workCompleted.getId());
 					}
-					wo.setId(workCompleted.getId());
-					updateData(business, workCompleted, jsonElement);
+
+					JsonElement source = getData(business, workCompleted.getJob());
+
+					JsonElement merge = XGsonBuilder.merge(jsonElement, source);
+
+					/* 先更新title和serial,再更新DataItem,因为旧的DataItem中也有title和serial数据. */
+					updateTitleSerial(business, workCompleted, merge);
+					updateData(business, workCompleted, merge);
 					/* updateTitleSerial 和 updateData 方法内进行了提交 */
+					wo.setId(workCompleted.getId());
 				}
-				return "";
+				result.setData(wo);
+				return result;
 			}
 		};
 

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

@@ -91,6 +91,41 @@ abstract class BaseAction extends StandardJaxrsAction {
 		}
 	}
 
+	// 将data中的Title 和 serial 字段同步到work中
+	void updateTitleSerial(Business business, WorkCompleted workCompleted, JsonElement jsonElement) throws Exception {
+		String title = XGsonBuilder.extractString(jsonElement, WorkCompleted.title_FIELDNAME);
+		String serial = XGsonBuilder.extractString(jsonElement, WorkCompleted.serial_FIELDNAME);
+		// 如果有数据就将数据覆盖到work task taskCompleted read readCompleted review 中
+		if (((null != title) && (!Objects.equals(title, workCompleted.getTitle())))
+				|| ((null != serial) && (!Objects.equals(serial, workCompleted.getSerial())))) {
+			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);
+
+			List<Task> tasks = business.entityManagerContainer().listEqual(Task.class, Task.job_FIELDNAME,
+					workCompleted.getJob());
+			List<TaskCompleted> taskCompleteds = business.entityManagerContainer().listEqual(TaskCompleted.class,
+					TaskCompleted.job_FIELDNAME, workCompleted.getJob());
+			List<Read> reads = business.entityManagerContainer().listEqual(Read.class, Read.job_FIELDNAME,
+					workCompleted.getJob());
+			List<ReadCompleted> readCompleteds = business.entityManagerContainer().listEqual(ReadCompleted.class,
+					ReadCompleted.job_FIELDNAME, workCompleted.getJob());
+			List<Review> reviews = business.entityManagerContainer().listEqual(Review.class, Review.job_FIELDNAME,
+					workCompleted.getJob());
+
+			this.updateTitle(title, workCompleted, tasks, taskCompleteds, reads, readCompleteds, reviews);
+			this.updateSerial(serial, workCompleted, tasks, taskCompleteds, reads, readCompleteds, reviews);
+			// 这里必须先提交掉,不然后面的获取会得到不一致的状态
+			// <openjpa-2.4.3-SNAPSHOT-r422266:1777109 nonfatal user error>
+			// org.apache.openjpa.persistence.InvalidStateException: Opera tion attempted on
+			// a deleted instance.
+			business.entityManagerContainer().commit();
+		}
+	}
+
 	private void updateTitle(String title, Work work, List<Task> tasks, List<TaskCompleted> taskCompleteds,
 			List<Read> reads, List<ReadCompleted> readCompleteds, List<Review> reviews) {
 		if ((null != title) && (!Objects.equals(title, work.getTitle()))) {
@@ -114,6 +149,30 @@ abstract class BaseAction extends StandardJaxrsAction {
 
 	}
 
+	private void updateTitle(String title, WorkCompleted workCompleted, List<Task> tasks,
+			List<TaskCompleted> taskCompleteds, List<Read> reads, List<ReadCompleted> readCompleteds,
+			List<Review> reviews) {
+		if ((null != title) && (!Objects.equals(title, workCompleted.getTitle()))) {
+			workCompleted.setTitle(title);
+			for (Task o : tasks) {
+				o.setTitle(title);
+			}
+			for (TaskCompleted o : taskCompleteds) {
+				o.setTitle(title);
+			}
+			for (Read o : reads) {
+				o.setTitle(title);
+			}
+			for (ReadCompleted o : readCompleteds) {
+				o.setTitle(title);
+			}
+			for (Review o : reviews) {
+				o.setTitle(title);
+			}
+		}
+
+	}
+
 	private void updateSerial(String serial, Work work, List<Task> tasks, List<TaskCompleted> taskCompleteds,
 			List<Read> reads, List<ReadCompleted> readCompleteds, List<Review> reviews) {
 		if ((null != serial) && (!Objects.equals(serial, work.getSerial()))) {
@@ -135,6 +194,28 @@ abstract class BaseAction extends StandardJaxrsAction {
 			}
 		}
 	}
+	
+	private void updateSerial(String serial, WorkCompleted workCompleted, List<Task> tasks, List<TaskCompleted> taskCompleteds,
+			List<Read> reads, List<ReadCompleted> readCompleteds, List<Review> reviews) {
+		if ((null != serial) && (!Objects.equals(serial, workCompleted.getSerial()))) {
+			workCompleted.setSerial(serial);
+			for (Task o : tasks) {
+				o.setSerial(serial);
+			}
+			for (TaskCompleted o : taskCompleteds) {
+				o.setSerial(serial);
+			}
+			for (Read o : reads) {
+				o.setSerial(serial);
+			}
+			for (ReadCompleted o : readCompleteds) {
+				o.setSerial(serial);
+			}
+			for (Review o : reviews) {
+				o.setSerial(serial);
+			}
+		}
+	}
 
 	void updateData(Business business, Work work, JsonElement jsonElement, String... paths) throws Exception {
 		JsonObject jsonObject = jsonElement.getAsJsonObject();