跳转至

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);
});
nitSbjbrsValue = WfForm.getFieldValue(sbjbrsField); handleSbjbrsChange(initSbjbrsValue); }); ``## 编码规范 泛微官方文档明确要求(用户记忆):不要使用var,全部使用const/let`替换。

字段属性值说明(泛微E9 API标准)

viewAttr值 含义
1 只读
2 可编辑
3 必填
4 隐藏

注意事项

  1. convertFieldNameToId 要求字段名和数据库中完全一致,区分大小写
  2. 代码默认明细表为detail_1,如果明细表序号不同需要修改
  3. 通过前端changeFieldAttr设置只读,而非后台设置,才能保证changeFieldValue赋值生效