快过年了,想着请假提前回家,于是就不得不向领导提出申请,这个审批流是怎么实现的那?
在 设计模式系列之状态模式(2) 中主要是通过在状态类中来对状态进行转化和维护。本文基于此实现一个简易版本的审批流程。
审批流
请假流程如下:
说到请假,我就郁闷,就请半天假用问的那么仔细的。还有那位仁兄,有必要那么较真吗,浪潮的某位领导和同事,都是工作,何苦为难彼此?哎,有些人真的让人很无语的。废话不多说了,简化了UI和数据库的操作,目前的主要的流程:
- 提出申请
- 项目经理审批
- 如果超过3天,需要部门经理审批
- 无论审批结果如何,审批流程结束
类图设计
代码实现
第一步,抽象出请假单的数据模型。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp3
{
//定义请假单的业务数据模型
internal class RequestModel
{
//请假人
public string name { get; set; }
//开始时间
public string startTime { get; set; }
//请假天数
public Int32 days { get; set; }
//结果
public string result { get; set; }
}
}
第二步,设计策略模式的上下文。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp3
{
internal class StateMachine
{
public State state { get; set; }
public Object bisiniessVo { get; set; }
public void Audit()
{
this.state.Audit(this);
}
}
}
第二步,设计策略模式的状态接口。通过上面的活动图可以分析出有3中状态,等待项目经理审核 等待部门经理审核 审核或者流程结束。分别定义。
(1) 状态接口
namespace ConsoleApp3
{
public interface State
{
internal void Audit(StateMachine sm);
}
}
(2)状态定义-等待项目经理审核
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp3
{
internal class ProjectManagerState : State
{
//public string name { get; set; }
void State.Audit(StateMachine sm)
{
RequestModel rm = (RequestModel)sm.bisiniessVo;
Console.WriteLine(rm.name + "的请假申请:从" + rm.startTime + "开始,请假" + rm.days + "天,项目经理审核审核中");
Console.Write("请输入审批意见(1:同意 2:不同意)");
string result = Console.ReadLine();
if (result.Equals("1") && rm.days > 3)
{
rm.result = "项目经理审批同意,由于超过3天,需要部门经理审批";
sm.state = new DepartmentManager();
sm.Audit();
} else if (result.Equals("1") && rm.days <= 3)
{
rm.result = "项目经理审批同意,由于没超过3天,审批结束";
sm.state = new AuditOverState();
sm.Audit();
}
else if (result.Equals("2"))
{
rm.result = "项目经理审批不同意,审批结束";
sm.state = new AuditOverState();
sm.Audit();
}
else
{
Console.WriteLine("您输入的内容不合法,请输入1或者2");
}
}
}
}
(3)状态定义-等待部门经理审核
namespace ConsoleApp3
{
internal class DepartmentManager : State
{
void State.Audit(StateMachine sm)
{
RequestModel rm = (RequestModel)sm.bisiniessVo;
Console.WriteLine(rm.name + "的请假申请:从" + rm.startTime + "开始,请假" + rm.days + "天, 审批结果是" + rm.result);
Console.Write("请输入审批意见(1:同意 2:不同意)");
string result = Console.ReadLine();
if (result.Equals("1") && rm.days > 3)
{
rm.result = "部门经理审批同意";
sm.state = new AuditOverState();
sm.Audit();
}
else if (result.Equals("2"))
{
rm.result = "部门经理审批不同意,审批结束";
sm.state = new AuditOverState();
sm.Audit();
}
else
{
Console.WriteLine("您输入的内容不合法,请输入1或者2");
}
}
}
}
(3)状态定义-审核结束
namespace ConsoleApp3
{
internal class AuditOverState : State
{
void State.Audit(StateMachine sm)
{
RequestModel rm = (RequestModel)sm.bisiniessVo;
Console.WriteLine(rm.name + "的请假申请:从" + rm.startTime + "开始,请假" + rm.days + "天,审批结果是:"+ rm.result);
}
}
}
第三步,客户端实现
// See https://aka.ms/new-console-template for more information
using ConsoleApp3;
RequestModel rm = new RequestModel();
rm.startTime = "2022-01-24";
rm.days = 5;
rm.name = "Burning";
StateMachine sm = new StateMachine();
sm.bisiniessVo = rm;
sm.state = new ProjectManagerState();
sm.Audit();
最终运行结果:
写在最后
本文实现了一个简单的状态机,下一篇文章通过引入C#的状态机来实现审批流。
公众号
更多内容,欢迎关注我的微信公众号: 半夏之夜的无情剑客。