第 3 部分 - 添加从用户任务返回数据的功能

使用.net 构建 Elsa Workflow 对接过蓝凌OA 也基于泛微OA数据库原型重新研发上线过产品,自研的开源的也上线过 每个公司对OA流程引擎介绍 都不一样的, 比如Elsa 这块微软MVP 开源产品 这个,基于跨平台开发的技术含量高,专门做OA的同行推过对应文章。二章 改成API 使用的预发行版本 即还没有成为正式发布的版本!然后就潜规则 官网居然 直接就 下一页 不告诉怎么搞了 哈哈哈哈。---分割线------------------------已知的是1用这个就能拿到token了还要其他干啥。三章 开始用用核心点的东西了。 阅读详情

本系列介绍了由 Elsa 工作流引擎驱动的用户界面的实现。

在第 2 部分 - 创建用户任务活动中,完成了大量编码。 下一步是扩展代码以适应将用户数据返回到工作流程的可能性。

这次,让我们按照应用程序中采取的步骤,看看各个元素如何协同工作以恢复工作流程(从 UI 开始)。

@page "/WorkflowInstances"
@using ElsaDrivenWebApp.Shared.Components

<h3>WorkflowInstances</h3>

@inject UsertaskService userTaskService
@inject ProcessService processService

@if (workflowInstances == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <tr>
            <td><input @bind="inputValue" /></td>
            <td><button @onclick="() => AddSample2Task()">Start Sample 2 workflow</button></td>
        </tr>
    </table>

    <table class="table">
        <thead>
            <tr>
                <th>Title</th>
                <th>Instance name</th>
                <th>State</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var workflowInstance in workflowInstances)
            {
                <tr>
                    <td>
                        @workflowInstance.DefinitionId
                    </td>
                    <td>
                        @workflowInstance.WorkflowName
                    </td>
                    <td>
                        @workflowInstance.State
                    </td>
                    <td>
                        @foreach (var usertask in workflowInstance.UserTasks)
                        {
                            <button @onclick="() => Open(usertask)">@usertask.TaskTitle - @usertask.TaskDescription</button>

                            <br />
                        }
                    </td>
                </tr>
            }
        </tbody>
    </table>
    <Usertasksample2 Task=selectedUsertasksample2 OnFinished="TaskFinished2"></Usertasksample2>
     <Usertasksample2a Task=selectedUsertasksample2a OnFinished="TaskFinished2a"></Usertasksample2a>

}
@code {

    private List<WorkfowInstanceUsertaskViewModel>? workflowInstances;
    private string? inputValue;
    private UsertaskViewModel? selectedUsertasksample2 { get; set; } = null;
    private UsertaskViewModel? selectedUsertasksample2a { get; set; } = null;

    protected override async Task OnInitializedAsync()
    {
        await LoadTasks();
    }

    private async Task LoadTasks()
    {
        var workflowInstancesArray = await userTaskService.GetWorkflowsWaitingOnUserTask();
        workflowInstances = workflowInstancesArray.ToList();
    }

    private async Task TaskFinished2()
    {

        selectedUsertasksample2 = null;
        await LoadTasks();
    }

    private async Task TaskFinished2a()
    {

        selectedUsertasksample2a = null;
        await LoadTasks();
    }

    private async Task Open(UsertaskViewModel task)
    {
        selectedUsertasksample2 = null;

        switch (task.Signal)
        {
            case "usertasksample2":
                selectedUsertasksample2 = task;
                break;
            case "usertasksample2a":
                selectedUsertasksample2a = task;
                break;
            default:
                await SendSignal(task);
                break;
        }
    }

    private async Task SendSignal(UsertaskViewModel task)
    {
        await userTaskService.MarkAsCompleteAsync(task.WorkflowInstanceId, task.Signal, null);
        await LoadTasks();
    }

    private async Task AddSample2Task()
    {
        var settings = new Envelope<SampleSettings>(new SampleSettings { Name = inputValue });
        await processService.SendSignal("sample2", settings);
        await LoadTasks();
    }
}

尽管这是 Blazor 实现,但路由和步骤仍然适用于其他框架。

  • 获取等待 Usertask 活动的工作流实例
  • 为用户任务呈现适当的 UI
  • 向引擎发送更新信号和数据

在初始化组件时,UsertaskService 加载用户任务。 在这种情况下,服务的实现就是返回工作流实例。 另一种方法是获取用户任务列表,即使工作流实例相同。

