在餐飲行業中普遍使用的點菜等系統中,打印單子是一項最基本的功能。在餐飲中,一般采用的都是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中,接收此狀態來判斷打印是否成功。這樣,丟單的概率就更小了。
思路就是如此,僅供參考!