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(元) **********************
作业要求
- 请尽可能的使用面向对象的思想;
- 根据
main-spec.js
中的测试用例,在main.js
文件中实现printInventory
函数; - 请在保证代码可读性的前提下,尽可能用最少的代码行数完成作业; 注意:所有的标点符号均为英文符号
-
作业提示
代码如下
这道题我们构造了两个类,我们先构造出一个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
相关推荐
在C# POS机对接中,开发者通常会使用SDK提供的示例代码(如Ecard.PosDemo)作为起点,了解如何初始化连接,发送和接收8583报文,以及处理返回的结果。这个示例可能包括以下步骤: 1. **连接设置**:配置POS机的IP...
对于那些在IT行业,尤其是支付系统或POS机应用开发领域的专业人士来说,这是一个极具参考价值的示例。 首先,让我们理解Java调用DLL库的基本原理。Java本身并不直接支持调用本地DLL库,但通过Java Native Interface...
在本文中,我们将深入探讨POS机打印的相关知识点,并针对描述中提到的代码问题进行解析。 首先,POS(Point of Sale)机是一种用于处理销售交易的电子设备,它包括硬件如针式打印机、扫描枪、现金抽屉等,以及软件...
3. **C#示例代码**: 在`PosPrintDemo`项目中,可能会包含一个名为`PosPrinter`的类,该类封装了串口通信和ECS/POS命令的发送。类中会有初始化串口、发送命令、关闭串口的方法。例如: ```csharp public class ...
- **源代码示例**:展示了如何使用编程语言(如C、Java、Python等)构建 ESC/POS 指令序列并发送给打印机。 - **测试脚本**:用于验证不同指令的功能和效果,比如打印不同格式的文本、条形码和图形。 - **数据结构**...
在提供的压缩包文件“MAC”中,可能包含了实现上述功能的源代码、配置文件或者示例数据。这些文件可以帮助开发者理解并复现MAC计算的过程,确保在JMeter中正确地模拟POS机的MAC计算逻辑。 总结来说,"模拟POS机计算...
#### 示例代码分析 根据给定的部分代码示例,可以看出其实现了基本的无驱动POS机打印功能: ```java String ip = "POS机IP地址"; // 假设的POS机IP地址 int port = 9100; // POS机监听的端口 try { // 创建...
"web打印POS小票机代码.zip"这个压缩包文件提供了一个示例代码,帮助开发者理解如何实现网页端直接控制POS小票打印机进行打印。以下是对这个主题的详细知识点介绍: 1. **Web打印技术**: Web打印是指通过Web应用...
"web打印POS小票机代码"这个主题聚焦于如何利用Web技术来实现POS小票的无痛打印,而无需支付高昂的费用。 传统的POS小票打印通常依赖于特定的驱动程序或者专用软件,但这种方式限制了跨平台的灵活性。随着Web技术的...
标题中的“一个VB写的POS机收银程序代码.rar”表明这是一个使用Visual Basic(VB)编程语言编写的收银系统程序代码。VB是Microsoft开发的一种面向对象的编程语言,常用于开发Windows应用程序,包括桌面应用和系统...
【标签】"起盘于POS机双轨带内部商城有工"概括了系统的几个关键元素,包括POS机的对接、双轨直销结构、内部商城以及工资管理。这些标签有助于用户快速理解系统的主要功能。 【压缩包子文件的文件名称列表】提供了两...
#### 五、示例代码 下面给出一个简单的示例,展示如何使用`ReceiptHelper`类打印小票: ```csharp using System; using LaisonTech.MediaLib; public class Program { public static void Main() { ...
POS机是商业交易中不可或缺的一部分,用于处理销售、退货等操作,并通过打印机生成小票作为交易凭证。 在Delphi中实现POS机小票打印,首先需要了解打印机的通信协议,如ESC/POS指令集,这是大多数热敏小票打印机所...
在本压缩包“工行支付Java代码示例.zip”中,包含了使用Java语言与中国工商银行网上银行新B2C在线支付接口进行集成的示例代码。这个API SDK版本为icbc-api-sdk-cop_v2_20181211,意味着它是2018年12月11日更新的版本...
本示例代码"Sample3_20160927"就是为了帮助开发者理解和使用这个库而提供的。 首先,我们需要理解"CaysnPrinter"的核心功能。它主要包含以下几个方面: 1. **蓝牙打印**:通过蓝牙连接打印机,支持与具备蓝牙打印...
ESC/POS是一种通用的打印机语言,由日本的Star Micronics公司开发,旨在简化不同型号的收银机和微型打印机之间的兼容性。C#作为.NET框架下的编程语言,提供了丰富的功能来与硬件设备交互,包括ESC/POS打印机。 标题...
Java串口通信是Java编程中一个重要的领域,特别是在与硬件设备交互时,如POS机、条形码扫描器等。本篇文章将详细讲解如何利用Java进行串口...同时,也可以参考相关文档和示例,以增强对Java串口通信和POS机打印的理解。
"demo"是演示或示例的意思,这里指的是一个能够展示如何在PAX-A920 POS机上进行打印操作的代码实例。 【压缩包子文件的文件名称列表】中的"DEMO"可能是包含了所有源代码、配置文件以及可能的库和依赖项的压缩文件。...
在本文中,我们将深入探讨如何使用CaysnPrinter在安卓设备上进行打印操作。...通过理解其提供的API接口和示例代码,开发者可以快速掌握安卓设备上的蓝牙和USB打印技术,提升用户体验,满足不同场景下的打印需求。
首先,POS机双屏异显指的是主屏幕和副屏幕可以显示不同的内容,这在零售、餐饮和其他交易场景中非常常见。主屏幕通常面向顾客,展示交易详情,而副屏则面向操作员,显示更敏感的信息,如交易金额、密码输入等。这种...