Скрипт взятия в работу одному из всех назначенных (пример скрипта для дизайнера)

Скрипт переводит в работу на пользователя, который на этапе параллельного назначения на всех, нажал кнопку “В работу”.

При этом пользователь автоматически получает роль “Ответственный”.

Дополнительно в скрипте указана проверка: в зависимости от наименования вида созданного документа Ответственному задается определенная длительность выполнения задания в днях (При проставленной галке по заданию длительности в процессе).


В скрипте заполнить: наименования выхода и блока с параллельным назначением, роль участника процесса, наименование видов документов и их длительность.

Скрипт

import com.haulmont.cuba.core.EntityManager
import com.haulmont.cuba.core.Persistence
import com.haulmont.cuba.core.Transaction
import com.haulmont.cuba.core.global.*
import com.haulmont.thesis.core.entity.SimpleDoc
import com.haulmont.workflow.core.entity.Card
import com.haulmont.workflow.core.entity.CardRole
import com.haulmont.workflow.core.entity.ProcRole
import com.haulmont.workflow.core.global.TimeUnit
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
  
DataManager dataManager = AppBeans.get(DataManager.NAME)
UserSessionSource session = AppBeans.get(UserSessionSource.NAME)
  
/*List<Assignment> assignments = new ArrayList<>()
for (Assignment assignment : (((Card) card).getAssignments())) {
    if (assignment.getOutcome() == "V_rabotu" && assignment.finishedByUser != null && assignment.getName() == "Na_ispolnenii___ne_nachato") {
        assignments.add(assignment)
    }
}*/
  
/* LoadContext ctx = new LoadContext(Assignment.class)
 ctx.setUseSecurityConstraints(false)
         .setView("browse")
         .setQueryString("select a from wf\$Assignment a where a.card.id=:cardId and  a.name ='Na_ispolnenii___ne_nachato' and a.outcome ='V_rabotu' order by a.finished desc ")
         .setParameter("cardId", card)
  
 assignments = dataManager.loadList(ctx)
 tx.commit()*/
  
//проставить пользователя из finishedBy в роль по задаче.
Log log = LogFactory.getLog("123")
List<ProcRole> roles = card.proc.getRoles()
Persistence persistence = AppBeans.get(Persistence.NAME)
Transaction tx2 = persistence.createTransaction()
try {
    EntityManager em = persistence.getEntityManager()
    ProcRole procRole = null
    for (ProcRole pr : roles) {
        if ("Ответственный".equals(pr.getCode())) {
            procRole = pr
            break
        }
    }
    Card reloadedCard = em.reload((Card) card, "edit") as Card
    ProcRole reloadedProcRole = em.reload(procRole, "_local")
    Metadata metadata = AppBeans.get(Metadata.NAME)
    //ищем Ответственный среди ролей
    LoadContext ctx = new LoadContext(CardRole.class)
    ctx.setUseSecurityConstraints(false)
            .setView("transition-form")
            .setQueryString("select c from wf\$CardRole c where c.card.id=:cardId and c.code ='Ответственный'")
            .setParameter("cardId", card)
    CardRole registrarCardRole = dataManager.load(ctx)
    CardRole cardRole
    // если Ответственный уже есть, то используем его, иначе - создаем новую роль
    if (registrarCardRole == null)
        cardRole = metadata.create(CardRole.class)
    else cardRole = registrarCardRole
    cardRole.setProcRole(reloadedProcRole)
    cardRole.setCode(reloadedProcRole.getCode())
    cardRole.setNotifyByEmail(true)
    cardRole.setNotifyByCardInfo(true)
    cardRole.setCard(reloadedCard)
    cardRole.setUser(session.getUserSession().currentOrSubstitutedUser)
    // cardRole.setSortOrder(1)
    //время "завершить к"
    if (reloadedCard instanceof SimpleDoc && reloadedCard.docKind != null) {
        if ("Заявка на курьера".equals(reloadedCard.docKind.name)) {
            cardRole.setDuration(7)
            cardRole.setTimeUnit(TimeUnit.DAY)
        }
          if ("Заказ материальных ценностей".equals(reloadedCard.docKind.name)) {
            cardRole.setDuration(10)
            cardRole.setTimeUnit(TimeUnit.DAY)
        }
    if ("Заявка на командирование".equals(reloadedCard.docKind.name)) {
            cardRole.setDuration(10)
            cardRole.setTimeUnit(TimeUnit.DAY)
        }
    if ("Заявка на нотариально-заверенную копию документа".equals(reloadedCard.docKind.name)) {
            cardRole.setDuration(5)
            cardRole.setTimeUnit(TimeUnit.DAY)
        }
    }
    if (registrarCardRole == null) {
        em.persist(cardRole)
        card.getRoles().add(cardRole)
    } else em.merge(cardRole)
    tx2.commit()
} finally {
    tx2.end()
}