
# 模型配置生成物料/BOM如何携带模型配置的变量参数
## 业务场景
使用模型配置生成的BOM需要使用单独的固定字段填充配置时录入的参数,用于后续业务使用(套打,携带下游单据,报表等业务)
## 问题现状
1. 变量配置界面控件由定义的建模变量动态构造
2. 配置生成BOM未包含固化配置的处理,目前配置的参数只存在模型配置清单列表中,并使用文本拼接的方式存储
## 解决方案
1. BOM保存时传入配置录入参数
2. 二次开发在BOM保存操作上加入二次开发插件,根据具体需求映射BOM表头的字段赋值。
3. 需要升级金蝶云星空7.7版本,并安装补丁PT-146899/企业版,PT-146898标准版
## 需要预先了解的知识
1. csharp开发语法
2. 星空操作插件的编写
3. Python插件的编写(线下订阅的客户可选,多租户必选)
## 模型配置录入参数的构成(所属组件 Kingdee.K3.MFG.ENG.Common.Core.dll)
### 建模变量抽象类AbstractVariable
建模变量在配置时实例化的对象
#### 关键属性说明
- VariableKey为建模变量的编码
- VarId为建模变量的内码,或计算变量的分录内码
- DefaultValue为变量的默认值,数据取自于产品模型对应的定义
- IsCalVariable 是否计算变量
- 针对变量的类型标准产品还有特定的派生类,有需要了解的可以使用对象查看器查看所属组件命名空间Kingdee.K3.Core.MFG.ENG.ProductModel下的定义,这里不做赘述
### 建模变量值抽象类AbstractValue
建模变量运算值在配置计算时实例化的对象
#### 关键属性说明
- TrueValue 变量的直接录入值,string类型,如果变量的类型为基础资料或辅助资料,则为其选择资料的编码值
- 针对变量的类型派生两个子类:SimpleValue,ComplexValue
### 复杂类型变量值类ComplexValue
基础资料和辅助资料的值对象使用ComplexValue
#### 关键属性说明
- ReferenceObject 基础资料/辅助资料引用的数据包,DynamicObject对象。对变量值有取内码的需求,或者一些基础资料上的其他字段可以从这个动态对象去获取
- OrgId 基础资料所属的组织内码
### 模型配置结果数据包MdlCfgGenResult
模型配置时根据产品模型为单位生成的配置结果对象,包含当前模型下生成的BOM数据包,物料数据包(如果有)
#### 关键属性说明
- Variables 建模变量&计算变量字典,类型为Dictionary<string,AbstractVariable>,使用建模变量编码作为获取Key
- Values 变量值列表,类型为Dictionary<string,AbstractValue>,用于获取建模变量&计算变量在配置计算完毕后的值
- PrdMdlObj 产品模型数据包对象,DynamicObject类型,有需要从产品模型取值关联到生成的BOM和物料可以关注这个对象。
#### 获取参数方式
- 物料保存插件:使用CurrentMdlCfgResult关键字从this.Option获取
```csharp
public override void BeginOperationTransaction(BeginOperationTransactionArgs e)
{
var option = this.Option;
MdlCfgGenResult currCfgResult;
if (option.TryGetVariableValue<MdlCfgGenResult>("CurrentMdlCfgResult", out currCfgResult))
{
foreach (DynamicObject mtrl in e.DataEntitys)
{
}
}
}
```
- BOM保存插件:使用参数关键字MdlCfgResults从this.Option获取。因为bom保存是多个模型生成的BOM一起保存,这里获取的结果包为所有模型生成的,是批量数据
```csharp
public override void BeginOperationTransaction(BeginOperationTransactionArgs e)
{
var option = this.Option;
List<MdlCfgGenResult> currCfgResults;
if (option.TryGetVariableValue<List<MdlCfgGenResult>>("MdlCfgResults", out currCfgResults))
{
foreach (DynamicObject mtrl in e.DataEntitys)
{
}
}
}
```
## 实现样例
模型配置生成BOM版本,携带变量CPU型号以及版本号至在生成的BOM表头上。
### 元数据改动

### 产品模型示例

### 执行配置后效果

### 保存插件示例
```csharp
public override void BeginOperationTransaction(BeginOperationTransactionArgs e)
{
if (!this.Option.ContainsVariable("MdlCfgResults")) return;
List<MdlCfgGenResult> results = this.Option.GetVariableValue<List<MdlCfgGenResult>>("MdlCfgResults");
Dictionary<string, AbstractVariable> variables = results.FirstOrDefault().Variables;//变量列表
Dictionary<string, AbstractValue> varValue = results.FirstOrDefault().Values;//变量值列表
foreach (var data in e.DataEntitys)
{
if (variables.ContainsKey("Ver") && varValue.ContainsKey("Ver"))
{
AbstractValue vl = varValue["Ver"];
data["Ver"] = vl.TrueValue;
}
if (variables.ContainsKey("CPU") && varValue.ContainsKey("CPU"))
{
AbstractValue vl = varValue["CPU"];
//在变量为基础资料或辅助资料类型的时候vl.TrueValue为其选择项的编码
data["CPU_Id"] = (vl as ComplexValue).ReferenceObject["Id"];
}
}
}
```
多租户部署的客户可以参考一下Python插件的样例
```python
import clr
clr.AddReference('Kingdee.K3.MFG.ENG.Common.Core')
from Kingdee.K3.Core.MFG.ENG.ProductModel import AbstractVariable
from Kingdee.K3.Core.MFG.ENG.ProductModel import AbstractValue
from Kingdee.K3.Core.MFG.ENG.ProductModel import MdlCfgGenResult
from System.Collections.Generic import List
def BeginOperationTransaction(e):
if this.Option.ContainsVariable("MdlCfgResults")==False:
return
results = this.Option.GetVariableValue[List[MdlCfgGenResult]]("MdlCfgResults")[0]
variables = results.Variables
varValue = results.Values
for data in e.DataEntitys:
if variables.ContainsKey("Ver") and varValue.ContainsKey("Ver"):
vl = varValue["Ver"]
data["Ver"] = vl.TrueValue
if variables.ContainsKey("CPU") and varValue.ContainsKey("CPU"):
vl = varValue["CPU"]
data["CPU_Id"] = vl.ReferenceObject["Id"]
```