前言
超市要想做大,生鲜商品必定是绕不开的商品类别。生鲜商品从进货到销售的过程,每个环节都并不轻松。为此,很多超市系统,将生鲜商品独立出来管理。本文主要讨论生鲜商品的销售环节,即如何对生鲜商品进行称重和收银。
Part1.解决方案
关于超市称重商品的解决方案
※目前主流有三种解决方案
1、把生鲜商品当成普通商品看待。收银时,在数量那栏输入千克数即可。
2、购买一台称重条码机,提前录入商品信息,称重后打印出相应的条形码。收银系统通过条形码识别商品信息和千克数来进行销售。
3、电子秤与收银系统连接,收银系统直接读出千克数。
※三种方案各有利弊
第一种方法,功能简单容易实现。(但是比较费人工)
第二种方法,需要额外开发生鲜商品管理功能。(现在主流的收银系统都用这种方案,但是比较费钱费力)
第三种方法,对于收银系统读取电子秤的千克数,这项技术比较有挑战性(最理想的方式,但是技术储备不足,难以实现)。
※确定使用方案一
考虑到当前经费和精力有限,决定暂时采用方案一,再慢慢过渡到方案二。等条件成熟(技术成熟)后,采用方案三
Part2.设计与开发
方案确定之后,设计与开发就简单多了。只需要在原来商品管理上面稍加修改即可。
※改造的事项如下
1、为方便管理,在商品信息表中增加“是否为称重商品”字段。
2、引入生鲜码的概念,称重商品额外拥有一个生鲜码,长度为3位数。
3、为了方便与普通商品管理,称重商品与普通商品一样都必须有一个唯一的条形码。商品条码采用国际通用的标准码(ean-13),编码规则为(暂定):其中前9位数字为统一数字,第10~12位后生鲜码,最后一位为校验码。
4、打印称重商品条形码。
※使用场景说明
收银人员扫描称重商品条形码(事先将称重商品打印出来,放置在收银台),并在数量栏输入千克数即可。
※附代码:生成ean-13校验位
- 取出该数的奇数位和
- 取出该数的偶数位和
- 将"奇数和"与"偶数和的三倍"相加
- 取结果的个位数(对10取余)
- 用10减去这个个位数
- 对得到的数再取个位数(对10取余)
public static void main(String[] args) {
String bar = "692116851128";
System.out.print("该条形码的第十三位上的数字是:");
System.out.println(change());
System.out.println("该条形码是:"+bar+change());
}
public static int change(){
int c1 = 0;
int c2 = 0;
int cc;
//第1步:取出该数的奇数位和
//第2步:取出该数的偶数位和
for(int i=0;i<bar.length();i++){
if((i+1)%2==0){
c2 += bar.charAt(i)-'0';
}else{
c1 += bar.charAt(i)-'0';
}
}
//第3步:将"奇数和"与"偶数和的三倍"相加
cc = c1 + c2*3;
//第4步:取结果的个位数(对10取余)
//第5步:用10减去这个个位数
//第6步:对得到的数再取个位数(对10取余)
return (10 - cc%10)%10;
}
Part3.扩展:生成条形码图片
本来想在商品管理里面增加一个生成条形码图片的功能。前期也从网上搜集好了相关资源和代码,但在设计的时候发现这个功能并不实用,线上的系统用不上,线下使用时也只需要打印一次即可。
本次改造主要以优化商品信息功能为主,暂时放弃开发生成条形码图片的功能
不过,前期投入不少的时间和精力,现将JAVA生成条形码的功能代码分享出来
1、下载并引入google.zxing.jar包
2、创建BarcodeUtils工具类
BufferedImage picImage = new BufferedImage(pictureWidth, pictureHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = picImage.createGraphics();
g2d.drawImage(codeImage, codeStartX, codeStartY, codeImage.getWidth(), codeImage.getHeight(), null);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("微软雅黑", Font.PLAIN, fontSize));
int wordAndCodeSpacing = 3;
g2d.drawString(bottomStr, strStartX, strStartY);
g2d.drawString(topLeftStr, strStartX, strStartY);
g2d.drawString(topRightStr, strStartX, strStartY);
g2d.dispose();
picImage.flush();