# 单据转换插件 — C#（AbstractConvertPlugIn）

```csharp
using Kingdee.BOS;
using Kingdee.BOS.App;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;

namespace Kingdee.MyProject.Plugin.Convert
{
    [Description("单据转换插件"), HotUpdate]
    public class MyConvertPlugin : AbstractConvertPlugIn
    {
        /// <summary>构建查询参数：加入额外字段</summary>
        public override void OnQueryBuilderParemeter(QueryBuilderParemeterEventArgs e)
        {
            base.OnQueryBuilderParemeter(e);
            e.SelectItems.Add(new SelectorItemInfo("FBillNo"));
            e.SelectItems.Add(new SelectorItemInfo("FDate"));
        }

        /// <summary>解析过滤策略：追加下推条件</summary>
        public override void OnParseFilter(OnParseFilterEventArgs e)
        {
            base.OnParseFilter(e);
            string filter = " FBillNo LIKE 'CGSQ%' ";
            e.FilterPolicySQL = StringUtils.JoinFilterString(e.FilterPolicySQL, filter);
            e.PlugFilterDesc = "单据编号必须包含【CGSQ】";
        }

        /// <summary>解析选单过滤选项</summary>
        public override void OnParseFilterOptions(OnParseFilterOptionsEventArgs e)
        {
            base.OnParseFilterOptions(e);
            // e.FilterOptionsSQL = StringUtils.JoinFilterString(e.FilterOptionsSQL, " FReqQty > 10 ");
        }

        /// <summary>获取源单数据后（下推执行）</summary>
        public override void OnGetSourceData(GetSourceDataEventArgs e)
        {
            base.OnGetSourceData(e);
            foreach (DynamicObject row in e.SourceData)
            {
                string srcId = Convert.ToString(row["Id"]);
                // 修改源单数据包，影响携带值
            }
        }

        /// <summary>分组前：增加自定义分组字段</summary>
        public override void OnBeforeGroupBy(BeforeGroupByEventArgs e)
        {
            base.OnBeforeGroupBy(e);
            e.HeadGroupKey = string.Format("{0},{1}", e.HeadGroupKey, "FXXX");
        }

        /// <summary>创建目标单后，表单服务策略执行前</summary>
        public override void OnAfterCreateLink(AfterCreateLinkEventArgs e)
        {
            base.OnAfterCreateLink(e);
            var headEntity = e.Result.FindByEntityKey("FBillHead");
            foreach (var entity in headEntity)
            {
                DynamicObject billObj = entity.DataEntity;
                // billObj["FNote"] = "下推生成";
            }
        }

        /// <summary>转换执行完成后</summary>
        public override void AfterConvert(AfterConvertEventArgs e)
        {
            base.AfterConvert(e);
            var headEntity = e.Result.FindByEntityKey("FBillHead");
            foreach (var entity in headEntity)
            {
                DynamicObject billObj = entity.DataEntity;
                // 最终处理
            }
        }
    }
}
```

**AbstractConvertPlugIn 全部事件（反编译 Kingdee.BOS.Core.dll）：**
OnInitVariable(InitVariableEventArgs) / **OnQueryBuilderParemeter**(QueryBuilderParemeterEventArgs) / OnBeforeGetSourceData(BeforeGetSourceDataEventArgs) / OnInSelectedRow(InSelectedRowEventArgs) / **OnBeforeFieldMapping**(BeforeFieldMappingEventArgs) / **OnFieldMapping**(FieldMappingEventArgs) / **OnAfterFieldMapping**(AfterFieldMappingEventArgs) / **OnCreateLink**(CreateLinkEventArgs) / OnSetLinkAmount(SetLinkAmountEventArgs) / **OnAfterCreateLink**(CreateLinkEventArgs) / **OnGetSourceData**(GetSourceDataEventArgs) / **OnCreateTarget**(CreateTargetEventArgs) / **OnParseFilterOptions**(ParseFilterOptionsEventArgs) / **OnGetDrawSourceData**(GetDrawSourceDataEventArgs) / **OnCreateDrawTarget**(CreateDrawTargetEventArgs) / **OnBeforeGroupBy**(BeforeGroupByEventArgs) / **OnParseFilter**(ParseFilterEventArgs) / **OnGetConvertBusinessService**(ConvertBusinessServiceEventArgs) / OnAfterConvertBusinessService(AfterConvertBusinessServiceEventArgs) / **AfterConvert**(AfterConvertEventArgs) / OnBeforeTailDiff(BeforeTailDiffEventArgs) / OnAfterTailDiff(AfterTailDiffEventArgs)

**源码参考：** 实际 C# 项目未找到转换插件代码；Java BOTP 事件签名同上
