Zhou Rui 5 лет назад
Родитель
Сommit
f354c8c262

+ 3 - 0
.gitignore

@@ -159,3 +159,6 @@ typings/
 
 *.swp
 
+#pom.xml.versionsBackup
+*.versionsBackup
+

+ 44 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/container/EntityManagerContainer.java

@@ -1701,6 +1701,50 @@ public class EntityManagerContainer extends EntityManagerContainerBasic {
 		return list;
 	}
 
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<W> fetchEqualAscPaging(Class<T> clz,
+			WrapCopier<T, W> copier, String equalAttribute, Object equalValue, Integer page, Integer count,
+			String orderAttribute) throws Exception {
+		List<T> os = fetchEqualAscPaging(clz, copier.getCopyFields(), equalAttribute, equalValue, page, count,
+				orderAttribute);
+		return copier.copy(os);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject> List<T> fetchEqualAscPaging(Class<T> clz, String equalAttribute, Object equalValue,
+			Integer page, Integer count, String orderAttribute) throws Exception {
+		return fetchEqualAscPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute, equalValue,
+				page, count, orderAttribute);
+	}
+
+	/* 仅在单一数据库可用 */
+	public <T extends JpaObject, W extends GsonPropertyObject> List<T> fetchEqualAscPaging(Class<T> clz,
+			List<String> fetchAttributes, String equalAttribute, Object equalValue, Integer page, Integer pageSize,
+			String orderAttribute) throws Exception {
+		List<T> list = new ArrayList<>();
+		int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize;
+		int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max;
+		List<String> fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME);
+		EntityManager em = this.get(clz);
+		CriteriaBuilder cb = em.getCriteriaBuilder();
+		CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
+		Root<T> root = cq.from(clz);
+		List<Selection<?>> selections = new ArrayList<>();
+		for (String str : fields) {
+			selections.add(root.get(str));
+		}
+		Predicate p = cb.equal(root.get(equalAttribute), equalValue);
+		cq.multiselect(selections).where(p).orderBy(cb.asc(root.get(orderAttribute)));
+		for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) {
+			T t = clz.newInstance();
+			for (int i = 0; i < fields.size(); i++) {
+				PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i)));
+			}
+			list.add(t);
+		}
+		return list;
+	}
+
 	/* 仅在单一数据库可用 */
 	public <T extends JpaObject, W extends GsonPropertyObject> List<W> fetchEqualDescPaging(Class<T> clz,
 			WrapCopier<T, W> copier, String equalAttribute, Object equalValue, Integer page, Integer count,

+ 11 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/tools/ListTools.java

@@ -587,4 +587,15 @@ public class ListTools {
 		return targetList;
 	}
 
+	public static <E> List<E> paging(List<E> list, Integer page, Integer size) {
+		if (isEmpty(list)) {
+			return list;
+		}
+		int start = (page - 1) * size;
+		int end = page * size;
+		start = Math.min(start, list.size());
+		end = Math.min(end, list.size());
+		return list.subList(start, end);
+	}
+
 }

+ 99 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/record/ActionListWithWorkOrWorkCompletedPaging.java

