Loading... <!-- index-menu --> # 1、需求描述 ## 1.1 需求 明细表中的“选择框A”字段,当选项包含“选项4”或“选项5”时,审批人为A,否则为B。 ## 1.2 描述 在泛微OA流程引擎中,主表字段是唯一可以做为节点操作者条件。如果将明细表选择框A字段值等同于主表选择框D字段值时,主表选择框D字段获取到的值,只有明细第一行的选择框A字段值,第二行、第三行等多行的选择框A字段值就获取不了。 ### 示例1:当明细行只有一行时 ![请输入图片描述](https://xug.cc/usr/uploads/2023/11/2740548261.png) ### 示例2:当明细行有多行时 ![请输入图片描述](https://xug.cc/usr/uploads/2023/11/1308396871.png) # 2、思路 在上一篇文章[《泛微OA_E9之明细表当前行check框选中,其余明细行check框置灰,并将当前明细行中某字段赋值到主表字段》](https://naye.cc/index.php/archives/394/)中提到过,明细表是不确定因素,但这次的需求不是取唯一值,而是取所有值。 第一步,获取明细行所有行标示,遍历明细行选择框A字段,将选择框A字段所有值组成新的数组; 第二步,一次的流程提交,不会所有选项都选择,所以要将未选择的选项值进行删除; 第三步,判断新数组中,如果包含有“选项4”或“选项5”的值时,审批人为A,否则为B。 # 3、效果 ## 效果1:明细表中的“选择框A”字段,当选项包含“选项4”或“选项5”时,审批人为A ![请输入图片描述](https://xug.cc/usr/uploads/2023/11/1665450480.png) ## 效果2: 明细表中的“选择框A”字段,当选项不包含“选项4”或“选项5”时,审批人为B ![请输入图片描述](https://xug.cc/usr/uploads/2023/11/97978433.png) --- # 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:修改后的值 | 样例: ```c 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,以此递增类推 | 样例: ```c console.log(WfForm.getDetailAllRowIndexStr("detail_2")); //输出1,3...等等 ``` 特别注意: ```c //遍历明细行的写法 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} | 样例: ```c var fieldvalue = WfForm.getFieldValue("field110"); ``` ### 4.1.4 系统样式的Confirm确认框 ``` 此方法修改的字段如果涉及到触发联动、单元格格式化等,修改完值会自动触发联动/格式化 改值的格式在添加明细行初始化、批量修改字段等场景类同 changeFieldValue: function(fieldMark, valueInfo) ``` 参数说明 | 参数 | 参数类型 | 必须 | 说明 | | ----------- | ---------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------- | | fieldMark | String | 是 | 字段标示,格式`field${字段ID}_${明细行号}` | | valueInfo | JSON | 是 | 字段值信息,非浏览按钮字段格式为{value:”修改的值”};specialobj为浏览按钮信息,数组格式;showhtml属性只在单行文本类型且只读情况下生效; | 样例: ```c //修改文本框、多行文本、选择框等字段类型 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 上代码 ```c 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、总结 明细表是真的不好取值,这个方法实现的比较繁琐,暂时想不到更简便的方法。 过路大神请赐教,再会! Last modification:November 3, 2023 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 如果觉得我的文章对你有用,请随意赞赏