事后看来,这将是一个更好的方法,因为客户端可以控制如何显示用户任务。 😉

控制器返回 UsertaskViewmodel,UI 可以显示它们。 在每个显示的项目上,添加一个 open(usertask) 事件处理程序。 在此情况下,甚至 UI 也会激活适当的 UI 控件。

Ui控件打开bij后UI能够与引擎进行交互。 它将使用 UsertaskService 将信号发送到引擎。 然后,它使用 JsonConvert 将组件中输入的数据转换为 JSON 对象,并将其作为请求中的数据结果发送。

@using Newtonsoft.Json

@inject UsertaskService userTaskService

@if (Task != null)
{

    <form>
        <div class="form-group">
            <label for="exampleInputEmail1">Email address</label>
            <input type="email" @bind=data.Email class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter email">
            <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
        </div>  <div class="form-group">
            <label for="exampleInputPassword1">Password</label>
            <input type="password" @bind=data.Password class="form-control" id="exampleInputPassword1" placeholder="Password">
        </div>
        <button @onclick="() => SendSignalAndData()">Continue</button>
    </form>
}

@code {

    [Parameter]
    public EventCallback OnFinished { get; set; }

    [Parameter]
    public UsertaskViewModel Task { get; set; }

    UsertaskSample2DataModel data = new UsertaskSample2DataModel();

    private async Task SendSignalAndData()
    {
        await userTaskService.MarkAsCompleteAsync(Task.WorkflowInstanceId, Task.Signal, JsonConvert.SerializeObject(data));
        await OnFinished.InvokeAsync();
        Task = null;
    }

    class UsertaskSample2DataModel
    {
        public string Email { get; set; }
        public string Password { get; set; }
    }
}

之前提到过,数据对象需要包装在信封中,以便它可以为信号添加一些元数据。

public async Task MarkAsCompleteAsync(string workflowInstanceId, string signal, JToken signalData)
        {
            var data = new MarkAsCompletedPostModel
            {
                WorkflowInstanceId = workflowInstanceId,
                Input = signalData == null ? JValue.CreateNull() : signalData
            };

            var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
            await httpClient.PostAsync($"/v1/usertask-signals/{signal}/execute", content);
        }


//combined for clarity

 public class MarkAsCompletedPostModel
    {
        [JsonProperty("workflowInstanceId")]
        public string WorkflowInstanceId { get; set; } = string.Empty;

        [JsonProperty("input")]
        public JToken Input { get; set; } = JValue.CreateNull();
    }

现在,引擎可以使用元数据来确定需要恢复哪个工作流实例,更具体地说,根据信号确定哪个活动。

因此,在设计流程和信号时,请注意信号发送。 避免使用相同的名称,因为它可能会意外激活多个任务,因为它们使用相同的信号名称。
在信封中,没有指示活动 ID,这意味着引擎将激活工作流实例中具有该信号名称且已暂停的所有内容。

在控制器中的实现相当简单

[HttpPost("{signalName}/execute")]
        [ElsaJsonFormatter]
        [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ExecuteSignalResponse))]
        [SwaggerOperation(
            Summary = "Signals all workflows waiting on the specified signal name synchronously.",
            Description = "Signals all workflows waiting on the specified signal name synchronously.",
            OperationId = "UsertaskSignals.Execute",
            Tags = new[] { "UsertaskSignals" })
        ]
        public async Task<IActionResult> Handle(string signalName, ExecuteSignalRequest request,
            CancellationToken cancellationToken = default)
        {
            var collectedWorkflows = await invoker.ExecuteWorkflowsAsync(signalName, request.Input,
                request.WorkflowInstanceId, request.CorrelationId, cancellationToken);
            return Ok(collectedWorkflows.ToList());
        }

接收到数据和信号。 接下来,调用者可以根据 Usertask 信号执行工作流。 此调用程序 (IUserTaskSignalInvoker) 是书签实现的一部分。 它将收集等待特定书签类型和信号的工作流程。 然后,它将激活工作流实例中关联活动的 OnResume 方法。

protected override IActivityExecutionResult OnResume(ActivityExecutionContext context)
        {
            var triggeredSignal = context.GetInput<Signal>()!;
            SignalInput = triggeredSignal.Input;
            Output = triggeredSignal.Input;
            context.LogOutputProperty(this, nameof(Output), Output);
            return Done();
        }

