公司现阶段使用的各个系统中有很多都是使用RF扫码枪进行业务操作,因此学会利用现有系统框架开发能在RF扫码枪上使用的业务功能非常有必要。

1 打开Telnet服务

使用Win+R快捷键打开命令窗口,输入以下内容(这里以jac_parts_wms系统中的RF为例,不同的系统输入的网址和端口号是不一样的)。

其中,telnet是协议名 “192.168.10.92”是IP地址,6666是服务端口(配置端口的文件是standardListener.properties)。点击“确定”按钮,进入到telnet登录界面:

输入用户名和密码,按键盘上的“↑”键或者“↓”键切换仓库,
就进入到了模拟RF扫码枪操作的主界面。


主界面上的各种功能就是我们要开发的功能。接着我们来讲解公司现有系统的RF功能的开发步骤:

2 RF功能开发步骤

2.1配置功能菜单

首先要在kangarooMenu.xml中的Menu标签中配置在telnet主界面上显示的功能菜单。
举例说明:

<Item name="signScanPickContainerShell" title="器具签收" location="signScanPickContainerShell" />

上述配置了一个器具签收的功能菜单,配置好之后,就会在telnet主界面上显示如下内容:

配置bean

我们编写的每一个shell文件都是java文件,由于使用了Spring框架对所有的java对象进行管理,因此要配置bean。公司现有系统都是在shellContext.xml中对RF操作的java类进行配置。
这里还是以器具签收为例:

<bean id="wmsPutAsnScanShell" parent="abstractShell" class="com.vtradex.wms.server.telnet.shell.putaway.WmsPutAsnScanShell" singleton="false"><constructor-arg index="0"><ref bean="wmsPutawayRFManager"/></constructor-arg><constructor-arg index="1"><ref bean="wmsReceivingRFManager"/></constructor-arg></bean>

上述代码中还使用构造函数的方式进行了bean的依赖注入操作,这里不再详述,需要依赖注入可以按上述代码的注入方式进行注入即可。

2.3 编写shell

要在对应的项目文件夹下编写一个名为XXXShell类的java文件。按照继承的父类的不同,目前遇到的shell文件有这么三种:

shell父类 作用
YzBaseShell 一般用于用户输入的code或者ID等
JacPageableBaseShell 用于批量展示业务数据,可以选择某条数据
Thorn4BaseShell 展示每一条业务数据,并可以输入数量等字段

2.3.1 XXXshell继承YzBaseShell

这里以jac_parts_wms系统中RF操作的器具签收功能为例:
签收界面:

代码如下:

package com.vtradex.wms.server.telnet.shell.view;import java.io.IOException;
import java.util.Map;import net.wimpi.telnetd.net.Connection;import org.apache.commons.lang.StringUtils;import com.vtradex.kangaroo.shell.BreakException;
import com.vtradex.kangaroo.shell.ContinueException;
import com.vtradex.kangaroo.shell.ShellFactory;
import com.vtradex.wms.server.model.base.BaseStatus;
import com.vtradex.wms.server.telnet.pick.WmsPickRFManager;
import com.vtradex.wms.server.telnet.shell.ShellExceptions;
import com.vtradex.wms.server.telnet.shell.YzBaseShell;
import com.yc.utils.common.MyUtils;
/**器具签收*/
public class SignScanPickContainerShell extends YzBaseShell{public static final String PAGE_ID = "signScanPickContainerShell";public static final String BOX_TAG = "BOX_TAG";public static final String ERROR = "";private final WmsPickRFManager pickRFManager;public SignScanPickContainerShell(WmsPickRFManager pickRFManager) {this.pickRFManager = pickRFManager;}@Overrideprotected void mainProcess(Connection connection) throws BreakException,ContinueException, IOException, Exception {String messge = "成功";String boxTag = (String) this.getParentValue(BOX_TAG);if(boxTag==null){boxTag = this.getTextField("scan.boxTag");if (StringUtils.isEmpty (boxTag) || BaseStatus.NULLVALUE.equals(boxTag)) {this.setStatusMessage(ShellExceptions.ERROR_OVER);}boxTag = boxTag.trim();if(MyUtils.OVER.equals(boxTag)){forward(ShellFactory.getMainShell());}Map<String,String> result = pickRFManager.checkBoxTag(boxTag);if(!result.get(ERROR).isEmpty()){messge = result.get(ERROR);this.forward(SignScanPickContainerShell.PAGE_ID, messge);}else{messge = "选择序号";this.put(BOX_TAG, boxTag);this.forward(ViewScanPickContainerDetailShell.PAGE_ID, messge);}}}}

代码讲解如下图:

对上图补充一点:boxTag = this.getTextField("scan.boxTag");代码中那个的scan.boxTag是自定义的,并且要对其国际化。国际化如下:
新建一个和XXXShell_zh.properties的文件,在该文件中编写需要国际化的字段。

2.3.2 XXXshell继承JacPageableBaseShell

该界面主要用于展示,有点类似于表格的概念。话不多说,直接上图:

代码如下:

package com.vtradex.wms.server.telnet.shell.view;import java.util.HashMap;
import java.util.Map;import com.vtradex.wms.server.telnet.shell.JacPageableBaseShell;public class ViewScanPickContainerDetailShell extends JacPageableBaseShell{public static final String PAGE_ID = "viewScanPickContainerDetailShell";public static final String TASK_ID = "TASK_ID";public static final String ITEM_CODE = "ITEM_CODE";public static final String ITEM_NAME = "ITEM_NAME";public static final String MOVED_QUANTITY = "MOVED_QUANTITY";public static final String PRODUCT_LINE = "PRODUCT_LINE";@Overridepublic String[] getTableHeader() {return new String[]{"序号","物料编码","物料名称","数量","产线"};}@Overridepublic String getHql() {String hql = " SELECT task.id" +",task.moveDocDetail.item.code" +",task.moveDocDetail.item.name" +",task.movedQuantityBU" +",task.moveDocDetail.productionLine" +" FROM WmsTask task" +" WHERE task.signTime is null" +" /~BOXTAG: AND task.boxTag = {BOXTAG}~/";  return hql;}@Overridepublic String getNextShell() {Object[] rowData = (Object[])get(ROW_DATA_KEY);String boxTag = (String) this.getParentValue(SignScanPickContainerShell.BOX_TAG);this.put(TASK_ID, rowData[0]);this.put(ITEM_CODE, rowData[1]);this.put(ITEM_NAME, rowData[2]);this.put(MOVED_QUANTITY, rowData[3]);this.put(PRODUCT_LINE, rowData[4]);this.put(SignScanPickContainerShell.BOX_TAG, boxTag);return SignScanPickContainerDetailShell.PAGE_ID;}@Overridepublic String getUpShell() {return SignScanPickContainerShell.PAGE_ID;}@Overridepublic Map<String, Object> getParams() {Map<String, Object> params = new HashMap<String, Object>();String boxTag = (String) this.getParentValue(SignScanPickContainerShell.BOX_TAG);params.put("BOXTAG", boxTag);return params;}}

代码讲解如下:

2.3.3 XXXshell继承Thorn4BaseShell


代码如下:

package com.vtradex.wms.server.telnet.shell.view;import java.io.IOException;
import java.util.Map;import org.apache.commons.lang.StringUtils;import net.wimpi.telnetd.net.Connection;import com.vtradex.kangaroo.shell.BreakException;
import com.vtradex.kangaroo.shell.ContinueException;
import com.vtradex.kangaroo.shell.Thorn4BaseShell;
import com.vtradex.wms.server.telnet.pick.WmsPickRFManager;
import com.vtradex.wms.server.telnet.shell.ShellExceptions;
import com.yc.utils.common.JavaTools;
import com.yc.utils.common.MyUtils;public class SignScanPickContainerDetailShell extends Thorn4BaseShell{public static final String PAGE_ID = "signScanPickContainerDetailShell";private final WmsPickRFManager pickRFManager;public static final String ERROR = "ERROR";public SignScanPickContainerDetailShell(WmsPickRFManager pickRFManager) {this.pickRFManager = pickRFManager;}@Overrideprotected void mainProcess(Connection connection) throws BreakException,ContinueException, IOException, Exception {String messge = "";Long taskId = (Long)this.getParentValue(ViewScanPickContainerDetailShell.TASK_ID);String boxTag = (String) this.getParentValue(SignScanPickContainerShell.BOX_TAG);String itemCode = (String) this.getParentValue(ViewScanPickContainerDetailShell.ITEM_CODE);String itemName = (String) this.getParentValue(ViewScanPickContainerDetailShell.ITEM_NAME);String productLine = (String) this.getParentValue(ViewScanPickContainerDetailShell.PRODUCT_LINE);double quantity = (Double) this.getParentValue(ViewScanPickContainerDetailShell.MOVED_QUANTITY);output("物料编码",itemCode);output("物料名称",itemName);output("产线",productLine);output("数量",String.valueOf(quantity));String value = this.getTextField("task.signQty");Double signQuantityBU = 0D;if(StringUtils.isEmpty(value)){signQuantityBU = quantity;}else{if(MyUtils.OVER.equals(value)){messge = "选择序号";this.put(SignScanPickContainerShell.BOX_TAG, messge);this.forward(ViewScanPickContainerDetailShell.PAGE_ID,messge);}if(!JavaTools.isNumber(value)){messge = "失败!签收数量不合法!00返回上一级";this.setStatusMessage(messge);}signQuantityBU = JavaTools.stringToDouble(value);if(signQuantityBU<0 || signQuantityBU>quantity){messge = "失败!签收数量不合法!00返回上一级";this.setStatusMessage(messge);}}try {Map<String,String> results = pickRFManager.signScanPickContainerDetail(taskId,signQuantityBU);if(!StringUtils.isEmpty(results.get(ERROR))){messge = results.get(ERROR);this.put(SignScanPickContainerShell.BOX_TAG, messge);this.forward(ViewScanPickContainerDetailShell.PAGE_ID,messge);}} catch (Exception e) {e.printStackTrace();this.reset(e.getMessage());}//验证器具单明细是否全部签收 Map<String,String> results = pickRFManager.checkBoxTag(boxTag);if(!StringUtils.isEmpty(results.get(ERROR))){messge = "签收完成,继续扫码";this.forward(SignScanPickContainerShell.PAGE_ID,messge);}messge = "选择序号";this.put(SignScanPickContainerShell.BOX_TAG, boxTag);this.forward(ViewScanPickContainerDetailShell.PAGE_ID,messge);}}

代码讲解如下:


RF功能开发的大致流程就是以上这些,关于RF开发的内容还有很多没有讲到,可自行查看源码分析学习。如有不正确的地方,请各位批评指正,不胜感激!!!

工作之RF功能开发入门相关推荐

  1. 《Android 开发入门》我为什么要在Android找工作越来越难的时候开始学习它

    近期一方面是所在的公司招聘Java开发人员很难招到合适的,投简历的人很少:而另一方面,经常听身边的人说Android.iOS方面找工作不好找,特别是没什么经验的,经验比较少的!说是不好找,但在我家所在 ...

  2. 网站的工作原理:网络开发新手(或任何人)入门

    网站的工作原理:网络开发新手(或任何人)入门 如果您刚接触Web开发,您认为自己知道网络的工作原理 - 至少在基本层面上. ...但是,当您尝试解释一个网站为什么出现空白. 什么是IP地址? &quo ...

  3. iOS开发入门——模拟器方向判断及基本功能

    iOS开发入门--模拟器方向判断及基本功能 方向判断简单实用 手机模拟器吧,嗯...很多时候我们可能会遇到手机横屏之后图像没变的情况,嗯?怎么回事?这次我们就先来看看这种情况,做一个简单的判断. im ...

  4. ArcEngine C# GIS开发入门作业 (二)Ex03——基本应用程序生成,右击菜单实现:显示、移除和打开属性表功能

    ArcEngine C# GIS开发入门作业 (二)Ex03--基本应用程序生成,右击菜单实现:显示.移除和打开属性表功能 这篇文章转自我舍友的文章,没有他的帮忙以我的基础和水平这个学期肯定学不懂AE ...

  5. android 艾特功能实现,IOS开发入门之iOS反编译实例之hook微信艾特所有人功能实现...

    本文将带你了解IOS开发入门iOS反编译实例之hook微信艾特所有人功能实现,希望本文对大家学IOS有所帮助. 研究了一段时间反编译逆向工程,只是略微了解了一些皮毛,最近忙的事情太杂,就简单写一下吧. ...

  6. python开发web项目_Django2:Web项目开发入门笔记(20)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这一篇教程,我们一起来了解如何在CentOS系统中将Django2的Web项目部署到Nginx服务器. CentOS系统虽然和Ubuntu系统都是Linu ...

  7. 华为云14天鸿蒙设备开发-Day7WIFI功能开发

    目录 前言 一.WiFI编程简介 主要API简介 二.开发流程 1.AP与STA模式区别 2.AP热点开发流程 3.STA站点开发流程 三.官方案例实现 1. AP 代码编写 编译调试 2. STA ...

  8. unity开发入门_Unity游戏开发终极入门指南

    unity开发入门 Unity is a great tool for prototyping everything from games, to interactive visualisations ...

  9. 《iOS 8应用开发入门经典(第6版)》——第1章,第1.6节小结

    本节书摘来自异步社区<iOS 8应用开发入门经典(第6版)>一书中的第1章,第1.6节小结,作者 [美]John Ray(约翰 雷),更多章节内容可以访问云栖社区"异步社区&qu ...

  10. JSP WEB开发入门基础到高手进阶教程002

    JSP WEB开发入门基础到高手进阶教程 -------开发入门 JSP与微软的Active Server Pages 兼容,但它是使用类似HTML的卷标以及Java程序代码段而不是VBScript. ...

最新文章

  1. 三星s10android10功能,三星S10系列现场上手体验:“安卓机皇”真的名副其实
  2. 海蜘蛛如何手工升级到最新版
  3. 学习记录-Linux图形栈:基于DRM和Wayland
  4. p批处理替换目录下文本中的字符串
  5. kvm虚拟机网络设置隔离模式(一键shell脚本)
  6. 小米bl未解锁变砖了如何刷机_如何安装MIUI 10
  7. 计算机出现全部英文如何解决,电脑打开后出现很多英文怎么处理
  8. AngularJs的TDD
  9. 90 岁程序员,他的压缩算法改变了世界!
  10. spark数据查询语句select_Spark学习之Spark SQL
  11. Jetbrains好用的插件(经验总结)
  12. 摄像头驱动CAMERA SENSOR调试流程
  13. 阿里云服务器安装nodejs
  14. 如何高效处理面板数据
  15. 如何快速撰写文章—伪原创
  16. python qq自动发消息软件_Python之qq自动发消息的示例代码
  17. win10电脑连接蓝牙请检查PIN并重新连接
  18. 安卓5.1自带浏览器主页设置–转载
  19. NYOJ1237 第八届acm省赛 B最大岛屿
  20. 【雕虫小技第1篇】如何将Scratch项目(转换)打包为一个HTML文件

热门文章

  1. 2021-12-06 自动化专业C语言上机作业参考答案12
  2. 城市大脑标准体系与评价指标总体框架
  3. 世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
  4. 安装KeMotion3 03.16d时遇到的问题
  5. Java实现POS打印机无驱打印(转)
  6. 常用HSQL汇总(不定时添加)
  7. SQL 数据库语句练习
  8. html使用iframe包含pdf文件,react项目利用iframe显示pdf文件并打印
  9. android截屏加水印,Android截图以及加水印Demo
  10. Java之HTTP长连接