MES智慧车间-新柔性产线(包装扫描汇报)-包装箱SN号打印(目前支持云星空8.2版本)原创
金蝶云社区-popcat
popcat
8人赞赏了该文章 361次浏览 未经作者许可,禁止转载编辑于2023年12月05日 14:06:58

MES智慧车间-新柔性产线(包装扫描汇报)-SN号条码打印插件

      我这里没有环境,我暂且借着BOS设计器里面的单据为大家讲述一下关于这个打印插件的开发,其实这个过程还蛮曲折的,因为没有做过,甚至是第一次接触打印机,所以耗费了很长时间,废话不多说,直接进入正题!!


如果对柔性产线有一定的了解的小伙伴应该知道这张单据

image.png

一般我可以选择打印箱号,关于箱号的打印方式,有官方的文档可以看一下

金蝶云星空V8.0企业版产品培训文档 (kingdee.com)

image.png

我们的需求是这样的我想打出来这样的一个格式

image.png

但是在看完官方文档之后,我发现一个事情SN号无法绑定

此时我遇到了第一个难题

SN号怎么获取(SN号的数据存储在缓存中)

这个问题求助了总部老师出了一个补丁,解开发现里面更新了一个dll,我已经放附件里面了,在写插件之前记得要替换掉根目录下的dll,当然,别忘记把自己原来的做好备份哦(目前只支持云星空8.2版本)


获取完SN号,我就在社区里找到了好几个关于更改套打数据的插件,但是都不是移动端的,然后我就仿照着写了一个,不出意外的没效果


然后我就想到一个最原始的方法,既然都是用打印机打印的,那么一定有发送指令的地方,我直接构建指令不就好了

于是我就带着我的反编译工具,对这张表单的表单插件下手了

功夫不负有心人,终于被我找到了放打印机指令的地方


具体细节(需要懂一点ZPL打印指令)

我的做法是找到打印箱号按钮所调用的方法,一层一层的拨开迷雾,然后我新加了一个按钮,把原来的打印箱号的方法拿过来,在调用打印方法之前把指令插入到指令集合里面,下面是源码

