二开案例.列表插件.自建视图调用分录操作
【应用场景】模拟界面操作,给单据体的指定数据行执行分录菜单绑定的操作。
【案例演示】采购订单,编辑界面,明细信息单据体的分录菜单上有一个【终止】菜单,可以对选中数据行执行终止操作,现在将在采购订单列表上,通过列表插件模拟执行【终止】菜单的点击事件完成业务终止操作。
【实现步骤】
<1>编写列表插件,代码如下。
using Kingdee.BOS;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Util;
using Kingdee.BOS.Web.Bill;
using System.ComponentModel;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【列表插件】自建视图调用分录操作
/// </summary>
[Description("【列表插件】自建视图调用分录操作"), HotUpdate]
public class CreateViewAndInvokeFormOperationListPlugIn : AbstractListPlugIn
{
/// <summary>
/// 列表主菜单点击事件
/// </summary>
/// <param name="e"></param>
public override void BarItemClick(BarItemClickEventArgs e)
{
base.BarItemClick(e);
if (e.BarItemKey.EqualsIgnoreCase("tbInvokeFormOperation"))
{
if (this.ListView.CurrentSelectedRowInfo == null)
{
this.View.ShowWarnningMessage("没有选择任何数据,请先选择数据!");
return;
}
// 获取当前选中单据的主键值
var pkId = this.ListView.CurrentSelectedRowInfo.PrimaryKeyValue;
// 创建采购订单的单据视图(编辑状态)
var billView = CreateBillView(this.Context, "PUR_PurchaseOrder", pkId);
// 设置采购订单的明细信息单据体的第三行选中
var grid = billView.GetControl<EntryGrid>("FPOOrderEntry");
grid.SetFocusRowIndex(2);
var postDatas = CreateSelectedRowPostData("FPOOrderEntry", 2);
billView.LoadPostBackData(postDatas);
// 对采购订单的明细信息单据体的第三行数据执行终止操作
var success = billView.InvokeFormOperation("Terminate");
billView.Close();
if (success)
{
this.View.ShowMessage("操作成功,明细信息第三行已被终止");
}
}
}
/// <summary>
/// 创建最简单据视图
/// </summary>
/// <param name="ctx"></param>
/// <param name="formId"></param>
/// <param name="pkId"></param>
/// <returns></returns>
private static BillView CreateBillView(Context ctx, string formId, object pkId)
{
var meta = (FormMetadata)Kingdee.BOS.ServiceHelper.MetaDataServiceHelper.Load(ctx, formId); //单据唯一标识
var form = meta.BusinessInfo.GetForm();
var param = new BillOpenParameter(formId, "");
param.Context = ctx;
param.FormMetaData = meta;
param.Status = OperationStatus.EDIT;
param.InitStatus = OperationStatus.EDIT;
param.SetCustomParameter("formID", form.Id);
param.SetCustomParameter("PlugIns", form.CreateFormPlugIns()); //插件实例模型
param.PkValue = pkId; //单据主键内码FID
param.NetCtrlDisable = true;
var provider = form.GetFormServiceProvider();
provider.GetService(typeof(IDynamicFormView));
var billview = (BillView)provider.GetService(typeof(IDynamicFormView));
//var type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web");
//var billview2 = (BillView)Activator.CreateInstance(type);
billview.Initialize(param, provider); //初始化
billview.LoadData(); //加载单据数据
return billview;
}
/// <summary>
/// 构建单据体行点击事件的数据包(数据包格式可通过Http数据监控抓包EntityRowClick事件获取)
/// </summary>
/// <param name="entryKey"></param>
/// <param name="rowIndex"></param>
/// <returns></returns>
private static JSONArray CreateSelectedRowPostData(string entryKey, int rowIndex)
{
var postDatas = string.Format(@"[{{
""{0}"": {{
""fieldKey"": ""FSeq"",
""row"": {1},
""selRows"": ""{1}"",
""isClientNewRow"": false,
""clientNewRows"": """"
}}
}}]", entryKey.ToUpper(), rowIndex);
return JSONArray.Parse(postDatas);
}
}
}
<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<3>BOSIDE扩展采购订单,列表菜单添加子菜单,注册列表插件,保存元数据,开发完毕。
现在可以登录业务站点,打开采购订单列表界面,检验一下插件效果啦。
在列表上执行指定单据的指定分录行的终止操作:
执行成功后:
【知识点】
<1>分录操作需要获取对应单据体的选中行,但是执行grid.SetFocusRowIndex无法使服务端产生对应单据体的选中行,而前端触发的EntityRowClick事件可以使服务端产生对应单据体的选中行。
<2>此插件逻辑也可以封装成WebAPi接口,供第三方系统调用分录操作。
<3>新版本已经提供分录操作接口,不再需要写如此复杂的代码。
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.列表插件.自建视图调用分录操作
本文2024-09-23 04:21:11发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-164753.html