#星空云诊所#:云诊所-星空深入解析套打二开实现所能解决的一些场景原创
金蝶云社区-云社区用户g7737637
云社区用户g7737637
7人赞赏了该文章 589次浏览 未经作者许可,禁止转载编辑于2022年12月28日 16:02:47

报表及打印是二开中需求最旺盛的,因为几乎每家客户即使标准交互,但报表及打印说不定都会有二开需求,目前有很多开发人员咨询复杂打印的实现,比如有些单据提列表中很多客户希望能打印出相关一些明细内容,有很多如果完全通过配置可能实现不了,那只有通过二开套打插件来实现各种复杂场景,下面就针对套打中如果具体实现进行详细解析,并针对可以干预地方做重点解析,希望能帮助更多开发小伙伴。

一、套打模板一定是针对具体某个要打印的套打模板,套打模板在制作时,数据源需要指向某个单据体,注意打印时需要选择对套打模板。

二、 对于批量打印,注意最好分页,否则预览时可能会出不来。

    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)方法里进行处理。




赞 7