[System.ComponentModel.Description("包装扫描替换表单插件")]
    [HotUpdate]
    public class Class5 : FlexiblePackageEdit
    {
        public override void ButtonClickWithAuth(ButtonClickEventArgs e)
        {

            base.ButtonClickWithAuth(e);
            switch (e.Key.ToUpper())
            {

                case "F_BLN_BUTTON":
                    this.PrintBoxByRpt(uiParamTransInfo.BoxNumber, "02");
                   
                    break;
            }

        }
        //下面的方法都是原方法基础上做了改动,大家可以自行反编译查看
        protected void PrintBoxByRpt(string boxNumber, string tempType)
        {
            if (ObjectUtils.IsNullOrEmptyOrWhiteSpace(boxNumber))
            {
                base.View.ShowStatusBarInfo(ResManager.LoadKDString("箱号为空,不能进行箱号打印!", "015747000040086", SubSystemType.MFG));
                return;
            }
            SFSPrintBoxByRptParam sFSPrintBoxByRptParam = new SFSPrintBoxByRptParam();
            sFSPrintBoxByRptParam.BoxNumber = boxNumber;
            sFSPrintBoxByRptParam.TempType = tempType;
            SFSPrintBoxByRptParam paramValue = sFSPrintBoxByRptParam;
            InitParamValue(paramValue);
            SFSParamInfo<SFSPrintBoxByRptParam> sFSParamInfo = new SFSParamInfo<SFSPrintBoxByRptParam>();
            sFSParamInfo.RequestId = SequentialGuid.NewGuid().ToString();
            sFSParamInfo.UserToken = base.Context.UserToken;
            sFSParamInfo.ApiName = "PrintBoxByRpt";
            sFSParamInfo.ApiDescription = ResManager.LoadKDString("根据汇报单打印箱号", "015747000015534", SubSystemType.MFG);
            sFSParamInfo.ParamValue = paramValue;
            SFSParamInfo<SFSPrintBoxByRptParam> paramInfo = sFSParamInfo;
            SFSReturnInfo<SFSPrintBoxResult> sFSReturnInfo = SFSWebServiceHelper.ExecuteService<SFSPrintBoxByRptParam, SFSPrintBoxResult>(base.Context, paramInfo);
            //
            List<string> snString = SFSPrintUtils.GetRptTaskCachePrdSerialNoByBoxNumber(this.Context, boxNumber);//此处为总部老师提供的插件内的方法,获取缓存中的SN序列号,
            下面从开始标记,到结束标记之间的代码是自行构建的基础,需要有一定的ZPL打印指令基础
            下面这段实现的功能为(一行两列,一张三行,溢出换纸张)

            //List<string> list = new List<string>();
            if (snString.Count > 6)//开始
            {
                List<string> demo1 = new List<string>();
                for (int i = 0; i < 6; i++)
                {
                    demo1.Add(snString[i]);
                }
                string zpl1 = Demoo.ZPLDemo(demo1);
                //list.Add(zpl1);
                sFSReturnInfo.ReturnValue.PrintInfo.Add(zpl1);
                List<string> demo2 = new List<string>();
                for (int i = 6; i < snString.Count; i++)
                {
                    demo2.Add(snString[i]);
                }
                string zpl2 = Demoo.ZPLDemo(demo2);
                //list.Add(zpl2);
                sFSReturnInfo.ReturnValue.PrintInfo.Add(zpl2);

            }
            else
            {
                string zpl = Demoo.ZPLDemo(snString);
                //list.Add(zpl);
                sFSReturnInfo.ReturnValue.PrintInfo.Add(zpl);
            }//结束


            //Demoo.Print(base.View, list, list.Count);
            //
            this.Print(sFSReturnInfo);
            base.View.ShowStatusBarInfo(sFSReturnInfo.Message);
        }
        protected void Print(SFSReturnInfo<SFSPrintBoxResult> resultInfo)
        {
            if (resultInfo.ReturnValue != null)
            {
                Class5.Print(base.Context, base.View, resultInfo);
            }
        }
        public static void Print(Context ctx, IMobileView view, SFSReturnInfo<SFSPrintBoxResult> resultInfo)
        {
            if (resultInfo.ReturnValue != null)
            {
                Class5.Print(view, resultInfo.ReturnValue.PrintInfo, resultInfo.ReturnValue.PrintCount);
            }
        }
        public static void Print(IMobileView view, List<string> printInfo, int printCount)
        {
            view.MobileNotePrint(printInfo);
            return;

        }
    }

至此,我就实现了我的打印需求!!

中间还踩了很多坑,说多了都是泪,有需要的小伙伴可以参考一下,拒绝踩坑!!

少了一个方法,补一下

        /// <summary>
        /// 构建自定义ZPL打印指令
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public static string ZPLDemo(List<string> list = null)
        {
            StringBuilder builder = new StringBuilder();
            builder.AppendLine("^XA");
            int x = 150;//横坐标
            int y = 70;//纵坐标
            bool staus = true;
            for (int i = 0; i < list.Count; i += 2)
            {
                if (staus == true)
                {
                    builder.AppendLine($"^FO{x},{y}^BY2^BCN,100,Y,N,N");
                    builder.AppendLine($"^FD{list[i]}^FS");
                    if (i + 1 < list.Count)
                    {
                        builder.AppendLine($"^FO{x += 400},{y}^BY2^BCN,100,Y,N,N");
                        builder.AppendLine($"^FD{list[i + 1]}^FS");
                    }

                    staus = false;
                }
                else
                {
                    builder.AppendLine($"^FO{x -= 400},{y += 170}^BY2^BCN,100,Y,N,N");
                    builder.AppendLine($"^FD{list[i]}^FS");
                    if (i + 1 < list.Count)
                    {
                        builder.AppendLine($"^FO{x += 400},{y}^BY2^BCN,100,Y,N,N");
                        builder.AppendLine($"^FD{list[i + 1]}^FS");
                    }
                    x -= 400;
                    y += 170;
                    staus = true;
                }

            }

            builder.AppendLine("^XZ");
            return builder.ToString();
        }


赞 8