From 78da5f38734dca459042e73ddd16852a88941454 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 10 Sep 2025 16:08:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GxPrint.py | 75 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/GxPrint.py b/GxPrint.py index f8b2cc2..e1c506c 100644 --- a/GxPrint.py +++ b/GxPrint.py @@ -20,7 +20,8 @@ from pystray import MenuItem import socket import logging from logging.handlers import RotatingFileHandler -import sys +import time +import threading CUR_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -142,43 +143,53 @@ def save_pdf_from_binary(pdf_binary, file_path): with open(file_path, 'wb') as file: file.write(pdf_binary) +request_lock = threading.Lock() @app.route('/prints/', methods=['POST', 'OPTIONS']) def str_printer(): if request.method == 'OPTIONS': # 跨域请求预检 return jsonify({"message": "OK"}), 200 - print_commands = request.json.get('printer_commands', None) - print_name = request.json.get('printer_name', None) - tsclibrary = ctypes.WinDLL(".//TSCLIB.dll") + if not request_lock.acquire(timeout=30): + logger.warning("打印请求超时,系统繁忙") + return jsonify({ + "err_msg": "系统繁忙,请稍后再试", + "err_code": "system_busy" + }), 503 try: - tsclibrary.openportW(print_name) - except Exception as e: - logger.error(f"打印机名称无效: {e}") - return jsonify({"err_msg": "打印机名称无效","err_code": "printer_name_error"}), 400 - tsclibrary.clearbuffer() - try: - for item in print_commands: - if 'WINTEXT' in item: - item_list = item.replace('WINTEXT ', '').split(',') - tsclibrary.windowsfontW( - item_list[0], - item_list[1], - item_list[2], - item_list[3], - item_list[4], - item_list[5], - item_list[6], - item_list[7]) - else: - tsclibrary.sendcommandW(item) - tsclibrary.closeport() - logger.info("打印成功") - except Exception as e: - logger.error(f"打印失败: {e}") - icon.notify(message=f"打印失败: {e}", title="标签打印") - return jsonify({"err_msg": "打印失败", "err_code": "print_failed"}), 500 - - return jsonify({}), 200 + print_commands = request.json.get('printer_commands', None) + print_name = request.json.get('printer_name', None) + tsclibrary = ctypes.WinDLL(".//TSCLIB.dll") + try: + tsclibrary.openportW(print_name) + except Exception as e: + logger.error(f"打印机名称无效: {e}") + return jsonify({"err_msg": "打印机名称无效","err_code": "printer_name_error"}), 400 + tsclibrary.clearbuffer() + try: + for item in print_commands: + if 'WINTEXT' in item: + item_list = item.replace('WINTEXT ', '').split(',') + tsclibrary.windowsfontW( + item_list[0], + item_list[1], + item_list[2], + item_list[3], + item_list[4], + item_list[5], + item_list[6], + item_list[7]) + else: + tsclibrary.sendcommandW(item) + tsclibrary.closeport() + logger.info("打印成功") + except Exception as e: + logger.error(f"打印失败: {e}") + icon.notify(message=f"打印失败: {e}", title="标签打印") + return jsonify({"err_msg": "打印失败", "err_code": "print_failed"}), 500 + + return jsonify({}), 200 + finally: + request_lock.release() if __name__ == '__main__':