基于脚本模式配置多租户PDM版本策略
场景描述
作为一款通用型产品数据管理(PDM)系统供应商,其服务的客户覆盖精密医疗器械、高端电子消费品等众多行业。由于不同企业遵循的质量管理体系(如“ISO 9001”、“ISO 13485”)各异,内部业务流程差异显著,因此单一的“硬编码”版本命名规则与演进逻辑无法满足所有客户的定制化需求。
为此,本系统引入规则引擎,支持不同租户根据自身的业务规范,为基础零件实体及其扩展模型(如工艺视图、仿真视图)灵活配置版本号的生成与演进路径,实现版本策略的个性化管理。
典型客户需求示例如下:
|
客户类型 |
核心诉求 |
版本演进示例 |
|---|---|---|
|
初创科技企业 A |
追求极简与快速迭代,版本号仅需简单数字叠加。 |
Rev 1 → Rev 2 → Rev 3 |
|
大型跨国制造企业 B |
需严格区分“设计中”与“已发布”状态,采用严谨的“大版本.小版本”体系。 |
Rev A.01 → Rev A.02 → (发布) → Rev B.00 |
|
精密仪器企业 C |
需实现核心零件(实体)与扩展模型(如工艺、检测标准)的版本分离控制。 |
|
场景分析
PDM系统的版本号生成涉及复杂的业务逻辑判断,传统固定编码方式难以适配多租户的差异化需求。通过规则引擎实现版本策略管理,可针对性解决不同客户的核心诉求,具体分析如下:
- 初创科技企业 A
- 触发条件:仅需监听“对象属性保存”这一单一业务事件。
- 规则逻辑:配置简单的算术递增规则,即“当前版本号数值+1”。
- 输出要求:版本号格式固定为“Rev + 数字”,无额外前缀或后缀。
- 大型跨国制造企业 B
- 触发条件:需根据两类业务事件进行判断。
- 设计阶段:当发生属性修改时,触发小版本递增。
- 发布/工程变更阶段:当发生状态流转(发布/工程变更)时,触发大版本递增。
- 规则逻辑:
- 设计阶段(对象状态为“设计中”):大版本(字母位)保持不变,小版本(数字位)按“当前值+1”递增。
- 发布/工程变更阶段(对象状态流转为“已发布”):大版本(字母位)按字母序列递增(排除易混淆的I、O、Q),小版本(数字位)清零为“00”。
- 输出要求:版本号格式为“Rev + 字母.数字”,其中数字位需固定补零至两位(如01)。
- 触发条件:需根据两类业务事件进行判断。
- 精密仪器企业 C
- 作用范围:需精确区分规则作用域,确保规则仅作用于扩展属性模型,而不影响主实体版本。
- 规则逻辑:
- 主实体版本号保持不变,提取主实体版本号作为扩展模型版本号的前缀。
- 扩展模型按“模型类型”(如Draft、Released)拼接后缀,后缀数字位按“当前值+1”递增。
- 输出要求:版本号格式为“主实体编号(主实体版本号)- 模型类型.数字”。
配置步骤
- 登录应用运行态。
- 在左侧导航栏中,选择,进入“规则列表”页面。
- 在“规则列表”页面,单击“创建”。
- 在“创建规则”页面,配置如下主要参数信息。
表1 “基本信息”参数说明(模式配置) 参数
配置示例
规则名称
PDM多租户版本规则
规则类型
自定义规则
界面模式
脚本模式
冲突解决策略
全匹配
- 单击“下一步”,进入“定义参数”页面。
- 在“定义参数”页面,根据场景需求,依次添加如下6个条件字段作为判断依据,添加1个结果字段用于输出判断结果。
条件字段必须包含:versionCode(数字类型)、iteration(数字类型)。
结果字段必须包含:version(文本类型)。
表2 “定义参数”参数说明(脚本模式) 参数名称
配置示例
条件字段
条件字段1:- 数据类型:数字
- 字段名:版本编码
- 字段代码:versionCode
- 数组:否
条件字段2:- 数据类型:数字
- 字段名:迭代次数
- 字段代码:iteration
- 数组:否
条件字段3:- 数据类型:文本
- 字段名:对象状态
- 字段代码:objectStatus
- 数组:否
条件字段4:- 数据类型:文本
- 字段名:业务事件类型
- 字段代码:operateType
- 数组:否
条件字段5:- 数据类型:文本
- 字段名:模型类型
- 字段代码:modelType
- 数组:否
条件字段6:- 数据类型:文本
- 字段名:主实体编号
- 字段代码:mainEntityCode
- 数组:否
结果字段
结果字段1:- 数据类型:文本
- 字段名:最终版本号
- 字段代码:version
- 数组:否
- 单击“下一步”,进入“规则配置”页面。
- 在“规则配置”页面,使用脚本模式的编辑器编写版本号生成脚本,实现多条件联动计算。
针对不同客户类型的脚本示例如下:
- 规则1:适配初创科技企业A(极简数字叠加)
规则 "初创企业A-数字递增版本" 如果 decision_factor.modelType == "主实体" 并且 decision_factor.businessEventType == "属性保存" 那么 outcome.version = "Rev " + decision_factor.iteration; 结束
- 规则2:适配大型跨国制造企业B(“大版本.小版本”体系)
规则 "制造企业B-大版本小版本控制" 如果 // 设计阶段:属性修改触发小版本递增 decision_factor.objectStatus == "设计中" 并且 decision_factor.businessEventType == "属性修改" 那么 // 版本编码转换为字母(排除I、O、Q) variable.tempCode = decision_factor.versionCode; variable.majorVersion = ""; while (variable.tempCode > 0) { variable.charCode = 64 + (variable.tempCode % 26); // 跳过I(73)、O(79)、Q(81) if (variable.charCode == 73 或者 variable.charCode == 79 或者 variable.charCode == 81) { variable.charCode += 1; if (variable.charCode > 90) variable.charCode = 65; // 超出Z则循环至A } variable.majorVersion = Character.toString(variable.charCode) + variable.majorVersion; variable.tempCode = Math.floor(variable.tempCode / 26); } // 小版本补两位零 variable.minorVersion = String.format("%02d", decision_factor.iteration); outcome.version = "Rev " + variable.majorVersion + "." + variable.minorVersion; 结束 规则 "制造企业B-发布后大版本递增" 如果 // 发布/工程变更阶段:状态流转触发大版本递增、小版本清零 decision_factor.objectStatus == "已发布" 并且 decision_factor.businessEventType == "状态流转" 那么 // 版本编码+1后转换为字母(排除I、O、Q) variable.tempCode = decision_factor.versionCode + 1; variable.majorVersion = ""; while (variable.tempCode > 0) { variable.charCode = 64 + (variable.tempCode % 26); if (variable.charCode == 73 或者 variable.charCode == 79 或者 variable.charCode == 81) { variable.charCode += 1; if (variable.charCode > 90) variable.charCode = 65; } variable.majorVersion = Character.toString(variable.charCode) + variable.majorVersion; variable.tempCode = Math.floor(variable.tempCode / 26); } outcome.version = "Rev " + variable.majorVersion + ".00"; 结束 - 规则3:适配精密仪器企业C(实体与扩展模型分离控制)
规则 "精密仪器企业C-扩展模型版本控制" 如果 decision_factor.modelType != "主实体" // 规则仅作用于扩展模型 那么 // 版本编码转换为字母(排除I、O、Q) variable.tempCode = decision_factor.versionCode; variable.mainVersion = ""; while (variable.tempCode > 0) { variable.charCode = 64 + (variable.tempCode % 26); if (variable.charCode == 73 或者 variable.charCode == 79 或者 variable.charCode == 81) { variable.charCode += 1; if (variable.charCode > 90) variable.charCode = 65; } variable.mainVersion = Character.toString(variable.charCode) + variable.mainVersion; variable.tempCode = Math.floor(variable.tempCode / 26); } // 拼接主实体编号、主版本、模型类型、后缀数字 variable.suffixNum = String.format("%02d", decision_factor.iteration); outcome.version = decision_factor.mainEntityCode + " (Rev " + variable.mainVersion + ")-" + decision_factor.modelType + "." + variable.suffixNum; 结束
- 规则1:适配初创科技企业A(极简数字叠加)
- 编写完脚本后,仔细检查逻辑是否正确,确认无误后,单击“提交”,完成规则配置。
规则触发机制
当前规则会在其绑定的数据模型执行特定生命周期操作时自动触发。例如,当模型数据执行“检入” 或“修订”操作时,系统将自动执行该规则中定义的逻辑。