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(); // 继续提交流程
});
| 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_- 必须用
WfFormAPI 而非 jQuery 操作明细行属性,避免破坏表头 - 明细字段值读取必须加行号:
fieldId + "_" + rowIndex