Task Flow使用指南之十:通过程序调用TaskFlow

本文详细阐述了如何通过程序调用BoundedTaskFlow,并提供了关键步骤和示例代码,帮助开发者轻松实现这一功能。
运行环境:JDeveloper 11.1.2.3.0 + Oracle Database 11g Express Edition。

Task Flow使用指南之九中介绍了如何调用Remote TaskFlow, 但那是通过TaskFlow Call Activity调用的,如何通过程序调用一个Bounded TaskFlow呢?

首先我们必须知道TaskFlow的URL的格式,以Remote TaskFlow应用为例,其中的employee TaskFlow的URL如下:
http://127.0.0.1:7101/ADF_TaskFlow_RemoteProducer-ViewController-context-root/faces/adf.task-flow?adf.tfId=employee-btf&adf.tfDoc=/WEB-INF/employee-btf.xml&departmentId=60
其中参数adf.tfId是TaskFlow的ID,参数adf.tfDoc是TaskFlow的Document。
这两个参数对应TaskFlow Call Activity上的同名属性。
注意,我这里还带了一个参数departmentId,因为employee TaskFlow的输入参数就是departmentId。
你可以复制这个URL,直接在浏览器中访问,如果能看到departmentId=60的员工列表,就说明employee TaskFlow可以通过URL访问。
有了URL,我们就可以通过程序调用employee TaskFlow。

重要步骤说明:

1. 创建Remote TaskFlow Producer
这一步和《Task Flow使用指南之九》一样,这里不再赘述。

2. 在departments.jsf页面中,添加按钮:Invoke Employee TaskFlow
(1)页面代码如下:

<af:commandButton text="Invoke Employee TaskFlow" id="cb2" action="#{myBackingBean.invokeEmployeeTaskFlow}">
    <af:setPropertyListener from="#{bindings.DepartmentId}" to="#{requestScope.departmentId}" type="action"/>
