李雅慧 发表于 2025-5-28 17:37:20

表格內開窗後使用hooks校驗並且setErrors,取消勾選後就serErrors失效了

本帖最后由 李雅慧 于 2025-5-28 17:50 编辑

業務中台公共基礎 - 维护计量单位信息作業

開窗選擇後會校驗報錯

此時按鈕不可點擊

取消勾選再勾選後又可以點擊保存了




setErrors是綁在單元格control上的

請協助確認是不是BUG?謝謝

翁俊 发表于 2025-5-28 17:50:30

收到问题,排查中

翁俊 发表于 2025-5-28 17:56:43

麻烦私信补充下hooks设置规则的代码以及运行态的账密,需要去排查下

李雅慧 发表于 2025-5-28 18:03:33

翁俊 发表于 2025-5-28 17:56
麻烦私信补充下hooks设置规则的代码以及运行态的账密,需要去排查下

測試區用戶帳密E10603Test001
const control = component.getControl();
//当体积单位为非基本单位时,则必须建立与基本单位的换算关系
//先调用bm.meas_unit.get-查询计量单位,
//入参:单位编号=[当前行.体积单位编号],回参:单位编号、基本单位;
const requestParam = {
    "meas_unit": [
      {
            "unit_no": value
      }
    ]
};
//若回参.基本单位=false,再调用bm.unit_cnv.get,
//入参:换算单位编号=[当前行.体积单位编号],状态=Y.生效,
//若回参不存在,则报错:体积单位与基本单位间未维护换算关系!
const requestParam2 = {
    "unit_cnv": [
      {
            "cnv_unit_no": value
      }
    ],
    "search_info": [
      {
            "search_field": "manage_status",
            "search_operator": "equal",
            "search_field_path": "unit_cnv",
            "search_value": ["Y"]
      }
    ]
};
if (value) {
    options.utils.espApi
      .getEspByActionId({
            actionId: 'bm.meas_unit.get',
            parameter: requestParam,
            // businessUnit: { eoc_company_id: value },
            executeContext: options.context,
      })
      .subscribe(
            (res) => {
                const base_unit = res.data.meas_unit[0].base_unit;
                if (!base_unit) {
                  options.utils.espApi
                        .getEspByActionId({
                            actionId: 'bm.unit_cnv.get',
                            parameter: requestParam2,
                            // businessUnit: { eoc_company_id: value },
                            executeContext: options.context,
                        })
                        .subscribe(
                            (res) => {
                              const unit_cnv = res.data.unit_cnv ?? [];
                              if (!unit_cnv || unit_cnv.length === 0) {
                                    options.utils.translate.setTranslation('zh_CN', { errMsg: '体积单位与基本单位间未维护换算关系!' });
                                    options.utils.translate.setTranslation('zh_TW', { errMsg: '體積單位與基本單位間未維護換算關係!' });
                                    options.utils.translate.setTranslation('en_US', { errMsg: 'The conversion relationship between volume units and basic units is not maintained!' });
                                    const errMsg = options.utils.translate.instant('errMsg');
                                    options.utils.athModalService.error({
                                        nzContent: errMsg
                                    });
                                    control.setErrors({ volUnitErr: true });
                                    return false;
                              } else {
                                    const errors = control.errors || {};
                                    delete errors['volUnitErr'];
                                    if (Object.keys(errors).length === 0) {
                                        control.setErrors(null); // 沒有其他錯誤才清空
                                    } else {
                                        control.setErrors(errors); // 保留其他錯誤
                                    }
                                    return true;
                              }
                            },
                            () => {
                              console.log('error');
                            });
                } else {
                  const errors = control.errors || {};
                  delete errors['volUnitErr'];
                  if (Object.keys(errors).length === 0) {
                        control.setErrors(null); // 沒有其他錯誤才清空
                  } else {
                        control.setErrors(errors); // 保留其他錯誤
                  }
                  return true;
                }
            },
            () => {
                console.log('error');
            });
} else {
    const errors = control.errors || {};
    delete errors['volUnitErr'];
    if (Object.keys(errors).length === 0) {
      control.setErrors(null); // 沒有其他錯誤才清空
    } else {
      control.setErrors(errors); // 保留其他錯誤
    }
    return true;
}


翁俊 发表于 2025-5-28 20:10:30

问题原因:
经过排查页面开窗栏位设置了数据变化监听的hooks事件,当数据发生变化时,调用接口判断是否满足条件,不满足会设置异常阻止页面提交,但是表格行选中时,没有添加行点击事件再去调用这个字段的规则,目前行选择时,会判断数据之前是否存在规则,如果存在规划会清空规则,所以勾选取消再次勾选时没有读取到规则,所以可以提交

解决方式:
选中表格,在表格中添加行点击的hooks事件,在事件脚本中添加需要校验的字段规则
页: [1]
查看完整版本: 表格內開窗後使用hooks校驗並且setErrors,取消勾選後就serErrors失效了