在泛微E9系统中,如何根据表单不同条件动态设置字段必填属性是用户常遇到的技术难题。例如,当“费用类型”选择“差旅费”时,“出差事由”和“出行时间”需强制填写,而其他情况下则无需必填。由于E9表单引擎默认仅支持静态必填设置,无法直接满足此类场景。开发者通常尝试通过JavaScript脚本或流程事件控制,但易出现脚本不生效、移动端兼容性差、保存时校验跳过等问题。此外,如何在不修改底层代码的前提下,结合规则引擎或ECO框架实现可视化配置的动态必填逻辑,也成为实施过程中的关键挑战。
1条回答 默认 最新
桃子胖 2025-11-17 13:15关注一、问题背景与挑战分析
在泛微E9系统中,表单字段的必填属性默认通过静态方式配置,即在表单设计阶段设定某字段为“必填”。然而,在实际业务场景中,用户常需根据表单数据的动态变化(如选择不同的“费用类型”)来控制其他字段的必填状态。例如:当“费用类型”为“差旅费”时,“出差事由”和“出行时间”必须填写;若为“办公用品”,则无需强制。
此类需求无法通过标准表单配置实现,开发者通常尝试使用JavaScript脚本在前端进行控制,但面临以下典型问题:
- 脚本在移动端(如WeLink、泛微移动App)中不生效或兼容性差
- 用户绕过前端校验直接保存表单,导致后端无验证机制
- 流程提交时校验跳过,数据完整性无法保障
- 代码维护成本高,难以实现可视化配置与复用
二、常见技术方案对比分析
方案 实现方式 优点 缺点 前端JS脚本 通过onchange事件绑定脚本控制字段样式与校验 开发快速,即时反馈 移动端兼容差,易被绕过 流程事件校验 在流程提交前使用Java事件进行字段校验 服务端校验,安全性高 用户体验差,错误提示滞后 ECO规则引擎 基于ECO插件编写规则逻辑,动态设置字段属性 可复用,支持可视化配置 学习成本高,需部署插件 自定义FormType扩展 继承标准FormType,重写validate方法 深度集成,灵活性强 侵入性强,升级风险大 三、推荐解决方案:基于ECO框架的动态必填实现
为兼顾灵活性与可维护性,建议采用ECO(Extension Component Object)框架结合规则引擎的方式实现动态必填逻辑。该方案可在不修改底层代码的前提下,通过插件化方式扩展表单行为。
实现步骤如下:
- 创建ECO插件项目,继承
com.weaver.form.eco.base.ECOBase - 注册表单事件监听器(如
BeforeSaveListener) - 在监听器中解析表单数据,判断“费用类型”值
- 若为“差旅费”,则检查“出差事由”和“出行时间”是否为空
- 若为空,抛出
ValidateException中断保存 - 支持从数据库或XML配置规则,实现可视化管理
- 通过泛微插件管理平台部署并启用
四、核心代码示例
public class DynamicRequiredValidator implements BeforeSaveListener { public void beforeSave(RequestInfo request) throws ValidateException { Record record = request.getRecord(); String expenseType = record.getString("field001"); // 费用类型 if ("差旅费".equals(expenseType)) { String reason = record.getString("field002"); // 出差事由 String time = record.getString("field003"); // 出行时间 if (StringUtils.isEmpty(reason)) { throw new ValidateException("【出差事由】为必填项"); } if (StringUtils.isEmpty(time)) { throw new ValidateException("【出行时间】为必填项"); } } } }五、可视化配置增强:引入规则引擎模型
为进一步提升可维护性,可构建基于数据库的规则配置表,实现动态必填规则的可视化管理。示例如下:
规则ID 表单编号 触发字段 触发值 目标字段 操作类型 错误提示 启用状态 RULE001 FBXZ001 field001 差旅费 field002,field003 required 差旅相关字段必须填写 是 RULE002 FBXZ002 projectType 重大项目 approvalNote required 重大项目需填写审批说明 是 六、流程整合与校验时机设计
为确保校验逻辑在多终端一致执行,应将动态必填校验嵌入到关键流程节点中。推荐使用以下校验时机:
- 表单保存前(BeforeSave):拦截非法数据,防止脏数据入库
- 流程提交前(BeforeFlowSubmit):作为最后一道防线
- 移动端加载时:通过JSON接口返回必填规则,驱动UI渲染
可通过Mermaid绘制校验流程图,明确执行路径:
graph TD A[用户填写表单] --> B{是否触发动态规则?} B -- 是 --> C[检查目标字段是否为空] B -- 否 --> D[正常保存] C --> E{字段为空?} E -- 是 --> F[抛出校验异常] E -- 否 --> G[允许保存] F --> H[前端显示错误提示] G --> I[数据入库]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报