对于用户任务来说,没有什么可做的。 它只是将输入和输出设置为接收到的数据。 并且,之后它将指示完成作为用户任务的结果。

这就是用户任务中处理数据的方式!

【用户画像】用户画像添加标签、定义标签任务、搭建工程 接下来的任务:利用在网页端填写的规则计算出想要得到的标签结果。已有数据,存放在MySQL中:1 整数 2 浮点 3 文本 4 日期tag_info:标签定义(id,标签编码,标签名称,标签等级,上级标签id,标签类型【99类目,1统计型,2规则性,3挖掘型】,标签值类型【1 整数 2 浮点 3 文本 4 日期】,标签对应的计算任务id,标签说明,更新时间,创建时间) 阅读详情

相关推荐

软件需求包括3个不同的层次 业务需求 用户需求和功能需求

软件需求包括3个不同的层次 业务需求 用户需求和功能需求

qq_44952688的博客 5833

【亲测免费】 探索Elsa 3.0:无界工作流的力量!

![Elsa 3.0](./design/artwork/android-elsa-portrait.png) **Elsa 3.0** 是一个强大的.NET工作流库,它赋予你的应用程序执行工作流的能力。无论是编写C#代码,使用视觉设计界面,还是在JSON中定义流程,Elsa都为你的业务逻辑提供了无限的灵活性。 尝试**Docker**快速启动: ```shell docker pull el...

gitblog_00100的博客 2007

elsa-3.0.0-M5-API文档-中文版.zip

赠送jar包:elsa-3.0.0-M5.jar; 赠送原API文档:elsa-3.0.0-M5-javadoc.jar; 赠送源代码:elsa-3.0.0-M5-sources.jar; 赠送Maven依赖信息文件:elsa-3.0.0-M5.pom; 包含翻译后的API文档:elsa-3.0.0-M5-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.mapdb:elsa:3.0.0-M5; 标签:mapdb、elsa、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

推荐使用:Elsa 3.0 - 强大的工作流库

![Elsa Workflows Logo](./design/artwork/elsa-v3-avatar.png) ???? Elsa 3.0 是一个专门为.NET应用设计的高灵活性工作流库。它提供了多种定义工作流的方法,包括编写C#代码、使用视觉设计器或直接以JSON形式指定。Elsa随带了一个强大的可视化设计器,使得创建和管理工作流程变得直观且易于操作。 ### 快速启动Docker体验 ...

gitblog_00640的博客 1107

工作流引擎之Elsa入门系列教程之一 初始化项目并创建第一个工作流.doc

工作流引擎之Elsa入门系列教程之一 初始化项目并创建第一个工作流.doc

深入解析i2cdetect:从基础命令到高级读写操作

本文深入解析Linux下i2cdetect工具,从基础安装、总线扫描到高级读写操作。作为i2c-tools的核心组件,i2cdetect是硬件调试的得力侦探,能快速识别I2C总线上的设备地址。文章还涵盖了i2cdump、i2cset、i2cget等进阶工具,并介绍了如何在C程序中调用读写接口进行嵌入式开发,是掌握I2C通信调试的实用指南。

weixin_29189987的博客 371

[学习笔记] WorkFlow工作流实现审批流程

审批流程分为两级审批,提交审批后先交由核保员审批,审批通过后再交由领导审批,若核保员审批不通过则直接结束。审批时需要传入角色Code,与任务所绑定的候选组进行匹对,方有权限审批。审批即根据传入的结果,对任务绑定结果变量approved。网关会根据变量的值选择对应分支(流程图中设置的流条件)注 创建时需要传入流程模型id,可在xml文件中查看。创建后可返回流程实例与申请单绑定,以便于后续的查询。WorkFlow为我们提供了相关的操作业务类。流程引擎会解析某路径下的流程模型文件。

u014364227的博客 2416

颠覆性创新的测量框架与跨领域实证分析

颠覆性创新作为科技发展的重要驱动力,其核心在于实现知识体系的范式转换。从技术原理看,这类创新通常具备知识替代、网络重构和跨领域渗透三大特征,通过引用网络分析和文本挖掘等方法可量化评估其影响力。在工程实践中,CD指数、DI指数等测量工具帮助研究者识别具有突破潜力的成果,而深度学习等新兴技术进一步提升了评估精度。当前AI、半导体等领域的热门技术发展表明,模块化架构和产业协同能有效促进颠覆性创新。面对全球范围内创新颠覆性下降的趋势,优化科研评价体系、构建跨学科协作网络成为关键应对策略。

