需求
工单需要暂停和作废,暂停作废需要有可配置的流程
北汽通过预先设置的条件自动进入结算
江淮手动选择工单进行结算
架构设计
结算单是独立的模块 在AZ主站项目下 集成Aibol框架 接入 流程引擎
作废/暂停 同时存在于需要 暂停和作废 的项目下
比如工单有作废 暂停 结算也有 作废 暂停
总结: 结算单 和 工单 平级 , 每个都有独立的 作废/暂停
具体方案
-
有独立的流程管理页面 来为每个车厂配置特有的 结算流程
结算流程图管理页面 (考虑加入到workflow项目中统一管理),比如在现有的管理页面中 加入下拉,也可以用侧边栏菜单分类(作废和暂停要分为 工单作废和暂停结算单作废和暂停)
-
暂停和作废设计
当工单点击暂停/作废按钮的时候 工单的 "Status" : 0, 变成 对应状态 ,同时生成一份 暂停/作废 运行时
作废/暂停 的 开始节点 post方法 ==> 发送相关通知
网关判断审核结果 进入2个不同的 结束节点
通过结束节点的 prev方法 ==> 修改对应 "orderId" 的工单 的 "Status" 为确认暂停/作废 并添加对应 "operations" 工单暂停/作废
不通过结束节点的 prev方法 ==> 修改对应 "orderId" 的工单 的 "Status" 为确认暂停/作废 并添加对应 "operations" 工单继续运行
申请暂停的工单 在申请全过程中 只会多2个 "operations" 一个发起 一个结果
至于具体的审核流传的 "operations" 在对应的 暂停/作废 运行时 中体现
审核人/时间/结果/暂停作废运行时id 等信息 作为data保存在工单对应的审核结果的data中 (可以不同步到mainData)
如果需要查询订单的暂停次数 只要过滤 "operations" 中 "type" : 暂停 的数据 就可以知道 所有 暂停操作的开始与结果
上图申请task应该不需要,点击了按钮 就自动申请了
暂停/作废
{
"_id" : ObjectId("5913c793ad273115ccf31231"),
"CreatedWhen" : ISODate("2017-05-11T02:08:19.255Z"),
"CreatedBy" : null,
"LastModifiedWhen" : ISODate("2017-05-11T02:08:19.257Z"),
"LastModifiedBy" : null,
"Status" : 0,
"orderId" : ObjectId("5913c793ad273115ccf30041"),
"operations" : [ ]
}
工单
{
"_id" : ObjectId("5913c793ad273115ccf30041"),
"CreatedWhen" : ISODate("2017-05-11T02:08:19.255Z"),
"CreatedBy" : null,
"LastModifiedWhen" : ISODate("2017-05-11T02:08:19.257Z"),
"LastModifiedBy" : null,
"Status" : 0,
"wfId" : "a69e81c5-3bf5-474b-a882-a1cf8933b66f",
"tenantId" : "5351405d-4e81-4f42-8cea-5526690b0fdc",
"title" : "test",
"view" : "CarIntention",
"Alias" : null,
"currentProcessId" : "Task_1t3nwjx",
"operations" : [
{
"CreatedWhen" : ISODate("2017-05-11T02:08:19.255Z"),
"CreatedBy" : "system",
"LastModifiedWhen" : ISODate("2017-05-11T02:08:19.255Z"),
"LastModifiedBy" : "system",
"Status" : 4,
"num" : 0,
"remark" : null,
"type" : 0,
"currectProcessName" : "选择开始节点",
"here" : null,
"from" : null,
"view" : null,
"IsBacked" : null,
"data" : []
},
{
"CreatedWhen" : ISODate("2017-05-11T02:08:19.256Z"),
"CreatedBy" : "system",
"LastModifiedWhen" : ISODate("2017-05-11T02:08:19.256Z"),
"LastModifiedBy" : "system",
"Status" : 4,
"num" : 1,
"remark" : null,
"type" : 0,
"currectProcessName" : "",
"here" : "SequenceFlow_1cgwz8s",
"from" : "StartEvent_19fn7p6",
"view" : "",
"IsBacked" : null,
"data" : []
},
{
"CreatedWhen" : ISODate("2017-05-11T02:08:19.257Z"),
"CreatedBy" : "system",
"LastModifiedWhen" : ISODate("2017-05-11T02:08:19.257Z"),
"LastModifiedBy" : "system",
"Status" : 4,
"num" : 2,
"remark" : null,
"type" : 0,
"currectProcessName" : "新建购车意向",
"here" : "Task_1t3nwjx",
"from" : "SequenceFlow_1cgwz8s",
"view" : "CarIntention",
"IsBacked" : null,
"data" : []
}
],
"rate" : 6.0
}
-
结算单设计
结算单 是平级于 工单 的 一个独立的流程运行时
-
自动结算方案 (北汽)
当一个工单结束的时候 触发 配置在结束节点的 prev方法 ==> 判断是否有符合条件的结算单,如果有则加入,如果没有则新增并加入,然后进行后续操作
-
手动结算方案 (江淮)
当一个工单结束的时候 结束节点不配置prev方法,在结算流程的 第一个task "选择需要结算的工单" 的时候 去修改结算单的 OrderId 数组,然后执行后续操作
-
混合结算方案 (3-10日手动,其他自动)
基于自动和手动方案,修改工单结束节点prev方法 ==> 添加日期判断 符合条件才进行后续操作,不符合日期条件则不操作.在结算单流程的 "选择需要结算的工单" 可以进行手动选择结算(当然也可以根据时间 关闭手动选择的权限,只要修改一下这个 task 所属 operation 的 Verify 方法 日期条件不通过则无法添加)
settlement
{
id:1233123123,
orderId:[
aaaaaaaa1,
bbbbbbb2,
ccccccccc3
],
......
}
缺少 : 结算流程图 与 其具体的task页面,结算模块需要有自己的 “详情页面” 类似工单的主页面,用来承载结算的流转,
post prev 方法的具体方案
该方法在前端设计器中配置,如图
在主站系统中实现
流程运转的时候被调用执行,由于方法在主站所以可以使用所有主站的资源
关于参数传递的实现设想方案,
az:prev="Basic.TestPrev?TenanId¶m1¶m2¶m3"
prev
:预方法
post
:后方法
Basic
:所在类
TestPrev
:方法名称 与类名用 .
隔开
?TenanId¶m1¶m2¶m3
需要参数,必须是主表主字段有的参数或者是当前节点的data中有的参数,用 ?
与方法名隔开,不同的参数用 &
隔开
问题
- 工单进入结算后 相关的operations 是什么?开始结算,结算完毕?
- 工单/结算单 的所有状态码
- 流程引擎接入方案
- 单点登录系统接入方案