提交 8df8fd25 编写于 作者: Z zhourui

默认去掉云文件和网络会议,增加form的V2版本

上级 43ad607f
......@@ -26,7 +26,7 @@
"###enable": "是否启用###",
"###cron": "定时cron表达式###"
},
"combine": {
"merge": {
"enable": false,
"cron": "30 30 6 * * ?",
"thresholdDays": 730.0,
......@@ -69,7 +69,7 @@
"###urge": "催办任务设置,发现即将过期时发送提醒消息.###",
"###expire": "将已经过了截至时间的待办标记过期.###",
"###touchDelay": "延时任务设置,定时触发延时任务,当超过延时时间后继续流转.###",
"###combine": "合并任务设置,定时触发合并任务,将已完成工作的Data从Item表中提取合并到WorkCompleted的Data字段中,默认工作完成后2年开始进行合并.###",
"###merge": "合并任务设置,定时触发合并任务,将已完成工作的Data从Item表中提取合并到WorkCompleted的Data字段中,默认工作完成后2年开始进行合并.###",
"###deleteDraft": "清除草稿状态的工作.###",
"###passExpired": "超时工作路由设置.###",
"###touchDetained": "触发长时间未处理的工作.###",
......
......@@ -29,10 +29,10 @@ public class Components extends ConfigObject {
public static final String NAME_TASKCENTER = "TaskCenter";
public static final String NAME_HOMEPAGE = "Homepage";
public static final String NAME_HOTARTICLE = "HotArticle";
public static final String NAME_FILE = "File";
// public static final String NAME_FILE = "File";
public static final String NAME_NOTE = "Note";
public static final String NAME_MEETING = "Meeting";
public static final String NAME_ONLINEMEETING = "OnlineMeeting";
//public static final String NAME_ONLINEMEETING = "OnlineMeeting";
public static final String NAME_ATTENDANCE = "Attendance";
public static final String NAME_FORUM = "Forum";
public static final String NAME_MINDER = "Minder";
......@@ -44,7 +44,7 @@ public class Components extends ConfigObject {
public static List<String> SYSTEM_NAME_NAMES = ListTools.toList(NAME_SETTING, NAME_ORG, NAME_CMSMANAGER,
NAME_APPLICATIONEXPLORER, NAME_PORTALEXPLORER, NAME_DATAEXPLORER, NAME_SERVICEMANAGER, NAME_APPMARKET,
NAME_APPCENTER, NAME_LOGVIEWER, NAME_PROFILE, NAME_BAM, NAME_CMS, NAME_TASKCENTER, NAME_HOMEPAGE,
NAME_HOTARTICLE, NAME_FILE, NAME_NOTE, NAME_MEETING, NAME_ONLINEMEETING, NAME_ATTENDANCE, NAME_FORUM,
NAME_HOTARTICLE, NAME_NOTE, NAME_MEETING, NAME_ATTENDANCE, NAME_FORUM,
NAME_MINDER, NAME_CALENDAR, NAME_ANN, NAME_SEARCH, NAME_IM);
public static final String APPICON_PNG = "appicon.png";
......@@ -87,15 +87,15 @@ public class Components extends ConfigObject {
return new Component(NAME_HOMEPAGE, NAME_HOMEPAGE, "首页", APPICON_PNG, 14, Component.TYPE_SYSTEM);
case NAME_HOTARTICLE:
return new Component(NAME_HOTARTICLE, NAME_HOTARTICLE, "热点", APPICON_PNG, 15, Component.TYPE_SYSTEM);
case NAME_FILE:
return new Component(NAME_FILE, NAME_FILE, "云文件", APPICON_PNG, 16, Component.TYPE_SYSTEM);
// case NAME_FILE:
// return new Component(NAME_FILE, NAME_FILE, "云文件", APPICON_PNG, 16, Component.TYPE_SYSTEM);
case NAME_NOTE:
return new Component(NAME_NOTE, NAME_NOTE, "便签", APPICON_PNG, 17, Component.TYPE_SYSTEM);
case NAME_MEETING:
return new Component(NAME_MEETING, NAME_MEETING, "会议管理", APPICON_PNG, 18, Component.TYPE_SYSTEM);
case NAME_ONLINEMEETING:
return new Component(NAME_ONLINEMEETING, NAME_ONLINEMEETING, "网络会议", APPICON_PNG, 19,
Component.TYPE_SYSTEM);
// case NAME_ONLINEMEETING:
// return new Component(NAME_ONLINEMEETING, NAME_ONLINEMEETING, "网络会议", APPICON_PNG, 19,
// Component.TYPE_SYSTEM);
case NAME_ATTENDANCE:
return new Component(NAME_ATTENDANCE, NAME_ATTENDANCE, "考勤管理", APPICON_PNG, 20, Component.TYPE_SYSTEM);
case NAME_FORUM:
......@@ -133,10 +133,10 @@ public class Components extends ConfigObject {
o.systems.add(systemComponent(NAME_TASKCENTER));
o.systems.add(systemComponent(NAME_HOMEPAGE));
o.systems.add(systemComponent(NAME_HOTARTICLE));
o.systems.add(systemComponent(NAME_FILE));
// o.systems.add(systemComponent(NAME_FILE));
o.systems.add(systemComponent(NAME_NOTE));
o.systems.add(systemComponent(NAME_MEETING));
o.systems.add(systemComponent(NAME_ONLINEMEETING));
// o.systems.add(systemComponent(NAME_ONLINEMEETING));
o.systems.add(systemComponent(NAME_ATTENDANCE));
o.systems.add(systemComponent(NAME_FORUM));
o.systems.add(systemComponent(NAME_MINDER));
......
......@@ -69,7 +69,7 @@ public class ProcessPlatform extends ConfigObject {
this.urge = new Urge();
this.expire = new Expire();
this.touchDelay = new TouchDelay();
this.combine = new Combine();
this.merge = new Merge();
this.touchDetained = new TouchDetained();
this.deleteDraft = new DeleteDraft();
this.passExpired = new PassExpired();
......@@ -146,7 +146,7 @@ public class ProcessPlatform extends ConfigObject {
private TouchDelay touchDelay;
@FieldDescribe("合并任务设置,定时触发合并任务,将已完成工作的Data从Item表中提取合并到WorkCompleted的Data字段中,默认工作完成后2年开始进行合并.")
private Combine combine;
private Merge merge;
@FieldDescribe("清除草稿状态的工作.")
private DeleteDraft deleteDraft;
......@@ -211,8 +211,8 @@ public class ProcessPlatform extends ConfigObject {
return this.logLongDetained == null ? new LogLongDetained() : this.logLongDetained;
}
public Combine getCombine() {
return this.combine == null ? new Combine() : this.combine;
public Merge getMerge() {
return this.merge == null ? new Merge() : this.merge;
}
public Press getPress() {
......@@ -328,10 +328,10 @@ public class ProcessPlatform extends ConfigObject {
}
public static class Combine extends ConfigObject {
public static class Merge extends ConfigObject {
public static Combine defaultInstance() {
Combine o = new Combine();
public static Merge defaultInstance() {
Merge o = new Merge();
return o;
}
......
......@@ -82,7 +82,7 @@ public class MappingExecuteQueue extends AbstractQueue<String> {
}
private Data data(Business business, WorkCompleted workCompleted) throws Exception {
if (BooleanUtils.isTrue(workCompleted.getMerged()) && (null!= workCompleted.getProperties().getData())) {
if (BooleanUtils.isTrue(workCompleted.getMerged()) && (null != workCompleted.getProperties().getData())) {
return workCompleted.getProperties().getData();
}
List<Item> items = business.entityManagerContainer().listEqualAndEqual(Item.class, Item.bundle_FIELDNAME,
......
......@@ -20,15 +20,14 @@ import com.x.base.core.entity.dataitem.DataItemConverter;
import com.x.base.core.entity.dataitem.ItemCategory;
import com.x.base.core.project.exception.ExceptionAccessDenied;
import com.x.base.core.project.exception.ExceptionEntityNotExist;
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.WrapInteger;
import com.x.base.core.project.tools.ListTools;
import com.x.processplatform.assemble.designer.Business;
import com.x.processplatform.core.entity.content.Data;
import com.x.processplatform.core.entity.content.Record;
import com.x.processplatform.core.entity.content.WorkCompleted;
import com.x.processplatform.core.entity.content.Data;
import com.x.processplatform.core.entity.content.WorkCompleted_;
import com.x.processplatform.core.entity.element.Application;
import com.x.processplatform.core.entity.element.Process;
......
......@@ -188,6 +188,8 @@ abstract class BaseAction extends StandardJaxrsAction {
public static class AbstractWo extends GsonPropertyObject {
private String id;
private WoForm form;
private Map<String, WoForm> relatedFormMap = new HashMap<>();
......@@ -218,6 +220,15 @@ abstract class BaseAction extends StandardJaxrsAction {
this.relatedScriptMap = relatedScriptMap;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
}
\ No newline at end of file
......@@ -141,23 +141,78 @@ public class FormAction extends StandardJaxrsAction {
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
// @JaxrsMethodDescribe(value = "V2根据工作或完成工作标识获取表单,合并关联表单和关联脚本输出.", action = V2GetWithWorkOrWorkCompleted.class)
// @GET
// @Path("v2/workorworkcompleted/{workOrWorkCompleted}")
// @Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
// @Consumes(MediaType.APPLICATION_JSON)
// public void V2GetWithWorkOrWorkCompleted(@Suspended final AsyncResponse asyncResponse,
// @Context HttpServletRequest request,
// @JaxrsParameterDescribe("工作或完成工作标识") @PathParam("workOrWorkCompleted") String workOrWorkCompleted) {
// ActionResult<V2GetWithWorkOrWorkCompleted.Wo> result = new ActionResult<>();
// EffectivePerson effectivePerson = this.effectivePerson(request);
// try {
// result = new V2GetWithWorkOrWorkCompleted().execute(effectivePerson, workOrWorkCompleted);
// } catch (Exception e) {
// logger.error(e, effectivePerson, request, null);
// result.error(e);
// }
// asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
// }
@JaxrsMethodDescribe(value = "查询表单,如果有表单那么返回表单id,如果使用的是combine的表单直接返回内容.", action = V2LookupWorkOrWorkCompleted.class)
@GET
@Path("v2/lookup/workorworkcompleted/{workOrWorkCompleted}")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void V2LookupWorkOrWorkCompleted(@Suspended final AsyncResponse asyncResponse,
@Context HttpServletRequest request,
@JaxrsParameterDescribe("工作或已完成工作标识") @PathParam("workOrWorkCompleted") String workOrWorkCompleted) {
ActionResult<V2LookupWorkOrWorkCompleted.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new V2LookupWorkOrWorkCompleted().execute(effectivePerson, workOrWorkCompleted);
} catch (Exception e) {
logger.error(e, effectivePerson, request, null);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "查询移动端表单,如果有表单那么返回表单id,如果使用的是combine的表单直接返回内容.", action = V2LookupWorkOrWorkCompletedMobile.class)
@GET
@Path("v2/lookup/workorworkcompleted/{workOrWorkCompleted}/mobile")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void V2LookupWorkOrWorkCompletedMobile(@Suspended final AsyncResponse asyncResponse,
@Context HttpServletRequest request,
@JaxrsParameterDescribe("工作或已完成工作标识") @PathParam("workOrWorkCompleted") String workOrWorkCompleted) {
ActionResult<V2LookupWorkOrWorkCompletedMobile.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new V2LookupWorkOrWorkCompletedMobile().execute(effectivePerson, workOrWorkCompleted);
} catch (Exception e) {
logger.error(e, effectivePerson, request, null);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "获取表单.", action = V2Get.class)
@GET
@Path("v2/{id}")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void V2Get(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
ActionResult<V2Get.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new V2Get().execute(effectivePerson, id);
} catch (Exception e) {
logger.error(e, effectivePerson, request, null);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
@JaxrsMethodDescribe(value = "获取表单Mobile.", action = V2GetMobile.class)
@GET
@Path("v2/{id}/mobile")
@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
@Consumes(MediaType.APPLICATION_JSON)
public void V2GetMobile(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
@JaxrsParameterDescribe("标识") @PathParam("id") String id) {
ActionResult<V2GetMobile.Wo> result = new ActionResult<>();
EffectivePerson effectivePerson = this.effectivePerson(request);
try {
result = new V2GetMobile().execute(effectivePerson, id);
} catch (Exception e) {
logger.error(e, effectivePerson, request, null);
result.error(e);
}
asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
}
}
\ No newline at end of file
package com.x.processplatform.assemble.surface.jaxrs.form;
import java.util.Map.Entry;
import java.util.Objects;
import org.apache.commons.lang3.StringUtils;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
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.processplatform.assemble.surface.Business;
import com.x.processplatform.core.entity.content.WorkCompletedProperties;
import com.x.processplatform.core.entity.element.Form;
import com.x.processplatform.core.entity.element.Script;
class V2Get extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(V2Get.class);
ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>();
Business business = new Business(emc);
Form form = emc.find(id, Form.class);
if (Objects.isNull(form)) {
throw new ExceptionEntityNotExist(id, Form.class);
}
Wo wo = new Wo();
wo.setForm(toWoFormDataOrMobileData(form));
related(business, wo, form);
result.setData(wo);
return result;
}
}
private void related(Business business, Wo wo, Form form) throws Exception {
if (StringUtils.isNotBlank(form.getData())) {
for (String relatedFormId : form.getProperties().getRelatedFormList()) {
Form relatedForm = business.form().pick(relatedFormId);
if (null != relatedForm) {
wo.getRelatedFormMap().put(relatedFormId, toWoFormDataOrMobileData(relatedForm));
}
}
} else {
for (String mobileRelatedFormId : form.getProperties().getMobileRelatedFormList()) {
Form mobileRelatedForm = business.form().pick(mobileRelatedFormId);
if (null != mobileRelatedForm) {
wo.getRelatedFormMap().put(mobileRelatedFormId, toWoFormMobileDataOrData(mobileRelatedForm));
}
}
}
relatedScript(business, wo, form);
}
protected void relatedScript(Business business, AbstractWo wo, Form form) throws Exception {
for (Entry<String, String> entry : form.getProperties().getRelatedScriptMap().entrySet()) {
switch (entry.getValue()) {
case WorkCompletedProperties.Script.TYPE_PROCESSPLATFORM:
Script relatedScript = business.script().pick(entry.getKey());
if (null != relatedScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedScript));
}
break;
case WorkCompletedProperties.Script.TYPE_CMS:
com.x.cms.core.entity.element.Script relatedCmsScript = business.cms().script().pick(entry.getKey());
if (null != relatedCmsScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedCmsScript));
}
break;
case WorkCompletedProperties.Script.TYPE_PORTAL:
com.x.portal.core.entity.Script relatedPortalScript = business.portal().script().pick(entry.getKey());
if (null != relatedPortalScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedPortalScript));
}
break;
default:
break;
}
}
}
public static class Wo extends AbstractWo {
}
}
\ No newline at end of file
package com.x.processplatform.assemble.surface.jaxrs.form;
import java.util.Objects;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
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.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.Audit;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.PropertyTools;
import com.x.processplatform.assemble.surface.Business;
import com.x.processplatform.assemble.surface.jaxrs.form.ActionGetWithWorkOrWorkCompletedMobile.Wo;
import com.x.processplatform.assemble.surface.jaxrs.form.BaseAction.AbstractWo;
import com.x.processplatform.core.entity.content.Work;
import com.x.processplatform.core.entity.content.WorkCompleted;
import com.x.processplatform.core.entity.content.WorkCompletedProperties;
import com.x.processplatform.core.entity.element.Activity;
import com.x.processplatform.core.entity.element.Form;
import com.x.processplatform.core.entity.element.Script;
class V2GetMobile extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(V2GetMobile.class);
ActionResult<Wo> execute(EffectivePerson effectivePerson, String id) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>();
Business business = new Business(emc);
Form form = emc.find(id, Form.class);
if (Objects.isNull(form)) {
throw new ExceptionEntityNotExist(id, Form.class);
}
Wo wo = new Wo();
wo.setForm(toWoFormMobileDataOrData(form));
related(business, wo, form);
result.setData(wo);
return result;
}
}
private void related(Business business, Wo wo, Form form) throws Exception {
if (StringUtils.isNotBlank(form.getMobileData())) {
for (String mobileRelatedFormId : form.getProperties().getMobileRelatedFormList()) {
Form relatedForm = business.form().pick(mobileRelatedFormId);
if (null != relatedForm) {
wo.getRelatedFormMap().put(mobileRelatedFormId, toWoFormMobileDataOrData(relatedForm));
}
}
} else {
for (String relatedFormId : form.getProperties().getRelatedFormList()) {
Form relatedForm = business.form().pick(relatedFormId);
if (null != relatedForm) {
wo.getRelatedFormMap().put(relatedFormId, toWoFormDataOrMobileData(relatedForm));
}
}
}
relatedScript(business, wo, form);
}
protected void relatedScript(Business business, AbstractWo wo, Form form) throws Exception {
for (Entry<String, String> entry : form.getProperties().getMobileRelatedScriptMap().entrySet()) {
switch (entry.getValue()) {
case WorkCompletedProperties.Script.TYPE_PROCESSPLATFORM:
Script relatedScript = business.script().pick(entry.getKey());
if (null != relatedScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedScript));
}
break;
case WorkCompletedProperties.Script.TYPE_CMS:
com.x.cms.core.entity.element.Script relatedCmsScript = business.cms().script().pick(entry.getKey());
if (null != relatedCmsScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedCmsScript));
}
break;
case WorkCompletedProperties.Script.TYPE_PORTAL:
com.x.portal.core.entity.Script relatedPortalScript = business.portal().script().pick(entry.getKey());
if (null != relatedPortalScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedPortalScript));
}
break;
default:
break;
}
}
}
public static class Wo extends AbstractWo {
}
}
\ No newline at end of file
......@@ -4,14 +4,12 @@ import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
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.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.Audit;
import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.PropertyTools;
......@@ -23,56 +21,42 @@ import com.x.processplatform.core.entity.element.Activity;
import com.x.processplatform.core.entity.element.Form;
import com.x.processplatform.core.entity.element.Script;
class V2FindWithWorkOrWorkCompleted2 extends BaseAction {
class V2LookupWorkOrWorkCompleted extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(V2FindWithWorkOrWorkCompleted2.class);
private static Logger logger = LoggerFactory.getLogger(V2LookupWorkOrWorkCompleted.class);
ActionResult<JsonElement> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
Audit audit = logger.audit(effectivePerson);
ActionResult<JsonElement> result = new ActionResult<>();
ActionResult<Wo> result = new ActionResult<>();
Business business = new Business(emc);
if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
new ExceptionEntityNotExist(workOrWorkCompleted))) {
throw new ExceptionAccessDenied(effectivePerson);
}
JsonElement wo = null;
Wo wo = new Wo();
Work work = emc.find(workOrWorkCompleted, Work.class);
if (null != work) {
wo = gson.toJsonTree(this.work(business, work));
this.work(business, work, wo);
} else {
wo = gson.toJsonTree(this.workCompleted(business, emc.flag(workOrWorkCompleted, WorkCompleted.class)));
this.workCompleted(business, emc.flag(workOrWorkCompleted, WorkCompleted.class), wo);
}
audit.log(null, "查看");
result.setData(wo);
return result;
}
}
private Wo work(Business business, Work work) throws Exception {
Wo wo = new Wo();
private void work(Business business, Work work, Wo wo) throws Exception {
String id = work.getForm();
if (StringUtils.isEmpty(id)) {
if (!StringUtils.isEmpty(id)) {
wo.setId(id);
} else {
Activity activity = business.getActivity(work);
id = PropertyTools.getOrElse(activity, Activity.form_FIELDNAME, String.class, "");
}
if (StringUtils.isNotEmpty(id)) {
Form form = business.form().pick(id);
if (null != form) {
wo.setForm(toWoFormDataOrMobileData(form));
related(business, wo, form);
}
}
return wo;
wo.setId(id);
}
private Wo workCompleted(Business business, WorkCompleted workCompleted) throws Exception {
Wo wo = new Wo();
private void workCompleted(Business business, WorkCompleted workCompleted, Wo wo) throws Exception {
// 先使用当前库的表单,如果不存在使用储存的表单.
if (StringUtils.isNotEmpty(workCompleted.getForm())) {
Form form = business.form().pick(workCompleted.getForm());
......@@ -92,7 +76,6 @@ class V2FindWithWorkOrWorkCompleted2 extends BaseAction {
}
workCompleted.getProperties().getRelatedScriptList().stream()
.forEach(o -> wo.getRelatedScriptMap().put(o.getId(), toWoScript(o)));
return wo;
}
private void related(Business business, Wo wo, Form form) throws Exception {
......
package com.x.processplatform.assemble.surface.jaxrs.form;
import java.util.Map.Entry;
import org.apache.commons.lang3.StringUtils;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
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.PropertyTools;
import com.x.processplatform.assemble.surface.Business;
import com.x.processplatform.assemble.surface.jaxrs.form.ActionGetWithWorkOrWorkCompletedMobile.Wo;
import com.x.processplatform.assemble.surface.jaxrs.form.BaseAction.AbstractWo;
import com.x.processplatform.core.entity.content.Work;
import com.x.processplatform.core.entity.content.WorkCompleted;
import com.x.processplatform.core.entity.content.WorkCompletedProperties;
import com.x.processplatform.core.entity.element.Activity;
import com.x.processplatform.core.entity.element.Form;
import com.x.processplatform.core.entity.element.Script;
class V2LookupWorkOrWorkCompletedMobile extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(V2LookupWorkOrWorkCompletedMobile.class);
ActionResult<Wo> execute(EffectivePerson effectivePerson, String workOrWorkCompleted) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>();
Business business = new Business(emc);
if (!business.readableWithWorkOrWorkCompleted(effectivePerson, workOrWorkCompleted,
new ExceptionEntityNotExist(workOrWorkCompleted))) {
throw new ExceptionAccessDenied(effectivePerson);
}
Wo wo = new Wo();
Work work = emc.find(workOrWorkCompleted, Work.class);
if (null != work) {
this.work(business, work, wo);
} else {
this.workCompleted(business, emc.flag(workOrWorkCompleted, WorkCompleted.class), wo);
}
result.setData(wo);
return result;
}
}
private void work(Business business, Work work, Wo wo) throws Exception {
String id = work.getForm();
if (!StringUtils.isEmpty(id)) {
wo.setId(id);
} else {
Activity activity = business.getActivity(work);
id = PropertyTools.getOrElse(activity, Activity.form_FIELDNAME, String.class, "");
}
wo.setId(id);
}
private void workCompleted(Business business, WorkCompleted workCompleted, Wo wo) throws Exception {
// 先使用当前库的表单,如果不存在使用储存的表单.
if (StringUtils.isNotEmpty(workCompleted.getForm())) {
Form form = business.form().pick(workCompleted.getForm());
if (null != form) {
wo.setForm(toWoFormDataOrMobileData(form));
related(business, wo, form);
}
} else if (null != workCompleted.getProperties().getForm()) {
wo.setForm(toWoFormDataOrMobileData(workCompleted.getProperties().getForm()));
if (StringUtils.isNotBlank(workCompleted.getProperties().getForm().getData())) {
workCompleted.getProperties().getRelatedFormList()
.forEach(o -> wo.getRelatedFormMap().put(o.getId(), toWoFormDataOrMobileData(o)));
} else {
workCompleted.getProperties().getMobileRelatedFormList()
.forEach(o -> wo.getRelatedFormMap().put(o.getId(), toWoFormMobileDataOrData(o)));
}
}
workCompleted.getProperties().getRelatedScriptList().stream()
.forEach(o -> wo.getRelatedScriptMap().put(o.getId(), toWoScript(o)));
}
private void related(Business business, Wo wo, Form form) throws Exception {
if (StringUtils.isNotBlank(form.getMobileData())) {
for (String mobileRelatedFormId : form.getProperties().getMobileRelatedFormList()) {
Form relatedForm = business.form().pick(mobileRelatedFormId);
if (null != relatedForm) {
wo.getRelatedFormMap().put(mobileRelatedFormId, toWoFormMobileDataOrData(relatedForm));
}
}
} else {
for (String relatedFormId : form.getProperties().getRelatedFormList()) {
Form relatedForm = business.form().pick(relatedFormId);
if (null != relatedForm) {
wo.getRelatedFormMap().put(relatedFormId, toWoFormDataOrMobileData(relatedForm));
}
}
}
relatedScript(business, wo, form);
}
protected void relatedScript(Business business, AbstractWo wo, Form form) throws Exception {
for (Entry<String, String> entry : form.getProperties().getMobileRelatedScriptMap().entrySet()) {
switch (entry.getValue()) {
case WorkCompletedProperties.Script.TYPE_PROCESSPLATFORM:
Script relatedScript = business.script().pick(entry.getKey());
if (null != relatedScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedScript));
}
break;
case WorkCompletedProperties.Script.TYPE_CMS:
com.x.cms.core.entity.element.Script relatedCmsScript = business.cms().script().pick(entry.getKey());
if (null != relatedCmsScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedCmsScript));
}
break;
case WorkCompletedProperties.Script.TYPE_PORTAL:
com.x.portal.core.entity.Script relatedPortalScript = business.portal().script().pick(entry.getKey());
if (null != relatedPortalScript) {
wo.getRelatedScriptMap().put(entry.getKey(), toWoScript(relatedPortalScript));
}
break;
default:
break;
}
}
}
public static class Wo extends AbstractWo {
}
}
\ No newline at end of file
......@@ -166,18 +166,6 @@ class ActionGetWithWorkOrWorkCompleted extends BaseAction {
for (WoTask task : wo.getTaskList()) {
if (effectivePerson.isPerson(task.getPerson())) {
wo.setCurrentTaskIndex(loop);
// /* 发送抢办信号 */
// if (Objects.equals(ManualMode.grab, wo.getActivity().getManualMode())) {
// CompletableFuture.runAsync(() -> {
// try {
// ThisApplication.context().applications().getQuery(
// x_processplatform_service_processing.class,
// Applications.joinQueryUri("task", task.getId(), "grab"));
// } catch (Exception e) {
// logger.error(e);
// }
// });
// }
break;
}
loop++;
......
......@@ -16,6 +16,11 @@ import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.apache.commons.lang3.StringUtils;
import org.apache.openjpa.persistence.Persistent;
import org.apache.openjpa.persistence.jdbc.Index;
import org.apache.openjpa.persistence.jdbc.Strategy;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.entity.SliceJpaObject;
import com.x.base.core.entity.annotation.CheckPersist;
......@@ -26,12 +31,6 @@ import com.x.base.core.project.tools.DateTools;
import com.x.base.core.project.tools.StringTools;
import com.x.processplatform.core.entity.PersistenceProperties;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.openjpa.persistence.Persistent;
import org.apache.openjpa.persistence.jdbc.Index;
import org.apache.openjpa.persistence.jdbc.Strategy;
@Entity
@ContainerEntity(dumpSize = 100, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
@Table(name = PersistenceProperties.Content.WorkCompleted.table, uniqueConstraints = {
......@@ -155,10 +154,6 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
}
}
public Boolean getMerged() {
return BooleanUtils.isTrue(merged);
}
public static final String job_FIELDNAME = "job";
@FieldDescribe("工作")
@Column(length = JpaObject.length_id, name = ColumnNamePrefix + job_FIELDNAME)
......@@ -375,7 +370,7 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
private WorkCompletedProperties properties;
public static final String merged_FIELDNAME = "merged";
@FieldDescribe("业务数据是否从item表中合并至data字段")
@FieldDescribe("合并数据")
@Column(name = ColumnNamePrefix + merged_FIELDNAME)
@Index(name = TABLE + IndexNameMiddle + merged_FIELDNAME)
@CheckPersist(allowEmpty = true)
......@@ -1047,6 +1042,10 @@ public class WorkCompleted extends SliceJpaObject implements ProjectionInterface
this.timeValue02 = timeValue02;
}
public Boolean getMerged() {
return merged;
}
public void setMerged(Boolean merged) {
this.merged = merged;
}
......
......@@ -9,6 +9,15 @@ import com.x.processplatform.core.entity.element.Form;
public class WorkCompletedProperties extends JsonProperties {
@FieldDescribe("合并已办对象")
private List<TaskCompleted> taskCompletedList = new ArrayList<>();
@FieldDescribe("合并已阅对象")
private List<ReadCompleted> readCompletedList = new ArrayList<>();
@FieldDescribe("合并参阅对象")
private List<Review> reviewList = new ArrayList<>();
@FieldDescribe("合并记录对象")
private List<Record> recordList = new ArrayList<>();
......@@ -108,6 +117,30 @@ public class WorkCompletedProperties extends JsonProperties {
this.mobileRelatedScriptList = mobileRelatedScriptList;
}
public List<TaskCompleted> getTaskCompletedList() {
return taskCompletedList;
}
public void setTaskCompletedList(List<TaskCompleted> taskCompletedList) {
this.taskCompletedList = taskCompletedList;
}
public List<ReadCompleted> getReadCompletedList() {
return readCompletedList;
}
public void setReadCompletedList(List<ReadCompleted> readCompletedList) {
this.readCompletedList = readCompletedList;
}
public List<Review> getReviewList() {
return reviewList;
}
public void setReviewList(List<Review> reviewList) {
this.reviewList = reviewList;
}
public static class Script {
public static final String TYPE_PROCESSPLATFORM = "processPlatform";
......
package com.x.processplatform.service.processing;
import org.apache.commons.lang3.BooleanUtils;
import com.x.base.core.project.Context;
import com.x.base.core.project.cache.CacheManager;
import com.x.base.core.project.config.Config;
......@@ -8,17 +10,15 @@ import com.x.base.core.project.message.MessageConnector;
import com.x.processplatform.service.processing.processor.embed.SyncEmbedQueue;
import com.x.processplatform.service.processing.processor.invoke.SyncJaxrsInvokeQueue;
import com.x.processplatform.service.processing.processor.invoke.SyncJaxwsInvokeQueue;
import com.x.processplatform.service.processing.schedule.Combine;
import com.x.processplatform.service.processing.schedule.DeleteDraft;
import com.x.processplatform.service.processing.schedule.Expire;
import com.x.processplatform.service.processing.schedule.LogLongDetained;
import com.x.processplatform.service.processing.schedule.Merge;
import com.x.processplatform.service.processing.schedule.PassExpired;
import com.x.processplatform.service.processing.schedule.TouchDelay;
import com.x.processplatform.service.processing.schedule.TouchDetained;
import com.x.processplatform.service.processing.schedule.Urge;
import org.apache.commons.lang3.BooleanUtils;
public class ThisApplication {
private ThisApplication() {
......@@ -51,8 +51,8 @@ public class ThisApplication {
context().startQueue(syncJaxrsInvokeQueue);
context().startQueue(syncJaxwsInvokeQueue);
context().startQueue(syncEmbedQueue);
if (BooleanUtils.isTrue(Config.processPlatform().getCombine().getEnable())) {
context.schedule(Combine.class, Config.processPlatform().getCombine().getCron());
if (BooleanUtils.isTrue(Config.processPlatform().getMerge().getEnable())) {
context.schedule(Merge.class, Config.processPlatform().getMerge().getCron());
}
if (BooleanUtils.isTrue(Config.processPlatform().getDeleteDraft().getEnable())) {
context.schedule(DeleteDraft.class, Config.processPlatform().getDeleteDraft().getCron());
......
......@@ -5,7 +5,6 @@ import java.util.concurrent.Callable;
import org.apache.commons.lang3.BooleanUtils;
import com.google.gson.Gson;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.dataitem.ItemPrimitiveType;
......@@ -26,7 +25,7 @@ import com.x.query.core.entity.Item;
class ActionUpdateWithWorkCompletedPrimitivePath0 extends BaseAction {
/*
* 更新workCompletedPath0 基本类型数据
* */
*/
@ActionLogger
private static Logger logger = LoggerFactory.getLogger(ActionUpdateWithWorkCompletedPrimitivePath0.class);
......@@ -38,7 +37,8 @@ class ActionUpdateWithWorkCompletedPrimitivePath0 extends BaseAction {
String executorSeed = null;
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
WorkCompleted workCompleted = emc.fetch(id, WorkCompleted.class, ListTools.toList(WorkCompleted.job_FIELDNAME));
WorkCompleted workCompleted = emc.fetch(id, WorkCompleted.class,
ListTools.toList(WorkCompleted.job_FIELDNAME));
if (null == workCompleted) {
throw new ExceptionEntityNotExist(id, WorkCompleted.class);
}
......@@ -63,25 +63,26 @@ class ActionUpdateWithWorkCompletedPrimitivePath0 extends BaseAction {
if (1 == exists.size()) {
Item existsItem = exists.get(0);
if (existsItem.getItemType().equals(ItemType.p) || existsItem.getItemType().equals(ItemType.n)) {
if (existsItem.getItemType().equals(ItemType.p)
|| existsItem.getItemType().equals(ItemType.n)) {
if (existsItem.getItemPrimitiveType().equals(ItemPrimitiveType.s)) {
//字符
// 字符
existsItem.setStringShortValue(val);
}
if (existsItem.getItemPrimitiveType().equals(ItemPrimitiveType.b)) {
//Boolean
// Boolean
existsItem.setBooleanValue(Boolean.parseBoolean(val));
}
if (existsItem.getItemPrimitiveType().equals(ItemPrimitiveType.n)) {
//number
// number
existsItem.setNumberValue(Double.parseDouble(val));
}
if (existsItem.getItemPrimitiveType().equals(ItemPrimitiveType.u)) {
//这是啥?问狗哥去吧。
// 这是啥?问狗哥去吧。
existsItem.setStringShortValue(val);
}
business.entityManagerContainer().beginTransaction(Item.class);
......
......@@ -6,14 +6,14 @@ import com.x.base.core.project.http.ActionResult;
import com.x.base.core.project.http.EffectivePerson;
import com.x.base.core.project.jaxrs.WrapBoolean;
import com.x.processplatform.service.processing.ThisApplication;
import com.x.processplatform.service.processing.schedule.Combine;
import com.x.processplatform.service.processing.schedule.Merge;
class ActionCombine extends BaseAction {
ActionResult<Wo> execute(EffectivePerson effectivePerson) throws Exception {
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
ActionResult<Wo> result = new ActionResult<>();
ThisApplication.context().scheduleLocal(Combine.class, 1);
ThisApplication.context().scheduleLocal(Merge.class, 1);
Wo wo = new Wo();
wo.setValue(true);
result.setData(wo);
......
......@@ -5,6 +5,7 @@ import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.stream.Collectors;
import com.google.gson.JsonElement;
import com.x.base.core.container.EntityManagerContainer;
......@@ -22,7 +23,10 @@ import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.tools.ListTools;
import com.x.processplatform.core.entity.content.Data;
import com.x.processplatform.core.entity.content.DocumentVersion;
import com.x.processplatform.core.entity.content.ReadCompleted;
import com.x.processplatform.core.entity.content.Record;
import com.x.processplatform.core.entity.content.Review;
import com.x.processplatform.core.entity.content.TaskCompleted;
import com.x.processplatform.core.entity.content.WorkCompleted;
import com.x.processplatform.core.entity.content.WorkLog;
import com.x.processplatform.service.processing.Business;
......@@ -66,14 +70,17 @@ class ActionCombine extends BaseAction {
workCompleted = emc.find(id, WorkCompleted.class);
Business business = new Business(emc);
if (null != workCompleted) {
emc.beginTransaction(WorkCompleted.class);
List<Item> items = mergeItem(business, workCompleted);
List<WorkLog> workLogs = mergeWorkLog(business, workCompleted);
List<Record> records = mergeRecord(business, workCompleted);
List<DocumentVersion> documentVersions = listDocumentVersion(business, workCompleted);
List<Item> items = combineItem(business, workCompleted);
List<TaskCompleted> taskCompleteds = combineTaskCompleted(business, workCompleted);
List<ReadCompleted> readCompleteds = combineReadCompleted(business, workCompleted);
List<Review> reviews = combineReview(business, workCompleted);
List<WorkLog> workLogs = combineWorkLog(business, workCompleted);
List<Record> records = combineRecord(business, workCompleted);
emc.beginTransaction(WorkCompleted.class);
workCompleted.setMerged(true);
emc.commit();
this.remove(business, items, workLogs, records,documentVersions);
this.remove(business, items, workLogs, records, documentVersions);
logger.print("已完成工作合并, id: {}, title:{}, sequence:{}.", workCompleted.getId(),
workCompleted.getTitle(), workCompleted.getSequence());
}
......@@ -87,8 +94,8 @@ class ActionCombine extends BaseAction {
return result;
}
private void remove(Business business, List<Item> items, List<WorkLog> workLogs, List<Record> records,List<DocumentVersion> documentVersions)
throws Exception {
private void remove(Business business, List<Item> items, List<WorkLog> workLogs, List<Record> records,
List<DocumentVersion> documentVersions) throws Exception {
EntityManagerContainer emc = business.entityManagerContainer();
if (!items.isEmpty()) {
emc.beginTransaction(Item.class);
......@@ -108,7 +115,7 @@ class ActionCombine extends BaseAction {
emc.remove(o, CheckRemoveType.all);
}
}
if (!documentVersions.isEmpty()) {
emc.beginTransaction(DocumentVersion.class);
for (DocumentVersion o : documentVersions) {
......@@ -118,12 +125,45 @@ class ActionCombine extends BaseAction {
emc.commit();
}
private List<DocumentVersion> listDocumentVersion(Business business, WorkCompleted workCompleted) throws Exception {
return business.entityManagerContainer().listEqual(DocumentVersion.class, DocumentVersion.job_FIELDNAME,
private List<TaskCompleted> combineTaskCompleted(Business business, WorkCompleted workCompleted)
throws Exception {
List<TaskCompleted> list = business.entityManagerContainer().listEqual(TaskCompleted.class,
TaskCompleted.job_FIELDNAME, workCompleted.getJob());
list = list.stream()
.sorted(Comparator.comparing(TaskCompleted::getCreateTime, Comparator.nullsLast(Date::compareTo)))
.collect(Collectors.toList());
workCompleted.getProperties().setTaskCompletedList(list);
return list;
}
private List<ReadCompleted> combineReadCompleted(Business business, WorkCompleted workCompleted)
throws Exception {
List<ReadCompleted> list = business.entityManagerContainer().listEqual(ReadCompleted.class,
ReadCompleted.job_FIELDNAME, workCompleted.getJob());
list = list.stream()
.sorted(Comparator.comparing(ReadCompleted::getCreateTime, Comparator.nullsLast(Date::compareTo)))
.collect(Collectors.toList());
workCompleted.getProperties().setReadCompletedList(list);
return list;
}
private List<Review> combineReview(Business business, WorkCompleted workCompleted) throws Exception {
List<Review> list = business.entityManagerContainer().listEqual(Review.class, Review.job_FIELDNAME,
workCompleted.getJob());
list = list.stream()
.sorted(Comparator.comparing(Review::getCreateTime, Comparator.nullsLast(Date::compareTo)))
.collect(Collectors.toList());
workCompleted.getProperties().setReviewList(list);
return list;
}
private List<Item> mergeItem(Business business, WorkCompleted workCompleted) throws Exception {
private List<DocumentVersion> listDocumentVersion(Business business, WorkCompleted workCompleted)
throws Exception {
return business.entityManagerContainer().listEqual(DocumentVersion.class, DocumentVersion.job_FIELDNAME,
workCompleted.getJob());
}
private List<Item> combineItem(Business business, WorkCompleted workCompleted) throws Exception {
List<Item> list = business.entityManagerContainer().listEqualAndEqual(Item.class, Item.bundle_FIELDNAME,
workCompleted.getJob(), Item.itemCategory_FIELDNAME, ItemCategory.pp);
DataItemConverter<Item> converter = new DataItemConverter<Item>(Item.class);
......@@ -132,7 +172,7 @@ class ActionCombine extends BaseAction {
return list;
}
private List<Record> mergeRecord(Business business, WorkCompleted workCompleted) throws Exception {
private List<Record> combineRecord(Business business, WorkCompleted workCompleted) throws Exception {
List<Record> list = business.entityManagerContainer().listEqual(Record.class, Record.job_FIELDNAME,
workCompleted.getJob());
Collections.sort(list, Comparator.comparing(Record::getOrder, Comparator.nullsLast(Long::compareTo)));
......@@ -140,13 +180,14 @@ class ActionCombine extends BaseAction {
return list;
}
private List<WorkLog> mergeWorkLog(Business business, WorkCompleted workCompleted) throws Exception {
private List<WorkLog> combineWorkLog(Business business, WorkCompleted workCompleted) throws Exception {
List<WorkLog> list = business.entityManagerContainer().listEqual(WorkLog.class, WorkCompleted.job_FIELDNAME,
workCompleted.getJob());
Collections.sort(list, Comparator.comparing(WorkLog::getCreateTime, Comparator.nullsLast(Date::compareTo)));
workCompleted.getProperties().setWorkLogList(list);
return list;
}
}
}
\ No newline at end of file
......@@ -13,6 +13,10 @@ import javax.persistence.criteria.Path;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.apache.commons.lang3.time.DateUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.x.base.core.container.EntityManagerContainer;
import com.x.base.core.container.factory.EntityManagerContainerFactory;
import com.x.base.core.entity.JpaObject_;
......@@ -28,15 +32,11 @@ import com.x.processplatform.core.entity.content.WorkCompleted;
import com.x.processplatform.core.entity.content.WorkCompleted_;
import com.x.processplatform.service.processing.ThisApplication;
import org.apache.commons.lang3.time.DateUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import fr.opensagres.poi.xwpf.converter.core.utils.StringUtils;
public class Combine extends AbstractJob {
public class Merge extends AbstractJob {
private static Logger logger = LoggerFactory.getLogger(Combine.class);
private static Logger logger = LoggerFactory.getLogger(Merge.class);
@Override
public void schedule(JobExecutionContext jobExecutionContext) throws Exception {
......@@ -78,7 +78,7 @@ public class Combine extends AbstractJob {
private List<WorkCompleted> list(EntityManagerContainer emc, String sequence) throws Exception {
Date date = new Date();
date = DateUtils.addDays(date, 0 - Config.processPlatform().getCombine().getThresholdDays());
date = DateUtils.addDays(date, 0 - Config.processPlatform().getMerge().getThresholdDays());
EntityManager em = emc.get(WorkCompleted.class);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createQuery(Tuple.class);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册