更新时间:2026-03-16 GMT+08:00
分享

基于脚本模式配置多租户PDM版本策略

场景描述

作为一款通用型产品数据管理(PDM)系统供应商,其服务的客户覆盖精密医疗器械、高端电子消费品等众多行业。由于不同企业遵循的质量管理体系(如“ISO 9001”“ISO 13485”)各异,内部业务流程差异显著,因此单一的“硬编码”版本命名规则与演进逻辑无法满足所有客户的定制化需求。

为此,本系统引入规则引擎,支持不同租户根据自身的业务规范,为基础零件实体及其扩展模型(如工艺视图、仿真视图)灵活配置版本号的生成与演进路径,实现版本策略的个性化管理。

典型客户需求示例如下:

客户类型

核心诉求

版本演进示例

初创科技企业 A

追求极简与快速迭代,版本号仅需简单数字叠加。

Rev 1 → Rev 2 → Rev 3

大型跨国制造企业 B

需严格区分“设计中”“已发布”状态,采用严谨的“大版本.小版本”体系。

Rev A.01 → Rev A.02 → (发布) → Rev B.00

精密仪器企业 C

需实现核心零件(实体)与扩展模型(如工艺、检测标准)的版本分离控制。

  • 主实体:PN-100 (Rev B)
  • 关联工艺视图:PN-100 (Rev B-Draft.01) → PN-100 (Rev B-Released.01)。

场景分析

PDM系统的版本号生成涉及复杂的业务逻辑判断,传统固定编码方式难以适配多租户的差异化需求。通过规则引擎实现版本策略管理,可针对性解决不同客户的核心诉求,具体分析如下:

  • 初创科技企业 A
    • 触发条件:仅需监听“对象属性保存”这一单一业务事件。
    • 规则逻辑:配置简单的算术递增规则,即“当前版本号数值+1”
    • 输出要求:版本号格式固定为“Rev + 数字”,无额外前缀或后缀。
  • 大型跨国制造企业 B
    • 触发条件:需根据两类业务事件进行判断。
      • 设计阶段:当发生属性修改时,触发小版本递增。
      • 发布/工程变更阶段:当发生状态流转(发布/工程变更)时,触发大版本递增。
    • 规则逻辑
      • 设计阶段(对象状态为“设计中”):大版本(字母位)保持不变,小版本(数字位)按“当前值+1”递增。
      • 发布/工程变更阶段(对象状态流转为“已发布”):大版本(字母位)按字母序列递增(排除易混淆的I、O、Q),小版本(数字位)清零为“00”
    • 输出要求:版本号格式为“Rev + 字母.数字”,其中数字位需固定补零至两位(如01)。
  • 精密仪器企业 C
    • 作用范围:需精确区分规则作用域,确保规则仅作用于扩展属性模型,而不影响主实体版本。
    • 规则逻辑
      • 主实体版本号保持不变,提取主实体版本号作为扩展模型版本号的前缀。
      • 扩展模型按“模型类型”(如Draft、Released)拼接后缀,后缀数字位按“当前值+1”递增。
    • 输出要求:版本号格式为“主实体编号(主实体版本号)- 模型类型.数字”

配置步骤

  1. 登录应用运行态
  2. 在左侧导航栏中,选择规则引擎 > 规则列表,进入“规则列表”页面。
  3. “规则列表”页面,单击“创建”
  4. “创建规则”页面,配置如下主要参数信息。

    表1 “基本信息”参数说明(模式配置)

    参数

    配置示例

    规则名称

    PDM多租户版本规则

    规则类型

    自定义规则

    界面模式

    脚本模式

    冲突解决策略

    全匹配

  5. 单击“下一步”,进入“定义参数”页面。
  6. “定义参数”页面,根据场景需求,依次添加如下6个条件字段作为判断依据,添加1个结果字段用于输出判断结果。

    条件字段必须包含:versionCode(数字类型)、iteration(数字类型)。

    结果字段必须包含:version(文本类型)。

    表2 “定义参数”参数说明(脚本模式)

    参数名称

    配置示例

    条件字段

    条件字段1:
    • 数据类型:数字
    • 字段名:版本编码
    • 字段代码:versionCode
    • 数组:否
    条件字段2:
    • 数据类型:数字
    • 字段名:迭代次数
    • 字段代码:iteration
    • 数组:否
    条件字段3:
    • 数据类型:文本
    • 字段名:对象状态
    • 字段代码:objectStatus
    • 数组:否
    条件字段4:
    • 数据类型:文本
    • 字段名:业务事件类型
    • 字段代码:operateType
    • 数组:否
    条件字段5:
    • 数据类型:文本
    • 字段名:模型类型
    • 字段代码:modelType
    • 数组:否
    条件字段6:
    • 数据类型:文本
    • 字段名:主实体编号
    • 字段代码:mainEntityCode
    • 数组:否

    结果字段

    结果字段1:
    • 数据类型:文本
    • 字段名:最终版本号
    • 字段代码:version
    • 数组:否

  7. 单击“下一步”,进入“规则配置”页面。
  8. “规则配置”页面,使用脚本模式的编辑器编写版本号生成脚本,实现多条件联动计算。

    针对不同客户类型的脚本示例如下:

    • 规则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;
      结束

  9. 编写完脚本后,仔细检查逻辑是否正确,确认无误后,单击“提交”,完成规则配置。

规则触发机制

当前规则会在其绑定的数据模型执行特定生命周期操作时自动触发。例如,当模型数据执行“检入”“修订”操作时,系统将自动执行该规则中定义的逻辑。

相关文档