# 审批流程配置

# 1.初始化配置


//1、在Startup.cs文件ConfigureContainer中初始化打印配置
public void ConfigureContainer(ContainerBuilder builder)
{
       //初始化流程表,表里面必须有AuditStatus字段
           //初始化流程表,表里面必须有AuditStatus字段
            WorkFlowContainer.Instance
            //单表
            .Use<Demo_Product>(
                    "产品管理",
                    filterFields: x => new { x.Creator, x.Price, x.ProductCode, x.ProductName },
                    formFields: x => new { x.ProductCode, x.ProductName, x.Remark, x.Price, x.Creator, x.CreateDate }
                    )
            //主从表
            .Use<Demo_Order, Demo_OrderList>("订单管理",
                    //过滤条件字段
                    filterFields: x => new { x.OrderDate, x.OrderNo, x.OrderStatus, x.OrderType, x.Creator, x.CustomerId },
                    //审批界面显示表数据字段
                    formFields: x => new { x.OrderDate, x.OrderNo, x.OrderStatus, x.Remark },
                    //明细表显示的数据
                    formDetailFields: x => new { x.GoodsName, x.GoodsCode, x.Qty, x.Price, x.Specs, x.Img, x.CreateDate },
                    //默认是否自动提交(如果是草稿或待提交,新建的数据的时候不会进入流程,需要手动提交流程,见下面的手动提交流程示例)
                   // defaultAduitStatus: AuditStatus.草稿,
                    //审批界面审批表单可编辑的字段(字段必须在上面的formFields内)
                    editFields: x => new { x.OrderDate, x.OrderNo, x.OrderStatus, x.OrderType }
                )
                .Run();
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 2.创建流程

后台管理页面,流程管理菜单,点击新建配置流程
第一步配置的业务表新建数据后满足流程开始节点条件的数据自动进入流程

# 终止、回退流程、重新生成流程

# 手动终止流程(结束流程)、回退流程、重新生成流程(流程重新开始)

某些情况下可能需要中止流程,按此方法调用(下面方法是分别在控制器或业务类中调用示例,按需使用其中一种即可)

# 1、在业务类[表 Service.cs]类中调用


public partial class Demo_OrderService
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly IDemo_OrderRepository _repository;//访问数据库

    [ActivatorUtilitiesConstructor]
    public Demo_OrderService(
        IDemo_OrderRepository dbRepository,
        IHttpContextAccessor httpContextAccessor
        )
    : base(dbRepository)
    {
        _httpContextAccessor = httpContextAccessor;
        _repository = dbRepository;
    }

    /// <param name="id">当前表[Demo_Order]主键id值</param>
    /// <returns></returns>
    public string Test(Guid id)
    {
        //流程重新开始
        RestartWorkFlowAudit(id, $"[{UserContext.Current.UserTrueName}]撤回了流程", FlowWriteState.重新开始);
        //流程回退上一级节点
        RestartWorkFlowAudit(id, $"[{UserContext.Current.UserTrueName}]撤回上一节点", FlowWriteState.回退上一级节点);
        //流程终止
        RestartWorkFlowAudit(id, $"[{UserContext.Current.UserTrueName}]终止了流程",FlowWriteState.终止);
        return "OK";
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

2、在控制器[表 Controller.cs]类中调用

//这里以Demo_OrderController为例,实际使用时写在当前表控制器
//后台控制器使用
public partial class Demo_OrderController
{
    private readonly IDemo_OrderService _service;//访问业务代码
    private readonly IHttpContextAccessor _httpContextAccessor;
    [ActivatorUtilitiesConstructor]
    public Demo_OrderController(
        IDemo_OrderService service,
        IHttpContextAccessor httpContextAccessor
    )
    : base(service)
    {
        _service = service;
        _httpContextAccessor = httpContextAccessor;
    }

    /// <summary>
    ///  流程处理
    /// </summary>
    /// <param name="id">当前表[Demo_Order]主键id值</param>
    /// <returns></returns>
    [HttpGet, Route("test")]
    public IActionResult Test(Guid id)
    {
        //流程重新开始
        Service.RestartWorkFlowAudit(id,$"[{UserContext.Current.UserTrueName}]撤回了流程",FlowWriteState.重新开始);
        //流程回退上一级节点
        Service.RestartWorkFlowAudit(id,$"[{UserContext.Current.UserTrueName}]撤回上节点",FlowWriteState.回退上一级节点);
        //流程终止
        Service.RestartWorkFlowAudit(id,$"[{UserContext.Current.UserTrueName}]终止了流程",FlowWriteState.终止);
        return Content("OK");
    }
}

//前端调用
this.http.get("api/表名/test?id="+id值).then(result=>{
    //刷新页面
    this.search()
    this.$message.success(result)
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41



# 草稿、待提交、提交流程

# 1. 草稿、待提交数据

新建的数据默认会自动提交,审批流程状态为待审批,如果不需要默认提交数据,审批状态显示为【草稿】或【待提交】,请按以下配置:
(a)参照企业版本地址:http://pro.volcore.xyz/#/sysmenu修改数据字典,配置找到【审核状态】字典,点击编辑在本地配置为一样的数据源 (b)startup.cs 中添加默认状态,这两步配置完成后,新建的数据默认就为草稿状态

   //以Demo_Order表为例,在最后配置参数加上defaultAduitStatus属性默认值
    WorkFlowContainer.Instance.Use<Demo_Order, Demo_OrderList>("订单管理",
                    //过滤条件字段
                    filterFields: x => new { x.OrderDate, x.OrderNo, x.OrderStatus },
                    //审批界面显示表数据字段
                    formFields: x => new { x.OrderDate, x.OrderNo, x.OrderStatus },
                    //明细表显示的数据
                    formDetailFields: x => new { x.GoodsName, x.GoodsCode, x.Qty},
                    //配置创建的数据审批新课程状态默认为草稿
                    defaultAduitStatus: AuditStatus.草稿
                )
1
2
3
4
5
6
7
8
9
10
11

# 2. 提交数据

将草稿数据提交到流程
(a)在前端表.js 添加提交按钮

 onInit() {
      //增加提交审批按钮
      let index = this.buttons.findIndex((x) => { return x.value == 'Audit';}) + 1;

      this.buttons.splice(index, 0, {
        name: '提交',
        icon: 'el-icon-check',
        class: '',
        plain: true,
        type: 'primary',
        onClick: () => {
          let rows = this.getSelectRows();
          if (!rows.length) {
            return this.$message.error('请选择行数据');
          }
          let ids = rows.map((x) => { return x.Order_Id;});

          this.http.post('api/Demo_Order/submitAudit', ids).then((result) => {
            if (!result.status) {
              this.$message.error(result.message);
              return;
            }
            this.$message.success(result.message);
            this.search();
          });
        }
      });
 }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

(b)在后台表控制器实现方法

 public partial class Demo_OrderController
{
        private readonly IDemo_OrderService _service;//访问业务代码
        private readonly IHttpContextAccessor _httpContextAccessor;

        [ActivatorUtilitiesConstructor]
        public Demo_OrderController(
            IDemo_OrderService service,
            IHttpContextAccessor httpContextAccessor
        )
        : base(service)
        {
            _service = service;
            _httpContextAccessor = httpContextAccessor;
        }
        /// <summary>
        /// 获取订单明细数据
        /// </summary>
        /// <param name="Order_Id"></param>
        /// <returns></returns>
        [Route("submitAudit"), HttpPost]
        public IActionResult SubmitAudit([FromBody] object[] ids)
        {
            //提交数据到流程
            var result = Service.SubmitWorkFlowAudit(ids);
            return Json(result);
        }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 3. 视图写入流程与审批

使用视图生成的代码新建时,实际调用的是原表的新建写入,此种情况审批流程无法使用,
解决办法:在原表Service类的构造方法中实现属性: WorkFlowTableName = "视图名";
(注意:在startup.cs里视图、原表都要配置流程信息)

    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly I视图Repository _repository;//访问数据库
    private readonly I原表Service _原表Service;//访问数据库
    [ActivatorUtilitiesConstructor]
    public 视图Service(
        I视图Repository repository,
        I原表Service 原表Service,
        IHttpContextAccessor httpContextAccessor
        )
    : base(dbRepository)
    {
        _repository=repository;
        _httpContextAccessor = httpContextAccessor;
        _原表Service = 原表Service;
        //这里必须要写原表service类
        _原表Service.WorkFlowTableName = "视图名";//这里填写视图名,因为startup.cs初始化的时候使用的就是视图名
    }
      //重写李新建方法,调用原表的新建方法
    public override WebResponseContent Add(SaveModel saveDataModel)
    {
        return _原表Service.Add(saveDataModel);
    }
     //重写审批方法,调用原表的审批方法
    public override WebResponseContent Audit(object[] keys, int? auditStatus, string auditReason)
    {
        return _原表Service.Audit(keys, auditStatus, auditReason);
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28