
# 基于脚本模式配置多租户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个结果字段用于输出判断结果。 
   ![](https://support.huaweicloud.com/usermanual-idme/public_sys-resources/caution_3.0-zh-cn.png)
   条件字段必须包含：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. 编写完脚本后，仔细检查逻辑是否正确，确认无误后，单击"提交"，完成规则配置。
 
#### 规则触发机制
当前规则会在其绑定的数据模型执行特定生命周期操作时自动触发。例如，当模型数据执行"检入" 或"修订"操作时，系统将自动执行该规则中定义的逻辑。
