当前位置: 首页 > news >正文

C#工作流示例(WorkflowCore)

using Microsoft.Extensions.DependencyInjection;
using WorkflowCore.Interface;
using WorkflowCore.Models;namespace LeaveRequestWorkflow
{// 请假申请单public class LeaveBill{/// <summary>/// 申请人/// </summary>public string EmployeeName { get; set; }/// <summary>/// 请假起始时间/// </summary>public DateTime StartDate { get; set; }/// <summary>/// 请假结束时间/// </summary>public DateTime EndDate { get; set; }/// <summary>/// 请假原因/// </summary>public string Reason { get; set; }/// <summary>/// 经理意见/// </summary>public string ManagerComment { get; set; }/// <summary>/// 是否同意/// </summary>public bool IsApproved { get; set; }/// <summary>/// 创建时间/// </summary>public DateTime CreateAt { get; set; } /// <summary>/// 处理时间/// </summary>public DateTime ProcessedAt { get; set; }}// 请假申请public class ApplyLeave : StepBody{ public override ExecutionResult Run(IStepExecutionContext context){var bill = (LeaveBill)context.Workflow.Data;bill.CreateAt = DateTime.Now;Console.WriteLine($"请假申请已提交 - 员工: {bill.EmployeeName},时间: {bill.StartDate.ToShortDateString()} 到 {bill.EndDate.ToShortDateString()}, 原因: {bill.Reason}");return ExecutionResult.Next();}}// 经理审批public class ManagerApproval : StepBody{  public override ExecutionResult Run(IStepExecutionContext context){var bill = (LeaveBill)context.Workflow.Data;bill.ProcessedAt = DateTime.Now;Console.WriteLine($"经理审批中 - {bill.EmployeeName} 的请假申请");// 简单模拟:请假天数小于5天自动批准,否则拒绝var leaveDays = (bill.EndDate - bill.StartDate).Days;if (leaveDays <= 5){bill.IsApproved = true;bill.ManagerComment = "申请已批准,祝你休假愉快!"; }else{bill.IsApproved = false;bill.ManagerComment = "请假时间过长,请缩短假期或联系HR"; }Console.WriteLine($"经理决定: {(bill.IsApproved ? "批准" : "拒绝")}");return ExecutionResult.Next();}}// 通知结果public class NotifyResult : StepBody{ public override ExecutionResult Run(IStepExecutionContext context){var bill = (LeaveBill)context.Workflow.Data; bill.ProcessedAt = DateTime.Now;Console.WriteLine($"消息通知 - {bill.EmployeeName},你的请假申请{(bill.IsApproved ? "已批准" : "未被批准")}。备注: {bill.ManagerComment}");return ExecutionResult.Next();}}// 定义请假工作流public class LeaveWorkflow : IWorkflow<LeaveBill>{public string Id => "LeaveRequestWorkflow";public int Version => 1;public void Build(IWorkflowBuilder<LeaveBill> builder){builder.StartWith<ApplyLeave>() .Then<ManagerApproval>() .Then<NotifyResult>(); }}class Program{static IServiceProvider ConfigureServices(){IServiceCollection services = new ServiceCollection();// 添加日志服务services.AddLogging();// 添加 WorkflowCoreservices.AddWorkflow();// 注册你的工作流步骤(确保它们可以被DI容器创建)services.AddTransient<ApplyLeave>();services.AddTransient<ManagerApproval>();services.AddTransient<NotifyResult>();return services.BuildServiceProvider();}static async Task Main(string[] args){IServiceProvider serviceProvider = ConfigureServices();var host = serviceProvider.GetService<IWorkflowHost>();// 注册工作流host?.RegisterWorkflow<LeaveWorkflow, LeaveBill>();// 启动工作流主机host?.Start(); Console.WriteLine("\r\n工作流示例(WorkflowCore)\r\n");// 创建新的请假申请var request = new LeaveBill();Console.WriteLine(">>> 请假申请单 <<<\r\n");Console.Write("员工姓名: ");request.EmployeeName = Console.ReadLine();Console.Write("开始日期 (yyyy-mm-dd): ");if (DateTime.TryParse(Console.ReadLine(), out DateTime startDate))request.StartDate = startDate;elserequest.StartDate = DateTime.Now.AddDays(1);Console.Write("结束日期 (yyyy-mm-dd): ");if (DateTime.TryParse(Console.ReadLine(), out DateTime endDate))request.EndDate = endDate;elserequest.EndDate = DateTime.Now.AddDays(2);Console.Write("请假原因: ");request.Reason = Console.ReadLine();// 启动工作流var workflowId = await host.StartWorkflow("LeaveRequestWorkflow", request);Console.WriteLine($"请假申请已提交,工作流ID: {workflowId}");// 等待一会儿让工作流处理await Task.Delay(2000);host?.Stop();}}
}

http://www.xdnf.cn/news/1443205.html

相关文章:

  • 基于Docker和Kubernetes的CI/CD流水线架构设计与优化实践
  • Go语言实战案例-Redis实现用户登录次数限制
  • 基于单片机车内换气温度检测空气质量检测系统Proteus仿真(含全部资料)
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • 在 Android MVVM 架构中,获取 ViewModel 的几种方式
  • 微服务的编程测评系统20-虚拟机-nginx-部署
  • 基于Java的瑜伽馆管理系统的设计与实现(代码+数据库+LW)
  • 【LeetCode】21、合并两个有序链表
  • 【设计模式】 装饰模式
  • 【机器学习深度学习】RAG边界处理策略
  • Django REST Framework Serializer 进阶教程
  • word删除指定页面
  • Ubuntu22.04中使用cmake安装abseil-cpp库
  • 【数据分享】283个地级市产业结构合理化水平和产业结构高级化指数(2006-2019)
  • Upload-Labs靶场全20关通关攻略(含原理+实操+环境配置)
  • 利用 Python 绘制环形热力图
  • SuperMap GIS基础产品FAQ集锦(20250819)
  • HTML应用指南:利用POST请求获取全国九号电动车体验店服务店位置信息
  • MyBatis 常见错误与解决方案:从坑中爬出的实战指南
  • 时序数据库选型指南:Apache IoTDB快速部署与实战应用
  • powershell实现,user权限下给软件提取。
  • 数学家破解世界难题——拒绝领奖拒绝百万奖金
  • AV-NeRF、AV-GS、AV-Surf论文解读
  • 基于数据挖掘的当代不孕症医案证治规律研究
  • C# Activator.GetObject 原理与示例:理解.NET Remoting远程调用
  • AI 时代零售数据底座怎么建?首份《零售一体化云数据库白皮书》发布
  • 强化微调:以Swift框架进行GRPO多模态模型强化微调为例
  • 【明道云】[工作表控件5] 手机控件的格式化处理
  • 在麒麟 ARM (aarch64)安装OpenJDK11和elasticsearchkibana
  • 云手机中的三大核心技术主要是指什么?