OSWorkflow的第三支程式

本文介绍了一个基于OSWorkflow的工作流实现,请假流程中通过传值区分不同类型的假期,并将这些信息存储在数据库中以备后续判断。
如前面的請假流程,員工只是請假,但是假有分很多種,事假、病假、婚假、年假…,在workflow中如何區分呢? 我們可以傳值到流程中,並儲存在資料庫中供以後判斷!


程式
leave.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"
"http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
<workflow>
<initial-actions>
<action id="0" name="開始">
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
<function type="beanshell">
<arg name="script">
propertySet.setString("type", transientVars.get("type"));
</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Queued"
step="1" owner="${caller}" />
</results>
<post-functions>
<function type="class">
<arg name="class.name">
tw.idv.idealist.OutputPropertySet
</arg>
<arg name="author">Steven Shi</arg>
</function>
</post-functions>
</action>
</initial-actions>

<steps>
<step id="1" name="填假單">
<actions>
<action id="1" name="送出">
<restrict-to>
<conditions>
<condition type="class">
<arg name="class.name">
com.opensymphony.workflow.util.AllowOwnerOnlyCondition
</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Queued"
step="2" owner="${caller}" />
</results>
</action>
</actions>
</step>

<step id="2" name="批假單">
<actions>
<action id="2" name="准許">
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Queued"
step="3" owner="${caller}"/>
</results>
</action>

<action id="3" name="駁回">
<pre-functions>
<function type="class">
<arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Finished" status="Queued"
step="1" owner="${caller}"/>
</results>
</action>
</actions>
</step>

<step id="3" name="停止" />
</steps>
</workflow>
leave.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
<HEAD>
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5" %>
<%@ page import="tw.idv.idealist.*" %>

<META http-equiv="Content-Type" content="text/html; charset=BIG5">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>填寫假單</TITLE>
<Script Language="JavaScript">
function DoAction(type) {
document.myForm.type.value = type;
document.myForm.submit();
}
</Script>
</HEAD>
<BODY>
<P>員工請假</P>

<form name="myForm" action="LeaveAction">
<input type="hidden" name="type" value="">
員工代號: <input type="text" name="employee"><br>
<input type="button" value="事假" OnClick="DoAction(1)">
 <input type="button" value="病假" OnClick="DoAction(2)">
</form>

</BODY>
</HTML>
Leave.java
package tw.idv.idealist;

import java.util.HashMap;
import com.opensymphony.workflow.*;
import com.opensymphony.workflow.basic.BasicWorkflow;
import com.opensymphony.workflow.config.DefaultConfiguration;
import com.opensymphony.workflow.spi.Step;

/**
* 請假流程
* @author steven
*/
public class Leave {
/**
* 啟動流程
* @param employee 員工編號
* @param type 假別
* @return 工作流編號
*/
public long start(String employee, String type) {
Workflow workflow = new BasicWorkflow(employee);
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
long workflowId = -1;
try {
HashMap map = new HashMap();
map.put("type", type);
//leave是workflowx.xml中定的名稱
workflowId = workflow.initialize("leave", 0, map);
} catch (InvalidActionException e) {
e.printStackTrace();
} catch (InvalidRoleException e) {
e.printStackTrace();
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (InvalidEntryStateException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}

return workflowId;
}

/**
* 送出假單
* @param workflowId 工作流編號
* @param employee 員工編號
*/
public void send(long workflowId, String employee) {
Workflow workflow = new BasicWorkflow(employee);
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
try {
workflow.doAction(workflowId, 1, null);
} catch (InvalidActionException e) {
e.printStackTrace();
} catch (InvalidRoleException e) {
e.printStackTrace();
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (InvalidEntryStateException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}
}

/**
* 准假假單
* @param workflowId 工作流編號
* @param actionId 動作編號, 2 准許, 3 駁回
*/
public void allow(long workflowId, int actionId) {
Workflow workflow = new BasicWorkflow("manager1");
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
try {
workflow.doAction(workflowId, actionId, null);
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}
catch (InvalidActionException e) {
e.printStackTrace();
}
}
}
LeavaAction.java
package tw.idv.idealist.actions;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tw.idv.idealist.Leave;

/**
* @author Steven
*/
public class LeaveAction extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Leave leave = new Leave();
String employee = req.getParameter("employee");
String type = req.getParameter("type");
long workflowId = leave.start(employee, type);
leave.send(workflowId, employee);
resp.sendRedirect("allow.jsp?workflowId=" + workflowId);
}

}
OutputPropertySet.java
package tw.idv.idealist;

import java.util.Map;

import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.workflow.FunctionProvider;
import com.opensymphony.workflow.WorkflowException;

/**
* @author steven
*/
public class OutputPropertySet implements FunctionProvider {
public void execute(Map transientVars, Map args, PropertySet ps)
throws WorkflowException {
if (ps.getString("type").equals("1")) {
System.out.println("事假");
}
else if (ps.getString("type").equals("2")) {
System.out.println("病假");
}
System.out.println("author => " + args.get("author"));
}
}

測試
注意觀察console輸出和資料庫,OutputPropertySet會輸出如下值到console。

病假
author => Steven Shi

資料庫Table OS_PROPERTYENTRY則出現如下的值,可以看到假別已存入資料庫。

[img]http://friping.iteye.com/upload/attachment/85301/70ebc0cb-32c0-3aa1-9e81-212447873bb0.jpg[/img]
标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值