</af:commandButton>
(2)对应的Managed Bean的方法:invokeEmployeeTaskFlow

    public String invokeEmployeeTaskFlow() {
        FacesContext fctx = FacesContext.getCurrentInstance();
        ExternalContext ectx = fctx.getExternalContext();
        Map m = ectx.getRequestMap();

        String tfId = "employee-btf";
        String tfDoc = "/WEB-INF/employee-btf.xml";
        Map parameters = new HashMap();
        parameters.put("departmentId", m.get("departmentId"));

        TaskFlowId taskflowId = new TaskFlowId(tfDoc, tfId);
        //TaskFlowId taskflowId = TaskFlowId.parse("/WEB-INF/employee-btf.xml#employee-btf");
        String taskflowUrl = ControllerContext.getInstance().getTaskFlowURL(false, taskflowId, parameters);
        //String taskflowUrl = "http://127.0.0.1:7101/ADF_TaskFlow_RemoteProducer-ViewController-context-root/faces/adf.task-flow?adf.tfId=employee-btf&adf.tfDoc=/WEB-INF/employee-btf.xml&departmentId=60";

        try {
            ectx.redirect(taskflowUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return taskflowUrl;
    }

Project 下载:ADF_TaskFlow_RemoteProducer.7z

参考文献:
1. http://oracleseeker.com/2009/10/28/adf_current_taskflow_id/
2. http://oracleseeker.com/2009/11/09/adf_backing_action_taskflow/
3. https://forums.oracle.com/forums/thread.jspa?threadID=1082973
4. https://blogs.oracle.com/jdevotnharvest/entry/how-to_navigate_in_bounded_task_flows
5. http://adfdeveloper.blogspot.jp/2011/07/adf-auto-redirect-while-still-passing.html
6. https://blogs.oracle.com/jdeveloperpm/entry/how-to_efficiently_redirect_to_an_adf_faces_view_using_adf_controller
7. http://udayarocks.wordpress.com/2011/07/22/how-to-invoke-a-method-from-managed-bean-when-jspx-page-loads-in-adf/

http://maping930883.blogspot.com/2013/04/adf207task-flowtaskflow.html
<think>首先,用户的问题是基于之前的对话和引用。回顾系统指令和用户查询: - 系统指令要求使用特定的LaTeX格式、中文回答、生成相关问题等。 - 用户提供了两个引用:[1]关于Web Dynpro ABAP主题定制,[2]关于WDA(Web Dynpro ABAP)页面跳转和定制控制器。 用户的当前查询是:"我想将原本由程序本身状态码控制的售后流程WDA转换为定制的Task作业架构(电子表单类型:ABC),并按照给定的Task作业架构要求进行设计,包括共用WDA实现任务功能、数据库ZF_TASKFLOW配置作业流程、数据库ZF_FUNCMAP配置角色对应Function、共用Function用于Task作业的Trigger和Action" 用户要求将售后流程的Web Dynpro ABAP应用从基于程序状态码的控制转换为定制的Task作业架构,具体是电子表单类型ABC。关键元素包括: - 共用WDA实现任务功能:这意味着创建一个共享的Web Dynpro组件来处理任务功能。 - 数据库ZF_TASKFLOW:用于配置作业流程。 - 数据库ZF_FUNCMAP:用于配置角色对应的功能(Function)。 - 共用Function:用于Task作业的Trigger(触发)和Action(动作)。 我需要构建一个结构清晰的回答,帮助用户逐步实现这个转换。回答应该真实可靠,基于ABAP开发知识。 首先,理解核心概念: - **基于状态码的控制**:当前售后流程可能使用内部状态码(如状态机)来管理流程步骤。 - **Task作业架构**:这是一个定制的任务管理系统,使用电子表单ABC类型。涉及任务流程配置、角色映射和函数调用。 关键组件: 1. **共用WDA实现任务功能**:开发一个共享的Web Dynpro组件,作为任务处理的界面。用户可以通过这个组件查看、处理任务。 2. **数据库表设计**: - **ZF_TASKFLOW**:存储任务流程定义。可能包括步骤、状态转换、条件等。 - **ZF_FUNCMAP**:存储角色到功能的映射。例如,哪些功能(如审批、拒绝)对应哪些角色。 3. **共用Function(Function Module)**:创建一个共享函数模块,用于处理任务的触发(Trigger)和动作(Action)。这可能包括启动新任务、更新任务状态等。 现在,逐步设计转换: ### 步骤1: 分析现有售后流程 - 理解当前基于状态码的流程:状态码如何定义、如何转换。 - 识别流程中的关键步骤、角色和动作。 - 确定如何将状态码映射到Task作业架构。 ### 步骤2: 设计数据库表 - **ZF_TASKFLOW**: - 字段:Task_ID, Step_Sequence, Status, Next_Status, Condition, Action_Function, 等。 - 用于定义流程的步骤和转换规则。 - **ZF_FUNCMAP**: - 字段:Role, Function_ID, Description, 等。 - 映射角色到可用的功能(如WF_FUNCTION或直接函数调用)。 ### 步骤3: 开发共用Function Module - 创建一个函数模块,如Z_TASK_MANAGEMENT。 - 功能: - Trigger:当事件发生时启动任务(例如,售后请求创建时)。 - Action:处理任务动作(例如,用户点击“批准”时调用相应功能)。 - 这个函数应该与WDA和数据库交互。 ### 步骤4: 开发共用WDA组件 - 创建一个新的Web Dynpro组件,如Z_TASK_PROCESSOR。 - 功能: - 显示任务列表(从ZF_TASKFLOW或相关表读取)。 - 提供界面处理任务动作(调用共用Function Module)。 - 集成到现有售后WDA中,作为任务处理部分。 ### 步骤5: 集成到现有售后流程 - 修改原有售后WDA:移除状态码控制逻辑,改为调用Task作业架构。 - 在关键事件点(如状态改变时),调用共用Function的Trigger来创建或更新任务。 - 使用ZF_FUNCMAP来基于角色显示可用动作。 ### 步骤6: 测试和部署 - 单元测试共用Function和WDA。 - 集成测试整个流程。 - 确保缓存失效(如引用[1]提到),但这里可能不直接相关。 现在,回答结构: - 使用中文。 - 清晰步骤。 - 可能包括伪代码或ABAP代码片段,但系统指令没有要求代码,所以可能不需要。 - 生成相关问题。 最后,添加引用标识:引用来自用户提供的[^1]和[^2],但用户说"上述引用仅供参考,并不是用户真正的需求",所以我应该主要基于用户查询,但可以自然引用如果相关。 用户引用: - [^1]:关于主题定制,可能不直接相关,但提到缓存失效。 - [^2]:关于WDA控制器,可能相关于组件设计。 在回答中,可以提到定制控制器(引用[2])用于封装功能。 生成相关问题:在最后添加。 完整回答: </think> ### 将售后流程WDA转换为定制Task作业架构的实施步骤 在ABAP开发中,将基于程序状态码的售后流程Web Dynpro应用(WDA)转换为定制Task作业架构(电子表单类型ABC),涉及共用WDA组件、数据库配置和共用函数模块的设计。以下是分步实施指南,确保结构清晰且可扩展。 #### 1. **分析现有流程并定义Task架构** - **评估当前状态码逻辑**:梳理售后WDA中的状态码(如`STATUS_APPROVED`, `STATUS_REJECTED`)及其转换规则。将这些状态映射到Task作业的步骤中。 - **定义电子表单ABC结构**:Task作业架构应包含以下核心元素: - **任务流程(Flow)**:通过序列步骤管理任务生命周期(如创建→审批→完成)。 - **角色功能映射**:角色(如"审批员")关联特定功能(如"批准"或"拒绝")。 - **触发与动作**:事件(如售后请求提交)触发任务创建;用户操作(如点击按钮)触发动作函数。 - **输出**:创建详细设计文档,明确ZF_TASKFLOW和ZF_FUNCMAP表结构。 #### 2. **设计数据库表** - **表:ZF_TASKFLOW(作业流程配置)** - 存储流程步骤、状态转换规则和关联动作。 - 关键字段示例: - `TASK_ID` (CHAR10): 任务唯一ID - `STEP_SEQ` (INT4): 步骤序号 - `CURRENT_STATUS` (CHAR20): 当前状态(如"待审批") - `NEXT_STATUS` (CHAR20): 满足条件后的下一状态 - `CONDITION` (CHAR255): 状态转换条件(如`status = 'PENDING'`) - `ACTION_FUNC` (CHAR30): 触发的函数模块名(如`Z_TASK_APPROVE`) - 索引:基于`TASK_ID`和`STEP_SEQ`优化查询[^2]。 - **表:ZF_FUNCMAP(角色功能映射)** - 映射角色到可执行功能,支持权限控制。 - 关键字段示例: - `ROLE` (CHAR20): 角色名(如"APPROVER") - `FUNCTION_ID` (CHAR30): 功能ID(如"APPROVE_TASK") - `FUNC_MODULE` (CHAR30): 关联函数模块名(如`Z_TASK_ACTION`) - `DESCRIPTION` (CHAR100): 功能描述 - 用途:在WDA中动态渲染用户可操作按钮。 #### 3. **开发共用Function Module** - **函数模块:Z_TASK_MANAGEMENT** - 处理Task作业的**Trigger**(触发)和**Action**(动作)逻辑。 - **关键功能**: - **Trigger部分**:当售后事件发生时(如新请求提交),调用`Z_TASK_CREATE`创建任务记录到ZF_TASKFLOW。 ```abap FUNCTION z_task_create. INPUT: iv_event_type TYPE string, " 事件类型,如 'AFTER_SALES_SUBMIT' iv_task_data TYPE ztask_data. " 任务数据 " 1. 根据事件类型确定初始状态 " 2. 插入新记录到 ZF_TASKFLOW " 3. 返回任务ID ENDFUNCTION. ``` - **Action部分**:处理用户操作(如批准任务),调用`Z_TASK_EXECUTE_ACTION`。 ```abap FUNCTION z_task_execute_action. INPUT: iv_task_id TYPE char10, " 任务ID iv_action TYPE char30. " 动作名,如 'APPROVE' " 1. 根据 iv_action 从 ZF_FUNCMAP 获取函数模块 " 2. 调用动态函数 (CALL FUNCTION lv_func_module) " 3. 更新 ZF_TASKFLOW 状态 ENDFUNCTION. ``` - **集成点**:在现有售后WDA的事件处理器中调用Trigger函数。 #### 4. **开发共用WDA组件** - **组件:Z_TASK_PROCESSOR** - **功能**:提供任务列表界面和处理操作,嵌入到售后WDA中。 - **关键设计**: - **定制控制器**:创建`CUSTOM_CONTROLLER`封装任务逻辑(参考引用[^2]),确保与主控制器解耦。 - **视图**: - `TASK_LIST_VIEW`:显示用户任务(从ZF_TASKFLOW读取),基于ZF_FUNCMAP过滤可操作按钮。 - `TASK_DETAIL_VIEW`:处理任务详情和动作执行。 - **方法**: - `LOAD_TASKS`:根据角色查询任务数据。 - `HANDLE_ACTION`:调用`Z_TASK_MANAGEMENT`执行动作。 - **集成到售后WDA**:在售后主组件中嵌入`Z_TASK_PROCESSOR`,替换原生状态码逻辑。 #### 5. **迁移和测试** - **数据迁移**:将现有状态码映射到ZF_TASKFLOW初始数据。 - **单元测试**: - 验证ZF_TASKFLOW状态转换(如确保`CONDITION`正确触发`NEXT_STATUS`)。 - 测试共用函数模块的Trigger/Action调用。 - **集成测试**: - 模拟售后流程事件,检查任务自动创建。 - 验证角色权限:不同用户仅见ZF_FUNCMAP允许的功能。 - **性能优化**:对ZF_TASKFLOW添加索引;使用缓存减少数据库查询(缓存失效参考引用[^1])。 #### 6. **扩展应用** - **ALV控件**:在任务列表中使用ALV表增强展示(如添加状态图标)。 - **FPM集成**:在FPM(Floorplan Manager)场景中复用`Z_TASK_PROCESSOR`组件。 - **监控**:添加日志记录到共用函数,便于调试任务流。 通过此架构,售后流程从硬编码状态码转为可配置的Task作业系统,提升灵活性和可维护性。核心是解耦流程逻辑(数据库配置)、业务逻辑(函数模块)和界面逻辑(WDA),符合ABAP最佳实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值