二开干预套打取数示例(动态字段使用)原创
金蝶云社区-王文亮
王文亮
9人赞赏了该文章 7636次浏览 未经作者许可,禁止转载编辑于2021年12月29日 10:28:44

7.7版本以后,大部分需要运算的场景可以使用实体动态字段配置出来了,具体参考:https://vip.kingdee.com/article/263951470566038016

目前套打是不会对数据做干预的,也就是说单据上面一个字段的值是什么,那么打印出来就是什么。如果需要对打印出来的数据做变更,可以通过二次开发来实现。
   比如有一个打印需求:需要将采购订单上面“供应商名称”“大写金额”“金额” 连接起来进行打印输出。那么可以在套打插件里面将三个字段的连接起来配合动态字段进行打印。

操作步骤:
一.使用visual studio新建工程,并添加相关引用:


二.新建类,并继承基类“AbstractBillPlugIn”。


三.重载OnPrepareNotePrintData方法。


四.OnPrepareNotePrintData实现干预套打取数的逻辑, 本贴示例逻辑为:
    1.获取采购订单上面“供应商名称”“大写金额”“金额”三个字段值,并作连接处理。
    2.定义名字为“FMyself”的动态字并注册。
    3.给动态字段赋值。
   本帖最后会附上示例插件的完整代码。
五.插件开发完毕后,编译工程生成成*.dll文件。

六.将步骤五里面编译生成的dll文件放到服务器Cloud站点的website/bin目录下面,并重启IIS。

七.在BOS IDE里面扩展采购订单,给采购订单注册套打插件。

八.套打设计器里面绑定动态字段“FMyself”

九.登录 Cloud,打开采购订单,打印预览。

注:本帖示例为单据打印,如果需要列表打印生效,则需要继承AbstractListPlugIn基类,在OnPrepareNotePrintData实现干预套打取数的逻辑。


附:本案例所用的套打插件代码:
[code]using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Orm.Metadata.DataEntity;

namespace TestPrintPlugin
{
   public class TestPrintPlugin : AbstractBillPlugIn
   {
     
       public override void OnPrepareNotePrintData(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePrintDataEventArgs e)
       {

if (e.DataSourceId.Equals("FBillHead", StringComparison.OrdinalIgnoreCase))
           {
               DynamicObject billObj = this.Model.DataObject;
               // 首先获取各种元素的元数据
               Field fldBillNo = this.View.BillBusinessInfo.GetField("FBillNo");
               Field amount = this.View.BillBusinessInfo.GetField("FBillAmount");
               BaseDataField fldSupplier = this.View.BillBusinessInfo.GetField("FSupplierId") as BaseDataField;
         
               // 读取单据内码
               long billId = Convert.ToInt64(billObj[0]);
               //单据编号
               string billNo = Convert.ToString(fldBillNo.DynamicProperty.GetValue(billObj));
               //供应商
               DynamicObject fldSupplierValue = fldSupplier.DynamicProperty.GetValue(billObj) as DynamicObject;

// 基础资料属性值(供应商)
               string supplierName = "";
               if (fldSupplierValue != null)
               {
                   long supplierId = Convert.ToInt64(fldSupplierValue[0]);
                   string supplierNumber = fldSupplier.GetRefPropertyValue(fldSupplierValue, "FNumber").ToString();
                   supplierName = fldSupplier.GetRefPropertyValue(fldSupplierValue, "FName").ToString();
               }

// 财务子单据体
               DynamicObjectCollection FPOOrderFinanceList = billObj["POOrderFinance"] as DynamicObjectCollection;
               DynamicObject FPOOrderFinance = FPOOrderFinanceList[0];
               //金额字段
               double amountDisplayValue = Convert.ToDouble(amount.DynamicProperty.GetValue(FPOOrderFinance));
               //获取金额大写
               Kingdee.BOS.NumFormatTran.FormatTranslate formatTran = new Kingdee.BOS.NumFormatTran.FormatTranslate();
               formatTran.Resource = amountDisplayValue.ToString();
               //如需要支持英文大写格式,需要将下面代码替换成为:formatTran.Type =  Kingdee.BOS.Util.UpperStyle.EnglishDollarStyle.ToString();
               formatTran.Type = Kingdee.BOS.Util.UpperStyle.ChineseRmbStyle.ToString();
               string chineseAmount = Kingdee.BOS.Util.FormatTranslateUtil.Translate(formatTran);

//动态字段注册赋值
               DynamicObjectType dot = e.DataObjects[0].DynamicObjectType;
               dot.RegisterSimpleProperty(
                       "FMyself",
                       typeof(object),
                       attributes: new SimplePropertyAttribute() { Alias = "FMyself" }
                       );
   
               DynamicObject obj = new DynamicObject(dot);
               foreach (var p in e.DataObjects[0].DynamicObjectType.Properties)
               {
                   obj[p] = e.DataObjects[0][p];
               }
               //动态字段赋值
               obj["FMyself"] =supplierName + chineseAmount + amountDisplayValue.ToString();
       
               e.DataObjects[0] = obj;

}
           
           base.OnPrepareNotePrintData(e);

}


   }

}
[/code]