二开案例-【C#】如何在生产订单下达操作上增加自定义的校验器?
由于生产订单状态机(指生产订单订单上计划确认、下达、开工、完工、结案等状态转换)只是个空操作,它的作用只是承担状态发起的作用,添加的标准校验器不能干预到状态的逻辑,目前这些状态的转换校验是由内部状态机的校验来实现,通过标准的操作校验和前台表单插件无法生效,所以提供下面的方法供客户自定义添加校验器,以结案为例。
1、打开【BOSIDE-生产制造-基础管理-普通基础资料】下的单据业务状态机发布到菜单(注意:发布类型为列表)如图:
2、开始编辑自定义的校验器,以【下达】为例,检验生产订单分录自定义基础资料客户下达时必录;
3、代码编写步骤
新加的类(Ext_Release.cs)继承结案的实现类(Release.cs),需要引用下Kingdee.K3.MFG.PRD.App.Core组件;
重写GetValidator方法;
首先要执行下基类的base.GetValidator,然后添加自己的校验器(Ext_ReleaseValidator.cs);
注意:Confirm【计划确认】,Release【下达】,Start【开工】,Finish【完工】,Close【结案】,CloseAccount【结算】。
代码如下:
using Kingdee.BOS.Util; using Kingdee.K3.Core.MFG.EnumConst; using Kingdee.K3.MFG.App.BizEngine.Validator; using Kingdee.K3.MFG.PRD.App.Core.MOBizState; using Kingdee.K3.MFG.PRD.App.Core.Validate; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using Kingdee.K3.Core.MFG.EntityHelper; using Kingdee.BOS.Orm.DataEntity; namespace ITIBB.App.ServicePlugIn { [Description("生产订单下达校验器")] public class Ext_Release : Release { /// <summary> /// 获取标准产品下达校验器,并注册二开校验器【注意需要执行base,以保证标准逻辑的执行】 /// </summary> /// <returns></returns> public override AbstractBusinessStateValidator[] GetValidator() { //获取标准产品存在的校验器 AbstractBusinessStateValidator[] validatorArr = base.GetValidator(); //判断标准产品本身是否存在校验器,存在则直接转换类型,不存在则实例化 List<AbstractBusinessStateValidator> validatorLst = validatorArr.IsEmpty() ? new List<AbstractBusinessStateValidator>() : validatorArr.ToList(); //添加二开的校验器 validatorLst.Add(new Ext_ReleaseValidator()); //返回校验器 return validatorLst.ToArray(); } } [Description("下达校验器逻辑")] public class Ext_ReleaseValidator : AbstractMoBusinessStateValidator { protected override void ValidateData() { //二开校验器逻辑主要写在该位置 base.ValidateData(); //例如:检验自定义客户字段是否填值 this.ExtCheckCustomerMustInput(); } /// <summary> /// 检查自定义字段下达时必录 /// 生产订单分录数据包:this.BizStateContext.InputBizData /// </summary> private void ExtCheckCustomerMustInput() { //具体逻辑实现 foreach (var data in this.BizStateContext.InputBizData) { if (data.GetDynamicValue<long>("FBase_Id") != 0) continue; this.AddValidationError(data, string.Format("生产订单{0}第{1}行分录不能{2},原因是:自定义客户字段为必录项!", (data.Parent as DynamicObject).GetDynamicValue<string>("BillNo"), data.GetDynamicValue<int>("Seq"), this.OperationName)); } } /// <summary> /// 允许下达的单据业务状态 protected override string[] PassedEntryState { get { return this.BizStateContext.IsExecuteForward ? new string[] { //下达时,状态只能是计划确认 ((long)Enums.Enu_MOREQ_Status.KdPlanConfirm).ToString(), } : new string[] { //反下达时,状态只能是下达 ((long)Enums.Enu_MOREQ_Status.KdRelease).ToString(), }; } } /// <summary> /// 操作名称 /// </summary> public override string OperationName { get { return this.BizStateContext.IsExecuteForward ? "下达" : "反下达"; } } } }
4、注意(重要要素)校验器写好之后,需要在金蝶云星空系统这边打开业务状态机单据,选择编码为MOStateEngine,将表体明细下达状态(Release)的分录行状态实现类改为自己的命名空间,以状态编码为主要参考,状态名称是错的(Confirm计划确认、Release下达、Start开工、Finish完工、Close结案、CloseAccout结算(目前已取消))。如图:
上述操作做完之后即可达到以下效果,如图所示:
二开案例-【C#】如何在生产订单下达操作上增加自定义的校验器?
由于生产订单状态机(指生产订单订单上计划确认、下达、开工、完工、结案等状态转换)只是个空操作,它的作用只是承担状态发起的...
点击下载文档
本文2024-09-23 03:22:20发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-158432.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章