
# 简单生产入库单下推简单生产领料单时添加二开字段携带
## 问题简述
想要在简单生产入库单下推简单生产领料单时二开配置额外的字段携带,如表头日期,拣货仓库的指定等。直接扩展简单生产入库至简单生产领料的单据转换规则[^1]【SpInstock2SpPick】添加额外的字段映射设置没有实际的映射效果。
## 问题分析
1.简单生产入库下推简单生产领料场景是根据入库的成品下推产品所属BOM下的子项,属于非标准的下推操作,实际的数据源是入库成品通过BOM展开的方式生成的展开记录,对应的单据转换规则为【SP_BOMEXPAND2PICKMTRL】,这是一种【第三方下推】[^2]的实现。

2.简单生产入库至简单生产领料的单据转换规则【SpInstock2SpPick】仅用作在使用【SP_BOMEXPAND2PICKMTRL】执行下推后补完简单生产领料单的Link记录,以在下游单上查时正确联查到下推的源简单生产入库单。补完的上游单关系来源于目标简单生产领料单单据分录的数据包内的【源单内码FSrcInterId】(简单生产入库表头ID)以及【源单分录内码FEntrySrcInterId】(简单生产入库表体ID),补完逻辑在插件响应OnAfterCreateLink事件时执行。
## 实现方案
1.扩展【SP_BOMEXPAND2PICKMTRL】,添加二开单据转换插件[^3],重写OnAfterCreateLink事件,通过【源单内码】获取上游的简单生产入库源单数据。
2.获取目标单数据包,使用【源单内码】和【源单分录内码】定位上游数据包的实体,进行字段属性的赋值。
3。完成编码后调整插件顺序至标准产品转换规则插件之后。
## 参考代码(Python版本)[^4]
```python
import clr
clr.AddReference('Kingdee.BOS.ServiceHelper')
clr.AddReference('Kingdee.BOS.DataEntity')
clr.AddReference('System.Core')
from Kingdee.BOS.ServiceHelper import BusinessDataServiceHelper
from Kingdee.BOS.ServiceHelper import MetaDataServiceHelper
from System.Collections.Generic import Dictionary
from System.Collections.Generic import List
from System.Linq import Enumerable
from System import Object
from System import Int64
from Kingdee.BOS.Orm.DataEntity import DynamicObject
#以下案例实现将简单生产入库单仓库字段携带至简单生产领料单分录仓库。
def OnAfterCreateLink(e):
#收集源单内码SrcInterId,批量获取上游的数据包
spIds=List[Object]()
entityDatas = e.TargetExtendedDataEntities.FindByEntityKey('FEntity')
for entityData in entityDatas:
sBillId = entityData.DataEntity['SrcInterId']
if sBillId>0:
spIds.Add(sBillId)
if spIds.Count==0:
return
spMeta=MetaDataServiceHelper.Load(e.Context,'SP_InStock')
spBillDatas=BusinessDataServiceHelper.Load(e.Context,spIds.ToArray(),spMeta.BusinessInfo.GetDynamicObjectType())
if spBillDatas==None or spBillDatas.Length==0:
return
SPBills=Dictionary[Int64,DynamicObject]()
for spb in spBillDatas:
SPBills.Add(spb['Id'],spb)
for entityData in entityDatas:
sbid = entityData.DataEntity['SrcInterId']
if SPBills.ContainsKey(sbid):
sBill=SPBills[sbid]
entityData.DataEntity['StockId_Id']=sBill['领料单仓库_Id']
entityData.DataEntity['StockId']=sBill['领料单仓库']
```
## 参考知识
[^1]:[单据转换介绍](https://vip.kingdee.com/article/294473073921969408?channel_level=%E9%87%91%E8%9D%B6%E4%BA%91%E7%A4%BE%E5%8C%BA|%E6%90%9C%E7%B4%A2|%E7%BB%BC%E5%90%88)
[^2]:[第三方下推简介](https://vip.kingdee.com/article/970?channel_level=%E9%87%91%E8%9D%B6%E4%BA%91%E7%A4%BE%E5%8C%BA%7C%E6%90%9C%E7%B4%A2%7C%E7%BB%BC%E5%90%88&productLineId=1)
[^3]:[单据转换插件](https://vip.kingdee.com/article/125308342532092160?channel_level=%E9%87%91%E8%9D%B6%E4%BA%91%E7%A4%BE%E5%8C%BA%7C%E6%90%9C%E7%B4%A2%7C%E7%BB%BC%E5%90%88)
[^4]:[Python单据转换插件](https://vip.kingdee.com/article/348172820494210048?channel_level=%E9%87%91%E8%9D%B6%E4%BA%91%E7%A4%BE%E5%8C%BA%7C%E6%90%9C%E7%B4%A2%7C%E7%BB%BC%E5%90%88)