Portfolio

내 가게만의 영수증 만들기!

date
Dec 31, 2023
slug
내-가게만의-영수증-만들기
author
status
Public
tags
summary
type
Post
thumbnail
KakaoTalk_20231230_135934007_04.webp
updatedAt
Dec 30, 2023 04:27 PM
categories
Portfolio
ETC
Language
Korean

결과물

notion image

아키텍처

notion image

Order Client

  • 배민 주문 접수 프로그램, 쿠팡 주문 프로그램 등을 말한다.
  • COM 인터페이스를 통해 이 프로그램과 일방적으로 Raw Order Data를 전달한다.

Serial Port

import { SerialPort } from 'serialport' const port = new SerialPort({ path: 'COM30', baudRate: 9600, autoOpen: true })
  • serialport 모듈을 통해 COM 인터페이스를 이용한다.
  • 여러 주문 접수 프로그램으로부터 COM30 포트로 주문 데이터를 전달받는다.

Interpreter Factory

class InterpreterFactory { getInterpreter (data: string): Interpreter { const detector = new PlatformDetector() switch (detector.detect(data)) { case Platform.BAEMIN: return new BaeminInterpreter() } // case Platform.BAEMIN_1: // return new BaeminOneInterpreter() // } throw new Error('Unhandled Interpreter') } }
  • 주문 데이터를 받아, 이를 해석할 수 있는 Interpreter를 return한다.

Interpreter (Interface)

export interface Interpreter { interpret(rawData: string): ReceiptInfo }
  • Interpreter는 data를 받아 이를 ReceiptInfo 객체로 만들 수 있는 기능을 갖추어야 한다.

ReceiptInfo

export class ReceiptInfo { platform: Platform orderMetaInfo: OrderMetaInfo deliveryInfo: DeliveryInfo requestInfo: RequestInfo }

Printer

async print (receiptInfo: ReceiptInfo) { const tempPDF = this.updateReceiptPDFByReceiptInfo(new PDFDocumentWithTables({ size: [600, 5000], margin: 0 }), receiptInfo) const receipt = new PDFDocumentWithTables({ size: [600, tempPDF.y + 50], margin: 0 }) receipt.pipe(fs.createWriteStream(this.outputPath)) this.updateReceiptPDFByReceiptInfo(receipt, receiptInfo) receipt.end() setTimeout(async () => { const printer = new WinPrinter() printer.setPrinter(this.printerID) await printer.print(this.outputPath) fs.unlinkSync(this.outputPath) }, 1000) }
  • Interpreter가 해석한 주문 정보를 ReceiptInfo로 받아 프린터를 이용해 출력한다.
  1. 임시 PDF 문서를 만든 뒤, Receipt Info를 바탕으로 영수증을 작성하여 완성될 영수증의 세로 길이를 확인한다.
  1. 임시 PDF의 영수증의 세로 길이를 바탕으로 그 길이에 맞는 PDF 문서를 생성한다.
  1. PDF 문서에 영수증을 작성한다.
  1. 이를 node-native-printer 모듈을 이용하여 하드웨어 프린터로 출력한다.

Core Logic

const interpreter = InterpreterFactory.getInterpreter(decodedData) const printer = new Printer() printer.print(interpreter.interpret(decodedData))
  • 주문 정보를 받아 ⇒ 이를 해석하여 ⇒ 프린터로 출력한다.
  • 이 부분의 코드는 가장 높은 추상으로써 새로운 플랫폼의 추가, 프린트 방식의 변경과 같은 변화에 안전하다.