⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hibernateactivity.java

📁 java实现的可配置的工作流引擎,采用jsp+javabean实现
💻 JAVA
字号:
/*
 * Created on 2004-10-17 TODO To change the template for this generated file go to Window - Preferences - Java - Code
 * Style - Code Templates
 */
package com.hongsoft.agile.workflow;

import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.type.StringType;

import com.hongsoft.agile.AgileActivity;
import com.hongsoft.agile.AgileException;
import com.hongsoft.agile.hpdl.DriveTypeObject;
import com.hongsoft.agile.hpdl.HpdlFacade;
import com.hongsoft.agile.pojo.ProcessInstance;
import com.hongsoft.agile.pojo.StatusDesc;

/**
 * @author hongsoft.com TODO To change the template for this generated type comment go to Window - Preferences - Java -
 *         Code Style - Code Templates
 */
public class HibernateActivity {
    /**
     * 找到流程实例号为processInsId,并且活动定义号为activityDefId的记录的列表 要求是正在活动状态的
     *
     * @param processDefId
     * @return
     */
    public List getRunningByProcessInsAndActivityDef(Session session, String processInsId, String activityDefId)
            throws HibernateException {
        String sql = "SELECT a FROM AgileActivity as a WHERE a.processInsId =:processInsId AND a.activityInsId LIKE :activityDefId AND (a.status=:s OR a.status=:d OR a.status=:f OR a.status=:g)";
        Query q = session.createQuery(sql);
        q.setString("processInsId", processInsId);
        q.setString("activityDefId", activityDefId + "%");
        q.setString("s", StatusDesc.Accepted);
        q.setString("d", StatusDesc.NotAccepted);
        q.setString("f", StatusDesc.NotStarted);
        q.setString("g", StatusDesc.Suspended);
        return q.list();
    }

    /**
     * 找到流程实例号为processInsId,并且活动定义号为activityDefId的记录的列表 要求是非活动状态的
     *
     * @param processDefId
     * @return
     */
    public List getNotRunningByProcessInsAndActivityDef(Session session, String processInsId, String activityDefId)
            throws HibernateException {
        String sql = "SELECT a FROM AgileActivity as a WHERE a.processInsId =:processInsId AND a.activityInsId LIKE :activityDefId AND (a.status!=:s AND a.status!=:d AND a.status!=:f AND a.status!=:g)";
        Query q = session.createQuery(sql);
        q.setString("processInsId", processInsId);
        q.setString("activityDefId", activityDefId + "%");
        q.setString("s", StatusDesc.Accepted);
        q.setString("d", StatusDesc.NotAccepted);
        q.setString("f", StatusDesc.NotStarted);
        q.setString("g", StatusDesc.Suspended);
        return q.list();
    }

    /**
     * 用升序得到一个流程定义的所有流程实例号,同样的号可能有重复
     *
     * @param processDefId
     * @return
     */
    public List getByProcessDefId(Session session, String processDefId) throws HibernateException {
        String sql = "SELECT a FROM AgileActivity as a WHERE a.processInsId like :processInsId ORDER BY a.processInsId ASC";
        Query q = session.createQuery(sql);
        q.setString("processInsId", processDefId + "%");
        return q.list();
    }

    /**
     * 用升序得到一个活动定义的所有活动实例号,同样的号不可能有重复
     *
     * @param processDefId
     * @return
     */
    public List getByActivityDefId(Session session, String activityDefId) throws HibernateException {
        String sql = "SELECT a FROM AgileActivity as a WHERE a.activityInsId like :activityInsId ORDER BY a.activityInsId ASC";
        Query q = session.createQuery(sql);
        q.setString("activityInsId", activityDefId + "%");
        return q.list();
    }

    /**
     * 插入一个对象
     *
     * @param session
     * @param ai
     * @throws HibernateException
     */
    public void insert(Session session, AgileActivity ai) throws HibernateException {
        session.save(ai);
    }

    /**
     * 更新
     *
     * @param session
     * @param ai
     * @throws HibernateException
     */
    public void update(Session session, AgileActivity ai) throws HibernateException {
        session.update(ai);
    }

    /**
     * 按状态取数据
     *
     * @param session
     * @param status
     * @return
     * @throws HibernateException
     */
    public List getByStatus(Session session, String status) throws HibernateException {
        String sql = "SELECT a FROM AgileActivity as a WHERE a.status=:status";
        Query q = session.createQuery(sql);
        q.setString("status", status);
        return q.list();
    }