weixin_29735807的博客 321

Android: 任务和返回堆栈

Task and Back Stack(任务和返回堆栈)          一个应用程序通常包含多个活动。每一个活动都要围绕一个特定的action来设计,用户能够执行这个action并且能启动其它的活动。例如一个邮件应用可能包含一个活动来显示新邮件列表,当用户选择一个一封邮件,启动一个新的活动来显示这个邮件。          一个活动甚至可以启动该设备上其它应用的活动。例如如果你的应用想要发

Android_grady_wang的专栏 2426

深入解析STM32定时器中央对齐模式3的双中断机制

本文深入解析了STM32定时器中央对齐模式3的双中断机制。该模式在一个PWM周期内,会在计数器到达ARR(上溢)和0(下溢)时各触发一次更新中断,实现更精细的实时控制。文章详细阐述了其工作原理、配置方法,并指导如何在中断服务函数中通过DIR位区分中断来源,同时探讨了其在电机控制、数字电源等场景下的应用优势与CPU负载挑战。

weixin_29164185的博客 492

【Altium designer】BOM导出 Bill of Materials 如何自定义格式

【Altium designer】如何自定义BOM导出格式 我们用Excel做一个xx.xlt的2003的模版文件,取文件名为:AltiumDesiger PCB BOM Template.xlt 将AltiumDesiger PCB BOM Template.xlt文件存放在:AltiumDesiger 安装目录的Template文件夹内

夜半少年的博客 2717

Android 任务和返回栈详解

Tasks and Back Stack介绍 应用通常包含多个Activity。每个 Activity 均应围绕用户可以执行的特定操作设计,并且能够启动其他 Activity。 例如,电子邮件应用可能有一个 Activity 显示新邮件的列表。用户选择某邮件时,会打开一个新 Activity 以查看该邮件。 一个 Activity 甚至可以启动设备上其他应用中存在的 Activity。例如

Wtoria的博客 1879

【TIDB】TiDB认证考试PTCA 练习题 题库

TiDB认证考试PTCA 练习题 题库

DBA之路的博客 4718

用户故事、开发任务与工作流块任务数据模式

在开发人员的日常工作中,编码工作主要包括了三种类型:用户故事(用户故事)、开发任务(Task)和缺陷(Defect)。尽管不喜欢缺陷,但是它是你生活的一部分,并且大部分的缺陷都与沟通相关,在这些缺陷中,团队成员对功能的假设产生了偏差。 一个用户故事可以拆分为多个开发任务。一个常见的问题是:如何区别用户故事和开发任务?我们用海平面来进行区分,海平面即用户价值。项目目标是那高高

要思考 4044

C#开发的OpenRA游戏之网络接收后找到游戏对象

而这个队列是在创建这个游戏对象时组件,因为一个游戏对象有很多特性,当发现创建游戏对象时有IResolveOrder继承接口的对象,就添加到这个数组。在这里先检查一下命令是否有效的,接着就调用命令的执行对象,即是游戏对象来执行这个命令了。order.Subject就是上面解释游戏对象ID,并从游戏世界里找到的游戏对象,再从各个字段里找到对应的信息,再把这个动作交给游戏世界里的对象执行。从前面分析可知,要找到游戏世界里的对象,就需要游戏对象的ID,因此, 我们来分析游戏对象的ResolveOrder函数。

大坡3D软件开发 1033

结构力学本构模型:复合材料模型:复合材料热力学行为技术教程_2024-08-07_06-54-53.Tex

热塑性复合材料是一种由热塑性树脂基体和增强纤维组成的复合材料。与热固性复合材料不同,热塑性复合材料在加热时可以软化,冷却时硬化,这一过程可以重复进行,因此它们具有可回收和可再加工的特性。热塑性树脂,如聚酰胺(尼龙)、聚碳酸酯、聚醚醚酮(PEEK)等,与碳纤维、玻璃纤维等增强材料结合,可以制备出具有高强度、高刚度和良好耐热性的复合材料。热粘弹性理论是研究材料在温度变化和时间依赖性载荷作用下的变形和应力响应。复合材料,由于其独特的微观结构,展现出复杂的热粘弹性行为。

807

宝塔后渗透-添加用户_反弹shell

宝塔后渗透-添加用户_反弹shell

