Mac/Linux POS系統架構

Why Mac/Linux?

相比於單機軟件,client-server的架構更為彈性,例如client可以是iPad, iPhone, Android, 或PC都行。既然是server就不會是windows。
Backend server可以是local或是cloud based。但無論如何,通常店家都會需要打印功能,不管是統一發票、電子發票、或是明細。所以讓server控制打印機(通常是熱感應或針式)是必要功能,因此切割出printing service是個不錯的選擇。

為何要有發票?

發票設計的初衷就是讓國稅局知道你有這筆帳,這樣政府才可以抽稅。而商家當然不想繳稅,於是國稅局就用發票獎金誘導客戶向商家索取發票,透過客戶對商家施加壓力,只要發票一開出來,國稅局的大帳本就有店家的營收紀錄,這樣一來便可以依法課稅。

二聯式發票

二連發票的本質,就是一式兩份,一份給客戶,一份給國稅局,有點像房屋租賃契約,一份給房東、一份給房客。其中給客戶的叫做「收執聯」,給國稅局的叫做「存根聯」,此為二聯。存根聯通常都是搜集一兩個月,再一次交給國稅局。

在台灣,大多都是使用統一發票作為二聯發票(另一種是複寫紙二聯發票,本質是一樣的),不管是哪一種發票,都必須先去跟國稅局拿空白發票(雖說是空白但上面已經先印好發票編號了),拿到發票之後,將存根聯以及收執聯放入發票機,然後就可以開始印了。

ps. 至於三聯發票,就是一式三份:客戶、店家、國稅局各一份。通常到了這個田地,都是用複寫紙打印比較多,因為同樣的東西印三次太麻煩了,當然複寫紙打印也有專用的印表機,這個不在今天的討論範圍內。

電子發票

既然目的是要讓國稅局知道這筆帳,送個API不就好了?幹嘛還印一堆,還要搜集實體紙捲交給國稅局,多麻煩?

對沒錯,這就是現在最普遍的電子發票,整個通知的過程,就是一個API搞定,發票號碼什麼的都可以透過API回傳然後再用熱感應機打印出來。其實印不印都無所謂,反正國稅局已經收到帳了,但通常還是會一並將發票號碼與明細印給客戶。

不過這個project因種種因素限制不能使用電子發票,所以今天也先不討論這個。

熱感應打印機原理

打印機不需要墨水你相信嗎?對,熱感應打印機讓你永遠都不用換墨水,只要使用特殊的紙張,就可以加熱打印,無需墨水,其原理是紙張表面有一層特殊材料會遇熱顯色。

新增印表機

Unix系統內建CUPS(Common UNIX Printing System)打印系統,打開http://localhost:631即可新增/修改印表機。

使用系統指令列印(LP, LPR)

lplpr都是系統內建的打印指令,建議使用較新的lp

lp hello.txt

指令介紹

如何將RS232(serial port)轉成USB?

購買connector,例如這個
需要安裝connector驅動程式,安裝完之後會多一個虛擬的device:

ls /dev/usb*
> /dev/usbserial

之後便可對這個device送指令

用NodeJS發送ESC/POS指令控制印表機

安裝node-serialport

若打印機支援ESC/POS指令集,就代表你可以透過發送askii character對它下命令,而每一個askii character其實就是一個askii code數字代碼。

例如,以EPSON RPU420打印機為例,以下是部份指令

Screen Shot 2017-07-09 at 1.29.34 PM.png

"ESC @"表示印表機初始化,ESC與@的askii code分別為27與64,所以

let reset = Buffer.from([27,64]

Buffer可以直接接收askii字串,而ESC/POS指令可以串連使用,所以我們把Buffer串起來的話

let reset = Buffer.from([27,64])
let contentBuf = Buffer.from("Hello world")
let nextPage = Buffer.from([12])
let buf = Buffer.concat(
  [reset, contentBuf, nextPage], 
  reset.length + contentBuf.length + nextPage.length
);

寫入serial port

const SerialPort = require('serialport')
let option = { baudRate: 9600, autoOpen: false}
let rpu420 = new SerialPort('/dev/tty.usbserial', option)

rpu420.open(err => {
   rpu420.write(buf), function () {
      // done
   })
})

值得注意的是,write函式的callback function觸發時,不代表印表機已經處理完該指令,需用drain指令檢查

let writeAndDrain = (data, onCompletionCallback) => {
  rpu420.write(data, function () {
    rpu420.drain(onCompletionCallback);
  });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 程序員創業白皮書 作者:Paul Graham Paul Graham是程序員,專欄作家。他在1995年創建了第一...
    刘立山John阅读 1,847评论 0 20
  • 迫不及待的把书看完,原来这本书讲述的是1982年12月12日发生的故事,钟鼓楼旁边的四合院里每个家庭的故事,薛纪跃...
    hanxuerping阅读 162评论 0 0
  • 虽然才看了两天这本书,还没有实际操作,但是看了很多教程和别人的成品。所以决定把重要的事情,还有很多人都疏忽的事情写...
    VentureHacker阅读 1,952评论 0 0
  • 集成方法或元算法是对其它算法进行组合的一种方式,根据是否使用基学习器分为同质和异质 优点:泛化错误率低,易编码,可...
    程序猿爱打DOTA阅读 496评论 0 0
  • 编辑:C丫头 作者:C丫头 我想创建一个相册,相册名字还没想好,但我希望每个看了这个相册的人同样觉得一切甚是美好!...
    C丫头阅读 256评论 0 0