    /**
     * 查找某一条记录
     *
     * @param session
     * @param activityInsId
     * @return
     * @throws HibernateException
     */
    public AgileActivity getByActivityInsId(Session session, String activityInsId) throws HibernateException {
        SQLQuery query = session
                .createSQLQuery("SELECT a FROM AgileActivity as a WHERE a.activityInsId=:activityInsId");
        query.setParameter("activityInsId", activityInsId, new StringType());
        List list = query.list();
        Iterator it = list.iterator();
        if (it.hasNext())
            return (AgileActivity) (it.next());
        return null;
    }

    /**
     * 得到活动的最大实例号
     *
     * @param session
     * @param processDefId
     * @return
     * @throws HibernateException
     */
    public static int getMaxActivityInsId(Session session, String activityDefId) throws HibernateException {
        String insId;
        List activityInsList = (new HibernateActivity()).getByActivityDefId(session, activityDefId);
        if (activityInsList == null || activityInsList.size() == 0)
            return 0;
        else
            insId = ((AgileActivity) activityInsList.get(activityInsList.size() - 1)).getActivityInsId();
        return Util.getIntIdByInsId(insId);
    }

    /**
     * 开始一个非子流程的活动,有可能是END活动,但不可能是start活动 这里的NOTSUBFLOW,表示这个活动本身不对应某个子流程,但活动本身可能属于子流程中的.
     *
     * @param session
     * @param processInsId
     * @param activityDefId
     * @throws HibernateException
     */
    private void startNotSubFlowActivity(Session session, String processInsId, String activityDefId)
            throws HibernateException, AgileException {
        // 启动一个活动时,判断表中有无运行状态的该定义的实例,如果有,则不启动本活动
        List list = getRunningByProcessInsAndActivityDef(session, processInsId, activityDefId);
        if (list != null && list.size() != 0)
            return;
        if ("end".equalsIgnoreCase(activityDefId)) {// 是END活动,找到父流程,父活动,完成它
            ProcessInstance pi = (new HibernateProcess()).getByProcessInsId(session, processInsId);
            if (pi == null)// 没有父流程,是主流程的END活动,不用启动了
                return;
            else
                // 找到了父流程
                (new FacadeActivity()).completeActivity(session, pi.getParentProcessInsId(), pi
                        .getParentActivityInsId());
        } else {// 是最一般的活动
            AgileActivity ai = new AgileActivity();
            ai.setAcceptedUserId("");
            ai.setActivityInsId(activityDefId + "_" + (getMaxActivityInsId(session, activityDefId) + 1));
            ai.setProcessInsId(processInsId);
            ai.setStatus(StatusDesc.NotAccepted);
            (new HibernateActivity()).insert(session, ai);
        }
    }

    /**
     * 开始一个是子流程的活动,状态设置为StatusDesc.NotStarted
     *
     * @param session
     * @param processInsId
     * @param activityDefId
     * @throws HibernateException
     */
    private String startSubFlowActivity(Session session, String processInsId, String activityDefId)
            throws HibernateException {
        String activityInsId = "";
        AgileActivity ai = new AgileActivity();
        ai.setAcceptedUserId("");
        activityInsId = activityDefId + "_" + (getMaxActivityInsId(session, activityDefId) + 1);
        ai.setActivityInsId(activityInsId);
        ai.setProcessInsId(processInsId);
        ai.setStatus(StatusDesc.NotStarted);
        (new HibernateActivity()).insert(session, ai);
        return activityInsId;
    }

    /**
     * 用DriveType启动一个活动 1)前提是已经得到了一个driveType 2)调用前面的方法
     *
     * @param session
     * @param processInsId
     */
    public void startActivity(Session session, String processInsId, DriveTypeObject co) throws HibernateException,
            AgileException {
        String correspondingProcessDefId = HpdlFacade.getCorrespondingSubProcessId(co.getId());
        if ("".equals(correspondingProcessDefId))// 不是子流程活动
            startNotSubFlowActivity(session, processInsId, co.getId());
        else// 是子流程活动
        {
            // 父流程级别,处理活动
            String parentActivityInsId = startSubFlowActivity(session, processInsId, co.getId());
            // 子流程级别,处理流程
            (new HibernateProcess()).startSubProcess(session, processInsId, parentActivityInsId,
                    correspondingProcessDefId);
        }
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -