📄 facadeactivity.java
字号:
/*
* Created on 2004-10-18
*
* 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 java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
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.StatusDesc;
import com.hongsoft.res.database.PrivilegeTypeCache;
import com.hongsoft.res.pojo.ResManager;
/**
* @author hongsoft.com
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/
public class FacadeActivity {
/**
* 得到所有的任务 状态: 未接收和已经接收的,没有包括suspended
*
* @param session
* @return @throws
* HibernateException
*/
public static List getAllAssignments(Session session)
throws HibernateException {
HibernateActivity ha = new HibernateActivity();
List list = ha.getByStatus(session, StatusDesc.NotAccepted);
list.addAll(ha.getByStatus(session, StatusDesc.Accepted));
return list;
}
/**
* 得到某个用户的任务 状态: 未接收和已经接收的,没有包括suspended
*
* @param session
* @return @throws
* HibernateException
*/
public static List getAssignments(Session session,long userId)
throws Exception {
Set set=ResManager.getPrivileges(session,userId);
StringBuffer sb=new StringBuffer();
Iterator it=set.iterator();
int i=0;
while(it.hasNext())
{
if(i!=0)
sb.append(" or ");
i++;
String activityDefId=(String)it.next();
sb.append(" a.activityInsId like '"+PrivilegeTypeCache.getTypeName(session,Integer.parseInt(activityDefId))+"%'");
}
String sql="SELECT a FROM AgileActivity as a WHERE (a.status=:status or a.status=:status2) and ("+sb.toString()+")";
Query q=session.createQuery(sql);
q.setString("status",StatusDesc.NotAccepted);
q.setString("status2",StatusDesc.Accepted);
return q.list();
}
/**
* 某用户接收一个任务
*
* @param session
* @param userId
* @param activityInsId
* @throws HibernateException
* @throws AgileException
*/
public static void acceptAssignment(Session session, String userId,
String activityInsId) throws HibernateException, AgileException {
//修改活动实例的状态
HibernateActivity ha = new HibernateActivity();
AgileActivity ai = ha.getByActivityInsId(session, activityInsId);
if (ai == null)
throw new AgileException("要接收任务的活动实例号不存在!");
if (!StatusDesc.NotAccepted.equals(ai.getStatus()))
throw new AgileException("要接收任务的活动实例现在不能被接收!");
ai.setAcceptedUserId(userId);
ai.setStatus(StatusDesc.Accepted);
ha.update(session, ai);
}
/**
* 完成一个活动
*
* @param session
* @param processInsId
* @param activityInsId
* @throws HibernateException
* @throws AgileException
*/
public void completeActivity(Session session, String processInsId,
String activityInsId) throws HibernateException, AgileException {
//1)把当前活动完成
HibernateActivity ha = new HibernateActivity();
AgileActivity ai = ha.getByActivityInsId(session, activityInsId);
if (ai == null)
throw new AgileException("要完成的活动实例号不存在!");
if (!StatusDesc.Accepted.equals(ai.getStatus())&&!StatusDesc.NotStarted.equals(ai.getStatus()))
throw new AgileException("要完成的活动实例现在不能被完成!");
ai.setStatus(StatusDesc.Completed);
ha.update(session, ai);
//2)开始活动后面的活动列表
List driveList = HpdlFacade.getNextActivityDefList(Util
.getDefIdByInsId(processInsId), Util
.getDefIdByInsId(activityInsId));
for (int i = 0; i < driveList.size(); i++) {
DriveTypeObject co = (DriveTypeObject) driveList.get(i);
//应该开始后面的一个活动
if(activityCanBeStarted(session,processInsId,co.getId()))
ha.startActivity(session,processInsId,co);
}
}
/**
* 判断一个活动现在能否被开始
* @param session
* @param processInsId
* @param activityDefId
* @return
* @throws HibernateException
*/
private boolean activityCanBeStarted(Session session,String processInsId,String activityDefId) throws HibernateException
{
//得到所有的前趋活动
List preDriveList=HpdlFacade.getPreActivityDefList(Util.getDefIdByInsId(processInsId),activityDefId);
//得到前趋到本活动已经通达的数目
int passedCount=0;
for(int i=0;i<preDriveList.size();i++)
{
DriveTypeObject dto=(DriveTypeObject)preDriveList.get(i);
if(driveIsPassed(session,dto,activityDefId,processInsId)==true)
passedCount++;
}
//判断joinType
if(HpdlFacade.getJoinType(activityDefId).equals("and"))
{
if(passedCount<preDriveList.size())
return false;
else
return true;
}
else
{
if(passedCount>=1)
return true;
else
return false;
}
}
/**
* 一个DriveTypeObject
* 到本活动的一个流转是否已经通过
* 这里,同一流程实例,A活动的实例到B活动,A同时处于运行状态的(1,2.1,2.2,3)最多只可能有一个,也有可能没有
* @param session
* @param dto
* @param nextActivityDefId
* @return
* @throws HibernateException
*/
private boolean driveIsPassed(Session session,DriveTypeObject dto,String nextActivityDefId,String processInsId)throws HibernateException
{
HibernateActivity ha=new HibernateActivity();
List activityList=ha.getRunningByProcessInsAndActivityDef(session,processInsId,dto.getId());
if(activityList==null||activityList.size()==0)
{//已经全部完成
if(dto.getDrivedType().equalsIgnoreCase("auto"))
return true;
else//manual
{
boolean isAllDrived=true;
List list=ha.getNotRunningByProcessInsAndActivityDef(session,processInsId,dto.getId());
if(list!=null&&list.size()!=0)
{
for(int i=0;i<list.size();i++)
{
AgileActivity aa=(AgileActivity)list.get(i);
//只要有一个通路不通,则返回false
if((new HibernateDriveType()).get(session,aa.getActivityInsId(),dto.getId())==null)
isAllDrived=false;
}
}
return isAllDrived;
}
}
else
{//有没有完成的,只可能有一条记录,本通路肯定没有通
return false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -