跳转至

title: E9 明细2 行状态控制(评审锁定 + 提交标记) created: 2026-04-24 updated: 2026-04-24 type: solution tags: [js, detail, e9, readonly, submit] related: [oa/dev-solutions/detail1-row-state-control.md]


泛微 E9 明细2 行状态控制(评审锁定 + 提交标记)

场景

在明细表 2 中,实现基于评审状态字段的行级锁定

  • pdsfwjx_mx2 == "1"(评审未提交)→ csxmsmsftgcs 设为只读,禁用该行勾选
  • 否则 → 两个字段均可编辑(属性 3)
  • 提交流程前:自动将所有行的 pdsfwjx_mx2 设为 "1",下次打开时自动锁定 sftgcs 设为只读,禁用该行勾选
  • 否则 → 两个字段均可编辑(属性 3)
  • 提交流程前:自动将所有行的 pdsfwjx_mx2 设为 "1",下次打开时自动锁定## 完整代码

// 明细字段转 ID(遵循动态映射规范)
const id_csxmsm = WfForm.convertFieldNameToId("csxmsm", "detail_2");
const id_sftgcs = WfForm.convertFieldNameToId("sftgcs", "detail_2");
const id_pdsfwjx_mx2 = WfForm.convertFieldNameToId("pdsfwjx_mx2", "detail_2");

/**
 * 判断明细行是否评审未提交(pdsfwjx_mx2 == "1")
 * 若是:锁定 csxmsm、sftgcs 为只读,并禁用该行的勾选
 * 若否:保持可编辑
 */
function toggleDetailRows() {
  const rowArr = WfForm.getDetailAllRowIndexStr("detail_2").split(",");
  for (const rowIndex of rowArr) {
    const value = WfForm.getFieldValue(id_pdsfwjx_mx2 + "_" + rowIndex);
    const isLocked = value === "1";
    // 1=只读,3=可编辑
    const attr = isLocked ? 1 : 3;
    WfForm.changeFieldAttr(id_csxmsm + "_" + rowIndex, attr);
    WfForm.changeFieldAttr(id_sftgcs + "_" + rowIndex, attr);
    // 锁定状态禁用明细行勾选
    if (isLocked) {
      WfForm.controlDetailRowDisableCheck("detail_2", rowIndex, true);
    }
  }
}

// 页面加载时初始化各行状态
jQuery(document).ready(toggleDetailRows);

// 提交前:将所有行的 pdsfwjx_mx2 设为 "1"(标记为已提交,下次打开将锁定)
WfForm.registerCheckEvent(WfForm.OPER_SUBMIT, function (callback) {
  const rowArr = WfForm.getDetailAllRowIndexStr("detail_2").split(",");
  for (const rowIndex of rowArr) {
    WfForm.changeFieldValue(id_pdsfwjx_mx2 + "_" + rowIndex, { value: "1" });
  }
  callback(); // 继续提交流程
});
angeFieldValue(id_pdsfwjx_mx2 + "_" + rowIndex, { value: "1" }); } callback(); // 继续提交流程 }); ```## 核心要点

API 用途
convertFieldNameToId(name, detail) 字段名转 ID(自带 field_ 前缀)
changeFieldAttr(field + "_" + row, 1/3) 1=只读, 3=可编辑
controlDetailRowDisableCheck(detail, row, true) 禁用该行勾选
registerCheckEvent(OPER_SUBMIT, cb) 提交前拦截,调 callback() 放行

⚠️ 注意事项

  • convertFieldNameToId 返回值已带 field_ 前缀,拼接行号时不要再加 field_
  • 明细字段值读取必须加行号:fieldId + "_" + rowIndex
  • 与明细1 的方案区别:此方案更简洁,不需要区分必填/可编辑,只有只读/可编辑两种状态