单据转换后插件入门原创
金蝶云社区-abstrct
abstrct
3人赞赏了该文章 121次浏览 未经作者许可,禁止转载编辑于2024年08月30日 10:45:09
summary-icon摘要由AI智能服务提供

本文介绍了如何在单据转换后通过插件修改数据包数据,特别是当源单数据未能直接带入目标单时。通过继承并扩展`AbstractConvertPlugIn`类,在`AfterConvert`方法中实现修改逻辑。示例代码演示了如何根据单据体第一行的仓库数据,更新单据头的仓管员字段。文章还强调了BOS平台操作、数据结构理解、调试技巧以及插件部署流程,特别是针对新手的调试和数据包结构查看方法,以帮助完成插件开发和部署。

  1. 能实现的功能

    继承单据转换后事件,事件触发后,能对原有的数据包数据进行修改。即一些未能从源单带过来的数据,未能通过服务,值更新实现的赋值。

    例如:根据单据体第一行的仓库带出单据头的仓管员字段。因为是单据转换,所以未能出发值更新。根据单据头的基础资料的字段,给每一行单据体字段赋值等。

  2. 具体实现

    插件准备:取源数据给目标数据赋值。

   3.代码示例1:

using Kingdee.BOS.Core;

using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;

using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;

using Kingdee.BOS.Core.Metadata.FieldElement;

using Kingdee.BOS.Core.Metadata.Util;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.ServiceHelper;

using Kingdee.BOS.Util;

using Kingdee.K3.Core.MFG.EntityHelper;

using MUY.K3.App.Core;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace MUY.K3.Business.PlugIn.SC.AfterConvert

{

    [Description("收料通知单下推采购入库单转换后事件"), HotUpdate]

    public class ConvertPurReceiveToInStock: AbstractConvertPlugIn

    {

        /// <summary>

        /// 单据转换后事件

        /// </summary>

        /// <param name="e"></param>

        public override void AfterConvert(AfterConvertEventArgs e)

        {

            base.AfterConvert(e);


            //查明细表,仓位值

            ExtendedDataEntity[] array = e.Result.FindByEntityKey("FBillHead");


            for (int i = 0; i < array.Length; i++)

            {

                DynamicObjectCollection Entity = array[i]["InStockEntry"] as DynamicObjectCollection;

                //获取第一行仓库基础资料数据包对象

                if (Entity.Count>0&&!Entity.Equals(null)) {

                    DynamicObject stock = Entity[0]["StockId"] as DynamicObject;

                    //根据仓位数据包的仓库负责人 过滤仓管员数据包

                    //var data = Synthesize.GetDataValue(this.Context, "BD_WAREHOUSEWORKERS", string.Format("FSTAFFID={0}",stock["FPRINCIPAL"]));

                    //表头仓管员赋值数据包

                    if (stock != null) {

                        DynamicObject stocker = stock["Principal"] as DynamicObject;

                        array[i]["StockerId"] = stocker;

                        array[i]["StockerId_Id"] = stocker["Id"].ToString();

                    }

                }

            }

        }

    }

}

    4.BOS上的操作:给基础资料加上引用。

                    我们取仓库的保管人或者说责任人作为仓管员,这个基础资料需要添加引用,添加后,在这个json对象中,我们能取到stock["Principal"]作为对象。

                    第二点是仓管员是基础资料,需要传array[i]["StockerId_Id"] = stocker["Id"].ToString();才会赋值。即原来的字段后面拼接_id,不知道这个的其实也没关系。后面会详细说明,如何正确的取到值。我们需要记住的是,记得给这个字段赋值即可。


    5.整体感受。

       刚开始写的时候,习惯性的写代码 Object.xxxx希望能直接点出对象来,但是怎么点也点不出来,真心不习惯。如果没记住Bos里面的对应的字段的话,我感觉这个代码很难写下去。后来有人告诉我说,不要想着对象,你把他们当作一个一个json。这样我就习惯了很多。


    6.数据结构

      我说过这都是一个一个json,习惯了很多,但我不知道里面的json构造,或者是json包了几层。怎么办?对刚开始的写的或者刚开始学的小伙伴有一个好办法。即

     代码重写方法,写完第一行几乎都是一样的代码之后,后面可以先随便写写什么,只要能执行下去,不报错就行。没错,就是随便写。

              base.AfterConvert(e);

            //查明细表,仓位值

            ExtendedDataEntity[] array = e.Result.FindByEntityKey("FBillHead");

    7.调试看数据包结构

        然后进入调试,看到array 的数据包,看到这个之后,一层一层翻就行。写了很多的小伙伴不用这么做,这个只对新手和刚入门的有帮助。看到了整个json之后,取数应该是没问题了。而且可以看到对应的字段,你会发现你要赋值的对象,有StockerId,StockerId_Id这样的。那你就给StockerId_Id的也赋值就对了。

    8.取数和赋值对了,这个插件就完了。剩下的就是生成dll文件,替换文件,在单据转换中,扩展,停止,插件策略中注册插件,然后启用就行。

     最后希望这个单据转换后插件对小伙伴们能有所帮助。



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

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0