二开案例-【C#】如何在生产订单下达操作上增加自定义的校验器?原创
金蝶云社区-快乐的八宝鱼
快乐的八宝鱼
16人赞赏了该文章 2241次浏览 未经作者许可,禁止转载编辑于2022年05月24日 10:45:45
封面

       由于生产订单状态机(指生产订单订单上计划确认、下达、开工、完工、结案等状态转换)只是个空操作,它的作用只是承担状态发起的作用,添加的标准校验器不能干预到状态的逻辑,目前这些状态的转换校验是由内部状态机的校验来实现,通过标准的操作校验和前台表单插件无法生效,所以提供下面的方法供客户自定义添加校验器,以结案为例。

      1、打开【BOSIDE-生产制造-基础管理-普通基础资料】下的单据业务状态机发布到菜单(注意:发布类型为列表)如图:


1.png

2.png

2、开始编辑自定义的校验器,以【下达】为例,检验生产订单分录自定义基础资料客户下达时必录;

Snipaste_2022-04-27_15-54-50.png

3、代码编写步骤

  1. 新加的类(Ext_Release.cs)继承结案的实现类(Release.cs),需要引用下Kingdee.K3.MFG.PRD.App.Core组件

  2. 重写GetValidator方法;

  3. 首先要执行下基类的base.GetValidator,然后添加自己的校验器(Ext_ReleaseValidator.cs);

  4. 注意: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结算(目前已取消))。如图:

Snipaste_2022-04-27_16-02-05.png

Snipaste_2022-04-27_16-03-00.png

上述操作做完之后即可达到以下效果,如图所示:

Snipaste_2022-04-27_16-04-37.png





























赞 16