crowsec 4390

大数据数据埋点技术面试题及参考答案(持续更新)

事件:指的是用户执行的具体动作,如页面浏览、按钮点击、商品购买等。事件是触发数据记录的直接原因,是分析用户行为的关键点。属性:是与事件相关的额外信息,可以提供关于事件的更多上下文。例如,用户点击的按钮颜色、大小、页面位置等。属性有助于更细致地分析用户行为,理解事件发生的具体情境。事件和属性共同构成了数据埋点的数据模型,它们使得收集的数据具有可分析性,从而可以用于深入理解用户行为和优化产品。

大模型大数据攻城狮的专栏 2097

第3.1.4节 理解任务与返回堆栈

在Android中,一个应用程序里面,通常包含了多个相互结合的Activity。每个Activity通常被设计为可以为用户执行某个特定的动作,Activity与Activity之间可以通过Intent相互的跳转。甚至,可以通过Intent的action来启动另外一个应用程序的Activity,这个过程给用户的感觉就像这个Activity就是你的应用程序里面一样。Android把Activity的这

feiyangxiaomi的专栏 1817

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

第 8 课:Vue 3 项目实战拓展 —— 从待办到全功能任务管理系统

摘要:本课程将Vue3待办应用升级为全功能任务管理系统,重点实现三大企业级功能:1)用户登录与权限控制,通过token验证和路由守卫保障系统安全;2)任务分类管理,支持分类增删和任务关联;3)数据可视化统计,使用ECharts展示任务完成率、分类分布等图表。课程采用分层架构设计,整合Vue3生态核心工具,并包含项目复盘与简历撰写指导,帮助开发者将技术能力转化为求职竞争力。通过完整项目实战,学员可掌握企业级前端开发全流程,具备独立开发中小型项目的能力。

2503_94434664的博客 1095

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

watchOS 3的新功能:后台任务

介绍 随着即将对所有Apple Watch设备进行的watchOS 3更新,许多手表应用程序的性能将大大提高。 这主要归因于watchOS应用可以利用的新形式的后台执行,以便定期刷新其内容,并始终准备好供用户查看的最新信息。 在本教程中,我将向您展示如何在watchOS 3中利用新的WatchKit API使自己的应用程序使用这些新的后台任务。 重要的是要注意,即使您的应用程序设置正确以支...

代码教主 1573

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

3待办任务-二次开发题

之后在添加的数据没有经过渲染代码,故而在页面上看不到新增的内容。本题是一个典型的用户交互的效果。将用户输入的待办任务添加作为数组的第一项。所以本题我们也可以按照这个思路来完成。声明一个变量来存储用户输入的待办任务。循环代码之后实现 弹框和添加功能。这样的话,页面都已经渲染完毕了,

2301_78367631的博客 305

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 3 部分:Elastic S3 连接器

了解将数据从 AWS S3 导入 Elastic Cloud 的不同选项。这次我们将重点介绍 Elastic S3 Connector。这是多部分博客系列的第三部分,探讨了将数据从 AWS S3 导入 Elastic Cloud 的不同选项。在本博客中,我们将了解如何使用从 AWS S3 导入数据。Elastic Native 连接器可直接在你的 Elastic Cloud 环境中使用。客户可以选择使用,这些客户端可提供最高程度的自定义选项和灵活性。

Elastic 中国社区官方博客 1292

Vue中组件化编码 完成任务的添加、删除、统计、勾选需求(实战练习三完结)

Vue中组件化编码 完成任务的添加、删除、统计、勾选需求(实战练习三完结)

日常笔记 | 干货分享 | 毕设源码 | 毕设指导 | 答辩指导 1024

BPMN: (第3部分 - 池、泳道和任务)

我们的 bpmn教程的第三课是专门针对游泳池和泳道。此外, 我们将更详细地描述您已经熟悉的task元素。 为了显示业务流程参与者之间的交互方式, bpmn使用池和泳道。通常, 在 bmp 系统中, pool 被定义为进程的容器, 表示所有流程活动及其执行器。 泳道通常用于代表内部业务角色, 并将职责分配给所有流程参与者 (例如, 首席财务官、总经理、会计等)。一个池可能包含多个泳道(进程参与者...

Warren Lynch 的博客 9990
上一篇: 第 2 部分 - 创建用户任务活动
下一篇: 第 4 部分 - 让 Usertask 确定 UI 布局
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值