PLM.影响评估二开案例.自定义显示ERP单据字段指南

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

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单据字段指南

【应用场景】变更影响评估中,新增ERP单据的单据字段,并在返回数据时显示在变更对象列表中。【案例演示】变更影响评估中,生产订单显示生...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息