MRP如何二开数据模型策略实现类

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

MRP如何二开数据模型策略实现类

【应用场景】

MRP数据模型方便的配实现字段映射携带,及增加一些过滤条件。但对于更复杂的应用场景中,可能需要获取MRP运行时数据再对对应的供需数据进行干预,则适合参照本贴实现。


【注意事项】

对于能配置实现的,尽可能在MRP数据模型中配置实现,或变通设置实现,重载MRP数据模型策略实现类是最后选择。


【案例演示】

本示例是根据销售订单,如果运算方案编码是MRPSCH01,则销售组织编码需要是10开头的数据才获取。


【实现步骤】

<1>编写数据策略实现类,代码如下。 

using Kingdee.BOS.Util;

using Kingdee.BOS.Core.Metadata.QueryElement;

using Kingdee.BOS.Core.SqlBuilder;

using Kingdee.BOS.Orm.DataEntity;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace CustMrpModel_23231206

{

    public class Cust_MyMrpDataPolicy : Kingdee.K3.MFG.PLN.App.MrpModel.PolicyImpl.Demand.SODataPolicy

    {

        /// <summary>

        /// 策略执行前事件

        /// </summary>

        /// <returns></returns>

        protected override bool BeforeExecuteDataPolicy()

        {

            //本策略返回一个值,决定本数据模型要不要在本次运算中取数。

            //注意返回值为真则取消,假为不取消,默认是不取消。

            bool isCancel = base.BeforeExecuteDataPolicy();


            //这里可对isCancel根据特定业务规则进行修改


            return isCancel;            

        }


        /// <summary>

        /// 准备查询对象,该事件核心功能就是干预查询对象的过滤条件

        /// </summary>

        /// <param name="queryObj"></param>

        /// <param name="queryInfo"></param>

        protected override void OnPrepareQueryObject(QueryObject queryObj, QueryInfo queryInfo)

        {

            base.OnPrepareQueryObject(queryObj, queryInfo);


            //注意在这里写的自定义过滤条件,一般能在对应的MRP数据模型的过滤条件中配置。

            //写在这里须注意增加表关联,然后再增加条件,如增加物料可销售条件如下:

            string joinSql = string.Format(" inner join T_BD_MATERIALBASE tmbs11 on tmbs11.fmaterialid={0}.fmaterialid ",

                this.MrpGlobalDataContext.T_MRP_MATERIALDATA);

            string whereSql = string.Format(" and tmbs11.FISSALE='1' ");


            queryObj.SQLFrom += "\r\n" + joinSql;

            queryObj.SQLWhere += "\r\n" + whereSql;

        }


        /// <summary>

        /// 处理内存数据。

        /// 若有些场景是需要根据计划方案来筛选数据,而无无法通过拼接SQL过滤条件解决时,适合重载该方法

        /// </summary>

        /// <param name="processObjects"></param>

        protected override void BeforeProcessDataEntities(IEnumerable<DynamicObject> processObjects)

        {

            if (processObjects.IsEmpty()) return;

            base.BeforeProcessDataEntities(processObjects);

           

            //本示例是根据销售订单,如果运算方案编码是MRPSCH01,则销售组织编码需要是10开头的数据才获取

            //注意这里是要遍历this.RelativeDataEntities并移除,然后将this.RelativeDataEntities赋值回processObjects

            for (int i = this.RelativeDataEntities.Count() - 1; i >= 0; i--)

            {

                if (this.MrpGlobalDataContext.SchemaDataView.Number == "MRPSCH01")

                {

                    //因为销售订单对应的MRP数据模型中,销售组织是映射到需求组织的,所以此处取需求组织

                    DynamicObject salOrgObj = this.RelativeDataEntities[i]["DemandOrgId"] as DynamicObject;

                    if(salOrgObj == null)

                    {

                        this.RelativeDataEntities.RemoveAt(i);

                        continue;

                    }

                    string salOrgNumber = Convert.ToString(salOrgObj["Number"]);

                    if (!salOrgNumber.StartsWith("10"))

                    {

                        this.RelativeDataEntities.RemoveAt(i);

                    }

                }

            }

            processObjects = this.RelativeDataEntities.ToList();

        }


    }

}


<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<3>在系统前端修改编码为MRP_DP_SO_D的MRP数据模型的策略实现类(路径:生产制造》计划管理》MRP建模》MRP数据模型),注意策略实现类文本框填对插件的命名空间和类名,结构是(命名空间.类名,组件名),如图。



【功能验证】

<1>本贴示例场景并非实际场景,实际场景实现后请自行验证。如有疑问欢迎跟帖讨论。


MRP如何二开数据模型策略实现类

【应用场景】MRP数据模型方便的配实现字段映射携带,及增加一些过滤条件。但对于更复杂的应用场景中,可能需要获取MRP运行时数据再对对应的...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息