目录
1、需求描述
1.1 需求
明细表中的“选择框A”字段,当选项包含“选项4”或“选项5”时,审批人为A,否则为B。
1.2 描述
在泛微OA流程引擎中,主表字段是唯一可以做为节点操作者条件。如果将明细表选择框A字段值等同于主表选择框D字段值时,主表选择框D字段获取到的值,只有明细第一行的选择框A字段值,第二行、第三行等多行的选择框A字段值就获取不了。
示例1:当明细行只有一行时
示例2:当明细行有多行时
2、思路
在上一篇文章《泛微OA_E9之明细表当前行check框选中,其余明细行check框置灰,并将当前明细行中某字段赋值到主表字段》中提到过,明细表是不确定因素,但这次的需求不是取唯一值,而是取所有值。
第一步,获取明细行所有行标示,遍历明细行选择框A字段,将选择框A字段所有值组成新的数组;
第二步,一次的流程提交,不会所有选项都选择,所以要将未选择的选项值进行删除;
第三步,判断新数组中,如果包含有“选项4”或“选项5”的值时,审批人为A,否则为B。
3、效果
效果1:明细表中的“选择框A”字段,当选项包含“选项4”或“选项5”时,审批人为A
效果2: 明细表中的“选择框A”字段,当选项不包含“选项4”或“选项5”时,审批人为B
4、步骤
4.1 本次使用E9流程表单前端接口API介绍
具体《E9流程表单前端接口API》详情,请参考泛微官方文献,本篇只介绍需要用到的API。
4.1.1 明细字段值变化触发事件
绑定后对新添加的明细行字段以及加载的已有行明细字段,值变更触发所绑定的事件
bindDetailFieldChangeEvent: function(fieldMarkStr,funobj)
参数说明
参数 | 参数类型 | 必须 | 说明 |
---|---|---|---|
fieldMarkStr | String | 是 | 绑定的明细字段标示,不能有下划线标示,可多个拼接逗号隔开,例如:field110,field111 |
funobj | Function | 是 | 字段值变更触发自定义函数,函数默认传递以下三个参数,参数1:字段标示(field27583),参数2:行标示,参数3:修改后的值 |
样例:
jQuery(document).ready(function(){
WfForm.bindDetailFieldChangeEvent("field27583,field27584",function(id,rowIndex,value){
console.log("WfForm.bindDetailFieldChangeEvent--",id,rowIndex,value);
});
});
4.1.2 获取明细行所有行标示
getDetailAllRowIndexStr: function(detailMark)
参数说明
参数 | 参数类型 | 必须 | 说明 |
---|---|---|---|
detailMark | String | 是 | 明细表标示,明细1就是detail_1,以此递增类推 |
样例:
console.log(WfForm.getDetailAllRowIndexStr("detail_2")); //输出1,3...等等
特别注意:
//遍历明细行的写法
var rowArr = WfForm.getDetailAllRowIndexStr("detail_1").split(",");
for(var i=0; i<rowArr.length; i++){
var rowIndex = rowArr[i];
if(rowIndex !== ""){
var fieldMark = "field111_"+rowIndex; //遍历明细行字段
}
}
4.1.3 获取单个字段值
getFieldValue: function(fieldMark)
参数说明
参数 | 参数类型 | 必须 | 说明 |
---|---|---|---|
fieldMark | String | 是 | 字段标示,格式 field${字段ID} |
样例:
var fieldvalue = WfForm.getFieldValue("field110");
4.1.4 系统样式的Confirm确认框
此方法修改的字段如果涉及到触发联动、单元格格式化等,修改完值会自动触发联动/格式化
改值的格式在添加明细行初始化、批量修改字段等场景类同
changeFieldValue: function(fieldMark, valueInfo)
参数说明
参数 | 参数类型 | 必须 | 说明 |
---|---|---|---|
fieldMark | String | 是 | 字段标示,格式field${字段ID}_${明细行号} |
valueInfo | JSON | 是 | 字段值信息,非浏览按钮字段格式为{value:”修改的值”};specialobj为浏览按钮信息,数组格式;showhtml属性只在单行文本类型且只读情况下生效; |
样例:
//修改文本框、多行文本、选择框等字段类型
WfForm.changeFieldValue("field123", {value:"1.234"});
//修改浏览框字段的值,必须有specialobj数组结构对象
WfForm.changeFieldValue("field11_2", {
value: "2,3",
specialobj:[
{id:"2",name:"张三"},
{id:"3",name:"李四"}
]
});
//修改check框字段(0不勾选、1勾选)
WfForm.changeFieldValue("field123", {value:"1"});
//针对单行文本框字段类型,只读情况,支持显示值跟入库值不一致
WfForm.changeFieldValue("field123", {
value: "入库真实值",
specialobj: {
showhtml: "界面显示值"
}
});
4.2 上代码
WfForm.bindDetailFieldChangeEvent("field35287",function(id,rowIndex,value){
var rowArr = WfForm.getDetailAllRowIndexStr("detail_1").split(",");//获取明细行所有行标示
for(var i=0; i<rowArr.length; i++){
var rowIndex = rowArr[i];
if(rowIndex !== ""){
var fieldMark = "field35287_" + rowIndex;//遍历明细行字段
var fieldvalue = WfForm.getFieldValue(fieldMark);//获取“选择框A”选择项值
if(fieldvalue == "0"){
var arrField0 = 0;
}else if(fieldvalue == "1"){
var arrField1 = 1;
}else if(fieldvalue == "2"){
var arrField2 = 2;
}else if(fieldvalue == "3"){
var arrField3 = 3;
}else if(fieldvalue == "4"){
var arrField4 = 4;
}else{
//当明细表“选择框A”字段还没有选择时,等于空值
};
};
};
//组成已选择项的值
var arrField = arrField0 + ',' + arrField1 + ',' + arrField2 + ',' + arrField3 + ',' + arrField4;
//将组成已选择项的值重新组成数组
var newArrField = arrField.split(",");
//去重未选择项的多个undefined值
function reMoval(newArrField){
return [...new Set(newArrField)];
};
var mxTypeArr = reMoval(newArrField);
//删除undefined值
mxTypeArr.forEach(function(item, index, arr){
if(item === "undefined"){
arr.splice(index, 1);
};
});
//判断
mxTypeArr.forEach(function(item, index, arr){
if(item === "3" || item === "4"){
WfForm.changeFieldValue("field34396", {//当明细表“选择框A”字段值含有“选项4”或“选项5”时,主表“审批人”字段值为A
value: "15518",//审批人A的ID
specialobj:[
{id:"15518",name:"A"}
]
});
}else{
WfForm.changeFieldValue("field34396", {//当明细表“选择框A”字段值为其他时,主表“审批人”字段值为B
value: "22552",//审批人B的ID
specialobj:[
{id:"22552",name:"B"}
]
});
};
});
})
5、总结
明细表是真的不好取值,这个方法实现的比较繁琐,暂时想不到更简便的方法。
过路大神请赐教,再会!