name: fanwei-e9-ot-control description: 泛微E9表单根据申报加班人数动态控制加班明细必填/只读,自动赋值申请人工号完整代码 author: Hermes Agent
泛微E9 加班申报表单字段控制
触发条件:需要根据申报加班人数动态控制加班明细字段必填/只读,并自动赋值申请人工号。
需求规则
| 字段 | 名称 | 位置 |
|---|---|---|
| sbjbrs | 申报加班人数 | 主表 |
| jbrymx | 加班人数明细 | 主表 |
| jobnumber | 申请人工号 | 主表 |
| gh_mx1 | 工号_明细表1 | 明细表1 |
规则: 1. 当 申报加班人数 大于1时 → 加班人数明细必填,明细表工号必填 2. 当 申报加班人数 等于1或空值时 → 加班人数明细只读,明细表工号只读 3. 当 申报加班人数 等于1时 → 将申请人工号自动赋值给工号_明细表1 4. 申报加班人数≤1时,不允许增删明细表行 5. 提交时校验必填项 等于1或空值时 → 加班人数明细只读,明细表工号只读 3. 当 申报加班人数 等于1时 → 将申请人工号自动赋值给工号_明细表1 4. 申报加班人数≤1时,不允许增删明细表行 5. 提交时校验必填项## 完整代码(遵循不使用var规范,全部用const/let)
jQuery(document).ready(function(){
// ========== 字段名转ID ==========
const sbjbrsField = WfForm.convertFieldNameToId("sbjbrs"); // 申报加班人数(主表)
const jbrymxField = WfForm.convertFieldNameToId("jbrymx"); // 加班人数明细(主表)
const jobnumberField = WfForm.convertFieldNameToId("jobnumber"); // 申请人工号(主表)
const ghMx1Field = WfForm.convertFieldNameToId("gh_mx1", "detail_1"); // 工号_明细表1(明细表1)
/**
* 根据申报加班人数控制 jbrymx + 明细表属性
*/
function handleSbjbrsChange(sbjbrsValue) {
const sbjbrsNum = parseInt(sbjbrsValue, 10) || 0;
const rowArr = WfForm.getDetailAllRowIndexStr("detail_1").split(",");
if (sbjbrsNum > 1) {
// === 申报加班人数 > 1 ===
// 主表:加班人数明细 必填
WfForm.changeFieldAttr(jbrymxField, 3);
// 明细表:工号_明细表1 必填
for (let i = 0; i < rowArr.length; i++) {
const rowIndex = rowArr[i];
if (rowIndex === "") continue;
WfForm.changeFieldAttr(ghMx1Field + "_" + rowIndex, 3);
}
} else if (sbjbrsNum === 1) {
// === 申报加班人数 = 1 ===
// 主表:加班人数明细 只读
WfForm.changeFieldAttr(jbrymxField, 1);
/ === 申报加班人数 = 1 ===
// 主表:加班人数明细 只读
WfForm.changeFieldAttr(jbrymxField, 1);// 明细表:只读 + 自动赋值申请人工号
const jobnumberValue = WfForm.getFieldValue(jobnumberField);
for (let i = 0; i < rowArr.length; i++) {
const rowIndex = rowArr[i];
if (rowIndex === "") continue;
WfForm.changeFieldAttr(ghMx1Field + "_" + rowIndex, 1);
WfForm.changeFieldValue(ghMx1Field + "_" + rowIndex, {value: jobnumberValue});
}
} else {
// === 申报加班人数为空 ===
// 主表:加班人数明细 只读
WfForm.changeFieldAttr(jbrymxField, 1);
// 明细表:只读
for (let i = 0; i < rowArr.length; i++) {
const rowIndex = rowArr[i];
if (rowIndex === "") continue;
WfForm.changeFieldAttr(ghMx1Field + "_" + rowIndex, 1);
}
}
}
// ========== 1. 监听主表字段变化 ==========
WfForm.bindFieldChangeEvent(sbjbrsField, function(obj, id, value){
handleSbjbrsChange(value);
});
// ========== 2. 新增明细行时自动设置属性 ==========
WfForm.registerAction(WfForm.ACTION_ADDROW + "1", function(index){
const sbjbrsValue = WfForm.getFieldValue(sbjbrsField);
const sbjbrsNum = parseInt(sbjbrsValue, 10) || 0;
Value = WfForm.getFieldValue(sbjbrsField);
const sbjbrsNum = parseInt(sbjbrsValue, 10) || 0;if (sbjbrsNum > 1) {
WfForm.changeFieldAttr(ghMx1Field + "_" + index, 3);
} else if (sbjbrsNum === 1) {
const jobnumberValue = WfForm.getFieldValue(jobnumberField);
WfForm.changeFieldAttr(ghMx1Field + "_" + index, 1);
WfForm.changeFieldValue(ghMx1Field + "_" + index, {value: jobnumberValue});
} else {
WfForm.changeFieldAttr(ghMx1Field + "_" + index, 1);
}
});
// ========== 3. 申报加班人数 ≤ 1 时阻止添加/删除明细行 ==========
WfForm.registerCheckEvent(WfForm.OPER_ADDROW + "1", function(callback){
const sbjbrsValue = WfForm.getFieldValue(sbjbrsField);
const sbjbrsNum = parseInt(sbjbrsValue, 10) || 0;
if (sbjbrsNum <= 1) {
WfForm.showMessage("当前申报加班人数不大于1,不允许添加明细行!");
return;
}
callback();
});
WfForm.registerCheckEvent(WfForm.OPER_DELROW + "1", function(callback){
const sbjbrsValue = WfForm.getFieldValue(sbjbrsField);
const sbjbrsNum = parseInt(sbjbrsValue, 10) || 0;
if (sbjbrsNum <= 1) {
WfForm.showMessage("当前申报加班人数不大于1,不允许删除明细行!");
return;
}
callback();
});
// ========== 4. 提交/保存校验 ==========
WfForm.registerCheckEvent(WfForm.OPER_SUBMIT + "," + WfForm.OPER_SAVE, function(callback){
const sbjbrsValue = WfForm.getFieldValue(sbjbrsField);
const sbjbrsNum = parseInt(sbjbrsValue, 10) || 0;
Value = WfForm.getFieldValue(sbjbrsField);
const sbjbrsNum = parseInt(sbjbrsValue, 10) || 0;if (sbjbrsNum > 1) {
// 主表:加班人数明细必填校验
const jbrymxValue = WfForm.getFieldValue(jbrymxField);
if (!jbrymxValue || jbrymxValue.trim() === "") {
WfForm.showMessage("申报加班人数大于1时,加班人数明细为必填项!");
return;
}
// 明细表:必须有行数据
const rowCount = WfForm.getDetailRowCount("detail_1");
if (rowCount === 0) {
WfForm.showMessage("申报加班人数大于1时,工号明细表为必填项,请添加明细行!");
return;
}
}
callback();
});
// ========== 5. 页面加载初始化 ==========
const initSbjbrsValue = WfForm.getFieldValue(sbjbrsField);
handleSbjbrsChange(initSbjbrsValue);
});
``## 编码规范
泛微官方文档明确要求(用户记忆):不要使用var,全部使用const/let`替换。
字段属性值说明(泛微E9 API标准)
| viewAttr值 | 含义 |
|---|---|
| 1 | 只读 |
| 2 | 可编辑 |
| 3 | 必填 |
| 4 | 隐藏 |
注意事项
convertFieldNameToId要求字段名和数据库中完全一致,区分大小写- 代码默认明细表为
detail_1,如果明细表序号不同需要修改 - 通过前端
changeFieldAttr设置只读,而非后台设置,才能保证changeFieldValue赋值生效