This commit is contained in:
Your Name
2026-08-12 18:09:57 +08:00
parent a1092c02c3
commit b2eb18c75f
391 changed files with 1666 additions and 638 deletions
@@ -228,10 +228,19 @@ def _status_value(row: Any) -> int:
return _as_int(first_value(row, "status", default=0))
def prescription_action_label(row: Any) -> str:
audit = _as_int(first_value(row, "prescription_audit_status", "audit_status"), -1)
voided = _as_int(first_value(row, "prescription_void_status", "void_status"), 0)
return "查看" if audit == 1 and voided != 1 else "开方"
def prescription_action_label(row: Any) -> str:
audit = _as_int(first_value(row, "prescription_audit_status", "audit_status"), -1)
voided = _as_int(first_value(row, "prescription_void_status", "void_status"), 0)
explicit = first_value(row, "has_prescription", default=None)
has_prescription = (
_as_bool(explicit)
if explicit is not None
else _as_int(first_value(row, "prescription_id", default=0), 0) > 0
or audit in {0, 1, 2}
)
if not has_prescription:
return "开方"
return "查看" if audit == 1 and voided != 1 else "编辑处方"
def _patient_cell(_value: Any, row: Any, *, can_plain: bool) -> str:
@@ -1177,31 +1186,64 @@ class AppointmentsPage(QWidget):
def _prescription_loaded(self, existing: Any, row: Any, generation: int) -> None:
if generation != self._prescription_generation:
return
self.banner.clear()
if existing is not None and _as_int(first_value(existing, "id", default=0)) > 0:
dialog = PrescriptionDetailDialog(
existing,
can_open_diagnosis=_canonical_allowed(
self.permissions, "tcm.diagnosis/readonlyDetail", default=False
),
parent=self,
)
dialog.diagnosis_requested.connect(self._open_diagnosis_id)
dialog.exec()
approved = _as_int(first_value(existing, "audit_status", "status"), -1) == 1
voided = _as_int(first_value(existing, "void_status", "is_void"), 0) == 1
if approved and not voided:
return
answer = QMessageBox.question(
self,
"新建处方",
"已展示当前挂号的处方。是否继续新建一张处方?",
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
QMessageBox.StandardButton.No,
)
if answer != QMessageBox.StandardButton.Yes:
return
self._begin_case_record_load(row)
self.banner.clear()
if existing is not None and _as_int(first_value(existing, "id", default=0)) > 0:
approved = _as_int(first_value(existing, "audit_status", "status"), -1) == 1
voided = _as_int(first_value(existing, "void_status", "is_void"), 0) == 1
if not approved or voided:
self._open_existing_prescription_editor(existing)
else:
dialog = PrescriptionDetailDialog(
existing,
can_open_diagnosis=_canonical_allowed(
self.permissions, "tcm.diagnosis/readonlyDetail", default=False
),
parent=self,
)
dialog.diagnosis_requested.connect(self._open_diagnosis_id)
dialog.exec()
return
self._begin_case_record_load(row)
def _open_existing_prescription_editor(self, prescription: Any) -> None:
prescription_id = _as_int(first_value(prescription, "id", "prescription_id", default=0))
if prescription_id <= 0:
self.banner.show_message("处方编号不完整,无法编辑。", "danger")
return
dialog = PrescriptionEditorDialog(
self.repository,
prescription,
mode="edit",
current_user=self.current_user,
parent=self,
)
diagnosis_signal = getattr(dialog, "diagnosis_requested", None)
if diagnosis_signal is not None:
diagnosis_signal.connect(self._open_diagnosis_id)
if dialog.exec() != QDialog.DialogCode.Accepted:
return
frozen_payload = MappingProxyType(dialog.payload())
self._mutation_pending = True
self._action_generation += 1
generation = self._action_generation
self.banner.show_message("正在保存处方…", "info")
run_async(
lambda: invoke(
self.repository,
"update_prescription",
prescription=prescription_id,
changes=frozen_payload,
),
on_success=lambda _result: self._prescription_updated(generation),
on_error=lambda error: self._action_error(error, generation),
on_finished=lambda: self._mutation_finished(generation),
)
def _prescription_updated(self, generation: int) -> None:
if generation != self._action_generation:
return
self.banner.show_message("处方已保存并重新进入待审核。", "success")
self.refresh(silent=True)
def _begin_case_record_load(self, row: Any) -> None:
snapshot = deepcopy(row)
@@ -1262,8 +1304,10 @@ class AppointmentsPage(QWidget):
"visit_no": build_prescription_visit_no(
diagnosis_id=diagnosis_id, appointment_id=appointment_id
),
"tongue": authoritative("tongue", "tongue_coating", default=""),
"pulse": authoritative("pulse", default=""),
"tongue": authoritative("tongue", "tongue_coating", default=""),
"tongue_image": authoritative("tongue_image", default=""),
"pulse": authoritative("pulse", default=""),
"pulse_condition": authoritative("pulse_condition", default=""),
"clinical_diagnosis": build_prescription_clinical_diagnosis(
diagnosis, patient, record, case_record
),
@@ -1278,14 +1322,17 @@ class AppointmentsPage(QWidget):
def _open_prescription_editor(self, record: Any, case_record: Any) -> None:
seed = self._prescription_seed(record, case_record)
dialog = PrescriptionEditorDialog(
dialog = PrescriptionEditorDialog(
self.repository,
seed,
mode="add",
current_user=self.current_user,
parent=self,
)
if dialog.exec() != QDialog.DialogCode.Accepted:
parent=self,
)
diagnosis_signal = getattr(dialog, "diagnosis_requested", None)
if diagnosis_signal is not None:
diagnosis_signal.connect(self._open_diagnosis_id)
if dialog.exec() != QDialog.DialogCode.Accepted:
return
payload = dialog.payload()
payload["diagnosis_id"] = seed["diagnosis_id"]