本文讨论了在金蝶K3 ERP系统中,对检验单主表体修改合格数、不合格数或检验结果时,若使用决策表体仅含一条分录且该分录决策状态为不合格,则自动勾选不良处理字段的实现方案。方案涉及二次开发表单插件,通过继承BaseControlEdit并注册实体服务规则来处理逻辑。示例代码展示了如何在插件中注册事件并根据业务类型、使用决策状态来决定是否勾选不良处理字段,同时避免了在不支持不良品处理流程的检验类型中触发此逻辑。
需求描述:在检验单主表体修改合格数、不合格数或者检验结果字段时,如果修改时使用决策表体只存在一行分录,则会默认按照修改结果刷新使用决策表体数据,此时想要实现当使用决策表体分录的决策状态为不合格的分录,自动将其不良处理字段勾选上。
实现方案:由于标准产品按主表体相关字段值刷新使用决策表体的逻辑的在表单插件中处理的,所以想要实现上述效果也需要二开表单插件才可以,具体思路如下:
二开表单插件继承BaseControlEdit(需要引用Kingdee.K3.MFG.QM.Business.PlugIn.dll 组件),在插件中注册实体服务规则,在实体服务规则中处理上述逻辑(注意:标准产品某些检验类型是不支持不良品处理流程的,所以代码中需要通过业务类型字段去区分是否走二开的逻辑,否则会导致不支持不良处理流程的检验单使用决策状态为不合格时无法反写数量回源单 )
示例代码如下:
using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm.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.Utils; using Kingdee.BOS.Orm.DataEntity; using Kingdee.K3.Core.MFG.EntityHelper; using Kingdee.BOS.Util; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Core.DependencyRules; namespace Kingdee.K3.MFG.QM.Business.PlugIn.Bill { public class InspectBillTest : BaseControlEdit { public override void OnInitialize(InitializeEventArgs e) { base.OnInitialize(e); this.View.RuleContainer.AddPluginRule("FEntity", RaiseEventType.ValueChanged, SetPolicyDefect, new string[] { "FQualifiedQty", "FUnqualifiedQty", "FInspectResult" }); } private void SetPolicyDefect(DynamicObject dataEntity, dynamic row) { string businessType = this.View.Model.GetValue<string>("FBusinessType"); //不支持不良品处理的流程不允许默认勾选不良处理,否则会导致相关数量无法反写回源单: //目前不支持不良品处理流程的主要包含:8:发货检验 9:生产先检验 20:其他检验 21:工序巡检 //当然这里也可以按照实际的需求只处理需要处理的单据类型即可 if (businessType == "8" || businessType == "9" || businessType == "20" || businessType == "21") return; DynamicObjectCollection policyEntrys = dataEntity.GetDynamicValue<DynamicObjectCollection>("PolicyDetail"); if (policyEntrys.IsEmpty()) return; Entity entity = this.View.BusinessInfo.GetEntity("FPolicyDetail"); foreach (DynamicObject policyEntry in policyEntrys) { string policyStatus = policyEntry.GetDynamicValue<string>("PolicyStatus"); if (policyStatus == "2")//使用决策状态为不合格时,不良处理勾选 { int policyIndex = this.View.Model.GetEntityDataObject(entity).IndexOf(policyEntry); this.View.Model.SetValue("FIsDefectProcess", true, policyIndex); } } this.View.UpdateView("FPolicyDetail"); } } }
补充说明:如果是在使用决策表体修改使用决策或者决策状态,想要实现当使用决策状态为不合格时,不良处理自动勾选可以按如下方式实现: 检验单使用决策表体增加实体服务规则,控制当使用决策状态为不合格时,勾选不良处理;
推荐阅读