概念:

创建一个业务单据转换插件,在单据转换的各个时点干预单据转换的相关逻辑控制。

示例:

新建一个类,继承自单据转换插件基类Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.AbstractConvertPlugIn。

using Kingdee.BOS;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.Args;
using Kingdee.BOS.Orm.DataEntity;
using System;
namespace Kingdee.K3.Example.App.ServicePlugIn
{
/// <summary>
/// 销售出库单到外购入库单的单据转换插件
/// </summary>
public class OutStockToInStockConvertPlugIn : Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn.AbstractConvertPlugIn
{
// Summary:
// 最后触发:单据转换后事件
//
// Parameters:
// e:
public override void AfterConvert(AfterConvertEventArgs e)
{
}
//
// Summary:
// 创建关联关系后事件
//
// Parameters:
// e:
// 事件参数包
public override void OnAfterCreateLink(CreateLinkEventArgs e)
{
}
//
// Summary:
// 下推/选单,自动填充目标字段值完毕
//
// Parameters:
// e:
public override void OnAfterFieldMapping(AfterFieldMappingEventArgs e)
{
}
//
// Summary:
// 下推/选单时,根据字段映射,向目标字段填充值之前
//
// Parameters:
// e:
public override void OnBeforeFieldMapping(BeforeFieldMappingEventArgs e)
{
}
//
// Summary:
// 取源单数据前事件。
//
// Parameters:
// e:
public override void OnBeforeGetSourceData(BeforeGetSourceDataEventArgs e)
{
}
//
// Summary:
// 源数据分组:把全部分录合并到一个目标单据
//
// Parameters:
// e:
// 事件参数包
public override void OnBeforeGroupBy(BeforeGroupByEventArgs e)
{
}
//
// Summary:
// 选单时,初始化创建目标单据数据包(输出一个数据对象)
//
// Parameters:
// e:
// 事件参数包
public override void OnCreateDrawTarget(CreateDrawTargetEventArgs e)
{
}
//
// Summary:
// 创建关联关系
//
// Parameters:
// e:
// 事件参数包
public override void OnCreateLink(CreateLinkEventArgs e)
{
}
//
// Summary:
// 下推时,根据源数据分组结果,初始化创建目标单据数据包
//
// Parameters:
// e:
// 事件参数包
public override void OnCreateTarget(CreateTargetEventArgs e)
{
}
//
// Summary:
// 下推/选单时,根据字段映射,向目标字段填充值
//
// Parameters:
// e:
public override void OnFieldMapping(FieldMappingEventArgs e)
{
}
//
// Summary:
// 获取单据转换中自定义表单服务
//
// Parameters:
// e:
public override void OnGetConvertBusinessService(ConvertBusinessServiceEventArgs e)
{
}
//
// Summary:
// 选单时,执行SQL,读取源单数据
//
// Parameters:
// e:
// 事件参数包
public override void OnGetDrawSourceData(GetDrawSourceDataEventArgs e)
{
}
//
// Summary:
// 下推时,执行SQL,读取源单数据
//
// Parameters:
// e:
// 事件参数包
public override void OnGetSourceData(GetSourceDataEventArgs e)
{
}
//
// Summary:
// 初始化变量,这个事件可以得到转换规则,源单和目标单的BussinessInfo
//
// Parameters:
// e:
// 事件参数包
public override void OnInitVariable(InitVariableEventArgs e)
{
}
//
// Summary:
// 根据选择行生成取数SQL的条件子句 ID in ()语句。
//
// Parameters:
// e:
// 事件参数包
public override void OnInSelectedRow(InSelectedRowEventArgs e)
{
}
//
// Summary:
// 选单前事件:解析过滤策略中配置的条件;
//
// Parameters:
// e:
// 事件参数包
public override void OnParseFilter(ParseFilterEventArgs e)
{
}
//
// Summary:
// 选单前事件;解析字段映射关系中配置的过滤选项;
//
// Parameters:
// e:
// 事件参数包
public override void OnParseFilterOptions(ParseFilterOptionsEventArgs e)
{
}
//
// Summary:
// 解析字段映射关系,并构建查询参数。 这里可以加入你想要的字段
//
// Parameters:
// e:
// 事件参数包
public override void OnQueryBuilderParemeter(QueryBuilderParemeterEventArgs e)
{
}
//
// Summary:
// 设置钩稽数量
//
// Parameters:
// e:
// 事件参数包
public override void OnSetLinkAmount(SetLinkAmountEventArgs e)
{
}
}
}

