二开案例.列表插件.列表查询按高级过滤设置的数据行顺序进行排序
【应用场景】
高级过滤,输入了好多过滤条件,希望列表查询出来的数据,可以按这个高级过滤输入的过滤条件进行排序。
【案例演示】
采购订单,在用户自定义的过滤方案中,高级过滤,输入多个单据编号,列表查询最终显示结果按此单据编号顺序进行排序。
【实现步骤】
<1>编写列表插件,代码如下。
using Kingdee.BOS.App.Core;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.List.PlugIn.Args;
using Kingdee.BOS.Core.ListFilter;
using Kingdee.BOS.Core.SqlBuilder;
using Kingdee.BOS.Util;
using Newtonsoft.Json;
using System.ComponentModel;
using System.Data;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【列表插件】列表查询按高级过滤设置的数据行顺序进行排序
/// </summary>
[Description("【列表插件】列表查询按高级过滤设置的数据行顺序进行排序"), HotUpdate]
public class SortByBatchFilterRowDataListPlugIn : AbstractListPlugIn
{
public override void PrepareFilterParameter(FilterArgs e)
{
base.PrepareFilterParameter(e);
#region 合法性校验
var filterModel = this.ListModel.GetService<IListFilterModelService>();
if (filterModel == null
|| filterModel.BatchFilterObject == null
|| filterModel.BatchFilterObject.FilterRows == null)
{
return;
}
if (filterModel.BatchFilterObject.MakeUpType != "Column")
{
// 组合方式必须是列组合
return;
}
if (filterModel.BatchFilterObject.FilterRows == null || filterModel.BatchFilterObject.FilterRows.Count != 1)
{
// 排序只支持一个字段
return;
}
if (string.IsNullOrWhiteSpace(filterModel.BatchFilterObject.FilterRows[0].Value))
{
// 高级过滤未设置过滤条件
return;
}
var filterRow = filterModel.BatchFilterObject.FilterRows[0];
var fieldName = filterRow.FilterField.FieldName;
var values = JsonConvert.DeserializeObject<string[]>(filterRow.Value);
if (values == null || values.Length == 0)
{
// 高级过滤未设置过滤条件
return;
}
#endregion
#region 将高级过滤的数据行插入临时表
// 创建临时表,用于暂存高级过滤条件中的数据行,最终会用于列表查询结果的排序
var sortTableName = TemporaryTableUtil.CreateTemporaryTableName(this.Context);
//this.View.ShowMessage(sortTableName);
var createTableSql = string.Format(@"CREATE TABLE {0}
(
FID INT NOT NULL,
FDATA NVARCHAR(36)
)", sortTableName);
DBUtils.Execute(this.Context, createTableSql);
var insertSql = string.Format("INSERT INTO {0} (FID,FDATA) VALUES (@FID,@FDATA)", sortTableName);
// 填充数据到临时表
var dt = new DataTable(sortTableName);
dt.Columns.Add(new DataColumn("FID", typeof(int)));
dt.Columns.Add(new DataColumn("FDATA", typeof(string)));
foreach (var value in values)
{
if (string.IsNullOrWhiteSpace(value))
{
continue;
}
var dr = dt.NewRow();
dr["FID"] = dt.Rows.Count + 1;
dr["FDATA"] = value;
dt.Rows.Add(dr);
}
if (dt.Rows.Count == 0)
{
return;
}
DBUtils.BulkInserts(this.Context, dt);
#endregion
#region 调整高级过滤条件和排序
// 列表查询,关联临时表
e.ExtJoinTables.Add(new ExtJoinTableDescription
{
TableName = sortTableName,
TableNameAs = "ListSortTempTable",
FieldName = "FDATA",
ScourceKey = fieldName
});
// 列表排序,强制按高级过滤的数据行顺序进行排序
e.SortString = "ListSortTempTable.FID";
#endregion
}
}
}
<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<3>BOSIDE扩展采购订单,注册列表插件,保存元数据,开发完毕。
【功能验证】
<1>登录业务站点,打开采购订单列表,设置自定义过滤方案并在高级过滤条件中,输入多个单据编号,此时的列表查询结果会按高级过滤的单据编号顺序排序,如下图所示。
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.列表插件.列表查询按高级过滤设置的数据行顺序进行排序
本文2024-09-23 04:08:08发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-163361.html