本文介绍了插件在系统操作中执行后台任务的应用,如保存前校验和审核后自动下推等。特别讲述了单据转换插件的实践经验,包括通过不同方法获取转换规则、构造下推参数、处理自定义业务对象不支持的坑及下推后续操作的封装等。提供了示例代码和参数构造的细节,并建议了封装过程以实现更多个性化控制。
插件的目的:在系统的原有的操作后,进行一些后台的操作。例如:保存之前加校验。审核之后自动下推。等
示例代码:见:https://vip.kingdee.com/article/70239353775185664?lang=zh-CN&productLineId=1 单据转换插件
自己实践后的总结:
1.rule获取方法:
//上下游单据
//var rules = ConvertServiceHelper.GetConvertRules(this.Context, "SRWX_AP_Payable", "SRWX_AP_Payable");
//取默认单据转换
//var rule = rules.FirstOrDefault(t => t.IsDefault);
这个方法适用知道上下游单据且只取默认的转换关系
当上下游单据为同一个单据的时候,这个方法就会取不到。
这个时候用下面这个方法:
var ruleId = ConvertServiceHelper.GetConvertRule(this.Context, "AP_HookPayableToFinPayable");
var rule = ruleId.Rule;
优点:就是上下游为同一个单据的时候,另外一个就是下推关系有多个,这样处理比较简单。具体的参数可以直接在BOS的单据转换的转换规则里面直接查看。
2.参数构造:
PushArgs pushArgs = new PushArgs(rule, selectedRows)
{
//目标单据类型
TargetBillTypeId = "a83c007f22414b399b0ee9b9aafc75f9",
//目标单据主业务组织
TargetOrgId = 110304,
CustomParams = custParams,
};
参数1是rule,上面已经说过了,第二个参数为selectedRows。
第二个参数可以是list,json等转toArray();参数需要的值,主键id,列fentity的id,fseq,目标单据的业务对象,或者说formid。可以直接获取的有,循环取e.DataEntitys得entity得id就是主键id。即entity[id]
entity["AP_PAYABLEENTRY"]这里就是明细得行entity["AP_PAYABLEENTRY"][id]即为列id。有多列得话,要对entity["AP_PAYABLEENTRY"]循环取id
循环得i即为fseq 业务对象查BOS
也可以直接选中行构造。看需求是 按分录下推,还是全部数据下推,还是选中得分录下推。
目标就是构造selectedRows
如下:
//List<ListSelectedRow> ListSalReSelect = new List<ListSelectedRow>();
//ListSelectedRow convertItem = new ListSelectedRow(
// Convert.ToString(entity["id"]),
// Convert.ToString(entry["id"]),
// Convert.ToInt32(entry["seq"]),
// "SRWX_AP_Payable");
//ListSalReSelect.Add(convertItem);
//if (ListSalReSelect.Count <= 0) { return; }
DynamicObjectCollection entry = entity["AP_PAYABLEENTRY"] as DynamicObjectCollection;
int i = 0;
ListSelectedRow[] selectedRows = new ListSelectedRow[entry.Count];
//循环取选中数据的id
foreach (DynamicObject item in entry)
{
selectedRows[i] = new ListSelectedRow(Convert.ToString(entity["id"]), Convert.ToString(item["id"]), i, "SRWX_AP_Payable");
i++;
}
又或者直接按链接的例子选中行数据
3.实践的坑。例子有这行代码
// 读取目标单据元数据
var targetBillMeta = MetaDataServiceHelper.Load(this.Context, "PUR_ReceiveBill") as FormMetadata;
PUR_ReceiveBill为目标单据的业务对象。但是该方法不支持扩展的业务对象。如有扩展需要使用金蝶自带的业务对象。
这样的话,如果是自定义二开页面的话,这行代码就是过不去的坎。
4.这行代码非这样不可么?
当然不是,还有其它方法可以走的。
下推只是三步:1.取rule 2.构造数据 3.执行下推和接收下推结果。
那么下推之后呢?
1.保存下推结果,自动生成单号。调用系统保存。
2.打开目标单据,到此结束。
3.打开目标单据,设置单据状态。
等操作。
4.封装,对这个过程进行封装,更多的控制的例子,如源单,目标单的。这个可以自行尝试。
输入对应参数,根据参数去配这三步完成个性下推。
推荐阅读