@@ -0,0 +1,99 @@
+package com.x.processplatform.assemble.surface.jaxrs.record;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+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.bean.WrapCopier;
+import com.x.base.core.project.bean.WrapCopierFactory;
+import com.x.base.core.project.exception.ExceptionAccessDenied;
+import com.x.base.core.project.exception.ExceptionEntityNotExist;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+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.assemble.surface.Business;
+import com.x.processplatform.core.entity.content.Record;
+import com.x.processplatform.core.entity.content.Task;
+import com.x.processplatform.core.entity.content.WorkCompleted;
+
+class ActionListWithWorkOrWorkCompletedPaging extends BaseAction {
+
+	private static Logger logger = LoggerFactory.getLogger(ActionListWithWorkOrWorkCompletedPaging.class);
+
+	ActionResult<List<Wo>> execute(EffectivePerson effectivePerson, String workOrWorkCompleted, Integer page,
+			Integer size) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			ActionResult<List<Wo>> result = new ActionResult<>();
+
+			Business business = new Business(emc);
+
+			if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
+					new ExceptionEntityNotExist(workOrWorkCompleted))) {
+				throw new ExceptionAccessDenied(effectivePerson);
+			}
+
+			String job = business.job().findWithWork(workOrWorkCompleted);
+
+			List<Wo> wos = new ArrayList<>();
+			if (null != job) {
+				wos = emc.fetchEqualAscPaging(Record.class, Wo.copier, Record.job_FIELDNAME, job, page, size,
+						Record.order_FIELDNAME);
+			} else {
+				job = business.job().findWithWorkCompleted(workOrWorkCompleted);
+				WorkCompleted workCompleted = emc.firstEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME, job);
+				if (ListTools.isNotEmpty(workCompleted.getProperties().getRecordList())) {
+					List<Record> os = workCompleted.getProperties().getRecordList();
+					int start = (page - 1) * size;
+					start = Math.min(start, os.size());
+					wos = Wo.copier.copy(os.stream().sorted(Comparator.comparing(Record::getOrder)).skip(start)
+							.limit(size).collect(Collectors.toList()));
+				} else {
+					wos = emc.fetchEqualAscPaging(Record.class, Wo.copier, Record.job_FIELDNAME, job, page, size,
+							Record.order_FIELDNAME);
+				}
+			}
+
+			for (Task task : emc.listEqual(Task.class, Task.job_FIELDNAME, job).stream()
+					.sorted(Comparator.comparing(Task::getStartTime)).collect(Collectors.toList())) {
+				Record record = this.taskToRecord(task);
+				wos.add(Wo.copier.copy(record));
+			}
+
+			result.setData(wos);
+			return result;
+		}
+
+	}
+
+	private Record taskToRecord(Task task) {
+		Record o = new Record();
+		o.setType(Record.TYPE_CURRENTTASK);
+		o.setFromActivity(task.getActivity());
+		o.setFromActivityAlias(task.getActivityAlias());
+		o.setFromActivityName(task.getActivityName());
+		o.setFromActivityToken(task.getActivityToken());
+		o.setFromActivityType(task.getActivityType());
+		o.setPerson(task.getPerson());
+		o.setIdentity(o.getIdentity());
+		o.setUnit(task.getUnit());
+		o.getProperties().setStartTime(task.getStartTime());
+		o.getProperties().setEmpowerFromIdentity(task.getEmpowerFromIdentity());
+		return o;
+	}
+
+	public static class Wo extends Record {
+
+		private static final long serialVersionUID = -7666329770246726197L;
+
+		static WrapCopier<Record, Wo> copier = WrapCopierFactory.wo(Record.class, Wo.class,
+				JpaObject.singularAttributeField(Record.class, true, false), JpaObject.FieldsInvisible);
+
+	}
+
+}

+ 22 - 0
o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/record/RecordAction.java

@@ -49,4 +49,26 @@ public class RecordAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "根据工作或完成工作标识获取记录分页.", action = ActionListWithWorkOrWorkCompletedPaging.class)
+	@GET
+	@Path("list/workorworkcompleted/{workOrWorkCompleted}/paging/{page}/size/{size}")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listWithWorkOrWorkCompletedPaging(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request,
+			@JaxrsParameterDescribe("工作或完成工作标识") @PathParam("workOrWorkCompleted") String workOrWorkCompleted,
+			@JaxrsParameterDescribe("分页") @PathParam("page") Integer page,
+			@JaxrsParameterDescribe("数量") @PathParam("size") Integer size) {
+		ActionResult<List<ActionListWithWorkOrWorkCompletedPaging.Wo>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionListWithWorkOrWorkCompletedPaging().execute(effectivePerson, workOrWorkCompleted, page,
+					size);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
+
 }