本文描述了针对启用序列号管理的物料,在满足特定条件时(如上游单据录入序列号、启用样本检测值等),需要将使用决策表体的序列号带到样本检测值表体的需求,并提出了通过二次开发单据转换插件实现的解决方案。该插件通过重写AfterConvert事件,按照一系列条件检查和处理数据,实现序列号信息的传递。同时,文章还指出当检验数量大时可能影响性能,并提供了优化建议。最后,给出了示例代码展示了插件的具体实现方式。
需求描述:针对启用序列号管理的物料,同时满足以下几个条件时,需要携带使用决策表体的序列号到对应的样本检测值表体:
(1)上游单据录入序列号,且下推生成检验单携带默认质检方案;
(2)检验单单据类型勾选启用样本检测值;
(3)检验单单据类型勾选启用检验项目抽样方案;
(4)检验项目勾选启用样本检测值;
(5)检验项目对应的抽样方案类型为全检类型;
解决方案:上述需求需要二开单据转换插件实现,具体思路如下:
二开单据转换插件继承BaseBillConvertServicePlugIn,重写AfterConvert事件,二开插件挂在单据转换规则的插件策略中标准产品插件之后,然后按照下述逻辑处理即可:
1、在事件中循环检验单分录数据,获取分录的质检方案和序列号单位信息,针对检验单上不存在序列号单位以及不存在质检方案的分录跳过不处理,需要处理的分录获取其对应的检验项目表体数据;
2、循环检验项目表体数据,判断当前检验项目是否存在抽样方案,不存在则跳过不处理,存在的则判断抽样方案的类型是否全检类型,如果为全检,则获取检验项目对应主分录的使用决策表体序列号信息赋值给当前检验项目的样本检测值表体分录,如果不是全检则跳过循环进行下一行检验项目的判断;
说明:该功能当检验数量很大时会影响单据性能,可能会出现下推生成单据以及打开单据缓慢的现象,所以针对检验数量很大的情况下建议将检验项目抽样方案不要设置为全检类型或者将质检方案中的检验项目表体的启用样本检测值不勾选,这样就不会按照检验数量创建样本检测值分录行了,从而可以提高下推生成单据的性能。
示例代码如下:
using Kingdee.BOS.Core; using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args; using Kingdee.K3.Core.MFG.EnumConst; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Kingdee.K3.Core.MFG.EntityHelper; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using Kingdee.K3.MFG.App.ConvertPlugIn; namespace Kingdee.K3.MFG.QM.App.BillConvertServicePlugIn { public class InspectTest : BaseBillConvertServicePlugIn { public override void AfterConvert(AfterConvertEventArgs e) { ExtendedDataEntity[] entryDatas = e.Result.FindByEntityKey("FEntity"); base.AfterConvert(e); this.SetInspectValueEntrySerialId(entryDatas); } public void SetInspectValueEntrySerialId(ExtendedDataEntity[] entryDatas) { foreach (var entryData in entryDatas) { long qcShemeId = entryData.DataEntity.GetDynamicValue<long>("QCSchemeId_Id"); if (qcShemeId <= 0) continue;//抽样方案为空时不处理 long snUnitId = entryData.DataEntity.GetDynamicValue<long>("SNUnitID_Id"); if (snUnitId <= 0) continue;//不启用序列号管理时不处理 DynamicObjectCollection qcItems = entryData.DataEntity.GetDynamicValue<DynamicObjectCollection>("ItemDetail"); if (qcItems.IsEmpty()) continue;//检验项目表体为空时不处理 DynamicObjectCollection policyEntrys = entryData.DataEntity.GetDynamicValue<DynamicObjectCollection>("PolicyDetail"); if (policyEntrys.IsEmpty()) continue;//使用决策表体为空时不处理 Dictionary<int, IGrouping<int,DynamicObject>> dicPolicy = policyEntrys.GroupBy(o => o.GetDynamicValue<int>("Seq")).ToDictionary(d => d.Key); foreach (DynamicObject qcItem in qcItems) { long sampleShemeId = qcItem.GetDynamicValue<long>("SampleSchemeId_Id"); if (sampleShemeId <= 0) continue;//检验项目不启用抽样方案时不处理 string sampleSchemeType=qcItem.GetDynamicValue<DynamicObject>("SampleSchemeId").GetDynamicValue<string>("SampleType"); if (sampleSchemeType != "1") continue;//抽样方案类型不为全检不处理 DynamicObjectCollection inspectValueEntrys = qcItem.GetDynamicValue<DynamicObjectCollection>("ValueGrid"); if (inspectValueEntrys.IsEmpty()) continue; foreach (DynamicObject valueEntry in inspectValueEntrys) { int seq = valueEntry.GetDynamicValue<int>("Seq"); IGrouping<int, DynamicObject> policyEntry = null; if (!dicPolicy.TryGetValue(seq, out policyEntry)) continue; long serialId = policyEntry.FirstOrDefault().GetDynamicValue<long>("SerialId_Id"); valueEntry.SetDynamicObjectItemValue("VSerialId_Id", serialId); } } } } } }
推荐阅读