`

POS机 示例代码

 
阅读更多

POS机的基本要求与解释如下:

需求描述

商店里进行购物结算时会使用收银机(POS)系统,这台收银机会在结算时根据客户的购物车(Cart)中的商品(Item)和商店正在进行的优惠活动(Promotion)进行结算和打印购物清单。

已知该商店正在对部分商品进行“买三送一”的优惠活动,即买三件商品其中一件是送的,按照两件商品价格结算。

我们需要实现一个名为printInventory函数,该函数能够将指定格式的数据作为参数输入,然后在浏览器的控制台中输出结算清单的文本。

输入格式(样例):

javascript

 

[
    'ITEM000001',
    'ITEM000001',
    'ITEM000001',
    'ITEM000001',
    'ITEM000001',
    'ITEM000003-2',
    'ITEM000005',
    'ITEM000005',
    'ITEM000005'
]

 其中对'ITEM000003-2'来说,"-"之前的是标准的条形码,"-"之后的是数量。 当我们购买需要称量的物品的时候,由称量的机器生成此类条形码,收银机负责识别生成小票。 (当点击"保存并提交代码"按钮的时候,我们会调用函数printInventory将上面的数据作为参数(inputs)传入该函数。)

 

清单内容(样例,其中的打印时间为打印时的实际时间):

 

***<没钱赚商店>购物清单***
打印时间:2014年08月04日 08:09:05
----------------------
名称:可口可乐,数量:3瓶,单价:3.00(元),小计:6.00(元)
名称:羽毛球,数量:5个,单价:1.00(元),小计:4.00(元)
名称:苹果,数量:2斤,单:5.50(元),小计:11.00(元)
----------------------
挥泪赠送商品:
名称:可口可乐,数量:1瓶
名称:羽毛球,数量:1个
----------------------
总计:21.00(元)
节省:4.00(元)
**********************

 

作业要求

  1. 请尽可能的使用面向对象的思想;
  2. 根据main-spec.js中的测试用例,在main.js文件中实现printInventory函数;
  3. 请在保证代码可读性的前提下,尽可能用最少的代码行数完成作业; 注意:所有的标点符号均为英文符号
  4. 作业提示

    1. 可使用loadAllItems()方法获取全部的商品,该方法返回结果为一个包含了商品对象的数组;
    2. 每一个商品对象的结构请见item.js
    3. 可使用loadPromotions()方法获取全部的促销信息,该方法返回结果为一个包含有促销信息对象的数组;
    4. 每一个促销信息对象的结构请见promotion.js
    5. 使用console.log输出(仅允许使用一次);
    6. 应学习并善于使用各种流行浏览器所附带的开发人员工具中的控制台(Console)功能;
    7. 有关于Lo-Dashmoment.js的使用方法,请查阅各自官方网站。

 代码如下

 

这道题我们构造了两个类,我们先构造出一个Order类用来处理和输出结果

 

function Order (items, promotions, inputs) {  
    this.items = {};   //存储已购商品清单
    this.total = 0;  //存储需付款总价
    this.original = 0;  //存储优惠前总价
    this.initiate(items, promotions, inputs);  //调用初始化函数
 } 

 

 现在对Oredr()进行初始化

 

Order.prototype.initiate = function (items,promotions,inputs){
    var self = this;           // 此处重点,要注意作用域
    _.each(inputs,function(input){
        var rawed_barcode = input.substring(0,10);
        var item = {};
        if(self.items.hasOwnProperty(rawed_barcode)==true)
        {
            item = self.items[rawed_barcode];  
            //console.log(JSON.stringify(item)); 
        }else
        {
            var rawItem = _(items).findWhere({barcode: rawed_barcode});
         	var newItem = new Item(rawItem.barcode, rawItem.name, rawItem.unit, rawItem.price);
            item = newItem;
        }
       self.original += item.addCount(input);
       self.items[rawed_barcode] = item;
    });
    var two_with_one_list = _(promotions).findWhere({type: 'BUY_TWO_GET_ONE_FREE'}).barcodes;
    _(two_with_one_list).each(function (barcode) {
        self.items[barcode] && self.items[barcode].getPromotion();
      // console.log(JSON.stringify(self.items[barcode])); 
    });
    this.total = _(self.items).reduce(function (sum, item){ return sum + item.subtotal;}, 0);
     //reduce 求和的方法,详情与具体用法请自行查询
}

 

 

下面是Order类的原型方法,用于获取商品列表的部分内容

 

Order.prototype.getLists = function() {
    function getBoughtItem (item) {
        return '名称:' + item.name + ',数量:' + item.count + item.unit
            + ',单价:' + item.price.toFixed(2) + '(元)' + ',小计:' + item.subtotal.toFixed(2) + '(元)\n';
    }
    function getFreeItem (item) {
        if(item.free!==0){
        return '名称:' + item.name + ',数量:' + item.free + item.unit +'\n';
        }
        else{
            return "";
        }
    }
    var first_title="***<没钱赚商店>购物清单***\n"
    var boughtList = '----------------------\n';
    var freeList = '----------------------\n' + '挥泪赠送商品:\n';
    _(this.items).each(function (item) {
        boughtList += getBoughtItem(item);
        item.promotion && (freeList += getFreeItem(item));
    });
    this.boughtList = boughtList;
    this.freeList = freeList;
    this.first_title=first_title;
}

 

 

Order.prototype.getStats = function() {  
    return '----------------------\n' + '总计:' + this.total.toFixed(2) + '(元)\n'
    + '节省:' + (this.original - this.total).toFixed(2) + '(元)\n'+"**********************";
}

 

 

下面我们构造一个Item类

 

function Item(barcode, name, unit, price) {
    this.barcode = barcode;
    this.name = name;
    this.unit = unit;
    this.price = price || 0.00;
    this.subtotal = 0;
    this.count = 0;
    this.promotion = false;
}

 

 根据需要写出Item的原型方法:

 

计算数量信息和subtotal等

 

Item.prototype.addCount = function(input) {  
    var bought_number = parseInt(input.substring(11)) || 1;
    this.count += bought_number;
    this.subtotal = this.count * this.price;
    return bought_number * this.price;
}

 

 

计算优惠部分

 

Item.prototype.getPromotion = function() {  
    this.promotion = true;
    this.free = Math.floor(this.count / 3);
    this.subtotal = (this.count - this.free) * this.price;
}

 

 

最后我们在构造一个Order的原型方法来获取时间即可 

 

Order.prototype.getDateTime = function() { 
      var myDate = new Date();
      var year=myDate.getFullYear();  
      var month=myDate.getMonth(); 
      var newMonth = (month+1)>9?(month+1):"0"+(month+1);
      var day=myDate.getDate(); 
      var newday = day>9?day:"0"+day;
      var hours=myDate.getHours();
      var newhours = hours>9?hours:"0"+hours;
      var minutes=myDate.getMinutes();  
      var newminutes = minutes>9?minutes:"0"+minutes;
      var seconds=myDate.getSeconds();
      var newseconds= seconds>9?seconds:"0"+seconds;
      var now_time='打印时间:' + year+"年"+ newMonth+"月"+newday+"日 "+ newhours+":"+newminutes+":"+newseconds+"\n";
      return now_time    
}

 

时间可以根据自己的需要来编写,可以写出不同的时间格式。具体写法延伸可以根据以前博客  链接为http://1397548794.iteye.com/admin/blogs/2411939

 

 

最后我们对Order方法进行实例化并输出我们想要的内容

 

function printInventory(inputs) {
    var order = new Order(loadAllItems(),loadPromotions(),inputs);
    order.getLists();
    console.log(order.first_title+order.getDateTime()+order.boughtList + order.freeList + order.getStats());

}

 

 

 

我们通过对Order()和Item()构造prototype方法,把一些不变的属性和函数单独提出来,节省了内存,经过函数的封装和继承,实现了面向对象的编写。

 

loadAllItems(),loadPromotions()等详情我们没有写出,全面的代码与题详情请见网页 http://www.codefordream.com/courses/js-pos-boot-camp/sections/section_1/practices/normal/practice_6/items/code

分享到:
评论

相关推荐

    pos机对接SDK

    在C# POS机对接中,开发者通常会使用SDK提供的示例代码(如Ecard.PosDemo)作为起点,了解如何初始化连接,发送和接收8583报文,以及处理返回的结果。这个示例可能包括以下步骤: 1. **连接设置**:配置POS机的IP...

    pos机java调用程序demo(基于dll调用)

    对于那些在IT行业,尤其是支付系统或POS机应用开发领域的专业人士来说,这是一个极具参考价值的示例。 首先,让我们理解Java调用DLL库的基本原理。Java本身并不直接支持调用本地DLL库,但通过Java Native Interface...

    针式pos机打印

    在本文中,我们将深入探讨POS机打印的相关知识点,并针对描述中提到的代码问题进行解析。 首先,POS(Point of Sale)机是一种用于处理销售交易的电子设备,它包括硬件如针式打印机、扫描枪、现金抽屉等,以及软件...

    C#实现pos打机的示例(附ECS/POS说明书)

    3. **C#示例代码**: 在`PosPrintDemo`项目中,可能会包含一个名为`PosPrinter`的类,该类封装了串口通信和ECS/POS命令的发送。类中会有初始化串口、发送命令、关闭串口的方法。例如: ```csharp public class ...

    ESC/POS源码示例

    - **源代码示例**:展示了如何使用编程语言(如C、Java、Python等)构建 ESC/POS 指令序列并发送给打印机。 - **测试脚本**:用于验证不同指令的功能和效果,比如打印不同格式的文本、条形码和图形。 - **数据结构**...

    模拟pos机计算mac(基于jmeter)

    在提供的压缩包文件“MAC”中,可能包含了实现上述功能的源代码、配置文件或者示例数据。这些文件可以帮助开发者理解并复现MAC计算的过程,确保在JMeter中正确地模拟POS机的MAC计算逻辑。 总结来说,"模拟POS机计算...

    Java实现无驱动POS机打印

    #### 示例代码分析 根据给定的部分代码示例,可以看出其实现了基本的无驱动POS机打印功能: ```java String ip = "POS机IP地址"; // 假设的POS机IP地址 int port = 9100; // POS机监听的端口 try { // 创建...

    web打印POS小票机代码.zip

    "web打印POS小票机代码.zip"这个压缩包文件提供了一个示例代码,帮助开发者理解如何实现网页端直接控制POS小票打印机进行打印。以下是对这个主题的详细知识点介绍: 1. **Web打印技术**: Web打印是指通过Web应用...

    web打印POS小票机代码

    "web打印POS小票机代码"这个主题聚焦于如何利用Web技术来实现POS小票的无痛打印,而无需支付高昂的费用。 传统的POS小票打印通常依赖于特定的驱动程序或者专用软件,但这种方式限制了跨平台的灵活性。随着Web技术的...

    一个VB写的POS机收银程序代码.rar

    标题中的“一个VB写的POS机收银程序代码.rar”表明这是一个使用Visual Basic(VB)编程语言编写的收银系统程序代码。VB是Microsoft开发的一种面向对象的编程语言,常用于开发Windows应用程序,包括桌面应用和系统...

    起盘于POS机双轨带内部商城有工资功能的PHP自适

    【标签】"起盘于POS机双轨带内部商城有工"概括了系统的几个关键元素,包括POS机的对接、双轨直销结构、内部商城以及工资管理。这些标签有助于用户快速理解系统的主要功能。 【压缩包子文件的文件名称列表】提供了两...

    C#使用ESC指令控制POS机打印小票

    #### 五、示例代码 下面给出一个简单的示例,展示如何使用`ReceiptHelper`类打印小票: ```csharp using System; using LaisonTech.MediaLib; public class Program { public static void Main() { ...

    Delphi POS机小票打印实例

    POS机是商业交易中不可或缺的一部分,用于处理销售、退货等操作,并通过打印机生成小票作为交易凭证。 在Delphi中实现POS机小票打印,首先需要了解打印机的通信协议,如ESC/POS指令集,这是大多数热敏小票打印机所...

    工行支付Java代码示例.zip

    在本压缩包“工行支付Java代码示例.zip”中,包含了使用Java语言与中国工商银行网上银行新B2C在线支付接口进行集成的示例代码。这个API SDK版本为icbc-api-sdk-cop_v2_20181211,意味着它是2018年12月11日更新的版本...

    Caysn打印机安卓打印示例代码 - Sample3_20160927

    本示例代码"Sample3_20160927"就是为了帮助开发者理解和使用这个库而提供的。 首先,我们需要理解"CaysnPrinter"的核心功能。它主要包含以下几个方面: 1. **蓝牙打印**:通过蓝牙连接打印机,支持与具备蓝牙打印...

    C# ESCPOS 打印实例

    ESC/POS是一种通用的打印机语言,由日本的Star Micronics公司开发,旨在简化不同型号的收银机和微型打印机之间的兼容性。C#作为.NET框架下的编程语言,提供了丰富的功能来与硬件设备交互,包括ESC/POS打印机。 标题...

    MyCom.rar_MyCom.java_java串口打印_pos机_site:www.pudn.com_串口打印

    Java串口通信是Java编程中一个重要的领域,特别是在与硬件设备交互时,如POS机、条形码扫描器等。本篇文章将详细讲解如何利用Java进行串口...同时,也可以参考相关文档和示例,以增强对Java串口通信和POS机打印的理解。

    pos机(pax-a920)打印demo(PaxNeptune_demo_src_V20170303)

    "demo"是演示或示例的意思,这里指的是一个能够展示如何在PAX-A920 POS机上进行打印操作的代码实例。 【压缩包子文件的文件名称列表】中的"DEMO"可能是包含了所有源代码、配置文件以及可能的库和依赖项的压缩文件。...

    Caysn打印机安卓打印示例代码 - Sample1_20160715

    在本文中,我们将深入探讨如何使用CaysnPrinter在安卓设备上进行打印操作。...通过理解其提供的API接口和示例代码,开发者可以快速掌握安卓设备上的蓝牙和USB打印技术,提升用户体验,满足不同场景下的打印需求。

    pos机双屏异显项目 --- 在密码解锁或设置密码时,副屏不显示或显示张图片

    首先,POS机双屏异显指的是主屏幕和副屏幕可以显示不同的内容,这在零售、餐饮和其他交易场景中非常常见。主屏幕通常面向顾客,展示交易详情,而副屏则面向操作员,显示更敏感的信息,如交易金额、密码输入等。这种...

Global site tag (gtag.js) - Google Analytics