diff --git a/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java index 4967e85e3c..be243a76b8 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/actions/ActionApiImpl.java @@ -111,7 +111,7 @@ public GetDataEventOutcome getData(String taskId, Map params) { } @Override - public SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException { + public SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException { log.debug("Setting data for task [{}] with params: [{}]", taskId, params == null ? "null" : params.toString()); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(dataSet); diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java index e7c8549c21..14eba05149 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/EventService.java @@ -51,6 +51,9 @@ public List runActions(List actions, Case useCase, Optiona List functions = useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions(); actions.forEach(action -> { List outcomes = actionsRunner.run(action, useCase, task, params, functions); + if (useCase != null) { + workflowService.updateCaseFromDb(useCase); + } outcomes.stream().filter(SetDataEventOutcome.class::isInstance) .forEach(outcome -> { if (((SetDataEventOutcome) outcome).getChangedFields().isEmpty()) return; @@ -75,6 +78,9 @@ public List runEventActions(Case useCase, Task task, List List functions = useCase == null ? Collections.emptyList() : useCase.getPetriNet().getFunctions(); actions.forEach(action -> { List outcomes = actionsRunner.run(action, useCase, taskOpt, params, functions); + if (useCase != null) { + workflowService.updateCaseFromDb(useCase); + } outcomes.stream().filter(SetDataEventOutcome.class::isInstance) .forEach(outcome -> { if (((SetDataEventOutcome) outcome).getChangedFields().isEmpty()) return; diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java index a16077f530..1a25eb15fb 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/WorkflowService.java @@ -252,6 +252,16 @@ public Case resolveActorRef(Case useCase, boolean canSaveUseCase) { return useCase; } + @Override + public void updateCaseFromDb(Case useCase) { + Case actual = findOne(useCase.getStringId()); + actual.getDataSet().forEach((id, dataField) -> { + if (dataField.isNewerThen(useCase.getDataField(id))) { + useCase.getDataSet().put(id, dataField); + } + }); + } + /** * Resolves actor permissions for the useCase based on the actor list data field. * diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java index 0065281b89..48818587fa 100644 --- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java +++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/service/interfaces/IWorkflowService.java @@ -31,6 +31,8 @@ public interface IWorkflowService { Case resolveActorRef(Case useCase, boolean canSaveUseCase); + void updateCaseFromDb(Case useCase); + CreateCaseEventOutcome createCase(CreateCaseParams createCaseParams); Page findAllByAuthor(String authorId, String petriNet, Pageable pageable); diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java index 0fcf7a3730..fac2f56709 100644 --- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java +++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/actions/ActionApi.java @@ -47,7 +47,7 @@ public interface ActionApi { * @return the outcome of the set data operation * @throws JsonProcessingException if there is an error processing JSON data */ - SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException; + SetDataEventOutcome setData(String taskId, Map> dataSet, Map params) throws JsonProcessingException; /** * Finds a specific case by its ID.