在餐飲行業中普遍使用的點菜等系統中,列印單子是一項最基本的功能。在餐飲中,一般採用的都是POS印表機。但是,在很多點菜系統中,丟單是一件很頭痛的事情。本文就如何用java實現繞過驅動控制列印並實現丟單處理,給出一種解決辦法。
本文面對的需求是,一個單據同時由多個印表機列印,當一個單據沒有列印成功,則需要重新列印(補單)。將印表機串連到路由器並確定印表機正常後,便可以進行測試。
本文的實現思路是:採用隊列和線程操作來完成。
本文建立幾個對象:
1、印表機對象Printer:印表機編號,印表機IP,印表機連接埠,預設紙張寬度等
2、列印對象PrintableObject:封裝需要列印的資訊
3、列印工作對象PrintJob:封裝一個PrintableObject對象,同時包含一個狀態位,可能的狀態有“等待列印”,“正在列印”,“完成列印”。同時含有一個print方法。
4、列印佇列PrintQueue:單一實例,類比一個隊列,其中的方法是安全執行緒的。每個元素是PrintJob對象,先進先出,列印失敗,重新回到隊列的尾部。
5、列印抓取對象PrintableTracker:該對象是一個線程,並且是單一實例。不停地從PrintQueue中取PrintJob,列印成功,繼續列印下一個;否則,將當前的移到隊列的尾部,繼續列印下一個。如果隊列中沒有PrintJob了,則結束。當再次添加PrintJob到PrintQueue中的時候,會啟動線程繼續列印。
6、PrintUtils:參考印表機內建的命令手冊,封裝列印命令,在PrintJob中的print方法中調用PrintUtils封裝的命令進行列印。在print方法中,建立Socket串連,和印表機通訊。
以上實現,在佳博熱敏網口印表機下測試通過。解決因為網路問題或者印表機卻紙等問題造成的丟單問題。但是,當列印命令已經傳送到出去,而此時,印表機斷電了,那麼這個當來電時沒法重新列印。因為在程式中,該操作實際上已經完成,但是這些命令是存在於網路或者印表機緩衝中,斷電後這些資訊就不存在了。這是因為印表機無法判斷印表機到底有沒有出紙。至少從佳博的印表機命令手冊上沒有找到。但是,如果其他的印表機可以,那麼就可以在Socket中,接收此狀態來判斷列印是否成功。這樣,丟單的機率就更小了。
思路就是如此,僅供參考!