11到20带圈序号怎么打_金蝶k3/cloud 打印套打模板插件实操

本文介绍了如何在金蝶K3/Cloud中实现根据用户选择打印明细信息中特定行的套打模板,包括通过反编译获取套打模板ID,以及在OnPrepareNotePrintQueryParam方法中过滤多余行的操作。
摘要由CSDN通过智能技术生成

24f147e37803212ad753a883d6b7a028.png

1.需求

在金蝶k3/cloud中有原生的打印功能,有套打设置,可以选择相应的套打模板,打印出相应的模板,但是有一个需求是这样的,他要打印明细信息里面选中的一行信息,选择相应的套打模板,点击打印,打印出这一行信息的模板呢?

4f89378026e3cb6eb43525f4b0d53be5.png

首先我们要先想明白要怎么做,然后在开始写

第一步 我们首先要获取套打设置里面选中的模板,以前这个功能都是金蝶原生插件自带的,现在需要我们实现获取。

第二部 获取到了之后,怎么把明细里面的其他行给过滤掉,因为我们只打印选中的一行,那么其他行肯定要过滤掉。

那我们首先看第一步,我那时想的是,既然金蝶的原生插件有获取套打设置里面选中模板的插件,我为何不拿来用,于是我用了反编译工具ilspy_cn把金蝶原始插件给反编译了,反编译效果如下

4ff8c54730ca74e8172c79a584f44604.png

很明显,图上这个方法就是获取套打模板的方法,因为下面有判断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 + ")";

}

实现的效果如下

cb54e3907f56e5e392e89237fec41c35.png

如果有正在做,但是不明白的朋友,欢迎咨询哦,我们一起讨论呢。也可以关注一下我的公众号 楼梯间的男孩 我会把工作中遇到的难点,以及解决办法发布到我的公众号上面哦,希望跟大家共同学习,每天进步一点点,生活会更好。

看累了可以尝尝我们大湖南的特产芷江鸭哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值