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