在本系列第一篇文章介绍的基础上,开发一个简单的工作流应用系统,以第二篇文章介绍的请假流程为例。
把第二篇文章中做的mydemo.xpdl复制到应用的repository/external文件夹下面。
在mysql数据库中建立一个请假单据的业务表:
create table ask_for_leave (
id MEDIUMINT NOT NULL AUTO_INCREMENT primary key,
apply_user varchar(50), -- 申请人
apply_time timestamp default now(), -- 申请时间
begin_leave_time timestamp, -- 假期开始时间
end_leave_time timestamp, -- 假期结束时间
leave_reason varchar(500), -- 请假理由
approve_user varchar(50), -- 审批人
approve_time timestamp, -- 审批时间
is_passed smallint, -- 是否同意,1 同意,2 驳回
approve_remark varchar(500), -- 审批备注,如驳回的原因
back_time timestamp -- 销假时间
);
id MEDIUMINT NOT NULL AUTO_INCREMENT primary key,
apply_user varchar(50), -- 申请人
apply_time timestamp default now(), -- 申请时间
begin_leave_time timestamp, -- 假期开始时间
end_leave_time timestamp, -- 假期结束时间
leave_reason varchar(500), -- 请假理由
approve_user varchar(50), -- 审批人
approve_time timestamp, -- 审批时间
is_passed smallint, -- 是否同意,1 同意,2 驳回
approve_remark varchar(500), -- 审批备注,如驳回的原因
back_time timestamp -- 销假时间
);
建立一个用于与Shark交互的工具类:
package demo.shark;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import org.enhydra.shark.Shark;
import org.enhydra.shark.api.admin.ParticipantMappingManagerAdmin;
import org.enhydra.shark.api.client.wfmc.wapi.WMConnectInfo;
import org.enhydra.shark.api.client.wfmodel.WfAssignment;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfmodel.WfProcessIterator;
import org.enhydra.shark.api.client.wfmodel.WfProcessMgr;
import org.enhydra.shark.api.client.wfservice.PackageAdministration;
import org.enhydra.shark.api.client.wfservice.SharkConnection;
import org.enhydra.shark.api.client.wfservice.XPDLBrowser;
import org.enhydra.shark.api.common.SharkConstants;
import org.enhydra.shark.api.internal.partmappersistence.ParticipantMap;
import org.enhydra.shark.xpdl.XMLUtil;
public class SharkUtil {
private static DataSource ds;
/**
* 获取数据源
* @return
* @throws Exception
*/
public static DataSource getDS() throws Exception {
if (ds == null) ds = (DataSource) new InitialContext().lookup("java:comp/env/sharkdb");
return ds;
}
/**
* 获取数据库连接
* @return
* @throws Exception
*/
public static Connection getConn() throws Exception {
return getDS().getConnection();
}
/**
* 获取事务UserTransaction
* @return
* @throws Exception
*/
public static UserTransaction getUserTransaction() throws Exception {
UserTransaction ut = (UserTransaction) new InitialContext().lookup("java:comp/env/UserTransaction");
return ut;
}
//private static PackageFileFilter packageFileFilter = new PackageFileFilter();
private static Properties p = new Properties();
private static String EXTERNAL_PACKAGES_REPOSITORY = "repository/external";
private static boolean _debug_ = false;
private static boolean sharkConfigured = false;
private static boolean ipc = false;
private static String engineName = "sharkDemo";
//private static WMConnectInfo wmconnInfo;
public static final String VARIABLE_TO_PROCESS_UPDATE = "VariableToProcess_UPDATE";
public static final String VARIABLE_TO_PROCESS_VIEW = "VariableToProcess_VIEW";
/**
* 读取配置文件初始化工作流
* @param realPath
* @throws Exception
*/
public static void initProperties(String realPath)
throws Exception
{
if(_debug_)
{
System.err.println("#_init_#");
}
if(!ipc)
{
ipc = true;
try
{
if(!realPath.endsWith("//"))
{
realPath = realPath + "//";
}
realPath = replaceAll(realPath, "//", "/");
p.load(new FileInputStream(realPath + "conf/Shark.conf"));
Iterator it = p.keySet().iterator();
do
{
if(!it.hasNext())
{
break;
}
String key = (String)it.next();
String value = p.getProperty(key);
if(0 <= value.indexOf("@@"))
{
if(_debug_)
{
System.err.print("key is " + key + ", old value is" + value);
}
value = replaceAll(value, "@@/", realPath);
p.setProperty(key, value);
if(_debug_)
{
System.err.println(", new value is" + value);
}
}
} while(true);
p.load(new FileInputStream(realPath + "conf/SharkJSPClient.conf"));
setPathToXPDLRepositoryFolder(realPath + EXTERNAL_PACKAGES_REPOSITORY);
}
catch(Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
p.setProperty("enginename", engineName);
}
}
/**
* 初始化工作流
* @param realPath
* @throws Exception
*/
public static void init(String realPath)
throws Exception
{
if(!sharkConfigured)
{
initProperties(realPath);
Shark.configure(p);
sharkConfigured = true;
}
}
private static String replaceAll(String input, String forReplace, String replaceWith)
{
if(input == null)
{
return null;
}
StringBuffer result = new StringBuffer();
for(boolean hasMore = true; hasMore;)
{
int start = input.indexOf(forReplace);
int end = start + forReplace.length();
if(start != -1)
{
result.append(input.substring(0, start) + replaceWith);
input = input.substring(end);
} else
{
hasMore = false;
result.append(input);
}
}
if(result.toString().equals(""))
{
return input;
} else
{
return result.toString();
}
}
/**
* 设置xpdl文件所在的路径
* @param xpdlRepFolder
* @throws Exception
*/
public static void setPathToXPDLRepositoryFolder(String xpdlRepFolder)
throws Exception
{
EXTERNAL_PACKAGES_REPOSITORY = xpdlRepFolder;
System.err.println(xpdlRepFolder);
File f = new File(xpdlRepFolder);
System.err.println(f);
if(!f.isAbsolute())
{
System.err.println("isn't absolute");
f = f.getAbsoluteFile();
}
System.err.println(f);
if(!f.exists())
{
throw new Exception("Folder " + xpdlRepFolder + " does not exist");
}
try
{
EXTERNAL_PACKAGES_REPOSITORY = f.getCanonicalPath();
}
catch(Exception ex)
{
EXTERNAL_PACKAGES_REPOSITORY = f.getAbsolutePath();
}
}
/**
* 获取工作流引擎的名称
* @return
*/
public static String getEngineName() {
return engineName;
}
/**
* 获取工作流系统的连接
* @param wmconnInfo
* @return
* @throws Exception
*/
public static SharkConnection connect(WMConnectInfo wmconnInfo)
throws Exception
{
if(_debug_)
{
System.err.println("#_connect_#");
}
SharkConnection sConn = Shark.getInstance().getSharkConnection();
sConn.connect(wmconnInfo);
return sConn;
}
/**
* 关闭工作流连接
* @param sConn
* @throws Exception
*/
public static void disconnect(SharkConnection sConn)
throws Exception
{
if(_debug_)
{
System.err.println("#_disconnect_#");
}
sConn.disconnect();
}
/**
* 加载一个包
* @param sc
* @param xpdlName
* @return
* @throws Exception
*/
public static String loadPackage(SharkConnection sc, String xpdlName)
throws Exception
{
if(_debug_)
{
System.err.println("#_packageLoad_#");
}
String realPath = EXTERNAL_PACKAGES_REPOSITORY + "/" + xpdlName;
PackageAdministration pa = Shark.getInstance().getPackageAdministration();
String pkgId = XMLUtil.getIdFromFile(realPath);
if(!pa.isPackageOpened(sc.getSessionHandle(), pkgId))
{
try
{
pa.openPackage(sc.getSessionHandle(), realPath);
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
}
else
{
pa.updatePackageFromFile(sc.getSessionHandle(), pkgId, realPath);
}
return pkgId;
}
/**
* 获取流程的唯一定义名称
* @param sc
* @param pkgId
* @param pkgVer
* @param pDefId
* @return
* @throws Exception
*/
public static String getUniqueProcessDefinitionName(SharkConnection sc, java.lang.String pkgId, java.lang.String pkgVer, java.lang.String pDefId)
throws Exception
{
XPDLBrowser xpdlb = Shark.getInstance().getXPDLBrowser();
String procDefName = xpdlb.getUniqueProcessDefinitionName(sc.getSessionHandle(),
pkgId,
"",
pDefId);
return procDefName;
}
/**
* 开启一个流程
* @param sc
* @param mgrName
* @return
* @throws Exception
*/
public static WfProcess startProcess(SharkConnection sc, String mgrName)
throws Exception
{
if(_debug_)
{
System.err.println("#_processStartName_#");
}
try
{
WfProcess prs = null;
if(!isProcessRunning(sc, mgrName))
{
WfProcessMgr mgr = sc.getProcessMgr(mgrName);
prs = mgr.create_process(null);
prs.start();
}
return prs;
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
}
/**
* 流程是否在运行
* @param sc
* @param mgrName
* @return
* @throws Exception
*/
public static boolean isProcessRunning(SharkConnection sc, String mgrName)
throws Exception
{
try
{
System.err.println("#_isProcessRunning_# (" + mgrName + ")");
WfProcessIterator pit;
WfProcessMgr pMgr = sc.getProcessMgr(mgrName);
pit = pMgr.get_iterator_process();
pit.set_query_expression("state.equals(/"open.running/")");
if(_debug_)
{
System.err.println("#_" + pit.how_many() + "_#");
System.err.println("#_" + pit.get_next_n_sequence(0).length + "_#");
}
return 0 < pit.get_next_n_sequence(0).length;
}
catch (Exception e)
{
e.printStackTrace();
throw e;
}
}
/**
* 结束一个活动
* @param sConn
* @param activityId
* @throws Exception
*/
public static void completeActivity(SharkConnection sConn, String activityId)
throws Exception
{
try
{
if(null != activityId)
{
try
{
WfAssignment a = getAssignment(sConn, activityId);
if(!isMine(sConn, a))
{
assignmentAccept(sConn, a);
}
a.activity().complete();
}
catch(Exception e)
{
throw e;
}
}
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
}
/**
* 获取一个活动的分配
* @param sConn
* @param activityId
* @return
* @throws Exception
*/
public static WfAssignment getAssignment(SharkConnection sConn, String activityId)
throws Exception
{
WfAssignment ar[];
ar = sConn.getResourceObject().get_sequence_work_item(0);
System.out.println("--------------total activity count:" + ar.length);
for (int i=0; i<ar.length; i++)
{
System.out.println("--------------key:" + ar[i].activity().key());
if(activityId.equals(ar[i].activity().key()))
{
return ar[i];
}
}
throw new Exception("Activity:" + activityId + " not found in " + sConn.getResourceObject().resource_key() + "'s worklist");
}
/**
* 判断活动是否是连接工作流的用户所有
* @param sConn
* @param activityId
* @return
* @throws Exception
*/
public static boolean isMine(SharkConnection sConn, String activityId)
throws Exception
{
WfAssignment a = getAssignment(sConn, activityId);
return isMine(sConn, a);
}
/**
* 判断活动是否是连接工作流的用户所有
* @param sConn
* @param a
* @return
* @throws Exception
*/
public static boolean isMine(SharkConnection sConn, WfAssignment a)
throws Exception
{
return a.get_accepted_status();
}
/**
* 接受一个分配
* @param sConn
* @param activityId
* @throws Exception
*/
public static void assignmentAccept(SharkConnection sConn, String activityId)
throws Exception
{
assignmentAccept(sConn, getAssignment(sConn, activityId));
}
/**
* 接受一个分配
* @param sConn
* @param a
* @throws Exception
*/
public static void assignmentAccept(SharkConnection sConn, WfAssignment a)
throws Exception
{
a.set_accepted_status(true);
}
/**
* 设置流程上下文变量
* @param sConn
* @param activityId
* @param vName
* @param vValue
* @throws Exception
*/
public static void setVariable(SharkConnection sConn, String activityId, String vName, String vValue)
throws Exception
{
WfAssignment a = getAssignment(sConn, activityId);
if(!isMine(sConn, a))
{
throw new Exception("I don't own activity " + activityId);
}
Map _m = new HashMap();
Object c = a.activity().process_context().get(vName);
if(c instanceof Long)
{
c = new Long(vValue);
} else
if(c instanceof Boolean)
{
c = Boolean.valueOf(vValue);
} else
if(c instanceof Double)
{
c = Double.valueOf(vValue);
} else
{
c = vValue;
}
_m.put(vName, c);
a.activity().set_result(_m);
}
/**
* 获取工作列表
* @param sConn
* @return
* @throws Exception
*/
public static List<Map> getWorkList(SharkConnection sConn)
throws Exception
{
List<Map> workList = new ArrayList<Map>();
WfAssignment ar[];
ar = sConn.getResourceObject().get_sequence_work_item(0);
System.out.println("--------------total activity count:" + ar.length);
for (int i=0; i<ar.length; i++)
{
Map workItem = new HashMap();
workItem.put("processName", ar[i].activity().container().name());
workItem.put("activityName", ar[i].activity().name());
workItem.put("processContext", ar[i].activity().process_context());
workItem.put("activityKey", ar[i].activity().key());
workList.add(workItem);
}
return workList;
}
}
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
import org.enhydra.shark.Shark;
import org.enhydra.shark.api.admin.ParticipantMappingManagerAdmin;
import org.enhydra.shark.api.client.wfmc.wapi.WMConnectInfo;
import org.enhydra.shark.api.client.wfmodel.WfAssignment;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfmodel.WfProcessIterator;
import org.enhydra.shark.api.client.wfmodel.WfProcessMgr;
import org.enhydra.shark.api.client.wfservice.PackageAdministration;
import org.enhydra.shark.api.client.wfservice.SharkConnection;
import org.enhydra.shark.api.client.wfservice.XPDLBrowser;
import org.enhydra.shark.api.common.SharkConstants;
import org.enhydra.shark.api.internal.partmappersistence.ParticipantMap;
import org.enhydra.shark.xpdl.XMLUtil;
public class SharkUtil {
private static DataSource ds;
/**
* 获取数据源
* @return
* @throws Exception
*/
public static DataSource getDS() throws Exception {
if (ds == null) ds = (DataSource) new InitialContext().lookup("java:comp/env/sharkdb");
return ds;
}
/**
* 获取数据库连接
* @return
* @throws Exception
*/
public static Connection getConn() throws Exception {
return getDS().getConnection();
}
/**
* 获取事务UserTransaction
* @return
* @throws Exception
*/
public static UserTransaction getUserTransaction() throws Exception {
UserTransaction ut = (UserTransaction) new InitialContext().lookup("java:comp/env/UserTransaction");
return ut;
}
//private static PackageFileFilter packageFileFilter = new PackageFileFilter();
private static Properties p = new Properties();
private static String EXTERNAL_PACKAGES_REPOSITORY = "repository/external";
private static boolean _debug_ = false;
private static boolean sharkConfigured = false;
private static boolean ipc = false;
private static String engineName = "sharkDemo";
//private static WMConnectInfo wmconnInfo;
public static final String VARIABLE_TO_PROCESS_UPDATE = "VariableToProcess_UPDATE";
public static final String VARIABLE_TO_PROCESS_VIEW = "VariableToProcess_VIEW";
/**
* 读取配置文件初始化工作流
* @param realPath
* @throws Exception
*/
public static void initProperties(String realPath)
throws Exception
{
if(_debug_)
{
System.err.println("#_init_#");
}
if(!ipc)
{
ipc = true;
try
{
if(!realPath.endsWith("//"))
{
realPath = realPath + "//";
}
realPath = replaceAll(realPath, "//", "/");
p.load(new FileInputStream(realPath + "conf/Shark.conf"));
Iterator it = p.keySet().iterator();
do
{
if(!it.hasNext())
{
break;
}
String key = (String)it.next();
String value = p.getProperty(key);
if(0 <= value.indexOf("@@"))
{
if(_debug_)
{
System.err.print("key is " + key + ", old value is" + value);
}
value = replaceAll(value, "@@/", realPath);
p.setProperty(key, value);
if(_debug_)
{
System.err.println(", new value is" + value);
}
}
} while(true);
p.load(new FileInputStream(realPath + "conf/SharkJSPClient.conf"));
setPathToXPDLRepositoryFolder(realPath + EXTERNAL_PACKAGES_REPOSITORY);
}
catch(Exception e)
{
System.out.println(e.getMessage());
e.printStackTrace();
}
p.setProperty("enginename", engineName);
}
}
/**
* 初始化工作流
* @param realPath
* @throws Exception
*/
public static void init(String realPath)
throws Exception
{
if(!sharkConfigured)
{
initProperties(realPath);
Shark.configure(p);
sharkConfigured = true;
}
}
private static String replaceAll(String input, String forReplace, String replaceWith)
{
if(input == null)
{
return null;
}
StringBuffer result = new StringBuffer();
for(boolean hasMore = true; hasMore;)
{
int start = input.indexOf(forReplace);
int end = start + forReplace.length();
if(start != -1)
{
result.append(input.substring(0, start) + replaceWith);
input = input.substring(end);
} else
{
hasMore = false;
result.append(input);
}
}
if(result.toString().equals(""))
{
return input;
} else
{
return result.toString();
}
}
/**
* 设置xpdl文件所在的路径
* @param xpdlRepFolder
* @throws Exception
*/
public static void setPathToXPDLRepositoryFolder(String xpdlRepFolder)
throws Exception
{
EXTERNAL_PACKAGES_REPOSITORY = xpdlRepFolder;
System.err.println(xpdlRepFolder);
File f = new File(xpdlRepFolder);
System.err.println(f);
if(!f.isAbsolute())
{
System.err.println("isn't absolute");
f = f.getAbsoluteFile();
}
System.err.println(f);
if(!f.exists())
{
throw new Exception("Folder " + xpdlRepFolder + " does not exist");
}
try
{
EXTERNAL_PACKAGES_REPOSITORY = f.getCanonicalPath();
}
catch(Exception ex)
{
EXTERNAL_PACKAGES_REPOSITORY = f.getAbsolutePath();
}
}
/**
* 获取工作流引擎的名称
* @return
*/
public static String getEngineName() {
return engineName;
}
/**
* 获取工作流系统的连接
* @param wmconnInfo
* @return
* @throws Exception
*/
public static SharkConnection connect(WMConnectInfo wmconnInfo)
throws Exception
{
if(_debug_)
{
System.err.println("#_connect_#");
}
SharkConnection sConn = Shark.getInstance().getSharkConnection();
sConn.connect(wmconnInfo);
return sConn;
}
/**
* 关闭工作流连接
* @param sConn
* @throws Exception
*/
public static void disconnect(SharkConnection sConn)
throws Exception
{
if(_debug_)
{
System.err.println("#_disconnect_#");
}
sConn.disconnect();
}
/**
* 加载一个包
* @param sc
* @param xpdlName
* @return
* @throws Exception
*/
public static String loadPackage(SharkConnection sc, String xpdlName)
throws Exception
{
if(_debug_)
{
System.err.println("#_packageLoad_#");
}
String realPath = EXTERNAL_PACKAGES_REPOSITORY + "/" + xpdlName;
PackageAdministration pa = Shark.getInstance().getPackageAdministration();
String pkgId = XMLUtil.getIdFromFile(realPath);
if(!pa.isPackageOpened(sc.getSessionHandle(), pkgId))
{
try
{
pa.openPackage(sc.getSessionHandle(), realPath);
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
}
else
{
pa.updatePackageFromFile(sc.getSessionHandle(), pkgId, realPath);
}
return pkgId;
}
/**
* 获取流程的唯一定义名称
* @param sc
* @param pkgId
* @param pkgVer
* @param pDefId
* @return
* @throws Exception
*/
public static String getUniqueProcessDefinitionName(SharkConnection sc, java.lang.String pkgId, java.lang.String pkgVer, java.lang.String pDefId)
throws Exception
{
XPDLBrowser xpdlb = Shark.getInstance().getXPDLBrowser();
String procDefName = xpdlb.getUniqueProcessDefinitionName(sc.getSessionHandle(),
pkgId,
"",
pDefId);
return procDefName;
}
/**
* 开启一个流程
* @param sc
* @param mgrName
* @return
* @throws Exception
*/
public static WfProcess startProcess(SharkConnection sc, String mgrName)
throws Exception
{
if(_debug_)
{
System.err.println("#_processStartName_#");
}
try
{
WfProcess prs = null;
if(!isProcessRunning(sc, mgrName))
{
WfProcessMgr mgr = sc.getProcessMgr(mgrName);
prs = mgr.create_process(null);
prs.start();
}
return prs;
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
}
/**
* 流程是否在运行
* @param sc
* @param mgrName
* @return
* @throws Exception
*/
public static boolean isProcessRunning(SharkConnection sc, String mgrName)
throws Exception
{
try
{
System.err.println("#_isProcessRunning_# (" + mgrName + ")");
WfProcessIterator pit;
WfProcessMgr pMgr = sc.getProcessMgr(mgrName);
pit = pMgr.get_iterator_process();
pit.set_query_expression("state.equals(/"open.running/")");
if(_debug_)
{
System.err.println("#_" + pit.how_many() + "_#");
System.err.println("#_" + pit.get_next_n_sequence(0).length + "_#");
}
return 0 < pit.get_next_n_sequence(0).length;
}
catch (Exception e)
{
e.printStackTrace();
throw e;
}
}
/**
* 结束一个活动
* @param sConn
* @param activityId
* @throws Exception
*/
public static void completeActivity(SharkConnection sConn, String activityId)
throws Exception
{
try
{
if(null != activityId)
{
try
{
WfAssignment a = getAssignment(sConn, activityId);
if(!isMine(sConn, a))
{
assignmentAccept(sConn, a);
}
a.activity().complete();
}
catch(Exception e)
{
throw e;
}
}
}
catch(Exception e)
{
e.printStackTrace();
throw e;
}
}
/**
* 获取一个活动的分配
* @param sConn
* @param activityId
* @return
* @throws Exception
*/
public static WfAssignment getAssignment(SharkConnection sConn, String activityId)
throws Exception
{
WfAssignment ar[];
ar = sConn.getResourceObject().get_sequence_work_item(0);
System.out.println("--------------total activity count:" + ar.length);
for (int i=0; i<ar.length; i++)
{
System.out.println("--------------key:" + ar[i].activity().key());
if(activityId.equals(ar[i].activity().key()))
{
return ar[i];
}
}
throw new Exception("Activity:" + activityId + " not found in " + sConn.getResourceObject().resource_key() + "'s worklist");
}
/**
* 判断活动是否是连接工作流的用户所有
* @param sConn
* @param activityId
* @return
* @throws Exception
*/
public static boolean isMine(SharkConnection sConn, String activityId)
throws Exception
{
WfAssignment a = getAssignment(sConn, activityId);
return isMine(sConn, a);
}
/**
* 判断活动是否是连接工作流的用户所有
* @param sConn
* @param a
* @return
* @throws Exception
*/
public static boolean isMine(SharkConnection sConn, WfAssignment a)
throws Exception
{
return a.get_accepted_status();
}
/**
* 接受一个分配
* @param sConn
* @param activityId
* @throws Exception
*/
public static void assignmentAccept(SharkConnection sConn, String activityId)
throws Exception
{
assignmentAccept(sConn, getAssignment(sConn, activityId));
}
/**
* 接受一个分配
* @param sConn
* @param a
* @throws Exception
*/
public static void assignmentAccept(SharkConnection sConn, WfAssignment a)
throws Exception
{
a.set_accepted_status(true);
}
/**
* 设置流程上下文变量
* @param sConn
* @param activityId
* @param vName
* @param vValue
* @throws Exception
*/
public static void setVariable(SharkConnection sConn, String activityId, String vName, String vValue)
throws Exception
{
WfAssignment a = getAssignment(sConn, activityId);
if(!isMine(sConn, a))
{
throw new Exception("I don't own activity " + activityId);
}
Map _m = new HashMap();
Object c = a.activity().process_context().get(vName);
if(c instanceof Long)
{
c = new Long(vValue);
} else
if(c instanceof Boolean)
{
c = Boolean.valueOf(vValue);
} else
if(c instanceof Double)
{
c = Double.valueOf(vValue);
} else
{
c = vValue;
}
_m.put(vName, c);
a.activity().set_result(_m);
}
/**
* 获取工作列表
* @param sConn
* @return
* @throws Exception
*/
public static List<Map> getWorkList(SharkConnection sConn)
throws Exception
{
List<Map> workList = new ArrayList<Map>();
WfAssignment ar[];
ar = sConn.getResourceObject().get_sequence_work_item(0);
System.out.println("--------------total activity count:" + ar.length);
for (int i=0; i<ar.length; i++)
{
Map workItem = new HashMap();
workItem.put("processName", ar[i].activity().container().name());
workItem.put("activityName", ar[i].activity().name());
workItem.put("processContext", ar[i].activity().process_context());
workItem.put("activityKey", ar[i].activity().key());
workList.add(workItem);
}
return workList;
}
}
建立用于请假的业务类:
package demo.shark;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Status;
import javax.transaction.UserTransaction;
import org.enhydra.shark.Shark;
import org.enhydra.shark.api.client.wfmc.wapi.WMConnectInfo;
import org.enhydra.shark.api.client.wfmodel.WfActivity;
import org.enhydra.shark.api.client.wfmodel.WfAssignment;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfservice.PackageAdministration;
import org.enhydra.shark.api.client.wfservice.SharkConnection;
public class AskForLeave {
private final static String employeeName = "user1";
private final static String employeePwd = "user1";
private final static String managerName = "user1";
private final static String managerPwd = "user1";
/**
* 请假申请
* @param request
* @throws Exception
*/
public static void apply(HttpServletRequest request) throws Exception {
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//*********业务部分
//请假申请存入数据库
Statement stmt = conn.createStatement();
String sql = "insert into ask_for_leave(apply_user," +
"begin_leave_time,end_leave_time,leave_reason) values(" +
"'" + request.getParameter("apply_user") + "'," +
"'" + request.getParameter("begin_leave_time") + "'," +
"'" + request.getParameter("end_leave_time") + "'," +
"'" + request.getParameter("leave_reason") + "')";
System.out.println("insert:" + sql);
stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
int id = 0;
if (rs.next()) id = rs.getInt(1);
System.out.println("--------------id:" + id);
//*********工作流部分
System.out.println("--------------wf init");
//初始化
SharkUtil.init(request.getRealPath("/"));
//加载包
WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
String pkgId = SharkUtil.loadPackage(shConn, "mydemo.xpdl");
System.out.println("--------------load pachage:" + pkgId);
//启动流程
PackageAdministration pa = Shark.getInstance().getPackageAdministration();
String pkgVersion = pa.getCurrentPackageVersion(shConn.getSessionHandle(), pkgId);
String procDefName = SharkUtil.getUniqueProcessDefinitionName(shConn, pkgId, pkgVersion, "askForLeave");
WfProcess prs = SharkUtil.startProcess(shConn, procDefName);
Map prsCtx = new HashMap();
prsCtx.put("biz_id", id + "");
prs.set_process_context(prsCtx);
System.out.println("--------------start process:" + procDefName);
//完成申请活动
WfActivity[] act = prs.get_sequence_step(1);
SharkUtil.assignmentAccept(shConn, act[0].key());
act[0].complete();
System.out.println("--------------comolete apply activity");
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
}
/**
* 获取经理的工作列表
* @param request
* @return
* @throws Exception
*/
public static List<Map> getManagerWorkList(HttpServletRequest request) throws Exception {
List<Map> workList = null;
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//初始化
SharkUtil.init(request.getRealPath("/"));
//获取工作流连接
WMConnectInfo wmconnInfo = new WMConnectInfo(managerName, managerPwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
System.out.println("--------------get wf connection");
//获取工作列表
workList = SharkUtil.getWorkList(shConn);
System.out.println("--------------work list count:" + workList.size());
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
return workList;
}
/**
* 获取申请人的工作列表
* @param request
* @return
* @throws Exception
*/
public static List<Map> getEmployeeWorkList(HttpServletRequest request) throws Exception {
List<Map> workList = null;
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//初始化
SharkUtil.init(request.getRealPath("/"));
//获取工作流连接
WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
System.out.println("--------------get wf connection");
//获取工作列表
workList = SharkUtil.getWorkList(shConn);
System.out.println("--------------work list count:" + workList.size());
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
return workList;
}
/**
* 根据请假单id获取请假单信息
* @param id
* @return
* @throws Exception
*/
public static Map getById(String id) throws Exception {
Map form = new HashMap();
Connection conn = SharkUtil.getConn();
try {
Statement stmt = conn.createStatement();
ResultSet rst = stmt.executeQuery("select * from ask_for_leave where id=" + id);
if (rst.next()) {
form.put("apply_user", rst.getString("apply_user"));
form.put("begin_leave_time", rst.getString("begin_leave_time"));
form.put("end_leave_time", rst.getString("end_leave_time"));
form.put("leave_reason", rst.getString("leave_reason"));
}
rst.close();
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
throw e;
}
finally {
if (conn != null) conn.close();
}
return form;
}
/**
* 审批
* @param request
* @throws Exception
*/
public static void approval(HttpServletRequest request) throws Exception {
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//审批信息存入数据库
Statement stmt = conn.createStatement();
String sql = "update ask_for_leave set " +
"approve_user='" + managerName + "', " +
"approve_time=now()," +
"is_passed=" + request.getParameter("is_passed") + "," +
"approve_remark='" + request.getParameter("approve_remark") + "' " +
"where id=" + request.getParameter("biz_id");
System.out.println("--------------update:" + sql);
stmt.executeUpdate(sql);
System.out.println("--------------update complete");
//初始化
SharkUtil.init(request.getRealPath("/"));
//连接工作流
WMConnectInfo wmconnInfo = new WMConnectInfo(managerName, managerPwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
//完成审批活动
String activityKey = request.getParameter("activityKey");
WfAssignment wfAssignment = SharkUtil.getAssignment(shConn, activityKey);
SharkUtil.assignmentAccept(shConn, wfAssignment);
boolean is_passed = false;
if ("1".equals(request.getParameter("is_passed"))) is_passed = true;
Map processContext = new HashMap();
processContext.put("is_passed", new Boolean(is_passed));
wfAssignment.activity().container().set_process_context(processContext);
wfAssignment.activity().complete();
System.out.println("--------------comolete approval activity");
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
}
/**
* 申请人处理审批后的事务
* @param request
* @throws Exception
*/
public static void leave(HttpServletRequest request) throws Exception {
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//处理休假情况
Statement stmt = conn.createStatement();
ResultSet rst = stmt.executeQuery("select * from ask_for_leave where id="+request.getParameter("biz_id")+"");
boolean isPassed = false;
if (rst.next()) {
if ("1".equals(rst.getString("is_passed"))) isPassed = true;
}
if (isPassed) {
String sql = "update ask_for_leave set " +
"back_time=now() " +
"where id=" + request.getParameter("biz_id");
System.out.println("--------------update:" + sql);
stmt.executeUpdate(sql);
}
System.out.println("--------------update complete");
//初始化
SharkUtil.init(request.getRealPath("/"));
//连接工作流
WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
//完成最后的活动
String activityKey = request.getParameter("activityKey");
WfAssignment wfAssignment = SharkUtil.getAssignment(shConn, activityKey);
SharkUtil.assignmentAccept(shConn, wfAssignment);
wfAssignment.activity().complete();
System.out.println("--------------comolete all activity");
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
}
}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Status;
import javax.transaction.UserTransaction;
import org.enhydra.shark.Shark;
import org.enhydra.shark.api.client.wfmc.wapi.WMConnectInfo;
import org.enhydra.shark.api.client.wfmodel.WfActivity;
import org.enhydra.shark.api.client.wfmodel.WfAssignment;
import org.enhydra.shark.api.client.wfmodel.WfProcess;
import org.enhydra.shark.api.client.wfservice.PackageAdministration;
import org.enhydra.shark.api.client.wfservice.SharkConnection;
public class AskForLeave {
private final static String employeeName = "user1";
private final static String employeePwd = "user1";
private final static String managerName = "user1";
private final static String managerPwd = "user1";
/**
* 请假申请
* @param request
* @throws Exception
*/
public static void apply(HttpServletRequest request) throws Exception {
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//*********业务部分
//请假申请存入数据库
Statement stmt = conn.createStatement();
String sql = "insert into ask_for_leave(apply_user," +
"begin_leave_time,end_leave_time,leave_reason) values(" +
"'" + request.getParameter("apply_user") + "'," +
"'" + request.getParameter("begin_leave_time") + "'," +
"'" + request.getParameter("end_leave_time") + "'," +
"'" + request.getParameter("leave_reason") + "')";
System.out.println("insert:" + sql);
stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
int id = 0;
if (rs.next()) id = rs.getInt(1);
System.out.println("--------------id:" + id);
//*********工作流部分
System.out.println("--------------wf init");
//初始化
SharkUtil.init(request.getRealPath("/"));
//加载包
WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
String pkgId = SharkUtil.loadPackage(shConn, "mydemo.xpdl");
System.out.println("--------------load pachage:" + pkgId);
//启动流程
PackageAdministration pa = Shark.getInstance().getPackageAdministration();
String pkgVersion = pa.getCurrentPackageVersion(shConn.getSessionHandle(), pkgId);
String procDefName = SharkUtil.getUniqueProcessDefinitionName(shConn, pkgId, pkgVersion, "askForLeave");
WfProcess prs = SharkUtil.startProcess(shConn, procDefName);
Map prsCtx = new HashMap();
prsCtx.put("biz_id", id + "");
prs.set_process_context(prsCtx);
System.out.println("--------------start process:" + procDefName);
//完成申请活动
WfActivity[] act = prs.get_sequence_step(1);
SharkUtil.assignmentAccept(shConn, act[0].key());
act[0].complete();
System.out.println("--------------comolete apply activity");
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
}
/**
* 获取经理的工作列表
* @param request
* @return
* @throws Exception
*/
public static List<Map> getManagerWorkList(HttpServletRequest request) throws Exception {
List<Map> workList = null;
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//初始化
SharkUtil.init(request.getRealPath("/"));
//获取工作流连接
WMConnectInfo wmconnInfo = new WMConnectInfo(managerName, managerPwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
System.out.println("--------------get wf connection");
//获取工作列表
workList = SharkUtil.getWorkList(shConn);
System.out.println("--------------work list count:" + workList.size());
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
return workList;
}
/**
* 获取申请人的工作列表
* @param request
* @return
* @throws Exception
*/
public static List<Map> getEmployeeWorkList(HttpServletRequest request) throws Exception {
List<Map> workList = null;
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//初始化
SharkUtil.init(request.getRealPath("/"));
//获取工作流连接
WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
System.out.println("--------------get wf connection");
//获取工作列表
workList = SharkUtil.getWorkList(shConn);
System.out.println("--------------work list count:" + workList.size());
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
return workList;
}
/**
* 根据请假单id获取请假单信息
* @param id
* @return
* @throws Exception
*/
public static Map getById(String id) throws Exception {
Map form = new HashMap();
Connection conn = SharkUtil.getConn();
try {
Statement stmt = conn.createStatement();
ResultSet rst = stmt.executeQuery("select * from ask_for_leave where id=" + id);
if (rst.next()) {
form.put("apply_user", rst.getString("apply_user"));
form.put("begin_leave_time", rst.getString("begin_leave_time"));
form.put("end_leave_time", rst.getString("end_leave_time"));
form.put("leave_reason", rst.getString("leave_reason"));
}
rst.close();
stmt.close();
}
catch (Exception e) {
e.printStackTrace();
throw e;
}
finally {
if (conn != null) conn.close();
}
return form;
}
/**
* 审批
* @param request
* @throws Exception
*/
public static void approval(HttpServletRequest request) throws Exception {
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//审批信息存入数据库
Statement stmt = conn.createStatement();
String sql = "update ask_for_leave set " +
"approve_user='" + managerName + "', " +
"approve_time=now()," +
"is_passed=" + request.getParameter("is_passed") + "," +
"approve_remark='" + request.getParameter("approve_remark") + "' " +
"where id=" + request.getParameter("biz_id");
System.out.println("--------------update:" + sql);
stmt.executeUpdate(sql);
System.out.println("--------------update complete");
//初始化
SharkUtil.init(request.getRealPath("/"));
//连接工作流
WMConnectInfo wmconnInfo = new WMConnectInfo(managerName, managerPwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
//完成审批活动
String activityKey = request.getParameter("activityKey");
WfAssignment wfAssignment = SharkUtil.getAssignment(shConn, activityKey);
SharkUtil.assignmentAccept(shConn, wfAssignment);
boolean is_passed = false;
if ("1".equals(request.getParameter("is_passed"))) is_passed = true;
Map processContext = new HashMap();
processContext.put("is_passed", new Boolean(is_passed));
wfAssignment.activity().container().set_process_context(processContext);
wfAssignment.activity().complete();
System.out.println("--------------comolete approval activity");
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
}
/**
* 申请人处理审批后的事务
* @param request
* @throws Exception
*/
public static void leave(HttpServletRequest request) throws Exception {
UserTransaction ut = SharkUtil.getUserTransaction();
Connection conn = SharkUtil.getConn();
boolean rollback = false;
SharkConnection shConn = null;
try {
ut.begin();
//处理休假情况
Statement stmt = conn.createStatement();
ResultSet rst = stmt.executeQuery("select * from ask_for_leave where id="+request.getParameter("biz_id")+"");
boolean isPassed = false;
if (rst.next()) {
if ("1".equals(rst.getString("is_passed"))) isPassed = true;
}
if (isPassed) {
String sql = "update ask_for_leave set " +
"back_time=now() " +
"where id=" + request.getParameter("biz_id");
System.out.println("--------------update:" + sql);
stmt.executeUpdate(sql);
}
System.out.println("--------------update complete");
//初始化
SharkUtil.init(request.getRealPath("/"));
//连接工作流
WMConnectInfo wmconnInfo = new WMConnectInfo(employeeName, employeePwd, SharkUtil.getEngineName(), "");
shConn = SharkUtil.connect(wmconnInfo);
//完成最后的活动
String activityKey = request.getParameter("activityKey");
WfAssignment wfAssignment = SharkUtil.getAssignment(shConn, activityKey);
SharkUtil.assignmentAccept(shConn, wfAssignment);
wfAssignment.activity().complete();
System.out.println("--------------comolete all activity");
}
catch (Exception e) {
rollback = true;
e.printStackTrace();
throw e;
}
finally {
if (shConn != null) SharkUtil.disconnect(shConn);
if (ut != null && ut.getStatus() != Status.STATUS_NO_TRANSACTION) {
if (rollback) ut.rollback();
else ut.commit();
}
if (conn != null) conn.close();
}
}
}
然后建立几个jsp文件。apply.jsp是申请请假的页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<form name="form1" method="POST" action="apply_result.jsp">
申请人:<input type="text" name="apply_user" value="suntao"/><br/>
假期开始时间:<input type="text" name="begin_leave_time" value="2009-08-07 09:00"/>(YYYY-MM-DD HH24:MI)<br/>
假期结束时间:<input type="text" name="end_leave_time" value="2009-08-07 18:00"/>(YYYY-MM-DD HH24:MI)<br/>
请假理由:<input type="text" name="leave_reason" value="事假"/><br/>
<input type="submit" value="提交"/><br/>
</form>
</body>
</html>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<form name="form1" method="POST" action="apply_result.jsp">
申请人:<input type="text" name="apply_user" value="suntao"/><br/>
假期开始时间:<input type="text" name="begin_leave_time" value="2009-08-07 09:00"/>(YYYY-MM-DD HH24:MI)<br/>
假期结束时间:<input type="text" name="end_leave_time" value="2009-08-07 18:00"/>(YYYY-MM-DD HH24:MI)<br/>
请假理由:<input type="text" name="leave_reason" value="事假"/><br/>
<input type="submit" value="提交"/><br/>
</form>
</body>
</html>
请假处理的页面apply_result.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.apply(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.apply(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
经理的工作列表页面managerWorkList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%
List<Map> workList = AskForLeave.getManagerWorkList(request);
%>
<table border="1">
<tr>
<td>工作名称</td>
<td>工作任务</td>
<td>处理</td>
</tr>
<%for(int i=0;i<workList.size();i++){ %>
<tr>
<%
Map processContext = (Map) workList.get(i).get("processContext");
String biz_id = processContext.get("biz_id").toString();
String activityKey = workList.get(i).get("activityKey").toString();
%>
<td><%=workList.get(i).get("processName") %></td>
<td><%=workList.get(i).get("activityName") %></td>
<td><a href="approval.jsp?biz_id=<%=biz_id %>&activityKey=<%=activityKey %>">处理</a></td>
</tr>
<%} %>
</table>
</body>
</html>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%
List<Map> workList = AskForLeave.getManagerWorkList(request);
%>
<table border="1">
<tr>
<td>工作名称</td>
<td>工作任务</td>
<td>处理</td>
</tr>
<%for(int i=0;i<workList.size();i++){ %>
<tr>
<%
Map processContext = (Map) workList.get(i).get("processContext");
String biz_id = processContext.get("biz_id").toString();
String activityKey = workList.get(i).get("activityKey").toString();
%>
<td><%=workList.get(i).get("processName") %></td>
<td><%=workList.get(i).get("activityName") %></td>
<td><a href="approval.jsp?biz_id=<%=biz_id %>&activityKey=<%=activityKey %>">处理</a></td>
</tr>
<%} %>
</table>
</body>
</html>
审批页面approval.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
<script language="javascript">
function go(is_passed)
{
document.getElementById("is_passed").value = is_passed;
document.getElementById("form1").submit();
}
</script>
</head>
<body>
<%
String id=request.getParameter("biz_id");
Map formData = AskForLeave.getById(id);
%>
<form id="form1" name="form1" method="POST" action="approval_result.jsp">
<input type="hidden" name="biz_id" value="<%=id %>"/>
<input type="hidden" name="activityKey" value="<%=request.getParameter("activityKey") %>"/>
<input type="hidden" id="is_passed" name="is_passed" value=""/>
申请人:<%=formData.get("apply_user") %><br/>
假期开始时间:<%=formData.get("begin_leave_time") %><br/>
假期结束时间:<%=formData.get("end_leave_time") %><br/>
请假理由:<%=formData.get("leave_reason") %><br/>
审批意见:<input type="text" name="approve_remark" value=""/><br/>
<input type="button" value="同意" οnclick="go(1)"/> <input type="button" value="拒绝" οnclick="go(2)"/><br/>
</form>
</body>
</html>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
<script language="javascript">
function go(is_passed)
{
document.getElementById("is_passed").value = is_passed;
document.getElementById("form1").submit();
}
</script>
</head>
<body>
<%
String id=request.getParameter("biz_id");
Map formData = AskForLeave.getById(id);
%>
<form id="form1" name="form1" method="POST" action="approval_result.jsp">
<input type="hidden" name="biz_id" value="<%=id %>"/>
<input type="hidden" name="activityKey" value="<%=request.getParameter("activityKey") %>"/>
<input type="hidden" id="is_passed" name="is_passed" value=""/>
申请人:<%=formData.get("apply_user") %><br/>
假期开始时间:<%=formData.get("begin_leave_time") %><br/>
假期结束时间:<%=formData.get("end_leave_time") %><br/>
请假理由:<%=formData.get("leave_reason") %><br/>
审批意见:<input type="text" name="approve_remark" value=""/><br/>
<input type="button" value="同意" οnclick="go(1)"/> <input type="button" value="拒绝" οnclick="go(2)"/><br/>
</form>
</body>
</html>
审批处理页面approval_result.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.approval(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.approval(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
申请人工作列表页面employeeWorkList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%
List<Map> workList = AskForLeave.getEmployeeWorkList(request);
%>
<table border="1">
<tr>
<td>工作名称</td>
<td>工作任务</td>
<td>处理</td>
</tr>
<%for(int i=0;i<workList.size();i++){ %>
<tr>
<%
Map processContext = (Map) workList.get(i).get("processContext");
String biz_id = processContext.get("biz_id").toString();
String activityKey = workList.get(i).get("activityKey").toString();
%>
<td><%=workList.get(i).get("processName") %></td>
<td><%=workList.get(i).get("activityName") %></td>
<td><a href="leave_result.jsp?biz_id=<%=biz_id %>&activityKey=<%=activityKey %>">处理</a></td>
</tr>
<%} %>
</table>
</body>
</html>
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="demo.shark.AskForLeave"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%
List<Map> workList = AskForLeave.getEmployeeWorkList(request);
%>
<table border="1">
<tr>
<td>工作名称</td>
<td>工作任务</td>
<td>处理</td>
</tr>
<%for(int i=0;i<workList.size();i++){ %>
<tr>
<%
Map processContext = (Map) workList.get(i).get("processContext");
String biz_id = processContext.get("biz_id").toString();
String activityKey = workList.get(i).get("activityKey").toString();
%>
<td><%=workList.get(i).get("processName") %></td>
<td><%=workList.get(i).get("activityName") %></td>
<td><a href="leave_result.jsp?biz_id=<%=biz_id %>&activityKey=<%=activityKey %>">处理</a></td>
</tr>
<%} %>
</table>
</body>
</html>
申请人处理审批后事务页面leave_result.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.leave(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
pageEncoding="UTF-8"%>
<%@page import="demo.shark.AskForLeave"%>
<%
request.setCharacterEncoding("UTF-8");
String result = "成功";
try {
AskForLeave.leave(request);
}
catch(Exception e) {
result = "失败";
e.printStackTrace();
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>apply</title>
</head>
<body>
<%=result %>
</body>
</html>
然后运行taomcat,在apply.jsp页面发起请假申请,在managerWorkList.jsp页面进行审批,在employeeWorkList.jsp页面进行后续处理。
但这里有个问题,在类AskForLeave中都是用user1这一个用户登录的工作流系统,没有区分出谁处理对应的工作,这就涉及到任务的分配问题,下一篇接着讲述。