报表及打印是二开中需求最旺盛的,因为几乎每家客户即使标准交互,但报表及打印说不定都会有二开需求,目前有很多开发人员咨询复杂打印的实现,比如有些单据提列表中很多客户希望能打印出相关一些明细内容,有很多如果完全通过配置可能实现不了,那只有通过二开套打插件来实现各种复杂场景,下面就针对套打中如果具体实现进行详细解析,并针对可以干预地方做重点解析,希望能帮助更多开发小伙伴。
一、套打模板一定是针对具体某个要打印的套打模板,套打模板在制作时,数据源需要指向某个单据体,注意打印时需要选择对套打模板。
二、 对于批量打印,注意最好分页,否则预览时可能会出不来。
1. 打印里分页的实现代码如下:
//单据内码
//单据内码所有分录内码
int pageindex = this.View.GetEntryState("F_batchprintlist").CurrentPageIndex;
int rows = this.View.GetEntryState("F_batchprintlist").PageRows;
// int pagecount = this.View.Model.GetEntryRowCount("F_batchprintlist") / rows;
var num = this.View.Model.GetEntryRowCount("F_batchprintlist");//得到记录总数
var totalPage = 0;
var pageSize = rows;//一页显示pageSize条记录
//计算总页数
if (num / pageSize > Convert.ToInt32(num / pageSize))
{
totalPage = Convert.ToInt32(num / pageSize) + 1;
}
else
{
totalPage = Convert.ToInt32(num / pageSize);
}
//当前页数
var currentPage = pageindex+1;
//获取当前页第一条、最后一条记录的行号
int startRow = (currentPage - 1) * pageSize + 1;
int endRow = currentPage * pageSize;
endRow = (endRow > num) ? num : endRow;
2. 批量套打实现具体过程:
List<PrintJob> jobs = new List<PrintJob>();
for (int i = startRow-1; i < endRow; i++)
{
currrecordkey = this.View.Model.GetEntryPKValue("F_batchprintlist", i).ToString();
PrintJobItem print = new PrintJobItem();
print.BillId = this.View.Model.GetPKValue().ToString();
print.FormId = this.View.BillBusinessInfo.GetForm().Id;//业务对象ID
print.TemplateId = GetSingleNoteID();//套打模板
List<string> lst = new List<string>();
lst.Add(currrecordkey);
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);
注意:必须要获取套打模板,获取套打模板方法:
/// 获取账表套打设置的模板ID
/// </summary>
/// <returns></returns>
public string GetSingleNoteID()
{
var templateID = string.Empty;
if (this.SettingInfo != null)
{
foreach (Dictionary<string, object> obj in this.SettingInfo)
{
if (!obj["key"].IsNullOrEmptyOrWhiteSpace()
&& obj["key"].Equals("reportNote")
&& !obj["value"].IsNullOrEmptyOrWhiteSpace()
&& !obj["value"].Equals("empty"))
{
//套打配置的模版
templateID = obj["value"].ToString();
break;
}
if (obj["key"].IsNullOrEmptyOrWhiteSpace()
&& !obj["value"].IsNullOrEmptyOrWhiteSpace()
&& !obj["value"].Equals("empty"))
{
//套打配置的模版
templateID = obj["value"].ToString();
}
}
}
//templateID = CheckTemplateID(templateID);
if (templateID.IsNullOrEmptyOrWhiteSpace())
{
//获取设计时配置的套打模板
templateID = this.View.BusinessInfo.GetForm().Note;
}
return templateID;
}
3. 如果需要干预打印数据包中的数据时可以在 public override void OnPrepareNotePrintData(BOS.Core.DynamicForm.PlugIn.Args.PreparePrintDataEventArgs e)
方法里进行执行干预,比如我现在需要将单据体里某个字段值动态赋值。
if (e.DataObjects != null)
{
DynamicObjectType dt = e.DataObjects[0].DynamicObjectType;
DynamicObject obj1 = new DynamicObject(dt);
foreach (var p in e.DataObjects[0].DynamicObjectType.Properties)
{
obj1[p] = e.DataObjects[0][p];
obj1["FemployeePINYIN"] = Pinyin.GetPinyin(e.DataObjects[0]["Femployeename"].ToString()).ToUpper();
}
e.DataObjects = new DynamicObject[] { obj1 };
}
这样我们很多插件实现动态扩展及处理的话,都可以在public override void OnPrepareNotePrintData(BOS.Core.DynamicForm.PlugIn.Args.PreparePrintDataEventArgs e)方法里进行处理。
推荐阅读