服务插件单据转换实践后总结原创
金蝶云社区-abstrct
abstrct
64人赞赏了该文章 338次浏览 未经作者许可,禁止转载编辑于2024年09月10日 14:46:04
summary-icon摘要由AI智能服务提供

本文介绍了插件在系统操作中执行后台任务的应用,如保存前校验和审核后自动下推等。特别讲述了单据转换插件的实践经验,包括通过不同方法获取转换规则、构造下推参数、处理自定义业务对象不支持的坑及下推后续操作的封装等。提供了示例代码和参数构造的细节,并建议了封装过程以实现更多个性化控制。

  1. 插件的目的:在系统的原有的操作后,进行一些后台的操作。例如:保存之前加校验。审核之后自动下推。等

  2. 示例代码:见:https://vip.kingdee.com/article/70239353775185664?lang=zh-CN&productLineId=1 单据转换插件

  3. 自己实践后的总结:

    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.打开目标单据,设置单据状态。

等操作。

参考链接:https://vip.kingdee.com/article/167361162282648320?specialId=359713471438966272&productLineId=1&isKnowledge=2&lang=zh-CN

4.封装,对这个过程进行封装,更多的控制的例子,如源单,目标单的。这个可以自行尝试。

输入对应参数,根据参数去配这三步完成个性下推。






    

图标赞 64
64人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!