K3Cloud案例

采购申请单到采购订单的单据转换插件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Orm.Metadata;
using Kingdee.BOS.Orm.Metadata.DataEntity;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.ConvertElement.PlugIn;
using Kingdee.BOS.BusinessEntity.Organizations;
using Kingdee.BOS.Resource;
using Kingdee.K3.SCM.Contracts;
using Kingdee.K3.SCM.App.Utils;
namespace Kingdee.K3.SCM.App.Pur.ServicePlugIn
{
/// <summary>
/// 采购申请单到采购订单的单据转换插件
/// </summary>
public class PurReqToOrderService : AbstractConvertPlugIn
{ public override void OnAfterFieldMapping(BOS.Core.Metadata.ConvertElement.PlugIn.Args.AfterFieldMappingEventArgs e)
{
long assignSupplierId = 0;
ExtendedDataEntity[] heads = e.TargetExtendDataEntitySet.FindByEntityKey("FBillHead");
if (heads == null)
{
return;
}
foreach (ExtendedDataEntity head in heads)
{
//映射过来表头指定供应商有值的更改供应商字段值为指定供应商的值
assignSupplierId = Convert.ToInt64(head.DataEntity["AssignSupplierId_Id"]);
if (assignSupplierId != 0)
{
SetSupplierId(e, assignSupplierId, head);
}
DynamicObject supplierObj = head.DataEntity["SupplierId"] as DynamicObject;
if (supplierObj != null)
{
DynamicObjectCollection porderFinance = head.DataEntity["POOrderFinance"] as DynamicObjectCollection;
DynamicObjectCollection supplierBusiness = supplierObj["SupplierFinance"] as DynamicObjectCollection;
if (supplierBusiness != null && supplierBusiness.Count > 0)
{
long payConditionId = Convert.ToInt64(supplierBusiness[0]["PayCondition_Id"]);
BaseDataField payConditionIdOjb = e.TargetBusinessInfo.GetField("FPayConditionId") as BaseDataField;
FieldUtils.SetBaseDataFieldValue(this.Context, payConditionIdOjb, porderFinance[0], payConditionId);
}
}
}
} public override void OnFieldMapping(BOS.Core.Metadata.ConvertElement.PlugIn.Args.FieldMappingEventArgs e)
{
if (e.TargetField.Key.ToUpperInvariant() == "FSUPPLIERID")
{
if (this.OperationNumber.EqualsIgnoreCase("Draw"))
{
if (Convert.ToInt64(e.ExtendedDataEntity.DataEntity["SupplierId_Id"]) > 0)
{
e.Cancel = true;
}
}
else
{
List<DynamicObject> sourceDatas = e.ExtendedDataEntity["ConvertSource"] as List<DynamicObject>;
long suggestSupplierId = sourceDatas.Where(p => p != null && Convert.ToInt64(p["FSuggestSupplierId"]) > 0).Select(p => Convert.ToInt64(p["FSuggestSupplierId"])).FirstOrDefault();
e.MapValue = suggestSupplierId;
}
} base.OnFieldMapping(e);
} private void SetSupplierId(BOS.Core.Metadata.ConvertElement.PlugIn.Args.AfterFieldMappingEventArgs e, long supplierId, ExtendedDataEntity head)
{
head.DataEntity["SupplierId_Id"] = supplierId;
BaseDataField supplier = e.TargetBusinessInfo.GetField("FSupplierId") as BaseDataField;
FieldUtils.SetBaseDataFieldValue(this.Context, supplier, head.DataEntity, supplierId);
}
}
}

