`

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)">
&nbsp;<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則出現如下的值,可以看到假別已存入資料庫。


  • 大小: 4 KB
分享到:
评论

相关推荐

    osworkflow_bundle2

    10. **工作流设计工具**:虽然 OSWorkflow 本身不提供图形化设计工具,但有一些第三方工具(如 JBoss jBPM)可以用于可视化设计 OSWorkflow 流程,并生成相应的 XML 配置。 在 "osworkflow_bundle" 中,你可能会...

    osworkflow-2.8.0.zip

    `lib`目录下是一些osWorkflow运行所依赖的第三方库,比如数据库连接池、XML解析库等。了解这些库可以帮助开发者更好地理解和配置osWorkflow的运行环境,确保其正常运行。 总的来说,osworkflow-2.8.0.zip提供了一...

    OSWorkflow源码及电子书

    1. **入门教程**:介绍如何安装和配置OSWorkflow,以及如何创建第一个工作流实例。 2. **API参考**:详细说明了OSWorkflow的各个类和接口,帮助开发者理解和使用API进行开发。 3. **最佳实践**:提供一些实际案例和...

    osworkflow-2.7.0.zip

    6. **lib**:依赖库目录,包含了osworkflow运行所依赖的其他第三方库。确保这些库被正确地添加到项目中,是成功运行osworkflow的前提。 在实际应用中,osworkflow通过定义工作流步骤、条件和动作,实现了业务流程的...

    流程引擎OSworkflow2.8资料(所有jar包,学习资料,api)

    - **依赖的第三方库**:如数据库连接池、XML解析库等,确保OSWorkflow能正常运行。 总的来说,这个压缩包为开发者提供了一站式资源,使他们能够有效地利用OSWorkflow 2.8构建高效、可扩展的业务流程管理系统。通过...

    osworkflow-2.8.0

    10. **源代码和依赖**:"src" 文件夹包含源代码,而 "lib" 文件夹则包含了项目运行所需的第三方库,这对于理解 OSworkflow 的内部机制和二次开发非常有帮助。 通过这些组件和特性,OSworkflow-2.8.0 提供了一套完整...

    工作流引擎 Osworkflow 及其持久化机制的研究

    当有多个条件结果时,仅执行第一个满足条件的结果;若未定义条件结果或无条件满足,则执行无条件结果。 执行完当前步骤后,工作流可能停留在当前步骤、跳转到另一个新步骤、进入分支(Split)或合并节点(Join)。...

    JBPM、OSWORKFLOW分析报告

    2. **分页问题**:基于第1个问题的解决方案,可以在自定义的Hibernate查询基础上实现分页功能。 3. **统计流程实例状态**:可以通过查询JBPM系统表中的流程实例来统计各个流程实例的状态。另一种方法是在业务表中...

    Quartz-Job-Scheduling-Framework-中文版-V0.9.1.zip

    第三章. Hello Quartz (第一部分) 内容提要:建立 Hello Quartz 工程,并创建一个 Quartz Job 类 ScanDirectoryJob. 第三章. Hello Quartz (第二部分) 内容提要:创建一个 Quartz Scheduler,关联上一个 Quartz ...

    Java开源工作流引擎.pdf

    它利用Web Services和SOAP进行集成,同时采用第三代工作流引擎,基于活动预测模型。 10. Bigbross Bossa:Bossa是一个快速、轻量级的工作流引擎,采用Petri网定义工作流,易于集成到Java应用中,设计为嵌入式解决...

    JBPM 工作流 PPT

    JBPM可以作为Web服务被第三方应用调用,而且具有轻量级的依赖性,可以方便地集成到各种环境,包括J2EE应用服务器。 【工作流】是自动化一系列任务的过程,而【工作流管理系统(WFMS)】则是一组工具和技术,用于...

    activiti-学习第一天

    通过以上介绍,我们可以看到Activiti不仅是一个强大的工作流框架,还提供了完善的工具集来帮助开发者快速构建高效、可扩展的应用程序。无论是从理论还是实践的角度来看,掌握Activiti都将极大地提升工作效率。

Global site tag (gtag.js) - Google Analytics