Workflow-Aktivitätsskripte

Inhalt

Workflow-Aktivitätsskripte#

sysman sysadmin

Sie können Zustandsübergangen in Workflows ein Workflow-Aktivitätsskript zuordnen.

Ein Workflow-Aktivitäts-Skript wird ausgeführt, wenn der Workflow-Übergang eingeleitet wird, dem das Skript zugewiesen ist. So können Sie beispielsweise die verantwortliche Person automatisch ändern oder einen untergeordneten Vorgang erstellen, wenn sich der Vorgangszustand ändert.

Beispiele#

Das folgende Skript hängt am Ende des Beschreibungsfeldes einen Kommentar an, wenn ein Vorgangszustand geändert wurde.

import java.util.LinkedList
import java.util.List
import java.util.Map

import com.aurel.track.beans.TWorkItemBean
import com.aurel.track.errors.ErrorData
import com.aurel.track.util.event.IEventHandler

public class CommentByReopen implements IEventHandler {

    private static String REOPEN_SEPARATOR  =
            "**************************REOPEN*******************************"

    public Map<String, Object> handleEvent(Map<String, Object> inputBinding) {
        TWorkItemBean workItemBean = (TWorkItemBean)inputBinding.get("issue")
        String comment = workItemBean.getComment()
        if (comment==null || comment.trim().length()==0) {
            List<ErrorData> errorList = new LinkedList<ErrorData>()
            errorList.add(new ErrorData("Comment is required by reopen"))
            inputBinding.put("errorList", errorList)
        } else {
            String description = workItemBean.getDescription()
            if (description==null) {
                description = ""
            }
            description = description + REOPEN_SEPARATOR + comment
            workItemBean.setDescription(description)
            workItemBean.setComment(null)
        }
        return inputBinding
    }
}

Das nächste Skript ändert den Verantwortlichen auf den “Guest”-Benutzer:

//
// This script changes the responsible to "guest" when a status change occurs
//
import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.util.event.IEventHandler;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.dao.DAOFactory;
import com.aurel.track.dao.PersonDAO;
import com.aurel.track.beans.TPersonBean;

public class ChangeResponsible implements IEventHandler {

def public Map handleEvent(Map inputBinding) {
        TWorkItemBean workItemBean = inputBinding.get("issue");
        PersonDAO personDAO =
                DAOFactory.getFactory().getPersonDAO();
        TPersonBean personBean =
                        personDAO.loadByLoginName("guest");
        workItemBean.setResponsibleID(personBean.getObjectID());
}
}

Das nächste Skript ändert den Manager zur ersten Person, die zu einer Gruppe von Personen in einer bestimmten Rolle gehört („roleNew“):

//
// Change the manager to the first person that belongs to a group
// in role "roleNew" upon a status change
//
import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.util.event.IEventHandler;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.dao.DAOFactory;
import com.aurel.track.dao.PersonDAO;
import com.aurel.track.beans.TPersonBean;
import com.aurel.track.dao.RoleDAO;
import com.aurel.track.beans.TRoleBean;

public class ChangeManager implements IEventHandler {

    def public Map handleEvent(Map inputBinding) {

        TWorkItemBean workItemBean = inputBinding.get("issue");
        PersonDAO personDAO =
                DAOFactory.getFactory().getPersonDAO();

        RoleDAO roleDAO= DAOFactory.getFactory().getRoleDAO();
        TRoleBean roleBean = roleDAO.loadByName("roleNew");

        if (roleBean!=null) {
        List<TPersonBean> personsWithExchangeRole =
                personDAO.loadByProjectAndRoles(
                                workItemBean.getProjectID(),
                                roleBean.getObjectID());

        if (personsWithExchangeRole!=null &&
                personsWithExchangeRole.size() > 0) {
                TPersonBean personBean =
                    (TPersonBean)personsWithExchangeRole.get(0);
                workItemBean.setOwnerID(
                        personBean.getObjectID());
        }
    }
    }
}

Das nächste Skript kopiert einen Vorgang und erstellt eine Verknüpfung zwischen der Kopie und dem Original:

import java.util.LinkedList
import java.util.List
import java.util.Locale
import java.util.Map

import com.aurel.track.beans.TLinkTypeBean
import com.aurel.track.beans.TPersonBean
import com.aurel.track.beans.TWorkItemBean
import com.aurel.track.errors.ErrorData
import com.aurel.track.fieldType.runtime.base.WorkItemContext
import com.aurel.track.item.ItemBL
import com.aurel.track.item.link.ItemLinkConfigBL
import com.aurel.track.linkType.LinkTypeBL
import com.aurel.track.util.event.IEventHandler

public class CopyItem implements IEventHandler {

    /**
    * Copies an item and creates a link between the original item and copied item
    */
public Map<String, Object> handleEvent(Map<String, Object> inputBinding) {
    WorkItemContext workItemContext = (WorkItemContext)inputBinding.get(
        "workItemContext")
    TWorkItemBean workItemBean = workItemContext.getWorkItemBean()
    Integer copiedFromItemID = workItemBean.getObjectID()
    TPersonBean personBean = (TPersonBean)inputBinding.get("user")
    Locale locale = (Locale)inputBinding.get("locale")
    List<ErrorData> errorList = new LinkedList<ErrorData>()
    //create a copy of an item
    WorkItemContext copyContext =  ItemBL.editCopyWorkItem(copiedFromItemID, personBean, locale)
    TWorkItemBean workItemBeanCopy = copyContext.getWorkItemBean()
    //change the copied item as needed
    workItemBeanCopy.setSynopsis("(Copy) " + workItemBeanCopy.getSynopsis())
    //save the copied item in db
    Integer copiedItemID = ItemBL.copyWorkItem(copyContext,
        errorList, false)
    //look up the linktype ID in Link types config, ID column
    Integer linkTypeID = 1001
    // 1=Unidirectional outward and bidirectional links,
    // 2=Unidirectional inward (MsProject)
    Integer linkDirection = 1
    List<ErrorData> linkErrors = ItemLinkConfigBL.saveItemLink(
        copiedFromItemID, copiedItemID, linkTypeID, linkDirection,
        null, null, personBean, locale, null, workItemContext)
    if (linkErrors!=null) {
        errorList.addAll(linkErrors)
    }
    inputBinding.put("errorList", errorList)
    return inputBinding
}
}

Das folgende Skript zeigt, wie Sie auf benutzerdefinierte Felder zugreifen können:

import com.aurel.track.beans.TWorkItemBean;
import com.aurel.track.util.event.IEventHandler;
import com.aurel.track.errors.ErrorData;
import com.aurel.track.admin.customize.treeConfig.field.FieldDesignBL;
import com.aurel.track.beans.TFieldBean;

public class ConnectNavision {
    private String CRLF=System.getProperty("line.separator");

    public Map handleEvent (Map<String, Object> inputBinding) {
        TWorkItemBean workItemBean = inputBinding.get("issue");

        // PLZ is a custom field
        List<TFieldBean> fieldBeans = FieldDesignBL.loadByName("PLZ");
        TFieldBean fieldBean=fieldBeans.get(0);
        Integer fieldID = fieldBean.getObjectID();

        String fname="NAV"+String.valueOf(workItemBean.getObjectID());
        def file=new File("C:\\temp\\"+fname+".txt");
        if (file.exists()){
            file.delete();
        }

        file << workItemBean.getObjectID()+CRLF;
        file << workItemBean.getSynopsis()+CRLF;
        file << workItemBean.getAttribute(fieldID)+CRLF;

        return inputBinding;
    }
}