[K/3Cloud] 创建一个单据转换插件的更多相关文章

  1. [K/3Cloud] 创建一个业务单据表单插件

    概念 创建一个业务单据插件,处理单据的相关控制逻辑. 示例 新建一个类,继承自单据插件基类Kingdee.BOS.Core.Bill.PlugIn.AbstractBillPlugIn. using ...

  2. [K/3Cloud] 创建一个操作校验器

    概念: 定义了一个校验器对象,通常是添加到业务单据操作服务插件,用于对操作的合法性进行校验.继承自校验器抽象对象AbstractValidator. 示例: 新建一个类,继承自AbstractVali ...

  3. 如何创建一个自定义jQuery插件

    简介 jQuery 库是专为加快 JavaScript 开发速度而设计的.通过简化编写 JavaScript 的方式,减少代码量.使用 jQuery 库时,您可能会发现您经常为一些常用函数重写相同的代 ...

  4. [K/3Cloud] 单据转换插件执行顺序

    1.下推事件及顺序 //初始化变量 OnInitVariable(InitVariableEventArgs e) //解析字段映射关系,并构建查询参数.这里可以加入你想要的额外的字段 OnQuery ...

  5. 【转】怎样创建一个Xcode插件(Part 1)

      原文:How To Create an Xcode Plugin: Part 1/3 原作者:Derek Selander 译者:@yohunl 译者注:原文使用的是xcode6.3.2,我翻译的 ...

  6. 如何创建一个基本JQuery的插件

    如何创建一个基本的插件 有时您希望在整个代码中提供一些功能.例如,也许你想要一个单一的方法,你可以调用一个jQuery选择,对选择执行一系列的操作.在这种情况下,您可能需要编写一个插件. 链接jQue ...

  7. [K/3Cloud]关于"选单"操作

    之前有些人对这块有些疑问,比如: 1.选单操作是否和下推基本一样,都是公用同一套单据转换规则,只不过下推是源单推目标单,选单是目标单去选择源单,最终操作结果一样? 2,我想实现选单的时候,选单列表先通 ...

  8. 创建VS Code 扩展插件

    VS Code提供了强大的扩展功能,我们可以通过开发插件实现自己的业务模型编辑器.这里我们快速介绍一下插件的创建.开发和发布过程. 创建插件开发模板 首先需要确认系统中安装了node.js,并且可以使 ...

  9. 如何在Microsoft Edge浏览器中添加一个Hello World插件

    注:本文提到的代码示例下载地址> How to add a Hello World extension to Microsoft Edge Microsoft Edge 随着Win 10一起推出 ...

随机推荐

  1. 435 Non-overlapping Intervals 无重叠区间

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠.注意:    可以认为区间的终点总是大于它的起点.    区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠.示例 ...

  2. 防止系统页面被加载进 iframe 子窗口

    在controller的返回的响应头中添加 response.addHeader("x-frame-options", "DENY");  即可

  3. SSM学习

    一.https://www.cnblogs.com/zyw-205520/p/4771253.html 二.https://blog.csdn.net/dwhdome/article/details/ ...

  4. 掌握Spark机器学习库-07-线性回归算法概述

    1)简介 自变量,因变量,线性关系,相关系数,一元线性关系,多元线性关系(平面,超平面) 2)使用线性回归算法的前提 3)应用例子 沸点与气压 浮力与表面积

  5. How do I get started with Node.js

    From: http://stackoverflow.com/questions/2353818/how-do-i-get-started-with-node-js Tutorials NodeSch ...

  6. rem手机端页面自适应完美解决方案(最新)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. codevs 1082 线段树练习 3 --分块练习

    时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[ ...

  8. Ryubook_1_switch_hub_源码

    一.switching hub by openflow: 用Ryu实现一个有如下功能的switching hub. • Learns the MAC address of the host conne ...

  9. swift 与 @objc

    Objective-C entry points https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-in ...

  10. C#委托与事件的关系(转载)

    1.C#中的事件和委托的作用?事件代表一个组件能够被关注的一种信号,比如你的大肠会向你发出想拉屎的信号,你就可以接收到上厕所.委托是可以把一个过程封装成变量进行传递并且执行的对象,比如你上蹲坑和上坐马 ...