跳转至

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


泛微 E9 明细1 行状态控制(锁定/只读切换 + 提交标记)

场景

在明细表 1 中,需要实现基于字段值的行级锁定逻辑

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

// 明细字段转 ID(遵循动态映射规范)
const id_xgrq = WfForm.convertFieldNameToId("xgrq", "detail_1");
const id_xgr = WfForm.convertFieldNameToId("xgr", "detail_1");
const id_hzrq = WfForm.convertFieldNameToId("hzrq", "detail_1");
const id_hzrzgj = WfForm.convertFieldNameToId("hzrzgj", "detail_1");
const id_cxkmc = WfForm.convertFieldNameToId("cxkmc", "detail_1");
const id_xgqnrjt = WfForm.convertFieldNameToId("xgqnrjt", "detail_1");
const id_xghnrjt = WfForm.convertFieldNameToId("xghnrjt", "detail_1");
const id_bz = WfForm.convertFieldNameToId("bz", "detail_1");
const id_pdsfwxtjx_mx1 = WfForm.convertFieldNameToId("pdsfwxtjx_mx1", "detail_1");
bz", "detail_1");
const id_pdsfwxtjx_mx1 = WfForm.convertFieldNameToId("pdsfwxtjx_mx1", "detail_1");/**
 * detail_1 明细行状态控制
 * pdsfwxtjx_mx1 == "1":锁定所有字段,禁用行勾选
 * 否则:大部分字段必填(3),备注字段可编辑(2)
 */
function toggleDetail1Rows() {
  const rowArr = WfForm.getDetailAllRowIndexStr("detail_1").split(",");
  for (const rowIndex of rowArr) {
    const value = WfForm.getFieldValue(id_pdsfwxtjx_mx1 + "_" + rowIndex);
    const isLocked = value === "1";
    // 锁定状态下的字段列表(全部只读)
    const lockFields = [
      id_xgrq, id_xgr, id_hzrq, id_hzrzgj,
      id_cxkmc, id_xgqnrjt, id_xghnrjt
    ];
    if (isLocked) {
      // 评审未提交 → 全部只读 + 禁用勾选
      lockFields.forEach(field => {
        WfForm.changeFieldAttr(field + "_" + rowIndex, 1);
      });
      WfForm.changeFieldAttr(id_bz + "_" + rowIndex, 1); // 备注也锁定
      WfForm.controlDetailRowDisableCheck("detail_1", rowIndex, true);
    } else {
      // 可编辑状态:前 7 个字段必填(3),备注可编辑(2)
      lockFields.forEach(field => {
        WfForm.changeFieldAttr(field + "_" + rowIndex, 3); // 必填
      });
      WfForm.changeFieldAttr(id_bz + "_" + rowIndex, 2); // 备注可编辑
    }
  }
}

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

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

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

⚠️ 注意事项

  • convertFieldNameToId 返回值已带 field_ 前缀,拼接行号时不要再加 field_
  • 必须用 WfForm API 而非 jQuery 操作明细行属性,避免破坏表头
  • 明细字段值读取必须加行号:fieldId + "_" + rowIndex