按数据顺序处理(工序排程)
案例需求
按照设置的审批人顺序依次审批,和自由流类似,不确定审批环节数量。
不使用一个环节多人顺序处理,是因为多人顺序处理发生回退时,会统一回退到前序环节,不是回退到前序人
开发过程
流程图
流程图和自由流类似,不同的是
- 自由流:由用户决定是否继续审批,因此使用“或签”环节
- 本例:由程序决定是否继续审批,因此使用“条件分支”环节
添加审批状态列
业务数据表和审批人表都设置审批状态列
- 业务数据表-审批状态:用于流程图上条件分支的条件判断,当所有审批人都已审批,设置为“已审批”
- 审批人表-审批状态:用于计算下一个审批人,在流程成功事件中设置为“已审批”
设置审批人
在流程组件的“打开对话框前”事件中,从审批人表中计算下一个审批人,设置为处理人
代码如下,注意 processControl 中执行者 executors 使用人员的全路径标识 fid 和全路径名称 fname
onWfmuiOpenDialogBefore = (event) => {
let processControl = event.processControl;//获取processControl
let items = processControl.getToItems();
items[0].data.executors = [];
let detailData = this.comp("detailData");
detailData.each(({row})=>{
if(row.status != "已审批"){
let auditor = {
"fid": row.auditorId,//人员的全路径标识 fid
"fname": row.auditor//人员的全路径名称 fname
};
items[0].data.executors.push(auditor);
return false;
}
})
}
设置审批状态
在流程组件的“流转成功”事件中
- 获取下一个环节的处理人,在审批人表中设置这个人的审批状态为“已审批”
- 判断是否全部审批,如果全部审批,设置业务数据的审批状态为“已审批”
代码如下
onWfmuiAdvanceSuccess = (event) => {
let processControl = event.processControl;//获取processControl
let items = processControl.getToItems();
if(items[0].data.executors.length > 0){
let auditorId = items[0].data.executors[0].fid;
let mainData = this.comp("mainData");
let detailData = this.comp("detailData");
let rows = detailData.find(["auditorId"],[auditorId]);
if(rows.length > 0){
rows[0].status = "已审批";
}
rows = detailData.find(["status"],["已审批"]);
if(rows.length == detailData.count()){
mainData.setValue("status","已审批");
}
mainData.saveData();
}
}
运行效果
添加两个审批人
流转给第一个审批人
第一个人审批后,设置第一个审批人的审批状态为“已审批”
流转给第二个审批人
第二个人审批后,设置第二个审批人的审批状态为“已审批”,所有审批人都已审批,设置业务数据的审批状态为“已审批”
所有审批人都已审批,流程结束