本文概述了多种二开(二次开发)打印需求的实现方式。首先,展示了如何在业务场景中实现连续打印所选单据的功能,包括创建打印任务、分配模板和单据类型等。其次,介绍了如何在每条分录打印一页的情况下,通过获取分录内码并逐一打印的方式来实现。最后,针对套打显示结果不满意或预览空白的问题,提供了修改套打数据包和干预套打查询的解决方案,通过重写相关方法添加查询过滤条件等方式来调整打印行为。
套打需求越来越多样化,今天分享一些二开样例,不说了。
套打需求越来越多样化,今天分享一些二开样例,不说了。一、你不想用套打标准的打印操作?那样不适合你的业务场景?那你这样做:
二、你要自己动手二开打印所选分录?是你的分录里面有条形码,你想每页打印一张?请看下面:
<font face="微软雅黑">//业务场景:连续打印所选单据
public class MyPatchPrintAction : AbstractListPlugIn
{
private void PrintAction()
{
string[] billIDs=null;//所选的单据内码,自行赋值
string tempid = string.Empty;//套打模板标识,自行指定
string billTypeID = string.Empty;//单据类型,自行赋值
foreach (var billID in billIDs)//循环打印
{
List<PrintJobItem> printInfoList = new List<PrintJobItem>();
PrintJobItem newItem = new PrintJobItem(billID, tempid, billTypeID);
//对newItem的其他属性赋值
printInfoList.Add(newItem);
PrintJob pJob = new PrintJob();
pJob.Id = Guid.NewGuid().ToString();
pJob.FormId = this.View.BillBusinessInfo.GetForm().Id;
pJob.PrintJobItems = printInfoList;
List<PrintJob> jobs = new List<PrintJob>();
jobs.Add(pJob);
string key = Guid.NewGuid().ToString();
this.View.Session[key] = jobs;
//printType :“preview”预览,“print”打印
NoteTemplateOperation(key, "print");
}
}
/// <summary>
/// 套打模板的执行操作
/// </summary>
/// <param name="printJobId">打印任务ID</param>
/// <param name="printType">打印类型</param>
/// <param name="printer">打印机ID</param>
public void NoteTemplateOperation(string printJobId, string printType, object printer = null, string printBarName = null)
{
JSONObject jsonObj = new JSONObject();
jsonObj.Put("pageID", this.View.PageId);
jsonObj.Put("printJobId", printJobId);
jsonObj.Put("action", printType);
string action = string.Empty;
if (printType.EqualsIgnoreCase("preview") || printType.EqualsIgnoreCase("PrintMergePreview"))
{
action = JSAction.printPreview;
jsonObj.Put("printBarName", printBarName);
}
else if (printType.EqualsIgnoreCase("print") || printType.EqualsIgnoreCase("PrintMerge"))
{
action = JSAction.print;
jsonObj.Put("printerAddress", printer.IsNullOrEmpty() == true ? string.Empty : Convert.ToString(printer));
}
this.View.AddAction(action, jsonObj);
}
}</font>
复制代码
<font face="微软雅黑">//业务场景:每条分录打印一页
public class MyBatchSelectedEntity : AbstractListPlugIn
{
private void PrintAction()
{
//单据内码
string[] ids = this.ListView.SelectedRowsInfo.GetPrimaryKeyValues();
//单据内码所有分录内码
List<string> entityList = GetSelectedEtyIds(ids[0]);
List<PrintJob> jobs = new List<PrintJob>();
for (int i = 0; i < entityList.Count; i++)
{
PrintJobItem print = new PrintJobItem();
print.BillId = ids[0];
print.FormId = "";//业务对象ID
print.TemplateId = "";//套打模板
print.SortString = "";//排序
List<string> lst = new List<string>();
lst.Add(Convert.ToString(entityList<i>));
print.SelectedEtyIds = lst;
List<PrintJobItem> printlist = new List<PrintJobItem>();
printlist.Add(print);
PrintJob pJob = new PrintJob();
pJob.Id = Guid.NewGuid().ToString();
pJob.FormId = this.View.BillBusinessInfo.GetForm().Id;
pJob.PrintJobItems = printlist;
jobs.Add(pJob);
}
string key = Guid.NewGuid().ToString();
this.View.Session[key] = jobs;
JSONObject jsonObj = new JSONObject();
jsonObj.Put("pageID", this.View.PageId);
jsonObj.Put("printJobId", key);
jsonObj.Put("action", "preview");
string action = JSAction.printPreview;
jsonObj.Put("printerAddress", "");//可以指定打印机地址也可以不指定.
this.View.AddAction(action, jsonObj);
}
private List<string> GetSelectedEtyIds(string billID)
{
List<string> ret = new List<string>();
var rows = this.ListView.SelectedRowsInfo.Where(p => p.PrimaryKeyValue.Equals(billID));
foreach (var row in rows)
{
if (!ret.Contains(row.EntryPrimaryKeyValue))
{
ret.Add(row.EntryPrimaryKeyValue);
}
}
return ret;
}
}</i></font>
复制代码
三、如果你不满意套打显示的结果,或者你的动态表单设置了套打模板,但是预览却一片空白,那么你应该这样:
<font face="微软雅黑"> //业务场景:构建套打数据包,修改套打数据包,套打查询干预、套打完成之后干预
[System.ComponentModel.Description("套打列表演示插件")]
public class MyPrintListPlugIn : AbstractListPlugIn
{
public override void OnPrepareNotePrintQueryParam(Core.DynamicForm.PlugIn.Args.PrepareNotePrintQueryParamEventArgs e)
{
base.OnPrepareNotePrintQueryParam(e);
//添加查询的过滤条件
e.QueryParameter.FilterClauseWihtKey = "FBillID='10001'";
}
public override void OnPrepareNotePrintData(Core.DynamicForm.PlugIn.Args.PreparePrintDataEventArgs e)
{
base.OnPrepareNotePrintData(e);
//如果是单据头
if (e.DataSourceId.Equals("FBillHead", StringComparison.OrdinalIgnoreCase))
{
if (e.DataObjects != null)
{
//数据包已有的字段,可修改其值
if (e.DataObjects[0].DynamicObjectType.Properties.ContainsKey("FBillNo"))
{
e.DataObjects[0]["FBillNo"] = "FAAAA";
}
//如果你在套打设计器模板中添加了动态字段,数据包里是没有的此字段,那么需要对动态字段注册赋值
DynamicObjectType dt = e.DataObjects[0].DynamicObjectType;
dt.RegisterSimpleProperty(
"FDynamicKey",
typeof(object),
attributes: new SimplePropertyAttribute() { Alias = "FDynamicKey" }
);
DynamicObject obj = new DynamicObject(dt);
foreach (var p in e.DataObjects[0].DynamicObjectType.Properties)
{
obj[p] = e.DataObjects[0][p];
}
obj["FDynamicKey"] = "动态字段的值";
e.DataObjects[0] = obj;
}
}
//如果是单据体
if (e.DataSourceId.Equals("FEntity", StringComparison.OrdinalIgnoreCase))
{
//在原数据包基础上修改套打字段的值
if (e.DataObjects != null)
{
foreach (DynamicObject obj in e.DataObjects)
{
//修改基础资料字段值,一般你不会去修改基础资料的值,除非你的需求非常奇葩
if (obj.DynamicObjectType.Properties.ContainsKey("FMaterialId_Ref"))
{
DynamicObject refObj = obj["FMaterialId_Ref"] as DynamicObject;
if (refObj != null)
{
refObj["Number"] = "自定义物料编码";
refObj["Name"] = "自定义物料名称";
}
}
//修改一般字段值
if (obj.DynamicObjectType.Properties.ContainsKey("FReqQty"))
{
obj["FReqQty"] = "100";
}
}
}
//当然,如果你不想在原有的数据包上面修改,你也可以重新建立一个新的套打数据包,但是我相信你不会,我这里只是示例
//示例开始
List<DynamicObject> notePrintEntryRows = new List<DynamicObject>();
for (int i = 0; i < e.DataObjects.Count(); i++)
{
DynamicObject printHeadDynamicObject = new DynamicObject(e.DynamicObjectType);
printHeadDynamicObject["FMaterialId_Ref"] = e.DataObjects[i]["FMaterialId_Ref"];
printHeadDynamicObject["FReqQty"] = "100";
notePrintEntryRows.Add(printHeadDynamicObject);
}
e.DataObjects = notePrintEntryRows.ToArray();
//示例结束
}
}
public override void OnAfterPrint(Core.DynamicForm.PlugIn.Args.AfterPrintEventArgs e)
{
//打印完成之后,你是可以做一些你喜欢的事情
base.OnAfterPrint(e);
if (e.NoteIDPairs != null)
{
Log.Logger.Info("PrintAciton", "success");
//do sth you like
}
}
}</font>
复制代码
四、什么?你的客户需求是需要在套打模板里面增加动态列来绑定你的动态数据?我不太相信,这个我以后再告诉你怎么写。
算了,现在说吧。
下面将以简单帐表实现打印动态列做为例子。
你需要做三个事情
1、在简单帐表的服务插件上,重写GetReportHeaders方法时,把需要动态打印的列的属性“IsPrint”设置为true。
2、为简单帐表挂上表单插件,重写查询动态列方法OnQueryDynamicColunms。方法内容请留意下面。
3、套打模板,套打模板的数据表格,在绑定了单据体之后,进行插件动态列操作。
:实现效果图(预览):
其中,“单据编号”是固定列,“状态”是动态生成的列。
步骤一:动态打印的列的属性“IsPrint”设置为true
步骤二:挂上表单插件,重写查询动态列方法OnQueryDynamicColunms
[Description("test帐表表表单插件")]
public class MySysReportPlugin : AbstractSysReportPlugIn
{
public override void OnQueryDynamicColumns(Core.DynamicForm.PlugIn.Args.QueryDynamicColumnsEventArgs e)
{
base.OnQueryDynamicColumns(e);
List<ListHeader> columns= ((ISysReportModel)this.View.Model).ReportHeader.GetChilds();
if (columns != null && columns.Count > 0)
{
List<DynamicColumn> listdc = new List<DynamicColumn>();
for (int i = 0; i < columns.Count; i++)
{
if (columns[i].IsPrint)
{
DynamicColumn dcA = new DynamicColumn();
dcA.Caption = columns[i].Caption;
dcA.FieldKey = columns[i].FieldName;
dcA.IsStatistic = false;
dcA.StatisticScope = 16;
dcA.StatisticType = 1;
listdc.Add(dcA);
}
}
e.DynamicColumns = listdc;
}
}
}
复制代码
步骤三:定义套打模板
-------------------------全部已完---------------
推荐阅读