MES智慧车间-新柔性产线(包装扫描汇报)-包装箱SN号打印(目前支持云星空8.2版本)原创
8人赞赏了该文章
361次浏览
编辑于2023年12月05日 14:06:58
MES智慧车间-新柔性产线(包装扫描汇报)-SN号条码打印插件
我这里没有环境,我暂且借着BOS设计器里面的单据为大家讲述一下关于这个打印插件的开发,其实这个过程还蛮曲折的,因为没有做过,甚至是第一次接触打印机,所以耗费了很长时间,废话不多说,直接进入正题!!
如果对柔性产线有一定的了解的小伙伴应该知道这张单据
一般我可以选择打印箱号,关于箱号的打印方式,有官方的文档可以看一下
金蝶云星空V8.0企业版产品培训文档 (kingdee.com)
我们的需求是这样的我想打出来这样的一个格式
但是在看完官方文档之后,我发现一个事情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(); }
推荐阅读