二开案例.单据插件.打开单据时按单据类型绑定的视图显示窗体

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

二开案例.单据插件.打开单据时按单据类型绑定的视图显示窗体

【应用场景】

<1>第三方系统单点登录星空后打开单据查看界面,外部请求未传递视图Id

<2>插件ShowForm单据,未传递视图Id。

var pkId = "100791";

var showParameter = new BillShowParameter();

showParameter.FormId = "PUR_PurchaseOrder"; // 业务对象标识 

showParameter.PageId = Guid.NewGuid().ToString();

showParameter.ParentPageId = this.View.PageId;

showParameter.NoBusy = true;

showParameter.PKey = pkId; // 单据内码           

showParameter.Status = OperationStatus.VIEW; // 查看模式打开  

//showParameter.LayoutId = "00505691-8444-844a-11ec-62f6b54feed5";// 以指定视图打开

this.View.ShowForm(showParameter);


【案例演示】

采购订单列表,打开单据时按单据类型绑定的视图显示窗体。


【实现步骤】

<1>编写单据插件和列表插件,代码如下。


using Kingdee.BOS.Core.Bill;

using Kingdee.BOS.Core.Bill.PlugIn;

using Kingdee.BOS.Core.DynamicForm;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Core.List.PlugIn;

using Kingdee.BOS.Core.Metadata;

using Kingdee.BOS.ServiceHelper;

using Kingdee.BOS.Util;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Linq;


namespace Jac.XkDemo.BOS.Business.PlugIn

{

    /// <summary>

    /// 【单据插件】打开单据时按单据类型绑定的视图显示窗体

    /// </summary>

    [Description("【单据插件】打开单据时按单据类型绑定的视图显示窗体"), HotUpdate]

    public class ShowFormByBillTypeLayoutIdBillPlugIn : AbstractBillPlugIn

    {

        public override void PreOpenForm(PreOpenFormEventArgs e)

        {

            base.PreOpenForm(e);

            var openParameter = e.OpenParameter as BillOpenParameter;

            if (openParameter == null)

            {

                // 不是单据,不处理

                return;

            }


            if (!string.IsNullOrWhiteSpace(openParameter.LayoutId))

            {

                // 如果外部已经指定了视图,不处理

                return;

            }


            if (openParameter.Status != OperationStatus.EDIT && openParameter.Status != OperationStatus.VIEW)

            {

                // 只处理查看和编辑的场景

                return;

            }


            if (string.IsNullOrWhiteSpace(openParameter.PkValue as string))

            {

                // 没传单据内码,不处理

                return;

            }


            // 获取单据类型指定的默认视图,并尝试以该视图打开窗体

            var businessInfo = e.OpenParameter.FormMetaData.BusinessInfo;

            var billTypeField = businessInfo.GetBillTypeField();

            if (billTypeField == null)

            {

                // 没有单据类型字段, 不处理

                return;

            }


            var obj = BusinessDataServiceHelper.LoadSingle(e.Context, openParameter.PkValue, businessInfo.GetSubBusinessInfo(new List<string>(new[] { billTypeField.Key })).GetDynamicObjectType());

            if (obj == null)

            {

                return;

            }


            var billTypeId = obj[billTypeField.PropertyName + "_Id"] as string;

            if (string.IsNullOrWhiteSpace(billTypeId))

            {

                // 当前单据未设置单据类型, 不处理

                return;

            }


            var billType = billTypeField.BillTypeInfo.FirstOrDefault(o => o["Id"].ToString().EqualsIgnoreCase(billTypeId));

            if (billType == null)

            {

                // 元数据中找不到当前单据类型, 不处理

                return;

            }


            var layoutId = billType["LayoutSolution_Id"] as string;

            if (string.IsNullOrWhiteSpace(layoutId))

            {

                // 单据类型未绑定视图, 不处理

                return;

            }


            // LayoutId发给客户端,让客户端重新获取元数据

            openParameter.LayoutId = layoutId;

            // 刷新服务端元数据,保证服务端和客户端一致

            openParameter.FormMetaData = FormMetaDataCache.GetCachedFormMetaData(e.Context, openParameter.FormId, layoutId);

        }

    }


    /// <summary>

    /// 【列表插件】打开单据时按单据类型绑定的视图显示窗体

    /// </summary>

    [Description("【列表插件】打开单据时按单据类型绑定的视图显示窗体"), HotUpdate]

    public class ShowFormByBillTypeLayoutIdListPlugIn : AbstractListPlugIn

    {

        public override void BarItemClick(BarItemClickEventArgs e)

        {

            base.BarItemClick(e);

            if (e.BarItemKey.Equals("test6", StringComparison.OrdinalIgnoreCase))

            {

                #region 显示单据界面


                // 打开单据编号为【CGDD169050】的采购订单的单据界面

                // 执行以下SQL语句获取该单据的内码:SELECT FID AS 单据内码,* FROM T_PUR_POORDER WHERE FBILLNO='CGDD169050'

                var pkId = "101411";

                var showParameter = new BillShowParameter();

                showParameter.FormId = "PUR_PurchaseOrder"; // 业务对象标识 

                showParameter.PageId = Guid.NewGuid().ToString();

                showParameter.ParentPageId = this.View.PageId;

                showParameter.NoBusy = true;

                showParameter.OpenStyle.ShowType = ShowType.MainNewTabPage;

                showParameter.PKey = pkId; // 单据内码           

                showParameter.Status = OperationStatus.EDIT; // 编辑模式打开  

                this.View.ShowForm(showParameter);


                #endregion

            }

        }

    }

}


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


<3>BOSIDE扩展采购订单,调整好新建视图,列表菜单新增菜单项,注册表单插件和列表插件,保存元数据,登录业务站点,设置单据类型绑定新视图,开发完毕。




【功能验证】

<1>登录业务站点,打开采购订单列表界面,点击菜单打开采购订单查看界面,此时会按单据类型绑定的视图展示单据界面。

---------------------------------------------------------------------------------------------------------













【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

二开案例.单据插件.打开单据时按单据类型绑定的视图显示窗体

【应用场景】<1>第三方系统单点登录星空后打开单据查看界面,外部请求未传递视图Id。<2>插件ShowForm单据,未传递视图Id。var pkId = "1...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息