/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.activiti.listeners; import org.activiti.engine.delegate.DelegateTask; import org.activiti.engine.delegate.TaskListener; import org.activiti.engine.impl.persistence.entity.TaskEntity; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.database.Bid; import ru.codeinside.adm.database.TaskDates; import ru.codeinside.gses.activiti.Activiti; import ru.codeinside.gses.activiti.forms.CustomTaskFormHandler; import ru.codeinside.gses.activiti.forms.api.duration.DurationPreference; import ru.codeinside.gses.activiti.forms.api.duration.LazyCalendar; import ru.codeinside.gses.webui.Flash; import javax.persistence.EntityManager; import java.util.Date; import java.util.List; public class TaskProcessListener implements TaskListener { @Override public void notify(final DelegateTask execution) { final Event event = Event.valueOf(execution); Bid firstBid = null; EntityManager em = Activiti.getEm(); List<Bid> resultList = em .createQuery("select e from Bid e where e.processInstanceId = :processInstanceId", Bid.class) .setParameter("processInstanceId", execution.getProcessInstanceId()).getResultList(); for (final Bid bid : resultList) { if (firstBid == null) { firstBid = bid; } if (event == Event.Create) { bid.getCurrentSteps().add(execution.getId()); // событие назначения может быть ДО события создания! TaskDates task = em.find(TaskDates.class, execution.getId()); if (task == null) { task = createTaskDates(execution, firstBid); em.persist(task); em.flush(); } } else if (event == Event.Complete) { bid.getCurrentSteps().remove(execution.getId()); } } String info = null; String action = null; if (event == Event.Complete) { if (firstBid != null && firstBid.getProcedure() != null) { info = "procedureId: " + firstBid.getProcedure().getId(); } action = "complete"; } else if (event == Event.Assignment) { // фиксировать дату назначания только при реальном назначении if (execution.getAssignee() != null) { TaskDates task = em.find(TaskDates.class, execution.getId()); boolean needFlush = false; if (task == null) { task = createTaskDates(execution, firstBid); needFlush = true; } if (task.getAssignDate() == null) { task.setAssignDate(new Date()); needFlush = true; } if (needFlush) { em.persist(task); em.flush(); } } info = "assigned: " + execution.getAssignee(); if (firstBid != null && firstBid.getProcedure() != null) { info += ", procedureId: " + firstBid.getProcedure().getId(); } action = "assign"; } if (event == Event.Assignment || event == Event.Complete) { AdminServiceProvider.get().createLog(Flash.getActor(), "task", execution.getId(), action, info, true); } if (event == Event.Complete) { em.createQuery("delete from FormBuffer where taskId=:id") .setParameter("id", execution.getId()) .executeUpdate(); // каскадное удаления для связных объектов } } private TaskDates createTaskDates(DelegateTask execution, Bid bid) { TaskDates taskDates = new TaskDates(); taskDates.setId(execution.getId()); taskDates.setBid(bid); taskDates.setStartDate(execution.getCreateTime()); getDurationPreference(execution).initializeTaskDates(taskDates, new LazyCalendar()); return taskDates; } private DurationPreference getDurationPreference(DelegateTask execution) { return ((CustomTaskFormHandler) ((TaskEntity) execution).getTaskDefinition().getTaskFormHandler()) .getPropertyTree() .getDurationPreference(); } }