一种仓库扫码出库系统的实现

前言

最近在做公司的仓库管理系统,这个系统设计到商品出库、回仓、损耗等。系统在设计之初就一直到考虑仓库人员使用的方便性,提高他们的工作效率。但是不管我们怎样做,仓库那边的人员总说系统复杂,不会用。现在我们做的是只需要他们点击就可以完成,很少有要他们输入的地方,还觉得复杂,作为开发的我也觉得很无奈,我们的系统也确实存在问题,但是我想操作已经是经量简化了。上周分仓那边的说,忘记了自己的登录用户密码,密码都是123456,这样都能忘记,我还能说什么……,似乎扯远了。

扫码出库系统

我们应该都去超市购物过吧。不知道大家后没有注意一件事情:超市的收银人员,用条码枪扫码之后,商品信息就被录入进了电脑然后生成了我们的购物单。再再次体验这个之后,大致流程:收银人员,操作电脑新建购物单 –> 条码枪扫码添加商品(同一个商品扫码多次商品数量就是多少次,或者电脑输入,或者电脑删除) –> 扫码过程完成,开始结账 –> 结账完成,生成一个有效的购物单。如图:
这里写图片描述
我们的扫码出库系统,其实和这个基本一样,最大的却别是超市的收银的电脑和扫码枪是通过有线连接的,我们的扫码机是手机,电脑还是电脑,之前是没有连接的。为什么不用扫码枪了?仓库的自动化程度不高啊。大学时在日本的汽车配件厂上班时,那边的商品出库只需要条码枪扫码就OK,自动化程度很高了,出库人员只需要在PC端查看数据就好了。然而4年后,我们的小企业的仓库的自动化程度还没这么高。
那么数据怎么同步呢?

系统构建

1.PC端点击新建出库单,同时生成出库单二维码;
2.手机扫出库单二维码,开始添加商品;
3.手机端扫商品二维码,PC端就获取到了扫码的商品信息;(PC端也具备商品增加,删除,修改数量的功能);
4.PC端点击完成,生成一个有效的出库单,流程结束。

系统实现

其实整个这部分的系统难度在手机端扫码数据同步到PC端显示。这里我采用的socket。但是搞Python后台人员,实现不了socket服务,这下就尴尬了,他说使用ajax轮询,……。没办法,我只好用node.js写一个桥接了。
这部分桥接流程:
1.手机扫码,调用node.js的接口,
2.node.js调用Python接口,提交信息,同时获取出库单里的数据,(后台是用Python写的);
3.node.js服务,使用socket,向PC端发送数据;
4.PC端socke监听,获取数据,刷新页面。
这里写图片描述
这个流程在速度上面是没有有线方式快的,而且系统严重依赖网络,但是有一个优点–便宜,且可以解决问题。

具体操作

1.Node.js环境的搭建
由于Ubuntu系统中已经有node和npm只是版本比较老,我的是0.10.17,这个是不知js里面的严格模式。那么我们就升级:

curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
sudo apt-get install -y nodejs

参考这里
如果需要安装的可以百度,方法基本超不多Linux环境下NodeJS的安装配置(HelloWorld)
2.express的安装
这个基本百度一堆:
Mac下express的安装和新建项目;
安装4.x版本的express开发框架;
3.最后
上传代码到服务器,启动服务测试。

桥接部分技术栈

Node.js + request + socket.io。其实express可用可不用。

项目目录

1.express框架:
– 项目目录
– node_modules // 用到的模块
– bin // http配置
– public //
– routes // 路由目录
– socketio.js // 代码
– views // 视图文件
app.js //
package.json // 包管理json文件
实现代码:
socketio.js

var express = require('express');
var router = express.Router();
var socket_io = require('socket.io');
var request = require('request');

var socket_global = null;

router.all('/reptile', function(req, res, next) {
   var param = req.query || req.params; 
   var sku_code = param.sku_code;
   if (sku_code == null || sku_code == '') {
     var data = {};  // 返回的json数据
     data.msg = '请传入参数';
     data.status = '101';
     res.end(JSON.stringify(data));
     return;
   }
   setTimeout(function(){
      var urlStr = 'Python后台接口地址';
      request(urlStr, function (error, response, body) {
          if (!error && response.statusCode == 200) {
            // socket向PC端发送数据
            socket_global.emit('message', body);
            res.end(body);
          }else{
            var data = {};  // 返回的json数据
            data.msg = '操作失败';
            data.status = '102';
            res.end(JSON.stringify(data));
          }
      })  
    },30);// 不加延时  socket_global.emit('message', body);  这里会报错 服务启动不了
});

router.prepareSocketIO = function (server) {
    var io = socket_io.listen(server);
    io.sockets.on('connection', function (socket) {
            socket_global = socket;
            socket_global.emit('message', '启动服务了');
//      socket_global.on('login', function (obj) {
//              console.log('接收到的消息:' + obj);
//          socket_global.emit('login', '登录成功');
//      });
//      socket_global.on('message', function (msg) {
//              console.log("客户端发送来的消息:" + msg);
//          socket_global.emit('message', msg);
//      });
    });
};

module.exports = router;

socketio.js

var scoketio = require('./routes/scoketio');
// 路由
app.use('/', scoketio);
 app.ready=function(server){
  scoketio.prepareSocketIO(server);
};

bin/www

app.ready(server); //添加这句

2.无express框架:
– 项目目录
– node_modules // 用到的模块
socketio.js // 代码
package.json // 包管理json文件
这里的package.json文件我们可以直接复制上面的就可以了,把不需要的模块去掉就OK。
实现代码:

var http = require('http');
var request = require('request');

var socket_global = null;

var hostname = 'localhost';
var port = 3003;

var server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "application/json;charset=utf-8");
  res.setHeader("Access-Control-Allow-Origin", "http://192.168.168.176:8080");
  res.setHeader("Access-Control-Allow-Credentials", true);
  res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
  res.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  res.setHeader("X-Powered-By", ' 4.2.1');
  var urls = req.url.split('=');
  var sku_code = urls[1];
  var sku_str = urls[0];
  if (sku_str == '/reptile?sku_code') {
      var urlStr = 'Python后台接口地址';
      request(urlStr, function (error, response, body) {
          if (!error && response.statusCode == 200) {
            socket_global.emit('message', body);
            res.end(body);
          }else{
            var data = {};  // 返回的json数据
            data.msg = '操作失败';
            data.status = '103';
            res.end(JSON.stringify(data));
          }
      })  
  }
});
var io = require('socket.io')(server);
io.on('connection', function(client){
    socket_global = client;
    socket_global.emit("link",'link');
    socket_global.on('message', function(data){
        socket_global.emit("message",data);
    });
    socket_global.on('login', function(data){
        console.log(data);
    });
});
server.listen(port, hostname, () => {
  console.log(`服务器运行在 http://${hostname}:${port}/`);
});

总结

代码部分并没有什么难点。难点在业务上面我们需要仔细分析需求,然后拆分系统的构建,使用什么技术栈实现。在这个过程中,这个方式是我提出的,实现思路也是我提出的,最后系统的实现,前端和后台node.js的桥接部分也是我做的,似乎做的很多,但是其实系统还是很简陋的,只能说是实现功能。但是在这个过程中需要学习的,解决问题的思路,怎么分析需求,拆分需求,使用什么技术解决什么问题。同时也学习了在linux上面安装node和express。但是这个还有一个问题就是没有实现https请求。这个等明天拿到了证书再做,之前做过在windows server 2012上node环境的证书的设置Node.js配置支持https和http

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值