Sfoglia il codice sorgente

Merge branch 'wrdp' into 'develop'

Wrdp

See merge request o2oa/o2oa!2316
o2null 5 anni fa
parent
commit
a1eedbc1d7

+ 1 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_query_assemble_designer.java

@@ -18,6 +18,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.content.ReadCompleted","com.x.processplatform.core.entity.element.Process",
 		"com.x.processplatform.core.entity.content.Attachment", "com.x.cms.core.entity.Document",
 		"com.x.cms.core.entity.AppInfo", "com.x.cms.core.entity.CategoryInfo", "com.x.cms.core.entity.Review",
+		"com.x.organization.core.entity.Person", "com.x.organization.core.entity.Unit", "com.x.organization.core.entity.Group",
 		"com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform }, storeJars = {
 				"x_query_core_entity", "x_organization_core_entity", "x_organization_core_express",
 				"x_processplatform_core_entity", "x_cms_core_entity",

+ 1 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_query_assemble_surface.java

@@ -19,6 +19,7 @@ import com.x.base.core.project.annotation.ModuleType;
 		"com.x.processplatform.core.entity.content.WorkCompleted","com.x.processplatform.core.entity.element.Process",
 		"com.x.processplatform.core.entity.content.Attachment", "com.x.cms.core.entity.Document",
 		"com.x.cms.core.entity.Review", "com.x.cms.core.entity.AppInfo", "com.x.cms.core.entity.CategoryInfo",
+		"com.x.organization.core.entity.Person", "com.x.organization.core.entity.Unit", "com.x.organization.core.entity.Group",
 		"com.x.query.dynamic.entity.*" }, storageTypes = { StorageType.processPlatform, StorageType.cms }, storeJars = {
 				"x_query_core_entity", "x_organization_core_entity", "x_organization_core_express",
 				"x_processplatform_core_entity", "x_cms_core_entity",

+ 121 - 0
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/ActionListFilterPaging.java

@@ -0,0 +1,121 @@
+package com.x.organization.assemble.express.jaxrs.person;
+
+import com.google.gson.JsonElement;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.gson.GsonPropertyObject;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.tools.StringTools;
+import com.x.organization.assemble.express.Business;
+import com.x.organization.core.entity.Person;
+import com.x.organization.core.entity.Person_;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.EntityManager;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.List;
+
+class ActionListFilterPaging extends BaseAction {
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, Integer page, Integer size, JsonElement jsonElement) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			ActionResult<List<Wo>> result = new ActionResult<>();
+			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+			Predicate p = this.toFilterPredicate(business, wi);
+			List<Wo> wos = emc.fetchAscPaging(Person.class, Wo.copier, p, page, size, Person.pinyin_FIELDNAME);
+
+			result.setData(wos);
+			result.setCount(emc.count(Person.class, p));
+			return result;
+		}
+	}
+
+	private Predicate toFilterPredicate(Business business,  Wi wi) throws Exception {
+		EntityManager em = business.entityManagerContainer().get(Person.class);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Person> cq = cb.createQuery(Person.class);
+		Root<Person> root = cq.from(Person.class);
+		Predicate p = cb.conjunction();
+		if (StringUtils.isNotBlank(wi.getEmployee())) {
+			p = cb.and(p, cb.equal(root.get(Person_.employee), wi.getEmployee()));
+		}
+		if (StringUtils.isNotBlank(wi.getMobile())) {
+			p = cb.and(p, cb.equal(root.get(Person_.mobile), wi.getMobile()));
+		}
+		if (StringUtils.isNotBlank(wi.getUnique())) {
+			p = cb.and(p, cb.equal(root.get(Person_.unique), wi.getUnique()));
+		}
+		if (StringUtils.isNoneBlank(wi.getName())) {
+			String key = StringTools.escapeSqlLikeKey(wi.getName());
+			p = cb.and(p, cb.like(root.get(Person_.name), "%" + key + "%", StringTools.SQL_ESCAPE_CHAR));
+		}
+
+		return p;
+	}
+
+	public class Wi extends GsonPropertyObject {
+
+		private static final long serialVersionUID = -2991229948693512630L;
+
+		@FieldDescribe("名称")
+		private String name;
+
+		@FieldDescribe("工号")
+		private String employee;
+
+		@FieldDescribe("唯一标识")
+		private String unique;
+
+		@FieldDescribe("手机号.")
+		private String mobile;
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public String getEmployee() {
+			return employee;
+		}
+
+		public void setEmployee(String employee) {
+			this.employee = employee;
+		}
+
+		public String getUnique() {
+			return unique;
+		}
+
+		public void setUnique(String unique) {
+			this.unique = unique;
+		}
+
+		public String getMobile() {
+			return mobile;
+		}
+
+		public void setMobile(String mobile) {
+			this.mobile = mobile;
+		}
+	}
+
+	public static class Wo extends Person {
+
+		private static final long serialVersionUID = 1847108296662273067L;
+
+		static WrapCopier<Person, Wo> copier = WrapCopierFactory.wo(Person.class, Wo.class,
+				JpaObject.singularAttributeField(Person.class, true, true), null);
+
+	}
+}

+ 22 - 6
o2server/x_organization_assemble_express/src/main/java/com/x/organization/assemble/express/jaxrs/person/PersonAction.java

@@ -3,11 +3,7 @@ package com.x.organization.assemble.express.jaxrs.person;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
@@ -16,6 +12,7 @@ import javax.ws.rs.core.MediaType;
 import com.google.gson.JsonElement;
 import com.x.base.core.project.annotation.JaxrsDescribe;
 import com.x.base.core.project.annotation.JaxrsMethodDescribe;
+import com.x.base.core.project.annotation.JaxrsParameterDescribe;
 import com.x.base.core.project.http.ActionResult;
 import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.http.HttpMediaType;
@@ -622,4 +619,23 @@ public class PersonAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-}
+	@JaxrsMethodDescribe(value = "分页查询用户信息.", action = ActionListFilterPaging.class)
+	@POST
+	@Path("list/filter/{page}/size/{size}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listFilterPaging(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+								   @JaxrsParameterDescribe("分页") @PathParam("page") Integer page,
+								   @JaxrsParameterDescribe("数量") @PathParam("size") Integer size, JsonElement jsonElement) {
+		ActionResult<List<ActionListFilterPaging.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListFilterPaging().execute(effectivePerson, page, size, jsonElement);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, jsonElement);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
+}

+ 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();