This commit is contained in:
Your Name
2026-08-12 11:03:28 +08:00
parent 09d3fcbf82
commit bc9ad1d3cd
32 changed files with 4586 additions and 2341 deletions
+50 -2
View File
@@ -25,7 +25,13 @@ from PySide6.QtWidgets import (
QWidget,
)
from doctor_workstation.core.errors import AuthenticationExpiredError
from doctor_workstation.core.errors import (
ApiHttpError,
ApiProtocolError,
ApiTimeoutError,
ApiTransportError,
AuthenticationExpiredError,
)
AuthenticationExpiredHandler = Callable[[AuthenticationExpiredError], bool]
_AUTHENTICATION_EXPIRED_HANDLER: AuthenticationExpiredHandler | None = None
@@ -331,7 +337,45 @@ def friendly_error(error: Any) -> str:
"服务器证书不受系统信任。若这是可信内网的自签名服务器,请展开“服务器设置”,"
"勾选“信任自签名证书(仅内网调试)”后重新登录,设置会自动应用。"
)
return text or "操作未完成,请稍后重试。"
if isinstance(error, AuthenticationExpiredError):
return "登录状态已失效,请重新登录。"
if isinstance(error, ApiTimeoutError) or "timed out" in lowered or "timeout" in lowered:
return "连接服务器超时,请检查网络后重试。"
if isinstance(error, ApiProtocolError) or any(
marker in lowered
for marker in (
"api response envelope",
"api response is not valid json",
"invalid json",
)
):
return "服务器返回的数据格式不正确,请联系管理员检查接口。"
if isinstance(error, ApiHttpError):
status_code = getattr(error, "status_code", None)
suffix = f"(状态码 {status_code})" if status_code else ""
return f"服务器请求失败{suffix},请稍后重试。"
if isinstance(error, ApiTransportError) or any(
marker in lowered
for marker in (
"connection refused",
"connecterror",
"connection error",
"failed to connect",
"getaddrinfo failed",
"name or service not known",
"network is unreachable",
)
):
return "无法连接服务器,请检查服务器地址与网络。"
if any(marker in lowered for marker in ("unauthorized", "forbidden", "permission denied")):
return "当前账号无权执行此操作。"
if "not found" in lowered:
return "未找到所需数据。"
if any("\u4e00" <= character <= "\u9fff" for character in text):
return text
if isinstance(error, TypeError):
return "程序执行失败,请重试;若问题持续出现,请联系管理员。"
return "操作未完成,请稍后重试。"
class PageHeader(QWidget):
@@ -379,6 +423,10 @@ class StatusBadge(QLabel):
self.setObjectName("StatusBadge")
self.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
# QSS padding alone is not a reliable minimum on every Windows DPI
# scale. Keep enough physical row height so badge text is never
# squeezed into the thin coloured strip seen in list item widgets.
self.setMinimumHeight(24)
self.set_kind(kind)
def set_kind(self, kind: str) -> None: