最近中邮小包全折,貌似要死掉一大批小物流公司,因为我们都在持“货”观望。
物流涨价,最直接影响的就是我们这些做小单的,MB幸苦钱全充当运费了!我们不涨价是等死,涨价也是等死!
等死归等死,货还是要发的,订单还是要处理的,一大堆货堆在家里,输单号输到手软,想买个扫描枪,但是想想可能这种情况不会持续太长时间,买了等于浪费。
怎么办呢?首先想到是我那个半拉子ios 扫描程序,如果写下去还要花相当长的时间去继续学习ios,可能等我学好了,我自己也不知道在哪里了。
我搜了搜手机扫描枪的应用,有个叫虫虫扫描枪的,貌似还不错,但是没有地方下载电脑端!白搭。还有另外一个,电脑端是用.NET 2.0 开发的,需要 .NET 2.0的运行库!200多M,还下不来!(老是跳到.NET 3.5),牙的还死嗑 .NET 2.0。
自己写一个吧?ios没学好,android 不会,那只能试试 HTML5 了。以前看过 AppCan 的介绍,就用它写手机端,电脑端用C#做。
手机端主要就是 uexSocketMgr uexScanner 两个对象,没有技术含量,照着示例写就是了。本来想做成多个标签的,一个标签用来设置 socket ,一个标签用来扫描,但是两个标签就是两个网页,A页面的javascript 对象在B页面是不能直接访问的,而且这种应用,一切换标签,另外一个标签就释放了(关闭了)。
AppCan 的模拟器其实是一个Chrome 浏览器,F12可以直接打开调试工具。用这个调试工具看了一下,内容页是通过 iframe 显示的,有 iframe 就可以用 parent ,但是 parent 是哪个页面呢?是一个你不可以访问编辑的页面!
Parent 用不了,那只能在一个页面里又设置Socket 又扫描了。
放上代码供有需要的屌丝参考:
1 <!DOCTYPE html> 2 3 <html class="um landscape min-width-240px min-width-320px min-width-480px min-width-768px min-width-1024px"> 4 5 <head> 6 7 <title></title> 8 9 <meta charset="utf-8"> 10 11 <meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> 12 13 <link rel="stylesheet" href="css/ui-input.css"> 14 15 <link rel="stylesheet" href="css/ui-res.css"> 16 17 <link rel="stylesheet" href="css/ui-btn.css"> 18 19 <link rel="stylesheet" href="css/ui-base.css"> 20 21 <link rel="stylesheet" href="css/ui-box.css"> 22 23 <link rel="stylesheet" href="css/ui-color.css"> 24 25 <script src="js/zy_control.js"></script> 26 27 <script src="js/zy_click.js"></script> 28 29 </head> 30 31 <body class="um-vp c-m15" ontouchstart> 32 33 <div class="ub ub-ver"> 34 35 36 37 <button onclick="uexScanner.open()" ontouchstart="zy_touch('btn-act')" style="width:10em;height:10em;">扫描</button> 38 39 40 41 <!--文本开始--> 42 43 <div class="c-org1 uba uc-a b-gra us-i uinput uinn4"> 44 45 <input placeholder="hello" type="text" class="uc-a" id="result1"> 46 47 </div> 48 49 <!--文本结束--> 50 51 52 53 </div> 54 55 </body> 56 57 <script> 58 59 zy_init(); 60 61 62 63 var createTcpClient = function(ip, port){ 64 65 uexSocketMgr.closeSocket("1"); 66 67 uexSocketMgr.createTCPSocket("1"); 68 69 uexSocketMgr.cbConnected = function(opId,dataType,data){ 70 71 uexScanner.cbOpen = ScannerForSendSuccessCallBack; 72 73 uexSocketMgr.sendData("1","here"); 74 75 } 76 77 uexSocketMgr.setInetAddressAndPort("1",ip , port); 78 79 } 80 81 82 83 var sendData = function(msg){ 84 85 uexSocketMgr.sendData("1", msg); 86 87 } 88 89 90 91 var ScannerFailedCallBack = function(opCode, dataType, data){ 92 93 alert("data:"+data+"opCode:"+opCode+"dataType:"+dataType); 94 95 } 96 97 98 99 100 101 window.uexOnload = function(type){ 102 103 if(!type){ 104 105 uexWindow.setBounce("1"); 106 107 uexWindow.showBounceView("0","#FFF","0"); 108 109 uexWindow.showBounceView("1","#FFF","0"); 110 111 112 113 uexWindow.setReportKey('0', '1'); 114 115 uexWindow.onKeyPressed = function(keyCode){ 116 117 uexWidget.finishWidget(''); 118 119 } 120 121 connect(); 122 123 } 124 125 } 126 127 128 129 var ScannerForConnectSuccessCallBack = function(opCode, dataType, data){ 130 131 var obj = eval('('+data+')'); 132 133 code = obj.code.split(','); 134 135 if (code.length == 2) { 136 137 createTcpClient(code[0], code[1]); 138 139 }else{ 140 141 alert("不能识别"); 142 143 connect(); 144 145 } 146 147 } 148 149 150 151 var connect = function(){ 152 153 alert("请连接电脑端,按如下步骤操作:1,开启电脑端监控软件。2,开始监控。3,扫描电脑端显示的二维码"); 154 155 uexScanner.cbOpen = ScannerForConnectSuccessCallBack; 156 157 uexScanner.open(); 158 159 } 160 161 162 163 var ScannerForSendSuccessCallBack = function(opCode, dataType, data){ 164 165 var obj = eval('('+data+')'); 166 167 $$("result1").value = obj.code; ; 168 169 sendData(obj.code); 170 171 } 172 173 174 175 </script> 176 177 </html>
电脑端的工作就是创建一个 SocktListener 监听客户端传来的消息,代码简单。
用过扫描枪的都知道,扫描的结果可以直接输出到当前活动窗体的当前光标位置。要实现这个功能我第一直觉是模拟键盘按键。但是如果传来的是汉字呢?如果开启了五笔、拼音输入法呢?显然这条路行不通。
还好,WinForm 提供了一个很简单的方法SendKeys.SendWait:
向活动应用程序发送给定的键,然后等待消息被处理
非常简单,有了这个方法,就不用四处找WIN32 API 了。但是这个方法的参数会将“某些”连在一起的字符串进行转意。不管了,反正我的目的就是扫描条形码,出现转意字符的机率基本为0.
条形的编码格式还有些讲究,不同的编码格式要求不同的长度和字符串格式。我这里要生成的是订单号码,15位,选择CODE 128是最合适的,另外生成条形码我用的是 zxing.net。
另外一点就是将条形码插入到excel 里,生成excel 我用的是NOPI。NOPI的HSSFClientAnchor 类的构造函数所需要的参数真是让人有去死的感觉:
new HSSFClientAnchor(250, 0, 500, 100, 1, row + 3, 1, row + 5);
第一个参数是指要插入图片左上角在单元格内的位置x(什么单位?我也不知道,记得在哪里看过,但是忘了)
第二个参数是左上角在单元格的位置y
第三个参数是第一个参数加上要显示的图片的宽度的结果。
第四个参数是第二个参数加上要显示的图片的高度的结果。
上面那句的代码的意思是:
在某单元格的(250,0)处插入图片,图片显示为250 x 100 的大小。
其余参数不解释,我也解释不清楚。
看累了吧,我也很累,昨天通宵搞的,连手机端带电脑端,电脑端还好说,那个 AppCan 调试起来又是另一番想死的感觉。
最后附上程序,供各位纯屌们体验一下:
http://files.cnblogs.com/xling/TNS.7z
程序有些小BUG,请见谅。