
# 齐套分析子项明细自定义字段赋值处理指南
## 需要提前了解的知识点
1.操作插件的开发(本文使用python操作插件作为案例,有编译条件的可以使用.net作为开发语言,一样的效果)注:本方案不适用于多租户部署
2.生产齐套分析单与齐套分析子项明细的元数据模型关系
3.如何添加物料属性引用
## 本文案例
### 我希望在生产齐套分析单的齐套分析子项明细携带二次开发的扩展字段。
#### 需要做的事情
1.齐套分析子项明细加入需要携带的目标字段

2.扩展齐套分析单,于操作列表>保存操作>插件列表>注册Python插件加入二次开发插件,实现功能。有编译部署条件的朋友可以用.net实现,注册插件也是一样的。

#### 插件代码
##### python版本
```python
#将本插件注册至生产齐套分析单保存操作,齐套分析单的分析功能在生成分析结果后,执行结束前会自动调用一次齐套分析单的保存
#通过保存注入该插件可以为二开的自定义字段作计算,赋值保存处理
import clr
clr.AddReference('System.Core')
clr.AddReference('Kingdee.BOS.ServiceHelper')
clr.AddReference('Kingdee.BOS.DataEntity')
from System.Linq import Enumerable
from Kingdee.BOS.Util import ListUtils
from Kingdee.BOS.Orm.DataEntity import DynamicObject
from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter
from Kingdee.BOS.ServiceHelper import MetaDataServiceHelper
from Kingdee.BOS.ServiceHelper import BusinessDataServiceHelper
def GetEntryKey(entry):
return entry['MoEntryId']
def AfterExecuteOperationTransaction(e):
dicMatchMoEntrys = Enumerable.ToDictionary(Enumerable.ToList(e.DataEntitys[0]['Entity']),GetEntryKey) #齐套分析单生产订单明细数据集合
fid = e.DataEntitys[0]['Id']
matchItemMeta = MetaDataServiceHelper.Load(this.Context,'PRD_MATCHDETAIL')
qp = QueryBuilderParemeter()
qp.FormId='PRD_MATCHDETAIL'
qp.FilterClauseWihtKey = 'FID=%d' % (fid)
qp.SelectItems = SelectorItemInfo.CreateItems('FENTRYID')
matchItems = BusinessDataServiceHelper.Load(this.Context,matchItemMeta.BusinessInfo.GetDynamicObjectType(),qp) #抓取齐套分析单子项明细数据集合
if ListUtils.IsEmpty(matchItems):#空集则什么都不处理
return
for matchItem in matchItems:
if dicMatchMoEntrys.ContainsKey(matchItem['MoEntryId']):
matchMoEntry = dicMatchMoEntrys[matchItem['MoEntryId']] #使用子项明细的MoEntryId匹配生产订单明细数据集合对应的订单分录
#实现子项明细的二次开发处理。获取字段的值使用对应字段的动态实体名
matchItemSubMtrl = matchItem['MaterialIdSub']#子项物料数据包,需要取物料字段先在齐套分析子项明细的物料编码字段加入引用属性
#获取物料字段要参考它所属的实体,如果字段的实体在子单据头上,需要先获取对应实体再取字段值
#以下提供几个获取物料字段的样例
mtrlBase = matchItemSubMtrl['MaterialBase'][0] #物料基本实体
erpclsId = mtrlBase['ErpClsId'] #物料属性
mtrlStock = matchItemSubMtrl['MaterialStock'][0]#物料库存实体
safeStock = mtrlStock['SafeStock']#物料库存页签的安全库存
specification = matchItemSubMtrl['Specification']#物料规格型号
#matchItem['MobillNo']= '%s|%d' % (matchMoEntry['MoBillNo'],matchMoEntry['MoEntrySeq'])#这是个样例,演示如何将生产订单明细的订单号+订单行号拼接填入子项明细的生产订单字段,二开逻辑可以在这里加入代码处理
BusinessDataServiceHelper.Save(this.Context,matchItems)#保存修改后的子项明细数据集合
```
##### C#版本
```csharp
using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.MFG.EntityHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SampleExtPlugIn
{
public class MatchBillSaveExtend : AbstractOperationServicePlugIn
{
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
DynamicObject matchBillObject = e.DataEntitys[0];
var dicMatchMoEntrys = (matchBillObject["Entity"] as DynamicObjectCollection).GroupBy(x => x["MoEntryId"].ConvertTo<long>()).ToDictionary(x => x.Key, v => v.First());//齐套分析单生产订单明细数据集合
long fid = matchBillObject["Id"].ConvertTo<long>(0);
FormMetadata matchItemMeta = MetaDataServiceHelper.Lo