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如何二开数据模型策略实现类
本文2024-09-23 03:15:03发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-157657.html