1.需求
在金蝶k3/cloud中有原生的打印功能,有套打设置,可以选择相应的套打模板,打印出相应的模板,但是有一个需求是这样的,他要打印明细信息里面选中的一行信息,选择相应的套打模板,点击打印,打印出这一行信息的模板呢?
首先我们要先想明白要怎么做,然后在开始写
第一步 我们首先要获取套打设置里面选中的模板,以前这个功能都是金蝶原生插件自带的,现在需要我们实现获取。
第二部 获取到了之后,怎么把明细里面的其他行给过滤掉,因为我们只打印选中的一行,那么其他行肯定要过滤掉。
那我们首先看第一步,我那时想的是,既然金蝶的原生插件有获取套打设置里面选中模板的插件,我为何不拿来用,于是我用了反编译工具ilspy_cn把金蝶原始插件给反编译了,反编译效果如下
很明显,图上这个方法就是获取套打模板的方法,因为下面有判断text为空,则报异常:请先设置套打模板设置
于是我把GetSysReportNoteID() copy了出来,放到我的代码里面
//获取套打模板的信息 任务3114
public JSONArray GetSettingInfo()
{
JSONArray result = null;
string id = this.View.BillBusinessInfo.GetForm().Id;
string text = UserParamterServiceHelper.Load(this.View.Context, "NotePrintSetup" + id.ToUpper().GetHashCode().ToString(), this.View.Context.UserId, "");
if (string.IsNullOrWhiteSpace(text))
{
text = UserParamterServiceHelper.Load(this.View.Context, "NotePrintSetup" + id.ToUpper().GetHashCode().ToString(), -1L, "");
}
if (string.IsNullOrWhiteSpace(text))
{
text = UserParamterServiceHelper.Load(this.View.Context, "NotePrintSetup" + id.GetHashCode().ToString(), this.View.Context.UserId, "");
}
text = text.FixedOrcalXMLString();
if (!string.IsNullOrWhiteSpace(text) && text != "<Root />")
{
result = new JSONArray(text);
}
return result;
}
//获取套打模板的TemplateId 任务3114
public string GetSysReportNoteID(string FBILLTYPEID)
{
string text = string.Empty;
JSONArray settingInfo = this.GetSettingInfo();
if (settingInfo != null)
{
using (List<object>.Enumerator enumerator = settingInfo.GetEnumerator())
{
while (enumerator.MoveNext())
{
Dictionary<string, object> dictionary = (Dictionary<string, object>)enumerator.Current;
object obj = dictionary["key"];
object obj2 = null;
if (dictionary.ContainsKey("value"))
{
obj2 = dictionary["value"];
if (obj != null)
{
if (obj.ToString() == FBILLTYPEID)
{
return obj2.ToString();
}
}
}
}
}
}
return text;
}
可以看到返回的text就是套打模板的唯一标识,拿到这个唯一标识之后,就可以告诉别人我要打印这个模板
List<PrintJobItem> printInfoList = new List<PrintJobItem>();
PrintJobItem printInfoItem = new PrintJobItem();
printInfoItem.BillId = FID;//单据编码
printInfoItem.FormId = this.View.BillBusinessInfo.GetForm().Id;//单据的fromId标识
string tetet = GetSysReportNoteID(BillTypeId);//这个就获取到了套打模板的唯一标识
if (tetet != "" && tetet != null)
{
printInfoItem.TemplateId = tetet;//把唯一标识赋值给TemplateId
isOrgAndBillType = true;
}
printInfoItem.SortString = "";
printInfoList.Add(printInfoItem);
string key = Guid.NewGuid().ToString();//唯一id
this.View.Session[key] = printInfoList;
JSONObject jsonObj = new JSONObject();
jsonObj.Put("pageID", this.View.PageId);//页面id
jsonObj.Put("printJobId", key);
jsonObj.Put("action", "preview");//预览--printType赋值为"preview";打印--printType赋值为"print"
string action = "printPreview";
jsonObj.Put("printBarName", null);
this.View.AddAction(action, jsonObj);//告诉视图
这样做了之后,你就等于告诉了金蝶说,我要打印这个模板,下一步怎么把明细里面的其他行给过滤掉,只打印其中一行
public override void OnPrepareNotePrintQueryParam(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PrepareNotePrintQueryParamEventArgs e)
要重写一个方法,上面这个方法是打印预览之前查询参数
if (e.DataSourceId.Equals("F_XT_CardEntity", StringComparison.OrdinalIgnoreCase))//判断是哪个单据体
{
//获取单据体的选中行
int[] rowIndexs = this.View.GetControl<EntryGrid>("F_XT_CardEntity").GetSelectedRows();
string strSql = "";//要显示的行
for (int i = 0; i < rowIndexs.Length; i++)
{
int rowIndex = rowIndexs[i];
strSql = strSql + "'" + (rowIndex + 1) + "'";
}
//过滤选中单牌卡明细分录 FSeq 是序号 每个分录都有需要 我们按序号过滤就行了
parameter.FilterClauseWihtKey = "FSeq IN (" + strSql + ")";
}
实现的效果如下
如果有正在做,但是不明白的朋友,欢迎咨询哦,我们一起讨论呢。也可以关注一下我的公众号 楼梯间的男孩 我会把工作中遇到的难点,以及解决办法发布到我的公众号上面哦,希望跟大家共同学习,每天进步一点点,生活会更好。
看累了可以尝尝我们大湖南的特产芷江鸭哦!!!