VIP用户交流群:462197261 收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
在线客服:78895949
tonglan
  • 当前位置:
  • 生产制造追溯系统之再说条码打印

    前言

    在之前的博客中我介绍了如何实现生产现场的条码打印,我们的生活中到处都是条码,一维码、二维码随处可见,更别说一家从事生产制造加工的工厂了,而条码种类繁多、离线打印等情况就直接导致了条码管控上的难度,甚至会出现较为严重的品质事件,上一个版本中我是通过Web应用程序调用 WinForm 中的函数进行打印,WinForm中嵌套了 WebBrowser 来浏览网页,通过这几年的实际运用,这个方法基本能够满足大部分需求,但还是美中不足,由于 WebBrowser 所示用的浏览器内核比较低,导致很多样式无法兼容,尽管网络上有一些方法去改变这个问题(比如webkit,cef,修改注册表等等),但总是或多或少有一些问题。

    新的方案,告别 WinForm & WebBrowser

    我们本次以生产线 卡通包装 工位为例,进行描述:

    通常情况下,操作员会扫描多个彩盒条码,这个扫描的数量一个到多个不等,每一个彩盒上面都有一个唯一的条形码或二维码,当彩盒扫描完成以后需要结束装箱,此时系统应该直接将对应的卡通标贴打印出来,操作员从打印机上撕下卡通标贴并贴于卡通箱,在此之前我们需要提前将卡通标贴的打印模板制作出来并上传至系统中,操作界面如下,支持同一个产品打印多张标贴:

    此时,我们需要编写一个 Api 来获取服务器上面的模板文件以及需要打印出来的数据列表,关键代码如下:

    string ServerUrl = XmlHelper.GetXmlReader(path, "Config", "Server");
      string Api = XmlHelper.GetXmlReader(path, "Config", "Api");
      //通过 API 获取模板文件*******************************************************************
      string _Btw_Url = Api + "?action=get_carton_label&carton_sn=" + _carton_sn;
      HttpHelper http_btw = new HttpHelper();
      //创建Httphelper参数对象
      HttpItem item_btw = new HttpItem()
      {
      URL = _Btw_Url,//URL必需项 
      ContentType = "application/json", 
      };
      HttpResult req_result_btw = http_btw.GetHtml(item_btw);  
      string btw_str = req_result_btw.Html;
      JObject obj_btw = (JObject)JsonConvert.DeserializeObject(btw_str);
      DataTable dt = Library.JsonLib.ToDataTable(obj_btw["msg"].ToString());
      //通过 API 获取模板文件*******************************************************************
    WebClient web = new WebClient();  
      string _Api_Url = Api + "?action=get_carton_print_list&carton_sn=" + _carton_sn;
      HttpHelper http_data_list = new HttpHelper();
      //创建Httphelper参数对象
      HttpItem item_data_list = new HttpItem()
      {
      URL = _Api_Url,//URL必需项 
      ContentType = "application/json", 
      };
      HttpResult req_result_data_list = http_data_list.GetHtml(item_data_list); 
      string print_str = req_result_data_list.Html; 
      JObject obj = (JObject)JsonConvert.DeserializeObject(print_str);
      string _Key = obj["msg"]["key"].ToString();
      string _Value = obj["msg"]["value"].ToString(); 
      string splitKey = "*";
      string[] keys = _Key.Split(splitKey.ToCharArray(), StringSplitOptions.None);
      string[] values = _Value.Split(splitKey.ToCharArray(), StringSplitOptions.None);
      for (int i = 0; i < dt.Rows.Count; i++)
      {
      _file_url = ServerUrl + "app/cartonlabel/" + dt.Rows[i]["LABEL_FILE"].ToString();
      _file_name = System.Guid.NewGuid().ToString() + "_" + dt.Rows[i]["LABEL_FILE"].ToString();
      web.DownloadFile(_file_url, _directory + _file_name);
      _print();
      }

    Api 编写完成之后我们进行发布,发布到本地指定一个文件夹留作备用,现在我们还差一步,那就是如何通过网页在客户端本地打印?大家都知道我们的网站是部署在服务器而非客户端本地的,但是打印的条码必须出现在客户端本地的打印机,此时你可以考虑通过网络共享打印机的办法来实现,但是这种方法非常不稳定,一些安全方面的设置就足以让你内流满面,因此我们可以考虑使用CassiniDev 来实现,大致思路如下:

    • 新建一个批处理或者其它类型的程序。
    • 在项目中引用CassiniDev 文件至。
    • 在本地new一个服务实例并启动。

    通过如下代码即可启动该服务:

    new Server(9001, "/", System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Service"), System.Net.IPAddress.Parse("127.0.0.1"), "", 0, false, false);

    在包装之前我们将该服务启动起来,我做了一个简单的界面,如下图所示:

    此时,我们需要用到上一步发布的 Api,将发布的 Api 文件拷贝至Service目录,这个Service目录在这个批处理程序的根目录下面,至此所有的前期工作已经做完了,现在只需要调用本地这个Api 即可。我们选择 MO-00002 这个工单进行演示:

    下面开始扫描条码进行包装,该产品的包装容量为每一个卡通箱需要包装 4 个彩盒。

    系统提示打印命令发送成功的时候,我们的打印机已经自动将标贴打印出来了,如下图所示:

    结论

    相对之前的 WebBrowser,目前这种方式可以更好的兼容样式表,比如H5,再就是同一套系统不用分为网页端与客户端,尽管打开的是同一个网站;维护起来也要更加方便。

    以上所述是小编给大家介绍的生产制造追溯系统之再说条码打印,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对北冥有鱼网站的支持!

    您可能感兴趣的文章:

    • 生产制造追溯系统之再说条码打印
    • 生产制造追溯系统之在线打印功能

    广而告之:
    热门推荐:
    Drupal7中常用的数据库操作实例

    1.插入单条记录复制代码 代码如下:db_insert("table")->fields(array('field1' => 'value1', 'field2' => 'value2', 'fieldn' => $valuen))->execute(); 2.插入多条记录复制代码 代码如下:$values[] = array('field1' => 'val1', 'field2' => 'val2···

    express+vue+mongodb+session 实现注册登录功能

    主要实现如下功能: 1. 支持注册,登录功能,用户可以注册完成后,进行登录,登录完成后会进入到列表增删改查页面。 2. 支持session会话,也就是说设置了多长时间登录过期,如果用户没有登录,直接进查询列表页面,会重定向到登录页面去,如果用户登录了后,把浏览器关掉,直接···

    react-native 封装选择弹出框示例(试用ios&android)

    在开发 App 的时候,经常会使用到对话框(又叫消息框、提示框、告警框)。 在web开发中经常会用得到。今天就来介绍了一下react-native 封装弹出框 之前看到react-native-image-picker中自带了一个选择器,可以选择拍照还是图库,但我们的项目中有多处用到这个选择弹出框,所以···

    WordPress中对访客评论功能的一些优化方法

    前几天见到某 Blog (忘记名字和网址了) 有一个相当实用的评论功能. 访客留言之后资料输入框会被隐藏起来, 如同登录了一般. 访客可以选择修改相关资料再进行评论. 给予访客很好的用户体验. 今天我将这个功能移植到了自己的主题上, 制作不难, 分享一下吧. 需求 细心的朋友可能···

    angularjs的select使用及默认选中设置

    我最近在研究angularjs学习的道路上,那么今天也算个学习笔记吧! 1 ng-model="standardCourse.showHours"代替name 2 ng-selected = "1"代替selected="selected",但问题是select下会多出一个无用的option 3 在数据准备时设置,$scope.standardCourse.showHours= '1'; 解决多出···

    JavaScript定义函数

    在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述abs()函数的定义如下: function指出这是一个函数定义; abs是函数的名称; (x)括号内列出函数的参数,多个参数以,分隔; ···

    详解XML中的模式Schema

    文档定义模型为XML文档提供了规范,DTD的引入虽然解决了XML文档的规范化问题,但它文件格式类型和XML文件格式类型不一致,同时DTD提供的数据类型有限有时候无法满足行业的需求,所以引入了Schema。Schema模式可以确定XML文档的元素和属性的结构、元素的顺序、元素和属性的数据···

    js对象实例详解(JavaScript对象深度剖析,深度理解js对象)

    这算是酝酿很久的一篇文章了。 JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕。 平时发的文章基本都是开发中遇到的问题和对最佳解决方案的探讨,终于忍不住要写一篇基础概念类的文章了。 本文探讨以下问题,在座的朋友各取所需···

    php+curl 发送图片处理代码分享

    //上传页面代码 $url = "http://192.168.1.100/upload.php?lang=cn"; #可以get传相应参数 $file = $path.'/'. $Icon; //要上传的文件 $fields['f'] = '@'.$file; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url ); curl_setopt($ch, CURLOPT_RETU···

    mysql中一个普通ERROR 1135 (HY000)错误引发的血案

    今天接到测试人员反应,测试环境前端应用程序无连接mysql数据库,登录mysql服务器,查看错误日志,发现有如下报错: ERROR 1135 (HY000): Can't create a new thread (errno 11);if you are not out of available memory,you can consult the manual for a possible OS-depende···