预测冲销携带冲销对象额外字段的方法
金蝶云社区-战斗车
战斗车
5人赞赏了该文章 1,031次浏览 未经作者许可,禁止转载编辑于2017年11月28日 10:06:47

用到生产制造-》计划管理-》预测冲销功能的用户会发现,在预测冲销的的第二步,冲销对象概览界面,系统已经根据标准逻辑加载了符合条件的销售订单和预测单。当用户需要对这些单据进行干预(比如只是想多携带一些冲销对象的字段)时,好像无从下手。

为了满足该需求,我们在最新补丁中已支持在适当二开的情况下,支持预测冲销携带冲销对象的自定义字段。具体是6.X打2017-11-16的补丁PT117877,7.X打2017-11-30的补丁PT118904得到支持。

在此补丁基础上,以下讲述适当的二开都需要做些什么,本贴将拿冲销对象销售订单为示例。

设定冲销对象销售订单需要额外携带明细备注这个信息。
首先,需在预测冲销向导界面的冲销对象销售订单表体添加用于承接这个信息的字段:

然后,需要写一个预测冲销向导的表单插件并注册到标准插件后面,以下是经过验证OK的插件示例:

插件代码如下,请留意注释部分以帮助理解:
using Kingdee.BOS.Core.DynamicForm.PlugIn.WizardForm;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.MFG.EntityHelper;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace Kingdee.K3.MFG.PLN.Business.PlugIn.DynamicForm.WizardForm
{
[Description("预测冲销向导测试插件")]
public class WriteOffWizardTest : AbstractWizardFormPlugIn
{
public override void AfterDoOperation(BOS.Core.DynamicForm.PlugIn.Args.AfterDoOperationEventArgs e)
{
base.AfterDoOperation(e);

//操作代码固定是AfterSelectBill,
//using Kingdee.BOS.Util;之后可字符串具备EqualsIgnoreCase扩展方法,表示字符串不区分大小写比较
if (e.Operation.Operation.EqualsIgnoreCase("AfterSelectBill"))
{
GetSOProperty();
GetROproperty();
}
}

///


/// 获取销售订单相关属性
///

private void GetSOProperty()
{
//获取系统标准逻辑选取的销售订单信息
Entity entity = this.View.BusinessInfo.GetEntity("FSoEntity");
DynamicObjectCollection entrys = this.View.Model.GetEntityDataObject(entity);
if (entrys.IsEmpty()) return;

//using Kingdee.K3.Core.MFG.EntityHelper;之后,DynamicObject类型的对象将具备GetDynamicValue("...")扩展方法
List soEIds = entrys.Select(s => s.GetDynamicValue("SoEntryId")).Distinct().ToList();
//因为本插件是单据表单插件,按规范不能直接执行SQL,所以用QueryServiceHelper捞取数据,也可以用BusinessDataServiceHelper.Load(...)获取
DynamicObjectCollection soInfos = QueryServiceHelper.GetDynamicObjectCollection(this.Context, new QueryBuilderParemeter()
{
FormId = "SAL_SaleOrder", //销售订单标识
SelectItems = SelectorItemInfo.CreateItems(
"FId", //订单内码
"FSaleOrderEntry_FEntryID As FEntryID", //订单分录内码
"FEntryNote" //表体备注
),
FilterClauseWihtKey = string.Format(" FSaleOrderEntry_FEntryID IN({0}) ", string.Join(",", soEIds)) //过滤条件
});

//对于获取的销售订单数据构建成字典,以提升后续在循环中查找数据的效率
//这也是性能优化最常用并且效果最好的方式之一:循环外统一获取数据,然后构建成字典,再在循环中查找字典取数使用
Dictionary> soInfoGroups =
soInfos.GroupBy(g => g.GetDynamicValue("FEntryID")).ToDictionary(d => d.Key);
IGrouping soInfoGroup;

//用数据模型对表体赋值,循环表体数据,进行自定义字段赋值
for (int i = 0; i < entrys.Count; i++)
{
long relationEntryId = entrys[i].GetDynamicValue("SoEntryId");
[/i]if (!soInfoGroups.TryGetValue(relationEntryId, out soInfoGroup)) continue;

DynamicObject soInfo = soInfoGroup.First();
this.View.Model.SetValue("FEntryNote", soInfo.GetDynamicValue("FEntryNote"), i);
}
}
///


/// 获取预测单相关属性
///

private void GetROproperty()
{
///TODO: 略
}
}
}

实现效果形如: