Skip to content

Instantly share code, notes, and snippets.

@skawnkk
Last active January 29, 2021 13:26
Show Gist options
  • Save skawnkk/c938031a3049a18af0a9a2900c534da5 to your computer and use it in GitHub Desktop.
Save skawnkk/c938031a3049a18af0a9a2900c534da5 to your computer and use it in GitHub Desktop.
CAFE PLAY
//동기, 비동기 기능 더 추가해서....다시 해보긔
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