diff --git a/assets/O2OA-logo.jpg b/assets/O2OA-logo.jpg deleted file mode 100644 index 550810c6a72761ca17c416e432fdb3f3ca829bef..0000000000000000000000000000000000000000 Binary files a/assets/O2OA-logo.jpg and /dev/null differ diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ActionDownload.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ActionDownload.java new file mode 100644 index 0000000000000000000000000000000000000000..f7ab1cc15ad0dd095c0cc8552b4b00994b08f03a --- /dev/null +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ActionDownload.java @@ -0,0 +1,51 @@ +package com.x.processplatform.assemble.surface.jaxrs.snap; + +import java.nio.charset.StandardCharsets; + +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.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.jaxrs.WoFile; +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.Snap; + +class ActionDownload extends BaseAction { + + private static Logger logger = LoggerFactory.getLogger(ActionDownload.class); + + ActionResult execute(EffectivePerson effectivePerson, String id) throws Exception { + ActionResult result = new ActionResult<>(); + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + Business business = new Business(emc); + Snap snap = emc.find(id, Snap.class); + if (!allow(effectivePerson, business, snap)) { + throw new ExceptionAccessDenied(effectivePerson, snap); + } + String text = gson.toJson(snap); + Wo wo = new Wo(text.getBytes(StandardCharsets.UTF_8), this.contentType(false, id), + this.contentDisposition(false, id)); + result.setData(wo); + } + return result; + } + + private boolean allow(EffectivePerson effectivePerson, Business business, Snap snap) throws Exception { + return (business.canManageApplicationOrProcess(effectivePerson, snap.getApplication(), snap.getProcess()) + || effectivePerson.isNotPerson(snap.getPerson())); + } + + public static class Wo extends WoFile { + + private static final long serialVersionUID = -2577413577740827608L; + + public Wo(byte[] bytes, String contentType, String contentDisposition) { + super(bytes, contentType, contentDisposition); + } + + } + +} diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ActionUpload.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ActionUpload.java new file mode 100644 index 0000000000000000000000000000000000000000..84b6c906a345a3f266b1a4a96ab37a08577d90f4 --- /dev/null +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ActionUpload.java @@ -0,0 +1,63 @@ +package com.x.processplatform.assemble.surface.jaxrs.snap; + +import java.nio.charset.StandardCharsets; + +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.Applications; +import com.x.base.core.project.x_processplatform_service_processing; +import com.x.base.core.project.exception.ExceptionAccessDenied; +import com.x.base.core.project.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.jaxrs.WrapString; +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.assemble.surface.ThisApplication; +import com.x.processplatform.core.entity.content.Snap; + +class ActionUpload extends BaseAction { + + private static Logger logger = LoggerFactory.getLogger(ActionUpload.class); + + ActionResult execute(EffectivePerson effectivePerson, byte[] bytes) throws Exception { + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + Business business = new Business(emc); + String text = new String(bytes, StandardCharsets.UTF_8); + Snap snap = gson.fromJson(text, Snap.class); + if (!allow(effectivePerson, business, snap)) { + throw new ExceptionAccessDenied(effectivePerson); + } + + if (!check(snap)) { + throw new ExceptionContentConfusion(); + } + ActionResult result = new ActionResult<>(); + Wo wo = ThisApplication.context().applications() + .postQuery(effectivePerson.getDebugger(), x_processplatform_service_processing.class, + Applications.joinQueryUri("snap", "upload"), text, snap.getJob()) + .getData(Wo.class); + result.setData(wo); + return result; + } + } + + private boolean check(Snap snap) { + if (StringUtils.isBlank(snap.getId())) { + return false; + } + if (StringUtils.isBlank(snap.getJob())) { + return false; + } + return !((null == snap.getProperties().getWorkCompleted()) && snap.getProperties().getWorkList().isEmpty()); + } + + private boolean allow(EffectivePerson effectivePerson, Business business, Snap snap) throws Exception { + return (business.canManageApplicationOrProcess(effectivePerson, snap.getApplication(), snap.getProcess())); + } + + public static class Wo extends WrapString { + } +} diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ExceptionContentConfusion.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ExceptionContentConfusion.java new file mode 100644 index 0000000000000000000000000000000000000000..142a39397b7af65c8eb533caeafe71e99791d124 --- /dev/null +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/ExceptionContentConfusion.java @@ -0,0 +1,12 @@ +package com.x.processplatform.assemble.surface.jaxrs.snap; + +import com.x.base.core.project.exception.LanguagePromptException; + +class ExceptionContentConfusion extends LanguagePromptException { + + private static final long serialVersionUID = 1040883405179987063L; + + ExceptionContentConfusion() { + super("snap content confusion."); + } +} diff --git a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/SnapAction.java b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/SnapAction.java index acb448e609e3fbf8ae7d5e5021f49c4c19e5676e..ae1800bad8c91d625a4ce5c16ac088367b9da234 100644 --- a/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/SnapAction.java +++ b/o2server/x_processplatform_assemble_surface/src/main/java/com/x/processplatform/assemble/surface/jaxrs/snap/SnapAction.java @@ -7,6 +7,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; +import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -15,6 +16,9 @@ import javax.ws.rs.container.Suspended; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataParam; + import com.google.gson.JsonElement; import com.x.base.core.project.annotation.JaxrsDescribe; import com.x.base.core.project.annotation.JaxrsMethodDescribe; @@ -331,6 +335,43 @@ public class SnapAction extends StandardJaxrsAction { logger.error(e, effectivePerson, request, null); result.error(e); } + + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + + @JaxrsMethodDescribe(value = "导出快照.", action = ActionDownload.class) + @GET + @Path("{id}/download") + @Consumes(MediaType.APPLICATION_JSON) + public void download(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, + @JaxrsParameterDescribe("标识") @PathParam("id") String id) { + ActionResult result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionDownload().execute(effectivePerson, id); + } catch (Exception e) { + logger.error(e, effectivePerson, request, null); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + + @JaxrsMethodDescribe(value = "导入快照.", action = ActionUpload.class) + @POST + @Path("upload") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.MULTIPART_FORM_DATA) + public void upload(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, + @FormDataParam(FILE_FIELD) byte[] bytes, + @FormDataParam(FILE_FIELD) final FormDataContentDisposition disposition) { + ActionResult result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionUpload().execute(effectivePerson, bytes); + } catch (Exception e) { + logger.error(e, effectivePerson, request, null); + result.error(e); + } asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); } diff --git a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/SnapProperties.java b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/SnapProperties.java index ed1389fb8fceeb3078a5d4a7f4be7e74c10d1132..019ebb4eb9dfdfa1035d15fed7665d41fcdd5f61 100644 --- a/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/SnapProperties.java +++ b/o2server/x_processplatform_core_entity/src/main/java/com/x/processplatform/core/entity/content/SnapProperties.java @@ -1,7 +1,9 @@ package com.x.processplatform.core.entity.content; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.x.base.core.entity.JsonProperties; import com.x.base.core.project.annotation.FieldDescribe; @@ -52,6 +54,8 @@ public class SnapProperties extends JsonProperties { @FieldDescribe("版式文件版本") private List documentVersionList = new ArrayList(); + private Map attachmentContentMap = new HashMap<>(); + public Data getData() { return data; } @@ -194,4 +198,12 @@ public class SnapProperties extends JsonProperties { this.workCompleted = workCompleted; } + public Map getAttachmentContentMap() { + return attachmentContentMap; + } + + public void setAttachmentContentMap(Map attachmentContentMap) { + this.attachmentContentMap = attachmentContentMap; + } + } diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionDelete.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionDelete.java index 3b0b5f57eb2a9b568cdb57ac178cba53ee96d36b..3dd956141b0098415278ce817e58812663a728b6 100644 --- a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionDelete.java +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionDelete.java @@ -5,9 +5,7 @@ import java.util.concurrent.TimeUnit; 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.entity.annotation.CheckRemoveType; -import com.x.base.core.project.config.StorageMapping; import com.x.base.core.project.exception.ExceptionEntityNotExist; import com.x.base.core.project.executor.ProcessPlatformExecutorFactory; import com.x.base.core.project.http.ActionResult; @@ -16,11 +14,7 @@ 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.Attachment; import com.x.processplatform.core.entity.content.Snap; -import com.x.processplatform.core.entity.content.Work; -import com.x.processplatform.core.entity.content.WorkCompleted; -import com.x.processplatform.service.processing.ThisApplication; class ActionDelete extends BaseAction { @@ -53,26 +47,26 @@ class ActionDelete extends BaseAction { if (null == snap) { throw new ExceptionEntityNotExist(id, Snap.class); } - // 已经没有work,workCompleted以及snap所以附件可以删除了 - if ((emc.countEqual(Work.class, Work.job_FIELDNAME, snap.getJob()) == 0) - && (emc.countEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME, snap.getJob()) == 0) - && (emc.countEqualAndNotEqual(Snap.class, Snap.job_FIELDNAME, snap.getJob(), - JpaObject.id_FIELDNAME, snap.getId()) == 0)) { - emc.beginTransaction(Attachment.class); - emc.listEqual(Attachment.class, Attachment.job_FIELDNAME, snap.getJob()).forEach(o -> { - try { - StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class, - o.getStorage()); - if (null != mapping) { - o.deleteContent(mapping); - } - emc.remove(o, CheckRemoveType.all); - } catch (Exception e) { - logger.error(e); - } - }); - emc.commit(); - } +// // 已经没有work,workCompleted以及snap所以附件可以删除了 +// if ((emc.countEqual(Work.class, Work.job_FIELDNAME, snap.getJob()) == 0) +// && (emc.countEqual(WorkCompleted.class, WorkCompleted.job_FIELDNAME, snap.getJob()) == 0) +// && (emc.countEqualAndNotEqual(Snap.class, Snap.job_FIELDNAME, snap.getJob(), +// JpaObject.id_FIELDNAME, snap.getId()) == 0)) { +// emc.beginTransaction(Attachment.class); +// emc.listEqual(Attachment.class, Attachment.job_FIELDNAME, snap.getJob()).forEach(o -> { +// try { +// StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class, +// o.getStorage()); +// if (null != mapping) { +// o.deleteContent(mapping); +// } +// emc.remove(o, CheckRemoveType.all); +// } catch (Exception e) { +// logger.error(e); +// } +// }); +// emc.commit(); +// } emc.beginTransaction(Snap.class); emc.remove(snap, CheckRemoveType.all); emc.commit(); diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionRestore.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionRestore.java index 18142ab4d4c0a14b0f6f58a7c43d498bbbd46e54..d5f31c1df8daadf6c167058ef5731b3beb7b4785 100644 --- a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionRestore.java +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionRestore.java @@ -1,12 +1,13 @@ package com.x.processplatform.service.processing.jaxrs.snap; -import java.util.List; import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import com.x.base.core.container.EntityManagerContainer; import com.x.base.core.container.factory.EntityManagerContainerFactory; @@ -104,30 +105,6 @@ class ActionRestore extends BaseAction { } } - private void attachment(Business business, Snap snap) throws Exception { - EntityManagerContainer emc = business.entityManagerContainer(); - List attachments = emc.listEqual(Attachment.class, Attachment.job_FIELDNAME, snap.getJob()); - attachments.stream().filter(o -> !snap.getProperties().getAttachmentList().contains(o)).forEach(o -> { - try { - StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class, - o.getStorage()); - if (null != mapping) { - o.deleteContent(mapping); - } - emc.remove(o, CheckRemoveType.all); - } catch (Exception e) { - logger.error(e); - } - }); - attachments.stream().filter(o -> snap.getProperties().getAttachmentList().contains(o)).forEach(o -> { - try { - emc.remove(o, CheckRemoveType.all); - } catch (Exception e) { - logger.error(e); - } - }); - } - private void restore(Business business, Snap snap) throws Exception { EntityManagerContainer emc = business.entityManagerContainer(); emc.beginTransaction(Work.class); @@ -141,38 +118,15 @@ class ActionRestore extends BaseAction { emc.beginTransaction(DocumentVersion.class); emc.beginTransaction(Item.class); emc.beginTransaction(Attachment.class); - for (Task o : snap.getProperties().getTaskList()) { - emc.persist(o, CheckPersistType.all); - MessageFactory.task_create(o); - } - for (TaskCompleted o : snap.getProperties().getTaskCompletedList()) { - emc.persist(o, CheckPersistType.all); - MessageFactory.taskCompleted_create(o); - } - for (Read o : snap.getProperties().getReadList()) { - emc.persist(o, CheckPersistType.all); - MessageFactory.read_create(o); - } - for (ReadCompleted o : snap.getProperties().getReadCompletedList()) { - emc.persist(o, CheckPersistType.all); - MessageFactory.readCompleted_create(o); - } - for (Review o : snap.getProperties().getReviewList()) { - emc.persist(o, CheckPersistType.all); - MessageFactory.review_create(o); - } - for (WorkLog o : snap.getProperties().getWorkLogList()) { - emc.persist(o, CheckPersistType.all); - } - for (Record o : snap.getProperties().getRecordList()) { - emc.persist(o, CheckPersistType.all); - } - for (DocumentVersion o : snap.getProperties().getDocumentVersionList()) { - emc.persist(o, CheckPersistType.all); - } - for (Attachment o : snap.getProperties().getAttachmentList()) { - emc.persist(o, CheckPersistType.all); - } + restoreTask(emc, snap); + restoreTaskCompleted(emc, snap); + restoreRead(emc, snap); + restoreReadCompleted(emc, snap); + restoreReview(emc, snap); + restoreWorkLog(emc, snap); + restoreRecord(emc, snap); + restoreDocumentVersion(emc, snap); + restoreAttachment(emc, snap); if (ListTools.isNotEmpty(snap.getProperties().getWorkList())) { WorkDataHelper workDataHelper = new WorkDataHelper(emc, snap.getProperties().getWorkList().get(0)); for (Work o : snap.getProperties().getWorkList()) { @@ -180,7 +134,6 @@ class ActionRestore extends BaseAction { } workDataHelper.update(snap.getProperties().getData()); } - attachment(business, snap); emc.commit(); } @@ -195,37 +148,90 @@ class ActionRestore extends BaseAction { emc.beginTransaction(Record.class); emc.beginTransaction(Item.class); emc.beginTransaction(Attachment.class); - for (TaskCompleted o : snap.getProperties().getTaskCompletedList()) { - emc.persist(o, CheckPersistType.all); - MessageFactory.taskCompleted_create(o); + restoreTaskCompleted(emc, snap); + restoreRead(emc, snap); + restoreReadCompleted(emc, snap); + restoreReview(emc, snap); + restoreWorkLog(emc, snap); + restoreRecord(emc, snap); + restoreAttachment(emc, snap); + emc.persist(snap.getProperties().getWorkCompleted(), CheckPersistType.all); + if (BooleanUtils.isNotTrue(snap.getProperties().getWorkCompleted().getMerged())) { + WorkDataHelper workDataHelper = new WorkDataHelper(emc, snap.getProperties().getWorkCompleted()); + workDataHelper.update(snap.getProperties().getData()); } + emc.commit(); + } + + private void restoreRead(EntityManagerContainer emc, Snap snap) throws Exception { for (Read o : snap.getProperties().getReadList()) { emc.persist(o, CheckPersistType.all); MessageFactory.read_create(o); } - for (ReadCompleted o : snap.getProperties().getReadCompletedList()) { + } + + private void restoreAttachment(EntityManagerContainer emc, Snap snap) throws Exception { + for (Attachment o : snap.getProperties().getAttachmentList()) { + String content = snap.getProperties().getAttachmentContentMap().get(o.getId()); + if (StringUtils.isNotEmpty(content)) { + StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class, + o.getStorage()); + if (null == mapping) { + mapping = ThisApplication.context().storageMappings().random(Attachment.class); + } + if (null != mapping) { + byte[] bytes = Base64.decodeBase64(content); + o.updateContent(mapping, bytes); + } + emc.persist(o, CheckPersistType.all); + } + } + } + + private void restoreDocumentVersion(EntityManagerContainer emc, Snap snap) throws Exception { + for (DocumentVersion o : snap.getProperties().getDocumentVersionList()) { emc.persist(o, CheckPersistType.all); - MessageFactory.readCompleted_create(o); } - for (Review o : snap.getProperties().getReviewList()) { + } + + private void restoreRecord(EntityManagerContainer emc, Snap snap) throws Exception { + for (Record o : snap.getProperties().getRecordList()) { emc.persist(o, CheckPersistType.all); - MessageFactory.review_create(o); } + } + + private void restoreWorkLog(EntityManagerContainer emc, Snap snap) throws Exception { for (WorkLog o : snap.getProperties().getWorkLogList()) { emc.persist(o, CheckPersistType.all); } - for (Record o : snap.getProperties().getRecordList()) { + } + + private void restoreReview(EntityManagerContainer emc, Snap snap) throws Exception { + for (Review o : snap.getProperties().getReviewList()) { emc.persist(o, CheckPersistType.all); + MessageFactory.review_create(o); } - for (Attachment o : snap.getProperties().getAttachmentList()) { + } + + private void restoreTask(EntityManagerContainer emc, Snap snap) throws Exception { + for (Task o : snap.getProperties().getTaskList()) { emc.persist(o, CheckPersistType.all); + MessageFactory.task_create(o); } - emc.persist(snap.getProperties().getWorkCompleted(), CheckPersistType.all); - if (BooleanUtils.isNotTrue(snap.getProperties().getWorkCompleted().getMerged())) { - WorkDataHelper workDataHelper = new WorkDataHelper(emc, snap.getProperties().getWorkCompleted()); - workDataHelper.update(snap.getProperties().getData()); + } + + private void restoreTaskCompleted(EntityManagerContainer emc, Snap snap) throws Exception { + for (TaskCompleted o : snap.getProperties().getTaskCompletedList()) { + emc.persist(o, CheckPersistType.all); + MessageFactory.taskCompleted_create(o); + } + } + + private void restoreReadCompleted(EntityManagerContainer emc, Snap snap) throws Exception { + for (ReadCompleted o : snap.getProperties().getReadCompletedList()) { + emc.persist(o, CheckPersistType.all); + MessageFactory.readCompleted_create(o); } - emc.commit(); } } diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionTypeSnap.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionTypeSnap.java index 773c791876e8d44a05ecc6b28c9d398683288b71..0e1ebce1e9c3ae01ea22d468061890e52366a445 100644 --- a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionTypeSnap.java +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionTypeSnap.java @@ -76,6 +76,7 @@ class ActionTypeSnap extends BaseAction { Snap snap = new Snap(work); snap.setProperties(snap(business, work.getJob(), items, works, tasks, taskCompleteds, reads, readCompleteds, reviews, workLogs, records, attachments, documentVersions)); + snap.setType(Snap.TYPE_SNAP); emc.beginTransaction(Snap.class); emc.persist(snap, CheckPersistType.all); diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionUpload.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionUpload.java new file mode 100644 index 0000000000000000000000000000000000000000..e42eab20893cfeaeca8ae615dd89d351cb97cf22 --- /dev/null +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/ActionUpload.java @@ -0,0 +1,65 @@ +package com.x.processplatform.service.processing.jaxrs.snap; + +import java.util.concurrent.Callable; +import java.util.concurrent.TimeUnit; + +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.entity.annotation.CheckPersistType; +import com.x.base.core.entity.annotation.CheckRemoveType; +import com.x.base.core.project.executor.ProcessPlatformExecutorFactory; +import com.x.base.core.project.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.jaxrs.WrapString; +import com.x.processplatform.core.entity.content.Snap; + +class ActionUpload extends BaseAction { + + ActionResult execute(EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception { + + Snap snap = this.convertToWrapIn(jsonElement, Snap.class); + + check(snap); + + Callable> callable = new Callable>() { + public ActionResult call() throws Exception { + ActionResult result = new ActionResult<>(); + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + Snap exist = emc.find(snap.getId(), Snap.class); + if (null != exist) { + emc.beginTransaction(Snap.class); + emc.remove(exist, CheckRemoveType.all); + emc.commit(); + } + emc.beginTransaction(Snap.class); + emc.persist(snap, CheckPersistType.all); + emc.commit(); + Wo wo = new Wo(); + wo.setValue(snap.getId()); + result.setData(wo); + return result; + } + } + }; + + return ProcessPlatformExecutorFactory.get(snap.getJob()).submit(callable).get(300, TimeUnit.SECONDS); + + } + + private boolean check(Snap snap) { + if (StringUtils.isBlank(snap.getId())) { + return false; + } + if (StringUtils.isBlank(snap.getJob())) { + return false; + } + return !((null == snap.getProperties().getWorkCompleted()) && snap.getProperties().getWorkList().isEmpty()); + } + + public static class Wo extends WrapString { + + } +} \ No newline at end of file diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/BaseAction.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/BaseAction.java index 17257dd02bd31fa7c31bc11b21736c52f0e27ab7..ac008acef99d834d899280c3563354fb9dcc8dfd 100644 --- a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/BaseAction.java +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/BaseAction.java @@ -8,12 +8,14 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; +import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.BooleanUtils; import com.google.gson.JsonElement; import com.x.base.core.entity.dataitem.DataItem; import com.x.base.core.entity.dataitem.DataItemConverter; import com.x.base.core.entity.dataitem.ItemCategory; +import com.x.base.core.project.config.StorageMapping; import com.x.base.core.project.jaxrs.StandardJaxrsAction; import com.x.base.core.project.logger.Logger; import com.x.base.core.project.logger.LoggerFactory; @@ -33,6 +35,7 @@ import com.x.processplatform.core.entity.content.WorkCompleted; import com.x.processplatform.core.entity.content.WorkLog; import com.x.processplatform.service.processing.Business; import com.x.processplatform.service.processing.MessageFactory; +import com.x.processplatform.service.processing.ThisApplication; import com.x.query.core.entity.Item; abstract class BaseAction extends StandardJaxrsAction { @@ -261,6 +264,15 @@ abstract class BaseAction extends StandardJaxrsAction { .collect(Collectors.toList()); snapProperties.setAttachmentList(os); attachments.addAll(os); + for (Attachment attachment : os) { + StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class, + attachment.getStorage()); + if (null != mapping) { + byte[] bytes = attachment.readContent(mapping); + snapProperties.getAttachmentContentMap().put(attachment.getId(), + Base64.encodeBase64URLSafeString(bytes)); + } + } } catch (Exception e) { logger.error(e); } @@ -423,6 +435,11 @@ abstract class BaseAction extends StandardJaxrsAction { try { business.entityManagerContainer().beginTransaction(Attachment.class); for (Attachment o : attachments) { + StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class, + o.getStorage()); + if (null != mapping) { + o.deleteContent(mapping); + } business.entityManagerContainer().remove(o); } } catch (Exception e) { @@ -591,6 +608,11 @@ abstract class BaseAction extends StandardJaxrsAction { business.entityManagerContainer().beginTransaction(Attachment.class); for (Attachment o : business.entityManagerContainer().listEqual(Attachment.class, Attachment.job_FIELDNAME, job)) { + StorageMapping mapping = ThisApplication.context().storageMappings().get(Attachment.class, + o.getStorage()); + if (null != mapping) { + o.deleteContent(mapping); + } business.entityManagerContainer().remove(o); } } catch (Exception e) { diff --git a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/SnapAction.java b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/SnapAction.java index 64e44f0c569c893496bedc44ba2152bec82bfb59..bae1938b4a3f5e3d65fa84b095156a7e34a72169 100644 --- a/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/SnapAction.java +++ b/o2server/x_processplatform_service_processing/src/main/java/com/x/processplatform/service/processing/jaxrs/snap/SnapAction.java @@ -4,6 +4,7 @@ import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -12,6 +13,7 @@ import javax.ws.rs.container.Suspended; import javax.ws.rs.core.Context; 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; @@ -138,4 +140,22 @@ public class SnapAction extends StandardJaxrsAction { asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); } + @JaxrsMethodDescribe(value = "导入快照", action = ActionUpload.class) + @POST + @Path("upload") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.APPLICATION_JSON) + public void upload(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, + JsonElement jsonElement) { + ActionResult result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionUpload().execute(effectivePerson, jsonElement); + } catch (Exception e) { + logger.error(e, effectivePerson, request, jsonElement); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + } \ No newline at end of file