Last active
January 29, 2021 13:26
-
-
Save skawnkk/c938031a3049a18af0a9a2900c534da5 to your computer and use it in GitHub Desktop.
CAFE PLAY
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//동기, 비동기 기능 더 추가해서....다시 해보긔 | |
const EventEmitter = require("events"); | |
let chalk = require('chalk'); | |
let guide = chalk.blue; | |
let guide1 = chalk.bold.yellow; | |
let guide2 = chalk.inverse.blue; | |
class Cashier extends EventEmitter { | |
constructor() { | |
super(); | |
this.profit = 0; | |
this.rl = readline.createInterface({ | |
input: process.stdin, | |
output: process.stdout, | |
}); | |
} | |
duty() { | |
this.hello() | |
this.order() | |
} | |
hello() { | |
console.log(guide('\nkeyGuide')) | |
console.log('*ex__아메리카노 3 잔, 프라푸치노 1 잔 \n=> 1: 3, 3: 1\n*입력 오류 시 아리수를 준다.') | |
console.log('*카페 마감하기: close') | |
console.log(guide("\nヾ(•ω•`)o\n 어서요세요, 주문하시겠어요?\n")) | |
console.log(guide2("=====MENU=====\n")) | |
for (let [key, value] of Object.entries(menu.info)) { | |
console.log(`${key}.${value.name}(${value.price}원)`) | |
} | |
} | |
order() { | |
this.rl.prompt(); | |
this.rl.on('line', (line) => { | |
if (line === 'close') this.close() | |
else { | |
let input = line.split(',').map(el => el.trim().split(':')); | |
//[ [ '1', '3' ], [ ' 2', '2' ] ] | |
for (let el of input) { | |
menu.check(el[0], el[1]) | |
} | |
console.log(guide("(*^o^*)_주문받았습니다!"), guide1(`++ ${this.profit}`)) | |
} | |
}) | |
} | |
sell(price, count) { | |
this.profit += (price * count); | |
} | |
close() { | |
if (beverage.waiting.length > 0) { | |
setInterval(() => this.close(), 3000) | |
} else { | |
this.report(); | |
} | |
} | |
report() { | |
console.log(guide2("\n---------마감---------")) | |
console.log(` 금일 판매 수량: ${beverage.finished.length}`) | |
console.log(` 금일 판매 수익: ${this.profit}`) | |
process.exit(); | |
} | |
} | |
class Menu { | |
constructor() { | |
this.id = 0; | |
this.info = { | |
1: { | |
name: "Americano", | |
price: 3000, | |
ms: 1000 | |
}, | |
2: { | |
name: "CafeLatte", | |
price: 3500, | |
ms: 2500 | |
}, | |
3: { | |
name: "Frappuccino", | |
price: 4300, | |
ms: 5000 | |
}, | |
4: { | |
name: "아리수", | |
price: 500, | |
ms: 0 | |
} | |
} | |
} | |
check(drinking, count) { | |
if (!['1', '2', '3'].includes(drinking)) { | |
drinking = 4 | |
} | |
let beverageName = this.info[drinking]['name'] | |
let beveragePrice = this.info[drinking]['price']; | |
let beverageTime = this.info[drinking]['ms']; | |
for (let i = 0; i < count; i++) { | |
beverage.waiting.push([beverageName, beverageTime, this.id]); | |
} | |
this.id++; | |
cashier.sell(beveragePrice, count); | |
} | |
show() { | |
let str = '\n======MAKING======'; | |
for (let el of beverage.waiting) { | |
str += `\n NO.${el[2]}/ ${el[0]}` | |
} | |
console.log(str) | |
//대기와 제조를 구분하지 못함 | |
// let str1 = '\n=====WAITING======'; | |
// for (let el of beverage.making) { | |
// str1 += `\n NO.${el[2]}/ ${el[0]}` | |
// } | |
// console.log(str1) | |
let str2 = '\n=====FINISHED======'; | |
for (let el of beverage.finished) { | |
str2 += `\n NO.${el[2]}/ ${el[0]}` | |
} | |
console.log(str2) | |
} | |
} | |
class BeverageState extends EventEmitter { | |
constructor() { | |
super(); | |
this.waiting = []; //대기 | |
this.making = []; //제조 | |
this.finished = []; //완료 | |
} | |
toMake() { | |
let willMake = this.waiting.shift(); | |
this.making.push(willMake) | |
this.Making() //바리스타가 waiting을 확인하도록 하기 | |
} | |
Making() { | |
let beverageName = this.making[0][0]; | |
let beverageTime = this.making[0][1]; | |
let customerID = this.making[0][2]; | |
barista.makingBeverage(beverageName, beverageTime, customerID) | |
} | |
Made() { | |
let made = this.making.shift(); | |
this.finished.push(made) | |
} | |
} | |
class Barista { | |
duty() { | |
setInterval(() => this.check(), 3000); | |
} | |
check() { | |
if (beverage.waiting.length > 0) beverage.toMake() | |
} | |
makingBeverage(beverageName, beverageTime, customerID) { | |
this.delay(beverageName, beverageTime, customerID) | |
.then(console.log) | |
.then(beverage.Made()) | |
.then(menu.show()) | |
} | |
delay(beverageName, beverageTime, customerID) { | |
return new Promise((resolve) => { | |
setTimeout(() => resolve(guide(`\n(☞ ゚ヮ゚)☞___${customerID} 번 고객님, ${beverageName} 나왔습니다`)), beverageTime) | |
}) | |
} | |
} | |
const readline = require("readline"); | |
const menu = new Menu(); | |
const beverage = new BeverageState(); | |
const barista = new Barista(); | |
const cashier = new Cashier(); | |
cashier.duty(); | |
barista.duty(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment