diff --git a/274034139.jpg b/274034139.jpg new file mode 100644 index 00000000..264bdb40 Binary files /dev/null and b/274034139.jpg differ diff --git a/pos_v1/1927950381.jpg b/pos_v1/1927950381.jpg new file mode 100644 index 00000000..5976f007 Binary files /dev/null and b/pos_v1/1927950381.jpg differ diff --git a/pos_v1/main/main.js b/pos_v1/main/main.js index 9c905e07..7f755d36 100644 --- a/pos_v1/main/main.js +++ b/pos_v1/main/main.js @@ -1,3 +1,135 @@ 'use strict'; -//TODO: 请在该文件中实现练习要求并删除此注释 +function printReceipt(tags) { + //计算数量 + let typeAndNumberOfItems = calculatingTypeAndNumber(tags); + const allItems = loadAllItems(); + let itemsDetails = getItemsDetails(typeAndNumberOfItems, allItems); + const promotions = loadPromotions(); + itemsDetails = getPromotion(itemsDetails, promotions); + itemsDetails = countItem(itemsDetails); + itemsDetails = countAllItems(itemsDetails); + print(itemsDetails); + +} + +//计算数量 +function calculatingTypeAndNumber(tags) { + + let typeAndNumberOfItems = []; + + for (let barcode of tags) { + let tempId = splitItem(barcode); + let Iscontain = containId(tempId, typeAndNumberOfItems); + if (!Iscontain) { + typeAndNumberOfItems.push({ + code: tempId.code, + number: tempId.number + }); + } + } + return typeAndNumberOfItems; +} + +function getItemsDetails(typeAndNumberOfItems, allItems) { + // for(let det of deatil) + for (let typeAndNumberOfItem of typeAndNumberOfItems) { + for (let item of allItems) { + if (typeAndNumberOfItem.code === item.barcode) { + typeAndNumberOfItem.name = item.name; + typeAndNumberOfItem.unit = item.unit; + typeAndNumberOfItem.price = item.price; + } + } + } + return typeAndNumberOfItems; +} + +function getPromotion(itemsDetails, Promotions) { + let barcode = Promotions[0].barcodes; + for (let tempitem of itemsDetails) { + for (let i = 0; i < barcode.length; i++) { + if (tempitem.code === barcode[i]) { + tempitem.status = 'Promotion'; + + } + } + } + return itemsDetails; +} + +function countItem(itemsDetails) { + for (let it of itemsDetails) { + let mycount; + if (it.hasOwnProperty('status')) { + mycount = (parseInt(it.number / 3) * 2 + it.number % 3) * it.price; + it.count = mycount; + } + else { + mycount = it.number * it.price; + it.count = mycount; + } + } + return itemsDetails; +} + +function countAllItems(itemsDetails) { + let count = 0; + let countfanal = 0; + for (let it of itemsDetails) { + count = count + it.count; + countfanal = it.number * it.price + countfanal; + } + + itemsDetails.push({ + finalcount: count, + saved: countfanal - count + }) + return itemsDetails; +} + + +function print(item) { + let final = '***<没钱赚商店>收据***\n'; + for (let i = 0; i < item.length - 1; i++) { + final = final + '名称:' + item[i].name + ',数量:' + item[i].number + '' + item[i].unit + ',单价:' + parseFloat(item[i].price).toFixed(2) + '(元),小计:' + parseFloat(item[i].count).toFixed(2) + '(元)' + '\n'; + } + final = final + '----------------------\n'; + final = final + '总计:' + parseFloat(item[item.length - 1].finalcount).toFixed(2) + '(元)' + '\n'; + final = final + '节省:' + item[item.length - 1].saved.toFixed(2) + '(元)' + '\n'; + final = final + '**********************'; + + final = `${final}`; + console.log(final); +} + + +function splitItem(barcode) { + let tempId = {}; + if (barcode.indexOf('-') >= 0) { + tempId = { + code: barcode.split('-')[0], + number: parseFloat(barcode.split('-')[1]) + } + } + else { + tempId = { + code: barcode, + number: 1 + } + } + return tempId; +} + +function containId(tempId, typeAndNumberOfItems) { + let isContain=false; + if (typeAndNumberOfItems.length !== 0) { + for (let temp of typeAndNumberOfItems) { + if (temp.code == tempId.code) { + temp.number = temp.number + tempId.number; + isContain=true; + } + } + } + return isContain; +} diff --git a/pos_v1/test/main-test.js b/pos_v1/test/main-test.js index 93a3f0c3..8077a02a 100644 --- a/pos_v1/test/main-test.js +++ b/pos_v1/test/main-test.js @@ -1,8 +1,8 @@ 'use strict'; -describe('pos', () => { - it('should print text', () => { +describe('Function calculatingTypeAndNumber test',()=> { + it('it should have same typeAndNumberOfItems', () => { const tags = [ 'ITEM000001', @@ -15,9 +15,131 @@ describe('pos', () => { 'ITEM000005-2', ]; + let typeAndNumberOfItems = calculatingTypeAndNumber(tags); + const result=[ + {code: "ITEM000001", number: 5}, + {code: "ITEM000003", number: 2.5}, + {code: "ITEM000005", number: 3} + ]; + expect(typeAndNumberOfItems).toEqual(result); + }); +}); + + +describe('Function getItemsDetails test',()=> { + it('it should have same ItemsDetails', () => { + + const typeAndNumberOfItems=[ + {code: "ITEM000001", number: 5}, + {code: "ITEM000003", number: 2.5}, + {code: "ITEM000005", number: 3} + ]; + const allItems=loadAllItems(); + const itemsDetails = getItemsDetails(typeAndNumberOfItems, allItems); + const result=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5} + ] + expect(itemsDetails).toEqual(result); + }); +}); + + +describe('Function getPromotion test',()=> { + it('it should have same ItemsDetails', () => { + const items=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5} + ] + const promotions=loadPromotions(); + const itemsDetails = getPromotion(items, promotions); + const result=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3,status:'Promotion'} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5,status:'Promotion'} + ] + expect(itemsDetails).toEqual(result); + }); +}); + + +describe('Function countItem test',()=> { + it('it should have same ItemsDetails', () => { + const items=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3,status:'Promotion'} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5,status:'Promotion'} + ] + const itemsDetails = countItem(items); + const result=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3,status:'Promotion',count: 12} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15,count: 37.5} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5,status:'Promotion',count: 9} + ] + expect(itemsDetails).toEqual(result); + }); +}); + +describe('Function countAllItem test',()=> { + it('it should have same ItemsDetails', () => { + const items=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3,status:'Promotion',count: 12} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15,count: 37.5} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5,status:'Promotion',count: 9} + ] + const itemsDetails = countAllItems(items); + const result=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3,status:'Promotion',count: 12} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15,count: 37.5} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5,status:'Promotion',count: 9}, + { + finalcount: 58.5, + saved: 7.5 + } + ] + expect(itemsDetails).toEqual(result); + }); +}); + + + + + +describe('Function print test', () => { + + it('it should have same text', () => { + + const items=[ + {code: "ITEM000001", number: 5, name: "雪碧", unit: "瓶", price: 3,status:'Promotion',count: 12} + , + {code: "ITEM000003", number: 2.5, name: "荔枝", unit: "斤", price: 15,count: 37.5} + , + {code: "ITEM000005", number: 3, name: "方便面", unit: "袋", price: 4.5,status:'Promotion',count: 9}, + { + finalcount: 58.5, + saved: 7.5 + } + ] + spyOn(console, 'log'); - printReceipt(tags); + print(items); const expectText = `***<没钱赚商店>收据*** 名称:雪碧,数量:5瓶,单价:3.00(元),小计:12.00(元)