📄 hibernateactivity.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 + -