PLM.影响评估二开案例.自定义显示ERP单据字段指南
【应用场景】
变更影响评估中,新增ERP单据的单据字段,并在返回数据时显示在变更对象列表中。
【案例演示】
变更影响评估中,生产订单显示生产组织,并在返回时显示在变更对象列表中。
【设计思路】
在影响评估时,根据评估信息动态获取所需的单据信息并赋值在影响评估单据体上。并将此部分信息整合后,通过表单传值传回ECN单据中。
影响评估返回信息时,根据评估单据传递的信息,再动态赋值至变更对象单据体中,以此达到信息的一致性,也可以避免重复获值。
【实现步骤】
如果你刚接触PLM二开,你可能需要参考:
如何编写二开插件配置等请参考:二次开发扩展程序开发之插件模式https://vip.kingdee.com/article/83591896433330944?productLineId=1
其他星空PLM开发指南也可以参考 【汇总】星空PLM二开指南(持续更新)https://vip.kingdee.com/article/329914697153905408?productLineId=1&isKnowledge=2
更多详细的金蝶云星空BOS二次开发指南:https://vip.kingdee.com/article/94751030918525696?productLineId=1&isKnowledge=2
<1>变更单添加自定义字段
在BOSIDE中,找到“变更单”单据并扩展,在变更对象单据体中加入自定义的字段,并锁定。
<2>非PLM影响评估添加自定义字段
设计变更模块中,找到动态表单“非PLM影响评估分析”并扩展,加入自定义字段并锁定
* 注意评估有子项父项的区别(结构变更时会评估子项)
* 注意表头名称中会通过&分层
<3>编写表单插件,添加引用
<4>新增影响评估插件
继承标准插件AbstractDynamicFormPlugIn。重写BeforeBindData事件,在标准插件初始化数据时,根据评估的单据类型赋值需要的信息;并将需要的信息包装后返回ECN单据。
示例代码:
using Kingdee.BOS;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.K3.PLM.STD.Common.BusinessEntity.EngineeringChange.Relevancy;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace ISV.PLM.ECNDemo
{
[HotUpdate]
[Description("影响评估二开示例")]
public class ERPRefevancyFormExtend : AbstractDynamicFormPlugIn
{
/// <summary>
/// 评估类型,1:制造 , 2:供应链
/// </summary>
private int RefevancyType = 0;
public override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//标准插件中的评估模型参数,用于判断评估类型
var models = this.View.OpenParameter.GetCustomParameter("plm_param_relevancyModel") as List<ERPRelevancyModel>;
if (models != null && models.Count > 0)
{
RefevancyType = models[0].RelevancyType;
}
}
public override void BeforeBindData(EventArgs e)
{
//评估单据赋值需在BeforeBindData事件中实现,且插件顺序必须在标准插件之后
if (this.View.ParentFormView != null && this.View.ParentFormView.ParentFormView != null)
{
var ecnView = this.View.ParentFormView.ParentFormView; //通过获取ECN表单的视图,向其传递查询信息,可以避免重复获值;
var objectEntityF = this.Model.DataObject["EntityF"] as DynamicObjectCollection; //此为父项单据体,如果是结构变更,请考虑子项影响的场景;
Dictionary<string, string> prd_mappings = new Dictionary<string, string>();
foreach (var fObject in objectEntityF)
{
if (fObject["BillTypeId_Id"].ToString().ToUpper() == "PRD_MO") //评估的单据标识
{
var billNo = fObject["BILLNO"].ToString();
var preOrg = GetPreOrg(billNo);
if (!string.IsNullOrWhiteSpace(preOrg))
{
this.Model.SetValue("FPrdOrg", preOrg, objectEntityF.IndexOf(fObject));
prd_mappings[billNo] = preOrg;
}
}
}
if (prd_mappings.Count > 0)
{
if (RefevancyType == 1)
{
ecnView.Session["ERPRefevancyMFG"] = prd_mappings;
}
else
{
ecnView.Session["ERPRefevancyDSC"] = prd_mappings;
}
}
}
}
private string GetPreOrg(string billCode)
{
//此方法仅用于示例,请根据实际业务场景设计值获取逻辑。注意循环的性能影响。
//本示例只简单演示获取ERP单据头的信息,如果具体到单据体的信息,则需要额外考虑子项信息,通过评估单据体中的【评估对象】(FBaseObject)去查找
var sql = @"Select L.FNAME from T_PRD_MO P
INNER JOIN T_ORG_ORGANIZATIONS O ON p.FPrdOrgId = O.FORGID
INNER JOIN T_ORG_ORGANIZATIONS_L L ON L.FORGID = O.FORGID
WHERE L.FLOCALEID = 2052 AND P.FBILLNO = @BILLNO";
var bill = DBServiceHelper.ExecuteDynamicObject(this.View.Context, sql, null, null, System.Data.CommandType.Text,
new SqlParam[] { new SqlParam("@BILLNO", KDDbType.String, billCode) });
if (bill != null) return bill.FirstOrDefault()["FNAME"].ToString();
return null;
}
}
}
<5>新增变更单插件
继承标准插件AbstractBillPlugIn。重写DataChanged事件,评估数据返回加载ERP单据数据时,会通过行字段赋值ERP编码,此时会触发ERP编码字段的值更新事件。通过捕获值更新事件更新对应单据的自定义单据信息字段。
示例代码:
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Util;
using System.Collections.Generic;
using System.ComponentModel;
namespace ISV.PLM.ECNDemo
{
[HotUpdate]
[Description("变更单二开示例")]
public class ECNBillExtend: AbstractBillPlugIn
{
public override void DataChanged(DataChangedEventArgs e)
{
base.DataChanged(e);
if (e.Field.Key.ToUpperInvariant() == "FERPBILLCODE")
{
//通过评估单据中传递的内容,进行变更对象列表的复制
Dictionary<string, string> mfgMappings = null, dscMappings = null;
if (this.View.Session.ContainsKey("ERPRefevancyMFG"))
{
mfgMappings = this.View.Session["ERPRefevancyMFG"] as Dictionary<string, string>;
}
if (this.View.Session.ContainsKey("ERPRefevancyDSC"))
{
dscMappings = this.View.Session["ERPRefevancyDSC"] as Dictionary<string, string>;
}
if (mfgMappings != null && mfgMappings.ContainsKey(e.NewValue.ToString()))
{
this.Model.SetValue("FPrdOrg", mfgMappings[e.NewValue.ToString()], e.Row);
}
else if (dscMappings != null && dscMappings.ContainsKey(e.NewValue.ToString()))
{
this.Model.SetValue("FPrdOrg", dscMappings[e.NewValue.ToString()], e.Row);
}
}
}
}
}
<6>拷贝组件
拷贝新增插件的组件到应用站点的WebSite\Bin目录下,重启IIS
<7>注册插件
打开BOSIDE,找到单据【变更单】和【非PLM领域影响分析】。 注册各自的自定义插件
<8>清理缓存,更新模型
清理站点元数据缓存,并更新变更单业务类型模型。
PLM.影响评估二开案例.自定义显示ERP单据字段指南
本文2024-09-23 03:05:28发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-156651.html