判断单据是否存在预留关系校验器

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:3

判断单据是否存在预留关系校验器


系统标准的销售订单、预测单、计划订单、生产订单、委外订单、组织间需求单上都有是否已MRP运算标识,这个标识为true时表示该单曾经参与过运算并产生了预留关系。但预留关系是动态变化的,如果要实时校验某单据是否存在预留关系,则可参照本帖实现。

通常单据反审核或删除时需要校验是否存在预留关系,基于该业务场景需求,本贴以预测单反审核为例,展示了示例校验器实现及调用。


具体步骤如下:


一、实现校验器:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Kingdee.K3.Core.MFG.EnumConst;

using Kingdee.BOS.App.Data;

using Kingdee.BOS;

using Kingdee.BOS.Util;

using Kingdee.BOS.Core;

using Kingdee.BOS.Core.Validation;

using Kingdee.K3.MFG.App.ServiceValidator;

using Kingdee.K3.Core.MFG.EntityHelper;

using Kingdee.BOS.Orm.DataEntity;


namespace NY.CusSch.App.Business.PlugIn

{

    /// <summary>

    /// 检查是否有预留关系校验器

    /// </summary>

    public class Cust_IsHasRLValiator : AbstractValidator

    {

        /// <summary>

        /// 校验实现

        /// </summary>

        /// <param name="dataEntities"></param>

        /// <param name="validateContext"></param>

        /// <param name="ctx"></param>

        public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx)

        {

            if (dataEntities.IsEmpty()) return;


            List<long> pkIds = new List<long>();

            foreach (var dataEntity in dataEntities)

            {

                DynamicObject billData = dataEntity.DataEntity;

                long pkId = billData.GetDynamicValue<long>("Id");

                pkIds.Add(pkId);

            }

            if (pkIds.IsEmpty()) return;


            //以下SQL查询预测单预留关系,若要校验别的单据,则把PLN_FORECAST改成对应的单据标识。

            //若需从供应单据角度查预留关系,则相应的SQL形如:SELECT FSUPPLYINTERID FROM T_PLN_RESERVELINKENTRY WHERE FSUPPLYFORMID='PUR_PurchaseOrder'

            string sql = @" SELECT FSRCINTERID, FPARENTINTERID, FDEMANDINTERID FROM T_PLN_RESERVELINK WHERE (FSRCFORMID='PLN_FORECAST' OR FPARENTFORMID='PLN_FORECAST' OR FDEMANDFORMID='PLN_FORECAST') ";

            List<long> rlInterIds = new List<long>();

            long rlInterId = 0;

            DynamicObjectCollection infos = DBUtils.ExecuteDynamicObject(ctx, sql);

            foreach (DynamicObject info in infos)

            {

                string srcInterIdStr = info.GetDynamicValue<string>("FSRCINTERID");

                if (!srcInterIdStr.IsNullOrEmptyOrWhiteSpace())

                {

                    if (long.TryParse(srcInterIdStr, out rlInterId) && rlInterId > 0)

                    {

                        rlInterIds.Add(rlInterId);

                        continue;

                    }

                }


                string parentInterIdStr = info.GetDynamicValue<string>("FPARENTINTERID");

                if (!parentInterIdStr.IsNullOrEmptyOrWhiteSpace())

                {

                    if (long.TryParse(parentInterIdStr, out rlInterId) && rlInterId > 0)

                    {

                        rlInterIds.Add(rlInterId);

                        continue;

                    }

                }


                string demandInterStr = info.GetDynamicValue<string>("FDEMANDINTERID");

                if (!demandInterStr.IsNullOrEmptyOrWhiteSpace())

                {

                    if (long.TryParse(demandInterStr, out rlInterId) && rlInterId > 0)

                    {

                        rlInterIds.Add(rlInterId);

                        continue;

                    }

                }

            }

            if (rlInterIds.IsEmpty()) return;


            HashSet<long> haRlInterIds = new HashSet<long>(rlInterIds);

            foreach (var dataEntity in dataEntities)

            {

                DynamicObject billData = dataEntity.DataEntity;

                string billNo = billData.GetDynamicValue<string>("BillNo");

                long billId = billData.GetDynamicValue<long>("Id");


                if (haRlInterIds.Contains(billId))

                {

                    ValidationErrorInfo errInfo =

                        new ValidationErrorInfo("",

                            billId.ToString(),

                            dataEntity.DataEntityIndex,

                            0,

                            billId.ToString(),

                            string.Format("预测单{0}已存在预留关系!", billNo),

                            "预留关系",

                            ErrorLevel.Error);

                    validateContext.AddError(billData, errInfo);

                }

            }

        }


    }

}


二、在反审核操作插件中注册调用:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ComponentModel;

using Kingdee.BOS.Core.DynamicForm.PlugIn;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;


namespace NY.CusSch.App.Business.PlugIn

{

    [Description("Cust-反审核")]

    public class UnAudit : AbstractOperationServicePlugIn

    {

        /// <summary>

        /// 加载本插件所需字段集,除保存插件外,其余插件并非全加载

        /// </summary>

        /// <param name="e"></param>

        public override void OnPreparePropertys(PreparePropertysEventArgs e)

        {

            base.OnPreparePropertys(e);


            e.FieldKeys.Add("FBillNo");

        }


        /// <summary>

        /// 注册校验器

        /// </summary>

        /// <param name="e"></param>

        public override void OnAddValidators(AddValidatorsEventArgs e)

        {

            base.OnAddValidators(e);


            //校验是否存在下游目标单

            e.Validators.Add(new Cust_IsHasRLValiator()

            {

                EntityKey = "FBillHead",

                TimingPointString = ",UnAudit,",

            });

        }

    }

}


二、BOS中扩展预测单元数据并注册反审核操作插件:



到此,针对单据是否存在预留关系的校验器实现完毕,如有疑问,可跟帖讨论。另外,标准系统已有一些关于预留的校验,如销售订单或预测单反审核时,会提示存在校验是否继续。

此外,须注意的是,因为环境或操作不规范等原因,预留关系可能存在异常,导致本校验器判断有误,这时可进行预留数据检查,释放异常预留,具体操作操作路径:生产制造>计划管理>报表分析>预留数据检查


判断单据是否存在预留关系校验器

系统标准的销售订单、预测单、计划订单、生产订单、委外订单、组织间需求单上都有是否已MRP运算标识,这个标识为true时表示该单曾经参与过...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息